Over the past few weeks my X feed filled up with Muse Video clips: handheld selfies, vlogs and "boyfriend POV" shorts that look like they were filmed on a phone. The prompts behind them were scattered across hundreds of posts, many cut off behind "Show more", split across replies, or quietly swapped for a translation.
So I collected them. muse-video-prompts is an open-source library of 204 Muse Video prompts shared on X, each credited to its creator and linked to the original post, sorted into 13 categories. This post covers what's in it, one scraping gotcha worth knowing about, the seven patterns the best prompts share, and a short Node.js script that runs any of them through an API.
Disclosure up front: I build apimodels.app, which sells API access to Muse Video (among other models) and hosts a copy of this library with the clips playing inline.
apimodels
/
muse-video-prompts
204 Muse Video prompts collected from X, each credited to its creator and linked to the original post. Searchable page, one file per prompt, JSON data. Curated by apimodels.app.
Muse Video Prompts: 204 Real Prompts from X
English · 简体中文 · Watch them with the videos on apimodels.app · Search and copy them on GitHub Pages
204 prompts that creators posted on X after running them in Meta's Muse, each credited to its creator and linked to the original post. They were posted between 2026-09-17 and 2026-11-04 by 68 creators, mostly in Chinese, some in English and Japanese. Where a prompt was split between a post and the author's own replies, the parts are joined back into one prompt; copies of the same prompt reposted by other accounts are merged into one entry and listed as "also posted by".
Disclosure: this collection is curated by apimodels.app, the API platform I work on. apimodels.app is a multi-model API gateway, and it offers Muse Video through an API; the limits of that API are listed under Running these prompts…
What's in the library
- 204 prompts, each with the creator's handle, the post date and a link to the original post.
- Full text or excerpt. A prompt is quoted in full when its author invited people to reuse it (22) or when it is 600 characters or shorter (54). The other 128 are word-for-word excerpts from the beginning, marked as excerpts, with the full text one click away in the original post.
- Original languages: 154 Chinese, 38 English, 8 Japanese, 4 mixed. Muse reads all of them, so nothing is translated.
- 13 categories: boyfriend POV (39), multi-shot beat cuts built on a reference sheet (31), selfie and vlog (28), Chinese period pieces (22), dance (14), fantasy, animation and CG (14), fashion portrait (12), one-liners (12), long-form multi-clip scripts (11), documentary and landscape (9), transitions (5), cinematic story (5) and ASMR (2).
-
Formats: one Markdown file per prompt under
prompts/<category>/, everything indata/prompts.json, and a single-fileindex.htmlthat searches, filters and copies. The same page is on GitHub Pages, and a version with the original clips playing inline is on apimodels.app/muse-video-prompts.
A scraping gotcha: the text you scrape from X may be a translation
Reading post text from X's web client is not the same as reading the original post. With X's automatic translation, or a translation extension, in the loop, my first pass came back with Japanese prompts already rendered in English, and some English prompts with a Chinese translation appended. The text looked plausible, so nothing failed loudly.
The fix was to rebuild every prompt from the original post text returned by a public embed API (api.fxtwitter.com/<user>/status/<id>), and keep the scraped text only when its language and length matched the original. Dozens of records changed. If you scrape user-generated text from a site that translates for you, check each record's language against the source before you trust it.
7 patterns the best prompts share
1. Lock the person with one reference sheet. The most-copied format starts from a single composite image: a headshot on the left and a three-view outfit sheet on the right. The prompt points at it section by section (face from the headshot, outfit from the turnaround) and repeats that the face and outfit must not change in any shot. Through an API, send that sheet as a reference image, not as a first frame.
2. Write the body in time steps and cut on the beat. These prompts describe each shot in short steps (weight shift, where each hand is, where the eyes go) and list the cut points, such as 1.80 s, 3.50 s and 5.10 s, against the beats of the music. "She poses" on its own gets you a stiff loop.
3. For POV, make the camera a person. The boyfriend-POV series opens every episode with the same rule: the camera is his eyes, and he never appears except for a hand or forearm. Then the action in 0–2 s / 2–5 s / 5–8 s / 8–10 s, one line of dialogue, and a handheld 9:16 phone look.
4. Repeat a block for whatever must not change. The long English prompts open with a format lock (aspect ratio and source resolution) and a master block that fixes the character and costume word for word, pasted into every clip. Dance prompts add a tempo lock: the BPM and the timestamp of every downbeat.
5. Ask for the flaws of a phone camera. Selfie and vlog prompts get their realism by asking for handheld shake, focus breathing, noise-reduction smear, platform compression and 720p, and by banning HDR, studio retouching and a face that stays sharp the whole time.
6. Split anything longer than 20 seconds. Several prompts describe films of 30 seconds to a minute. On the API each request is 4 to 20 seconds and up to 4,000 characters, so split by clip, keep the character block identical in every request, and edit the clips together.
7. One-liners need the app, not the API. Instructions such as "turn the images in this post into a video" work in Meta's Muse app because the agent opens the link and writes its own prompt. A video API only sees the text you send, so write the shots out.
Put together, the shape most of the strong prompts follow is:
Format (aspect ratio, length) + who (locked by a reference image) + scene + light
+ camera position + shots written in time steps + style + sound + what to avoid
A short example in that shape (mine, not from the library):
9:16, 10 seconds, handheld phone selfie. The woman from the reference image, same face,
hair and outfit throughout. A quiet bookshop aisle in the late afternoon, warm window light
from the left. 0–3 s: she pulls a book from the shelf and glances at the lens. 3–6 s: she
lifts it to hide half her face and laughs. 6–10 s: she lowers it, looks straight into the
lens and says "Found it." Slight handheld shake, natural skin texture, the soft sound of
pages. Avoid: on-screen text, extra fingers, a second person.
Run a prompt from the library with Node.js
What you need:
- Node.js 18 or later (for the built-in
fetch) - A clone of the repo:
git clone https://github.com/apimodels/muse-video-prompts - An apimodels.app API key in
APIMODELS_API_KEY
The script below picks a prompt by id from data/prompts.json, refuses excerpts and anything over the API's 4,000-character limit, maps the library's aspect ratios onto the two the API accepts, creates the task, polls it and saves the MP4. Save it in the repo root as run-prompt.mjs:
// run-prompt.mjs: run one prompt from the library through the muse-video API.
// Usage: APIMODELS_API_KEY=your_key node run-prompt.mjs MV039
import { readFile, writeFile } from 'node:fs/promises';
const API = 'https://api.apimodels.app/v1/video/generations';
const headers = {
Authorization: `Bearer ${process.env.APIMODELS_API_KEY}`,
'Content-Type': 'application/json',
};
const id = process.argv[2] ?? 'MV039';
const prompts = JSON.parse(await readFile('data/prompts.json', 'utf8'));
const p = prompts.find((x) => x.id === id);
if (!p) throw new Error(`No prompt ${id}`);
if (p.text_status === 'excerpt') throw new Error(`${id} is an excerpt. Copy the full prompt from ${p.url}`);
if (p.text.length > 4000) throw new Error(`${id} is ${p.text.length} characters; split it by clip.`);
if (p.needs_reference) console.warn(`${id} was written for reference images: add up to 4 in "images".`);
// The API takes 16:9 or 9:16 only, and 4 to 20 whole seconds.
const aspect_ratio = ['16:9', '4:3'].includes(p.aspect) ? '16:9' : '9:16';
const duration = Math.min(20, Math.max(4, p.seconds ?? 10));
const created = await fetch(API, {
method: 'POST',
headers,
body: JSON.stringify({ model: 'muse-video', prompt: p.text, duration, aspect_ratio }),
}).then((r) => r.json());
if (created.code !== 200) throw new Error(created.msg); // a 400 creates no task and costs nothing
const { taskId } = created.data;
console.log(`task ${taskId}: ${duration} s × $0.037 = $${(duration * 0.037).toFixed(3)}`);
while (true) {
await new Promise((r) => setTimeout(r, 12_000)); // poll every 10-15 s
const { data } = await fetch(`${API}?task_id=${taskId}`, { headers }).then((r) => r.json());
console.log(data.state);
if (data.state === 'failed') throw new Error(data.failMsg); // failed tasks are not charged
if (data.state === 'completed') {
const mp4 = await fetch(data.resultUrls[0]).then((r) => r.arrayBuffer());
await writeFile(`${id}.mp4`, Buffer.from(mp4));
console.log(`saved ${id}.mp4`);
break;
}
}
MV039 is a 10-second, 9:16 boyfriend-POV prompt whose author invited reuse, so the full text is in the repo. Run it:
APIMODELS_API_KEY=your_key node run-prompt.mjs MV039
The script prints the task id and the cost ($0.370 for 10 seconds), then pending, processing and finally completed. Clips of up to 10 seconds usually take one to two minutes; 15 to 20 seconds usually take three to seven.
Verify the clip
Check the size and whether the clip has sound:
ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 MV039.mp4
# 720,1280
ffprobe -v error -select_streams a -show_entries stream=codec_name -of csv=p=0 MV039.mp4
# aac when there is an audio track, nothing when the clip is silent
Muse generates sound together with the picture, but not every clip comes back with an audio track, so check it if your pipeline needs audio.
Where apimodels.app fits, and when to skip it
apimodels.app is a multi-model API gateway: one API key and one endpoint for 150+ image, video, audio and language models. Muse Video is the model id muse-video on POST /v1/video/generations, and here are its limits as of November 2026:
- Input: a prompt of up to 4,000 characters in any language, plus either one first frame or up to four reference images (not both).
- Output: 720p H.264 MP4 at 24 fps, 16:9 (1280×720) or 9:16 (720×1280). No 1080p, no square.
- Length: 4 to 20 whole seconds. 5, 6, 8, 10, 15 and 20 come out exact; other values round up to the next step.
- Price: $0.037 per requested second, so 10 seconds is $0.37. Failed tasks are not charged.
-
Reliability: not every request succeeds. The model can refuse a prompt or an image, and generations occasionally hit temporary errors, so build in a retry. There is no
seedand nonegative_prompt.
When to skip it: if you only want a handful of clips for yourself, paste these prompts into Meta's Muse app; the one-liners only work there anyway. And if you need 1080p, square video or a single clip longer than 20 seconds, Muse Video won't do it; pick another model.
The Muse Video model page has a browser playground and 18 sample clips with the exact prompts sent, and the API reference lists every field and error.
Common errors
-
prompt must be at most 4000 characters: several long-form prompts are longer than that. Split them by clip and keep the character block identical in each request. -
muse-video supports 16:9 (1280x720) or 9:16 (720x1280) only — set aspect_ratio to 16:9 or 9:16: six prompts in the library were written for 4:3 or 3:4. The script maps them to the nearest supported ratio. -
muse-video does not support negative_prompt — describe what you want in prompt instead: keep the "Avoid:" lines inside the prompt text, the way the library's prompts do. -
muse-video takes either a first frame (image_url) or reference images (images), not both: useimagesfor a recurring character,image_urlonly when the clip should start from that exact picture. -
A task that ends in
failed: readdata.failMsg. A refusal usually needs a rewritten prompt or a different image; a temporary error usually works on a retry a little later. Neither is charged.
Contribute
Missing a prompt you liked, spotted a wrong credit, or wrote one of these and want it removed? Open an issue on the repo.
Which category should I dig into next: dance, POV or the long multi-clip scripts?
I'm Lewis, and I build apimodels.app. The previous post in this series shows how to keep one character consistent across clips: Build a Consistent AI Influencer with Muse Image and Muse Video in Node.js.
Written with AI assistance. The counts, limits and error messages were checked against the repo and the API reference on November 4, 2026.
Top comments (0)