Kanzen Ads Docs
IntroductionQuickstartAuthentication
Connect to Hermes Agent
Payments / Top-up
Overview & CreditsGenerate ImageGenerate VideoRetrieve Media
Top Up Campaign AdsCharacter + Product Video
Errors & LimitsAPI ReferenceMeta Marketing API Guide

Generate Image

POST/api/gen/image

JSON body. Async — panggilan ini cuma submit job; abis itu poll Retrieve Media buat hasilnya.

Request body

FieldTipeWajibCatatan
promptstringYaMaks 1000 karakter
productIdstringTidakHarus dimiliki pemanggil (atau pemanggil admin). Otomatis nge-attach foto utama produk (foto aktif tertua) sebagai referensi image-to-image secara default — lihat useProductPhoto/productPhotoReferenceIds di bawah
useProductPhotobooleanTidakDefault true kalau productId diisi. False = productId cuma nge-tag output; nggak ada foto yang ditarik jadi referensi
productPhotoReferenceIdsstring[]TidakOverride pilihan foto utama otomatis dengan id foto produk spesifik ini (harus milik productId) — lihat GET /api/gen/products/:id/reference
size1:1|2:3|3:2TidakDefault 1:1
n1|2|4TidakDefault 1. Biaya dikali n.
imageUrlsstring[]TidakMaks 5 total (digabung sama resolved photoReferenceIds/characterId), semuanya wajib HTTPS — gambar referensi buat modelnya
photoReferenceIdsstring[]TidakID PhotoReference buat dipakai sebagai gambar referensi, di-resolve di server (owner-scoped)
characterIdstringTidakPakai foto referensi karakter sebagai gambar referensi
maskUrlstringTidakGambar mask HTTPS buat inpainting/edit
modelstringTidakDefault ke model service
clientRefstringTidakMaks 200 karakter — juga jadi idempotency key (img_<clientRef>)

Gambar referensi (image-to-image)

Kasih model sesuatu buat jadi acuan, bukan cuma generate dari prompt doang. Gabungin imageUrls (URL HTTPS mentah), photoReferenceIds (record PhotoReference yang udah ada), dan characterId (semua foto referensi karakter itu) — semuanya digabung dan di-dedup, dibatasin maksimal 5 referensi total. photoReferenceIds dan characterId di-resolve di server dan owner-scoped — lo cuma bisa referensiin foto/karakter milik lo sendiri. Tambahin maskUrl buat batesin edit ke area yang di-mask (inpainting).

Request — image-to-image with a character + mask
{
  "prompt": "Character holding the product bottle, studio lighting",
  "characterId": "clx_character_id",
  "photoReferenceIds": ["clx_photo_ref_id"],
  "maskUrl": "https://example.com/mask.png",
  "size": "1:1"
}

Auto-attach foto produk

Kasih productId aja, otomatis ke-attach foto utama produk itu (foto referensi aktif tertua) jadi input image-to-image — nggak perlu langkah tambahan. Mau foto lain? Panggil GET /api/gen/products/:id/reference buat liat daftar foto produknya (yang ditandain isPrimary itu yang auto-attach secara default), terus kirim id-nya lewat productPhotoReferenceIds. Nggak mau ada foto yang ditarik — cuma mau tag output doang? Set useProductPhoto: false.

Request — productId auto-attaches its primary photo
{
  "prompt": "Product bottle on a marble countertop, soft morning light",
  "productId": "clx_product_id"
}
Request — override with a specific product photo
{
  "prompt": "Same product, different angle",
  "productId": "clx_product_id",
  "productPhotoReferenceIds": ["clx_photo_ref_id"]
}

Nulis prompt kalau ada foto referensi

❗

Jangan deskripsiin ulang apa yang udah ada di foto

Kalau ada foto referensi produk atau karakter yang ke-attach, prompt-nya JANGAN mendeskripsikan rupa produk/karakter itu pakai kata-kata — foto itu udah jadi sumber kebenaran soal rupanya. Deskripsiin ulang di teks malah melawan foto-nya, hasilnya jadi nggak konsisten.

Cukup rujuk fotonya aja (misal "produk sesuai referensi foto", "karakter sesuai referensi foto"), lalu fokusin kata-kata di prompt ke scene, gaya, aksi, pencahayaan, dan komposisi — bukan ke deskripsi ulang rupa yang udah ada di foto.

❌ Salah — deskripsiin ulang rupa produk padahal udah ada foto referensi
"A sleek white 500ml serum bottle with a gold cap, on marble, studio lighting"
✅ Benar — rujuk fotonya, fokus ke scene
"Product from the reference photo, on a marble surface, soft morning light, minimalist" + productId (auto-attaches the primary photo)
❌ Salah — deskripsiin ulang rupa karakter padahal udah ada foto referensi
"A young woman with long black hair wearing a red dress, smiling"
✅ Benar — rujuk fotonya, fokus ke scene/aksi
"Character from the reference photo, holding the product, warm studio lighting" + characterId

Contoh

bash
curl -X POST https://kanzenads.com/api/gen/image \
  -H "x-api-key: hsk_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Product bottle on a marble countertop, soft morning light",
    "productId": "clx_product_id",
    "size": "3:2",
    "n": 1
  }'
Response 201 — job submitted, now poll
{
  "id": "clx_media_id",
  "status": "processing",
  "creditsCost": 400,
  "balanceAfter": 49600,
  "waiting": true,
  "pollUrl": "/api/gen/media/clx_media_id",
  "pollAfterSeconds": 10,
  "message": "Image job accepted and processing (credits reserved, auto-refunded on failure). Poll GET /api/gen/media/{id} every ~10s until status is \"completed\", then read the file URL from \"videoUrl\"."
}
Response 402 — insufficient credits
{ "error": "Insufficient credits", "balance": 200, "required": 400 }

Polling di sisi server

Endpoint ini cuma submit job — nggak nunggu hasilnya. Job-nya diproses async; ada tick background yang majuin tiap 2 menit. Gambar yang udah selesai disajiin dari URL Kanzen Ads yang permanen. Ikutin pollUrl, pollAfterSeconds, dan message dari response submit, atau poll aja GET /api/gen/media/:id tiap ~10 detik.

⚠️

Timeout stall server: 15 menit

Kalau generation belum kelar dalam 15 menit dari submit, job-nya ditandain stalled dan kreditnya dibalikin. Coba lagi dengan request baru.

Terus poll buat hasilnya

Pakai id yang dibalikin dengan GET /api/gen/media/:id.

← Overview & CreditsGenerate Video →