Skip to main content
Two generators, a catalogue, and — further down — stock, a free search over a licensed photo library, clips, the video-clipping job, and audio, transcription, speech and speech-to-speech. An image renders in one call and comes back as files; a video is a media job you read back until it finishes. The catalogue belongs to the provider and changes without a release of ours, so it is a search, not a constant.

images.generate

POST /v1/media/images, synchronous. Every output is a file:
model left out picks the cheapest image model in the catalogue. image_urls edits or restyles public images instead of rendering from nothing. n is 1–4, default 1. The client sends the required Idempotency-Key for you.

videos.generate

POST /v1/media/videos — answers at once with the job in queued. model is required: video models publish no price, so there is no default to pick. seconds is 1–60.

get

GET /v1/media/{id}. Any med_ of yours, a clipping job’s included. Poll until status is completed or failed; a completed video job’s result.files[].file_id is the rendered video, a completed clipping job’s result.clips are its clips (see clips.get).

list

GET /v1/media, newest first. session_id narrows to what one session’s agent submitted; API-submitted jobs carry session_id: null.

listModels

GET /v1/media/models. kind is required: each is its own capability with its own catalogue. stt, tts and s2s are the audio models — the managed alias for the direction first, then pinned models. Each entry:
string
The model id you pass as model above, or to generate_image / generate_video, or pin on an agent as tools.configs.<tool>.config.models.
string
The model’s display name.
"image" | "video" | "stt" | "tts" | "s2s"
Which capability it serves.
string
What the model is good at.
No price is on the object. A generation is billed what it actually cost, once it has finished — see Pricing.
GET /v1/media/stock. Not a cursor page: the library pages by number, and count is the whole page. Each StockPhoto:
string
The library’s own id. Opaque, unprefixed, not a Vetta resource.
number
Pixel width of the original.
number
Pixel height of the original.
string
A direct image URL at the requested size.
string
A small thumbnail.
string | null
A one-line description of the photo.
string | null
Who took it — show this credit wherever the photo is used.
string | null
The page to link the credit to.
string | null
The average colour as a hex value.
A result is a URL, not a file; to hold the bytes as a fil_, import url through client.files. The search is free and is booked as a search line at $0. A deploy with no stock photo library configured rejects with feature_not_configured.

clips.create

POST /v1/media/clips. Submits a clipping job and returns it queued; the clips arrive as files when it completes. ClipCreate is the request body: video_url (public http(s) only), and optional aspect_ratio, remove_silence, caption_preset (none | clean | bold | karaoke), language, min_seconds, max_seconds, title. An Idempotency-Key is sent for you, so a retry replays rather than re-queues.

clips.get

GET /v1/media/clips/{id}. The job as it stands; once status is completed, result.clips holds each clip’s file_id, title, start_seconds, end_seconds, duration_seconds and virality scores, and cost_micro_usd is what it cost.
Subscribe a webhook to media.job.completed / media.job.failed to be told instead of polling.

clips.list

GET /v1/media/clips. Newest first. Only jobs submitted through the API are listed; what an agent’s clip_video tool cuts inside a session lands in that session as files.

audio.transcribe

POST /v1/media/audio/transcriptions. Answers a media_job of kind: "transcription" — usually already completed, with result.text and result.segments filled in; a long recording the provider queues comes back processing, to be re-read with audio.get.

audio.get

GET /v1/media/audio/transcriptions/{id} — the same job, re-read.

audio.speak

POST /v1/media/audio/speech. Synchronous; the reply’s file is the stored file, so the bytes are one client.files.download(speech.file.id) away.

audio.converse

POST /v1/media/audio/conversations. Synchronous, and the same SpeechGeneration as speak: the spoken reply to the turn in file_id, stored as a file. The input is a stored file — client.files.upload or client.files.import a recording first.