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 (429withRetry-After), and — on everyPOST— 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 thevoiceId/voiceof a synthesis — answers404voice 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 with503rather than forwarded unverified. A voice whose ownership could not be recorded at creation is removed from Inworld again and the create answers503; retry it. - Metering, never filtering. The gateway reads the
text/input,voiceId/voiceandmodelId/modelof a synthesis body and theusageof 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$0marked for repair. The one answer the gateway edits is a voice list, where other organizations’ voices are removed. - Headers. Your
Authorizationandx-api-keyare replaced by AI Reserve’s Inworld credential;Accept-Encodingis pinned toidentityso 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
429from Inworld is relayed as Inworld sends it (a plain-textRate limit exceeded, noRetry-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:streamstreams its chunks as they are synthesized.