Coming from fal, Replicateor WaveSpeed
Moving Seedance 2.0 and Qwen-Image calls to /v1: authentication, model ids, every field, async jobs and webhooks, and what does not carry over.
Not a base-URL swap
Changing the base URL and the key is not enough on any of the three. Every request also changes in these ways:
- The key:
Authorization: Bearerwith a key that starts withsk_test_orsk_live_. - The model id goes in the body as
model, and one id covers text, a first frame and references. - An
Idempotency-Keyheader on every generation request. - A price cap:
max_credits, or aquote_idfromPOST /v1/quotes. - The result is a job: poll
GET /v1/jobs/{id}or receive our signed webhook.
- fal
- Closest to ours: most Seedance field names are fal's. Also rename
image_urlstoreference_image_urls, senddurationas a number, and movefal_webhookinto the body aswebhook_url. - Replicate
- Take the fields out of
input. Also renameimagetoimage_url,reference_imagestoreference_image_urlsandwebhooktowebhook_url. - WaveSpeed
- Also rename
imagetoimage_urlandreference_imagestoreference_image_urls, and movestandard_webhookinto the body aswebhook_url. Read results fromGET /v1/jobs/{id}.
Authentication
Where requests go and how they are signed.
| Platform | Base URL | Auth header |
|---|---|---|
| Pershot | https://api.pershot.app/v1 | Authorization: Bearer $API_KEY |
| fal | https://queue.fal.run | Authorization: Key $FAL_KEY |
| Replicate | https://api.replicate.com/v1 | Authorization: Bearer $REPLICATE_API_TOKEN |
| WaveSpeed | https://api.wavespeed.ai/api/v3 | Authorization: Bearer $WAVESPEED_API_KEY |
Developer API access is by application: request it in the studio under API keys. A key is shown once. A developer key spends the developer API balance, and the same key works as a Bearer header on the MCP server.
Model ids
Theirs go in the URL; ours goes in the body as model. One of our ids covers text, a first frame and references: the fields you send decide.
| Ours | fal | Replicate | WaveSpeed | Notes |
|---|---|---|---|---|
seedance-2.0-fast | bytedance/seedance-2.0/fast/text-to-videobytedance/seedance-2.0/fast/image-to-videobytedance/seedance-2.0/fast/reference-to-video | bytedance/seedance-2.0-fast | bytedance/seedance-2.0-fast/text-to-videobytedance/seedance-2.0-fast/image-to-video | One id for text, a first frame and reference images. |
seedance-2.0-mini | bytedance/seedance-2.0/mini/text-to-videobytedance/seedance-2.0/mini/image-to-videobytedance/seedance-2.0/mini/reference-to-video | bytedance/seedance-2.0-mini | bytedance/seedance-2.0-mini/text-to-video | One id for text, a first frame and reference images. |
qwen-image-2512 | fal-ai/qwen-image-2512 | qwen/qwen-image-2512 | wavespeed-ai/qwen-image/text-to-image-2512 | The same open weights. |
qwen-image-2512-lightning | fal-ai/qwen-image-2512/lora | none | none | Our 4-step Lightning tier. fal runs it as a LoRA on its /lora endpoint; we found no ready-made Lightning model on Replicate or WaveSpeed. |
qwen-image-edit-2511 | fal-ai/qwen-image-edit-2511 | qwen/qwen-image-edit-2511 | wavespeed-ai/qwen-image/edit-2511 | The same open weights. |
qwen-image-edit-2511-lightning | fal-ai/qwen-image-edit-2511/lora | none | none | Our 4-step Lightning tier. fal runs it as a LoRA on its /lora endpoint; we found no ready-made Lightning model on Replicate or WaveSpeed. |
- For AI agents
- Plain text for AI agents: inputs, legal values, every price and a request example
seedance-2.0-fastseedance-2.0-miniqwen-image-2512-lightningqwen-image-2512qwen-image-edit-2511-lightningqwen-image-edit-2511
Seedance 2.0, field by field
Our names follow fal's where fal has the field, and the notes say where they differ. Fields sit at the top level of the JSON body; Replicate wraps them in input.
| Ours | fal | Replicate | WaveSpeed | Notes |
|---|---|---|---|---|
model | in the URL | in the URL | in the URL | One id in the body for text, a first frame and references. Theirs is in the URL. |
prompt | prompt | prompt | prompt | The same text carries over. |
duration | duration | duration | duration | A whole number, 4 to 15, default 5. fal sends a string and offers auto; Replicate uses -1 for automatic. No automatic length here. |
resolution | resolution | resolution | resolution | 480p or 720p, default 720p. WaveSpeed also lists 1080p and 4k; here higher resolutions are the separate enhance step. |
aspect_ratio | aspect_ratio | aspect_ratio | aspect_ratio | 16:9, 9:16 or 1:1, default 16:9. No auto, adaptive, 4:3, 3:4 or 21:9. |
generate_audio | generate_audio | generate_audio | generate_audio | The same meaning, on by default. The price is the same on or off. |
image_url | image_url | image | image | The first frame. The same name as fal's; Replicate and WaveSpeed call it image. Not with reference images. |
reference_image_urls | image_urls | reference_images | reference_images | Up to 9 images, @image1, @image2 in the prompt. Differs from fal, which calls it image_urls. |
seed | none | seed | none | Accepted and not used: Seedance 2.0 takes no seed. fal and WaveSpeed list none. |
quote_id | none | none | none | New: send exactly one of quote_id or max_credits. A job never costs more. |
max_credits | none | none | none | New: send exactly one of quote_id or max_credits. A job never costs more. |
webhook_url | fal_webhookquery string | webhook | standard_webhookquery string | In the body. Differs from fal, which takes fal_webhook in the query string. |
end_user_id | end_user_id | none | none | The same name as fal's. For approved developer accounts (access is by application): your own user id, shown in usage. |
project_id | none | none | none | Ours only, optional: projects and supplier routing. |
shot_id | none | none | none | Ours only, optional: projects and supplier routing. |
routing_preference | none | none | none | Ours only, optional: projects and supplier routing. |
enhance | none | none | none | Ours only, optional: an AI upscale after the render, labeled AI Enhanced. |
Idempotency-Keyheader | none | none | none | New and required: the same key within 24 hours returns the same job. |
Their Seedance fields with no counterpart here. Sent as they are, they are refused as unknown fields (400 invalid_request).
- fal
end_image_urlvideo_urlsaudio_urlsbitrate_modecodec- Replicate
last_frame_imagereference_videosreference_audios- WaveSpeed
last_imagereference_videosreference_audiosenable_web_search
Qwen-Image, field by field
Our image body is smaller than theirs: a size and an aspect ratio instead of free pixels, one image per job, and no sampler settings.
| Ours | fal | Replicate | WaveSpeed | Notes |
|---|---|---|---|---|
model | in the URL | in the URL | in the URL | Four ids in the body: Image Mini and Image Fast, each for generating and editing. |
prompt | prompt | prompt | prompt | The same text carries over. |
size | image_size | none | size | 1K or 2K, default 1K. With the aspect ratio it sets a fixed size, at most 2048 px a side. No free width and height. |
aspect_ratio | image_size | aspect_ratio | size | 16:9, 9:16 or 1:1, default 1:1. It does not change the price. |
image_url | image_urls | image | images | Edit models only: exactly one source image, as a URL. Theirs take a list. |
seed | seed | seed | seed | The same meaning. |
quote_id | none | none | none | New: send exactly one of quote_id or max_credits. A job never costs more. |
max_credits | none | none | none | New: send exactly one of quote_id or max_credits. A job never costs more. |
webhook_url | fal_webhookquery string | webhook | standard_webhookquery string | In the body. Differs from fal, which takes fal_webhook in the query string. |
end_user_id | none | none | none | Ours only, optional, for approved developer accounts (access is by application): your own user id, shown in usage. |
project_id | none | none | none | Ours only, optional: projects and supplier routing. |
shot_id | none | none | none | Ours only, optional: projects and supplier routing. |
routing_preference | none | none | none | Ours only, optional: projects and supplier routing. |
Idempotency-Keyheader | none | none | none | New and required: the same key within 24 hours returns the same job. |
Their Qwen-Image fields with no counterpart here. Sent as they are, they are refused as unknown fields (400 invalid_request).
- fal
negative_promptnum_inference_stepsguidance_scalenum_imagesoutput_formataccelerationenable_safety_checkersync_modeloras- Replicate
negative_promptstrengthwidthheightguidancenum_inference_stepsgo_fastoutput_formatoutput_qualitydisable_safety_checkerlora_weightslora_scale- WaveSpeed
widthheightoutput_formatenable_base64_outputenable_sync_mode
Async jobs and webhooks
All four run jobs in the background. What each one calls the steps:
| Step | Pershot | fal | Replicate | WaveSpeed |
|---|---|---|---|---|
| Create | POST /v1/videos/generationsPOST /v1/images/generations202 → { id: "job_…" } | POST https://queue.fal.run/<endpoint id>→ request_id, status_url, response_url | POST /v1/models/{owner}/{name}/predictions{ "input": { … } } | POST /api/v3/<model id>→ data.id |
| Poll | GET /v1/jobs/{id} | GET status_urlGET response_url | GET /v1/predictions/{id} | GET /api/v3/predictions/{id}/result |
| Statuses | queuedprocessingsucceededfailedcancelledunknown | IN_QUEUEIN_PROGRESSCOMPLETED | startingprocessingsucceededfailedcanceled | createdcompletedfailedcancelledtimeoutdeleted |
| Webhook | webhook_url (body) | ?fal_webhook=… | webhook (body)webhook_events_filter | ?standard_webhook=…?webhook=… (legacy) |
| Signature | X-Signature: t=…,v1=…HMAC-SHA256, whsec_…X-Event-Id | X-Fal-Webhook-SignatureED25519, JWKS | webhook-idwebhook-timestampwebhook-signature | webhook-idwebhook-timestampwebhook-signature |
| Delivery retries | After 1 min, 5 min, 30 min, 2 h and 6 h. A 2xx within 10 seconds counts as delivered. | Up to 31 retries, until the stored result expires. | May retry: handle repeats. | Up to 3 retries. |
| Output files | Signed links valid 24 hours; read the job again for a fresh one. Files are kept 12 months. | Follow your media expiration settings. | Removed after an hour for predictions made through the API. | Kept up to 7 days. |
| Wait in one call | None: every job is async. Over MCP, wait_for_job waits up to 60 seconds. | POST https://fal.run/<endpoint id> | Prefer: wait=n | enable_sync_mode |
Our webhook body is the job itself, and the signature is ours: code that verifies their webhooks will reject ours. How to verify ours
Idempotency
Every generation request needs an Idempotency-Key header, 1 to 255 visible ASCII characters. The same key within 24 hours returns the same job with HTTP 200, so a retry after a timeout never creates or charges a second job.
None of the three documents an idempotency key for creating a job (2026-10-22): fal suggests deduplicating webhooks by request_id, and WaveSpeed asks you to submit once and look for the task before you resubmit. Give each job one key and reuse it on every retry.
What is not compatible
Sent as they are, these fail or are refused here:
- Their client libraries (fal_client, replicate, wavespeed) do not call /v1. Use plain HTTP, the OpenAPI document or the MCP server.
- Their response shapes: a job here is a Job with
outputs[].url, not a fal result, a Replicate prediction or a WaveSpeeddatawrapper. - Last frames: fal
end_image_url, Replicatelast_frame_image, WaveSpeedlast_image. - Reference videos and reference audio: fal
video_urlsandaudio_urls, Replicate and WaveSpeedreference_videosandreference_audios. - An automatic length or ratio, the ratios 4:3, 3:4 and 21:9, and 1080p or 4K renders. Higher resolutions here are a separate step,
enhance, labeled AI Enhanced. - A first frame together with reference images. Replicate refuses that too.
- Waiting for the result in one call (fal.run, Replicate's
Prefer: wait, WaveSpeed'senable_sync_mode): every job here is async. - Several images per job, PNG or WebP output, free width and height, several source images for an edit, LoRAs and sampler settings.
- Their webhook verification: our deliveries carry
X-Signature, an HMAC-SHA256 with your whsec_ secret, not fal's ED25519 signature or thewebhook-signatureheader. - Paying after use: credits are prepaid, every job has a cap, and a job above
max_creditsis refused, not charged. - Long-lived output links: ours last 24 hours. Read the job again for a fresh one.
Before and after
The same Seedance 2.0 Fast request with a first frame, as each platform documents it, then on /v1. The price cap comes from our price engine.
curl -X POST https://queue.fal.run/bytedance/seedance-2.0/fast/image-to-video \
-H "Authorization: Key $FAL_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Slow dolly-in on a ceramic mug on a wooden table, morning window light",
"image_url": "https://example.com/first-frame.jpg",
"duration": "5",
"resolution": "720p",
"aspect_ratio": "16:9",
"generate_audio": true
}'curl https://api.pershot.app/v1/videos/generations \
-H "Authorization: Bearer $API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2.0-fast",
"prompt": "Slow dolly-in on a ceramic mug on a wooden table, morning window light",
"image_url": "https://example.com/first-frame.jpg",
"duration": 5,
"resolution": "720p",
"aspect_ratio": "16:9",
"generate_audio": true,
"max_credits": 34
}'Prices are ours
Every job here is quoted in credits before it runs (US$1 = 100 credits) and never costs more than its quote or max_credits.
What fal, Replicate and WaveSpeed charge is on their own pages. Our comparison pages list their published Seedance 2.0 prices, each with the date it was read.
| Model | 480p, per second | 720p, per second |
|---|---|---|
Seedance 2.0 Fastseedance-2.0-fast | $0.031 | $0.067 |
Seedance 2.0 Miniseedance-2.0-mini | $0.020 | $0.042 |
| Model | 1K, per image | 2K, per image |
|---|---|---|
Qwen-Image-2512 · Lightning 4-stepqwen-image-2512-lightning | 1 cr | 3 cr |
Qwen-Image-2512qwen-image-2512 | 2 cr | 6 cr |
Qwen-Image-Edit-2511 · Lightningqwen-image-edit-2511-lightning | 2 cr | 4 cr |
Qwen-Image-Edit-2511qwen-image-edit-2511 | 3 cr | 10 cr |
Sources
Their field names and behavior as their public pages showed them on 2026-10-22. Check their docs before you switch:
- fal
- fal.ai/models/bytedance/seedance-2.0/fast/text-to-video/llms.txtfal.ai/models/bytedance/seedance-2.0/fast/image-to-video/llms.txtfal.ai/models/bytedance/seedance-2.0/fast/reference-to-video/llms.txtfal.ai/models/fal-ai/qwen-image-2512/llms.txtfal.ai/models/fal-ai/qwen-image-edit-2511/llms.txtfal.ai/docs/model-apis/model-endpoints/queuefal.ai/docs/model-apis/model-endpoints/webhooks
- Replicate
- replicate.com/bytedance/seedance-2.0-fast/llms.txtreplicate.com/qwen/qwen-image-2512/llms.txtreplicate.com/qwen/qwen-image-edit-2511/llms.txtreplicate.com/docs/reference/httpreplicate.com/docs/topics/webhooks/verify-webhook
- WaveSpeed
- wavespeed.ai/models/bytedance/seedance-2.0-fast/text-to-videowavespeed.ai/models/bytedance/seedance-2.0-fast/image-to-videowavespeed.ai/models/wavespeed-ai/qwen-image/text-to-image-2512wavespeed.ai/models/wavespeed-ai/qwen-image/edit-2511wavespeed.ai/docs/submit-taskwavespeed.ai/docs/how-to-use-webhookswavespeed.ai/docs/verify-webhookswavespeed.ai/docs/data-retention-policy