{"openapi":"3.0.3","info":{"title":"GeniusPro API","version":"1.0.0","description":"OpenAI-compatible chat, models, files, embeddings, audio (transcription + speech), and realtime voice. See https://api.geniuspro.io/ for the lightweight discovery index.","contact":{"name":"GeniusPro","url":"https://platform.geniuspro.io"}},"servers":[{"url":"https://api.geniuspro.io"}],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"x-security-policy":{"url":"https://geniuspro.io/security","summary":"No training on API traffic; PII scrubbed from GeniusPro logs by default; opt-in edge PII scrubbing via X-GP-Scrub-Prompt header or scrub_pii body flag.","controls":["no_training_on_api_traffic","pii_scrubbed_from_logs","opt_in_edge_pii_scrub","tls_in_transit","encryption_at_rest","hashed_api_keys"],"compliance_covered_today":["SOC 2 Type II","ISO 27001"],"compliance_covered_today_note":"Attested across the GeniusPro stack: managed Postgres database, US cloud hosting for control plane and realtime voice proxy, and every hyperscaler-hosted model route used for compliance-sensitive traffic.","compliance_available_under_baa":["HIPAA"],"compliance_available_under_baa_note":"Enterprise tier wires HIPAA-covered workspaces so every link carries a signed BAA: upstream (hyperscaler-hosted model provider under the matching BAA) and database (HIPAA-eligible tier with a signed BAA). Contact https://geniuspro.io/#invite.","vendor_chain_disclosure":"Specific infrastructure and model-provider names are shared under NDA during onboarding and security-questionnaire review, not on public surfaces."},"x-ai-usage-policy":{"url":"https://geniuspro.io/ai-usage","summary":"AI agents may read, summarize, link, and cite GeniusPro public surfaces with attribution. Verbatim copying, foundation-model training, and PII collection require written permission.","ok":["Read the discovery index, this OpenAPI spec, ai-plugin.json, llms.txt, JSON-LD, and model catalog.","Summarize and link back to canonical URLs.","Cite model slugs from https://api.geniuspro.io/v1/models/catalog as the authoritative source.","Build integrations against https://api.geniuspro.io/v1."],"not_ok":["Copy GeniusPro prose, code samples, or documentation verbatim without attribution.","Use GeniusPro content for foundation-model training, fine-tuning, RLHF, DPO, or distillation without written permission.","Collect, cache, or redistribute any PII that appears on GeniusPro public surfaces.","Misrepresent model slugs, pricing, availability, or capabilities."],"customer_traffic_note":"Data callers send to api.geniuspro.io is governed by the separate security policy at https://geniuspro.io/security, not this AI-usage policy.","permission_contact":"legal@geniuspro.io"},"tags":[{"name":"Discovery"},{"name":"Chat"},{"name":"Models"},{"name":"Files"},{"name":"Embeddings"},{"name":"Audio"},{"name":"Realtime"},{"name":"Video"}],"paths":{"/":{"get":{"tags":["Discovery"],"summary":"API discovery index","description":"Lightweight JSON pointing to the OpenAPI spec, plugin manifest, docs, and auth details. No auth required.","security":[],"responses":{"200":{"description":"Discovery index","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/openapi.json":{"get":{"tags":["Discovery"],"summary":"Full OpenAPI 3.0 spec","security":[],"responses":{"200":{"description":"OpenAPI document","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/.well-known/ai-plugin.json":{"get":{"tags":["Discovery"],"summary":"AI plugin manifest","security":[],"responses":{"200":{"description":"Plugin manifest","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/docs":{"get":{"tags":["Discovery"],"summary":"Human-readable API docs (Redoc)","security":[],"responses":{"200":{"description":"HTML docs page","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/v1/health":{"get":{"tags":["Discovery"],"summary":"Health check","security":[],"responses":{"200":{"description":"Service healthy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/v1/models":{"get":{"tags":["Models"],"summary":"List available models","description":"Per-key, plan-filtered list — what the authenticated caller can reach right now (includes their CATs). For the unauthenticated universe of publicly callable slugs, use GET /v1/models/catalog.","responses":{"200":{"description":"List of model ids","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/v1/models/catalog":{"get":{"tags":["Models","Discovery"],"summary":"Public catalog of GeniusPro model slugs (four tiers)","description":"Unauthenticated, authoritative list of every publicly callable model slug, grouped into experts (professional-role simon-says-* orchestrators), task orchestrators (simon-says-* auto-routers), benchmarked specialists (simon-says-* single-model per task), and direct raw-provider slugs. User CATs (cat:slug) are per API key and not listed here. Sourced live from the admin catalog with a 5-minute cache; does not leak upstream provider/model mappings or pricing. Use this to answer 'does this model exist?' without an API key.","security":[],"responses":{"200":{"description":"Four-tier model catalog","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelCatalogResponse"}}}}}}},"/v1/chat/completions":{"post":{"tags":["Chat"],"summary":"Create a chat completion","description":"OpenAI-compatible. Set `stream: true` to receive server-sent events. Files attached via `{ type: 'file', file: { file_id } }` content parts must be uploaded first through /v1/files. Send `X-GP-Scrub-Prompt: true` (or `scrub_pii: true` in the body) to mask PII from `messages[].content` before the request is dispatched to the upstream provider; see https://geniuspro.io/security.","parameters":[{"in":"header","name":"X-GP-Scrub-Prompt","required":false,"schema":{"type":"string","enum":["true","1","yes","on"]},"description":"Opt-in edge PII scrubbing. Equivalent to `scrub_pii: true` in the request body. When set, emails, phone numbers, SSNs, credit cards, IP addresses, and API keys are masked from messages[].content BEFORE dispatching to the upstream provider. PII is always scrubbed from GeniusPro's own logs regardless of this flag."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatCompletionRequest"}}}},"responses":{"200":{"description":"Chat completion response (non-streaming)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatCompletionResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/v1/embeddings":{"post":{"tags":["Embeddings"],"summary":"Create text embeddings","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmbeddingRequest"}}}},"responses":{"200":{"description":"Embedding vectors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmbeddingResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/v1/files":{"post":{"tags":["Files"],"summary":"Request a pre-signed upload URL","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileCreateRequest"}}}},"responses":{"200":{"description":"File slot created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileCreateResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}}},"get":{"tags":["Files"],"summary":"List uploaded files","responses":{"200":{"description":"File list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/v1/files/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"tags":["Files"],"summary":"Get file metadata","responses":{"200":{"description":"File metadata","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileObject"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Not found"}}},"delete":{"tags":["Files"],"summary":"Delete an uploaded file","responses":{"200":{"description":"Deleted"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Not found"}}}},"/v1/files/{id}/complete":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"post":{"tags":["Files"],"summary":"Confirm upload after PUT to the pre-signed URL","responses":{"200":{"description":"File marked ready","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileObject"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"description":"Not found"}}}},"/v1/audio/transcriptions":{"post":{"tags":["Audio"],"summary":"Transcribe audio to text","description":"OpenAI-compatible speech-to-text. Send multipart/form-data with a `model` slug and an audio `file` (≤ 25 MiB). Existing OpenAI SDKs work by changing only the base URL + key. Billed usage is returned in X-GeniusPro-* response headers.","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/AudioTranscriptionRequest"}}}},"responses":{"200":{"description":"Transcription. JSON object when response_format is json/verbose_json; otherwise a raw transcript string (text/srt/vtt).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioTranscriptionResponse"}},"text/plain":{"schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/v1/audio/speech":{"post":{"tags":["Audio"],"summary":"Synthesize speech from text","description":"OpenAI-compatible text-to-speech. Send JSON with a `model` slug and `input` text (≤ 4096 chars); the response body is the raw audio in the requested `response_format`. Billed usage is returned in X-GeniusPro-* response headers.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AudioSpeechRequest"}}}},"responses":{"200":{"description":"Binary audio in the requested format.","content":{"audio/mpeg":{"schema":{"type":"string","format":"binary"}},"audio/opus":{"schema":{"type":"string","format":"binary"}},"audio/aac":{"schema":{"type":"string","format":"binary"}},"audio/flac":{"schema":{"type":"string","format":"binary"}},"audio/wav":{"schema":{"type":"string","format":"binary"}},"audio/L16":{"schema":{"type":"string","format":"binary"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/v1/realtime/sessions":{"post":{"tags":["Realtime"],"summary":"Mint a realtime voice session token","description":"Step 1 of 2 for realtime voice. Authenticate with your API key and POST a voice model slug to mint a single-use ephemeral token plus a `ws_url`. Step 2: open `ws_url` with `Authorization: Bearer <token>` (browsers cannot set headers — append `&token=<token>` to the URL instead). Your raw API key is NEVER used on the WebSocket. Requires at least $0.50 in credits; rate-limited per API key. Over the socket the client speaks the OpenAI Realtime event protocol (audio is base64 PCM16 24 kHz mono) regardless of the underlying provider.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RealtimeSessionRequest"}}}},"responses":{"200":{"description":"Realtime session minted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RealtimeSessionResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/v1/realtime":{"get":{"tags":["Realtime"],"summary":"Realtime voice WebSocket (connect via minted ws_url)","description":"Do NOT connect here directly and do NOT hardcode this host. First call POST /v1/realtime/sessions, then connect to the `ws_url` it returns using `Authorization: Bearer <token>` (or `&token=<token>` for browsers). The returned URL already includes the model and targets the realtime voice proxy. Binary frames carry audio; JSON frames are OpenAI-Realtime-compatible control events.","security":[],"responses":{"101":{"description":"Switching protocols to WebSocket"},"401":{"description":"Missing, expired, already-used, or model-mismatched ephemeral token."}}}},"/v1/videos":{"post":{"tags":["Video"],"summary":"Submit a video-generation job","description":"Start an async video generation (Google Veo). Returns a job with status `in_progress`. Poll GET /v1/videos/{id} until `completed`, then download the MP4 from GET /v1/videos/{id}/content. Billed per second of generated video at completion (only successful generations are charged); a credit pre-flight runs at submit.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoGenerationRequest"}}}},"responses":{"200":{"description":"Video job accepted and processing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoJob"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"404":{"$ref":"#/components/responses/BadRequest"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/v1/videos/{id}":{"get":{"tags":["Video"],"summary":"Get a video-generation job","description":"Poll a video job. While running, the server checks the underlying operation and advances the job. On the first poll that observes completion the usage charge is applied.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Current job state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoJob"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"404":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/videos/{id}/content":{"get":{"tags":["Video"],"summary":"Download the generated video","description":"Stream the generated MP4 for a completed, billed job. Returns 409 when the job is not yet completed.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"The generated video.","content":{"video/mp4":{"schema":{"type":"string","format":"binary"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"404":{"$ref":"#/components/responses/BadRequest"},"409":{"$ref":"#/components/responses/BadRequest"}}}}},"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key"},"BearerAuth":{"type":"http","scheme":"bearer"}},"responses":{"BadRequest":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"InsufficientCredits":{"description":"The account is out of API credits. `error.message` begins with `API_BILLING:`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"PayloadTooLarge":{"description":"Request body exceeds 4 MB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"RateLimited":{"description":"Rate limit exceeded; back off and retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Error":{"type":"object","description":"OpenAI-compatible error envelope. `error.type` is one of authentication_error, invalid_request_error, insufficient_quota, rate_limit_error, permission_error, not_found_error, or api_error. `request_id` matches the x-request-id response header — quote it in support tickets.","properties":{"error":{"type":"object","properties":{"message":{"type":"string"},"type":{"type":"string"},"code":{"type":"string","nullable":true}},"required":["message","type"]},"request_id":{"type":"string"}},"required":["error"]},"HealthResponse":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"service":{"type":"string","example":"geniuspro-api"}}},"Model":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","example":"model"},"owned_by":{"type":"string"}}},"ModelList":{"type":"object","properties":{"object":{"type":"string","example":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Model"}}}},"CatalogModel":{"type":"object","properties":{"id":{"type":"string","example":"simon-says-coding-super"},"category":{"type":"string","nullable":true,"description":"Coarse use-case category (chat, coding, reasoning, creative, image, vision, audio, embedding, agents, orchestrator)."},"types":{"type":"array","items":{"type":"string"},"description":"Tags such as 'benchmark'. Used internally to distinguish benchmarked specialists from general orchestrators."}},"required":["id","types"]},"ModelCatalogResponse":{"type":"object","description":"Authoritative public list of GeniusPro model slugs. Four-tier shape (experts / orchestrators / benchmarked / direct) so AI agents can see the product structure at a glance. Does not leak upstream provider/model mappings or pricing. User CATs (cat:slug) are per API key and not listed here.","properties":{"base_url":{"type":"string","example":"https://api.geniuspro.io"},"counts":{"type":"object","properties":{"experts":{"type":"integer"},"orchestrators":{"type":"integer"},"benchmarked":{"type":"integer"},"direct":{"type":"integer"},"total":{"type":"integer"}}},"experts":{"type":"array","description":"Professional-role simon-says-* orchestrators (finance, legal, PM, architecture, etc.). Same wire format as other Simon slugs; domain discipline + expert chassis where configured.","items":{"$ref":"#/components/schemas/CatalogModel"}},"orchestrators":{"type":"array","description":"Task-family simon-says-* slugs that auto-route across upstreams (chat, coding, reasoning, image, voice, etc.). Call one name; GeniusPro picks the best model per request.","items":{"$ref":"#/components/schemas/CatalogModel"}},"benchmarked":{"type":"array","description":"simon-says-* slugs selected per task from continuous benchmarks (math, logic, long-doc, terminal, legal, finance, etc.).","items":{"$ref":"#/components/schemas/CatalogModel"}},"direct":{"type":"array","description":"Raw-provider slugs exposed for callers who want a specific upstream (gpt-5.4, claude-opus-4-8, gemini-3.1-pro, grok-3, llama-4-*, etc.) plus vision (sam3) and image models.","items":{"$ref":"#/components/schemas/CatalogModel"}},"updated_at":{"type":"string","format":"date-time"},"note":{"type":"string"},"links":{"type":"object","properties":{"authoritative_api":{"type":"string"},"human_docs":{"type":"string"},"llms_txt":{"type":"string"},"openapi":{"type":"string"},"discovery":{"type":"string"}}}},"required":["base_url","counts","experts","orchestrators","benchmarked","direct"]},"ChatMessageContentPart":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["text"]},"text":{"type":"string"}},"required":["type","text"]},{"type":"object","properties":{"type":{"type":"string","enum":["image_url"]},"image_url":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"]}},"required":["type","image_url"]},{"type":"object","properties":{"type":{"type":"string","enum":["file"]},"file":{"type":"object","properties":{"file_id":{"type":"string"}},"required":["file_id"]}},"required":["type","file"]}]},"ChatMessage":{"type":"object","properties":{"role":{"type":"string","enum":["system","user","assistant","tool"]},"content":{"oneOf":[{"type":"string"},{"type":"array","items":{"$ref":"#/components/schemas/ChatMessageContentPart"}}]},"name":{"type":"string"},"tool_call_id":{"type":"string"}},"required":["role"]},"ChatCompletionRequest":{"type":"object","required":["model","messages"],"properties":{"model":{"type":"string","example":"simon-says"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/ChatMessage"}},"temperature":{"type":"number","minimum":0,"maximum":2},"top_p":{"type":"number","minimum":0,"maximum":1},"max_tokens":{"type":"integer","minimum":1},"stream":{"type":"boolean","default":false},"scrub_pii":{"type":"boolean","default":false,"description":"Opt-in edge PII scrubbing. When true (or when the X-GP-Scrub-Prompt: true header is set), GeniusPro masks emails, phone numbers, SSNs, credit cards, IP addresses, and API keys from messages[].content BEFORE dispatching the request to the upstream provider. OFF by default because many legitimate workflows (resume parsing, customer-email summarization) explicitly need PII to reach the model. PII is always scrubbed from GeniusPro's own logs and stored records regardless of this flag; see https://geniuspro.io/security."},"tools":{"type":"array","items":{"type":"object"}},"tool_choice":{"oneOf":[{"type":"string","enum":["auto","none","required"]},{"type":"object"}]}}},"ChatCompletionChoice":{"type":"object","properties":{"index":{"type":"integer"},"message":{"$ref":"#/components/schemas/ChatMessage"},"finish_reason":{"type":"string","enum":["stop","length","tool_calls","content_filter"]}}},"Usage":{"type":"object","properties":{"prompt_tokens":{"type":"integer"},"completion_tokens":{"type":"integer"},"total_tokens":{"type":"integer"}}},"ChatCompletionResponse":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","example":"chat.completion"},"created":{"type":"integer","format":"int64"},"model":{"type":"string"},"choices":{"type":"array","items":{"$ref":"#/components/schemas/ChatCompletionChoice"}},"usage":{"$ref":"#/components/schemas/Usage"}}},"EmbeddingRequest":{"type":"object","required":["model","input"],"properties":{"model":{"type":"string"},"input":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}}},"Embedding":{"type":"object","properties":{"object":{"type":"string","example":"embedding"},"index":{"type":"integer"},"embedding":{"type":"array","items":{"type":"number"}}}},"EmbeddingResponse":{"type":"object","properties":{"object":{"type":"string","example":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Embedding"}},"model":{"type":"string"},"usage":{"$ref":"#/components/schemas/Usage"}}},"FileCreateRequest":{"type":"object","required":["filename","mime_type"],"properties":{"filename":{"type":"string"},"mime_type":{"type":"string","enum":["application/pdf","image/png","image/jpeg","image/webp","image/gif","text/plain","text/csv","application/json","text/markdown"]},"purpose":{"type":"string","enum":["assistants","vision","fine-tune","user_upload"]}}},"FileCreateResponse":{"type":"object","properties":{"id":{"type":"string"},"upload_url":{"type":"string","format":"uri"},"expires_at":{"type":"integer","format":"int64"}}},"FileObject":{"type":"object","properties":{"id":{"type":"string"},"filename":{"type":"string"},"mime_type":{"type":"string"},"bytes":{"type":"integer"},"status":{"type":"string","enum":["pending","ready","error"]},"created_at":{"type":"integer","format":"int64"}}},"FileList":{"type":"object","properties":{"object":{"type":"string","example":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/FileObject"}}}},"AudioTranscriptionRequest":{"type":"object","required":["model","file"],"properties":{"model":{"type":"string","example":"simon-says-transcribe","description":"A speech-to-text model slug."},"file":{"type":"string","format":"binary","description":"Audio file to transcribe. Max 25 MiB."},"language":{"type":"string","description":"Optional ISO-639-1 input language hint."},"prompt":{"type":"string","description":"Optional text to bias decoding (style/spelling)."},"response_format":{"type":"string","enum":["json","text","srt","verbose_json","vtt"],"default":"json"},"temperature":{"type":"number","minimum":0,"maximum":1}}},"AudioTranscriptionResponse":{"type":"object","description":"Returned when response_format is json/verbose_json. For text/srt/vtt the body is the raw transcript string. Billed usage is also surfaced in the X-GeniusPro-Billed-Usd / X-GeniusPro-Input-Tokens / X-GeniusPro-Output-Tokens response headers.","properties":{"text":{"type":"string","description":"The transcribed text."}},"required":["text"]},"AudioSpeechRequest":{"type":"object","required":["model","input"],"properties":{"model":{"type":"string","example":"simon-says-tts","description":"A text-to-speech model slug."},"input":{"type":"string","description":"Text to synthesize. Max 4096 characters."},"voice":{"type":"string","enum":["alloy","ash","ballad","coral","echo","fable","onyx","nova","sage","shimmer","verse"],"default":"alloy"},"response_format":{"type":"string","enum":["mp3","opus","aac","flac","wav","pcm"],"default":"mp3"},"speed":{"type":"number","minimum":0.25,"maximum":4,"default":1},"instructions":{"type":"string","description":"Optional delivery/style guidance for the voice."}}},"RealtimeSessionRequest":{"type":"object","required":["model"],"properties":{"model":{"type":"string","example":"simon-says-voice","description":"A realtime voice model slug: simon-says-voice (standard) or simon-says-voice-quality (premium). Fetch GET /v1/models/catalog for the current list."},"voice":{"type":"string","nullable":true,"description":"Optional voice name. Must be one of the model's allowed voices or the mint returns 400. Omit to use the model default."},"instructions":{"type":"string","nullable":true,"description":"Optional system persona for the session. Max 2000 characters. Scrubbed of PII before storage and before reaching the upstream provider."}}},"RealtimeSessionResponse":{"type":"object","description":"A minted realtime voice session. Open `ws_url` with `Authorization: Bearer <token>` on server-side clients. Browsers: pass `Sec-WebSocket-Protocol: token.<token>` (appending `?token=` to the URL is deprecated). The token is single-use and expires at `expires_at` (~10 minutes).","properties":{"provider":{"type":"string","example":"openai","description":"Upstream realtime provider family (openai | google)."},"model":{"type":"string","example":"simon-says-voice","description":"The client model slug you requested."},"upstream_model":{"type":"string","description":"Operator-facing upstream model id (informational)."},"session_id":{"type":"string","example":"sess_…"},"token":{"type":"string","example":"rts_…","description":"Single-use ephemeral token. Server clients: `Authorization: Bearer <token>` on the WebSocket upgrade. Browsers: `Sec-WebSocket-Protocol: token.<token>`."},"value":{"type":"string","description":"Legacy alias for `token`; identical value."},"ws_url":{"type":"string","format":"uri","description":"Connect to THIS exact URL — do not hardcode a host. It already includes the model query param and targets the realtime voice proxy."},"expires_at":{"type":"string","format":"date-time"},"voice":{"type":"string","nullable":true},"language":{"type":"string","nullable":true,"description":"Resolved spoken-language preference (ISO-639-1) or null for auto-detect."},"request_id":{"type":"string","description":"Trace id, also returned in the x-request-id header. Quote it in support tickets."}},"required":["provider","model","session_id","token","ws_url","expires_at"]},"VideoGenerationRequest":{"type":"object","required":["model","prompt"],"properties":{"model":{"type":"string","example":"simon-says-video","description":"A video model slug: simon-says-video (fast) or simon-says-video-pro (highest quality). Fetch GET /v1/models/catalog for the current list."},"prompt":{"type":"string","description":"Text description of the video to generate."},"negative_prompt":{"type":"string","nullable":true,"description":"Optional description of what to avoid in the video."},"aspect_ratio":{"type":"string","enum":["16:9","9:16"],"default":"16:9"},"resolution":{"type":"string","enum":["720p","1080p","4k"],"default":"720p"},"seconds":{"type":"integer","enum":[4,6,8],"default":8,"description":"Output duration in seconds."},"image":{"type":"string","nullable":true,"description":"Optional reference image for image-to-video, as a data URL or raw base64 (image/png assumed)."}}},"VideoJob":{"type":"object","description":"An async video-generation job. Poll GET /v1/videos/{id} until `status` is `completed`, then download the MP4 from GET /v1/videos/{id}/content.","properties":{"id":{"type":"string","example":"550e8400-e29b-41d4-a716-446655440000"},"object":{"type":"string","example":"video"},"model":{"type":"string","example":"simon-says-video"},"status":{"type":"string","enum":["queued","in_progress","completed","failed"]},"created_at":{"type":"integer","description":"Unix seconds."},"completed_at":{"type":"integer","nullable":true,"description":"Unix seconds."},"seconds":{"type":"integer","nullable":true},"aspect_ratio":{"type":"string","nullable":true},"resolution":{"type":"string","nullable":true},"error":{"type":"object","nullable":true,"properties":{"message":{"type":"string"}}},"content_url":{"type":"string","description":"Relative path to download the MP4 (present when completed)."}},"required":["id","object","model","status"]}}}}