{"openapi":"3.1.0","info":{"title":"Aigora public API","version":"1.1.0","summary":"Read-only structured access to Aigora public content.","description":"Unauthenticated, read-only endpoints that expose the same public content the website shows, in shapes an agent can consume. There is no write surface: leads and inquiries go through the website forms, not this API.\n\n## Versioning\nThis document is versioned with semantic versioning in `info.version`. Additive changes (new endpoints, new optional fields) raise the minor version and do not require caller changes. A breaking change ships under a new path prefix, `/api/v2/...`, and the current unprefixed paths keep working.\n\n## Deprecation policy\nBefore an endpoint is removed it returns the `Deprecation` and `Sunset` HTTP headers (RFC 8594) for at least 90 days, with a `Link` header of `rel=\"deprecation\"` pointing at the replacement. Nothing is withdrawn without that window. Poll this document to detect changes; operations scheduled for removal carry `deprecated: true`.\n\n## Errors\nAll error responses use RFC 9457 `application/problem+json` with a machine-readable `code`.\n\n## Rate limits\nEndpoints are rate limited per client IP and return `RateLimit-Limit`, `RateLimit-Remaining`, and `RateLimit-Reset` headers, plus `Retry-After` on a 429. Self-throttle from those headers.","contact":{"name":"Aigora support","url":"https://aigora.ai/contact"}},"servers":[{"url":"https://aigora.ai","description":"Production"}],"externalDocs":{"url":"https://aigora.ai/llms.txt","description":"Site profile for agents"},"components":{"schemas":{"Problem":{"type":"object","description":"RFC 9457 problem details. Served as application/problem+json.","required":["type","title","status","code","detail"],"properties":{"type":{"type":"string","format":"uri","description":"Stable URI for the problem class, e.g. https://aigora.ai/api/errors#rate_limited."},"title":{"type":"string","description":"Short human-readable summary of the problem class."},"status":{"type":"integer","description":"HTTP status code, repeated for convenience."},"code":{"type":"string","description":"Machine-readable error code. Branch on this rather than on the message.","enum":["invalid_request","method_not_allowed","not_acceptable","not_found","rate_limited","upstream_unavailable","internal_error"]},"detail":{"type":"string","description":"Human-readable explanation for this occurrence."},"instance":{"type":"string","description":"Path the problem applies to."},"docs":{"type":"string","format":"uri","description":"Link to this specification."},"error":{"type":"string","deprecated":true,"description":"Legacy duplicate of detail, kept for first-party callers. Use detail."}}}},"responses":{"NotAcceptable":{"description":"The requested media type cannot be served.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"MethodNotAllowed":{"description":"The HTTP method is not supported. The Allow header names the methods that are.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"TooManyRequests":{"description":"Rate limit exceeded. Retry after the Retry-After delay.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"InternalError":{"description":"Unexpected server error.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"paths":{"/api/agents":{"get":{"operationId":"getAgentsMetadata","summary":"Structured metadata about Aigora for AI agents","description":"Company profile, offerings, team, course details, THEUS platform metadata, trust posture, key page URLs, and AigoraCast podcast information, as one JSON document. Cached for an hour.","responses":{"200":{"description":"Structured public metadata.","content":{"application/json":{"schema":{"type":"object","description":"Company info, offerings, key pages, trust posture, and podcast metadata."}}}},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/llms":{"get":{"operationId":"queryLlmsPlainText","summary":"Query the public knowledge base, plain text","description":"Full-text search over the site content. Returns the matching sections as plain text. Omit `query` to get the catalog of available sections.","parameters":[{"name":"query","in":"query","required":false,"schema":{"type":"string","maxLength":200},"description":"Topic or question, 200 characters or fewer. Omit for the section catalog. Example: theus, pricing, contact."}],"responses":{"200":{"description":"Matching sections as plain text, or a section catalog when the query is empty or matches nothing.","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/llms/json":{"get":{"operationId":"queryLlmsJson","summary":"Query the public knowledge base, JSON","description":"Same search as /llms, returned as JSON with per-match scores and token counts so a caller can budget context.","parameters":[{"name":"query","in":"query","required":false,"schema":{"type":"string","maxLength":200},"description":"Topic or question, 200 characters or fewer. Omit for the section catalog."}],"responses":{"200":{"description":"Matching sections, or a section catalog.","content":{"application/json":{"schema":{"type":"object","required":["query","mode","matches","sections"],"properties":{"query":{"type":"string"},"mode":{"type":"string","enum":["catalog","matches"]},"note":{"type":"string"},"matches":{"type":"array","items":{"type":"object","properties":{"heading":{"type":"string"},"path":{"type":"string","description":"Heading breadcrumb, not a URL."},"score":{"type":"number"},"tokens":{"type":"integer"},"text":{"type":"string"}}}},"sections":{"type":"array","items":{"type":"string"}},"tokensReturned":{"type":"integer"}}}}}}}}},"/llms.txt":{"get":{"operationId":"getLlmsProfile","summary":"Short site profile for agents","description":"Markdown profile covering what Aigora does, when to use it, and where to go next. Honors Accept: text/markdown per acceptmarkdown.com; otherwise served as text/plain. The homepage negotiates to this document when an agent asks for markdown.","responses":{"200":{"description":"Site profile.","headers":{"Vary":{"schema":{"type":"string"},"description":"Accept, Accept-Encoding"}},"content":{"text/markdown":{"schema":{"type":"string"}},"text/plain":{"schema":{"type":"string"}}}}}}},"/api/chat":{"post":{"operationId":"postChatMessage","summary":"Ask the site assistant a question","description":"Rate limited to 60 requests per 10 minutes per client IP. Intended for the website chat widget. Agents should prefer /llms?query= for retrieval.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["message"],"properties":{"message":{"type":"string","minLength":1,"maxLength":2000},"history":{"type":"array","items":{"type":"object","required":["role","content"],"properties":{"role":{"type":"string","enum":["user","model"]},"content":{"type":"string"}}}}}}}}},"responses":{"200":{"description":"Assistant reply.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"},"description":"Requests permitted in the current window."},"RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Requests left in the current window."},"RateLimit-Reset":{"schema":{"type":"integer"},"description":"Seconds until the current window resets."}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"response":{"type":"string"},"recommendedPages":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"The request body failed validation.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}}}}}}