Aller au contenu

Vous venez de fal, Replicateou WaveSpeed

Passer vos appels Seedance 2.0 et Qwen-Image à /v1 : authentification, identifiants de modèle, chaque champ, tâches asynchrones et webhooks, et ce qui ne se transpose pas.

Vérification de leur documentation2026-10-22OpenAPIllms.txt

Pas un simple changement d’URL de base

Changer l’URL de base et la clé ne suffit sur aucune des trois. Chaque requête change aussi sur ces points :

  • La clé : Authorization: Bearer avec une clé qui commence par sk_test_ ou sk_live_.
  • L’identifiant du modèle va dans le corps, sous model, et un seul identifiant couvre le texte, une première image et des références.
  • Un en-tête Idempotency-Key sur chaque requête de génération.
  • Un plafond de prix : max_credits, ou un quote_id obtenu avec POST /v1/quotes.
  • Le résultat est une tâche : interrogez GET /v1/jobs/{id} ou recevez notre webhook signé.
fal
Le plus proche de notre API : la plupart des noms de champs Seedance sont ceux de fal. Renommez aussi image_urls en reference_image_urls, envoyez duration sous forme de nombre, et déplacez fal_webhook dans le corps, sous webhook_url.
Replicate
Sortez les champs de input. Renommez aussi image en image_url, reference_images en reference_image_urls et webhook en webhook_url.
WaveSpeed
Renommez aussi image en image_url et reference_images en reference_image_urls, et déplacez standard_webhook dans le corps, sous webhook_url. Lisez les résultats avec GET /v1/jobs/{id}.

Authentification

Où vont les requêtes et comment elles sont signées.

PlateformeURL de baseEn-tête d’authentification
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

L’accès à l’API développeur se fait sur demande : demandez-le dans le studio, sous Clés API. La clé n’est affichée qu’une fois. Une clé développeur dépense le solde de l’API développeur, et la même clé fonctionne comme en-tête Bearer sur le serveur MCP.

Identifiants de modèle

Les leurs vont dans l’URL ; le nôtre va dans le corps, sous model. Un seul de nos identifiants couvre le texte, une première image et des références : ce sont les champs envoyés qui décident.

Identifiants de modèle sur chaque plateforme
Chez nousfalReplicateWaveSpeedRemarques
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-videoUn seul identifiant pour le texte, une première image et des images de référence.
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-videoUn seul identifiant pour le texte, une première image et des images de référence.
qwen-image-2512fal-ai/qwen-image-2512qwen/qwen-image-2512wavespeed-ai/qwen-image/text-to-image-2512Les mêmes poids ouverts.
qwen-image-2512-lightningfal-ai/qwen-image-2512/loraaucunaucunNotre niveau Lightning en 4 étapes. fal l’exécute comme un LoRA sur son point d’accès /lora ; nous n’avons trouvé aucun modèle Lightning prêt à l’emploi sur Replicate ni sur WaveSpeed.
qwen-image-edit-2511fal-ai/qwen-image-edit-2511qwen/qwen-image-edit-2511wavespeed-ai/qwen-image/edit-2511Les mêmes poids ouverts.
qwen-image-edit-2511-lightningfal-ai/qwen-image-edit-2511/loraaucunaucunNotre niveau Lightning en 4 étapes. fal l’exécute comme un LoRA sur son point d’accès /lora ; nous n’avons trouvé aucun modèle Lightning prêt à l’emploi sur Replicate ni sur WaveSpeed.
Pour les agents IA
Texte brut pour les agents IA : entrées, valeurs admises, chaque prix et un exemple de requêteseedance-2.0-fastseedance-2.0-miniqwen-image-2512-lightningqwen-image-2512qwen-image-edit-2511-lightningqwen-image-edit-2511

Seedance 2.0, champ par champ

Nos noms suivent ceux de fal quand fal a le champ, et les remarques indiquent les différences. Les champs se trouvent au premier niveau du corps JSON ; Replicate les enveloppe dans input.

Champs de requête Seedance 2.0 sur chaque plateforme
Chez nousfalReplicateWaveSpeedRemarques
modeldans l’URLdans l’URLdans l’URLUn seul identifiant dans le corps pour le texte, une première image et des références. Le leur est dans l’URL.
promptpromptpromptpromptLe même texte se reprend tel quel.
durationdurationdurationdurationUn nombre entier, de 4 à 15, par défaut 5. fal envoie une chaîne et propose auto ; Replicate utilise -1 pour une durée automatique. Pas de durée automatique ici.
resolutionresolutionresolutionresolution480p ou 720p, par défaut 720p. WaveSpeed propose aussi 1080p et 4k ; ici, les résolutions supérieures passent par l’étape distincte enhance.
aspect_ratioaspect_ratioaspect_ratioaspect_ratio16:9, 9:16 ou 1:1, par défaut 16:9. Pas de auto, adaptive, 4:3, 3:4 ni 21:9.
generate_audiogenerate_audiogenerate_audiogenerate_audioMême signification, activé par défaut. Le prix est le même, activé ou non.
image_urlimage_urlimageimageLa première image. Même nom que chez fal ; Replicate et WaveSpeed l’appellent image. Pas avec des images de référence.
reference_image_urlsimage_urlsreference_imagesreference_imagesJusqu’à 9 images, désignées par @image1, @image2 dans le prompt. Diffère de fal, qui l’appelle image_urls.
seedaucunseedaucunAccepté mais non utilisé : Seedance 2.0 ne prend pas de graine. fal et WaveSpeed n’en proposent pas.
quote_idaucunaucunaucunNouveau : envoyez exactement l’un des deux, quote_id ou max_credits. Une tâche ne coûte jamais plus.
max_creditsaucunaucunaucunNouveau : envoyez exactement l’un des deux, quote_id ou max_credits. Une tâche ne coûte jamais plus.
webhook_urlfal_webhookchaîne de requêtewebhookstandard_webhookchaîne de requêteDans le corps. Diffère de fal, qui prend fal_webhook dans la chaîne de requête.
end_user_idend_user_idaucunaucunLe même nom que chez fal. Pour les comptes développeur approuvés (accès sur demande) : votre propre identifiant utilisateur, affiché dans l’utilisation.
project_idaucunaucunaucunUniquement chez nous, facultatif : projets et routage vers les fournisseurs.
shot_idaucunaucunaucunUniquement chez nous, facultatif : projets et routage vers les fournisseurs.
routing_preferenceaucunaucunaucunUniquement chez nous, facultatif : projets et routage vers les fournisseurs.
enhanceaucunaucunaucunUniquement chez nous, facultatif : un agrandissement par IA après le rendu, étiqueté AI Enhanced.
Idempotency-Keyen-têteaucunaucunaucunNouveau et obligatoire : la même clé dans les 24 heures renvoie la même tâche.

Leurs champs Seedance sans équivalent ici. Envoyés tels quels, ils sont refusés comme champs inconnus (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, champ par champ

Notre corps de requête d’image est plus réduit que le leur : une taille et un format d’image au lieu de pixels libres, une image par tâche, et aucun réglage d’échantillonneur.

Champs de requête Qwen-Image sur chaque plateforme
Chez nousfalReplicateWaveSpeedRemarques
modeldans l’URLdans l’URLdans l’URLQuatre identifiants dans le corps : Image Mini et Image Fast, chacun pour la génération et la retouche.
promptpromptpromptpromptLe même texte se reprend tel quel.
sizeimage_sizeaucunsize1K ou 2K, par défaut 1K. Avec le format d’image, elle donne une taille fixe, 2048 px par côté au maximum. Pas de largeur ni de hauteur libres.
aspect_ratioimage_sizeaspect_ratiosize16:9, 9:16 ou 1:1, par défaut 1:1. Il ne change pas le prix.
image_urlimage_urlsimageimagesModèles de retouche uniquement : exactement une image source, sous forme d’URL. Les leurs prennent une liste.
seedseedseedseedMême signification.
quote_idaucunaucunaucunNouveau : envoyez exactement l’un des deux, quote_id ou max_credits. Une tâche ne coûte jamais plus.
max_creditsaucunaucunaucunNouveau : envoyez exactement l’un des deux, quote_id ou max_credits. Une tâche ne coûte jamais plus.
webhook_urlfal_webhookchaîne de requêtewebhookstandard_webhookchaîne de requêteDans le corps. Diffère de fal, qui prend fal_webhook dans la chaîne de requête.
end_user_idaucunaucunaucunUniquement chez nous, facultatif, pour les comptes développeur approuvés (accès sur demande) : votre propre identifiant utilisateur, affiché dans l’utilisation.
project_idaucunaucunaucunUniquement chez nous, facultatif : projets et routage vers les fournisseurs.
shot_idaucunaucunaucunUniquement chez nous, facultatif : projets et routage vers les fournisseurs.
routing_preferenceaucunaucunaucunUniquement chez nous, facultatif : projets et routage vers les fournisseurs.
Idempotency-Keyen-têteaucunaucunaucunNouveau et obligatoire : la même clé dans les 24 heures renvoie la même tâche.

Leurs champs Qwen-Image sans équivalent ici. Envoyés tels quels, ils sont refusés comme champs inconnus (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

Tâches asynchrones et webhooks

Les quatre exécutent les tâches en arrière-plan. Comment chacun nomme les étapes :

Tâches et webhooks sur chaque plateforme
ÉtapePershotfalReplicateWaveSpeed
CréationPOST /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
InterrogationGET /v1/jobs/{id}GET status_urlGET response_urlGET /v1/predictions/{id}GET /api/v3/predictions/{id}/result
StatutsqueuedprocessingsucceededfailedcancelledunknownIN_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
Nouvelles tentatives de livraisonAprès 1 min, 5 min, 30 min, 2 h et 6 h. Un 2xx en moins de 10 secondes vaut livraison.Jusqu’à 31 nouvelles tentatives, tant que le résultat stocké n’a pas expiré.Peut retenter : gérez les doublons.Jusqu’à 3 nouvelles tentatives.
Fichiers de sortieLiens signés valables 24 heures ; relisez la tâche pour en obtenir un nouveau. Les fichiers sont conservés 12 mois.Selon vos réglages d’expiration des médias.Supprimés au bout d’une heure pour les prédictions créées via l’API.Conservés jusqu’à 7 jours.
Attente en un seul appelAucune : chaque tâche est asynchrone. Via MCP, wait_for_job attend jusqu’à 60 secondes.POST https://fal.run/<endpoint id>Prefer: wait=nenable_sync_mode

Le corps de notre webhook est la tâche elle-même, et la signature est la nôtre : un code qui vérifie leurs webhooks refusera les nôtres. Comment vérifier les nôtres

Idempotence

Chaque requête de génération exige un en-tête Idempotency-Key de 1 à 255 caractères ASCII visibles. La même clé dans les 24 heures renvoie la même tâche avec HTTP 200 : une nouvelle tentative après un délai dépassé ne crée ni ne facture jamais une seconde tâche.

Aucune des trois ne documente de clé d’idempotence pour créer une tâche (2026-10-22) : fal suggère de dédoublonner les webhooks par request_id, et WaveSpeed demande de soumettre une seule fois et de rechercher la tâche avant de la soumettre à nouveau. Donnez à chaque tâche une clé et réutilisez-la à chaque nouvelle tentative.

Ce qui n’est pas compatible

Envoyés tels quels, ces éléments échouent ou sont refusés ici :

  • Leurs bibliothèques clientes (fal_client, replicate, wavespeed) n’appellent pas /v1. Utilisez du HTTP simple, le document OpenAPI ou le serveur MCP.
  • Leurs formats de réponse : ici, une tâche est un Job avec outputs[].url, pas un résultat fal, une prédiction Replicate ni une enveloppe data WaveSpeed.
  • Les dernières images : fal end_image_url, Replicate last_frame_image, WaveSpeed last_image.
  • Les vidéos et l’audio de référence : fal video_urls et audio_urls, Replicate et WaveSpeed reference_videos et reference_audios.
  • Une durée ou un format automatique, les formats 4:3, 3:4 et 21:9, et les rendus 1080p ou 4K. Ici, les résolutions supérieures sont une étape distincte, enhance, étiquetée AI Enhanced.
  • Une première image avec des images de référence. Replicate refuse aussi cette combinaison.
  • Attendre le résultat en un seul appel (fal.run, Prefer: wait chez Replicate, enable_sync_mode chez WaveSpeed) : ici, chaque tâche est asynchrone.
  • Plusieurs images par tâche, une sortie PNG ou WebP, une largeur et une hauteur libres, plusieurs images sources pour une retouche, les LoRA et les réglages d’échantillonneur.
  • Leur vérification des webhooks : nos livraisons portent X-Signature, un HMAC-SHA256 avec votre secret whsec_, pas la signature ED25519 de fal ni l’en-tête webhook-signature.
  • Le paiement après usage : les crédits sont prépayés, chaque tâche a un plafond, et une tâche au-delà de max_credits est refusée, pas facturée.
  • Les liens de sortie durables : les nôtres durent 24 heures. Relisez la tâche pour en obtenir un nouveau.

Avant et après

La même requête Seedance 2.0 Fast avec une première image, telle que chaque plateforme la documente, puis sur /v1. Le plafond de prix vient de notre moteur de prix.

Avant
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
  }'
Après : /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
  }'

Les prix sont les nôtres

Chaque tâche fait l’objet d’un devis en crédits avant d’être lancée (1 $ US = 100 crédits) et ne coûte jamais plus que son devis ou max_credits.

Ce que facturent fal, Replicate et WaveSpeed figure sur leurs propres pages. Nos pages de comparaison indiquent leurs prix publiés pour Seedance 2.0, chacun avec la date à laquelle il a été relevé.

Nos tarifs API par seconde facturée
Modèle480p, par seconde720p, par seconde
Seedance 2.0 Fastseedance-2.0-fast0,031 $0,067 $
Seedance 2.0 Miniseedance-2.0-mini0,020 $0,042 $
Nos crédits par image
Modèle1K, par image2K, par 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

Leurs noms de champs et leur comportement tels que leurs pages publiques les présentaient le 2026-10-22. Vérifiez leur documentation avant de migrer :