Muse Video is the video model from Meta Superintelligence Labs. On APIMODELS it is one model id, muse-video, on the unified video endpoint: send a prompt for text-to-video; add one first-frame image and the clip starts from that picture; or add up to four reference images and the model keeps the person or subject from them without starting from them. Clips run 4 to 30 seconds at 720p, 16:9 (1280×720) or 9:16 (720×1280), as H.264 MP4 at 24 fps. Unsupported lengths, sizes and inputs are rejected with a 400 before a task is created; not every request succeeds, and failed generations are not charged. Billed at $0.037 per requested second.
Everything Muse Video accepts and everything it does not, in one table. Check it before you build on the model: 720p only, landscape or portrait only, and either one first frame or up to four reference images.
| Item | Supported | Not supported |
|---|---|---|
| Resolution | 720p only (resolution: "720p", or leave it out) | 1080p, 2K, 4K, 480p |
| Aspect ratio | 16:9 landscape at 1280×720 (default) or 9:16 portrait at 720×1280 | Square 1:1, 4:3, 3:4, 21:9 and any other ratio or size |
| Length | 4 to 30 whole seconds; 5, 6, 8, 10, 15, 20, 25 and 30 s come out exact, other lengths round up to the next step | Under 4 s, over 30 s, fractions such as 8.5 |
| Images | Either 1 first frame, or up to 4 reference images that keep the same person or subject (not both); PNG, JPEG or WebP, up to 20 MB each, as a public URL or base64 | A first frame together with reference images, more than 4 reference images, a last frame |
| Video and audio input | None: images are the only media input | Reference video, video editing or extension, audio input, lip sync to your own audio |
| Sound | Generated by the model together with the picture; generate_audio: true is accepted | Turning sound off (generate_audio: false returns a 400); sound is not guaranteed on every clip |
| Other controls | A prompt of up to 4,000 characters in any language; describe camera moves in the prompt | negative_prompt, seed (results are not repeatable), camera-control parameters |
Unsupported values and fields return a 400 before a task is created and cost nothing; the exact messages are listed under Errors below.
Muse Video does not succeed 100% of the time. A request that passes validation and creates a task can still fail:
A failed task ends in state failed with the reason in data.failMsg, and it is not charged. Both of our launch test requests returned a clip, which is far too few to promise a success rate, so we do not publish one. Design for the occasional failure: retry temporary errors, rewrite refused prompts, and do not assume the first attempt delivers a clip.
One model id and one endpoint; the mode follows from the images you send. All three cost the same.
| Mode | What to send | What the model does |
|---|---|---|
| Text-to-video | prompt only | Everything in the clip comes from the prompt. |
| First frame (image-to-video) | prompt + 1 image in image_url (or first_frame_url, image, input_reference) | The clip starts from that picture; the prompt says what happens next. |
| Reference images | prompt + 1 to 4 images in images (or image_urls, reference_image_urls) | The model keeps the person, subject or style from the images, but the clip does not start from them; the scene comes from the prompt. Good for a recurring character. |
A first frame and reference images cannot go in the same request; sending both returns a 400. An image array (images, image_urls or reference_image_urls) always means reference images, even with a single item; to send a first frame, use the single-image field image_url.
Every request carries the API key in the header:
Authorization: Bearer YOUR_API_KEYhttps://api.apimodels.app/v1/video/generations·GET/v1/video/generations?task_id=# Muse Video — text-to-video. model and prompt are required; everything else is optional.
# duration: whole seconds 4-30 (default 5). aspect_ratio: 16:9 (default, 1280x720) or 9:16 (720x1280).
# Billed $0.037 per requested second: this 10 s request is $0.37.
curl -X POST https://api.apimodels.app/v1/video/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "muse-video",
"prompt": "An orange cat stretches on a sunny windowsill, sunlight pours in, the camera slowly pushes in",
"duration": 10,
"aspect_ratio": "16:9"
}'
# Response (async — a task is created):
# { "code": 200, "msg": "success", "data": { "taskId": "clxxx", "state": "pending", "model": "muse-video" } }
# Poll every 10-15 s until completed (result files are kept 30 days)
curl "https://api.apimodels.app/v1/video/generations?task_id=TASK_ID" \
-H "Authorization: Bearer YOUR_API_KEY"
# { "code": 200, "data": { "state": "completed",
# "resultUrls": ["https://r2.apimodels.app/videos/clxxx.mp4"] } }Same model id, same endpoint: add one first-frame image. It costs the same as text-to-video. The Node.js sample uses the OpenAI-style field names seconds, size and input_reference, which work too.
# Muse Video — image-to-video: the same request plus ONE first-frame image.
# PNG, JPEG or WebP, up to 20 MB, as a public URL or a base64 data URI.
# Same price as text-to-video. Use an image with the same orientation as the clip.
curl -X POST https://api.apimodels.app/v1/video/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "muse-video",
"prompt": "She turns toward the window and smiles, the curtains drift in the breeze, slow push-in",
"image_url": "https://example.com/first-frame-portrait.jpg",
"duration": 6,
"aspect_ratio": "9:16"
}'
# first_frame_url, image or input_reference work in place of image_url. Do not put a first frame in image_urls:
# an image array (images, image_urls, reference_image_urls) always means reference images, see the next example.
# Poll the returned taskId exactly as in the text-to-video example.To keep the same person or subject across clips, put 1 to 4 reference images in images (image_urls and reference_image_urls also work). The model keeps the face and look from them, but the clip does not start from any of them. Name "the same person from the reference images" in the prompt, then describe the new scene. Do not add a first frame to the same request; the price is the same as text-to-video.
# Muse Video — reference images: 1 to 4 images of the same person or subject in "images".
# The model keeps the face and look from them, but the clip does not start from any of them.
# image_urls and reference_image_urls work in place of images. Do not add a first frame to the same request.
# PNG, JPEG or WebP, up to 20 MB each, public URLs or base64 data URIs. Same price as text-to-video.
curl -X POST https://api.apimodels.app/v1/video/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "muse-video",
"prompt": "The same young woman from the reference images walks barefoot along a beach at sunset, smiling back at the camera, handheld vertical shot",
"images": [
"https://example.com/ref-1.jpg",
"https://example.com/ref-2.jpg",
"https://example.com/ref-3.jpg",
"https://example.com/ref-4.jpg"
],
"duration": 5,
"aspect_ratio": "9:16"
}'
# Poll the returned taskId exactly as in the text-to-video example.A task moves through pending → processing → completed or failed. On completed, data.resultUrls[0] is the MP4; on failed, the reason is in data.failMsg and nothing is charged. Clips up to 10 seconds usually take one to two minutes, 15 to 30 seconds usually three to seven; our 4-second launch test requests finished in about 1.5 minutes. Polling every 10-15 seconds is plenty.
To skip polling, pass callback_url in the create request. When the task reaches completed or failed we send an HTTP POST (JSON) to it. Failed deliveries are retried with backoff for up to 30 minutes, until your endpoint returns a 2xx. The URL must be publicly reachable; localhost and private addresses return a 400 at create time. Polling keeps working either way.
POST {your callback_url}
Content-Type: application/json
{
"code": 200,
"msg": "success",
"data": {
"taskId": "clxxx...",
"model": "muse-video",
"state": "completed", // or "failed"
"param": "<JSON string>", // your request, JSON.parse once
"resultJson": "<JSON string> | null", // {"resultUrls": ["https://...mp4"]}, JSON.parse once
"failCode": null,
"failMsg": null
}
}| Field | Required | Type | Description |
|---|---|---|---|
| model | Yes | string | muse-video |
| prompt | Yes | string | What happens in the clip, up to 4,000 characters, any language. Required for image-to-video too. |
| duration | No | number | string | Whole seconds, 4-30, default 5; a string or a number. The OpenAI-style seconds field works too. 5, 6, 8, 10, 15, 20, 25 and 30 come out exact; other values round up to the next step (table below). |
| aspect_ratio | No | string | 16:9 (default, 1280×720) or 9:16 (720×1280). Any other ratio returns a 400. |
| size | No | string | Instead of aspect_ratio: "1280x720" or "720x1280". If you send both, they must match. |
| resolution | No | string | Optional; only "720p" is accepted, anything else returns a 400. |
| image_url | No | string | The first frame, exactly one image; the clip starts from it. A public URL or base64 data URI, PNG, JPEG or WebP, up to 20 MB. first_frame_url, image and input_reference work too. Cannot be combined with images. |
| images | No | string[] | Reference images, 1 to 4: the model keeps the person, subject or style from them but the clip does not start from them, which suits a recurring character. Each is a public URL or base64 data URI, PNG, JPEG or WebP, up to 20 MB. image_urls and reference_image_urls work too; an array with a single image is still a reference image, not a first frame. Cannot be combined with a first frame; more than 4 returns a 400. |
| generate_audio | No | boolean | Optional; only true is accepted. The model decides whether a clip has sound, so true does not guarantee it; false returns a 400 (sound cannot be turned off). |
| callback_url | No | string | We POST the finished task to this URL; omit it and poll the GET endpoint instead. |
There is no last-frame, reference-video or reference-audio input, no negative_prompt and no seed: sending any of them returns a 400 instead of being silently ignored. There are no camera-control parameters either; describe camera moves in the prompt.
Requests of 5, 6, 8, 10, 15, 20, 25 or 30 seconds come back exactly that long; any other whole number rounds up to the next step, so a clip is never shorter than what you paid for. Billing follows the seconds you request, not the clip length.
| Requested duration | Clip length |
|---|---|
| 4 / 5 s | 5 s |
| 6 s | 6 s |
| 7 / 8 s | 8 s |
| 9 / 10 s | 10 s |
| 11–15 s | 15 s |
| 16–20 s | 20 s |
| 21–25 s | 25 s |
| 26–30 s | 30 s |
One reference-image test (2026-10-30)
We sent four photos of one young woman (lying on a pillow, smiling, making a V sign, laughing behind her hand) with the prompt "The same young woman from the reference images walks barefoot along a beach at sunset, smiling back at the camera, handheld vertical shot", duration 4 and aspect_ratio 9:16. A 5.0-second 720×1280 clip with an audio track came back in 88 seconds. It opened on the beach, not on any of the photos. She kept the same face and hair and a similar outfit (the cream camisole became a white slip dress), and the model reused gestures from the photos: a V sign and a laugh behind her hand. Within those 5 seconds it cut between several shots: a close-up, a wide shot, a view from behind, the V sign and another close-up. It was billed exactly like a 4-second text-to-video request. This is one test, not a promise that every request turns out the same way.
| Requested seconds | Clip length | Price |
|---|---|---|
| Per requested second | — | $0.037 |
| 4 s | 5 s | $0.148 |
| 5 s (default) | 5 s | $0.185 |
| 6 s | 6 s | $0.222 |
| 7 s | 8 s | $0.259 |
| 8 s | 8 s | $0.296 |
| 10 s | 10 s | $0.37 |
| 15 s | 15 s | $0.555 |
| 20 s | 20 s | $0.74 |
| 25 s | 25 s | $0.925 |
| 30 s | 30 s | $1.11 |
Billed on the requested seconds: a 4-second request costs $0.148 and returns a 5-second clip. A first frame or reference images cost nothing extra: all three modes have the same price. A request rejected with a 400 creates no task and costs nothing; failed generations are not charged.
Parameter problems come back synchronously as a 400 at creation ({"code": 400, "msg": "..."}): no task is created and nothing is charged. The msg strings below are the current wording; the field name in brackets is the one you actually sent.
| msg | Cause / fix |
|---|---|
prompt is required | No prompt, or only whitespace. Requests with a first frame or reference images need a prompt too. |
prompt must be at most 4000 characters | The prompt is longer than 4,000 characters. Shorten it. |
duration must be a whole number of seconds from 4 to 30 | duration (or seconds) is outside 4-30, has a decimal part, or is not a number. Send whole seconds; a string such as "10" is fine. |
muse-video outputs 720p only (resolution: 720p) | resolution was set to 1080p or another value. Leave it out or send 720p. |
muse-video supports 16:9 (1280x720) or 9:16 (720x1280) only — set aspect_ratio to 16:9 or 9:16 | Another ratio or size was sent (such as 1:1 or 1920x1080), or aspect_ratio and size disagree. |
muse-video takes either a first frame (image_url) or reference images (images), not both | The request carried a first frame (image_url, first_frame_url, image or input_reference) and reference images (images, image_urls or reference_image_urls). Pick one: only the first frame if the clip should start from that picture, only reference images if it should keep the person or subject. |
muse-video takes at most 4 reference images (images / image_urls) | The reference image array has more than 4 images. Keep 4 at most, the ones that show the person or subject best. |
muse-video does not support a last frame (last_frame_url) | A last-frame field was sent. Muse Video has no last frame; remove it. |
muse-video does not accept video or audio input (video_urls) | A video or audio input was sent. Muse Video takes a prompt plus, optionally, one first-frame image or up to 4 reference images. |
muse-video does not support negative_prompt — describe what you want in prompt instead | negative_prompt was sent. Muse Video has no negative prompt: remove it and describe what you want in prompt. |
muse-video does not support seed: results are not repeatable | seed was sent. Muse Video has no seed and the same request gives a different clip each time; remove it. |
muse-video cannot turn sound off: the model decides whether a clip has sound | generate_audio: false was sent. Sound cannot be turned off: leave the field out or send true, and strip the audio track yourself if you need a silent clip. |
first-frame image must be PNG, JPEG or WebP; a file over 20 MB gives first-frame image is larger than 20 MB. Neither is charged.ffprobe -v error -select_streams a -show_entries stream=codec_name -of csv=p=0 clip.mp4: it prints aac when there is a track and nothing when the clip is silent.Try it in the Playground.
720p only (no 1080p, 2K, 4K or 480p), in 16:9 landscape at 1280×720 or 9:16 portrait at 720×1280 only (no square or other ratios). Length is 4 to 30 whole seconds, exact at 5, 6, 8, 10, 15, 20, 25 and 30 and rounded up otherwise. Images: either one first frame or up to four reference images that keep the same person or subject, not both; PNG, JPEG or WebP up to 20 MB each; no last frame. No video or audio input, no lip sync to your audio, no video editing or extension. Sound comes from the model, is not guaranteed on every clip and cannot be turned off. No negative_prompt, seed or camera-control parameters, and the prompt is up to 4,000 characters. Unsupported fields return a 400 before a task is created. Success is not 100%: the model can refuse content, a generation can hit a temporary error, and a clip with the wrong orientation or length is discarded. Failed tasks are not charged, and we publish no success rate.
$0.037 per requested second: 5 seconds (the default) $0.185, 8 seconds $0.296, 10 seconds $0.37, 15 seconds $0.555, 20 seconds $0.74, 30 seconds $1.11. A first frame or reference images cost nothing extra. Billing follows the seconds you request, so a 4-second request costs $0.148 and returns a 5-second clip. A request rejected with a 400 creates no task, and failed generations are not charged.
Clip lengths come in steps. Requests of 5, 6, 8, 10, 15, 20, 25 or 30 seconds come back exactly that long; any other whole number from 4 to 30 rounds up to the next step (4 → 5 s, 7 → 8 s, 11-14 → 15 s, 26-29 → 30 s), so a clip is never shorter than what you paid for. Request an exact step when the length matters.
720p only, in two shapes: 16:9 at 1280×720 (the default) or 9:16 at 720×1280, set with aspect_ratio or with size 1280x720 / 720x1280. There is no square or 1080p option; asking for one returns a 400 before a task is created. Output is an H.264 MP4 at 24 fps.
Add one first-frame image to the request as image_url (first_frame_url, image and input_reference also work): a public URL or a base64 data URI, PNG, JPEG or WebP, up to 20 MB. The clip starts from that picture and costs the same as text-to-video. Use an image in the same orientation as the clip; there is no last-frame option. Do not put the first frame in an image_urls array: any image array is read as reference images.
Yes, with reference images. Send 1 to 4 images of the person or subject in images (image_urls and reference_image_urls also work), not together with a first frame. The model keeps the face and look but does not start the clip from those pictures; the scene comes from the prompt. In one test on 2026-10-30, four photos of one young woman and a prompt about her walking along a beach at sunset gave a 5.0-second 720×1280 clip with audio in 88 seconds: the same face and hair, a similar outfit, and gestures taken from the photos. That is one test, not a guarantee. Reference images cost nothing extra, and more than 4 return a 400.
Meta describes Muse Video as generating sound together with the picture. In our launch tests the landscape clip carried an AAC audio track and the portrait clip came back silent, so if your pipeline needs audio, check each clip for an audio track. Sound cannot be turned off: generate_audio: false returns a 400.