---
title: "Routed audio generation"
method: POST
path: "/v1/generate/audio"
tags: ["Model Router"]
---

# Routed audio generation

`POST /v1/generate/audio`

Start an audio generation task using a saved Model Router config instead of naming a model. Set input.type to speech to speak promptText verbatim, or audio to generate audio described by promptText.

## Headers

- `X-Runway-Version` '2024-11-06', required

## Request body

- object
  - `configId` string, required — The slug of a saved Model Router config to route this request with.
  - `input` object, required — Model-agnostic audio generation input. The router selects a model and maps these options to it.
    - `type` 'speech' | 'audio', required — How promptText is interpreted: `speech` speaks it verbatim as a script; `audio` treats it as a description of the desired audio, which may combine speech, music, ambience, and sound effects.
    - `promptText` string, required — For `speech`, the words to speak. For `audio`, a description of the desired output.
    - `voice` union — The voice to speak with. When omitted, models that support a default voice remain eligible.
      - object — A preset voice.
        - `type` 'preset', required
        - `presetId` 'Maya' | 'Arjun' | 'Serene' | 'Bernard' | 'Billy' | 'Mark' | 'Clint' | 'Mabel' | 'Chad' | 'Leslie' | 'Eleanor' | 'Elias' | 'Elliot' | 'Grungle' | 'Brodie' | 'Sandra' | 'Kirk' | 'Kylie' | 'Lara' | 'Lisa' | 'Malachi' | 'Marlene' | 'Martin' | 'Miriam' | 'Monster' | 'Paula' | 'Pip' | 'Rusty' | 'Ragnar' | 'Xylar' | 'Maggie' | 'Jack' | 'Katie' | 'Noah' | 'James' | 'Rina' | 'Ella' | 'Mariah' | 'Frank' | 'Claudia' | 'Niki' | 'Vincent' | 'Kendrick' | 'Myrna' | 'Tom' | 'Wanda' | 'Benjamin' | 'Kiana' | 'Rachel', required — A Runway preset voice id. Choosing a preset routes only to models that support preset voices.
      - object — Clone a voice from a reference audio clip, then speak promptText in that voice. Routes only to models that support voice cloning.
        - `type` 'reference-audio', required
        - `audioUri` union, required — A 1-30 second clip to clone the voice from.
          - string — A HTTPS URL, Runway upload URI, or base64 data URI (e.g. `data:audio/mp3;base64,...`, up to 16MB) containing an encoded audio. See [our docs](/assets/inputs#audio) on audio inputs for more information.
          - string — A Runway upload URI. See https://docs.dev.runwayml.com/assets/uploads for more information.
          - string — A data URI containing encoded media.
    - `referenceAudios` object[] — Optional reference audio clips guiding `audio` generation, for models that support them. Reference each clip in promptText as @Audio1, @Audio2, and @Audio3 in order.
      - `uri` union, required — A HTTPS URL, Runway or data URI containing an encoded audio. See [our docs](/assets/inputs#audio) on audio inputs for more information.
        - string — A HTTPS URL, Runway upload URI, or base64 data URI (e.g. `data:audio/mp3;base64,...`, up to 16MB) containing an encoded audio. See [our docs](/assets/inputs#audio) on audio inputs for more information.
        - string — A Runway upload URI. See https://docs.dev.runwayml.com/assets/uploads for more information.
        - string — A data URI containing encoded media.
    - `duration` number — Desired output duration in seconds for `audio` generation. Models that cannot honor an explicit duration are excluded.
    - `loop` boolean — When true, the `audio` output is designed to loop seamlessly. Models without loop support are excluded.

## Response `200`

The routing decision. Includes a task `id` for real requests; dry runs return the decision only.

- object
  - `id` string, uuid, required — The ID of the created task. Poll GET /v1/tasks/:id for the result.
  - `routing` object, required — Metadata describing which model the router selected and why.
    - `model` string, required — The public name of the model the router selected.
    - `provider` string, required — The provider of the selected model.
    - `configId` string, required — The slug of the router config that was applied to this request.
    - `resolvedSettings` object, required — The resolved config settings the router used for this request.
      - `optimizeFor` 'cost' | 'latency' | 'quality', required — The single optimization preference the config selected, used as the soft weighting when scoring eligible models.
      - `priceCeiling` number, nullable, required — The applied maximum credits per generation for this request's modality, or null if the config sets no ceiling.
    - `resolvedInput` object, required — Request-side defaults resolved for the routing response. Not necessarily identical to prepared model options.
      - `type` 'speech' | 'audio', required — The prompt mode the router routed for.
      - `voice` 'preset' | 'reference-audio' | 'default' | 'none', required — How the selected model resolves the voice: the requested preset or reference-audio clone, the model default for voiceless speech, or none for general audio.
    - `estimatedCost` object, required — Estimated cost, computed against current pricing.
      - `credits` number, required — Estimated cost of the generation in credits.
    - `capacityFallback` object — Present only when the config enables fallback.onCapacity and capacity affected this request.
      - `skipped` string[], required — Eligible models that were considered for this request but not selected because this account is at its concurrency limit for them.
      - `allExhausted` boolean, required — True when every eligible model was at its concurrency limit, so the best-ranked model was used and the task will queue.

## Other responses

- `400` — Error
- `404` — The referenced router config does not exist or is not accessible to this account.
- `429` — You have exceeded the rate limit for this endpoint.

## Changes

- **2026-08-24** `efc9e5abc4d0` — 4 breaking
  - added `subschema #1: RoutedAudioTaskCreated` to the response body `oneOf` list for the response status `200`
  - the response's body type/format changed from `object`/`` to ``/`` for status `200`
  - removed the required property `id` from the response with the `200` status
  - removed the required property `routing` from the response with the `200` status
- **2026-08-07** `cbbe796a13a0` — 1 breaking, 1 warning, 4 info
  - the response's body type/format changed from ``/`` to `object`/`` for status `200`
  - removed the request property `dryRun`
  - removed response discriminator for the response status `200`
  - removed `subschema #1: RoutedAudioTaskCreated, subschema #2: RoutedAudioDryRun` from the response body `oneOf` list for the response status `200`
  - …2 more
- **2026-08-07** `73a12c23285c` — 5 breaking, 6 info
  - added `subschema #1: RoutedAudioTaskCreated, subschema #2: RoutedAudioDryRun` to the response body `oneOf` list for the response status `200`
  - the response's body type/format changed from `object`/`` to ``/`` for status `200`
  - removed the required property `anyOf[subschema #1]/pipeline/items/remaining` from the response with the `400` status
  - removed the required property `id` from the response with the `200` status
  - …7 more
- …earlier changes not shown

[Full history](https://skmtc.dev/runwayml/apis/runwayml-api/changes/v1/generate/audio/post.md)

---

[API](https://skmtc.dev/runwayml/apis/runwayml-api.md) · [All operations](https://skmtc.dev/runwayml/apis/runwayml-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/runwayml/runwayml-api/revisions/efc9e5abc4d0/schema)
