TL;DR : Pour générer une vidéo avec une API d'IA, vous envoyez une requête POST avec un prompt texte vers l'endpoint du modèle vidéo, recevez un ID de tâche, puis interrogez cette tâche jusqu'à ce que le MP4 final soit prêt — environ dix lignes de Python. L'API unifiée de GPTProto place cinq modèles vidéo derrière une seule clé et un seul solde : Seedance 2.0, ViduQ3-pro, Kling v3.0 std, Hailuo 2.3 Pro et Veo 3.1. Vous passez de l'un à l'autre en changeant une seule chaîne dans l'URL — l'authentification, la forme de la requête et l'interrogation restent identiques. La facturation est prépayée, à l'usage, à partir d'environ 0,04 $ par seconde de vidéo.
Appeler cinq modèles vidéo différents signifiait autrefois cinq comptes, cinq SDK et cinq tableaux de bord de facturation. Vous voulez Seedance 2.0 de ByteDance ? C'est un compte BytePlus (Volcano Engine) et une vérification d'identité que la plupart des gens hors de Chine ne peuvent pas obtenir en un après-midi. Vous voulez Veo de Google ? Console différente, clé différente. Vous voulez comparer deux modèles sur le même prompt ? Vous devez alors maintenir deux intégrations qui ne partagent rien.
Ce guide vous évite tout cela. Vous ferez votre premier appel API texte-vers-vidéo en une dizaine de lignes de Python, interrogerez pour récupérer le MP4 terminé, puis atteindrez quatre autres modèles en changeant une seule chaîne dans l'URL — même clé, même code, même solde.
Transparence totale : je rédige ces guides d'intégration pour GPTProto, donc je suis partie prenante dans le choix de l'endpoint que vous utilisez. J'ai quand même gardé des chiffres honnêtes, y compris pour le modèle ci-dessous où nous coûtons plus cher qu'en direct. Le cas échéant, je le dis.
Ce qu'est réellement une API de génération vidéo par IA
Ce n'est pas un bouton sans code. C'est un travail asynchrone : vous envoyez un prompt en POST, l'API renvoie un ID, le modèle génère pendant trente secondes à plusieurs minutes, et vous interrogez un deuxième endpoint jusqu'à ce que la vidéo soit prête. Ce délai de rendu est la raison même de cette conception en deux étapes — la vidéo prend trop de temps pour garder une connexion HTTP ouverte, vous recevez donc un ticket de tâche au lieu d'un fichier.
Trois formes de requêtes couvrent presque tout ce que vous construirez :
- texte-vers-vidéo — un prompt devient un clip.
- image-vers-vidéo — une image fixe est animée.
- référence-vers-vidéo — une ou plusieurs images de référence maintiennent la cohérence d'un personnage ou d'un objet d'un plan à l'autre.
Tout ce qui suit utilise la même URL de base, https://gptproto.com/api/v3, et le même en-tête. Obtenons une clé et faisons le premier appel.
Obtenez votre clé API
Inscrivez-vous sur gptproto.com, ouvrez la section API Keys du tableau de bord, puis créez une clé. Elle ressemble à sk-.... Il n'y a pas de niveau gratuit permanent ici — la facturation est prépayée, à l'usage, donc vous approvisionnez un solde et chaque appel le débite dès la première requête. Prévoyez quelques dollars pour les tests ; une poignée de clips courts ne coûtera pas plus que cela.
Installez l'unique dépendance :
pip install requests
Un point à bien comprendre avant votre premier appel, car il piège beaucoup de monde : sur la surface native /api/v3/, l'en-tête Authorization contient votre clé brute, sans préfixe Bearer. GPT Proto expose aussi une surface compatible OpenAI /v1/, et celle-ci utilise Bearer. Les mélanger est la cause la plus fréquente d'erreur 401 que je vois. Pour tout ce tutoriel, nous restons sur la surface native, donc la clé est envoyée brute.
Votre premier appel : Seedance 2.0, texte-vers-vidéo
Seedance 2.0 est le modèle vidéo de deuxième génération de ByteDance. Il génère des clips de 4 à 15 secondes jusqu'en 1080p avec un audio natif et synchronisé, et il est conçu pour les scènes multi-plans où la caméra coupe et le sujet reste cohérent. Voici une soumission texte-vers-vidéo complète :
import requests
import time
API_KEY = "sk-your-key-here" # raw, no "Bearer" prefix
BASE = "https://gptproto.com/api/v3"
headers = {
"Authorization": API_KEY,
"Content-Type": "application/json",
}
def submit_seedance(prompt):
url = f"{BASE}/bytedance/dreamina-seedance-2-0-260128/text-to-video"
payload = {
"prompt": prompt,
"duration": 5, # 4-15 seconds
"aspect_ratio": "16:9",
"resolution": "1080p",
"generate_audio": True,
"camera_fixed": False,
"seed": -1, # -1 = random
}
resp = requests.post(url, headers=headers, json=payload)
resp.raise_for_status()
return resp.json()["data"]["id"]
prompt = (
"A lighthouse keeper climbs a narrow spiral staircase at dawn. "
"Cut to a wide shot of the lamp room as the light sweeps across "
"grey water. Waves crash below. Ambient wind and distant gulls."
)
job_id = submit_seedance(prompt)
print("submitted:", job_id)
La même requête en cURL, si vous préférez voir le format brut :
curl -X POST "https://gptproto.com/api/v3/bytedance/dreamina-seedance-2-0-260128/text-to-video" \
-H "Authorization: sk-your-key-here" \
-H "Content-Type: application/json" \
-d '{
"prompt": "A lighthouse keeper climbs a spiral staircase at dawn, then the lamp sweeps across grey water.",
"duration": 5,
"aspect_ratio": "16:9",
"resolution": "1080p",
"generate_audio": true,
"camera_fixed": false,
"seed": -1
}'
La réponse ne contient pas de vidéo. Elle contient une tâche :
{
"data": {
"id": "cgt-20260709xxxxxx-abc",
"status": "created",
"outputs": [],
"urls": { "get": "https://gptproto.com/api/v3/predictions/cgt-20260709xxxxxx-abc/result" }
},
"message": "success",
"code": 200
}
data.id est votre ticket. data.urls.get est une URL d'interrogation prête à l'emploi, avec l'ID déjà inclus. En résumé : vous avez soumis un travail, vous avez obtenu un ID, et rien n'est encore généré.
Interroger pour obtenir le résultat
Vous appelez maintenant l'endpoint de résultat jusqu'à ce que status passe à completed, puis vous lisez l'URL de la vidéo dans outputs. Chaque modèle de la plateforme utilise ce même endpoint d'interrogation et la même forme de réponse, ce qui permet à l'astuce « changer une chaîne » de fonctionner plus loin :
def wait_for_video(job_id, every=5, timeout=600):
url = f"{BASE}/predictions/{job_id}/result"
waited = 0
while waited < timeout:
resp = requests.get(url, headers=headers)
resp.raise_for_status()
data = resp.json()["data"]
status = data["status"]
if status == "completed":
return data["outputs"][0] # the MP4 URL
if data.get("error"):
raise RuntimeError(data["error"])
print(f" {status}... {waited}s")
time.sleep(every)
waited += every
raise TimeoutError(f"timed out after {timeout}s (last status: {status})")
video_url = wait_for_video(job_id)
print("done:", video_url)
Voilà une génération complète et fonctionnelle. Deux fonctions, un prompt, un MP4. Un clip de 5 secondes se termine généralement en une minute ou deux, même si un rendu 1080p de 15 secondes avec audio peut prendre plus de temps — interrogez toutes les quelques secondes et ne martelez pas l'API.
Une remarque sur la boucle : je lève une exception sur error et je traite tout statut non-completed, sans erreur, comme « continuer à attendre ». C'est délibéré. Différents modèles rapportent les états intermédiaires différemment, et la décision sûre est d'attendre tout ce qui n'est pas un échec franc plutôt que de coder en dur une liste de statuts qui pourrait changer.
Changez une chaîne, changez de moteur : ViduQ3-pro
Voici l'intérêt. Pour générer le même prompt sur ViduQ3-pro au lieu de Seedance, vous changez le chemin — rien d'autre. La clé, les en-têtes et wait_for_video() restent exactement tels quels :
def submit_vidu(prompt):
url = f"{BASE}/vidu/viduq3-pro/text-to-video"
payload = {
"prompt": prompt,
"duration": 5, # ViduQ3 goes up to 16s
"aspect_ratio": "16:9",
"resolution": "1080p",
"audio": True, # note: ViduQ3 uses `audio`, not `generate_audio`
"seed": -1,
}
resp = requests.post(url, headers=headers, json=payload)
resp.raise_for_status()
return resp.json()["data"]["id"]
job_id = submit_vidu(prompt)
video_url = wait_for_video(job_id) # same poller, unchanged
ViduQ3-pro pousse les clips jusqu'à 16 secondes — deux fois la plage pratique de Seedance — et c'est le modèle le moins cher ici à la seconde. Les noms de paramètres changent un peu d'un modèle à l'autre (ViduQ3 contrôle le son avec audio ; Seedance utilise generate_audio), alors consultez la page du modèle pour l'ensemble exact des champs, mais le rythme requête/soumission/interrogation ne change jamais.
Garder un personnage cohérent. Les deux modèles vedettes ne font pas que du texte-vers-vidéo. Dirigez ViduQ3 vers /vidu/viduq3-pro/image-to-video avec un champ image pour animer une image fixe, ou utilisez le mode référence-vers-vidéo de Seedance avec des images de référence pour que le même visage soit cohérent d'un plan à l'autre. C'est le même flux soumission/interrogation — vous ajoutez une entrée image, vous n'apprenez pas une nouvelle API. Vérifiez les noms des champs de référence sur chaque page de modèle avant de l'intégrer en production.
Quel modèle choisir ?
Cinq modèles, une seule clé. Ce ne sont pas des paliers hiérarchiques où le plus grand nombre gagne toujours — ce sont des missions différentes. Choisissez selon les besoins du clip :
| Modèle |
Chemin ({provider}/{model}) |
Audio natif |
Durée max |
Prix |
À utiliser quand |
| Seedance 2.0 |
bytedance/dreamina-seedance-2-0-260128 |
Oui |
~15s |
à partir de 0,2957 $/exécution |
Scènes multi-plans avec son synchronisé |
| ViduQ3-pro |
vidu/viduq3-pro |
Oui |
16s |
à partir de 0,04 $/s |
Clips plus longs, prix le plus bas |
| Kling v3.0 std |
kling/kling-v3.0-std |
Oui |
~10s |
à partir de 0,2016 $/exécution |
Image-vers-vidéo économique et fiable |
| Hailuo 2.3 Pro |
minimax/hailuo-2.3-pro |
Non |
~10s |
0,441 $/exécution |
1080p net quand vous ajouterez le son vous-même |
| Veo 3.1 |
google/veo3.1 |
Oui |
— |
à partir de 0,5 $/exécution |
Sortie 4K requise |
Deux points méritent d'être signalés avant de vous lancer. Hailuo 2.3 Pro renvoie une vidéo silencieuse — excellente image, mais vous composerez la bande-son en post-production. Et Veo 3.1 appose sur chaque sortie un filigrane SynthID intégré que vous ne pouvez pas désactiver, ce qui compte si vous livrez à un client qui ne veut pas de marques de provenance intégrées.
Comme la plateforme normalise tout cela derrière un même contrat soumission/interrogation, passer de l'un à l'autre est une simple recherche dans un dictionnaire, pas une réécriture :
MODELS = {
"seedance": "bytedance/dreamina-seedance-2-0-260128",
"vidu": "vidu/viduq3-pro",
"kling": "kling/kling-v3.0-std",
"hailuo": "minimax/hailuo-2.3-pro",
"veo": "google/veo3.1",
}
def submit(model_key, scene, payload):
url = f"{BASE}/{MODELS[model_key]}/{scene}"
resp = requests.post(url, headers=headers, json=payload)
resp.raise_for_status()
return resp.json()["data"]["id"]
# same wait_for_video() retrieves any of them
job_id = submit("kling", "image-to-video", {"prompt": prompt, "image": image_url})
Les charges utiles diffèrent selon le modèle — c'est la partie que vous ajustez — mais la découverte, l'authentification et la récupération ne changent pas.
Ce que ça coûte réellement
La tarification vidéo est à la seconde ou par exécution, et elle augmente fortement avec la résolution, la durée et la génération d'audio. Le chiffre mis en avant sur la page d'un modèle est un plancher, pas une prévision. Exemple concret : un clip Seedance en 720p / 16:9 / 5 secondes avec audio revient à environ 0,605 $ — bien au-dessus de sa base de 0,2957 $ — parce que vous avez activé tous les leviers de coût à la fois. Évaluez vos réglages réels à partir de l'estimation du tableau de bord, pas de l'étiquette.
Voici la comparaison honnête avec l'appel direct à chaque fournisseur :
- ViduQ3-pro — à partir de 0,04 $/s, environ 20 % sous la référence du marché à ~0,05 $/s.
- Kling v3.0 std — à partir de 0,2016 $/exécution, environ 20 % sous la référence de ~0,252 $.
- Hailuo 2.3 Pro — 0,441 $/exécution contre ~0,49 $ chez MiniMax, environ 10 % moins cher.
- Seedance 2.0 — à partir de 0,2957 $/exécution, soit environ 10 % au-dessus du rendu du même clip directement sur Dreamina, la plateforme de ByteDance. Je ne vais pas prétendre le contraire. L'intérêt de passer par l'API n'est pas un prix plus bas — c'est un accès programmatique stable, un seul solde et pas de vérification d'identité BytePlus. Si le coût est votre seul critère pour Seedance, le passage en direct est moins cher.
- Veo 3.1 — à partir de 0,5 $/exécution ; il n'y a pas de référence de marché claire sur la page, alors considérez-le comme un choix pratique, pas une remise.
Il n'y a pas de niveau gratuit ni d'abonnement mensuel — vous payez par appel dès la première requête. Pour la tarification d'un modèle spécifique, le catalogue de modèles affiche les tableaux actuels par seconde et par résolution.
Erreurs et pièges à éviter
Un petit guide des problèmes courants :
- 401 Non autorisé — presque toujours l'inversion avec
Bearer. La surface native /api/v3/ attend la clé brute.
- 403 Interdit — généralement un solde vide, pas un problème de permissions. Rechargez.
- 429 — vous êtes limité en débit ; reculez et réessayez.
- 400 avec un message de contenu — le prompt a déclenché la modération. Les réponses contiennent aussi un indicateur
has_nsfw_contents qu'il vaut la peine de vérifier dans un pipeline.
- L'interrogation ne se termine jamais — les rendus longs existent ; c'est pourquoi
wait_for_video() a un délai maximal au lieu de boucler indéfiniment.
- Mauvais paramètre audio —
generate_audio (Seedance) vs audio (ViduQ3). Envoyer le mauvais paramètre ne fait rien, silencieusement, au lieu de renvoyer une erreur, ce qui est pire. Vérifiez les noms de champs pour chaque modèle.
Commencez ici
Le chemin le plus rapide : prenez une clé, exécutez les extraits Seedance et ViduQ3 ci-dessus, puis changez la chaîne du modèle pour essayer les autres. Tout ce qu'il vous faut pour choisir un modèle — tarifs actuels, modes pris en charge, tableaux de résolutions — se trouve sur chaque page de modèle dans le catalogue. Une clé, un solde, cinq moteurs vidéo.