> ## Documentation Index
> Fetch the complete documentation index at: https://vetta.sh/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Media

> Images, video, clips, audio and stock photos — the media routes, the catalogue of models they accept, and the library every result lands in.

Media is one catalogue, one library and six routes, shared by the REST API and an agent's tools:

| | Route | Answers |
| - | - | - |
| [Images](https://vetta.sh/docs/api/images.md) | `POST /v1/media/images` | Synchronous — the finished [files](https://vetta.sh/docs/api/files.md), in one call. |
| [Stock photos](https://vetta.sh/docs/api/images.md#stock-photos) | `GET /v1/media/stock` | Licensed photos by description; import one as a file with `POST /v1/files/imports`. |
| [Video](https://vetta.sh/docs/api/video.md) | `POST /v1/media/videos` | A `202` **media job** you read back with `GET /v1/media/{id}` and list with `GET /v1/media`. |
| [Characters](https://vetta.sh/docs/api/characters.md) | `POST /v1/characters` | A `202` **character** in `training` — a reusable persona an image renders as, with `character` on `POST /v1/media/images`. |
| [Clips](https://vetta.sh/docs/api/clips.md) | `POST /v1/media/clips` | A `202` clip job — scored, captioned short clips cut from a long video. |
| [Mira](https://vetta.sh/docs/capabilities/tools.md#editing-a-clip-edit_video-mira) | `POST /v1/media/edits` | A `202` edit job — a short clip changed from a prompt. Read it with `GET /v1/media/edits/{id}`. |
| [Audio](https://vetta.sh/docs/api/audio.md) | `POST /v1/media/audio/transcriptions` · `POST /v1/media/audio/speech` · `POST /v1/media/audio/conversations` | Transcription as a media job; speech and a spoken reply as finished files. |
| Models | `GET /v1/media/models` | The catalogue below — which `model` each route accepts. |
| [Library](https://vetta.sh/docs/api/files.md) | `GET /v1/files` | Every result lands in [Files](https://vetta.sh/docs/api/files.md) with its `source` — filter by `kind`, `source`, `tag` or `search`. |

> [!NOTE]
>
> There is **no fixed list of generation models**. The catalogue is read from the provider on every call, so a model published today is callable today. Search it here; pass what you find as `model` to [`POST /v1/media/images`](https://vetta.sh/docs/api/images) / [`POST /v1/media/videos`](https://vetta.sh/docs/api/video) or to [`generate_image` / `generate_video`](https://vetta.sh/docs/capabilities/tools#generation-tools), or pin it on an agent with `tools.configs.<tool>.config.models`.

## The media model object

**object** `string`

Always `media_model`.

**id** `string`

The model's id. This is what `model` takes, on the generation routes and on the tools.

**name** `string`

The model's display name.

**kind** `string`

`image` · `video` · `mesh` · `stt` · `tts` · `s2s`. The three audio kinds are [the audio catalogues](https://vetta.sh/docs/api/audio.md#the-catalogues).

**description** `string`

What the model is good at, in the model author's own words.

**prices** `object[]`

Mesh models only. One entry per option the model offers: `texture` (boolean), `rig` (boolean), and `micro_usd` (integer, what that combination costs). Image, video and audio rows omit it.

Image, video and audio rows publish no price, for the same reason [`GET /v1/models`](https://vetta.sh/docs/api/models) publishes none: those jobs are billed **what they actually cost**, and that is only knowable once the job has finished. A mesh row publishes `prices`, because that job's price is fixed by the model and its `texture` and `rig` switches. See [Pricing](https://vetta.sh/docs/platform/pricing.md#3d-assets).

## Search models

`GET /v1/media/models` — scope `agents:read`

**kind** `string` *required*

`image` · `video` · `mesh` · `stt` · `tts` · `s2s`. Required: each is its own capability with its own catalogue — the audio ones are described on [Audio](https://vetta.sh/docs/api/audio.md#the-catalogues).

**search** `string`

Matches a model's id, name or description. Omit it to list them all.

**limit** `number`

Page size, 1–100.

**after** `string`

The `next_cursor` of the previous page. Opaque — it is not a row id.

```bash cURL theme={"system"}
curl -fsSL "https://api.vetta.sh/v1/media/models?kind=video&search=seedance" \
  -H "authorization: Bearer sk_live_..."
```

```json Response theme={"system"}
{
  "object": "list",
  "data": [
    {
      "object": "media_model",
      "id": "bytedance/seedance-2.5",
      "name": "Seedance 2.5",
      "kind": "video",
      "description": "A text- and image-to-video model for short cinematic clips.",
    }
  ],
  "has_more": false,
  "next_cursor": null
}
```

Ordering is the platform's own models first, then the rest; within each, cheapest-first where a per-output price is published. That is why an image request can leave `model` out: it runs the first entry that takes what it carries. A video request can leave it out too: it runs the first of the platform's video defaults the catalogue publishes — `black-forest-labs/flux-3-max`, `minimax/hailuo-3`, `bytedance/seedance-2.5`, then `alibaba/wan-3.0/text-to-video` (for an edit, only one the catalogue says takes a video; the platform's per-second video models take a first frame, not a clip to edit); otherwise name one. Every model listed is callable by its id, whichever backend renders it.

A deploy with no generation provider configured answers `501 feature_not_configured` rather than an empty list — "nothing is configured here" and "the provider has no models" are different facts.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.