Baru: paket tahunan. Bayar 10 bulan, pakai 12 bulan, cukup sekali bayar pakai QRIS.Lihat harga
Docs

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. 1

    Buat API key

    Di Dashboard → API & MCP.

  2. 2

    Panggil API

    POST /generations, lalu cek statusnya.

  3. 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.

HTTP
Authorization: Bearer hm_sk_YOUR_KEY

Jangan 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

GET/api/v1/models

Daftar model yang tersedia. Tidak butuh API key. Filter dengan ?kind=image|video|audio.

modelkindHarga (kredit)
seedance-2.5 Seedance 2.5video49.7/s · 5–30s
kling-3.0 Kling 3.0video14.2/s · 5–15s
veo-3.1 Veo 3.1video4s 192 · 6s 288 · 8s 384
sora-2-pro Sora 2 Provideo4s 144 · 8s 288 · 12s 432
runway-gen-4.5 Runway Gen-4.5video5s 73 · 8s 116 · 10s 145
wan-3.0 Wan 3.0video12/s · 5–30s
veo-3.1-fast Veo 3.1 Fastvideo4s 72 · 6s 108 · 8s 144
kling-2.5-turbo Kling 2.5 Turbovideo5s 30 · 10s 59
seedance-1.5-pro Seedance 1.5 Provideo6.3/s · 5–12s
luma-ray-2 Luma Ray 2video5s 86 · 9s 154
pika Pikavideo5s 20 · 10s 39
ltx-2-pro LTX-2 Provideo6s 44 · 8s 59 · 10s 73
minimax-h3-turbo MiniMax H3 Turbovideo4.2/s · 5–15s
hailuo Hailuo 2.3 Provideo58
grok-imagine-video Grok Imaginevideo21.8/s · 5–15s
hunyuan-video Hunyuan Videovideo49
boreal Borealvideo1.1/s · 5–20s
nano-banana-pro Nano Banana Proimage18
gpt-image-2 GPT Image 2image26
flux-2-pro FLUX 2 Proimage4
seedream Seedream 5 Proimage17
ideogram-4.5 Ideogram 4.5image11
recraft-v4.1 Recraft V4.1image5
nano-banana-2 Nano Banana 2image8
flux-2-max FLUX 2 Maximage6
grok-imagine-image Grok Imagineimage4
qwen-image-2.1 Qwen Image 2.1image3
seedream-4.5 Seedream 4.5image4
luma-photon Luma Photonimage3
krea-2 Krea 2image8
z-image-turbo Z-Image Turboimage1
music-v1 ElevenLabs Musicaudio37
voice-v1 Eleven v4 Voiceoveraudio5
lyria-3.5 Lyria 3.5audio11
sfx-v1 Sound Effectsaudio15
voice-v3 Eleven v3 Expressiveaudio13
gemini-tts Gemini TTSaudio2
voiceai-tts Voice.ai TTSaudio0.4/s · 1–120s

Buat generasi

POST/api/v1/generations

Memulai 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.

modelrequiredstringID model, mis. seedance-2.5 atau flux-2-pro.
promptrequiredstringDeskripsi yang ingin dibuat, maks 2000 karakter.
aspect_ratiostring1:1 · 16:9 · 9:16 · 4:3 · 3:4 (gambar & video)
durationintegerDetik, khusus video. Dibulatkan ke durasi terdekat yang didukung model; durasi itulah yang ditagih.
webhook_urlstringURL https yang kami POST saat selesai.
kindstringOpsional; kalau diisi harus cocok dengan model.
image_idstringMulai 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.

Contoh · gambar jadi video
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.

Respons · 201
{
  "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

GET/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
curl "https://your-domain.com/api/v1/generations/GENERATION_ID?wait=30" \
  -H "Authorization: Bearer hm_sk_YOUR_KEY"

Daftar generasi

GET/api/v1/generations

Terbaru dulu, termasuk yang dibuat di Studio. Parameter: limit (1–100, default 20) dan cursor (isi dengan next_cursor dari halaman sebelumnya).

Respons
{
  "object": "list",
  "data": [ { "id": "cmg8x2…", "object": "generation", "status": "succeeded", … } ],
  "has_more": true,
  "next_cursor": "cmg8wq…"
}

Akun & kredit

GET/api/v1/account

Paket aktif dan sisa kredit pemilik key. Kredit isi ulang (topup_*) dipakai setelah kredit paket habis; total_credits_left adalah semua yang bisa dipakai sekarang.

Respons
{
  "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).

Contoh pengiriman
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.

Discovery
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/revoke

Access token berlaku 1 jam, refresh token 30 hari. Token OAuth hanya berlaku untuk /api/mcp; REST API tetap memakai API key.

Tools

generate_imageprompt, model?, aspect_ratio?, image_id?, wait_seconds?Buat gambar; menunggu hasil (≤ 45 dtk) dan menampilkannya.
generate_videoprompt, model?, duration?, aspect_ratio?, image_id?Mulai video (kredit per detik); kembalikan id.
generate_audioprompt, model?Musik (music-v1) atau voiceover (voice-v1).
upload_imageurl | dataUnggah gambar referensi (URL publik atau base64; JPEG, PNG, WebP, maks 4 MB); kembalikan image_id.
get_generationid, wait_seconds?Status & URL hasil; bisa menunggu ≤ 50 dtk.
list_generationslimit?Kreasi terbaru.
list_modelskind?Daftar model.
get_account—Paket & sisa kredit.

Error & limit

Semua error berbentuk { "error": { "code": "…", "message": "…" } }.

HTTPcodeArti
400invalid_requestBody atau parameter tidak valid.
400model_not_foundID model tidak dikenal.
401unauthorizedKey tidak ada, salah, atau sudah dicabut.
402no_active_planVideo butuh paket aktif.
402free_model_onlyPaket Free hanya bisa membuat video dengan model boreal (maks 5 detik).
402google_requiredVideo gratis butuh akun yang terverifikasi Google; masuk sekali dengan Google atau pilih paket.
402insufficient_creditsKredit tidak cukup untuk generasi ini.
404not_foundGenerasi tidak ditemukan.
429rate_limitedTerlalu banyak request — lihat header Retry-After.
502generation_failedProvider 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.

Buka API & MCP