HeavenMotioon API & MCP
Semua model video, gambar, dan audio HeavenMotioon lewat satu REST API — atau langsung dari Claude, Cursor, dan VS Code lewat server MCP. Satu API key, saldo kredit yang sama dengan Studio.
Mulai cepat
- 1
Buat API key
Di Dashboard → API & MCP.
- 2
Panggil API
POST /generations, lalu cek statusnya.
- 3
Atau pakai MCP
Tempel config ke Claude / Cursor.
curl https://your-domain.com/api/v1/generations \
-H "Authorization: Bearer hm_sk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "flux-2-pro",
"prompt": "matte black perfume bottle, gold cap, studio light",
"aspect_ratio": "16:9"
}'
# then check it (holds up to 30 s while it is processing)
curl "https://your-domain.com/api/v1/generations/GENERATION_ID?wait=30" \
-H "Authorization: Bearer hm_sk_YOUR_KEY"Autentikasi
Kirim API key di header Authorization setiap request. Key diawali hm_sk_ dan bisa dibuat/dicabut di Dashboard → API & MCP.
Authorization: Bearer hm_sk_YOUR_KEYJangan pernah menaruh key di kode front-end atau repo publik. Panggil API dari server-mu. Key yang bocor langsung cabut di dashboard.
Base URL: https://your-domain.com/api/v1
Model
/api/v1/modelsDaftar model yang tersedia. Tidak butuh API key. Filter dengan ?kind=image|video|audio.
| model | kind | Harga (kredit) |
|---|---|---|
seedance-2.5 Seedance 2.5 | video | 49.7/s · 5–30s |
kling-3.0 Kling 3.0 | video | 14.2/s · 5–15s |
veo-3.1 Veo 3.1 | video | 4s 192 · 6s 288 · 8s 384 |
sora-2-pro Sora 2 Pro | video | 4s 144 · 8s 288 · 12s 432 |
runway-gen-4.5 Runway Gen-4.5 | video | 5s 73 · 8s 116 · 10s 145 |
wan-3.0 Wan 3.0 | video | 12/s · 5–30s |
veo-3.1-fast Veo 3.1 Fast | video | 4s 72 · 6s 108 · 8s 144 |
kling-2.5-turbo Kling 2.5 Turbo | video | 5s 30 · 10s 59 |
seedance-1.5-pro Seedance 1.5 Pro | video | 6.3/s · 5–12s |
luma-ray-2 Luma Ray 2 | video | 5s 86 · 9s 154 |
pika Pika | video | 5s 20 · 10s 39 |
ltx-2-pro LTX-2 Pro | video | 6s 44 · 8s 59 · 10s 73 |
minimax-h3-turbo MiniMax H3 Turbo | video | 4.2/s · 5–15s |
hailuo Hailuo 2.3 Pro | video | 58 |
grok-imagine-video Grok Imagine | video | 21.8/s · 5–15s |
hunyuan-video Hunyuan Video | video | 49 |
boreal Boreal | video | 1.1/s · 5–20s |
nano-banana-pro Nano Banana Pro | image | 18 |
gpt-image-2 GPT Image 2 | image | 26 |
flux-2-pro FLUX 2 Pro | image | 4 |
seedream Seedream 5 Pro | image | 17 |
ideogram-4.5 Ideogram 4.5 | image | 11 |
recraft-v4.1 Recraft V4.1 | image | 5 |
nano-banana-2 Nano Banana 2 | image | 8 |
flux-2-max FLUX 2 Max | image | 6 |
grok-imagine-image Grok Imagine | image | 4 |
qwen-image-2.1 Qwen Image 2.1 | image | 3 |
seedream-4.5 Seedream 4.5 | image | 4 |
luma-photon Luma Photon | image | 3 |
krea-2 Krea 2 | image | 8 |
z-image-turbo Z-Image Turbo | image | 1 |
music-v1 ElevenLabs Music | audio | 37 |
voice-v1 Eleven v4 Voiceover | audio | 5 |
lyria-3.5 Lyria 3.5 | audio | 11 |
sfx-v1 Sound Effects | audio | 15 |
voice-v3 Eleven v3 Expressive | audio | 13 |
gemini-tts Gemini TTS | audio | 2 |
voiceai-tts Voice.ai TTS | audio | 0.4/s · 1–120s |
Buat generasi
/api/v1/generationsMemulai generasi dan langsung mengembalikan objek dengan status processing (HTTP 201). Setiap generasi memotong kredit sesuai harga model (lihat GET /api/v1/models); kalau gagal, kreditnya dikembalikan otomatis.
modelrequired | string | ID model, mis. seedance-2.5 atau flux-2-pro. |
promptrequired | string | Deskripsi yang ingin dibuat, maks 2000 karakter. |
aspect_ratio | string | 1:1 · 16:9 · 9:16 · 4:3 · 3:4 (gambar & video) |
duration | integer | Detik, khusus video. Dibulatkan ke durasi terdekat yang didukung model; durasi itulah yang ditagih. |
webhook_url | string | URL https yang kami POST saat selesai. |
kind | string | Opsional; kalau diisi harus cocok dengan model. |
image_id | string | Mulai dari gambar (image-to-video, edit gambar): ID dari POST /api/v1/uploads. Hanya untuk model dengan accepts_image: true. |
Unggah gambar referensi dulu ke POST /api/v1/uploads (multipart, field file; JPEG, PNG atau WebP, maks 4 MB), lalu kirim id-nya sebagai image_id. Harga sama dengan tanpa gambar kecuali model menyebut image_credits.
curl -X POST https://your-domain.com/api/v1/uploads \
-H "Authorization: Bearer hm_sk_…" \
-F "[email protected]"
# → { "id": "cmh1…", "object": "upload", … }
curl -X POST https://your-domain.com/api/v1/generations \
-H "Authorization: Bearer hm_sk_…" \
-H "Content-Type: application/json" \
-d '{"model":"kling-3.0","prompt":"the product slowly turns, soft studio light","duration":5,"image_id":"cmh1…"}'Header opsional Idempotency-Key: kirim ulang request yang sama (mis. karena timeout) tanpa membuat generasi (dan memotong kredit) dua kali. Balasan ulangan membawa header Idempotent-Replayed: true.
{
"id": "cmg8x2…",
"object": "generation",
"kind": "image",
"model": "flux-2-pro",
"prompt": "matte black perfume bottle, gold cap, studio light",
"status": "processing",
"output_url": null,
"error": null,
"source": "api",
"created_at": "2026-10-10T08:00:00.000Z",
"updated_at": "2026-10-10T08:00:00.000Z",
"estimated_seconds": 30
}Cek generasi
/api/v1/generations/{id}Status: processing → succeeded atau failed. Saat succeeded, output_url berisi link file (gambar/video/audio) yang disimpan di server kami.
Tambahkan ?wait=30 (maks 50) agar request ditahan sampai generasi selesai atau waktu habis — lebih hemat daripada polling cepat. Gambar biasanya selesai < 1 menit, video 1–5 menit.
curl "https://your-domain.com/api/v1/generations/GENERATION_ID?wait=30" \
-H "Authorization: Bearer hm_sk_YOUR_KEY"Daftar generasi
/api/v1/generationsTerbaru dulu, termasuk yang dibuat di Studio. Parameter: limit (1–100, default 20) dan cursor (isi dengan next_cursor dari halaman sebelumnya).
{
"object": "list",
"data": [ { "id": "cmg8x2…", "object": "generation", "status": "succeeded", … } ],
"has_more": true,
"next_cursor": "cmg8wq…"
}Akun & kredit
/api/v1/accountPaket aktif dan sisa kredit pemilik key. Kredit isi ulang (topup_*) dipakai setelah kredit paket habis; total_credits_left adalah semua yang bisa dipakai sekarang.
{
"object": "account",
"email": "[email protected]",
"plan": "pro",
"status": "active",
"active": true,
"credits": 3300,
"credits_used": 412,
"credits_left": 2888,
"period_end": "2026-11-09T08:00:00.000Z",
"topup_credits_left": 300,
"topup_expires_at": "2027-10-12T08:00:00.000Z",
"total_credits_left": 3188
}Webhooks
Isi webhook_url saat membuat generasi dan kami akan mengirim POST ketika generasi selesai — tanpa perlu polling. Event: generation.succeeded, generation.failed. Balas dengan HTTP 2xx; kalau gagal kami coba lagi 2× (setelah 10 detik dan 1 menit).
POST https://your-app.com/webhooks/heavenmotioon
HeavenMotioon-Event: generation.succeeded
HeavenMotioon-Signature: t=1791600000,v1=5f2c…
{
"id": "evt_9c1e…",
"type": "generation.succeeded",
"created": 1791600000,
"data": {
"generation": {
"id": "cm…",
"object": "generation",
"kind": "video",
"model": "seedance-2.5",
"prompt": "neon city at night, drone shot",
"status": "succeeded",
"output_url": "https://…/api/media/cm….mp4",
"error": null,
"source": "api",
"created_at": "2026-10-10T08:00:00.000Z",
"updated_at": "2026-10-10T08:02:41.000Z"
}
}
}Verifikasi setiap request: header HeavenMotioon-Signature berisi t=<unix>,v1=<hex>, yaitu HMAC-SHA256 dari `${t}.${raw_body}` dengan webhook secret (whsec_…) dari dashboard. Tolak yang lebih tua dari 5 menit.
import crypto from "node:crypto";
// Use the RAW request body (e.g. express.raw({ type: "application/json" })).
export function verifyHeavenMotioon(rawBody, header, secret) {
const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
const t = Number(parts.t);
if (!Number.isFinite(t) || Math.abs(Date.now() / 1000 - t) > 300) return false; // 5 min tolerance
const expected = crypto
.createHmac("sha256", secret)
.update(`${parts.t}.${rawBody}`)
.digest("hex");
const given = String(parts.v1 ?? "");
return given.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(given), Buffer.from(expected));
}MCP server
Model Context Protocol membuat AI assistant bisa memakai HeavenMotioon sebagai tool. Setelah tersambung, cukup minta dalam bahasa biasa — misalnya "buatkan poster kopi gaya retro 4:3".
Endpoint
https://your-domain.com/api/mcp
Transport
Streamable HTTP
Auth
OAuth 2.1 · Bearer hm_sk_…
Login lewat browser — tidak perlu API key. Butuh domain https publik.
claude.ai → Settings → Connectors → Add custom connector
ChatGPT → Settings → Apps & Connectors → Create (developer mode)
Name : HeavenMotioon
URL : https://your-domain.com/api/mcp
Klik Connect → login HeavenMotioon → Izinkan.claude.ai, ChatGPT, dan Claude Code bisa login lewat browser (OAuth) — tidak perlu menyalin API key. Klien lain cukup pakai header Authorization dengan API key. Claude Desktop memakai jembatan mcp-remote (butuh Node.js).
OAuth
Untuk developer yang membangun klien MCP sendiri: server ini mengikuti spesifikasi otorisasi MCP — OAuth 2.1 dengan PKCE (S256), Dynamic Client Registration (RFC 7591) atau Client ID Metadata Document, refresh token yang dirotasi, dan scope mcp. Request tanpa token dijawab 401 dengan header WWW-Authenticate yang menunjuk ke metadata berikut.
https://your-domain.com/.well-known/oauth-protected-resource/api/mcp
https://your-domain.com/.well-known/oauth-authorization-server
authorize https://your-domain.com/oauth/authorize
token https://your-domain.com/api/oauth/token
register https://your-domain.com/api/oauth/register
revoke https://your-domain.com/api/oauth/revokeAccess token berlaku 1 jam, refresh token 30 hari. Token OAuth hanya berlaku untuk /api/mcp; REST API tetap memakai API key.
Tools
generate_image | prompt, model?, aspect_ratio?, image_id?, wait_seconds? | Buat gambar; menunggu hasil (≤ 45 dtk) dan menampilkannya. |
generate_video | prompt, model?, duration?, aspect_ratio?, image_id? | Mulai video (kredit per detik); kembalikan id. |
generate_audio | prompt, model? | Musik (music-v1) atau voiceover (voice-v1). |
upload_image | url | data | Unggah gambar referensi (URL publik atau base64; JPEG, PNG, WebP, maks 4 MB); kembalikan image_id. |
get_generation | id, wait_seconds? | Status & URL hasil; bisa menunggu ≤ 50 dtk. |
list_generations | limit? | Kreasi terbaru. |
list_models | kind? | Daftar model. |
get_account | — | Paket & sisa kredit. |
Error & limit
Semua error berbentuk { "error": { "code": "…", "message": "…" } }.
| HTTP | code | Arti |
|---|---|---|
| 400 | invalid_request | Body atau parameter tidak valid. |
| 400 | model_not_found | ID model tidak dikenal. |
| 401 | unauthorized | Key tidak ada, salah, atau sudah dicabut. |
| 402 | no_active_plan | Video butuh paket aktif. |
| 402 | free_model_only | Paket Free hanya bisa membuat video dengan model boreal (maks 5 detik). |
| 402 | google_required | Video gratis butuh akun yang terverifikasi Google; masuk sekali dengan Google atau pilih paket. |
| 402 | insufficient_credits | Kredit tidak cukup untuk generasi ini. |
| 404 | not_found | Generasi tidak ditemukan. |
| 429 | rate_limited | Terlalu banyak request — lihat header Retry-After. |
| 502 | generation_failed | Provider AI gagal memulai; kreditnya dikembalikan. |
- • 12 generasi per menit per akun (Studio, API, dan MCP berbagi batas ini).
- • 120 request per menit per key untuk endpoint lain.
- • Generasi yang macet lebih dari 45 menit ditandai failed dan kreditnya dikembalikan.
Siap mencoba?
Buat key pertamamu dalam 10 detik.