Référence API Runway Public
PRÉREQUIS : Exécutez d'abord
+rw-check-compatibilitypour vérifier que le projet dispose de capacités côté serveur.
URL de base : https://api.dev.runwayml.com
Toutes les requêtes requièrent ces en-têtes :
Authorization: Bearer <RUNWAYML_API_SECRET>
X-Runway-Version: 2024-11-06
Modèles et endpoints
Génération vidéo
| Modèle | Endpoint | Entrée | Coût (crédits/sec) |
|---|---|---|---|
gen4.5 |
POST /v1/image_to_video ou POST /v1/text_to_video |
Texte et/ou image | 12 |
gen4_turbo |
POST /v1/image_to_video |
Image requise | 5 |
gen4_aleph |
POST /v1/video_to_video |
Vidéo + Texte/Image | 15 |
act_two |
POST /v1/character_performance |
Image/Vidéo | 5 |
veo3 |
POST /v1/image_to_video ou POST /v1/text_to_video |
Texte/Image | 40 |
veo3.1 |
POST /v1/image_to_video ou POST /v1/text_to_video |
Texte/Image | 20-40 |
veo3.1_fast |
POST /v1/image_to_video ou POST /v1/text_to_video |
Texte/Image | 10-15 |
seedance2 |
POST /v1/text_to_video, POST /v1/image_to_video, ou POST /v1/video_to_video |
Texte, image et/ou vidéo | 36 |
Durée vidéo : 2 à 15 secondes (dépend du modèle). Les rapports d'aspect sont basés sur les pixels : 1280:720, 720:1280, 1104:832, 960:960, 832:1104, 1584:672, etc.
Spécificités de Seedance 2 :
- Modes : text-to-video, image-to-video (première/dernière image ou référence d'image), video-to-video
- Durée : requise pour TTV et ITV (en secondes)
- Rapports d'aspect (basés sur pixels) :
1280:720,720:1280,960:960,1112:834,834:1112,1470:630,992:432,864:496,752:560,640:640,560:752,496:864 - ITV supporte deux modes mutuellement exclusifs : première/dernière image (tableau
promptImageavecposition) ou référence d'image (tableaureferences) - Exigences d'entrée VTV : max 15 secondes, max 32 Mo, min 720p, MP4 recommandé
Génération d'images
| Modèle | Endpoint | Coût (crédits) |
|---|---|---|
gen4_image |
POST /v1/text_to_image |
5 (720p), 8 (1080p) |
gen4_image_turbo |
POST /v1/text_to_image |
2 |
gemini_2.5_flash |
POST /v1/text_to_image |
5 |
Génération audio
| Modèle | Endpoint | Cas d'usage | Coût |
|---|---|---|---|
eleven_multilingual_v2 |
POST /v1/text_to_speech |
Synthèse vocale | 1 crédit/50 caractères |
eleven_text_to_sound_v2 |
POST /v1/sound_effect |
Effets sonores | 1-2 crédits |
eleven_voice_isolation |
POST /v1/voice_isolation |
Isoler la voix de l'audio | 1 crédit/6 sec |
eleven_voice_dubbing |
POST /v1/voice_dubbing |
Doubler l'audio vers d'autres langues | 1 crédit/2 sec |
eleven_multilingual_sts_v2 |
POST /v1/speech_to_speech |
Conversion vocale | 1 crédit/3 sec |
Personnages (Avatars en temps réel)
| Modèle | Description | Durée max de session |
|---|---|---|
gwm1_avatars |
Avatars conversationnels en temps réel alimentés par GWM-1 | 5 minutes |
Endpoints :
| Méthode | Endpoint | Description |
|---|---|---|
POST |
/v1/avatars |
Créer un nouvel avatar |
GET |
/v1/avatars/{id} |
Récupérer un avatar |
PATCH |
/v1/avatars/{id} |
Mettre à jour un avatar (nom, voix, personnalité, documentIds) |
DELETE |
/v1/avatars/{id} |
Supprimer un avatar |
POST |
/v1/realtime_sessions |
Créer une nouvelle session en temps réel |
GET |
/v1/realtime_sessions/{id} |
Récupérer le statut de la session (faire un polling jusqu'à READY) |
POST |
/v1/realtime_sessions/{id}/consume |
Consommer les identifiants de session pour WebRTC (usage unique) |
Paramètres de création d'avatar :
| Paramètre | Type | Description |
|---|---|---|
name |
string | Nom d'affichage de l'avatar |
referenceImage |
string | URL ou URI runway:// de l'image du personnage |
voice |
object | { type: 'runway-live-preset', presetId: 'clara' } |
personality |
string | Prompt système / instructions de personnalité |
documentIds |
string[] | Optionnel. ID des documents de la base de connaissances à joindre |
Présets vocaux : clara (doux), victoria (ferme), vincent (autoritaire). Prévisualisez tous les présets sur dev.runwayml.com.
Statuts de session : NOT_READY → READY → RUNNING → COMPLETED (ou FAILED / CANCELLED)
Documents (Base de connaissances)
| Méthode | Endpoint | Description |
|---|---|---|
POST |
/v1/documents |
Créer un document (texte brut ou Markdown) |
GET |
/v1/documents/{id} |
Récupérer un document |
DELETE |
/v1/documents/{id} |
Supprimer un document |
Chaque avatar supporte jusqu'à 50 000 tokens de connaissances. Liez des documents à un avatar via client.avatars.update(id, { documentIds: [...] }).
Référence du corps de requête (JSON brut)
À utiliser lors d'appels directs à l'API (par ex. via la commande request de use-runway-api) plutôt que via un SDK. Seuls les champs requis et courants sont affichés — consultez +rw-fetch-api-reference pour le schéma complet.
POST /v1/text_to_image
{
"model": "gen4_image",
"promptText": "A serene Japanese garden with cherry blossoms",
"ratio": "1920:1080"
}
model:gen4_image|gen4_image_turbo|gemini_2.5_flash(requis)promptText: chaîne, jusqu'à ~1 000 caractères (requis)ratio: l'un de1920:1080,1080:1920,1024:1024,1360:768,1080:1080,1168:880,1440:1080,1080:1440,1808:768,2112:912(requis ; variantes 720p ou 1080p selon le modèle)referenceImages: optionnel[{ "uri": "https://...", "tag": "MyTag" }]— référencer par@MyTagdanspromptTextseed: entier optionnel pour la reproductibilité
POST /v1/text_to_video
{
"model": "gen4.5",
"promptText": "A golden retriever running through wildflowers at sunset",
"ratio": "1280:720",
"duration": 5
}
model:gen4.5|veo3|veo3.1|veo3.1_fast|seedance2(requis)duration: entier en secondes, 2–10 (requis ; valeurs valides spécifiques au modèle — par ex. veo3 accepte uniquement 8)ratio: par ex.1280:720,720:1280,1104:832,832:1104,960:960(requis)
POST /v1/image_to_video
{
"model": "gen4.5",
"promptImage": "https://example.com/cover.jpg",
"promptText": "A slow dolly-in shot",
"ratio": "1280:720",
"duration": 5
}
model:gen4.5|gen4_turbo|veo3|veo3.1|veo3.1_fast|seedance2(requis)promptImage: URL HTTPS, URI de données, ou URIrunway://(requis). Peut aussi être[{ "uri": "...", "position": "first" | "last" }]pour des keyframes.promptText: optionnel pour la plupart des modèles, requis pourgen4_turboquand aucun mouvement d'image n'est évident
POST /v1/video_to_video
{
"model": "gen4_aleph",
"videoUri": "https://example.com/source.mp4",
"promptText": "Change the season to winter with snowfall",
"ratio": "1280:720"
}
POST /v1/text_to_speech
{
"model": "eleven_multilingual_v2",
"text": "Hello, welcome to Runway.",
"voice": { "type": "runway-preset", "presetId": "clara" }
}
voice:{ type: "runway-preset", presetId: "clara" | "victoria" | "vincent" | ... }ou objet de voix spécifique au fournisseurlanguageCode: code ISO optionnel (auto-détecté par défaut)
POST /v1/sound_effect
{
"model": "eleven_text_to_sound_v2",
"promptText": "Thunderclap followed by heavy rain",
"duration": 5
}
POST /v1/voice_isolation
{
"model": "eleven_voice_isolation",
"audioUri": "https://example.com/noisy.mp3"
}
POST /v1/voice_dubbing
{
"model": "eleven_voice_dubbing",
"audioUri": "https://example.com/english.mp3",
"targetLanguage": "es"
}
POST /v1/speech_to_speech
{
"model": "eleven_multilingual_sts_v2",
"audioUri": "https://example.com/source.mp3",
"voice": { "type": "runway-preset", "presetId": "victoria" }
}
POST /v1/avatars
{
"name": "Support Agent",
"referenceImage": "https://example.com/portrait.jpg",
"voice": { "type": "runway-live-preset", "presetId": "clara" },
"personality": "You are a friendly support agent.",
"documentIds": []
}
POST /v1/documents
{
"avatarId": "<avatar-id>",
"name": "FAQ",
"content": "Q: What is your return policy?\nA: 30 days, no questions asked."
}
POST /v1/realtime_sessions
{
"avatarId": "<avatar-id>"
}
Endpoints de gestion
| Méthode | Endpoint | Description |
|---|---|---|
GET |
/v1/tasks/{id} |
Obtenir le statut et la sortie de la tâche |
DELETE |
/v1/tasks/{id} |
Annuler/supprimer une tâche |
POST |
/v1/uploads |
Créer un upload éphémère |
GET |
/v1/organization |
Infos organisation et solde de crédits |
POST |
/v1/organization/usage |
Historique d'utilisation des crédits (jusqu'à 90 jours) |
Cycle de vie des tâches
Tous les endpoints de génération renvoient un objet tâche. Le flux est :
- Soumettre —
POST /v1/<endpoint>→ retourne{ "id": "task_xxx" } - Faire un polling —
GET /v1/tasks/{id}→ retourne la tâche avec sonstatus - Récupérer la sortie — Quand
status === "SUCCEEDED", le tableauoutputcontient des URLs signées
Statuts de tâche
| Statut | Sens |
|---|---|
PENDING |
En file d'attente, en attente de démarrage |
RUNNING |
Génération en cours |
SUCCEEDED |
Terminé — URLs de sortie disponibles |
FAILED |
Génération échouée — vérifier le champ failure |
THROTTLED |
Limite de concurrence atteinte — mis en file d'attente automatiquement |
Polling SDK (recommandé)
Les SDKs fournissent une méthode waitForTaskOutput() qui gère le polling automatiquement :
// Node.js — fait un polling jusqu'au terme (délai d'expiration par défaut 10 min)
const task = await client.imageToVideo.create({
model: 'gen4.5',
promptImage: 'https://example.com/image.jpg',
promptText: 'A sunset timelapse',
ratio: '1280:720',
duration: 5
}).waitForTaskOutput();
console.log(task.output); // Tableau d'URLs signées
# Python
task = client.image_to_video.create(
model='gen4.5',
prompt_image='https://example.com/image.jpg',
prompt_text='A sunset timelapse',
ratio='1280:720',
duration=5
).wait_for_task_output()
print(task.output)
Polling manuel (REST)
async function pollTask(taskId) {
while (true) {
const response = await fetch(`https://api.dev.runwayml.com/v1/tasks/${taskId}`, {
headers: {
'Authorization': `Bearer ${process.env.RUNWAYML_API_SECRET}`,
'X-Runway-Version': '2024-11-06'
}
});
const task = await response.json();
if (task.status === 'SUCCEEDED') return task;
if (task.status === 'FAILED') throw new Error(task.failure);
await new Promise(r => setTimeout(r, 5000)); // polling chaque 5 secondes
}
}
Gestion de la sortie
- Les tâches réussies retournent un tableau
outputavec des URLs signées vers le contenu généré - Les URLs de sortie expirent dans 24-48 heures
- Téléchargez et stockez les sorties dans votre propre stockage — ne servez pas les URLs signées aux utilisateurs finaux
- Les sorties vidéo sont en MP4, les sorties images en PNG/JPEG
Exigences d'entrée
Limites de taille
| Type | Via URL | Via URI de données | Via Upload |
|---|---|---|---|
| Image | 16 Mo | 5 Mo | 200 Mo |
| Vidéo | 32 Mo | 16 Mo | 200 Mo |
| Audio | 32 Mo | 16 Mo | 200 Mo |
Formats supportés
- Images : JPEG, PNG, WebP (pas de GIF)
- Codecs vidéo : H.264, H.265/HEVC, AV1, VP8/VP9, Apple ProRes, Theora
- Audio : MP3, AAC, FLAC, PCM, ALAC
Exigences pour les URLs
Si vous fournissez des ressources via URL :
- HTTPS uniquement (pas de HTTP)
- Noms de domaine uniquement (pas d'adresses IP)
- Pas de redirections
- Doit supporter les requêtes HTTP HEAD
- Doit retourner des en-têtes
Content-TypeetContent-Lengthvalides - Longueur max d'URL : 2 048 caractères
Limites de débit et tiers
| Tier | Concurrence | Générations/jour | Cap mensuel | Déblocage |
|---|---|---|---|---|
| 1 (défaut) | 1-2 | 50-200 | 100 $ | — |
| 2 | 3 | 500-1 000 | 500 $ | 1 jour + 50 $ |
| 3 | 5 | 1 000-2 000 | 2 000 $ | 7 jours + 100 $ |
| 4 | 10 | 5 000-10 000 | 20 000 $ | 14 jours + 1 000 $ |
| 5 | 20 | 25 000-30 000 | 100 000 $ | 7 jours + 5 000 $ |
- Pas de limite de requêtes par minute — uniquement des quotas de génération quotidiens
- Dépasser la concurrence → statut
THROTTLED(mise en file d'attente automatique, pas de rejet) - Dépasser la limite quotidienne →
429 Too Many Requests - Les limites quotidiennes utilisent une fenêtre mobile de 24 heures
Gestion des erreurs
Erreurs HTTP
| Code | Sens | Action |
|---|---|---|
| 400 | Échec de validation d'entrée | Corriger l'entrée, ne pas réessayer |
| 401 | Clé API invalide | Vérifier la clé, ne pas réessayer |
| 429 | Limite de débit atteinte | Réessayer avec backoff exponentiel + jitter |
| 502/503/504 | Surcharge du serveur | Réessayer avec backoff exponentiel + jitter |
Codes d'échec de tâche
| Code | Sens | Réessayer ? |
|---|---|---|
SAFETY.INPUT.* |
Modération du contenu d'entrée | Non — non remboursable |
SAFETY.OUTPUT.* |
Modération du contenu de sortie | Oui — essayer un prompt différent |
INTERNAL.BAD_OUTPUT |
Problème de qualité | Oui |
ASSET.INVALID |
Format d'entrée mauvais | Corriger l'entrée |
INTERNAL |
Erreur serveur | Oui |
Les SDKs gèrent automatiquement les tentatives pour les erreurs transitoires.
Support des URI de données
Les images encodées en base64 peuvent être passées à la place des URLs :
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...
Utile pour les petites images ou quand vous ne voulez pas héberger le fichier. Soumis aux limites de taille des URI de données ci-dessus.