Cara Membuat Video dan Gambar AI dengan Meta Muse API
16 menit baca • 12 Oktober 2026 (30 Oktober 2026)
useapi.net adalah API pihak ketiga. Kami tidak berafiliasi dengan Meta dan tidak disahkan oleh Meta.
Daftar isi
- Pendahuluan
- Biayanya
- Sebelum mulai
- Cara membuatnya
- Yang kami pelajari
- Membuat Short 30 detik bernarasi (skrip, tiga adegan, satu penggabungan)
- Pertanyaan yang sering diajukan
- Kesimpulan
Pendahuluan
Muse API dari useapi.net menjalankan Muse, agen AI pribadi milik Meta, dari kode: satu POST membuat gambar atau video 10 detik dengan dialog lisan, dan setiap file yang dibuatnya adalah asset id yang bisa dipakai job berikutnya sebagai input.
Muse di sini adalah agen Meta di muse.ai, bukan Skiv, perusahaan hosting video yang memakai nama muse.ai sampai Maret 2026. API ini di-hosting, jadi tidak seperti tools self-hosted seperti muse2api, tidak ada yang perlu di-deploy: perbandingan Meta Muse video API (bahasa Inggris) menyandingkan API milik Meta, muse2api dan API yang di-hosting.
API ini berjalan di langganan situs Muse Anda, dan paket gratisnya pun bisa. Panduan ini mengambil tiga foto biasa, sebuah motor BMW klasik, seorang pengendara berambut merah, dan pantai di bawah Golden Gate Bridge, lalu menggabungkannya menjadi satu gambar sang pengendara melaju dengan motor itu menembus ombak. Gambar itu lalu menjadi video tempat dia meneriakkan sebuah kalimat, dan di job ketiga seorang perempuan lain, dari foto keempat, menggantikannya di video itu sementara perjalanannya tetap sama. Di sepanjang jalan, panduan ini membuat gambar dari teks, serta merestorasi dan mewarnai potret berusia seratus tahun yang kemudian mengangkat pandangannya dan berbicara. Setiap request di bawah adalah request yang membuat media di halaman ini.
Pengendara dari sebuah foto, dimasukkan ke klip yang dibuat Muse dari gambar diam (langkah 8).
Biayanya
useapi.net adalah API, bukan layanan gambar atau video tersendiri. Setiap panggilan berjalan di akun Muse yang Anda tambahkan lewat Setup Muse, dan memakai kuota mingguan Muse akun itu, tanpa biaya per gambar atau per video dari useapi.net. Muse melaporkan kuota sebagai persentase bulat yang sudah terpakai, jadi satu gambar sering tidak menunjukkan perubahan.
Yang dipakai setiap langkah di paket gratis, diambil dari percentUsed sebelum dan sesudahnya, dan berapa lama setiap job berjalan:
| Langkah | Endpoint | Hasil | Kuota terpakai | Waktu |
|---|---|---|---|---|
| Teks ke gambar, 9:16 | POST /jobs/image | 1152×2048 | tidak diukur | 30 s |
| Teks ke gambar, tepat 16:9 | POST /jobs/image | 2048×1152 | 0% | 21 s |
| Pengendara + motor + pantai | POST /jobs/image | 2048×1152 | 0% | 31 s |
| Perjalanan sebagai video | POST /jobs/video | 1280×720, 10 s | 3% | 88 s |
| Restorasi foto lama | POST /jobs/image | 1344×1792 | 1% | 34 s |
| Potret yang berbicara | POST /jobs/video | 832×1104, 10 s | 2% | 68 s |
| Ganti pengendara | POST /jobs/video | 1248×704, 10 s | 3% | 138 s |
Upload tidak memakai kuota. Di paket gratis, satu video memakai 2 sampai 3 persen dari kuota mingguan dan satu gambar 0 sampai 1 persen, jadi satu akun gratis membuat sekitar 30 sampai 50 video per minggu, atau beberapa ratus gambar (langkah 9).
Sebelum mulai
Anda butuh API token useapi.net dan akun Muse yang ditambahkan lewat Setup Muse. Sebelum menambahkan akun:
- Muse tersedia di AS, Kanada, Jepang dan Singapura (per 30 Oktober 2026), jadi buat akunnya di salah satu negara itu. Setelah akun ditambahkan, Anda bisa memanggil API dari mana saja.
- Selesaikan onboarding Muse di muse.ai, termasuk pemeriksaan usia dari Meta, dan buat satu gambar di sana.
- Akun harus bisa masuk dengan email + password, karena API masuk dengan email dan password. Akun Meta yang hanya masuk dengan kode lewat email belum punya password: buat password di Meta Accounts Center (Password and security), lalu tambahkan akunnya di sini. Tanpa password, penambahan akun ditolak dengan
400. - Pakai akun itu hanya untuk API, tanpa tools otomasi lain. Membukanya di muse.ai lewat browser tidak masalah, tetapi hanya dari AS, Kanada, Jepang atau Singapura (wilayah yang resmi didukung Muse), atau lewat VPN di salah satu wilayah itu: Meta bisa mematikan fitur video untuk akun yang terlihat dipakai dari tempat lain.
Setiap panggilan juga ada di koleksi Postman.
Tanpa kode: template n8n Old Photo to Talking Video merestorasi foto dan membuatnya berbicara dari sebuah formulir, dan template Narrated Faceless Shorts mengubah sebuah topik menjadi Short bernarasi. Seluruh panduan ini juga ada di GitHub sebagai satu skrip, dalam Node.js dan Python: images-videos/ di useapi/muse-api, ditambah agent skill untuk Claude Code dan Codex.
Langkah-langkahnya memakai curl, jq, serta variabel dan helper berikut:
Buka variabel dan helper
export USEAPI_TOKEN="user:12345-..."
export EMAIL="[email protected]"
export MUSE_PASSWORD="..." # password akun Muse, dipakai sekali di langkah 1
API=https://api.useapi.net/v1/muse
AUTH="Authorization: Bearer $USEAPI_TOKEN"
enc() { jq -rn --arg v "$1" '$v|@uri'; }
post() { curl -sS -X POST "$API/$1" -H "$AUTH" -H "Content-Type: application/json" -d "$2"; }
get() { curl -sS "$API/$1" -H "$AUTH"; }
upload() { curl -sS -X POST "$API/assets?email=$(enc "$EMAIL")" -H "$AUTH" -H "Content-Type: $2" --data-binary @"$1" | jq -r .assetId; }
download() { curl -sSf "$API/assets/$(enc "$1")" -H "$AUTH" -o "$2"; }
# jalankan job secara async: kirim, polling GET /jobs/{jobid} setiap 10 detik, simpan record job terakhir ke $1
run() {
local job id
job=$(post "$2" "$(jq '. + {async: true}' <<< "$3")")
id=$(jq -r .jobid <<< "$job")
while [ "$(jq -r .status <<< "$job")" = started ]; do
sleep 10
job=$(get "jobs/$(enc "$id")")
done
echo "$job" > "$1"
jq '{status, error, text: .result.text, asset: .result.assets[0].assetId}' "$1"
}
Setiap generate berjalan sebagai job. Tanpa async, POST menunggu hingga sekitar 100 detik dan mengembalikan record job yang sudah selesai, atau 202 jika job masih berjalan. Satu video di sini butuh 68 sampai 138 detik, jadi run mengirim setiap job dengan async: true dan melakukan polling ke GET /jobs/jobid. Jika run mencetak status selain completed, baca error-nya sebelum melanjutkan.
Untuk dipanggil balik alih-alih polling, tambahkan replyUrl: "https://example.com/hooks/muse" (dan, jika perlu, replyRef) ke body mana pun di bawah. API lalu mengirim satu POST berisi record job terakhir, dalam JSON, ke URL itu.
Id berisi : dan @, jadi enc meng-encode-nya sebagai URL setiap kali id masuk ke path URL. Semua input untuk satu job harus berada di akun Muse yang sama, jadi upload menetapkan email, dan job berjalan di akun yang menyimpan input-nya.
Cara membuatnya
1. Tambahkan akun
POST /accounts menerima email dan password akun Muse. API masuk sekali, menyimpan sesi 30 hari dan memperbaruinya sendiri. Muse mengirim kode login ke email akun setiap kali masuk. Email itu hanya pemberitahuan, tidak ada yang perlu dimasukkan.
curl — POST /accounts
post accounts "$(jq -n --arg email "$EMAIL" --arg password "$MUSE_PASSWORD" '{email: $email, password: $password}')" | jq '{health, maxJobs, quota}'
Jawabannya menunjukkan health: "OK", maxJobs (default 10), serta paket dan pemakaian akun, di sini tier: "HATCH_FREE", paket gratis. Jika yang muncul justru 596, Meta meminta pemeriksaan keamanan: masuk sekali di muse.ai lewat browser, selesaikan pemeriksaannya, lalu kirim lagi email dan password yang sama.
2. Upload foto
POST /assets menerima file mentah sebagai body, hingga 50 MB, dan menuliskannya ke workspace Muse akun itu. Tidak ada yang disimpan di useapi.net. assetId di jawabannya adalah yang diterima job sebagai image_N.
curl — POST /assets
BMW=$(upload bmw.jpeg image/jpeg)
RIDER=$(upload rider.jpeg image/jpeg)
BEACH=$(upload beach.jpeg image/jpeg)
OLD_PHOTO=$(upload old-photo.jpeg image/jpeg)
PINK=$(upload pink-hair.jpeg image/jpeg)
echo "$BMW"
# user:12345-email:6578616d706c6540676d61696c2e636f6d-image:7db53e7a1f0979cbab6ff46ec3f0a35b60e6ee579a0d738a9628cf46a0c7a0f5.jpg
Lima input: motor, pengendara, pantai, potret lama dan pengendara kedua.
Asset id dibentuk dari isi file, jadi meng-upload file yang sama ke akun yang sama sekali lagi mengembalikan id yang sama dan tidak menulis apa pun.
3. Gambar dari teks
Muse tidak punya parameter rasio aspek: prompt yang menyebutkannya. Pertama, potret vertikal:
curl — POST /jobs/image
run portrait.json jobs/image "$(jq -n '{prompt: "Vertical 9:16 full-body portrait photo: a confident young woman biker with long wavy fiery red hair, green eyes and freckles, in a worn black leather jacket, dark jeans and boots, standing in a rain-soaked neon alley at dusk, looking straight at the camera, cinematic lighting, photorealistic."}')"
download "$(jq -r '.result.assets[0].assetId' portrait.json)" portrait.webp

Hasilnya tepat 9:16, 1152×2048. Versi lanskap yang diminta sebagai Cinematic 16:9 landscape photo: … kembali dalam 1920×1280, yang berarti 3:2. Menulis rasionya sebagai in exactly 16:9 aspect ratio memperbaikinya:
curl — POST /jobs/image
run bmw-noir.json jobs/image "$(jq -n '{prompt: "In exactly 16:9 aspect ratio (landscape), a cinematic photo of a vintage 1920s black BMW motorcycle with white pinstripes, spoked wheels and a brown leather saddle, parked on wet cobblestones at night in San Francisco, the Golden Gate Bridge glowing through fog in the distance, neo-noir moonlight, reflections on the wet street, shot on 35mm film."}')"
download "$(jq -r '.result.assets[0].assetId' bmw-noir.json)" bmw-noir.webp

Muse menjawab “That 16:9 frame with the bridge ghosting through the fog is pure neo-noir. Enjoy.” Balasannya ada di result.text.
4. Tiga foto menjadi satu gambar
Hingga 9 gambar bisa masuk ke satu job sebagai image_1..image_9, dan prompt menyebut nama mereka. Di sini motornya image_1, pengendaranya image_2, dan pantainya image_3. Prompt meminta Muse memakai pantai di foto apa adanya, sehingga Golden Gate Bridge tetap berada di posisi yang sama seperti di foto.
curl — POST /jobs/image
run beach-ride.json jobs/image "$(jq -n --arg bmw "$BMW" --arg rider "$RIDER" --arg beach "$BEACH" \
'{image_1: $bmw, image_2: $rider, image_3: $beach,
prompt: "In exactly 16:9 aspect ratio (landscape), a cinematic photo: the woman from image_2 (her face, long wavy red hair, light blue top and jeans) riding the exact vintage motorcycle from image_1 along the shoreline of the beach in image_3, the front wheel cutting through the shallow surf and throwing spray, bright afternoon sun, her hair streaming in the wind, photorealistic. Use the beach, rocks and Golden Gate Bridge from image_3 as the background exactly as photographed: same position, same orientation, not mirrored or redrawn. Keep her face and the motorcycle'\''s design exactly as in the images."}')"
BEACH_RIDE=$(jq -r '.result.assets[0].assetId' beach-ride.json)
download "$BEACH_RIDE" beach-ride.webp

31 detik, dan tidak ada perubahan yang terlihat di kuota mingguan.
5. Gambar menjadi video, tanpa upload ulang
BEACH_RIDE adalah id file buatan Muse. File itu sudah ada di workspace akun, jadi langsung masuk ke job berikutnya sebagai image_1, tanpa unduh dan tanpa upload. Animate image_1 membuat klip yang dimulai dari gambar itu dan mempertahankan bentuknya, dan kalimat dalam tanda kutip diucapkan.
curl — POST /jobs/video
run surf.json jobs/video "$(jq -n --arg img "$BEACH_RIDE" '{image_1: $img,
prompt: "Animate image_1 into a cinematic video in exactly 16:9 aspect ratio (landscape): she rides the vintage motorcycle along the shoreline, the front wheel slices through the shallow waves and sends spray flying, the old engine roars, she raises one fist and shouts with a laugh: \"Nothing beats this view!\" The camera tracks alongside her. The beach, the rocks and the Golden Gate Bridge stay exactly as in image_1 (same orientation). Keep her face and the motorcycle exactly as in image_1."}')"
SURF=$(jq -r '.result.assets[0].assetId' surf.json)
download "$SURF" surf.mp4
Juga di YouTube: 3 photos in, 1 talking video out: Meta Muse API from REST.
10 detik dalam 1280×720 dengan suara. Muse berkata “Done. 10 seconds, 16:9 landscape, straight from your image — no edits, no upscaling.”
Percobaan pertama job ini gagal setelah 37 detik: Muse menjawab bahwa “the video worker glitched out before it rendered anything, so no clip was made”. API melaporkan jawaban seperti itu sebagai 503, tidak ada yang dibuat, dan request yang sama berhasil saat dijalankan lagi. Penolakan karena konten adalah 403, dan butuh prompt yang berbeda.
6. Restorasi dan pewarnaan foto lama
Job gambar juga bisa memperbaiki gambar. Potret lama ini adalah foto sepia pudar berukuran 685×900 piksel, 3:4. Prompt mendaftar apa yang perlu diperbaiki dan menegaskan bingkai yang sama.
curl — POST /jobs/image
run restored.json jobs/image "$(jq -n --arg img "$OLD_PHOTO" '{image_1: $img,
prompt: "Restore the old photograph image_1 as a high-quality modern photo: remove the scratches, dust, stains, fading and grain, recover sharp detail in the face, hair and fabric, and colorize it naturally (warm natural skin tones, dark brown hair, ivory tulle shawl, a soft pink rose with green leaves, a muted warm background). Keep the exact same person, expression, pose, framing and crop, and the same portrait aspect ratio as image_1 (3:4, 685×900): do not crop, extend or reframe it."}')"
RESTORED=$(jq -r '.result.assets[0].assetId' restored.json)
download "$RESTORED" restored.webp
Hasilnya 1344×1792, bingkai 3:4 yang sama dengan ukuran sekitar dua kali lipat, dengan pose dan potongan yang sama. Muse berkata “Done — restored, de-grained, and colorized, same framing and pose.”
7. Potret menjadi hidup
Gambar hasil restorasi langsung masuk ke job video. Klip mempertahankan bentuk potret, jadi hasilnya 832×1104.
curl — POST /jobs/video
run portrait-video.json jobs/video "$(jq -n --arg img "$RESTORED" '{image_1: $img,
prompt: "Animate image_1 into a video with the same portrait frame: the young woman slowly lifts her eyes to the camera, her smile widens, she gently touches the rose on her shoulder and says softly: \"It has been a hundred years... and you still remember me.\" A light breeze moves a few strands of her hair, soft window light, the camera stays still with a very slow push-in. Keep her face exactly as in image_1."}')"
download "$(jq -r '.result.assets[0].assetId' portrait-video.json)" portrait.mp4
Juga di YouTube: This old portrait just spoke: one API call (Meta Muse API, third-party).
8. Ganti pengendara di video
Job video juga menerima video. video_1 adalah klip ombak dari langkah 5, dan image_1 adalah foto perempuan kedua berambut merah muda dengan dua cepol. Prompt meminta Muse mengganti pengendara dan mempertahankan semua yang lain, serta memberinya kalimat baru.
curl — POST /jobs/video
run swap.json jobs/video "$(jq -n --arg vid "$SURF" --arg img "$PINK" '{video_1: $vid, image_1: $img,
prompt: "Edit video_1: replace the rider with the woman from image_1 (her face, pink hair in two buns, colorful makeup and tattoos), and keep everything else the same: the motorcycle, the beach, the waves and spray, the Golden Gate Bridge, the light, the camera move and the timing. Instead of the original line she shouts: \"Catch me if you can, San Francisco!\" Keep the 16:9 frame and the same length."}')"
download "$(jq -r '.result.assets[0].assetId' swap.json)" swap.mp4
Dengan 138 detik, ini job paling lambat di panduan ini, dan karena itulah setiap job di sini berjalan async. Klipnya adalah perjalanan yang sama dengan perempuan lain di atas motor, meneriakkan kalimat baru. Muse berkata “Done. She’s in, 10 seconds, 16:9, same ride, same bridge, same waves.”
Juga di YouTube: Replace the person in a video, keep everything else: Meta Muse API.
9. Cek kuota mingguan
GET /accounts/email membaca paket dan pemakaian akun secara langsung:
curl — GET /accounts/email
get "accounts/$(enc "$EMAIL")" | jq '{session, quota}'
quota.percentUsed adalah bagian minggu yang sudah terpakai, dalam persen bulat, dan quota.resetsAt adalah waktu kuota dimulai ulang, seminggu setelah dimulai. Tiga video di atas masing-masing memakai 2 sampai 3 persen dan gambarnya 0 atau 1. Selama seluruh sesi uji, yang juga menjalankan dua job yang tidak ditampilkan di sini, akun gratis naik dari 16 ke 28 persen. Ketika kuota akun habis, job baru tanpa email diarahkan ke akun Anda yang lain, dan job yang dikunci ke akun itu dijawab 412 sampai resetsAt.
Yang kami pelajari
- Tulis rasio aspek sebagai
in exactly 16:9 aspect ratio.Cinematic 16:9 landscape photosekali kembali sebagai 3:2. - Setiap video sekitar 10 detik. Prompt yang meminta 5 detik tetap mendapat 10.
- Klip image-to-video mempertahankan bentuk gambarnya kecuali prompt meminta bentuk lain:
in exactly 9:16 aspect ratiomengubah gambar pantai 16:9 kami menjadi klip vertikal 720×1280, dibingkai ulang, bukan ditarik. - Kalimat yang ditulis dalam tanda kutip di prompt video akan diucapkan.
- Teruskan file hasil generate lewat
assetId. File itu tetap di workspace akun, jadi rangkaian edit tidak butuh unduhan di antaranya. - Sebutkan apa yang harus tetap sama. “Same position, same orientation, not mirrored or redrawn” mempertahankan pantai asli di gambar gabungan.
503dengan kata-kata Muse sendiri seperti “glitched out” layak dijalankan lagi.403adalah penolakan dan butuh prompt yang berbeda.- Kirim video dengan
async: true. Request sync menunggu sekitar 100 detik, sedangkan penggantian pengendara butuh 138.
Membuat Short 30 detik bernarasi (skrip, tiga adegan, satu penggabungan)
Video Muse selalu sekitar 10 detik, jadi Short vertikal 30 detik dengan narator butuh tiga job video dan dua chat. Satu chat menulis skrip dalam JSON, tiga job video berjalan berdampingan, satu per adegan, masing-masing mengucapkan kalimatnya dengan suara narator yang sama, dan chat terakhir menggabungkan klip-klip itu dengan ffmpeg di workspace akun itu sendiri. Short di bawah, tentang letusan Gunung Tambora tahun 1815 dan “tahun tanpa musim panas” sesudahnya, berubah dari topik satu baris menjadi MP4 dalam sekitar 2 menit.
Juga di YouTube: A narrated 30-second Short made only with Meta Muse API calls.
Tiga klip 10 detik yang digabung menjadi satu Short 720×1280 berdurasi 30 detik, dari topik “how a single volcano cooled the whole planet in 1816”.
Skripnya butuh 11 detik, ketiga klip 75, 75 dan 87 detik yang berjalan bersamaan, dan penggabungannya 20 detik, jadi satu Short butuh sekitar 2 sampai 3 menit. Short ini dibuat di paket Muse berbayar. Di sana, empat video dalam sesi uji itu (tiga ini dan satu lagi) menggeser angka mingguan total 2 poin, dan chat tidak menggesernya sama sekali. Di paket gratis satu video memakai 2 sampai 3 persen dari kuota mingguan, jadi Short tiga adegan berbiaya sekitar 6 sampai 9 persen di sana.
Tanpa kode: alur yang sama tersedia sebagai aplikasi n8n, template Narrated Faceless Shorts, dengan formulir, halaman skrip, dan penyimpanan ke Google Drive. Dua Short buatannya, dipublikasikan apa adanya: The Great Pyramid was once bright white dan Why honey never spoils, yang disuarakan dengan text to speech Muse.
Seluruh alur ini juga ada sebagai satu skrip, dalam Node.js dan Python: narrated-short/ di useapi/muse-api. Skrip ini menerima topik, dan jika perlu jumlah adegan serta deskripsi narator Anda sendiri, lalu menyimpan Short-nya ke output/.
Langkah-langkahnya memakai helper di atas ditambah chat, yang memulai chat dan membaca GET /chats/chatId sampai Muse selesai:
Buka helper chat
# mulai chat, polling GET /chats/{chatId} setiap 8 detik sampai Muse selesai, simpan chat ke $1
chat() {
local id c
id=$(post chats "$2" | jq -r .chatId)
while sleep 8; do
c=$(get "chats/$(enc "$id")")
jq -e '.pendingApprovals | length > 0' <<< "$c" > /dev/null &&
echo "Muse asks for permission: answer it with POST /chats/{chatId}/approvals/{approvalId}"
jq -e '(.status | IN("completed", "interrupted", "failed")) and (.pendingApprovals | length == 0)' <<< "$c" > /dev/null && break
done
echo "$c" > "$1"
jq '{status, reply: ([.messages[] | select(.role == "assistant" and .text != "")][-1].text)}' "$1"
}
Setiap request di bawah menetapkan email. Chat yang menerima file harus berjalan di akun yang menyimpan file itu, jadi ketiga klip dan penggabungannya tetap di satu akun.
1. Tulis skrip dalam JSON
Chat pertama meminta tepat tiga adegan dan merinci bentuk JSON-nya. Setiap adegan punya line, yang diucapkan narator, dibatasi 25 kata supaya muat dalam 10 detik, dan visual, satu kalimat yang menggambarkan shot-nya. Prompt juga meminta Muse untuk tidak membuat file apa pun, jadi chat tetap berisi teks saja.
curl — POST /chats
TOPIC="how a single volcano cooled the whole planet in 1816"
chat script.json "$(jq -n --arg email "$EMAIL" --arg topic "$TOPIC" '{email: $email,
message: "Write a script for a 30-second faceless YouTube Short about: \"\($topic)\". Exactly 3 scenes. Reply with ONLY a JSON object, no prose, no markdown code fences, in this exact shape: {\"title\": string, \"scenes\": [{\"line\": string, \"visual\": string}, {\"line\": string, \"visual\": string}, {\"line\": string, \"visual\": string}]}. \"line\" is what the off-screen narrator says (at most 25 words, about 9 seconds spoken). \"visual\" is a one-sentence description of the 10-second shot, no people talking on camera. Do not create any files, images or videos."}')"
jq -r '[.messages[] | select(.role == "assistant" and .text != "")][-1].text' script.json | sed '/^```/d' > scenes.json
jq . scenes.json
Muse menjawab dalam 11 detik dengan JSON saja:
{
"title": "How One Volcano Cooled the Whole Planet in 1816",
"scenes": [
{
"line": "In April 1815, Mount Tambora in Indonesia erupted, the largest explosion in recorded history, blasting ash forty kilometers into the sky.",
"visual": "A massive volcanic eruption at dawn, with a towering ash column rising into the stratosphere above a dark island."
},
{
"line": "That ash veil circled Earth, blocking sunlight and dropping global temperatures, turning summer into winter across North America and Europe.",
"visual": "An animated globe wrapped in a gray haze as sunlight dims and frost spreads across continents."
},
{
"line": "1816 became the Year Without a Summer: crops failed, snow fell in July, and famine spread as the planet shivered.",
"visual": "Snow falling over green farmland in summer, covering withered crops and empty village fields under a pale sun."
}
]
}
Kami menjalankan prompt yang sama untuk tiga topik dan selalu mendapat JSON yang bersih, dalam 11 sampai 29 detik, tanpa code fence dan tanpa teks tambahan. Itu sampel kecil, jadi sed tetap membuang baris fence ``` yang nyasar, dan skrip di GitHub meminta sekali lagi jika balasannya tidak bisa di-parse.
2. Tiga adegan sekaligus
Setiap adegan menjadi satu POST /jobs/video async. Ketiga prompt membawa deskripsi narator yang sama, kata demi kata, diikuti The narrator says exactly: "<line>". Muse mengucapkan kalimat dalam tanda kutip persis seperti yang ditulis, dan deskripsi yang sama menjaga suara tetap konsisten dari klip ke klip. Vertical 9:16 video kembali dalam 720×1280.
curl — POST /jobs/video
NARRATOR="Narration: one off-screen narrator only, the same voice throughout: a calm, deep, middle-aged British male documentary narrator, measured pace, warm and authoritative, like a nature documentary. Nobody on screen speaks. No music."
for i in 0 1 2; do
post jobs/video "$(jq --arg email "$EMAIL" --arg narrator "$NARRATOR" --argjson i $i '.scenes[$i] | {email: $email, async: true,
prompt: "Vertical 9:16 video, about 10 seconds. \(.visual) Slow cinematic camera move, photoreal. \($narrator) The narrator says exactly: \"\(.line)\""}' scenes.json)" | jq -r .jobid
done > jobs.txt
Setiap POST langsung menjawab 201 dengan jobid. Ketiga job memakai tiga slot maxJobs akun (default 10), jadi semuanya berjalan berdampingan. 429 di sini berarti semua slot sedang terpakai dan tidak ada yang dimulai: kirim ulang job itu dalam 30 detik.
3. Polling job
GET /jobs/jobid menjawab status: "started" sampai klipnya siap. Job berjalan paralel, jadi membacanya satu per satu tidak menambah waktu:
curl — GET /jobs/jobid
for n in 1 2 3; do
id=$(sed -n "${n}p" jobs.txt)
until job=$(get "jobs/$(enc "$id")"); [ "$(jq -r .status <<< "$job")" != started ]; do sleep 10; done
echo "$job" > clip$n.json
jq '{status, error, text: .result.text, asset: .result.assets[0].assetId}' clip$n.json
done
Ketiganya selesai. Tentang klip pertama Muse berkata “Here it is — vertical 9:16, photoreal volcanic eruption at dawn with the narration as specified”. Setiap klip mengucapkan kalimatnya kata demi kata, dan setiap kalimat, sepanjang 20 sampai 21 kata, muat dalam 10 detiknya. Job yang gagal dengan 503 tidak membuat apa pun dan bisa dijalankan lagi. Kegagalan lain, seperti penolakan 403, perlu dicek dulu di error.message.
4. Gabungkan klip dalam satu chat
Ketiga id klip masuk ke satu chat sebagai files, dan di sana Muse melihatnya sebagai video_1, video_2 dan video_3. Pesannya meminta ffmpeg, urutan, audio dan nama file, lalu diakhiri dengan No public links. Dengan baris itu, Muse tidak berhenti untuk meminta izin.
curl — POST /chats
CLIPS=$(jq -s '[.[].result.assets[0].assetId]' clip1.json clip2.json clip3.json)
chat join.json "$(jq -n --arg email "$EMAIL" --argjson files "$CLIPS" '{email: $email, files: $files,
message: "Concatenate video_1, video_2, video_3 in order into one MP4 with ffmpeg, keep the audio, save it to workspace/your_files/short.mp4 and attach it here. No public links."}')"
SHORT=$(jq -r '[.messages[] | select(.role == "assistant") | .files[] | select(.type == "video")][-1].assetId' join.json)
echo "$SHORT"
# user:12345-email:6578616d706c6540676d61696c2e636f6d-video:ws~your_files~short.mp4
20 detik kemudian Muse berkata “Concatenated all three in order — 30 seconds, 720x1280, with audio kept.” dan melampirkan file itu sebagai pesan tersendiri, satu video di files-nya. Asset id-nya dinamai menurut path workspace, jadi beri setiap Short nama file sendiri. ffmpeg menyalin stream tanpa meng-encode ulang: Short-nya tepat 30,0 detik, dan ketiga kalimat ada di dalamnya, berurutan.
5. Unduh Short-nya
GET /assets/assetId mengembalikan MP4:
curl — GET /assets/assetId
download "$SHORT" tambora-short.mp4
Klip dan Short-nya juga tetap tersimpan di workspace Muse akun, tempat aplikasi muse.ai menampilkannya, dan asset id Short bisa masuk ke job berikutnya sebagai video_1.
Suara yang tetap: text to speech sebagai audio_1
Deskripsi yang sama memberi jenis suara yang sama, bukan suara yang terkunci. Di tiga klip Tambora, nada median narator 105 sampai 117 Hz, berselisih kurang dari dua semitone, tetapi Muse menyuarakan setiap klip dari awal. Untuk satu suara yang pasti sama, minta Muse mengucapkan setiap kalimat dengan text to speech-nya lebih dulu, lalu kirim MP3 itu ke job video sebagai audio_1. Chat text to speech butuh 20 detik dalam uji kami.
curl — POST /chats dan POST /jobs/video
chat voice1.json "$(jq -n --arg email "$EMAIL" --arg line "$(jq -r '.scenes[0].line' scenes.json)" '{email: $email,
message: "Generate one mp3 file with text to speech: single speaker, voice Aria (avocado_v2:MAI_01), speed 100, language en, clean narration only: no music, no sound effects. Read exactly this text, do not change any word:\n\"\($line)\"\nSave it directly in workspace/your_files/ (not in a subfolder) as line-1.mp3 and attach it here. No public links and no uploads to remote storage."}')"
VOICE1=$(jq -r '[.messages[] | select(.role == "assistant") | .files[] | select(.type == "audio")][-1].assetId' voice1.json)
run clip1.json jobs/video "$(jq --arg email "$EMAIL" --arg voice "$VOICE1" '.scenes[0] | {email: $email, audio_1: $voice,
prompt: "Vertical 9:16 video, about 10 seconds, no people on screen and nobody speaking on camera. \(.visual) Slow cinematic camera move, photoreal. Use audio_1 as the narration soundtrack exactly as it is: the off-screen narrator'\''s voice in audio_1, word for word, with no other voice and no new speech. Quiet ambient sound under it is fine."}' scenes.json)"
jq -r '.result.assets[] | select(.origin == "made") | .assetId' clip1.json
Muse membuat klipnya lalu menempelkan audio_1 ke klip itu dengan ffmpeg. Job mencantumkan kedua file: salinan jadi lebih dulu, dengan origin: "made", dan klip mentah Muse sesudahnya, dengan origin: "generated". Ambil yang made. Klip mentah membawa suara karangan Muse, bukan suara Anda. Job video ini butuh 108 detik dalam uji kami. Ulangi untuk setiap adegan dan gabungkan klip made seperti di langkah 4.
Pertanyaan yang sering diajukan
Apakah ada API untuk Meta Muse (muse.ai)? Lewat useapi.net, ada: Muse API adalah API pihak ketiga yang menjalankan Muse di langganan situs Muse Anda. Buat gambar dengan POST /jobs/image dan video dengan POST /jobs/video. Model API resmi Meta menjual model Muse Image seharga $0,01 per gambar, tetapi per Oktober 2026 API itu tidak punya pembuatan video dan tidak ada API untuk agen Muse di muse.ai, tempat video dibuat. Perbandingan Meta Muse video API kami (bahasa Inggris) juga membahas muse2api.
Apakah bisa dipakai di paket Muse gratis? Lewat useapi.net, bisa: panduan ini dibuat di paket gratis (HATCH_FREE), yang punya kuota mingguan. Satu video memakai 2 sampai 3 persen kuota itu dan satu gambar 0 sampai 1 persen, jadi satu akun gratis membuat sekitar 30 sampai 50 video per minggu. Paket berbayar Power ($20 per bulan) dan Maximum ($100 per bulan) menaikkan kuotanya (per Oktober 2026).
Bisakah Muse membuat video lebih dari 10 detik? Lewat useapi.net, tidak dalam satu job: setiap video sekitar 10 detik. Buat satu klip per adegan dan minta chat menggabungkannya dengan ffmpeg, seperti di Membuat Short 30 detik bernarasi, tempat tiga klip menjadi satu Short dalam sekitar 2 sampai 3 menit. Satu chat menerima hingga 3 video.
Bagaimana mengatur rasio aspek, durasi atau resolusi? Lewat useapi.net, di prompt, karena Muse tidak punya parameter untuk itu. Rasio aspek diikuti jika ditulis sebagai in exactly 16:9 aspect ratio, dan klip image-to-video mempertahankan bentuk gambarnya kecuali prompt meminta bentuk lain. Durasi dan resolusi tetap: setiap video kembali sekitar 720p dengan suara, apa pun yang diminta prompt.
Bisakah saya memakai foto dan video sendiri? Lewat useapi.net, bisa: upload dengan POST /assets, hingga 50 MB per file, dan kirim assetId-nya sebagai image_1..image_9, sama seperti Anda mengirim hasil dari job sebelumnya. Job video juga menerima video_1..video_3 dan audio_1..audio_3. Semua input untuk satu job harus berada di akun yang sama.
Bagaimana membuat foto berbicara? Lewat useapi.net, kirim foto sebagai image_1 ke POST /jobs/video dengan prompt seperti Animate image_1: … she says softly: "…". Muse mempertahankan bentuk foto dan mengucapkan kalimat dalam tanda kutip, seperti di langkah 7, tempat potret berusia seratus tahun yang sudah direstorasi mengangkat pandangannya dan berbicara.
Bisakah mengganti orang di dalam video? Lewat useapi.net, bisa: kirim klip sebagai video_1 dan foto orang baru sebagai image_1, lalu minta Muse mengganti orangnya dan mempertahankan semua yang lain, seperti di langkah 8. Sebutkan apa yang harus tetap sama, seperti perjalanan, jembatan dan ombaknya, dan beri orang baru itu kalimat dalam tanda kutip jika ia perlu berbicara.
Mengapa request sync saya mengembalikan 202? Lewat useapi.net, 202 berarti job masih berjalan setelah sekitar 100 detik, dan job itu tetap berjalan di sisi kami. Ambil hasilnya dengan GET /jobs/jobid, kirim job yang lama dengan async: true lalu lakukan polling, atau tambahkan replyUrl agar record job yang selesai dikirim ke Anda. Dalam uji kami, satu video butuh 68 sampai 138 detik.
Mengapa Muse mengirimi saya kode login lewat email? Lewat useapi.net, API masuk ke akun Muse Anda, yang terjadi saat Anda menambahkannya dan saat API memperbarui sesi 30 hari, sebelum kedaluwarsa atau kapan pun Muse meminta login baru. Muse mengirim kode login lewat email di setiap login, dan tidak ada yang perlu dilakukan dengan kode itu. Lihat Setup Muse.
Apa bedanya dengan muse2api? Lewat useapi.net, Muse API di-hosting, jadi tidak ada yang perlu di-deploy: Anda menambahkan setiap akun dengan email dan password-nya, dan kami menjaganya tetap login. Hasil dirangkai lewat asset id, dan job yang selesai bisa memanggil webhook Anda. Anda juga bisa chat dengan agen Muse, dengan jawabannya di-stream secara langsung. muse2api adalah proyek yang Anda deploy, host dan jalankan sendiri.
Kesimpulan
Kunjungi Server Discord atau
Channel Telegram kami untuk pertanyaan dan masalah dukungan.
Lihat repo GitHub kami berisi contoh kode.
Panggilan yang sama tersedia sebagai tools di MCP server Muse yang di-hosting, untuk Claude Code, Cursor dan VS Code.
Dipublikasikan juga di
Juga dipublikasikan di dev.to, didiskusikan di Reddit, dibagikan di Bluesky, dan di YouTube sebagai demo 2:49 seluruh API. Semuanya dalam bahasa Inggris.
Mulai memakai API
Satu langganan US$15/bulan mencakup semua API di useapi.net: satu token untuk semua layanan. Di setiap layanan Anda bisa menghubungkan hingga 3 akun milik Anda sendiri, dan useapi.net menangani REST API, load balancing, dan polling. Butuh lebih banyak akun? Setiap langganan tambahan US$10/bulan dan menambah 3 akun lagi per layanan.
Tidak punya kartu kredit internasional? Anda bisa berlangganan dengan kripto (pembayaran kripto tidak bisa di-refund). Harga dan paket volume ada di halaman langganan. Jika membayar lewat Stripe, Anda mendapat refund penuh dalam 14 hari sejak pembelian pertama, selama jumlah generasi yang berhasil kurang dari 50. Sudah berlangganan? Ubah jumlahnya di Stripe Customer Portal, tidak perlu membeli lagi.





