# auray-serverless/google/gemini-3-1-flash-tts `POST https://queue.auray.run/auray-serverless/google/gemini-3-1-flash-tts` submits; the response carries a `request_id` and the three URLs to use next. `POST https://auray.run/auray-serverless/google/gemini-3-1-flash-tts` is the same request run synchronously: the connection is held and the response is the model's OUTPUT, the same document the result URL would have answered. A request that usually takes longer than a run may hold its connection is refused `400 model_not_synchronous` there before anything is charged, naming `expected_seconds` and `wait_ceiling_seconds` — submit it to the queue instead. Past the deadline a run is `504 run_timed_out` with `X-Auray-Request-Timeout-Type: user` — the request is still alive, running and charged or, while it waits to start, not yet charged (`charged` says which) — so poll `status_url` rather than resending, or resend with the same `idempotency_key` to be handed this request again instead of a second one. A run holds one of the connections this platform, this product and your account may keep waiting; with all of them in use it is refused `429 wait_capacity` with `Retry-After` before anything is charged (`charged: false`), and retrying after that pause is safe. One of Auray's catalogue models, billed once in credits. Whether it runs right now is `GET /v1/catalogue`'s `addresses` (no key needed): `connected` runs; `described` answers `501 model_not_connected` and `paused` `503 model_disabled`, both before anything is charged. Price: Credits per character of text (counted as `spoken:speech.text`): 0.004. Each character of `speech.text` counts the time it takes to say: 1.1672 a letter of the Latin or Cyrillic script, a space or a pause mark; 1.7679 an Arabic or Hebrew letter; 3.4818 a kana; 4.8746 a Hangul syllable, a Greek letter or a letter of any other script; 24.3726 a Han character, seven kana; 16 a letter read by its name (alone, in a word with no vowel, or in a word in capitals of four letters or fewer or that no word could be said as, its plural or possessive s a letter); 20 a digit; 48 a symbol or an emoji; a combining mark none. From 70 to 97490.4 characters a request. Quoted when you submit, at the most the request can cost; the charge settles to what the job cost and never above the quote. Fields as published for this model. Every error code is explained at https://auray.ai/docs/api/errors. Address: auray-serverless/google/gemini-3-1-flash-tts Servers: https://queue.auray.run · https://auray.run Scope: audio:write Auth: Authorization: Bearer auray_sk_… API enabled: yes ## Input - seed (integer, optional) — Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range. Documented range: 0 to 2,147,483,647. - speech.text (string, required) — Text to convert to speech. For dialogue mode, use speaker tags such as [Sam] Hello [Bob] Hi there. Markup tags like [laughs] and [short pause] are also supported. Documented range: 1 to 4,000 characters. - speech.voice (string, optional, default: "Zephyr", one of: "Achernar", "Achird", "Algenib", "Algieba", "Alnilam", "Aoede", "Autonoe", "Callirrhoe", "Charon", "Despina", "Enceladus", "Erinome", "Fenrir", "Gacrux", "Iapetus", "Kore", "Laomedeia", "Leda", "Orus", "Puck", "Pulcherrima", "Rasalgethi", "Sadachbia", "Sadaltager", "Schedar", "Sulafat", "Umbriel", "Vindemiatrix", "Zephyr", "Zubenelgenubi") — Voice identifier to use for speech generation. - speech.voices[].speaker (string, optional) — Unique alphanumeric speaker alias. Must appear in the text as [Alias]. Documented range: 1 or more characters. - speech.voices[].voice (string, optional, default: "Zephyr", one of: "Achernar", "Achird", "Algenib", "Algieba", "Alnilam", "Aoede", "Autonoe", "Callirrhoe", "Charon", "Despina", "Enceladus", "Erinome", "Fenrir", "Gacrux", "Iapetus", "Kore", "Laomedeia", "Leda", "Orus", "Puck", "Pulcherrima", "Rasalgethi", "Sadachbia", "Sadaltager", "Schedar", "Sulafat", "Umbriel", "Vindemiatrix", "Zephyr", "Zubenelgenubi") — Voice identifier to use for speech generation. - speech.language (string, optional, default: "en-US", one of: "ar-EG", "bn-BD", "nl-NL", "en-IN", "en-US", "fr-FR", "de-DE", "hi-IN", "id-ID", "it-IT", "ja-JP", "ko-KR", "mr-IN", "pl-PL", "pt-BR", "ro-RO", "ru-RU", "es-ES", "ta-IN", "te-IN", "th-TH", "tr-TR", "uk-UA", "vi-VN", "af-ZA", "sq-AL", "am-ET", "ar-001", "hy-AM", "az-AZ", "eu-ES", "be-BY", "bg-BG", "my-MM", "ca-ES", "ceb-PH", "cmn-CN", "cmn-tw", "hr-HR", "cs-CZ", "da-DK", "en-AU", "en-GB", "et-EE", "fil-PH", "fi-FI", "fr-CA", "gl-ES", "ka-GE", "el-GR", "gu-IN", "ht-HT", "he-IL", "hu-HU", "is-IS", "jv-JV", "kn-IN", "kok-IN", "lo-LA", "la-VA", "lv-LV", "lt-LT", "lb-LU", "mk-MK", "mai-IN", "mg-MG", "ms-MY", "ml-IN", "mn-MN", "ne-NP", "nb-NO", "nn-NO", "or-IN", "ps-AF", "fa-IR", "pt-PT", "pa-IN", "sr-RS", "sd-IN", "si-LK", "sk-SK", "sl-SI", "es-419", "es-MX", "sw-KE", "sv-SE", "ur-PK") — Language code for speech generation. Documented range: 1 or more. - settings.temperature (number, optional, default: 1) — Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity. Documented range: 0 to 2. - outputType (string, optional, default: "URL", one of: "URL") — Audio output type. - outputFormat (string, optional, default: "MP3", one of: "MP3", "WAV", "FLAC", "OGG") — Specifies the file format of the generated output. The available values depend on the task type and the specific model's capabilities. - \`JPG\`: Best for photorealistic images with smaller file sizes (no transparency). - \`PNG\`: Lossless compression, supports high quality and transparency (alpha channel). - \`WEBP\`: Modern format providing superior compression and transparency support. - \`MP4\`: Widely supported video container (H.264), recommended for general use. - \`WEBM\`: Optimized for web delivery. - \`MOV\`: QuickTime format, common in professional workflows (Apple ecosystem). - \`GIF\`: Animated image format (no audio), suitable for short loops or previews. - \`MP3\`: Compressed audio, smaller file size. - \`WAV\`: Uncompressed, high-quality audio. - \`FLAC\`: Lossless compression. - \`OGG\`: Open-source compressed audio format (Vorbis codec). - \`SVG\`: Scalable Vector Graphics. - \`TIFF\`: High-quality output supporting layers. - \`GLB\`: Binary glTF format for 3D models, including geometry, textures, and PBR materials. > [!NOTE] > \*\*Transparency\*\*: If you are using features like background removal or LayerDiffuse that require transparency, you must select a format that supports an alpha channel (e.g., \`PNG\`, \`WEBP\`, \`TIFF\`). \`JPG\` does not support transparency. - audioSettings.bitrate (integer, optional) — Audio bitrate in kbps. Documented range: 8 or more. - audioSettings.channels (integer, optional, default: 2, one of: 1, 2) — Number of audio channels. 1 for mono, 2 for stereo. - audioSettings.sampleRate (integer, optional) — Audio sample rate in Hz. - idempotency_key (string, optional) — Your own name for this request. Send the same one twice and the second call is answered with the first request rather than charged again. `Idempotency-Key:` as a header is accepted as an alias — that is the spelling a retrying proxy replays, and the one to use when running a model on `auray.run`, where a request that outlives its connection is answered 504 and recovered by replay. Omit it and the platform mints one. ## Rules Across fields, as the model's documentation states them; judged before any charge, and warned (Deprecation) until enforcement starts. - When `outputFormat` is one of "WAV", "FLAC", do not send `audioSettings`. - When `outputFormat` is "MP3", `audioSettings.sampleRate` must be one of 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000. When `outputFormat` is "MP3", when `audioSettings.sampleRate` is one of 16000, 22050, 24000, `audioSettings.bitrate` must be between 8 and 160. When `outputFormat` is "MP3", when `audioSettings.sampleRate` is one of 32000, 44100, 48000, `audioSettings.bitrate` must be between 32 and 320. When `outputFormat` is "MP3", when `audioSettings.sampleRate` is one of 8000, 11025, 12000, `audioSettings.bitrate` must be between 8 and 64. - When `outputFormat` is "OGG", `audioSettings.sampleRate` must be one of 8000, 12000, 16000, 24000, 48000. When `outputFormat` is "OGG", when `audioSettings.sampleRate` is 8000 and `audioSettings.channels` is 2, `audioSettings.bitrate` must be between 16 and 80. When `outputFormat` is "OGG", when `audioSettings.sampleRate` is 12000 and `audioSettings.channels` is 1, `audioSettings.bitrate` must be between 16 and 48. When `outputFormat` is "OGG", when `audioSettings.sampleRate` is 12000 and `audioSettings.channels` is 2, `audioSettings.bitrate` must be between 16 and 96. When `outputFormat` is "OGG", when `audioSettings.sampleRate` is 16000 and `audioSettings.channels` is 1, `audioSettings.bitrate` must be between 16 and 96. When `outputFormat` is "OGG", when `audioSettings.sampleRate` is 16000 and `audioSettings.channels` is 2, `audioSettings.bitrate` must be between 24 and 192. When `outputFormat` is "OGG", when `audioSettings.sampleRate` is 24000 and `audioSettings.channels` is 1, `audioSettings.bitrate` must be between 16 and 80. When `outputFormat` is "OGG", when `audioSettings.sampleRate` is 24000 and `audioSettings.channels` is 2, `audioSettings.bitrate` must be between 32 and 160. When `outputFormat` is "OGG", when `audioSettings.sampleRate` is 48000 and `audioSettings.channels` is 1, `audioSettings.bitrate` must be between 32 and 224. When `outputFormat` is "OGG", when `audioSettings.sampleRate` is 48000 and `audioSettings.channels` is 2, `audioSettings.bitrate` must be between 48 and 256. When `outputFormat` is "OGG", when `audioSettings.sampleRate` is 8000 and `audioSettings.channels` is 1, `audioSettings.bitrate` must be between 8 and 40. - Do not send `speech.voice` together with `speech.voices`. - `speech.voices` must hold exactly 2 items. In every item of `speech.voices`: `speech.voices[].speaker` and `speech.voices[].voice` are required. ## Response A submit answers the status document (`status`: IN_QUEUE, IN_PROGRESS or COMPLETED; `request_id`; `queue_position` while queued; `logs`; `metrics`) and then, beside it: - product (string) — Which of this platform's products ran it. - provider_job_id (string) — The id the job runs under, once it has been handed to its model — possibly while still `queued`; null before. Quote it to support. - model (string) — The address that ran it, echoed back. - engine (string) — The service's own name for the model that ran, where it reports one — a catalogue model's is its `id` on GET /v1/models; null otherwise. What `model` carried before it carried the address. - attribution (string) — The credit line the model's licence requires you to show; null where none is required. - credits_charged (integer) — What this job cost. 0 on a replay, or when a pass or a promotion paid for it (`coverage` says which). - credits_quoted (integer) — What this job costs, in credits: the price it was quoted at submit. Equal to `credits_charged` once it has been charged; while it waits in the queue to start, `credits_charged` is 0 and this is what it will be charged when it starts (a cancel before then costs nothing) — and a replay of a job still waiting quotes the body that job was queued with, which is the one it runs, not the replay's. For a catalogue model it is the hold, and the settle may give part of it back — a settled read's `credits_charged` says what it finally cost. - coverage (object) — Present when a pass or a promotion paid for this job — `{"by": "pass", "pass": "seedance-2-5"}` or `{"by": "promotion"}`, and `credits_charged` is 0 — or when you hold a pass for this model that did not cover this job: `{"by": null, "miss": {"pass": "video", "why": "door"}}`, `why` being `door` (the pass does not work here) or `shape` (it does not cover this kind of job). Absent otherwise. Send `X-Auray-Covered-Only: 1` to run a job only if a pass or a promotion pays for it. - credits_remaining (integer) — The balance after it. - expected_seconds (integer) — A rough render time, for a progress bar; 0 where nothing is published. - give_up_after_seconds (integer) — The longest this job may take from its submit: the longest it may wait to start (your X-Auray-Request-Timeout, or the product's queue deadline) plus the longest it may run before it is stopped and refunded. Waiting longer is waiting for nothing; the official clients wait this long by default. For a catalogue model the part it may run is its own reap as its registry row states it (`lifecycle.stall_ceiling_seconds` on GET /v1/models); otherwise these are the published limits: we may lengthen them during an incident, never shorten them. - replayed (boolean) — `true` when your `idempotency_key` matched a job this platform already had. Nothing was charged and nothing was rendered twice. - waited (boolean) — Present when `wait` was asked for. The rest of this group comes with it. - timed_out (boolean) — The wait ran out before the job settled. Still a 2xx, never a 408 or 504 — a library that retries on those would resubmit and you would pay twice. Poll `status_url`. - wait_declined (string) — No seat was free to hold the connection with, so the request was answered at once. `platform_busy`: no product would have helped. `product_busy`: another product's queue might. `account_busy`: you are already waiting on every seat your plan's lanes allow. The job is running either way; poll it. - status_url (string) — Poll this. - response_url (string) — Fetch the result from this once the status is COMPLETED. - cancel_url (string) — `PUT` to this to ask for a cancellation. Poll `status_url`, fetch `response_url` once COMPLETED, `PUT` `cancel_url` to stop it. ## Price Price: Credits per character of text (counted as `spoken:speech.text`): 0.004. Each character of `speech.text` counts the time it takes to say: 1.1672 a letter of the Latin or Cyrillic script, a space or a pause mark; 1.7679 an Arabic or Hebrew letter; 3.4818 a kana; 4.8746 a Hangul syllable, a Greek letter or a letter of any other script; 24.3726 a Han character, seven kana; 16 a letter read by its name (alone, in a word with no vowel, or in a word in capitals of four letters or fewer or that no word could be said as, its plural or possessive s a letter); 20 a digit; 48 a symbol or an emoji; a combining mark none. From 70 to 97490.4 characters a request. Quoted when you submit, at the most the request can cost; the charge settles to what the job cost and never above the quote. ## Paths POST https://queue.auray.run/auray-serverless/google/gemini-3-1-flash-tts Run auray-serverless/google/gemini-3-1-flash-tts GET https://queue.auray.run/auray-serverless/google/gemini-3-1-flash-tts/requests/{request_id} The result GET https://queue.auray.run/auray-serverless/google/gemini-3-1-flash-tts/requests/{request_id}/status The status PUT https://queue.auray.run/auray-serverless/google/gemini-3-1-flash-tts/requests/{request_id}/cancel Ask for a cancellation ## Example ```bash curl -X POST https://queue.auray.run/auray-serverless/google/gemini-3-1-flash-tts \ -H 'Authorization: Bearer auray_sk_…' \ -H 'Content-Type: application/json' \ -d '{"speech":{"text":"a brass orrery on a walnut desk, morning light from a window to the left"}}' ``` ## Full contract https://api.auray.ai/v1/models/auray-serverless/google/gemini-3-1-flash-tts/openapi.json