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.
Guides
Cyndra API documentation.
Each of these is a page in its own right, so you can link to the one that answers your question.
Cyndra API authentication
Self-serve OAuth 2.0 credentials, named scopes, and sandbox mode.
Cyndra API rate limits
The policies, the RateLimit headers on every response, and how to back off.
Cyndra API versioning
What will not change, and how deprecations are announced before they bite.
Cyndra MCP server
Streamable HTTP at /mcp, no auth, six read-only tools.
Cyndra CLI
Script the same API from a terminal with npx @cyndra/cli.
Onboarding, as data
What is free, where to get credentials, how to use the sandbox.
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/onboarding | How to start using this API | public |
GET | /api/v1/blog | List blog posts | public |
GET | /api/v1/blog/{slug} | Fetch one blog post | public |
GET | /api/markdown | Fetch any page as markdown | 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 (deprecated) | public |
GET | /api/blog/{slug} | Fetch one blog post (deprecated) | 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.
Rate limits
Every response tells you your budget.
RateLimit headers on every call, Retry-After on a 429.
RateLimit-Policy: "read";q=120;w=60
RateLimit: "read";r=118;t=42
RateLimit-Limit: 120
RateLimit-Remaining: 118
RateLimit-Reset: 42Full policy table at /api-docs/rate-limits.
Versioning
Nothing disappears without notice.
Versioned in the URL path, with Deprecation and Sunset headers and a year of notice.
Deprecation: Sun, 23 Aug 2026 00:00:00 GMT
Sunset: Mon, 23 Aug 2027 00:00:00 GMT
Link: <https://www.cyndra.ai/api/v1/blog>; rel="successor-version"Full policy at /api-docs/versioning.
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.
Does the Cyndra API have rate limits?
Yes, and they are advertised. Every response under /api and /mcp carries RateLimit-Policy, RateLimit, RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset, plus X-RateLimit-* aliases; a 429 adds Retry-After. See /api-docs/rate-limits.
How does Cyndra version its API?
In the URL path: /api/v1, with a Cyndra-API-Version response header. Deprecated endpoints keep working and carry Deprecation and Sunset headers plus a successor-version link, with at least a year of notice. See /api-docs/versioning.
Is there a Cyndra CLI?
Yes: @cyndra/cli. Run npx @cyndra/cli search "ai employees" with no credentials, or install it globally. See /api-docs/cli.
Can I fetch pages as markdown instead of HTML?
Yes, and it works for every page. Request any page with the header Accept: text/markdown, or append .md to its URL (/index.md for the home page). Long-form pages have hand-written markdown; the rest are converted from their own HTML. Markdown responses carry Vary: Accept so caches keep the two representations apart.