Muvomi PlatformAPI and console
Console

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, 3d for each studio's operations, files for uploads and downloads, account for 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=1 to 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_…" } }
StatustypeWhat to do
400invalid_requestFix the request; message (and param) say what.
401authenticationThe key is missing, wrong, revoked or ended.
402insufficient_creditsAdd credits in the console.
403permissionThe key lacks the scope, the address isn't allowed, its monthly limit is spent, or the tool is paused.
404not_foundNo such endpoint, job or file in this account.
409conflictAn Idempotency-Key used for another request, or a job that can't be canceled.
429rate_limitedWait Retry-After seconds.
500, 503server_error, unavailableTry again shortly. Nothing was charged.

Rate limits

  • 300 requests a minute for each key; X-RateLimit-Limit and X-RateLimit-Remaining say where you are.
  • 60 jobs started (and uploads) a minute, and 20 jobs running at once, for each account.
  • Over a limit: 429 with Retry-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.

OperationPrice
Generate a videomuvomi-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 graphicsAn animation: 60 · An animation following a reference video: 300
Talking avatar videoA minute of speech: 600 · 15 seconds of speech: 150
Remove a video's background10 seconds of video: 50
Remove an object from a video5 seconds of video: 250
Stabilise or reverse a videoA copy: 0
Dub a videoA minute of video, into one language: 600
Generate a pictureA picture: 5
Edit a pictureAn edit: 10
Generate a designA new design: 120
Text to speechA minute of speech started: 20
Clean up audioA clean: 10 · Noise removal on strong: 25
Transcribe and captionA recording, the first time: 10
Clone your voiceAn instant voice: 500 · A studio voice: 1,500
Picture to 3D modelA textured model: 80 · A plain model: 50

Account, usage, voices and avatars

  • GET /v1/account (scope account): 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 takes name, image (a file id of a face picture, at least 256 pixels on its shorter side), an optional voice, and consent: true: “This is my own face, or I have this person's permission to make videos of them speaking.”

Video Studio

Generate a video

POST/v1/videos/generations

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

FieldTypeNotes
model (optional)"muvomi-video" | "muvomi-video-pro"Default "muvomi-video".
promptstringUp to 20,000 characters.
duration (optional)integerDefault 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 idThe first frame: a file id from POST /v1/files.
seed (optional)integer0 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

POST/v1/videos/motion

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

FieldTypeNotes
promptstringUp to 20,000 characters.
duration (optional)integerDefault 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 idThe 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

POST/v1/videos/avatar

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

FieldTypeNotes
avataravatar id
script (optional)stringUp to 4,500 characters.
voice (optional)stringUp 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)stringUp to 12 characters. The script's language code (en, es, hi…); found from the words when left out.
audio (optional)file idThe recording: a file id from POST /v1/files.
style (optional)"studio" | "presenter" | "walk" | "seated"Default "studio".
direction (optional)stringUp 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

POST/v1/videos/background-removal

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

FieldTypeNotes
filefile idThe video: a file id from POST /v1/files.
subject (optional)"person" | "object"Default "person".
start (optional)number0 to 36000.
end (optional)number0 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

POST/v1/videos/object-removal

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

FieldTypeNotes
filefile idThe video: a file id from POST /v1/files.
what (optional)stringUp to 80 characters.
points (optional)array of object
at (optional)number0 to 36000.
start (optional)number0 to 36000.
end (optional)number0 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

POST/v1/videos/stabilize

A steadier copy of a shaky video, or the video played backwards.

Video Studio · scope video · can be canceled

FieldTypeNotes
filefile idThe video: a file id from POST /v1/files.
action (optional)"stabilize" | "reverse"Default "stabilize".
start (optional)number0 to 36000.
end (optional)number0 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

POST/v1/videos/dubbing

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

FieldTypeNotes
filefile idThe video: a file id from POST /v1/files.
tostringThe language to dub into, as a code: es, hi, fr, de, pt, ja…
from (optional)stringDefault "auto".
rightstrue
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

POST/v1/images/generations

A picture from a description, optionally guided by up to 10 of your pictures.

Design Studio · scope design · can be canceled

FieldTypeNotes
promptstringUp 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

POST/v1/images/edits

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

FieldTypeNotes
promptstringUp to 20,000 characters.
imagesarray 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

POST/v1/designs

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

FieldTypeNotes
promptstringUp to 2,000 characters.
width (optional)integerDefault 1080. 64 to 4096.
height (optional)integerDefault 1350. 64 to 4096.
references (optional)array of file id
scale (optional)valueDefault 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

POST/v1/audio/speech

Words read aloud by a studio voice or one of your own, as a WAV recording.

Voice Studio · scope voice · can be canceled

FieldTypeNotes
textstringUp to 1,200 characters.
voicestringUp 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

POST/v1/audio/clean

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

FieldTypeNotes
filefile idThe 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

POST/v1/audio/transcriptions

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

FieldTypeNotes
filefile idThe 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

POST/v1/voices

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

FieldTypeNotes
filefile idThe recording: a file id from POST /v1/files.
namestringUp 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.
consenttrue
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

POST/v1/3d/models

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

FieldTypeNotes
imagefile idThe picture: a file id from POST /v1/files.
texture (optional)booleanDefault 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.