{"openapi":"3.1.0","info":{"title":"Experiential Labs Platform API","version":"0.1.0"},"paths":{"/health":{"get":{"summary":"Health","description":"Return API health.\n\nDeliberately ``async``: a sync handler runs on Starlette's threadpool,\nwhich the sync DB-bound routes saturate under load, so the liveness\nprobe queued behind them (measured at 2s p50 / 13s p95 on 2026-09-04)\nand kubelet killed pods that were serving fine. Liveness answers from\nthe event loop and never waits for a thread.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonObject"}}}}}}},"/api/hello":{"get":{"summary":"Anthropic Hello","description":"Answer Claude Code's connectivity probe the way api.anthropic.com does.\n\nRegistered here, ahead of every router, so on the edge role the literal\npath wins over the ``/api/{path:path}`` control relay and the probe is\nanswered in-pod. A constant body from the event loop: no credential,\nno database, no caller input reflected, so there is nothing here to\nenumerate; it stays out of ``/v1`` and the customer-key allowlist.","operationId":"anthropic_hello_api_hello_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"summary":"Anthropic Hello","description":"Answer Claude Code's connectivity probe the way api.anthropic.com does.\n\nRegistered here, ahead of every router, so on the edge role the literal\npath wins over the ``/api/{path:path}`` control relay and the probe is\nanswered in-pod. A constant body from the event loop: no credential,\nno database, no caller input reflected, so there is nothing here to\nenumerate; it stays out of ``/v1`` and the customer-key allowlist.","operationId":"anthropic_hello_api_hello_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health/ready":{"get":{"summary":"Health Ready","description":"Return a coalesced readiness verdict from one real PostgREST round-trip.\n\nTransport/auth only, zero rows is ready. Successful and failed verdicts\nlive for one second. Timeouts fail closed without releasing the shared\nin-flight slot before the blocking operation actually exits.","operationId":"health_ready_health_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/models":{"get":{"tags":["serving gateway"],"summary":"List Models","description":"Relay the model list; the worker scopes it to the caller's key.\n\nServed from a tight per-key TTL cache when warm, so repeat discovery calls\nskip the worker hop and the catalog re-serialization.","operationId":"list_models_v1_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/models/{model_id}":{"get":{"tags":["serving gateway"],"summary":"Retrieve Model","description":"Relay one model detail read (the SDKs' ``models.retrieve``).\n\nUncached, unlike the list: the worker answers a single small object, and\na per-(key, model) cache would multiply entries for no measurable saving.","operationId":"retrieve_model_v1_models__model_id__get","parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"string","title":"Model Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/chat/completions":{"post":{"tags":["serving gateway"],"summary":"Chat Completions","description":"Relay one Chat Completions request, streamed or buffered.","operationId":"chat_completions_v1_chat_completions_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/responses":{"post":{"tags":["serving gateway"],"summary":"Responses","description":"Relay one Responses request, streamed or buffered.","operationId":"responses_v1_responses_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/embeddings":{"post":{"tags":["serving gateway"],"summary":"Embeddings","description":"Relay one embeddings request; the worker answers buffered JSON.","operationId":"embeddings_v1_embeddings_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/images/generations":{"post":{"tags":["serving gateway"],"summary":"Images Generations","description":"Relay one image-generation request; the worker answers buffered JSON.","operationId":"images_generations_v1_images_generations_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/images/edits":{"post":{"tags":["serving gateway"],"summary":"Images Edits","description":"Relay one image-edit upload (multipart, streamed); the worker answers buffered JSON.","operationId":"images_edits_v1_images_edits_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/audio/speech":{"post":{"tags":["serving gateway"],"summary":"Audio Speech","description":"Relay one text-to-speech request; the worker answers the audio bytes.","operationId":"audio_speech_v1_audio_speech_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/audio/transcriptions":{"post":{"tags":["serving gateway"],"summary":"Audio Transcriptions","description":"Relay one transcription upload (multipart, streamed); the worker answers the transcript.","operationId":"audio_transcriptions_v1_audio_transcriptions_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/batches":{"get":{"tags":["serving gateway"],"summary":"Batches List","description":"Relay the batch list read.","operationId":"batches_list_v1_batches_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["serving gateway"],"summary":"Batches Create","description":"Relay one batch submission; the worker is the auth and protocol authority.","operationId":"batches_create_v1_batches_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/batches/{batch_id}":{"get":{"tags":["serving gateway"],"summary":"Batches Retrieve","description":"Relay one batch status read.","operationId":"batches_retrieve_v1_batches__batch_id__get","parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","title":"Batch Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/batches/{batch_id}/cancel":{"post":{"tags":["serving gateway"],"summary":"Batches Cancel","description":"Relay one batch cancel.","operationId":"batches_cancel_v1_batches__batch_id__cancel_post","parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","title":"Batch Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/files":{"post":{"tags":["serving gateway"],"summary":"Files Create","description":"Relay one batch file upload (multipart crosses verbatim).","operationId":"files_create_v1_files_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/files/{file_id}":{"get":{"tags":["serving gateway"],"summary":"Files Retrieve","description":"Relay one file metadata read.","operationId":"files_retrieve_v1_files__file_id__get","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/files/{file_id}/content":{"get":{"tags":["serving gateway"],"summary":"Files Content","description":"Relay one file content download.","operationId":"files_content_v1_files__file_id__content_get","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/videos":{"get":{"tags":["serving gateway"],"summary":"Videos List","description":"Relay the caller's video job list.","operationId":"videos_list_v1_videos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["serving gateway"],"summary":"Videos Create","description":"Relay one video job submission (JSON or the SDK's multipart form).","operationId":"videos_create_v1_videos_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/videos/{video_id}":{"get":{"tags":["serving gateway"],"summary":"Videos Retrieve","description":"Relay one video job status read (the worker refreshes it from the provider).","operationId":"videos_retrieve_v1_videos__video_id__get","parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"string","title":"Video Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["serving gateway"],"summary":"Videos Delete","description":"Relay one finished video job's deletion.","operationId":"videos_delete_v1_videos__video_id__delete","parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"string","title":"Video Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/videos/{video_id}/content":{"get":{"tags":["serving gateway"],"summary":"Videos Content","description":"Relay one rendered video's download (streamed MP4).","operationId":"videos_content_v1_videos__video_id__content_get","parameters":[{"name":"video_id","in":"path","required":true,"schema":{"type":"string","title":"Video Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/systemone":{"post":{"tags":["serving gateway"],"summary":"Decisions","description":"Relay the native decision protocol; validation and execution belong to Rust.","operationId":"decisions_v1_systemone_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/decisions":{"post":{"tags":["serving gateway"],"summary":"Openai Decisions","description":"Relay the OpenAI Decisions API wire; validation and execution belong to Rust.","operationId":"openai_decisions_v1_decisions_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/messages":{"post":{"tags":["serving gateway"],"summary":"Anthropic Messages","description":"Relay one Anthropic Messages request, streamed or buffered.","operationId":"anthropic_messages_v1_messages_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/messages/count_tokens":{"post":{"tags":["serving gateway"],"summary":"Anthropic Count Tokens","description":"Relay the count_tokens probe; the worker refuses it in Anthropic shape.","operationId":"anthropic_count_tokens_v1_messages_count_tokens_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/{path}":{"put":{"tags":["serving gateway"],"summary":"Unsupported V1 Path","description":"Fail closed for every OpenAI route the gateway does not serve.","operationId":"unsupported_v1_path_v1__path__put","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["serving gateway"],"summary":"Unsupported V1 Path","description":"Fail closed for every OpenAI route the gateway does not serve.","operationId":"unsupported_v1_path_v1__path__put","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["serving gateway"],"summary":"Unsupported V1 Path","description":"Fail closed for every OpenAI route the gateway does not serve.","operationId":"unsupported_v1_path_v1__path__put","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["serving gateway"],"summary":"Unsupported V1 Path","description":"Fail closed for every OpenAI route the gateway does not serve.","operationId":"unsupported_v1_path_v1__path__put","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["serving gateway"],"summary":"Unsupported V1 Path","description":"Fail closed for every OpenAI route the gateway does not serve.","operationId":"unsupported_v1_path_v1__path__put","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orgs/{org_id}":{"get":{"summary":"Get Org","description":"Return one organization the actor may reach, by id.\n\nThe bounded companion to ``GET /api/orgs``: a platform admin resolves\nANY org here (the admin-panel open-org path and the active-org cookie\nfor an org they do not belong to), while a member or API-key actor may\nread only their own org. Anything else is the resource 404, never a\nleak of another tenant's existence.","operationId":"get_org_api_orgs__org_id__get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","title":"Org Id"}},{"name":"X-Explabs-Actor-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Explabs-Actor-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonObject"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"JsonObject":{"additionalProperties":true,"type":"object"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}