cURL
curl https://api.apipod.ai/v1/videos/generations \
-H "Authorization: Bearer $APIPOD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "muse-video-t2v",
"prompt": "A corgi surfing at sunset, cinematic, slow motion",
"duration": 10,
"aspect_ratio": "16:9",
"style_preset": "cinematic_realistic",
"generate_audio": true
}'import os
import requests
payload = {
"model": "muse-video-t2v",
"prompt": "A corgi surfing at sunset, cinematic, slow motion",
"duration": 10,
"aspect_ratio": "16:9",
"style_preset": "cinematic_realistic",
"generate_audio": True
}
response = requests.post(
"https://api.apipod.ai/v1/videos/generations",
headers={
"Authorization": f"Bearer {os.environ['APIPOD_API_KEY']}",
"Content-Type": "application/json",
},
json=payload,
timeout=60,
)
response.raise_for_status()
print(response.json())package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
payload := map[string]any{}
if err := json.Unmarshal([]byte(`{
"model": "muse-video-t2v",
"prompt": "A corgi surfing at sunset, cinematic, slow motion",
"duration": 10,
"aspect_ratio": "16:9",
"style_preset": "cinematic_realistic",
"generate_audio": true
}`), &payload); err != nil {
panic(err)
}
body, err := json.Marshal(payload)
if err != nil {
panic(err)
}
req, err := http.NewRequest(http.MethodPost, "https://api.apipod.ai/v1/videos/generations", bytes.NewReader(body))
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("APIPOD_API_KEY"))
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println(resp.Status)
}use reqwest::Client;
use serde_json::json;
use std::env;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let payload = json!({
"model": "muse-video-t2v",
"prompt": "A corgi surfing at sunset, cinematic, slow motion",
"duration": 10,
"aspect_ratio": "16:9",
"style_preset": "cinematic_realistic",
"generate_audio": true
});
let response = Client::new()
.post("https://api.apipod.ai/v1/videos/generations")
.bearer_auth(env::var("APIPOD_API_KEY")?)
.json(&payload)
.send()
.await?
.error_for_status()?;
println!("{}", response.text().await?);
Ok(())
}const response = await fetch("https://api.apipod.ai/v1/videos/generations", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.APIPOD_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify(
{
"model": "muse-video-t2v",
"prompt": "A corgi surfing at sunset, cinematic, slow motion",
"duration": 10,
"aspect_ratio": "16:9",
"style_preset": "cinematic_realistic",
"generate_audio": true
}
),
});
if (!response.ok) {
throw new Error(`APIPod request failed: ${response.status} ${await response.text()}`);
}
console.log(await response.json());{
"code": 200,
"message": "success",
"data": {
"task_id": "vid_task_01JEXAMPLE"
}
}MU Video
Muse Video Text to Video
Muse Video Text to Video generates 5-60 second 720p clips from a prompt alone, with five aspect ratios, seven style presets and native voice and sound.
POST
https://api.apipod.ai
/
v1
/
videos
/
generations
cURL
curl https://api.apipod.ai/v1/videos/generations \
-H "Authorization: Bearer $APIPOD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "muse-video-t2v",
"prompt": "A corgi surfing at sunset, cinematic, slow motion",
"duration": 10,
"aspect_ratio": "16:9",
"style_preset": "cinematic_realistic",
"generate_audio": true
}'import os
import requests
payload = {
"model": "muse-video-t2v",
"prompt": "A corgi surfing at sunset, cinematic, slow motion",
"duration": 10,
"aspect_ratio": "16:9",
"style_preset": "cinematic_realistic",
"generate_audio": True
}
response = requests.post(
"https://api.apipod.ai/v1/videos/generations",
headers={
"Authorization": f"Bearer {os.environ['APIPOD_API_KEY']}",
"Content-Type": "application/json",
},
json=payload,
timeout=60,
)
response.raise_for_status()
print(response.json())package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
payload := map[string]any{}
if err := json.Unmarshal([]byte(`{
"model": "muse-video-t2v",
"prompt": "A corgi surfing at sunset, cinematic, slow motion",
"duration": 10,
"aspect_ratio": "16:9",
"style_preset": "cinematic_realistic",
"generate_audio": true
}`), &payload); err != nil {
panic(err)
}
body, err := json.Marshal(payload)
if err != nil {
panic(err)
}
req, err := http.NewRequest(http.MethodPost, "https://api.apipod.ai/v1/videos/generations", bytes.NewReader(body))
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("APIPOD_API_KEY"))
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println(resp.Status)
}use reqwest::Client;
use serde_json::json;
use std::env;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let payload = json!({
"model": "muse-video-t2v",
"prompt": "A corgi surfing at sunset, cinematic, slow motion",
"duration": 10,
"aspect_ratio": "16:9",
"style_preset": "cinematic_realistic",
"generate_audio": true
});
let response = Client::new()
.post("https://api.apipod.ai/v1/videos/generations")
.bearer_auth(env::var("APIPOD_API_KEY")?)
.json(&payload)
.send()
.await?
.error_for_status()?;
println!("{}", response.text().await?);
Ok(())
}const response = await fetch("https://api.apipod.ai/v1/videos/generations", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.APIPOD_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify(
{
"model": "muse-video-t2v",
"prompt": "A corgi surfing at sunset, cinematic, slow motion",
"duration": 10,
"aspect_ratio": "16:9",
"style_preset": "cinematic_realistic",
"generate_audio": true
}
),
});
if (!response.ok) {
throw new Error(`APIPod request failed: ${response.status} ${await response.text()}`);
}
console.log(await response.json());{
"code": 200,
"message": "success",
"data": {
"task_id": "vid_task_01JEXAMPLE"
}
}muse-video-t2v turns a written prompt into a finished clip. There is no source media to prepare — you describe the shot and Muse Video handles motion, lighting and style, and generates synchronized voice and sound alongside the picture.
Model at a glance
| Public model ID | muse-video-t2v |
| Input | text |
| Output | video with audio |
| Duration | 5, 10, 20, 30, 40, 50 or 60 seconds (default 5) |
| Resolution | 720p |
| Aspect ratio | 16:9, 9:16, 1:1, 4:3, 3:4 (default 16:9) |
| Billing | per second of output |
Parameters
| Parameter | Type | Default | Notes |
|---|---|---|---|
prompt | string | — | Required, up to 4000 characters. |
duration | integer | 5 | Must be one of 5, 10, 20, 30, 40, 50, 60. |
aspect_ratio | string | 16:9 | One of 16:9, 9:16, 1:1, 4:3, 3:4. |
resolution | string | 720p | 720p is the only supported tier. |
style_preset | string | none | See below. |
generate_audio | boolean | true | Set false to mute voices. |
negative_prompt, seed and reference media are not supported on this model — use muse-video-i2v or muse-video-r2v when you need to guide the picture with images.
Style presets
| Value | Look |
|---|---|
none | Let the prompt decide. |
cinematic_realistic | Live-action film look, natural light and shallow depth of field. |
2d_anime | Hand-drawn animation with flat shading and bold linework. |
3d_xianxia | Chinese-fantasy CGI — flowing robes, misty peaks, glowing energy. |
american_comic | Western comic panels with heavy ink and halftone texture. |
cyberpunk_neon | Rain-soaked streets, neon signage, high contrast. |
ecommerce_ugc | Bright, clean, phone-shot product-demo framing. |
Prompting
Muse Video follows camera language closely. A prompt that names the shot, the light and one or two materials produces noticeably more controlled results than a stack of adjectives.A corgi surfing at sunset, low-angle tracking shot, backlit spray,
shallow depth of field, warm highlights, cinematic slow motion
low-angle tracking shot), light (backlit spray, warm highlights) and pace (cinematic slow motion). Materials and subject stay short so nothing competes for attention.
Keep prompts under roughly 400 characters for the most reliable prompt adherence; the 4000-character limit exists for structured briefs and multi-shot descriptions.
Workflow
POST /v1/videos/generationswith the parameters above.- Read
data.task_idfrom the response. - Poll
GET /v1/videos/status/{task_id}every few seconds untilstatusiscompleted. - Download from
data.result.
curl https://api.apipod.ai/v1/videos/generations \
-H "Authorization: Bearer $APIPOD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "muse-video-t2v",
"prompt": "A corgi surfing at sunset, low-angle tracking shot, backlit spray, cinematic slow motion",
"duration": 10,
"aspect_ratio": "16:9",
"style_preset": "cinematic_realistic"
}'
Cost
Billing is per output second:duration × per-second price. Because text-to-video has no reference media, the charge is fully determined by the duration you send — quote it with POST /v1/pricing/estimate before submitting a batch.Authorizations
Use your APIPod API key as a Bearer token in the Authorization header.
Body
application/json
Public APIPod model ID.
Allowed value:
"muse-video-t2v"Describe the video to generate. Required, up to 4000 characters.
Required string length:
1 - 4000Video duration in seconds.
Available options:
5, 10, 20, 30, 40, 50, 60 Aspect ratio of the generated video.
Available options:
16:9, 9:16, 1:1, 4:3, 3:4 Output resolution. MU Video currently supports 720p only.
Available options:
720p Visual style preset applied to the video.
Available options:
none, cinematic_realistic, 2d_anime, 3d_xianxia, american_comic, cyberpunk_neon, ecommerce_ugc Whether to generate voice and sound. Set to false to mute voices.
Was this page helpful?