GPT Image 2.5 is live — OpenAI's newest image model, targeted edits that leave the rest of the frame alone
rreAPI Docs

muse-video

Muse Video on reAPI — Meta's video model. A prompt plus up to 9 reference images in, a clip of about 10 seconds at 720p with sound out, one flat price per clip.

Muse Video, the video model from Meta Superintelligence Labs, live on reAPI. One model id, muse-video, makes a clip of about 10 seconds at 720p with sound, from a prompt or from a prompt plus up to 9 reference images, in one of seven aspect ratios. Every clip costs the same flat price. See current pricing on the model page.

Quick example

curl https://reapi.ai/api/v1/videos/generations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "muse-video",
    "prompt": "A golden retriever shakes off water on a sunny dock, droplets flying in slow motion, the camera pushing in gently, splashes and a happy bark. No text.",
    "aspect_ratio": "16:9"
  }'
import requests

response = requests.post(
    "https://reapi.ai/api/v1/videos/generations",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    json={
        "model": "muse-video",
        "prompt": "A golden retriever shakes off water on a sunny dock, droplets flying in slow motion, the camera pushing in gently, splashes and a happy bark. No text.",
        "aspect_ratio": "16:9",
    },
    timeout=60,
)
response.raise_for_status()
task_id = response.json()["id"]
const response = await fetch('https://reapi.ai/api/v1/videos/generations', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    model: 'muse-video',
    prompt:
      'A golden retriever shakes off water on a sunny dock, droplets flying in slow motion, the camera pushing in gently, splashes and a happy bark. No text.',
    aspect_ratio: '16:9',
  }),
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const { id: taskId } = await response.json();
package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "strings"
    "time"
)

func main() {
    body := strings.NewReader(`{
      "model": "muse-video",
      "prompt": "A golden retriever shakes off water on a sunny dock, droplets flying in slow motion, the camera pushing in gently, splashes and a happy bark. No text.",
      "aspect_ratio": "16:9"
    }`)
    req, err := http.NewRequest("POST", "https://reapi.ai/api/v1/videos/generations", body)
    if err != nil { panic(err) }
    req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
    req.Header.Set("Content-Type", "application/json")
    client := &http.Client{Timeout: 60 * time.Second}
    res, err := client.Do(req)
    if err != nil { panic(err) }
    defer res.Body.Close()
    var task struct { ID string `json:"id"` }
    if err := json.NewDecoder(res.Body).Decode(&task); err != nil { panic(err) }
    fmt.Println(task.ID)
}

Authentication

Every call needs a Bearer token. Generate keys at reapi.ai/settings/apikeys.

Authorization: Bearer YOUR_API_KEY

Endpoint

POST /api/v1/videos/generations
GET  /api/v1/tasks/{id}

Submission is async. The POST returns a task id right away; poll the task endpoint until status is completed or failed. Polling does not consume credits.

Request body

FieldTypeDefaultNotes
modelstring—muse-video. Required.
promptstring—Required, also with references. Must not be empty after trimming. Describe subject, action, camera move and light, and name the sounds you want.
image_urlsstring[]—0–9 public HTTP(S) image URLs used as references. PNG, JPEG or WebP, 11 MB in total. Leave it out for text to video.
aspect_ratiostringauto1:1 / 16:9 / 9:16 / 4:3 / 3:4 / 3:2 / 2:3. Leave it out for auto: 16:9 for text only, the references' shape otherwise. Do not send "auto".
sizestring—Alias of aspect_ratio: one of the ratios above, or auto. aspect_ratio wins when both are sent.
durationinteger or string10Only 10, "10" or "10s". The clip runs about 10 seconds.
resolutionstring720pOnly 720p.
audiobooleantrueOnly true; every clip has sound. false is refused.
ninteger1Only 1. Each request returns one clip.

There are no first or last frame, reference video, reference audio, extend, seed or negative prompt fields. Fields outside this table are not refused: they are passed through to the model, which currently ignores them.

Checked by reAPI before anything is charged:

  • prompt is present and not blank
  • image_urls holds at most 9 public HTTP(S) URLs — base64 and data: URIs are rejected
  • aspect_ratio, size, duration, resolution, audio and n hold one of their listed values

The reference files' format and total size are checked when the task starts. A request that breaks one ends as a failed task with the exact reason, and is refunded in full.

Modes

ModeHow to select it
Text to videoNo image_urls. Without aspect_ratio the clip is 16:9.
With references1–9 images in image_urls. Without aspect_ratio the clip follows their shape.

With references

{
  "model": "muse-video",
  "prompt": "The fox slowly lifts its head, wind moving through its fur, the camera pushing in gently, soft forest ambience.",
  "image_urls": ["https://example.com/fox.png"]
}

The clip stays close to the references, but its first frame is not an exact copy of an image.

Troubleshooting

FailureWhat it meansWhat to do
Synchronous 400 (code 20002)No promptAdd a prompt. Nothing was charged
Synchronous 400 (codes 20003 / 20005)A blank prompt, more than 9 references, a non-URL reference, or a value outside a field's list (for example audio: false)The message names the field. Nothing was charged
Task fails with code 80007The model refused the input, for example references over 11 MB in totalFully refunded. Fix the input and send it again
Task fails with code 80006The prompt or an image was rejected by content reviewFully refunded. Revise the prompt or images
402 on submitNot enough credits for the reserveTop up
Task stays processingGeneration usually takes a few minutesKeep polling; a task that can never finish is failed and refunded automatically

No data: URIs. reAPI rejects base64 inputs platform-wide — every URL field must be a public HTTP(S) URL. Upload to your own object storage and pass the URL.

Response envelope

{
  "id": "task_018f5a3a1b6e7d9f8c2b4d6e8f0a2c4e",
  "model": "muse-video",
  "status": "completed",
  "created_at": 1789689600,
  "output": {
    "video_urls": ["https://cdn.reapi.ai/media/tasks/018f5a3a1b6e7d9f8c2b4d6e8f0a2c4e/0.mp4"]
  },
  "error": null
}

Poll GET /api/v1/tasks/{id} (see the Tasks reference) until status === "completed", then read output.video_urls. The clip is an MP4 with an audio track. A failed task carries error.code and error.message; see the errors catalog.

Pricing

Muse Video bills one flat price per clip:

credits = ceil(per_clip_rate × 1 × 1000)     1 credit = $0.001

The price is not multiplied by seconds. Text-only and reference requests, and every aspect ratio, cost the same. The amount reserved when the task is accepted is the amount charged, and failed tasks are refunded in full.

The live per-clip rate is on the model page.

Tips

  • Describe subject, action, camera move and light, and name the sounds; the audio is generated together with the picture.
  • Make a still with Muse Image, then pass its URL here to set it in motion.
  • For vertical video, send aspect_ratio: "9:16", or a portrait reference.
  • Add No text. to keep invented captions out.
  • Need a longer clip, a higher resolution, or video and audio references? Use Seedance 2.0.

Table of Contents