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.

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/pricing

Authentication

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.

ScopeGrants
content.readRead Cyndra's public content: page index, page markdown, blog posts, case studies, changelog and pricing.
leads.writeSubmit a contact request or lead on behalf of a user. Write access is limited to this one action.
sandboxRestrict 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.

MethodPathWhat it doesAuth
GET/openapi.jsonFetch this OpenAPI documentpublic
GET/llms.txtFetch the llms.txt content indexpublic
GET/llms-full.txtFetch the full content dumppublic
GET/.well-known/oauth-authorization-serverOAuth 2.0 authorization server metadatapublic
GET/.well-known/oauth-protected-resourceOAuth 2.0 protected resource metadatapublic
GET/.well-known/mcp.jsonCyndra MCP server manifestpublic
POST/api/oauth/registerRegister an API clientpublic
POST/api/oauth/tokenExchange client credentials for an access tokenpublic
GET/api/v1/pagesList every indexed pagepublic
GET/api/v1/contentFetch one page as markdownpublic
GET/api/v1/searchSearch Cyndra's pagespublic
GET/api/v1/pricingFetch structured pricingpublic
GET/api/v1/changelogFetch the product changelogpublic
GET/api/v1/case-studiesList published case studiespublic
GET/api/v1/case-studies/{slug}Fetch one case studypublic
GET/api/v1/meDescribe the calling clientbearer token
POST/api/v1/leadsSubmit a contact requestleads.write
GET/api/desktop/latestFetch the latest desktop releasepublic
GET/api/blogList blog postspublic
GET/api/blog/{slug}Fetch one blog postpublic
GET/api/md/{section}Fetch a section index as markdownpublic
GET/api/md/{section}/{slug}Fetch one document as markdownpublic
POST/mcpCall the Cyndra MCP serverpublic

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_contentSearch every page Cyndra publishes (product, pricing, industries, departments, guides, comparisons) and return ranked hits with the markdown URL of each.
  • get_cyndra_pageFetch 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_pagesList every indexed Cyndra page with its section and markdown URL. Optionally filter to one section such as industries, departments, manual or cookbook.
  • get_cyndra_pricingReturn 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_changelogReturn Cyndra's product and platform releases, newest first, with each item tagged as a new feature, improvement or fix.
  • list_cyndra_case_studiesReturn 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.