Skip to main content
AI Reserve serves the Inworld voice API at https://api.aireserve.com/inworld. An Inworld client whose base URL is repointed here — the @inworld/tts Node package, the inworld-tts Python package, the OpenAI SDK pointed at Inworld’s /v1/audio/speech, curl — keeps working after two settings change: the base URL and the key. The gateway authenticates your AI Reserve key, swaps it for AI Reserve’s Inworld credential, forwards the request exactly as you sent it, relays Inworld’s answer exactly as Inworld gave it, and books each successful request to your wallet at Inworld’s list price. Any AI Reserve API key works here; there is no separate credential and no organization setting to turn on.
This is a passthrough, not a translation. Request bodies, model ids (inworld-tts-2, inworld-tts-2-flash, inworld-stt-1), voice ids, audio configs, response shapes and Inworld’s own errors are all Inworld’s. The AI Reserve-native alternative — POST /v1/audio/speech with grok-tts or the eleven-* models — is documented under Text to speech.

What is served

Inworld’s voice stack. The gateway forwards any method and any path under /inworld/tts/, /inworld/stt/, /inworld/voices/, /inworld/pronunciations/, /inworld/lro/ and /inworld/v1/audio/ to api.inworld.ai exactly as you sent it. What Inworld does not serve, Inworld answers (404, 405, its own 4xx), and that answer is relayed to you unchanged. Operations the gateway has no list price for — stored-voice writes, async and batch synthesis, endpoints Inworld adds later — are still relayed and still appear in your Event Log, as a $0 row marked for repair. AI Reserve reconciles those against Inworld’s billing after the fact rather than refusing the call. Characters are counted the way Inworld counts them: the text as written, spaces, punctuation and tags included, with emoji and other characters outside the Basic Multilingual Plane counting twice. A modelId that is not inworld-tts-2 or inworld-tts-2-flash is forwarded as sent and billed at the inworld-tts-2 rate. Each successful call appears as its own line in Observe › Event Log and Financials (model inworld:inworld-tts-2, inworld:inworld-stt-1, …, with the metered characters or seconds and the rate in its details). Inworld does not bill requests that fail, and neither does AI Reserve: a 4xx or 5xx from Inworld is relayed and books nothing.

What is not served here

Inworld also resells text, image, video and decision models through its router (/v1/chat/completions, /v1/responses, /v1/videos, /alpha/decisions, …). Those paths answer 403 on this mount: AI Reserve serves the same models natively at https://api.aireserve.com/v1 with your AI Reserve key, with the platform’s own pricing and your organization’s model governance. The Inworld Realtime API (/v1/realtime/*, WebSocket and WebRTC) is not relayed, and Inworld’s one-time-token, usage and workspace endpoints are AI Reserve’s account data and answer 403.

What to change

Voice cloning and designed voices

Inworld’s instant voice cloning (POST /voices/v1/voices:clone with reference audio, returning a reusable voiceId), voice design (POST /voices/v1/voices:design for previews, then POST /voices/v1/voices/{id}:publish to keep one) and voice copy tokens (:issueCopyToken / :redeemCopyToken) work through AI Reserve exactly as on Inworld. Professional voice cloning (/voices/v1/pvcVoices) is relayed too, but a professionally cloned voice is registered to your organization by AI Reserve support once Inworld delivers it — until then it is not reachable through your key. Contact support when you start a professional clone. Stored voices are scoped to your organization. Every AI Reserve organization reaches Inworld through one AI Reserve workspace, so the gateway, not Inworld, keeps your voices yours: a voice cloned, published or redeemed with your key belongs to your organization; the voice lists show Inworld’s stock catalog plus only your organization’s voices; and every place a request names a stored voice — GET, HEAD, PATCH, DELETE /voices/v1/voices/{id}, :issueCopyToken, the preview’s voice_id, voiceId on sync, streaming and async synthesis, voice on /v1/audio/speech, and every item of a batch — accepts your own voices and the stock catalog. Another organization’s voice id answers Inworld’s own 404 (voice not found) — it does not exist as far as your key is concerned. Each synthesis endpoint reads the voice from one field (voiceId on the native endpoints, voice on /v1/audio/speech, items[].request.voiceId on a batch). A body that also carries the other field, or that is not a JSON object the gateway can read (send Content-Type: application/json), is refused with 400 before it is forwarded, so the voice the gateway checked is always the voice Inworld speaks with.

What AI Reserve enforces

Every refusal is a JSON { "code": <grpc code>, "message": "…", "details": [] } body, the shape Inworld’s own APIs use, and names its cause in message.
  • Your organization’s policies. The key is checked exactly as on every AI Reserve endpoint: paused keys (401), invalid keys (401, Invalid API key.), per-key IP allowlists and organization network policies (403), rate limits (429 with Retry-After), and — on every POST — your organization’s spend caps and wallet (402). An Inworld request is a wallet request: an exhausted budget refuses it before Inworld is called.
  • Your voices stay yours. A stored voice that belongs to another AI Reserve organization — named in the path of /voices/v1/voices/{id} or as the voiceId / voice of a synthesis — answers 404 voice not found, exactly as Inworld answers for a voice that does not exist. A voice in AI Reserve’s workspace that no organization has claimed is refused the same way. If the ownership check itself cannot run, the call is refused with 503 rather than forwarded unverified. A voice whose ownership could not be recorded at creation is removed from Inworld again and the create answers 503; retry it.
  • Metering, never filtering. The gateway reads the text / input, voiceId / voice and modelId / model of a synthesis body and the usage of a transcription answer to price and scope the call; it never changes, drops or validates what you sent. A body it cannot read is still forwarded and, if Inworld serves it, recorded at $0 marked for repair. The one answer the gateway edits is a voice list, where other organizations’ voices are removed.
  • Headers. Your Authorization and x-api-key are replaced by AI Reserve’s Inworld credential; Accept-Encoding is pinned to identity so Inworld’s bytes are the bytes relayed. Content types and your client’s user agent go through.
  • A request log. Each call is recorded with method, path, upstream status, byte counts, time-to-headers, duration, outcome, your key id, and the metered amount. Refusals are recorded with their outcome before any upstream request. Neither includes bodies, audio, or credentials.
  • Transport. Inworld unreachable → 503; no response headers within the time-to-headers bound → 504; a stream that has started is never cut by that bound.

Limits

  • Rate limits are Inworld’s account tiers, shared. Inworld limits requests and concurrency per account, not per key; AI Reserve’s account tier is shared across every organization using this endpoint, and a 429 from Inworld is relayed as Inworld sends it (a plain-text Rate limit exceeded, no Retry-After). Back off exponentially.
  • One Inworld workspace, Inworld’s data handling. Text, audio uploads and reference audio reach Inworld under AI Reserve’s workspace and Inworld’s terms. See the provider data-handling page.
  • HTTP only. The gateway relays HTTP requests. Inworld’s WebSocket endpoints (/v1/tts/synthesize:websocket, /stt/v1/transcribe:streamBidirectional) and the Realtime API are not upgraded through the gateway; POST /tts/v1/voice:stream streams its chunks as they are synthesized.