Skip to content

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.

Their docs checked2026-10-22OpenAPIllms.txt

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: Bearer with a key that starts with sk_test_ or sk_live_.
  • The model id goes in the body as model, and one id covers text, a first frame and references.
  • An Idempotency-Key header on every generation request.
  • A price cap: max_credits, or a quote_id from POST /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_urls to reference_image_urls, send duration as a number, and move fal_webhook into the body as webhook_url.
Replicate
Take the fields out of input. Also rename image to image_url, reference_images to reference_image_urls and webhook to webhook_url.
WaveSpeed
Also rename image to image_url and reference_images to reference_image_urls, and move standard_webhook into the body as webhook_url. Read results from GET /v1/jobs/{id}.

Authentication

Where requests go and how they are signed.

PlatformBase URLAuth header
Pershothttps://api.pershot.app/v1Authorization: Bearer $API_KEY
falhttps://queue.fal.runAuthorization: Key $FAL_KEY
Replicatehttps://api.replicate.com/v1Authorization: Bearer $REPLICATE_API_TOKEN
WaveSpeedhttps://api.wavespeed.ai/api/v3Authorization: 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.

Model ids on each platform
OursfalReplicateWaveSpeedNotes
seedance-2.0-fastbytedance/seedance-2.0/fast/text-to-videobytedance/seedance-2.0/fast/image-to-videobytedance/seedance-2.0/fast/reference-to-videobytedance/seedance-2.0-fastbytedance/seedance-2.0-fast/text-to-videobytedance/seedance-2.0-fast/image-to-videoOne id for text, a first frame and reference images.
seedance-2.0-minibytedance/seedance-2.0/mini/text-to-videobytedance/seedance-2.0/mini/image-to-videobytedance/seedance-2.0/mini/reference-to-videobytedance/seedance-2.0-minibytedance/seedance-2.0-mini/text-to-videoOne id for text, a first frame and reference images.
qwen-image-2512fal-ai/qwen-image-2512qwen/qwen-image-2512wavespeed-ai/qwen-image/text-to-image-2512The same open weights.
qwen-image-2512-lightningfal-ai/qwen-image-2512/loranonenoneOur 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-2511fal-ai/qwen-image-edit-2511qwen/qwen-image-edit-2511wavespeed-ai/qwen-image/edit-2511The same open weights.
qwen-image-edit-2511-lightningfal-ai/qwen-image-edit-2511/loranonenoneOur 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 exampleseedance-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.

Seedance 2.0 request fields on each platform
OursfalReplicateWaveSpeedNotes
modelin the URLin the URLin the URLOne id in the body for text, a first frame and references. Theirs is in the URL.
promptpromptpromptpromptThe same text carries over.
durationdurationdurationdurationA whole number, 4 to 15, default 5. fal sends a string and offers auto; Replicate uses -1 for automatic. No automatic length here.
resolutionresolutionresolutionresolution480p or 720p, default 720p. WaveSpeed also lists 1080p and 4k; here higher resolutions are the separate enhance step.
aspect_ratioaspect_ratioaspect_ratioaspect_ratio16:9, 9:16 or 1:1, default 16:9. No auto, adaptive, 4:3, 3:4 or 21:9.
generate_audiogenerate_audiogenerate_audiogenerate_audioThe same meaning, on by default. The price is the same on or off.
image_urlimage_urlimageimageThe first frame. The same name as fal's; Replicate and WaveSpeed call it image. Not with reference images.
reference_image_urlsimage_urlsreference_imagesreference_imagesUp to 9 images, @image1, @image2 in the prompt. Differs from fal, which calls it image_urls.
seednoneseednoneAccepted and not used: Seedance 2.0 takes no seed. fal and WaveSpeed list none.
quote_idnonenonenoneNew: send exactly one of quote_id or max_credits. A job never costs more.
max_creditsnonenonenoneNew: send exactly one of quote_id or max_credits. A job never costs more.
webhook_urlfal_webhookquery stringwebhookstandard_webhookquery stringIn the body. Differs from fal, which takes fal_webhook in the query string.
end_user_idend_user_idnonenoneThe same name as fal's. For approved developer accounts (access is by application): your own user id, shown in usage.
project_idnonenonenoneOurs only, optional: projects and supplier routing.
shot_idnonenonenoneOurs only, optional: projects and supplier routing.
routing_preferencenonenonenoneOurs only, optional: projects and supplier routing.
enhancenonenonenoneOurs only, optional: an AI upscale after the render, labeled AI Enhanced.
Idempotency-KeyheadernonenonenoneNew 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.

Qwen-Image request fields on each platform
OursfalReplicateWaveSpeedNotes
modelin the URLin the URLin the URLFour ids in the body: Image Mini and Image Fast, each for generating and editing.
promptpromptpromptpromptThe same text carries over.
sizeimage_sizenonesize1K 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_ratioimage_sizeaspect_ratiosize16:9, 9:16 or 1:1, default 1:1. It does not change the price.
image_urlimage_urlsimageimagesEdit models only: exactly one source image, as a URL. Theirs take a list.
seedseedseedseedThe same meaning.
quote_idnonenonenoneNew: send exactly one of quote_id or max_credits. A job never costs more.
max_creditsnonenonenoneNew: send exactly one of quote_id or max_credits. A job never costs more.
webhook_urlfal_webhookquery stringwebhookstandard_webhookquery stringIn the body. Differs from fal, which takes fal_webhook in the query string.
end_user_idnonenonenoneOurs only, optional, for approved developer accounts (access is by application): your own user id, shown in usage.
project_idnonenonenoneOurs only, optional: projects and supplier routing.
shot_idnonenonenoneOurs only, optional: projects and supplier routing.
routing_preferencenonenonenoneOurs only, optional: projects and supplier routing.
Idempotency-KeyheadernonenonenoneNew 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:

Jobs and webhooks on each platform
StepPershotfalReplicateWaveSpeed
CreatePOST /v1/videos/generationsPOST /v1/images/generations202 → { id: "job_…" }POST https://queue.fal.run/<endpoint id>→ request_id, status_url, response_urlPOST /v1/models/{owner}/{name}/predictions{ "input": { … } }POST /api/v3/<model id>→ data.id
PollGET /v1/jobs/{id}GET status_urlGET response_urlGET /v1/predictions/{id}GET /api/v3/predictions/{id}/result
StatusesqueuedprocessingsucceededfailedcancelledunknownIN_QUEUEIN_PROGRESSCOMPLETEDstartingprocessingsucceededfailedcanceledcreatedcompletedfailedcancelledtimeoutdeleted
Webhookwebhook_url (body)?fal_webhook=…webhook (body)webhook_events_filter?standard_webhook=…?webhook=… (legacy)
SignatureX-Signature: t=…,v1=…HMAC-SHA256, whsec_…X-Event-IdX-Fal-Webhook-SignatureED25519, JWKSwebhook-idwebhook-timestampwebhook-signaturewebhook-idwebhook-timestampwebhook-signature
Delivery retriesAfter 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 filesSigned 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 callNone: every job is async. Over MCP, wait_for_job waits up to 60 seconds.POST https://fal.run/<endpoint id>Prefer: wait=nenable_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 WaveSpeed data wrapper.
  • Last frames: fal end_image_url, Replicate last_frame_image, WaveSpeed last_image.
  • Reference videos and reference audio: fal video_urls and audio_urls, Replicate and WaveSpeed reference_videos and reference_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's enable_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 the webhook-signature header.
  • Paying after use: credits are prepaid, every job has a cap, and a job above max_credits is 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.

Before
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
  }'
After: /v1
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.

Our API rates per billed second
Model480p, per second720p, per second
Seedance 2.0 Fastseedance-2.0-fast$0.031$0.067
Seedance 2.0 Miniseedance-2.0-mini$0.020$0.042
Our credits per image
Model1K, per image2K, per image
Qwen-Image-2512 · Lightning 4-stepqwen-image-2512-lightning1 cr3 cr
Qwen-Image-2512qwen-image-25122 cr6 cr
Qwen-Image-Edit-2511 · Lightningqwen-image-edit-2511-lightning2 cr4 cr
Qwen-Image-Edit-2511qwen-image-edit-25113 cr10 cr

Sources

Their field names and behavior as their public pages showed them on 2026-10-22. Check their docs before you switch: