Everything to integrate images, video and audio: models, endpoints, fields, errors and webhooks. Last updated 19 October 2026.
One REST API for ByteDance's Seedance video, Seedream images and Seed speech and sound. You pay per request from a prepaid token balance; there is no subscription.
Everything you create is a job. Create it, keep its id, then poll GET /v1/jobs/{id} or wait for a webhook. Images take seconds, videos one to several minutes, audio returns finished in the same call.
Step 1
Add tokens
Step 2
Create a key
Step 3
Make a request
curl -X POST https://kreatorflow.ai/v1/images \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: first-image-001" \
-d '{"model":"kreator-image-pro","prompt":"studio product photo of red boots on wet asphalt","aspect_ratio":"4:5"}'curl https://kreatorflow.ai/v1/jobs/$JOB_ID \
-H "Authorization: Bearer $KREATORFLOW_API_KEY"
# when status is "completed":
curl -L -o result.mp4 https://kreatorflow.ai/v1/jobs/$JOB_ID/output \
-H "Authorization: Bearer $KREATORFLOW_API_KEY"Prefer to try first? The runs any model in the browser on your balance and gives you the exact code.
Send your key on every request except GET /v1/models: Authorization: Bearer kf_live_…. The x-api-key header also works.
Keep keys on the server
| Scope | Allows |
|---|---|
| models:read | GET /v1/voices, GET /v1/storage |
| uploads:create | Uploads: create, complete, delete |
| images:create | POST /v1/images and /v1/characters |
| videos:create | POST /v1/videos, /v1/video-edits and /v1/lip-sync |
| audio:create | POST /v1/audio |
| jobs:read | GET /v1/jobs/{id} and its output |
New keys get every scope.
1 token = $0.05. Every create response returns quoted_token_cost and your balance_tokens. Exact prices per model are on .
402 insufficient_balance and nothing runs.finalTokenCost. A failed, canceled or blocked job is not charged; the hold is released.Video input costs extra
quoted_token_cost_is_maximum: true); the real charge is finalTokenCost. Image and audio references are free.Send a model alias as model. Each model has its own page with capabilities, limits, prices and real example outputs. GET /v1/models returns the live list without a key.
Newest Seedance. Clips up to 30 seconds with image, video and audio references.
kreator-video-seedance-2-5| Resolution | Per second | 4s clip | 30s clip |
|---|---|---|---|
| 480p | $0.143 · 2.85 tokens | 12 tokens | 86 tokens |
| 720p | $0.207 · 4.14 tokens | 17 tokens | 125 tokens |
| 1080p | $0.444 · 8.88 tokens | 36 tokens | 267 tokens |
| 4K | $0.999 · 19.98 tokens | 80 tokens | 600 tokens |
Billed per whole request (rate × seconds, rounded up to a whole token). Reference clips add input seconds; see Tokens & billing.
Real outputs from this model, made on KreatorFlow. Each shows the prompt and the request that sets up the same job.
Talking to camera, text only
720p5s16:9Prompt
A young woman with long straight blonde hair and a white t-shirt stands outdoors in a sunny green park, talking to the camera and gesturing with her hands. Clear daylight, trees and grass behind her. Single person, head and shoulders visible.
Shown without sound.
Multi-shot 2D anime with hard cuts
720p15s16:9Prompt (excerpt)
2D anime, vibrant, dynamic camera. A 6 shot sequence with a hard cut between every shot, no dissolves and no long single take; every shot is a different framing. Shot 1 (0-2s): Extreme close up, a thumb smashes a glowing GENERATE button on a phone, speed lines burst across the screen, his blue eyes wide. …
First 7 seconds of a 15-second clip.
curl -X POST https://kreatorflow.ai/v1/videos \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: kreator-video-seedance-2-5-001" \
-d '{"model":"kreator-video-seedance-2-5","prompt":"a paper boat drifting across a calm pond at sunrise","duration":5,"aspect_ratio":"16:9","resolution":"720p"}'Note
GET /v1/jobs/{id} every few seconds, or send webhook_url.Cinematic motion, reference-led shots and source-video edits, up to 4K.
kreator-video-prokreator-video-seedance-2All aliases reach the same model at the same price.
| Resolution | Per second | 4s clip | 15s clip |
|---|---|---|---|
| 480p | $0.076 · 1.52 tokens | 7 tokens | 23 tokens |
| 720p | $0.11 · 2.2 tokens | 9 tokens | 33 tokens |
| 1080p | $0.24 · 4.8 tokens | 20 tokens | 72 tokens |
| 4K | $0.58 · 11.6 tokens | 47 tokens | 174 tokens |
Billed per whole request (rate × seconds, rounded up to a whole token). Reference clips add input seconds; see Tokens & billing.
Real outputs from this model, made on KreatorFlow. Each shows the prompt and the request that sets up the same job.
Fast drone flythrough, 1080p
1080p5s16:9Prompt
Cinematic aerial flythrough of a futuristic neon city at night, flying between towering skyscrapers covered in glowing signs, rain-slick streets reflecting blue and magenta light, dense atmosphere and light fog, smooth fast drone camera move, ultra detailed, filmic color grade
Shown without sound, scaled down for the web.
Slow push-in, atmospheric light
480p5s16:9Prompt
A samurai in dark robes drawing a katana in a bamboo forest, leaves spiralling down around him, shafts of morning light through the mist, camera slowly pushing in
Orbiting camera move
480p5s16:9Prompt
A knight in shining armour raising a sword to the sky on a cliff top at sunrise, red cape whipping in the wind, a castle and a river valley far below, camera slowly circling him
Tracking shot with physics
480p5s16:9Prompt
An astronaut in a white space suit bounding across the surface of the Moon toward a lunar rover, the Earth huge in the black sky, dust kicking up with every step, camera following from the side
Short prompt, vertical
720p5s9:16Prompt
a cat falling into a paint can full of pink paint then it jumps out covered in the paint
Shown without sound.
curl -X POST https://kreatorflow.ai/v1/videos \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: kreator-video-pro-001" \
-d '{"model":"kreator-video-pro","prompt":"a paper boat drifting across a calm pond at sunrise","duration":5,"aspect_ratio":"16:9","resolution":"720p"}'Note
GET /v1/jobs/{id} every few seconds, or send webhook_url.Quick Seedance 2.0 clips for UGC hooks, motion tests and batch variants.
kreator-video-fastkreator-video-seedance-2-fastAll aliases reach the same model at the same price.
| Resolution | Per second | 4s clip | 10s clip |
|---|---|---|---|
| 480p | $0.058 · 1.16 tokens | 5 tokens | 12 tokens |
| 720p | $0.084 · 1.69 tokens | 7 tokens | 17 tokens |
| 1080p | $0.183 · 3.66 tokens | 15 tokens | 37 tokens |
Billed per whole request (rate × seconds, rounded up to a whole token). Reference clips add input seconds; see Tokens & billing.
curl -X POST https://kreatorflow.ai/v1/videos \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: kreator-video-fast-001" \
-d '{"model":"kreator-video-fast","prompt":"a paper boat drifting across a calm pond at sunrise","duration":5,"aspect_ratio":"16:9","resolution":"720p"}'Note
GET /v1/jobs/{id} every few seconds, or send webhook_url.Lowest-cost Seedance 2.0 for drafts, A/B variants and volume pipelines.
kreator-video-minikreator-video-seedance-2-miniAll aliases reach the same model at the same price.
| Resolution | Per second | 4s clip | 10s clip |
|---|---|---|---|
| 480p | $0.058 · 1.16 tokens | 5 tokens | 12 tokens |
| 720p | $0.067 · 1.35 tokens | 6 tokens | 14 tokens |
| 1080p | $0.135 · 2.7 tokens | 11 tokens | 27 tokens |
Billed per whole request (rate × seconds, rounded up to a whole token). Reference clips add input seconds; see Tokens & billing.
Real outputs from this model, made on KreatorFlow. Each shows the prompt and the request that sets up the same job.
Four words, vertical
720p4s9:16Prompt
a cat doing a backflip
Shown without sound.
From a character-sheet reference image
1080p5s9:16Prompt
use the character sheet with a human tiger and make it do a cinematic fight
Made with one reference image (a character sheet, not shown). Shown without sound, scaled down for the web.
curl -X POST https://kreatorflow.ai/v1/videos \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: kreator-video-mini-001" \
-d '{"model":"kreator-video-mini","prompt":"a paper boat drifting across a calm pond at sunrise","duration":5,"aspect_ratio":"16:9","resolution":"720p"}'Note
GET /v1/jobs/{id} every few seconds, or send webhook_url.Low-cost text-to-video, frames, characters, clip and audio references, with generated sound, up to 1080p.
kreator-video-wan-3| Resolution | Per second | 4s clip | 30s clip |
|---|---|---|---|
| 720p | $0.07 · 1.4 tokens | 6 tokens | 42 tokens |
| 1080p | $0.14 · 2.8 tokens | 12 tokens | 84 tokens |
Billed per whole request (rate × seconds, rounded up to a whole token). Reference clips add input seconds; see Tokens & billing.
Real outputs from this model, made on KreatorFlow. Each shows the prompt and the request that sets up the same job.
Calm atmosphere shot
720p5s16:9Prompt
A cosy rainy-day cafe window: raindrops race down the glass, a steaming latte with heart latte art sits on the wooden sill, blurred city lights glow outside, the camera slowly drifts closer. Warm, calm, cinematic. Sound: rain on glass, soft cafe murmur, a cup clink.
Made with generated sound; shown here without sound.
curl -X POST https://kreatorflow.ai/v1/videos \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: kreator-video-wan-3-001" \
-d '{"model":"kreator-video-wan-3","prompt":"a paper boat drifting across a calm pond at sunrise","duration":5,"aspect_ratio":"16:9","resolution":"720p"}'Note
GET /v1/jobs/{id} every few seconds, or send webhook_url.Wan 3.0 in fast mode: text-to-video, frames, characters, clip and audio references, with sound, up to 1080p.
kreator-video-wan-3-prime| Resolution | Per second | 4s clip | 30s clip |
|---|---|---|---|
| 720p | $0.09 · 1.8 tokens | 8 tokens | 54 tokens |
| 1080p | $0.19 · 3.8 tokens | 16 tokens | 114 tokens |
Billed per whole request (rate × seconds, rounded up to a whole token). Reference clips add input seconds; see Tokens & billing.
Real outputs from this model, made on KreatorFlow. Each shows the prompt and the request that sets up the same job.
3D animated character with a spoken line
1080p8s16:9Prompt
3D animated film style: a small round robot with big glowing blue eyes sits on a workbench in a cosy workshop, notices a paper butterfly landing on its hand, tilts its head, and says in a cheerful little voice: "Oh! Hello there." Warm lamp light, dust in the air, soft depth of field, Pixar-like charm and detail. Sound: the robot's soft servo whirr, its voice, gentle ambient workshop hum.
Made at 1080p with generated sound; shown here at 720p without sound.
Anime action with a whip pan
1080p8s16:9Prompt
Anime style action scene: a swordswoman with flowing silver hair in a dark kimono stands in a moonlit bamboo forest, then dashes forward and draws her katana in one blinding slash, a crescent of blue light cuts through the falling leaves. Dynamic camera whip pan, high-end anime film quality, crisp line art, glowing particles. Sound: wind through bamboo, the sharp ring of a sword being drawn, a whoosh of the slash.
Made at 1080p with generated sound; shown here at 720p without sound.
Claymation with dialogue
1080p8s16:9Prompt
Stop-motion claymation style: a tiny clay fox in a knitted scarf sits by a crackling campfire under a starry sky, roasts a marshmallow on a stick, looks up at the camera and says in a warm little voice: "Best night ever." Handmade textures, fingerprint details in the clay, cosy warm firelight, gentle camera push in. Sound: crackling fire, crickets, the fox's voice.
Made at 1080p with generated sound; shown here at 720p without sound.
curl -X POST https://kreatorflow.ai/v1/videos \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: kreator-video-wan-3-prime-001" \
-d '{"model":"kreator-video-wan-3-prime","prompt":"a paper boat drifting across a calm pond at sunrise","duration":5,"aspect_ratio":"16:9","resolution":"720p"}'Note
GET /v1/jobs/{id} every few seconds, or send webhook_url.Newest Kling: clips up to 30 seconds with sound, frames, reference images and reference clips, at 1080p.
kreator-video-kling-4| Resolution | Per second | 3s clip | 30s clip |
|---|---|---|---|
| 720p | $0.18 · 3.6 tokens | 11 tokens | 108 tokens |
| 1080p | $0.19 · 3.8 tokens | 12 tokens | 114 tokens |
Billed per whole request (rate × seconds, rounded up to a whole token). Reference clips add input seconds; see Tokens & billing.
curl -X POST https://kreatorflow.ai/v1/videos \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: kreator-video-kling-4-001" \
-d '{"model":"kreator-video-kling-4","prompt":"a paper boat drifting across a calm pond at sunrise","duration":5,"aspect_ratio":"16:9","resolution":"720p"}'Note
GET /v1/jobs/{id} every few seconds, or send webhook_url.Text or first and last frame to video, a shot list, optional sound, up to 4K.
kreator-video-kling-3| Resolution | Per second | 3s clip | 15s clip |
|---|---|---|---|
| 720p | $0.10 · 2 tokens | 6 tokens | 30 tokens |
| 1080p | $0.12 · 2.4 tokens | 8 tokens | 36 tokens |
| 4K | $0.14 · 2.8 tokens | 9 tokens | 42 tokens |
Billed per whole request (rate × seconds, rounded up to a whole token). Reference clips add input seconds; see Tokens & billing.
curl -X POST https://kreatorflow.ai/v1/videos \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: kreator-video-kling-3-001" \
-d '{"model":"kreator-video-kling-3","prompt":"a paper boat drifting across a calm pond at sunrise","duration":5,"aspect_ratio":"16:9","resolution":"720p"}'Note
GET /v1/jobs/{id} every few seconds, or send webhook_url.Frames plus up to 7 reference images or characters, a reference clip or a clip to edit, a shot list, up to 4K.
kreator-video-kling-3-omni| Resolution | Per second | 3s clip | 15s clip |
|---|---|---|---|
| 720p | $0.09 · 1.8 tokens | 6 tokens | 27 tokens |
| 1080p | $0.10 · 2 tokens | 6 tokens | 30 tokens |
| 4K | $0.12 · 2.4 tokens | 8 tokens | 36 tokens |
Billed per whole request (rate × seconds, rounded up to a whole token). Reference clips add input seconds; see Tokens & billing.
curl -X POST https://kreatorflow.ai/v1/videos \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: kreator-video-kling-3-omni-001" \
-d '{"model":"kreator-video-kling-3-omni","prompt":"a paper boat drifting across a calm pond at sunrise","duration":5,"aspect_ratio":"16:9","resolution":"720p"}'Note
GET /v1/jobs/{id} every few seconds, or send webhook_url.Fast Kling 3.0 clips with sound from text or a first frame, up to 1080p.
kreator-video-kling-3-turbo| Resolution | Per second | 3s clip | 15s clip |
|---|---|---|---|
| 720p | $0.09 · 1.8 tokens | 6 tokens | 27 tokens |
| 1080p | $0.10 · 2 tokens | 6 tokens | 30 tokens |
Billed per whole request (rate × seconds, rounded up to a whole token). Reference clips add input seconds; see Tokens & billing.
curl -X POST https://kreatorflow.ai/v1/videos \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: kreator-video-kling-3-turbo-001" \
-d '{"model":"kreator-video-kling-3-turbo","prompt":"a paper boat drifting across a calm pond at sunrise","duration":5,"aspect_ratio":"16:9","resolution":"720p"}'Note
GET /v1/jobs/{id} every few seconds, or send webhook_url.Most detailed stills with up to 10 references.
kreator-image-seedream-5-pro$0.10/image · 2 tokens per image
Real outputs from this model, made on KreatorFlow. Each shows the prompt and the request that sets up the same job.

Macro detail
16:9Prompt
Cinematic editorial cover photograph: extreme macro of a hummingbird hovering by a flower, every feather razor sharp with iridescent detail, the left half rendered slightly softer and the right half ultra crisp, dark background, studio lighting, ultra detailed, premium magazine look. No text, no logos, no watermark.

Product shot
16:9Prompt
Cinematic editorial cover photograph: a luxury perfume bottle floating above black water, splashes frozen mid-air around it, a single dramatic spotlight, gold and amber reflections, high-end commercial product advertising look, shallow depth of field, ultra detailed. No text, no logos, no brand names, no watermark.

Consistent character turnaround
16:9Prompt (excerpt)
Three identical stylised 3D fox character figurines on small turntables in a dark studio, the same character shown from the front, side and three-quarter view, consistent design and colours, soft blue rim light, character turnaround sheet feel without any text.

Action still
16:9Prompt (excerpt)
A small racing FPV drone diving low through a narrow red-rock canyon at blue hour, strong motion blur on the canyon walls, glowing blue propeller trails, dynamic low angle, cinematic action still.

Light and materials
16:9Prompt
Cinematic editorial cover photograph: a glowing glass prism on a black surface splitting a beam of white light into a vivid spectrum that paints a miniature surreal landscape on the table, studio lighting, ultra detailed, premium magazine look, elegant and minimal. No text, no logos, no watermark.

2D illustration
16:9Prompt
Bright colourful 2D cartoon illustration for an editorial cover: a cheerful cartoon fox and a small round robot sitting on a hill under a giant play-button shaped sun, rolling green hills and fluffy clouds, bold clean outlines, rich saturated colours, polished animation studio quality, wide 16:9 composition. No text, no logos, no watermark.
curl -X POST https://kreatorflow.ai/v1/images \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: kreator-image-seedream-5-pro-001" \
-d '{"model":"kreator-image-seedream-5-pro","prompt":"studio product photo of red boots on wet asphalt","aspect_ratio":"16:9"}'Note
GET /v1/jobs/{id} every few seconds, or send webhook_url.Product shots, character references and production stills, up to 14 references.
kreator-image-pro$0.10/image · 2 tokens per image
Real outputs from this model, made on KreatorFlow. Each shows the prompt and the request that sets up the same job.

Cinematic scene
standard16:9Prompt
A hyperrealistic bioluminescent jellyfish drifting in the deep dark ocean, glowing cyan and magenta tendrils, volumetric god rays, tiny glowing particles, cinematic, ultra detailed

Short prompt, photo look
standard1:1Prompt
A golden retriever puppy sitting in a sunny meadow, soft morning light, shallow depth of field

3D mascot
standard1:1Prompt
a stylised 3D cartoon character of a cheerful robot mascot, full body, standing, plain background

Character on a plain background
standard1:1Prompt
a stylised 3D cartoon character of a friendly astronaut, full body, standing pose, plain studio background
curl -X POST https://kreatorflow.ai/v1/images \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: kreator-image-pro-001" \
-d '{"model":"kreator-image-pro","prompt":"studio product photo of red boots on wet asphalt","aspect_ratio":"16:9"}'Note
GET /v1/jobs/{id} every few seconds, or send webhook_url.Low-cost, low-latency drafts and high-volume variants.
kreator-image-seedream-5-flash$0.05/image · 1 token per image
curl -X POST https://kreatorflow.ai/v1/images \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: kreator-image-seedream-5-flash-001" \
-d '{"model":"kreator-image-seedream-5-flash","prompt":"studio product photo of red boots on wet asphalt","aspect_ratio":"16:9"}'Note
GET /v1/jobs/{id} every few seconds, or send webhook_url.Fast drafts, social visuals and template previews.
kreator-image-fast$0.05/image · 1 token per image
curl -X POST https://kreatorflow.ai/v1/images \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: kreator-image-fast-001" \
-d '{"model":"kreator-image-fast","prompt":"studio product photo of red boots on wet asphalt","aspect_ratio":"16:9"}'Note
GET /v1/jobs/{id} every few seconds, or send webhook_url.Generate or edit images by instruction with up to 9 references, up to 4K.
kreator-image-wan-2-7-pro$0.08/image · 1.6 tokens per image
curl -X POST https://kreatorflow.ai/v1/images \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: kreator-image-wan-2-7-pro-001" \
-d '{"model":"kreator-image-wan-2-7-pro","prompt":"studio product photo of red boots on wet asphalt","aspect_ratio":"16:9"}'Note
GET /v1/jobs/{id} every few seconds, or send webhook_url.Low-cost text to image at about 1.3K.
kreator-image-wan-2-6$0.04/image · 0.8 tokens per image
curl -X POST https://kreatorflow.ai/v1/images \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: kreator-image-wan-2-6-001" \
-d '{"model":"kreator-image-wan-2-6","prompt":"studio product photo of red boots on wet asphalt","aspect_ratio":"16:9"}'Note
GET /v1/jobs/{id} every few seconds, or send webhook_url.Text to speech with preset and cloned voices.
kreator-speech2 tokens / 1,000 characters · 2 tokens / 1,000 characters
curl -X POST https://kreatorflow.ai/v1/audio \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: kreator-speech-001" \
-d '{"model":"kreator-speech","voice":"<voice id from GET /v1/voices>","text":"Welcome to KreatorFlow."}'Note
Sound effects, ambient beds and music from a prompt.
kreator-sound2 tokens min / clip · 2 tokens / clip minimum, then by output length
Real outputs from this model, made on KreatorFlow. Each shows the prompt and the request that sets up the same job.
Narrated line
Prompt
A cheerful female narrator says: Welcome to KreatorFlow audio.
curl -X POST https://kreatorflow.ai/v1/audio \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: kreator-sound-001" \
-d '{"model":"kreator-sound","prompt":"Soft rain on a tin roof with distant thunder"}'Note
Precise multi-round edits, realistic multi-image blends, small and multilingual text
kreator-image-seedream-5-5$0.06/image · 1.2 tokens per image (was $0.10, 40% off until 11 December)
curl -X POST https://kreatorflow.ai/v1/images \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: kreator-image-seedream-5-5-001" \
-d '{"model":"kreator-image-seedream-5-5","prompt":"studio product photo of red boots on wet asphalt","aspect_ratio":"16:9"}'Note
GET /v1/jobs/{id} every few seconds, or send webhook_url./v1/imagescurl -X POST https://kreatorflow.ai/v1/images \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: image-001" \
-d '{"model":"kreator-image-pro","prompt":"studio product photo of red boots on wet asphalt","aspect_ratio":"4:5"}'| Code | HTTP | What to do |
|---|---|---|
| invalid_api_key | 401 | Send Authorization: Bearer <key>. Create a new key if it was revoked. |
| insufficient_balance | 402 | Top up under Billing. data.top_up_url links there. |
| prompt_required | 400 | Add a prompt. |
| prompt_too_long | 400 | Shorten it; GET /v1/models lists maxPromptChars. |
| model_not_found | 400 | Use an id from GET /v1/models. |
| aspect_ratio_not_supported | 400 | Send one of the model's aspect ratios. |
| reference_upload_not_found | 404 | Re-upload the file and use the new upload_id. |
| character_pending | 409 | Wait retry_after seconds, then retry. |
| rate_limited | 429 | Wait the seconds in the Retry-After header. |
References can be public HTTPS links or upload_ids from Uploads. For a face you reuse, register a character.
/v1/videoscurl -X POST https://kreatorflow.ai/v1/videos \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: video-001" \
-d '{"model":"kreator-video-fast","prompt":"a paper boat drifting across a calm pond at sunrise","duration":5,"aspect_ratio":"16:9","resolution":"720p"}'| Code | HTTP | What to do |
|---|---|---|
| invalid_api_key | 401 | Send Authorization: Bearer <key>. Create a new key if it was revoked. |
| insufficient_balance | 402 | Top up under Billing. data.top_up_url links there. |
| prompt_required | 400 | Add a prompt. |
| model_not_found | 400 | Use an id from GET /v1/models. |
| duration_not_supported | 400 | Send one of the model's durations. |
| aspect_ratio_not_supported | 400 | Send one of the model's aspect ratios. |
| resolution_not_supported | 400 | Send one of the model's resolutions. |
| reference_combination_not_supported | 400 | Send one kind per request. |
| character_pending | 409 | Wait retry_after seconds, then retry. |
| rate_limited | 429 | Wait the seconds in the Retry-After header. |
first_frame_*, last_frame_*) can't be combined with reference images or character_ids in one request.Reference clips: fallback or strict
video_reference_mode: "fallback" (default) a clip reference may be dropped to get you an output; the job then has referenceDropped: true. Send "strict" when the clip must be used.Transform, restyle or extend an existing clip with Seedance 2. The source is used strictly and framing defaults to adaptive.
/v1/video-editscurl -X POST https://kreatorflow.ai/v1/video-edits \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: edit-001" \
-d '{"model":"kreator-video-seedance-2","edit_mode":"restyle","source_video_upload_id":"tos:kreatorflow/uploads/…/clip.mp4","prompt":"turn the scene into a rainy neon night","resolution":"720p"}'The same edit also works on POST /v1/videos with intent: "video_edit". Upload the source with upload_type: "VIDEO"; MP4/MOV (H.264/AAC) under 50 MB works best.
| Code | HTTP | What to do |
|---|---|---|
| insufficient_balance | 402 | Top up under Billing. data.top_up_url links there. |
| video_edit_model_not_supported | 400 | Use kreator-video-seedance-2, kreator-video-fast or kreator-video-mini. |
| video_edit_source_required | 400 | Send source_video_upload_id or video. |
| video_edit_source_not_found | 404 | Upload the clip with upload_type VIDEO. |
| resolution_not_supported | 400 | Send one of the model's resolutions. |
| rate_limited | 429 | Wait the seconds in the Retry-After header. |
Text to speech (kreator-speech) and sound or music from a prompt (kreator-sound). The call returns the job already finished, with providerOutputUrl.
/v1/audiocurl -X POST https://kreatorflow.ai/v1/audio \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: speech-001" \
-d '{"model":"kreator-speech","voice":"<voice id>","text":"Welcome to KreatorFlow."}'/v1/voicescurl https://kreatorflow.ai/v1/voices \
-H "Authorization: Bearer $KREATORFLOW_API_KEY"| Code | HTTP | What to do |
|---|---|---|
| invalid_api_key | 401 | Send Authorization: Bearer <key>. Create a new key if it was revoked. |
| insufficient_balance | 402 | Top up under Billing. data.top_up_url links there. |
| prompt_required | 400 | Add a prompt. |
| voice_required | 400 | Use an id from GET /v1/voices. |
| rate_limited | 429 | Wait the seconds in the Retry-After header. |
One photo and one voice track become a video of that person speaking it (kreator-lipsync, OmniHuman 2.0). The video is as long as the audio, 4 seconds to 5 minutes. Upload the photo (upload_type: "IMAGE") and the audio (upload_type: "AUDIO", MP3 or WAV) first, or pass a finished /v1/audio job as audio_job_id.
/v1/lip-synccurl -X POST https://kreatorflow.ai/v1/lip-sync \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: lipsync-001" \
-d '{"image_upload_id":"tos:kreatorflow/uploads/…/presenter.png","audio_upload_id":"tos:kreatorflow/uploads/…/voiceover.mp3","prompt":"smiles and nods while talking, steady camera","resolution":"720p"}'Consent and paid accounts
4 tokens per started second of audio at 720p, 6 at 1080p. The response returns billed_seconds. Lip Sync renders one job at a time: while it is busy your job stays queued with its tokens held and starts when a slot frees, so keep polling the job.
| Code | HTTP | What to do |
|---|---|---|
| paid_account_required | 403 | Top up with a card under Billing. |
| paid_check_unavailable | 503 | Send the same request again in a moment. |
| insufficient_balance | 402 | Top up under Billing. data.top_up_url links there. |
| image_upload_not_found | 404 | Upload the photo with upload_type IMAGE and use the new upload_id. |
| audio_upload_not_found | 404 | Upload the track with upload_type AUDIO, or use a completed audio job id. |
| audio_too_short | 400 | Send 4 seconds to 5 minutes of audio. |
| audio_too_long | 400 | Trim it to 5 minutes or less. |
| audio_unreadable | 400 | Use an MP3 or WAV under 15 MB. |
| image_rejected | 422 | Use a different photo. |
| rate_limited | 429 | Wait the seconds in the Retry-After header. |
Register a face or character once and reuse it by id. It is reviewed once (about 20 seconds for an image); after that, jobs use it directly with no per-job review.
Step 1
Upload the image
Step 2
Register it
POST /v1/characters with mode: "register" and the upload_id.Step 3
Wait, then use it
status is ready, then pass character_ids./v1/characterscurl -X POST https://kreatorflow.ai/v1/characters \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"mode":"register","name":"Mira","upload_id":"tos:kreatorflow/uploads/…/mira.png"}'Real people in references
upload_id and later jobs skip the review. For a face you use often, register it here as a character. Celebrity, public-figure and impersonation requests, and prompts that ask to match someone's identity, are refused./v1/characters/v1/characters/{character_id}/v1/characters/{character_id}| When | You get | Do this |
|---|---|---|
status: pending | Still in review | Poll GET /v1/characters/{id} |
409 character_pending | Used before ready; nothing reserved | Wait retry_after seconds, retry |
422 character_registration_failed | The image didn't pass review | Register again with another image |
Private reference files go through a three-step upload. Public HTTPS links can skip this and go straight into the reference fields.
# 1. Reserve an upload
curl -X POST https://kreatorflow.ai/v1/uploads \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"file_name":"ref.png","mime_type":"image/png","file_size":482133,"upload_type":"IMAGE"}'
# 2. PUT the bytes to direct_upload_url with exactly direct_upload_headers
curl -X PUT "$DIRECT_UPLOAD_URL" -H "Content-Type: image/png" --data-binary @ref.png
# 3. Finish it
curl -X POST https://kreatorflow.ai/v1/uploads/complete \
-H "Authorization: Bearer $KREATORFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"upload_id":"'"$UPLOAD_ID"'"}'/v1/uploads{
"success": true,
"data": {
"upload_id": "tos:kreatorflow/uploads/workspace-id/1700000000000-reference.png",
"direct_upload_url": "https://…signed-storage-url…",
"direct_upload_headers": {
"Content-Type": "image/png"
},
"direct_upload_expires_at": "2026-10-17T12:10:00.000Z",
"complete_url": "https://kreatorflow.ai/v1/uploads/complete",
"upload_method": "PUT",
"upload_mode": "direct"
}
}/v1/uploads/complete/v1/uploads/{upload_id}| Code | HTTP | What to do |
|---|---|---|
| upload_invalid | 400 | Send file_name, mime_type, file_size and upload_type. |
| upload_too_large | 413 | Images 50 MB, video 200 MB, audio 15 MB. |
| upload_larger_than_declared | 413 | Create a new upload with the real file_size and PUT the file again. |
| storage_quota_exceeded | 402 | Delete old uploads or add a Storage Pack. |
| upload_not_found | 404 | Create the upload again. |
| upload_in_use | 409 | Delete it after the job finishes. |
| Type | upload_type | Max size |
|---|---|---|
| Image | IMAGE | 50 MB |
| Video | VIDEO | 200 MB |
| Audio | AUDIO | 15 MB |
Send exactly direct_upload_headers on the PUT; the signed URL lasts about 5 minutes (10 with signed_size: true). A new reference is reviewed on its first use (about 20 s for an image, up to about 2.5 min for a clip); reuse the same upload_id and later jobs skip it.
| Status | Meaning |
|---|---|
| created · queued · processing | Still running. Poll every 3 seconds. |
| completed | Done. Download providerOutputUrl with your key. |
| failed | Read errorCode and errorMessage. Not charged. |
| canceled · blocked | Stopped (blocked = e.g. no balance). Not charged. |
/v1/jobs/{job_id}curl https://kreatorflow.ai/v1/jobs/3f0c0e0a-0000-4000-8000-000000000000 \
-H "Authorization: Bearer $KREATORFLOW_API_KEY"Response fields
idstringJob id. Poll GET /v1/jobs/{id} with it.
mediaTypestringimage, video or audio.
modelIdstringThe model alias you sent.
statusstringcreated, queued, processing, completed, failed, canceled or blocked.
quotedTokenCostnumberTokens quoted (and reserved) when the job was created.
finalTokenCostnumberTokens charged. 0 until the job completes, and for any job that does not complete.
providerOutputUrlstring | nullWhen completed: the output link. Download it with your key.
providerOutputExpiresAtstring | nullWhen the output link stops working. Keep your own copy.
errorCodestring | nullWhy the job failed (see Errors).
errorMessagestring | nullA readable explanation of the failure.
errorDataobjectExtra detail for some errors, e.g. retry_after for reference_asset_pending.
referenceDroppedbooleanVideo, fallback mode only: true when a reference clip could not be used.
warningsarrayNon-fatal notes about the request, when there are any.
createdAt · updatedAt · completedAtstringISO timestamps.
/v1/jobs/{job_id}/outputOutput links need the same Authorization header and expire (providerOutputExpiresAt). Save a copy to your own storage.
Add webhook_url (HTTPS) to any create request. When the job ends we POST the event below. Your signing secret is under . Keep polling as a fallback.
{
"object": "kreatorflow.developer_webhook_event",
"id": "evt_<job_id>_completed",
"type": "job.completed",
"created": "2026-10-17T12:01:10.000Z",
"data": {
"job": {
"id": "<job_id>",
"status": "completed",
"providerOutputUrl": "https://kreatorflow.ai/v1/jobs/<job_id>/output"
}
}
}import { createHmac, timingSafeEqual } from "node:crypto";
// rawBody: the request body exactly as received (a string, before JSON.parse)
export function verifyKreatorFlowWebhook(rawBody, signatureHeader, secret) {
const parts = Object.fromEntries(signatureHeader.split(",").map((part) => part.split("=")));
const expected = createHmac("sha256", secret).update(`${parts.t}.${rawBody}`).digest("hex");
const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) < 300; // reject replays older than 5 min
return fresh && expected.length === parts.v1?.length && timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}Your uploads count toward a storage allowance: 5 GB free, more with a Storage Pack (see ). Generated outputs are stored but never count. Delete an upload to free its space.
/v1/storagecurl https://kreatorflow.ai/v1/storage \
-H "Authorization: Bearer $KREATORFLOW_API_KEY"| Field | Meaning |
|---|---|
| quota_used_bytes | Your uploads: what counts against the allowance |
| included_bytes | Your allowance (pack or free) |
| outputs_bytes | Generated outputs (shown, not counted) |
| used_bytes | Everything stored |
| has_pack · tier | Whether a Storage Pack is active, and which |
Over the allowance, new uploads return 402 storage_quota_exceeded.
Every error has a stable code; branch on that, not the message. Some include extra fields in data (e.g. retry_after, top_up_url).
{
"success": false,
"code": "insufficient_balance",
"error": "Not enough tokens: this job needs 21 and 4 are available. Add developer tokens before submitting generation jobs."
}| Code | HTTP | Meaning | What to do |
|---|---|---|---|
| invalid_api_key | 401 | The key is missing, wrong or revoked. | Send Authorization: Bearer <key>. Create a new key if it was revoked. |
| insufficient_balance | 402 | Not enough tokens for the quoted cost. | Top up under Billing. data.top_up_url links there. |
| storage_quota_exceeded | 402 | The upload would go over your storage allowance. | Delete old uploads or add a Storage Pack. |
| account_not_active | 403 | The developer account is suspended. | Contact support. |
| scope_missing | 403 | The key lacks the scope this endpoint needs. | Use a key with that scope. |
| job_not_found | 404 | No job with that id for this key's account. | Check the id; jobs are private to the account. |
| character_not_found | 404 | The character id or slug doesn't exist. | List characters with GET /v1/characters. |
| upload_not_found | 404 | The upload_id doesn't exist in this workspace. | Create the upload again. |
| reference_upload_not_developer | 400 | The upload_id is a file uploaded on the website, not through the API. | Upload this file with /v1/uploads first. |
| reference_image_wrong_type | 400 | A reference image or frame is a video, audio or document file (data.field names it). | Send JPEG, PNG or WebP; send clips as reference_video_upload_ids. |
| reference_upload_not_found | 404 | A reference upload_id doesn't exist in this workspace. | Re-upload the file and use the new upload_id. |
| video_edit_source_not_found | 404 | The source_video_upload_id doesn't exist. | Upload the clip with upload_type VIDEO. |
| upload_in_use | 409 | A queued or processing job still uses this upload. | Delete it after the job finishes. |
| character_pending | 409 | The character is still being reviewed. Nothing was reserved. | Wait retry_after seconds, then retry. |
| upload_too_large | 413 | The file is over the size limit for its type. | Images 50 MB, video 200 MB, audio 15 MB. |
| upload_larger_than_declared | 413 | The stored file is more than 10% larger than the file_size you declared. It was deleted. | Create a new upload with the real file_size and PUT the file again. |
| character_registration_failed | 422 | The character image did not pass review. | Register the character again with another image. |
| rate_limited | 429 | Too many requests in the window. | Wait the seconds in the Retry-After header. |
| prompt_required | 400 | No prompt (or text for speech) was sent. | Add a prompt. |
| prompt_too_long | 400 | The prompt is over the model's limit. | Shorten it; GET /v1/models lists maxPromptChars. |
| model_not_found | 400 | Unknown model alias. | Use an id from GET /v1/models. |
| duration_not_supported | 400 | The model doesn't offer that length. | Send one of the model's durations. |
| aspect_ratio_not_supported | 400 | The model doesn't offer that aspect ratio. | Send one of the model's aspect ratios. |
| resolution_not_supported | 400 | The model doesn't offer that resolution. | Send one of the model's resolutions. |
| reference_combination_not_supported | 400 | These references can't be combined, e.g. start/end frames with reference images. | Send one kind per request. |
| upload_invalid | 400 | The upload request is missing a field or has a bad type. | Send file_name, mime_type, file_size and upload_type. |
| video_edit_model_not_supported | 400 | Video edits need a Seedance 2.0 family model (2.0, Fast or Mini). | Use kreator-video-seedance-2, kreator-video-fast or kreator-video-mini. |
| video_edit_source_required | 400 | A video edit needs a source clip. | Send source_video_upload_id or video. |
| voice_required | 400 | Speech needs a voice. | Use an id from GET /v1/voices. |
| paid_account_required | 403 | Lip Sync needs a paid account. Nothing was charged. | Top up with a card under Billing. |
| paid_check_unavailable | 503 | The account's payment status could not be read just now. Nothing was charged. | Send the same request again in a moment. |
| audio_reference_too_long | 400 | The audio references add up to more than the model accepts in total (15 s on Seedance 2.0, 30 s on 2.5). Nothing was charged. | Trim or remove audio so all audio references combined fit. |
| image_upload_not_found | 404 | The image_upload_id isn't in this workspace. | Upload the photo with upload_type IMAGE and use the new upload_id. |
| audio_upload_not_found | 404 | The audio_upload_id isn't in this workspace (or audio_job_id isn't a completed /v1/audio job). | Upload the track with upload_type AUDIO, or use a completed audio job id. |
| audio_too_short | 400 | The voice track is under 4 seconds. Nothing was charged. | Send 4 seconds to 5 minutes of audio. |
| audio_too_long | 400 | The voice track is over 5 minutes. Nothing was charged. | Trim it to 5 minutes or less. |
| audio_unreadable | 400 | The audio couldn't be read. Nothing was charged. | Use an MP3 or WAV under 15 MB. |
| image_rejected | 422 | The photo didn't pass the safety check. Nothing was charged. | Use a different photo. |
| internal_error | 500 | Something failed on our side. | Retry with the same Idempotency-Key. |
| dispatch_disabled | 503 | Generation is paused for this environment. | Retry later. |
The job ends failed with this errorCode. Reserved tokens are released.
| errorCode | Meaning | What to do |
|---|---|---|
| reference_rejected | A reference did not pass screening. | For a real person you have consent to use, register the face as a character (reviewed once, then reused), or use another image. |
| reference_asset_pending | A new reference is still being reviewed. | Wait errorData.retry_after seconds, resubmit with the same upload_id and a new Idempotency-Key. |
| reference_asset_failed | The reference did not pass review. | Use a different file. |
| generation_rejected | The request was declined (prompt, reference or options). | Change the prompt, reference or options, then retry. |
| generation_timeout | The job did not finish in time; reserved tokens are released. | Retry with a new Idempotency-Key. |
| generation_unavailable | The model is temporarily unavailable. | Retry later or pick another model. |
| generation_failed | The generation failed. | Retry; change the prompt or references if it repeats. |
Over a limit you get 429 rate_limited with a Retry-After header in seconds.
When a model is busy, a new job waits in line (queued, tokens reserved) and starts when a slot frees. One account can have up to 5 Seedance 2.5 jobs and up to 2 Lip Sync jobs waiting at once. Past that the create request also answers 429 rate_limited and nothing is reserved. Jobs already rendering do not count.
Send a unique Idempotency-Key header with every create. If a request times out, retry with the same key: you get the original job back (idempotent_replay: true) instead of paying twice. Use a new key for a new job, including after a failure.
Let an AI client call the API as tools. Tools run through the same jobs and token balance as HTTP.
Local files: create_upload returns an upload_id and a ready curl command; run it, call confirm_upload, then pass the upload_id as reference_image_upload_ids, first_frame_upload_id, reference_video_upload_ids or image_upload_id. Same limits as POST /v1/uploads; uploading is free.
list_modelscreate_uploadconfirm_uploadgenerate_imagegenerate_videoedit_videolip_synclist_voicesgenerate_speechgenerate_soundget_jobget_balance# Claude Code
claude mcp add --transport http kreatorflow https://kreatorflow.ai/v1/mcp \
--header "Authorization: Bearer $KREATORFLOW_API_KEY"Using KreatorFlow with your plan credits instead of API tokens? Connect https://kreatorflow.ai/api/mcp with OAuth; setup guide.
Build with ChatGPT, Claude, Cursor or Codex
One guide your assistant can follow. Save your key as KREATORFLOW_API_KEY where the code runs (never paste it into a chat), give the assistant the guide, then say what to build.
Custom GPT or agent framework? Import the OpenAPI link and choose API key auth, type Bearer.