{"openapi":"3.1.0","info":{"title":"Cyndra Public API","version":"1.0.0","summary":"Read Cyndra's content and submit contact requests programmatically.","description":"The public API behind cyndra.ai. It exposes the content an agent needs to answer\nquestions about Cyndra (pages, markdown, pricing, changelog, case studies) plus one\nwrite operation for submitting a contact request.\n\nAuthentication is OAuth 2.0 client credentials (RFC 6749 §4.4). Clients register\nthemselves at https://www.cyndra.ai/api/oauth/register (RFC 7591 dynamic client registration), so no\nsales conversation is required to get credentials. Read endpoints are open and need\nno token at all; only the scoped endpoints require one.\n\nSandbox: send `\"mode\": \"sandbox\"` on POST /api/v1/leads (or hold the `sandbox` scope)\nto have the request validated and echoed back without creating a real lead.\n\nRate limits are not enforced today. Please stay under roughly 60 requests per minute\nper client; hard limits will be published here before they are turned on.\n\nThe same surface is available as MCP tools over Streamable HTTP at https://www.cyndra.ai/mcp.","termsOfService":"https://www.cyndra.ai/terms","contact":{"name":"Cyndra","email":"hello@cyndra.ai","url":"https://www.cyndra.ai/api-docs"},"license":{"name":"Cyndra API Terms","url":"https://www.cyndra.ai/terms"}},"servers":[{"url":"https://www.cyndra.ai","description":"Production"}],"externalDocs":{"description":"Cyndra API and developer docs","url":"https://www.cyndra.ai/api-docs"},"tags":[{"name":"Discovery","description":"Machine-readable descriptions of this site and API."},{"name":"Authentication","description":"OAuth 2.0 client registration and token issuance."},{"name":"Content","description":"Cyndra's public pages, markdown and structured content."},{"name":"Leads","description":"Submitting a contact request on behalf of a user."},{"name":"MCP","description":"Model Context Protocol server over Streamable HTTP."}],"security":[],"paths":{"/openapi.json":{"get":{"operationId":"getOpenApiSpec","summary":"Fetch this OpenAPI document","description":"Returns the OpenAPI 3.1 description of the Cyndra public API as JSON. Also available as YAML at /openapi.yaml.","tags":["Discovery"],"responses":{"200":{"description":"The OpenAPI document.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/llms.txt":{"get":{"operationId":"getLlmsTxt","summary":"Fetch the llms.txt content index","description":"A curated plain-text index of every markdown document on cyndra.ai, following the llms.txt convention.","tags":["Discovery"],"responses":{"200":{"description":"The llms.txt index.","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/llms-full.txt":{"get":{"operationId":"getLlmsFullTxt","summary":"Fetch the full content dump","description":"Every long-form reference document on cyndra.ai concatenated into one plain-text file.","tags":["Discovery"],"responses":{"200":{"description":"The full content dump.","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"operationId":"getAuthorizationServerMetadata","summary":"OAuth 2.0 authorization server metadata","description":"RFC 8414 metadata describing the token endpoint, registration endpoint, supported grants and supported scopes.","tags":["Discovery","Authentication"],"responses":{"200":{"description":"Authorization server metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorizationServerMetadata"}}}}}}},"/.well-known/oauth-protected-resource":{"get":{"operationId":"getProtectedResourceMetadata","summary":"OAuth 2.0 protected resource metadata","description":"RFC 9728 metadata naming the authorization server that issues tokens for this API and the scopes it supports.","tags":["Discovery","Authentication"],"responses":{"200":{"description":"Protected resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProtectedResourceMetadata"}}}}}}},"/.well-known/mcp.json":{"get":{"operationId":"getMcpServerManifest","summary":"Cyndra MCP server manifest","description":"Describes the Cyndra MCP server and its Streamable HTTP endpoint, following the MCP registry server.json shape.","tags":["Discovery","MCP"],"responses":{"200":{"description":"MCP server manifest.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpServerManifest"}}}}}}},"/api/oauth/register":{"post":{"operationId":"registerOAuthClient","summary":"Register an API client","description":"RFC 7591 dynamic client registration. Returns a client_id and client_secret immediately, with no approval step, so an agent can onboard itself. Credentials are stateless and stay valid while the deployment's signing key is unchanged.","tags":["Authentication"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientRegistrationRequest"}}}},"responses":{"201":{"description":"The registered client.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientRegistrationResponse"}}}},"400":{"description":"The requested scope or grant type is not supported.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/oauth/token":{"post":{"operationId":"createAccessToken","summary":"Exchange client credentials for an access token","description":"OAuth 2.0 client credentials grant (RFC 6749 §4.4). Send credentials either in the form body (client_secret_post) or as HTTP Basic (client_secret_basic). Returns a bearer token valid for one hour.","tags":["Authentication"],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/TokenRequest"}}}},"responses":{"200":{"description":"A bearer access token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessTokenResponse"}}}},"400":{"description":"Malformed request, per RFC 6749 §5.2.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}},"401":{"description":"Client authentication failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}}}}},"/api/v1/pages":{"get":{"operationId":"listCyndraPages","summary":"List every indexed page","description":"Returns every page on cyndra.ai that Cyndra publishes for agents, with the URL of its markdown representation where one exists.","tags":["Content"],"parameters":[{"name":"section","in":"query","required":false,"description":"Filter to one section, for example `industries` or `manual`.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum number of pages to return.","schema":{"type":"integer","minimum":1,"maximum":500,"default":500}}],"responses":{"200":{"description":"The page index.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageList"}}}}}}},"/api/v1/content":{"get":{"operationId":"getCyndraPageContent","summary":"Fetch one page as markdown","description":"Returns the markdown body of a single page, along with its canonical HTML URL. Use /api/v1/pages or /api/v1/search to discover valid paths.","tags":["Content"],"parameters":[{"name":"path","in":"query","required":true,"description":"Site-relative path, for example `/pricing` or `/manual/first-day`.","schema":{"type":"string","examples":["/pricing"]}}],"responses":{"200":{"description":"The page and its markdown body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageContent"}}}},"400":{"description":"The `path` parameter is missing or malformed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such page, or the page has no markdown representation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/search":{"get":{"operationId":"searchCyndraContent","summary":"Search Cyndra's pages","description":"Ranked keyword search over the titles, paths and descriptions of every indexed page. Returns markdown URLs so an agent can read the full text of a hit.","tags":["Content"],"parameters":[{"name":"q","in":"query","required":true,"description":"Search terms.","schema":{"type":"string","minLength":2,"examples":["pricing credits"]}},{"name":"limit","in":"query","required":false,"description":"Maximum number of hits.","schema":{"type":"integer","minimum":1,"maximum":50,"default":10}}],"responses":{"200":{"description":"Ranked search hits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResults"}}}},"400":{"description":"The `q` parameter is missing or too short.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/pricing":{"get":{"operationId":"getCyndraPricing","summary":"Fetch structured pricing","description":"Returns the credit rate, what every plan includes, and each tier's monthly price and credit allowance.","tags":["Content"],"responses":{"200":{"description":"Structured pricing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pricing"}}}}}}},"/api/v1/changelog":{"get":{"operationId":"getCyndraChangelog","summary":"Fetch the product changelog","description":"Cyndra's product and platform releases, newest first, with tagged items.","tags":["Content"],"parameters":[{"name":"limit","in":"query","required":false,"description":"Maximum number of releases to return.","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}],"responses":{"200":{"description":"Changelog releases.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangelogList"}}}}}}},"/api/v1/case-studies":{"get":{"operationId":"listCyndraCaseStudies","summary":"List published case studies","description":"Client deployments with named outcomes. Each entry links to its HTML page and markdown representation.","tags":["Content"],"responses":{"200":{"description":"Case study summaries.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseStudyList"}}}},"502":{"description":"The content backend could not be reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/case-studies/{slug}":{"get":{"operationId":"getCyndraCaseStudy","summary":"Fetch one case study","description":"Returns a single case study's summary fields and its markdown body.","tags":["Content"],"parameters":[{"name":"slug","in":"path","required":true,"description":"Case study slug, as returned by listCyndraCaseStudies.","schema":{"type":"string"}}],"responses":{"200":{"description":"The case study.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseStudy"}}}},"404":{"description":"No case study with that slug.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/me":{"get":{"operationId":"getApiIdentity","summary":"Describe the calling client","description":"Returns the client id, granted scopes and expiry of the presented access token. Useful for confirming credentials and least-privilege scope before making real calls.","tags":["Authentication"],"security":[{"oauth2ClientCredentials":[]},{"bearerAuth":[]}],"responses":{"200":{"description":"The token's identity and scopes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Identity"}}}},"401":{"description":"Missing, invalid or expired bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/leads":{"post":{"operationId":"createCyndraLead","summary":"Submit a contact request","description":"Creates a contact request on behalf of a user: the same pipeline the contact form feeds. Send `mode: \"sandbox\"` (or hold the `sandbox` scope) to validate the payload without creating a real lead.","tags":["Leads"],"security":[{"oauth2ClientCredentials":["leads.write"]},{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadRequest"}}}},"responses":{"201":{"description":"The lead was accepted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadResponse"}}}},"400":{"description":"Validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, invalid or expired bearer token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks the leads.write scope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"The lead backend could not be reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/desktop/latest":{"get":{"operationId":"getLatestDesktopRelease","summary":"Fetch the latest desktop release","description":"Version, notes and download URL of the most recent Cyndra desktop build for macOS.","tags":["Content"],"responses":{"200":{"description":"The latest release.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DesktopReleaseEnvelope"}}}},"404":{"description":"No release has been published yet.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/blog":{"get":{"operationId":"listCyndraBlogPosts","summary":"List blog posts","description":"Every published blog post with its portable-text content, newest first.","tags":["Content"],"responses":{"200":{"description":"Blog posts.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BlogPost"}}}}},"500":{"description":"The content backend could not be reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/blog/{slug}":{"get":{"operationId":"getCyndraBlogPost","summary":"Fetch one blog post","description":"A single blog post by slug, with its portable-text content.","tags":["Content"],"parameters":[{"name":"slug","in":"path","required":true,"description":"Blog post slug.","schema":{"type":"string"}}],"responses":{"200":{"description":"The blog post.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogPost"}}}},"404":{"description":"No blog post with that slug.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"The content backend could not be reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/md/{section}":{"get":{"operationId":"getCyndraSectionMarkdown","summary":"Fetch a section index as markdown","description":"The markdown representation of a section index, for example `pricing`, `manual` or `industries`. The same bytes are served from `/{section}.md` and from the HTML URL with `Accept: text/markdown`.","tags":["Content"],"parameters":[{"name":"section","in":"path","required":true,"description":"Section name.","schema":{"type":"string","enum":["tldr","manual","cookbook","compare","industries","departments","ai-for","pricing","changelog","services"]}}],"responses":{"200":{"description":"The markdown document.","content":{"text/markdown":{"schema":{"type":"string"}}}},"404":{"description":"No markdown document for that section.","content":{"text/markdown":{"schema":{"type":"string"}}}}}}},"/api/md/{section}/{slug}":{"get":{"operationId":"getCyndraDocumentMarkdown","summary":"Fetch one document as markdown","description":"The markdown representation of a single page inside a section, for example `manual/first-day` or `industries/law-firms`.","tags":["Content"],"parameters":[{"name":"section","in":"path","required":true,"description":"Section name.","schema":{"type":"string","enum":["manual","cookbook","blog","case-studies","use-cases","compare","industries","departments","ai-for","services"]}},{"name":"slug","in":"path","required":true,"description":"Document slug within the section.","schema":{"type":"string"}}],"responses":{"200":{"description":"The markdown document.","content":{"text/markdown":{"schema":{"type":"string"}}}},"404":{"description":"No markdown document at that path.","content":{"text/markdown":{"schema":{"type":"string"}}}}}}},"/mcp":{"post":{"operationId":"callCyndraMcpServer","summary":"Call the Cyndra MCP server","description":"Model Context Protocol endpoint using the Streamable HTTP transport. Accepts JSON-RPC 2.0 requests (`initialize`, `tools/list`, `tools/call`) and replies with `application/json`. No authentication is required: every exposed tool is read-only.","tags":["MCP"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"}}}},"responses":{"200":{"description":"A JSON-RPC 2.0 response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}},"202":{"description":"A JSON-RPC notification was accepted."},"400":{"description":"The request was not valid JSON-RPC 2.0.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}}}}}},"components":{"securitySchemes":{"oauth2ClientCredentials":{"type":"oauth2","description":"OAuth 2.0 client credentials. Register at /api/oauth/register, then exchange the credentials at the token endpoint.","flows":{"clientCredentials":{"tokenUrl":"https://www.cyndra.ai/api/oauth/token","refreshUrl":"https://www.cyndra.ai/api/oauth/token","scopes":{"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."}}}},"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"An access token issued by the client credentials flow, sent as `Authorization: Bearer <token>`."}},"schemas":{"Error":{"type":"object","description":"The error shape returned by every Cyndra API endpoint.","required":["error","code","message","documentation_url","status","request_id"],"properties":{"error":{"type":"string","description":"Human-readable message."},"code":{"type":"string","description":"Stable machine-readable error code.","enum":["invalid_request","invalid_json","not_found","method_not_allowed","unauthorized","insufficient_scope","rate_limited","upstream_error","internal_error","not_acceptable","service_unavailable"]},"message":{"type":"string","description":"Same text as `error`."},"hint":{"type":"string","description":"What to do next to resolve the error."},"documentation_url":{"type":"string","format":"uri"},"status":{"type":"integer","description":"HTTP status code."},"request_id":{"type":"string","description":"Identifier to quote when reporting a problem."}}},"OAuthError":{"type":"object","description":"OAuth 2.0 error response (RFC 6749 §5.2).","required":["error"],"properties":{"error":{"type":"string","enum":["invalid_request","invalid_client","invalid_grant","unauthorized_client","unsupported_grant_type","invalid_scope"]},"error_description":{"type":"string"},"error_uri":{"type":"string","format":"uri"}}},"AuthorizationServerMetadata":{"type":"object","description":"RFC 8414 authorization server metadata.","required":["issuer","token_endpoint","grant_types_supported","scopes_supported"],"properties":{"issuer":{"type":"string","format":"uri"},"token_endpoint":{"type":"string","format":"uri"},"registration_endpoint":{"type":"string","format":"uri"},"grant_types_supported":{"type":"array","items":{"type":"string"}},"token_endpoint_auth_methods_supported":{"type":"array","items":{"type":"string"}},"scopes_supported":{"type":"array","items":{"type":"string"}},"response_types_supported":{"type":"array","items":{"type":"string"}},"service_documentation":{"type":"string","format":"uri"}}},"ProtectedResourceMetadata":{"type":"object","description":"RFC 9728 protected resource metadata.","required":["resource","authorization_servers","scopes_supported"],"properties":{"resource":{"type":"string","format":"uri"},"authorization_servers":{"type":"array","items":{"type":"string","format":"uri"}},"scopes_supported":{"type":"array","items":{"type":"string"}},"bearer_methods_supported":{"type":"array","items":{"type":"string"}},"resource_documentation":{"type":"string","format":"uri"},"resource_name":{"type":"string"}}},"McpServerManifest":{"type":"object","description":"MCP server descriptor, following the MCP registry server.json shape.","required":["name","description","version","remotes"],"properties":{"$schema":{"type":"string","format":"uri"},"name":{"type":"string"},"description":{"type":"string"},"version":{"type":"string"},"websiteUrl":{"type":"string","format":"uri"},"remotes":{"type":"array","items":{"type":"object","required":["type","url"],"properties":{"type":{"type":"string","enum":["streamable-http"]},"url":{"type":"string","format":"uri"}}}}}},"ClientRegistrationRequest":{"type":"object","description":"RFC 7591 client registration request.","properties":{"client_name":{"type":"string","description":"A name for the client. Shown back in /api/v1/me.","maxLength":120},"scope":{"type":"string","description":"Space-separated scopes. Supported: content.read, leads.write, sandbox."},"grant_types":{"type":"array","items":{"type":"string","enum":["client_credentials"]}}}},"ClientRegistrationResponse":{"type":"object","required":["client_id","client_secret","grant_types","scope"],"properties":{"client_id":{"type":"string"},"client_secret":{"type":"string"},"client_id_issued_at":{"type":"integer"},"client_secret_expires_at":{"type":"integer","description":"Always 0: the secret does not expire on its own."},"client_name":{"type":"string"},"grant_types":{"type":"array","items":{"type":"string"}},"token_endpoint_auth_method":{"type":"string"},"scope":{"type":"string"},"token_endpoint":{"type":"string","format":"uri"}}},"TokenRequest":{"type":"object","required":["grant_type"],"properties":{"grant_type":{"type":"string","enum":["client_credentials"]},"client_id":{"type":"string"},"client_secret":{"type":"string"},"scope":{"type":"string","description":"Space-separated subset of the scopes the client registered with."}}},"AccessTokenResponse":{"type":"object","required":["access_token","token_type","expires_in","scope"],"properties":{"access_token":{"type":"string"},"token_type":{"type":"string","enum":["Bearer"]},"expires_in":{"type":"integer","description":"Token lifetime in seconds."},"scope":{"type":"string"}}},"Identity":{"type":"object","required":["client_id","scopes","expires_at"],"properties":{"client_id":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"issued_at":{"type":"integer"},"expires_at":{"type":"integer"},"sandbox":{"type":"boolean","description":"True when the token is restricted to the sandbox environment."}}},"Page":{"type":"object","required":["path","title","description","section","url"],"properties":{"path":{"type":"string","description":"Site-relative path."},"url":{"type":"string","format":"uri","description":"Canonical HTML URL."},"title":{"type":"string"},"description":{"type":"string"},"section":{"type":"string"},"markdown_url":{"type":["string","null"],"format":"uri","description":"Markdown representation, or null when the page has none."}}},"PageList":{"type":"object","required":["object","count","data"],"properties":{"object":{"type":"string","enum":["list"]},"count":{"type":"integer"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Page"}}}},"PageContent":{"type":"object","required":["path","url","markdown"],"properties":{"path":{"type":"string"},"url":{"type":"string","format":"uri"},"markdown_url":{"type":["string","null"],"format":"uri"},"title":{"type":"string"},"markdown":{"type":"string","description":"The page body as markdown."}}},"SearchResults":{"type":"object","required":["object","query","count","data"],"properties":{"object":{"type":"string","enum":["list"]},"query":{"type":"string"},"count":{"type":"integer"},"data":{"type":"array","items":{"allOf":[{"$ref":"#/components/schemas/Page"},{"type":"object","properties":{"score":{"type":"number","description":"Relevance score."}}}]}}}},"PricingTier":{"type":"object","required":["name","monthly_price_usd","credits"],"properties":{"name":{"type":"string"},"audience":{"type":"string"},"monthly_price_usd":{"type":"object","required":["from","to"],"properties":{"from":{"type":"number"},"to":{"type":"number"}}},"credits":{"type":"object","required":["from","to"],"properties":{"from":{"type":"integer"},"to":{"type":"integer"}}},"notes":{"type":"string"}}},"Pricing":{"type":"object","required":["currency","credit_price_usd","included","tiers"],"properties":{"currency":{"type":"string","enum":["USD"]},"credit_price_usd":{"type":"number"},"billing_model":{"type":"string"},"agents_included":{"type":"integer"},"additional_agent_monthly_usd":{"type":"number"},"included":{"type":"array","items":{"type":"string"}},"tiers":{"type":"array","items":{"$ref":"#/components/schemas/PricingTier"}},"source_url":{"type":"string","format":"uri"}}},"ChangelogItem":{"type":"object","required":["tag","text"],"properties":{"tag":{"type":"string"},"text":{"type":"string"}}},"ChangelogRelease":{"type":"object","required":["date","title","items"],"properties":{"date":{"type":"string"},"title":{"type":"string"},"items":{"type":"array","items":{"$ref":"#/components/schemas/ChangelogItem"}}}},"ChangelogList":{"type":"object","required":["object","count","data"],"properties":{"object":{"type":"string","enum":["list"]},"count":{"type":"integer"},"data":{"type":"array","items":{"$ref":"#/components/schemas/ChangelogRelease"}}}},"CaseStudySummary":{"type":"object","required":["slug","title","url"],"properties":{"slug":{"type":"string"},"title":{"type":"string"},"client_name":{"type":"string"},"industry":{"type":"string"},"summary":{"type":"string"},"headline_result":{"type":"string"},"url":{"type":"string","format":"uri"},"markdown_url":{"type":"string","format":"uri"}}},"CaseStudyList":{"type":"object","required":["object","count","data"],"properties":{"object":{"type":"string","enum":["list"]},"count":{"type":"integer"},"data":{"type":"array","items":{"$ref":"#/components/schemas/CaseStudySummary"}}}},"CaseStudy":{"allOf":[{"$ref":"#/components/schemas/CaseStudySummary"},{"type":"object","properties":{"timeline":{"type":"string"},"tools_used":{"type":"array","items":{"type":"string"}},"markdown":{"type":"string"}}}]},"LeadRequest":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"},"name":{"type":"string"},"company":{"type":"string"},"message":{"type":"string","description":"What the user wants. Free text, up to 2000 characters.","maxLength":2000},"source":{"type":"string","description":"Where the lead came from. Defaults to `api`."},"mode":{"type":"string","enum":["live","sandbox"],"default":"live","description":"`sandbox` validates the payload and echoes it back without creating a real lead."}}},"LeadResponse":{"type":"object","required":["object","accepted","mode"],"properties":{"object":{"type":"string","enum":["lead"]},"accepted":{"type":"boolean"},"mode":{"type":"string","enum":["live","sandbox"]},"id":{"type":["string","null"],"description":"Null in sandbox mode."},"next_step":{"type":"string"}}},"DesktopRelease":{"type":"object","properties":{"version":{"type":"string"},"url":{"type":"string","format":"uri"},"notes":{"type":"string"},"published_at":{"type":"string"}}},"DesktopReleaseEnvelope":{"type":"object","required":["release"],"properties":{"release":{"$ref":"#/components/schemas/DesktopRelease"}}},"BlogPost":{"type":"object","properties":{"_id":{"type":"string"},"title":{"type":"string"},"slug":{"type":"object","properties":{"current":{"type":"string"}}},"publishedAt":{"type":"string"},"content":{"type":"array","description":"Portable Text blocks.","items":{"type":"object","additionalProperties":true}}}},"JsonRpcRequest":{"type":"object","required":["jsonrpc","method"],"properties":{"jsonrpc":{"type":"string","enum":["2.0"]},"id":{"type":["string","integer","null"]},"method":{"type":"string","enum":["initialize","ping","tools/list","tools/call","notifications/initialized"]},"params":{"type":"object","additionalProperties":true}}},"JsonRpcResponse":{"type":"object","required":["jsonrpc"],"properties":{"jsonrpc":{"type":"string","enum":["2.0"]},"id":{"type":["string","integer","null"]},"result":{"type":"object","additionalProperties":true},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"integer"},"message":{"type":"string"},"data":{"type":"object","additionalProperties":true}}}}}}}}