Muvomi API
Every Muvomi studio tool, from your own code: generated video and motion graphics, talking avatars, pictures and designs, speech, voice cloning, dubbing, audio cleanup, transcription, background and object removal, and 3D models.
The base address is https://platform.muvomi.com/v1. Requests and answers are JSON (files are sent and fetched as they are). Work is paid with your Muvomi account's credits, the same as in the studio.
Quickstart
1. Sign in to the console and create a key under API keys. Keep it on your server.
2. Start work. Every operation answers at once with a job:
curl https://platform.muvomi.com/v1/images/generations \
-H "Authorization: Bearer $MUVOMI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": "A ceramic coffee cup on linen, soft morning light", "aspect_ratio": "4:5"}'
{ "id": "job_…", "object": "job", "operation": "image.generation", "status": "queued", … }3. Follow the job until it has ended (or add a webhook), then fetch what it made:
curl https://platform.muvomi.com/v1/jobs/job_… -H "Authorization: Bearer $MUVOMI_API_KEY"
{ "status": "succeeded", "output": { "files": ["file_…"] }, "credits": 5, … }
curl -o picture.png https://platform.muvomi.com/v1/files/file_…/content -H "Authorization: Bearer $MUVOMI_API_KEY"Authentication
Send your key in the Authorization header: Authorization: Bearer mvm_live_…. Keys are made and revoked in the console; each has:
- Scopes: what it may do.
video,design,voice,3dfor each studio's operations,filesfor uploads and downloads,accountfor the balance and usage. - A monthly credit limit, after which it is refused until the next month (UTC).
- Allowed addresses (IPs or CIDR ranges) it may be used from.
- An end date.
The API is for servers. It sends no CORS headers, so a web page can't call it: never put a key in a browser or an app people download.
Jobs
Every operation starts a job and answers 202 with it. A job is queued, running, then succeeded, failed or canceled.
{
"id": "job_8sKq…",
"object": "job",
"operation": "video.generation",
"status": "succeeded",
"progress": 1,
"output": { "files": ["file_…"] },
"error": null,
"credits": 25,
"created_at": "2026-11-15T10:00:00.000Z",
"finished_at": "2026-11-15T10:01:12.000Z"
}GET /v1/jobs/{id}: one job, as it is now. Ask every few seconds; a webhook is better.GET /v1/jobs?limit=20&status=succeeded&before=<created_at>: your jobs, newest first.POST /v1/jobs/{id}/cancel: stops a job whose operation can be stopped.
credits is what the job cost. A job that fails costs nothing: anything charged is given back.
Files
Pictures, videos and recordings you give an operation are uploaded first, and what operations make are files too. A file is file_ and 32 hex digits. Files you upload are also in your studio's Assets.
# Upload (up to 100 MB): the file itself as the body…
curl https://platform.muvomi.com/v1/files?name=interview.mp4 \
-H "Authorization: Bearer $MUVOMI_API_KEY" \
-H "Content-Type: video/mp4" --data-binary @interview.mp4
# …or as a form with a "file" field
curl https://platform.muvomi.com/v1/files -H "Authorization: Bearer $MUVOMI_API_KEY" -F file=@photo.jpg
{ "id": "file_…", "object": "file", "name": "photo.jpg", "kind": "image", "content_type": "image/png", "bytes": 482113, "width": 1600, "height": 2000, … }- Pictures: PNG, JPEG, WebP, GIF, HEIC (kept as PNG). Videos: MP4, WebM, up to 10 minutes and 4K. Recordings: WAV, MP3, M4A, OGG, FLAC, AAC (kept as WAV).
GET /v1/files/{id}: what it is.GET /v1/files/{id}/content: the file (ranges supported;?download=1to save it).DELETE /v1/files/{id}: deletes it, in the studio too.- On the Free plan, pictures and videos come with Muvomi's watermark, as in the studio. Bought credits remove it.
Webhooks
Add an HTTPS endpoint in the console and Muvomi POSTs to it when a job ends: job.succeeded, job.failed, job.canceled. The body is an event whose data is the job. Answer with any 2xx within 10 seconds; anything else is retried after 1 minute, 5 minutes, 30 minutes, 2, 6, 12 and 24 hours. An endpoint that fails 50 times in a row is turned off until you turn it on again.
Check every message: the Muvomi-Signature header is t=<unix seconds>,v1=<hex HMAC-SHA256> of <t>.<raw body>, with your endpoint's secret. Refuse messages older than five minutes.
// Node.js
import crypto from "node:crypto";
export function verified(rawBody, header, secret) {
const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
const age = Math.abs(Date.now() / 1000 - Number(parts.t));
const expected = crypto.createHmac("sha256", secret).update(`${parts.t}.${rawBody}`).digest("hex");
return age < 300 && parts.v1?.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(parts.v1), Buffer.from(expected));
}# Python
import hmac, hashlib, time
def verified(raw_body: bytes, header: str, secret: str) -> bool:
parts = dict(p.split("=", 1) for p in header.split(","))
expected = hmac.new(secret.encode(), f"{parts['t']}.".encode() + raw_body, hashlib.sha256).hexdigest()
return abs(time.time() - int(parts["t"])) < 300 and hmac.compare_digest(parts.get("v1", ""), expected)Errors
A refusal has a status and a body that says why. request_id is in the body and in the X-Request-Id header: give it when you ask for help.
{ "error": { "type": "insufficient_credits", "code": "insufficient_credits",
"message": "…", "credits_needed": 25, "credits_available": 10, "request_id": "req_…" } }| Status | type | What to do |
|---|---|---|
| 400 | invalid_request | Fix the request; message (and param) say what. |
| 401 | authentication | The key is missing, wrong, revoked or ended. |
| 402 | insufficient_credits | Add credits in the console. |
| 403 | permission | The key lacks the scope, the address isn't allowed, its monthly limit is spent, or the tool is paused. |
| 404 | not_found | No such endpoint, job or file in this account. |
| 409 | conflict | An Idempotency-Key used for another request, or a job that can't be canceled. |
| 429 | rate_limited | Wait Retry-After seconds. |
| 500, 503 | server_error, unavailable | Try again shortly. Nothing was charged. |
Rate limits
- 300 requests a minute for each key;
X-RateLimit-LimitandX-RateLimit-Remainingsay where you are. - 60 jobs started (and uploads) a minute, and 20 jobs running at once, for each account.
- Over a limit:
429withRetry-After.
Idempotency
Send an Idempotency-Key header (any unique text up to 255 characters, a UUID is ideal) with every POST that starts work. Sent again with the same body, the same job is answered and nothing runs or is charged twice; with another body, 409. Keys are remembered for the life of the job.
Security
- HTTPS only, with HSTS. Keys are kept as one-way hashes and shown once.
- Every change to your API access (keys, webhooks, sign-ins) is in the console's audit trail.
- The console has no password of its own: you sign in with your Muvomi account, two-step verification included.
- Webhooks go only to public HTTPS addresses, and are signed.
- Your files and work are your account's alone: no key reaches another account's.
Prices
In credits, the same as the studio's; also at GET /v1/prices. Credits are bought in the console under Credits.
| Operation | Price |
|---|---|
| Generate a video | muvomi-video, standard: first 5 seconds: 20 · muvomi-video, standard: 10 seconds: 25 · muvomi-video, high: first 5 seconds: 30 · muvomi-video-pro: first 5 seconds: 30 |
| Motion graphics | An animation: 60 · An animation following a reference video: 300 |
| Talking avatar video | A minute of speech: 600 · 15 seconds of speech: 150 |
| Remove a video's background | 10 seconds of video: 50 |
| Remove an object from a video | 5 seconds of video: 250 |
| Stabilise or reverse a video | A copy: 0 |
| Dub a video | A minute of video, into one language: 600 |
| Generate a picture | A picture: 5 |
| Edit a picture | An edit: 10 |
| Generate a design | A new design: 120 |
| Text to speech | A minute of speech started: 20 |
| Clean up audio | A clean: 10 · Noise removal on strong: 25 |
| Transcribe and caption | A recording, the first time: 10 |
| Clone your voice | An instant voice: 500 · A studio voice: 1,500 |
| Picture to 3D model | A textured model: 80 · A plain model: 50 |
Account, usage, voices and avatars
GET /v1/account(scopeaccount): your credits and plan.GET /v1/usage?days=30(account): jobs and credits by operation and by day.GET /v1/prices,GET /v1/operations: the price list and every operation with its input schema.GET /v1/voices(voice): the studio's voices and your own.DELETE /v1/voices/{id}removes one of your own.GET /v1/avatars,POST /v1/avatars,DELETE /v1/avatars/{id}(video): your avatars, for talking avatar videos. Making one takesname,image(a file id of a face picture, at least 256 pixels on its shorter side), an optionalvoice, andconsent: true: “This is my own face, or I have this person's permission to make videos of them speaking.”
Video Studio
Generate a video
A video clip from a description, optionally starting from one of your pictures. `muvomi-video` makes cinematic clips of 5 to 15 seconds; `muvomi-video-pro` makes 3 to 15 seconds at 720p.
Video Studio · scope video · can be canceled
| Field | Type | Notes |
|---|---|---|
| model (optional) | "muvomi-video" | "muvomi-video-pro" | Default "muvomi-video". |
| prompt | string | Up to 20,000 characters. |
| duration (optional) | integer | Default 5. 3 to 15. |
| aspect_ratio (optional) | "16:9" | "9:16" | "1:1" | "21:9" | "4:3" | "3:4" | Default "16:9". |
| quality (optional) | "standard" | "high" | Default "standard". |
| first_frame (optional) | file id | The first frame: a file id from POST /v1/files. |
| seed (optional) | integer | 0 to 2147483647. |
curl https://platform.muvomi.com/v1/videos/generations \
-H "Authorization: Bearer $MUVOMI_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"model": "muvomi-video",
"prompt": "A slow dolly shot through a sunlit greenhouse, dust in the light",
"duration": 5,
"aspect_ratio": "16:9"
}'When it succeeds, the job's output holds: files: The video (one file).
Price. By length and quality: the first 5 seconds, then each further block. Now: muvomi-video, standard: first 5 seconds: 20 credits, muvomi-video, standard: 10 seconds: 25 credits, muvomi-video, high: first 5 seconds: 30 credits, muvomi-video-pro: first 5 seconds: 30 credits.
Motion graphics
Designed motion graphics (titles, kinetic type, animated layouts) from a description, 3 to 120 seconds. Give a reference video to follow its timing and moves.
Video Studio · scope video · can be canceled
| Field | Type | Notes |
|---|---|---|
| prompt | string | Up to 20,000 characters. |
| duration (optional) | integer | Default 10. 3 to 120. |
| aspect_ratio (optional) | "16:9" | "9:16" | "1:1" | "4:5" | Default "16:9". |
| resolution (optional) | "720p" | "1080p" | Default "1080p". |
| reference_video (optional) | file id | The reference video: a file id from POST /v1/files. |
curl https://platform.muvomi.com/v1/videos/motion \
-H "Authorization: Bearer $MUVOMI_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"prompt": "A bold launch title for a coffee brand, warm colours, type that builds word by word",
"duration": 8
}'When it succeeds, the job's output holds: files: The animation (one MP4 file).
Price. Per animation; with a reference video it costs more. Now: An animation: 60 credits, An animation following a reference video: 300 credits.
Talking avatar video
One of your avatars (POST /v1/avatars) speaks: words read by a voice, or a recording of yours. Up to 5 minutes of speech; the video is as long as what is said.
Video Studio · scope video · can be canceled
| Field | Type | Notes |
|---|---|---|
| avatar | avatar id | |
| script (optional) | string | Up to 4,500 characters. |
| voice (optional) | string | Up to 60 characters. Who reads the script: a voice id from GET /v1/voices. Left out, a ready voice of the avatar's sex. |
| language (optional) | string | Up to 12 characters. The script's language code (en, es, hi…); found from the words when left out. |
| audio (optional) | file id | The recording: a file id from POST /v1/files. |
| style (optional) | "studio" | "presenter" | "walk" | "seated" | Default "studio". |
| direction (optional) | string | Up to 400 characters. |
| aspect_ratio (optional) | "16:9" | "9:16" | "1:1" | Default "9:16". |
curl https://platform.muvomi.com/v1/videos/avatar \
-H "Authorization: Bearer $MUVOMI_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"avatar": "avatar_…",
"script": "Hi! Here is what is new in our spring collection.",
"voice": "voice_…",
"style": "studio"
}'When it succeeds, the job's output holds: files: The video (one MP4 file).
Price. Per minute of speech, in 15-second blocks; words read by a chosen voice are also charged as speech. Now: A minute of speech: 600 credits, 15 seconds of speech: 150 credits.
Remove a video's background
Keeps the person (or the main object) and makes everything behind them transparent, as a new video. Up to 120 seconds at a time.
Video Studio · scope video · can be canceled
| Field | Type | Notes |
|---|---|---|
| file | file id | The video: a file id from POST /v1/files. |
| subject (optional) | "person" | "object" | Default "person". |
| start (optional) | number | 0 to 36000. |
| end (optional) | number | 0 to 36000. |
curl https://platform.muvomi.com/v1/videos/background-removal \
-H "Authorization: Bearer $MUVOMI_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"file": "file_…",
"subject": "person"
}'When it succeeds, the job's output holds: file: The video without its background (WebM with transparency).
Price. Per 10 seconds of video. Now: 10 seconds of video: 50 credits.
Remove an object from a video
Takes something out of a video and fills in what was behind it: say what it is, or where it is (shares of the width and height, from the top left). Up to 20 seconds at a time.
Video Studio · scope video · can be canceled
| Field | Type | Notes |
|---|---|---|
| file | file id | The video: a file id from POST /v1/files. |
| what (optional) | string | Up to 80 characters. |
| points (optional) | array of object | |
| at (optional) | number | 0 to 36000. |
| start (optional) | number | 0 to 36000. |
| end (optional) | number | 0 to 36000. |
curl https://platform.muvomi.com/v1/videos/object-removal \
-H "Authorization: Bearer $MUVOMI_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"file": "file_…",
"what": "the microphone",
"start": 0,
"end": 8
}'When it succeeds, the job's output holds: file: The video without it.
Price. Per 5 seconds of video. Now: 5 seconds of video: 250 credits.
Stabilise or reverse a video
A steadier copy of a shaky video, or the video played backwards.
Video Studio · scope video · can be canceled
| Field | Type | Notes |
|---|---|---|
| file | file id | The video: a file id from POST /v1/files. |
| action (optional) | "stabilize" | "reverse" | Default "stabilize". |
| start (optional) | number | 0 to 36000. |
| end (optional) | number | 0 to 36000. |
curl https://platform.muvomi.com/v1/videos/stabilize \
-H "Authorization: Bearer $MUVOMI_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"file": "file_…",
"action": "stabilize"
}'When it succeeds, the job's output holds: file: The new video.
Price. Free. Now: A copy: 0 credits.
Dub a video
The video's speech in another language, in the speakers' own voices. Languages are codes such as `es`, `hi`, `fr`; `from` may be `auto`. You confirm you have the rights.
Video Studio · scope video · can be canceled
| Field | Type | Notes |
|---|---|---|
| file | file id | The video: a file id from POST /v1/files. |
| to | string | The language to dub into, as a code: es, hi, fr, de, pt, ja… |
| from (optional) | string | Default "auto". |
| rights | true |
curl https://platform.muvomi.com/v1/videos/dubbing \
-H "Authorization: Bearer $MUVOMI_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"file": "file_…",
"to": "es",
"from": "auto",
"rights": true
}'When it succeeds, the job's output holds: video: The dubbed video.; audio: Its new soundtrack.
Price. Per minute of video, per language. Now: A minute of video, into one language: 600 credits.
Design Studio
Generate a picture
A picture from a description, optionally guided by up to 10 of your pictures.
Design Studio · scope design · can be canceled
| Field | Type | Notes |
|---|---|---|
| prompt | string | Up to 20,000 characters. |
| aspect_ratio (optional) | one of 14 codes, such as "16:9", "9:16", "1:1", "4:5" | Default "1:1". |
| size (optional) | "1K" | "1.5K" | "2K" | Default "1K". |
| references (optional) | array of file id |
curl https://platform.muvomi.com/v1/images/generations \
-H "Authorization: Bearer $MUVOMI_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"prompt": "A ceramic coffee cup on a linen tablecloth, soft morning light, product photo",
"aspect_ratio": "4:5",
"size": "2K"
}'When it succeeds, the job's output holds: files: The picture (one PNG file).
Price. Per picture. Now: A picture: 5 credits.
Edit a picture
Changes a picture as the words say: take something out, change the background, restyle it. Up to 8 pictures may be given; the first is the one edited.
Design Studio · scope design · can be canceled
| Field | Type | Notes |
|---|---|---|
| prompt | string | Up to 20,000 characters. |
| images | array of file id | |
| aspect_ratio (optional) | one of 14 codes, such as "16:9", "9:16", "1:1", "4:5" | Default "auto". |
| size (optional) | "1K" | "1.5K" | "2K" | Default "1K". |
curl https://platform.muvomi.com/v1/images/edits \
-H "Authorization: Bearer $MUVOMI_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"prompt": "Replace the background with a clean white studio sweep",
"images": [
"file_…"
]
}'When it succeeds, the job's output holds: files: The edited picture (one PNG file).
Price. Per edit. Now: An edit: 10 credits.
Generate a design
A finished design (a poster, a post, a flyer, a thumbnail, a screen) from a description, at the size you give. Name a website in the words and it is read for its words, colours and logo. The design is kept in your Design Studio too.
Design Studio · scope design
| Field | Type | Notes |
|---|---|---|
| prompt | string | Up to 2,000 characters. |
| width (optional) | integer | Default 1080. 64 to 4096. |
| height (optional) | integer | Default 1350. 64 to 4096. |
| references (optional) | array of file id | |
| scale (optional) | value | Default 1. |
curl https://platform.muvomi.com/v1/designs \
-H "Authorization: Bearer $MUVOMI_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"prompt": "Grand opening poster for a Lebanese bakery, Saturday 10am, warm and hand-made",
"width": 1080,
"height": 1350
}'When it succeeds, the job's output holds: image: The design as a PNG (a file).; design: Its id in the Design Studio.; reply: What the designer did, in a sentence or two.
Price. Per new design; pictures it makes for it are charged as pictures. Now: A new design: 120 credits.
Voice Studio
Text to speech
Words read aloud by a studio voice or one of your own, as a WAV recording.
Voice Studio · scope voice · can be canceled
| Field | Type | Notes |
|---|---|---|
| text | string | Up to 1,200 characters. |
| voice | string | Up to 60 characters. A voice id from GET /v1/voices: a studio voice or one of your own. |
| language (optional) | one of 85 codes, such as "auto", "en", "zh", "ja" | The language the words are in, as a code (en, es, hi…); left out or auto, it is found from the words. |
curl https://platform.muvomi.com/v1/audio/speech \
-H "Authorization: Bearer $MUVOMI_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"text": "Welcome to Muvomi. Make something people remember.",
"voice": "voice_…"
}'When it succeeds, the job's output holds: audio: The recording (a file).; seconds: How long it runs.; language: The language it was read in.
Price. Per minute of speech started. The same words in the same voice asked again cost nothing. Now: A minute of speech started: 20 credits.
Clean up audio
Removes noise, hum or echo, levels the voice, or gives it a studio sound. Takes a recording or a video; makes a new file, the original is kept.
Voice Studio · scope voice · can be canceled
| Field | Type | Notes |
|---|---|---|
| file | file id | The recording or video: a file id from POST /v1/files. |
| tool | "noise_removal" | "studio_sound" | "full_cleanup" | "level" | "hum_removal" | "echo_removal" | |
| strength (optional) | "light" | "balanced" | "strong" |
curl https://platform.muvomi.com/v1/audio/clean \
-H "Authorization: Bearer $MUVOMI_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"file": "file_…",
"tool": "noise_removal",
"strength": "strong"
}'When it succeeds, the job's output holds: file: The cleaned recording or video.
Price. Per clean; noise removal on strong costs more. A clean asked again of the same file costs nothing. Now: A clean: 10 credits, Noise removal on strong: 25 credits.
Transcribe and caption
What is said in a recording or video, word by word with times, as text and as SRT and WebVTT captions.
Voice Studio · scope voice · can be canceled
| Field | Type | Notes |
|---|---|---|
| file | file id | The recording or video: a file id from POST /v1/files. |
| speakers (optional) | boolean |
curl https://platform.muvomi.com/v1/audio/transcriptions \
-H "Authorization: Bearer $MUVOMI_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"file": "file_…"
}'When it succeeds, the job's output holds: text: Everything said.; words: Each word with its start and end, in seconds.; srt: Captions as SRT (a file).; vtt: Captions as WebVTT (a file).
Price. Per recording, the first time it is listened to; asked again, it costs nothing. Now: A recording, the first time: 10 credits.
Clone your voice
A voice of your own from a clear recording of you speaking (at least 30 seconds), usable wherever a voice is asked for. Only your own voice may be cloned through the API.
Voice Studio · scope voice · can be canceled
| Field | Type | Notes |
|---|---|---|
| file | file id | The recording: a file id from POST /v1/files. |
| name | string | Up to 40 characters. |
| tier (optional) | "instant" | "studio" | Default "instant". |
| language (optional) | one of 85 codes, such as "auto", "en", "zh", "ja" | The language the words are in, as a code (en, es, hi…); left out or auto, it is found from the words. |
| consent | true |
curl https://platform.muvomi.com/v1/voices \
-H "Authorization: Bearer $MUVOMI_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"file": "file_…",
"name": "My voice",
"tier": "instant",
"consent": true
}'When it succeeds, the job's output holds: voice: The new voice's id (use it as `voice`).; name: Its name.; state: ready, or making while it is finished.
Price. Per voice: instant or studio quality. Now: An instant voice: 500 credits, A studio voice: 1,500 credits.
3D Studio
Picture to 3D model
A textured 3D model (GLB) from one picture of an object, at least 256 pixels on its shorter side. Without texture it is a plain shape, for less.
3D Studio · scope 3d · can be canceled
| Field | Type | Notes |
|---|---|---|
| image | file id | The picture: a file id from POST /v1/files. |
| texture (optional) | boolean | Default true. |
curl https://platform.muvomi.com/v1/3d/models \
-H "Authorization: Bearer $MUVOMI_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"image": "file_…",
"texture": true
}'When it succeeds, the job's output holds: model: The 3D model (GLB file).; preview: A picture of it (PNG file).
Price. Per model: textured or plain. Now: A textured model: 80 credits, A plain model: 50 credits.