{"openapi":"3.1.0","info":{"title":"FALA by Elav8 public API","version":"1.0.0","description":"Public, unauthenticated FALA (Elevate Follow-Up by Elav8) surface: widget runtime, health, branding, and agent discovery. Dashboard, admin, billing mutation, and Shopify-internal routes are not part of this specification.\n\nErrors: every 4xx/5xx body is the `Error` object (`detail` is a human-readable message, or a list of field errors on 422). Rate-limited requests answer 429 with a `Retry-After` header in seconds.\n\nVersioning: this is version 1 of the public API. Changes within 1.x are additive only — new operations, optional fields, new enum values — because embed snippets already on customer sites call these routes. A breaking change ships as a new major version alongside the old one; an operation scheduled for removal is marked `deprecated: true` here and answers with `Deprecation` and `Sunset` headers at least 90 days before it is removed.","contact":{"name":"FALA by Elav8","url":"https://fala.elav8.ai/developers"},"x-api-versioning":{"strategy":"major-version","current":"1","deprecation":"deprecated: true + Deprecation/Sunset headers, at least 90 days notice","header":"API-Version","request-header":"API-Version","sunset-header":"Sunset","deprecation-header":"Deprecation"},"x-rate-limits":{"headers":["RateLimit-Policy","RateLimit","RateLimit-Limit","RateLimit-Remaining","RateLimit-Reset"],"on-429":"Retry-After (seconds)"}},"servers":[{"url":"https://fala.elav8.ai","description":"Production"}],"tags":[{"name":"Discovery","description":"Agent and developer discovery files"},{"name":"Widget runtime","description":"Public embed API keyed by public_key"}],"paths":{"/api/health":{"get":{"tags":["Discovery"],"operationId":"getHealth","summary":"Liveness and database ping","responses":{"200":{"description":"Service is up","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}},"headers":{"API-Version":{"$ref":"#/components/headers/API-Version"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}}},"503":{"description":"A dependency (the database) is not answering; retry with backoff","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"description":"Seconds until the client may retry","schema":{"type":"integer","minimum":1}},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error; safe to retry with backoff","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected server error; safe to retry with backoff","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The API-Version request header names a version this server does not support","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"description":"Liveness and database ping"}},"/api/elav8/branding":{"get":{"tags":["Discovery"],"operationId":"getElav8Branding","summary":"Public FALA branding from Paga","description":"Unauthenticated theme payload (or empty object when billing is unconfigured).","responses":{"200":{"description":"Branding object or {}","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Branding"}}},"headers":{"API-Version":{"$ref":"#/components/headers/API-Version"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"description":"Seconds until the client may retry","schema":{"type":"integer","minimum":1}},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error; safe to retry with backoff","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected server error; safe to retry with backoff","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The API-Version request header names a version this server does not support","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}]}},"/openapi.json":{"get":{"tags":["Discovery"],"operationId":"getOpenApi","summary":"This OpenAPI document","responses":{"200":{"description":"OpenAPI 3.1 document","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenApiDocument"}}},"headers":{"API-Version":{"$ref":"#/components/headers/API-Version"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"description":"Seconds until the client may retry","schema":{"type":"integer","minimum":1}},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error; safe to retry with backoff","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected server error; safe to retry with backoff","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The API-Version request header names a version this server does not support","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"description":"This OpenAPI document"}},"/llms.txt":{"get":{"tags":["Discovery"],"operationId":"getLlmsTxt","summary":"llms.txt agent index","responses":{"200":{"description":"Markdown index","content":{"text/markdown":{"schema":{"type":"string","contentMediaType":"text/markdown","description":"The llms.txt index: an H1, a summary blockquote and sections of links."}}},"headers":{"API-Version":{"$ref":"#/components/headers/API-Version"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"description":"Seconds until the client may retry","schema":{"type":"integer","minimum":1}},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error; safe to retry with backoff","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected server error; safe to retry with backoff","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The API-Version request header names a version this server does not support","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"description":"llms.txt agent index"}},"/.well-known/api-catalog":{"get":{"tags":["Discovery"],"operationId":"getApiCatalog","summary":"RFC 9727 API catalog","responses":{"200":{"description":"Linkset catalog","content":{"application/linkset+json":{"schema":{"$ref":"#/components/schemas/ApiCatalog"}},"application/json":{"schema":{"$ref":"#/components/schemas/ApiCatalog"}}},"headers":{"API-Version":{"$ref":"#/components/headers/API-Version"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"description":"Seconds until the client may retry","schema":{"type":"integer","minimum":1}},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error; safe to retry with backoff","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected server error; safe to retry with backoff","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The API-Version request header names a version this server does not support","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"description":"RFC 9727 API catalog"}},"/widget.js":{"get":{"tags":["Widget runtime"],"operationId":"getWidgetLoader","summary":"Embeddable FALA widget loader","responses":{"200":{"description":"JavaScript loader","content":{"application/javascript":{"schema":{"type":"string","contentMediaType":"application/javascript","description":"The loader script; it fetches the widget bundle and the key's published config."}}},"headers":{"API-Version":{"$ref":"#/components/headers/API-Version"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}}},"500":{"description":"Unexpected server error; safe to retry with backoff","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected server error; safe to retry with backoff","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The API-Version request header names a version this server does not support","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"description":"Embeddable FALA widget loader"}},"/api/w/{public_key}/config":{"get":{"tags":["Widget runtime"],"operationId":"getWidgetConfig","summary":"Public widget appearance and capabilities","parameters":[{"name":"public_key","in":"path","required":true,"schema":{"type":"string"},"description":"Widget public key from the embed snippet"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Widget config snapshot","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetConfig"}}},"headers":{"API-Version":{"$ref":"#/components/headers/API-Version"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}}},"403":{"description":"Refused: the page's host is outside the widget's domain lock, or the widget is not switched on yet. `detail` says which and where the owner fixes it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown widget or resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"description":"Seconds until the client may retry","schema":{"type":"integer","minimum":1}},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error; safe to retry with backoff","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected server error; safe to retry with backoff","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The API-Version request header names a version this server does not support","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Public widget appearance and capabilities"}},"/api/w/chat":{"post":{"tags":["Widget runtime"],"operationId":"postWidgetChat","summary":"Stream a text reply from the published agent","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequest"}}}},"responses":{"200":{"description":"Server-sent events stream of tokens and cards","content":{"text/event-stream":{"schema":{"type":"string","contentMediaType":"text/event-stream","description":"Server-sent events. Each `data:` line is a JSON object carrying a reply delta, a card, or the final message; the stream ends when the reply is complete."}}},"headers":{"API-Version":{"$ref":"#/components/headers/API-Version"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}}},"403":{"description":"Refused: the page's host is outside the widget's domain lock, or the widget is not switched on yet. `detail` says which and where the owner fixes it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown widget or resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The request body failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"description":"Seconds until the client may retry","schema":{"type":"integer","minimum":1}},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error; safe to retry with backoff","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected server error; safe to retry with backoff","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The API-Version request header names a version this server does not support","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"description":"Stream a text reply from the published agent"}},"/api/w/lead":{"post":{"tags":["Widget runtime"],"operationId":"postWidgetLead","summary":"Capture a visitor lead","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadCapture"}}}},"responses":{"200":{"description":"Lead accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadAccepted"}}},"headers":{"API-Version":{"$ref":"#/components/headers/API-Version"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}}},"403":{"description":"Refused: the page's host is outside the widget's domain lock, or the widget is not switched on yet. `detail` says which and where the owner fixes it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown widget or resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"The request body failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"description":"Seconds until the client may retry","schema":{"type":"integer","minimum":1}},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error; safe to retry with backoff","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected server error; safe to retry with backoff","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The API-Version request header names a version this server does not support","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"description":"Capture a visitor lead"}},"/api/w/{public_key}/voice-token":{"post":{"tags":["Widget runtime"],"operationId":"postWidgetVoiceToken","summary":"Mint an ephemeral live-voice token","parameters":[{"name":"public_key","in":"path","required":true,"schema":{"type":"string"},"description":"Widget public key from the embed snippet"},{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"description":"Short-lived voice credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceToken"}}},"headers":{"API-Version":{"$ref":"#/components/headers/API-Version"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}}},"403":{"description":"Refused: the page's host is outside the widget's domain lock, or the widget is not switched on yet. `detail` says which and where the owner fixes it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown widget or resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","headers":{"Retry-After":{"description":"Seconds until the client may retry","schema":{"type":"integer","minimum":1}},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error; safe to retry with backoff","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected server error; safe to retry with backoff","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"The API-Version request header names a version this server does not support","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"description":"Mint an ephemeral live-voice token"}}},"components":{"responses":{"NotFound":{"description":"Unknown widget or resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Forbidden":{"description":"Refused: the page's host is outside the widget's domain lock, or the widget is not switched on yet. `detail` says which and where the owner fixes it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ValidationError":{"description":"The request body failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"TooManyRequests":{"description":"Rate limited","headers":{"Retry-After":{"description":"Seconds until the client may retry","schema":{"type":"integer","minimum":1}},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit":{"$ref":"#/components/headers/RateLimit"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"UnsupportedVersion":{"description":"The API-Version request header names a version this server does not support","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ServiceUnavailable":{"description":"A dependency (the database) is not answering; retry with backoff","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ServerError":{"description":"Unexpected server error; safe to retry with backoff","headers":{"API-Version":{"$ref":"#/components/headers/API-Version"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Error":{"type":"object","required":["detail"],"properties":{"detail":{"description":"Human-readable message, or a list of field errors (422)","oneOf":[{"type":"string"},{"type":"array","items":{"type":"object","properties":{"loc":{"type":"array","items":{"type":["string","integer"]}},"msg":{"type":"string"},"type":{"type":"string"}}}}]}}},"Branding":{"type":"object","description":"Display name, logo, support email and legal links; {} when unconfigured","additionalProperties":true,"properties":{"display_name":{"type":"string"},"logo_url":{"type":"string"},"support_email":{"type":"string"}}},"WidgetConfig":{"type":"object","description":"The published widget snapshot the embed renders (also served from the CDN). A widget whose install terms are not yet on record answers {publicKey, notActivated: true, reason: 'install_terms'}.","additionalProperties":true,"required":["publicKey"],"properties":{"publicKey":{"type":"string"},"notActivated":{"type":"boolean"},"reason":{"type":"string"}}},"LeadAccepted":{"type":"object","required":["success","leadId"],"properties":{"success":{"type":"boolean"},"leadId":{"type":"string"}}},"VoiceToken":{"type":"object","description":"Ephemeral credentials for the server-chosen realtime voice engine.","additionalProperties":true,"required":["provider","token","conversationId"],"properties":{"provider":{"type":"string","enum":["grok","gemini"]},"model":{"type":"string"},"token":{"type":"string"},"greeting":{"type":"string"},"conversationId":{"type":"string"},"audio":{"type":"object","additionalProperties":true},"failover":{"type":"array","items":{"type":"string"}},"connectTimeoutMs":{"type":"integer"},"prefetchMaxAgeMs":{"type":"integer"}}},"ChatRequest":{"type":"object","required":["public_key","message"],"properties":{"public_key":{"type":"string"},"message":{"type":"string","maxLength":8000},"conversation_id":{"type":"string"},"visitor_id":{"type":"string"}}},"LeadCapture":{"type":"object","required":["public_key"],"properties":{"public_key":{"type":"string"},"conversation_id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"phone":{"type":"string"},"notes":{"type":"string"}}},"Health":{"type":"object","required":["ok","db"],"properties":{"ok":{"type":"boolean","description":"The API process is serving."},"db":{"type":"boolean","description":"The database answered a ping."}}},"OpenApiDocument":{"type":"object","description":"An OpenAPI 3.1 document (this one).","required":["openapi","info","paths"],"properties":{"openapi":{"type":"string"},"info":{"type":"object","additionalProperties":true},"paths":{"type":"object","additionalProperties":true},"components":{"type":"object","additionalProperties":true}}},"ApiCatalog":{"type":"object","description":"RFC 9727 linkset: the APIs this host publishes and their descriptions.","required":["linkset"],"properties":{"linkset":{"type":"array","items":{"type":"object","additionalProperties":true,"required":["anchor"],"properties":{"anchor":{"type":"string","format":"uri"}}}}}}},"headers":{"API-Version":{"description":"Major version of the public API that answered (see the versioning policy).","schema":{"type":"string","enum":["1"]}},"RateLimit-Policy":{"description":"IETF RateLimit-Policy: \"<bucket>\";q=<requests>;w=<window seconds>.","schema":{"type":"string"}},"RateLimit":{"description":"IETF RateLimit: \"<bucket>\";r=<remaining>;t=<seconds until reset>.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests allowed per window.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in this window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the window resets.","schema":{"type":"integer"}},"Deprecation":{"description":"RFC 9745: present on an operation scheduled for removal.","schema":{"type":"string"}},"Sunset":{"description":"RFC 8594: the HTTP-date after which a deprecated operation is removed.","schema":{"type":"string"}}},"parameters":{"ApiVersion":{"name":"API-Version","in":"header","required":false,"description":"Major version of the public API the client expects. Omit for the current version; any unsupported value answers 400.","schema":{"type":"string","enum":["1"]}}}}}