{"name":"ChatbotGen API","version":"1.0.0","authentication":{"type":"bearer","description":"The MCP endpoint accepts an optional account API key as `Authorization: Bearer cbg_...`; without one it runs in anonymous sandbox mode. The demo API under /api/tools needs no key at all — each call is authorized by the opaque session id in its path.","required":false,"instructions_url":"https://www.chatbotgen.com/app/settings/account","token_prefix":"cbg_"},"description":"Public HTTP API and Model Context Protocol server for ChatbotGen. Create AI chatbots trained on your own content and deploy them to a website widget, WhatsApp, and Telegram.","errors":{"description":"Every failure on every endpoint answers with the same JSON body: a stable `code` to branch on, a `message` describing what happened, and a `hint` describing the recovery. Never an HTML page.","media_type":"application/json","example":{"error":"rate_limited","code":"rate_limited","message":"Too many requests from this IP address.","ok":false,"status":429,"errors":{"detail":"Too many requests from this IP address."},"hint":"Wait 60 seconds and retry. The demo API allows 30 requests per minute; the MCP endpoint allows 60.","documentation_url":"https://www.chatbotgen.com/developers"},"schema_url":"https://www.chatbotgen.com/openapi.json#/components/schemas/Error"},"endpoints":[{"path":"/.well-known/mcp","method":"GET","summary":"The same MCP server in the SEP-1960 endpoints shape","tags":["Discovery"],"operation_id":"getMcpEndpointManifest"},{"path":"/.well-known/mcp.json","method":"GET","summary":"Descriptor for the ChatbotGen MCP server","tags":["Discovery"],"operation_id":"getMcpManifest"},{"path":"/.well-known/mcp/server-card.json","method":"GET","summary":"The same MCP server in the SEP-1649 server-card shape","tags":["Discovery"],"operation_id":"getMcpServerCard"},{"path":"/api","method":"GET","summary":"JSON index of the public API","tags":["Discovery"],"operation_id":"getApiIndex"},{"path":"/api/tools/sessions","method":"POST","summary":"Create an anonymous demo session","tags":["Demo tools"],"operation_id":"createDemoSession"},{"path":"/api/tools/sessions/{session_id}","method":"GET","summary":"Read a demo session's live state","tags":["Demo tools"],"operation_id":"getDemoSession"},{"path":"/api/tools/sessions/{session_id}/files","method":"POST","summary":"Attach an uploaded file to a demo session","tags":["Demo tools"],"operation_id":"addDemoSessionFile"},{"path":"/api/tools/sessions/{session_id}/texts","method":"POST","summary":"Train a demo session on a block of text","tags":["Demo tools"],"operation_id":"addDemoSessionText"},{"path":"/api/tools/sessions/{session_id}/training","method":"POST","summary":"Embed a demo session's sources so the chatbot can answer","tags":["Demo tools"],"operation_id":"trainDemoSession"},{"path":"/api/tools/sessions/{session_id}/uploads","method":"POST","summary":"Get a presigned URL for a file upload","tags":["Demo tools"],"operation_id":"createDemoSessionUpload"},{"path":"/api/tools/sessions/{session_id}/urls","method":"POST","summary":"Train a demo session on a web page","tags":["Demo tools"],"operation_id":"addDemoSessionUrl"},{"path":"/docs/{category}/{slug}.md","method":"GET","summary":"Raw markdown source of one documentation page","tags":["Discovery"],"operation_id":"getDocPageAsMarkdown"},{"path":"/llms-full.txt","method":"GET","summary":"Every documentation page inlined as one file","tags":["Discovery"],"operation_id":"getLlmsFullTxt"},{"path":"/llms.txt","method":"GET","summary":"llmstxt.org index of the site","tags":["Discovery"],"operation_id":"getLlmsTxt"},{"path":"/mcp","method":"GET","summary":"Reports that this MCP endpoint is POST-only","tags":["MCP"],"operation_id":"describeMcpTransport"},{"path":"/mcp","method":"POST","summary":"Send a JSON-RPC 2.0 message to the ChatbotGen MCP server","tags":["MCP"],"operation_id":"callMcpServer"},{"path":"/openapi.json","method":"GET","summary":"This document","tags":["Discovery"],"operation_id":"getOpenApiDocument"},{"path":"/openapi.yaml","method":"GET","summary":"This document, YAML-encoded","tags":["Discovery"],"operation_id":"getOpenApiDocumentAsYaml"},{"path":"/sitemap.xml","method":"GET","summary":"XML sitemap of every indexable URL","tags":["Discovery"],"operation_id":"getSitemap"},{"path":"/v2/health","method":"GET","summary":"Liveness and database reachability","tags":["Operations"],"operation_id":"getHealth"}],"mcp":{"url":"https://www.chatbotgen.com/mcp","transport":"streamable-http","protocol_versions":["2025-06-18","2025-03-26","2024-11-05"],"manifest_url":"https://www.chatbotgen.com/.well-known/mcp.json","server_card_url":"https://www.chatbotgen.com/.well-known/mcp/server-card.json"},"rate_limits":{"description":"Every response on a rate-limited path carries its budget, so a caller can self-throttle before it is refused. `RateLimit-Reset` and `Retry-After` are both deltas in seconds.","headers":["RateLimit-Limit","RateLimit-Remaining","RateLimit-Reset","RateLimit-Policy","RateLimit","Retry-After"],"policies":[{"name":"demo-api","scope":"/api/tools/*","limit":30,"window_seconds":60},{"name":"mcp","scope":"POST /mcp","limit":60,"window_seconds":60},{"name":"beacon","scope":"POST /t/e","limit":300,"window_seconds":60}]},"contact_email":"support@chatbotgen.com","documentation_url":"https://www.chatbotgen.com/developers","openapi_url":"https://www.chatbotgen.com/openapi.json","openapi_yaml_url":"https://www.chatbotgen.com/openapi.yaml","status_url":"https://www.chatbotgen.com/v2/health","terms_of_service":"https://www.chatbotgen.com/terms","versioning":{"major":"1","scheme":"url-path","current":"1.0.0","deprecations":[],"policy_url":"https://www.chatbotgen.com/developers/versioning","deprecation_headers":["Deprecation","Sunset","Link; rel=\"successor-version\""]}}