Developers
The Cyndra API for agents.
An OpenAPI 3.1 spec, self-serve OAuth 2.0 credentials, named scopes, a sandbox, and an MCP server. Everything an AI agent needs to read Cyndra and act on it, without a sales conversation.
Start here
Machine-readable entry points.
Every file below is stable, public and cache-friendly.
OpenAPI 3.1 spec
Every endpoint with a unique operationId, typed parameters and response schemas. YAML at /openapi.yaml.
MCP server manifest
Points at the Streamable HTTP endpoint at /mcp and lists the tools it exposes.
OAuth metadata
RFC 8414 authorization server metadata. Scopes are also published as RFC 9728 protected-resource metadata.
llms.txt
Curated index of every markdown document on the site.
llms-full.txt
Every long-form reference document concatenated into one file.
Sitemap
Every indexed URL, refreshed on each deploy and nightly.
Quickstart
Read Cyndra in one request.
The content endpoints are public. No token, no registration.
# Search every page
curl -s "https://www.cyndra.ai/api/v1/search?q=pricing+credits"
# Read a page as markdown
curl -s "https://www.cyndra.ai/api/v1/content?path=/pricing"
# Or negotiate markdown on the page URL itself
curl -s -H "Accept: text/markdown" https://www.cyndra.ai/pricing
# Structured pricing
curl -s https://www.cyndra.ai/api/v1/pricingAuthentication
Self-serve OAuth 2.0 credentials.
Client credentials grant. Registration is open, so an agent can onboard itself.
# 1. Register a client (RFC 7591). Returns client_id + client_secret.
curl -s -X POST https://www.cyndra.ai/api/oauth/register \
-H "Content-Type: application/json" \
-d '{"client_name":"my-agent","scope":"content.read leads.write"}'
# 2. Exchange them for a bearer token (RFC 6749 4.4).
curl -s -X POST https://www.cyndra.ai/api/oauth/token \
-d grant_type=client_credentials \
-d client_id=$CLIENT_ID \
-d client_secret=$CLIENT_SECRET \
-d scope="content.read"
# 3. Confirm what the token can do.
curl -s https://www.cyndra.ai/api/v1/me -H "Authorization: Bearer $TOKEN"Scopes
Ask for the least you need.
| Scope | Grants |
|---|---|
content.read | Read Cyndra's public content: page index, page markdown, blog posts, case studies, changelog and pricing. |
leads.write | Submit a contact request or lead on behalf of a user. Write access is limited to this one action. |
sandbox | Restrict the client to the sandbox environment. Write calls are validated and echoed back without reaching production systems. |
Endpoints
The whole surface, from the spec.
This table is generated from /openapi.json, so it always matches what the API actually serves.
| Method | Path | What it does | Auth |
|---|---|---|---|
GET | /openapi.json | Fetch this OpenAPI document | public |
GET | /llms.txt | Fetch the llms.txt content index | public |
GET | /llms-full.txt | Fetch the full content dump | public |
GET | /.well-known/oauth-authorization-server | OAuth 2.0 authorization server metadata | public |
GET | /.well-known/oauth-protected-resource | OAuth 2.0 protected resource metadata | public |
GET | /.well-known/mcp.json | Cyndra MCP server manifest | public |
POST | /api/oauth/register | Register an API client | public |
POST | /api/oauth/token | Exchange client credentials for an access token | public |
GET | /api/v1/pages | List every indexed page | public |
GET | /api/v1/content | Fetch one page as markdown | public |
GET | /api/v1/search | Search Cyndra's pages | public |
GET | /api/v1/pricing | Fetch structured pricing | public |
GET | /api/v1/changelog | Fetch the product changelog | public |
GET | /api/v1/case-studies | List published case studies | public |
GET | /api/v1/case-studies/{slug} | Fetch one case study | public |
GET | /api/v1/me | Describe the calling client | bearer token |
POST | /api/v1/leads | Submit a contact request | leads.write |
GET | /api/desktop/latest | Fetch the latest desktop release | public |
GET | /api/blog | List blog posts | public |
GET | /api/blog/{slug} | Fetch one blog post | public |
GET | /api/md/{section} | Fetch a section index as markdown | public |
GET | /api/md/{section}/{slug} | Fetch one document as markdown | public |
POST | /mcp | Call the Cyndra MCP server | public |
Errors
One JSON shape, everywhere.
Including 404s on paths that do not exist, so a probe never returns HTML.
{
"error": "No API endpoint at /api/v1/nope.",
"code": "not_found",
"message": "No API endpoint at /api/v1/nope.",
"hint": "Read https://www.cyndra.ai/openapi.json for every available endpoint.",
"documentation_url": "https://www.cyndra.ai/api-docs",
"status": 404,
"request_id": "b0c0...".
}Sandbox
Test writes without writing.
Send "mode": "sandbox", or register a client with the sandbox scope.
curl -s -X POST https://www.cyndra.ai/api/v1/leads \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"email":"ops@acme.com","company":"Acme","message":"Intake automation","mode":"sandbox"}'
# => 201 {"object":"lead","accepted":true,"mode":"sandbox","id":null, ...}MCP
The Cyndra MCP server.
Streamable HTTP, no authentication, six read-only tools.
{
"mcpServers": {
"cyndra": {
"type": "http",
"url": "https://www.cyndra.ai/mcp"
}
}
}search_cyndra_content— Search every page Cyndra publishes (product, pricing, industries, departments, guides, comparisons) and return ranked hits with the markdown URL of each.get_cyndra_page— Fetch the markdown body of one Cyndra page by its site-relative path, for example /pricing or /manual/first-day. Use search_cyndra_content or list_cyndra_pages to find valid paths.list_cyndra_pages— List every indexed Cyndra page with its section and markdown URL. Optionally filter to one section such as industries, departments, manual or cookbook.get_cyndra_pricing— Return Cyndra's pricing as structured data: the credit rate, what every plan includes, each tier's monthly price and credit allowance, and the top-up packs.get_cyndra_changelog— Return Cyndra's product and platform releases, newest first, with each item tagged as a new feature, improvement or fix.list_cyndra_case_studies— Return published client case studies with their industry, headline result and the URL of the full write-up in markdown.
FAQ
Cyndra API questions.
Where is the Cyndra OpenAPI spec?
At https://www.cyndra.ai/openapi.json, mirrored at /api/openapi.json and in YAML at /openapi.yaml. It is OpenAPI 3.1 with a unique operationId, a description and typed response schemas on every operation, so it drops straight into an LLM function-calling adapter.
How do I get Cyndra API credentials?
POST to /api/oauth/register. Registration is open (RFC 7591 dynamic client registration): you get a client_id and client_secret back in the same response, with no approval step and no sales call.
Which scopes does the Cyndra API support?
content.read for the public content endpoints, leads.write for submitting a contact request, and sandbox to restrict a client to the sandbox environment. They are declared in the OpenAPI security schemes and in the RFC 9728 metadata at /.well-known/oauth-protected-resource.
Do the read endpoints need a token?
No. Everything under /api/v1 that only reads content is public. Tokens are required for /api/v1/me and for POST /api/v1/leads.
Is there a Cyndra MCP server?
Yes: https://www.cyndra.ai/mcp, Streamable HTTP transport, no authentication. It exposes six read-only tools for searching pages, reading any page as markdown, and fetching pricing, changelog and case studies.
How do I test without creating real data?
Send "mode": "sandbox" on POST /api/v1/leads, or register a client with the sandbox scope. The payload is validated and echoed back and nothing is written.
Can I fetch pages as markdown instead of HTML?
Yes, two ways. Request any page with the header Accept: text/markdown, or append .md to its URL. Responses carry Vary: Accept so caches keep the two representations apart.