Skip to main content
Four generators — images, videos, sound effects and music — 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, sound effect or song 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 platform’s default image model — with image_urls, the first that takes an image input; with character, one that pins it. image_urls edits or restyles images — stored fil_ ids or public URLs — instead of rendering from nothing. character renders as a trained character and is not combined with image_urls. n is 1–4, default 1; when some fail, the ones that rendered are still returned and billed. 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 optional: omitted, it is the first of the platform’s video defaults the catalogue publishes — minimax/hailuo-3, bytedance/seedance-2.5, then alibaba/wan-3.0/text-to-video. image_urls is one first frame — a stored still’s fil_ id (one rendered as a character, say) or a public URL. seconds is 1–60.

meshes.create

POST /v1/media/meshes — a 3D model, answered at once with the job (kind: "mesh") in queued. Read it back with get; a completed job’s result.files[0] is a GLB (model/gltf-binary). Priced for the options used, at completion; a failed job is free.

soundEffects.generate

POST /v1/media/sound-effects, synchronous — a text prompt to a short generated clip, saved as a file:
Turns a description into an effect (ambience, foley, a sting), so it takes no voice and no model. loop makes the clip loop seamlessly for backgrounds. The client sends the required Idempotency-Key for you.

music.generate

POST /v1/media/music, synchronous — a text prompt to an original song, saved as a file:
Turns a description into a song (any genre, mood or instrumentation), so it takes no voice and no model. instrumental forces a track with no vocals. The client sends the required Idempotency-Key for you.

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 Naive Managed Agents 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.