Démarrage rapide
Une seule clé, une seule forme de requête, tous les modèles d'image et de vidéo. Envoyez une tâche, interrogez-la, récupérez le fichier.
/data/models.json.POST /v1/chat/completions, compatible OpenAI, facturés au token sur le même crédit : voir chat completions.| URL de base | https://api.revana.si/v1 |
| Authentification | Authorization: Bearer <key> |
| Envoyer | POST /v1/generations |
| Interroger | GET /v1/generations/{id} |
| Modèles | GET /v1/models (sans clé) : tous les modèles avec lesquels vous pouvez générer dès maintenant |
| Solde | GET /v1/balance : ce que le compte de votre clé peut dépenser |
| Téléverser | POST /v1/uploads : un lien pour un fichier de référence sur votre ordinateur |
| Format | JSON en entrée, JSON en sortie. Prix en USD ; 100 crédits = $1. |
| Lisible par machine | /openapi.json · /llms.txt |
Authentification
Créez une clé depuis votre compte, puis envoyez-la comme jeton bearer à chaque requête. Gardez-la sur votre serveur ; ne l'intégrez jamais dans un navigateur ou une application mobile.
Envoyer une génération
Envoyez l'identifiant du modèle et son input. La réponse revient immédiatement avec un id de génération et le statut queued ; le travail se fait en arrière-plan.
| Champ | Type | Description |
|---|---|---|
model | string, obligatoire | Un identifiant de modèle de la page des modèles, par ex. seedance-2.5. |
input | object, obligatoire | Le prompt et les réglages ; voir champs d'entrée. Les champs inconnus sont refusés. |
max_cost_usd | number, facultatif | Le maximum que vous paierez pour cette génération, jusqu'à 100 (valeur par défaut). Les routes dont le prix dépasse ce plafond sont ignorées ; s'il n'en reste aucune, la requête répond 422 max_cost_exceeded. |
max_wait_s | integer, facultatif | Les routes dont la durée prévue dépasse ce nombre de secondes sont ignorées. Une fois ce délai écoulé, aucune nouvelle route n'est essayée, mais une route déjà en cours peut se terminer (jusqu'à 40 minutes) et est facturée si elle livre. |
Idempotency-Key | header, facultatif | Jusqu'à 200 caractères. Renvoyez la même clé et le même corps (après un délai dépassé ou un 503) et vous récupérez la même génération, pas une seconde. La même clé avec un corps différent donne 409 idempotency_conflict. |
Obtenir le résultat
Vous préférez un point de terminaison par modèle et des webhooks de fin de tâche ? Voir l'API de file d'attente compatible fal pour les identifiants de requête, les URL de statut et de résultat, les alias fal pris en charge et les limites de migration.
Interrogez toutes les quelques secondes jusqu'à ce que status passe à succeeded ou failed, puis téléchargez les fichiers de output.urls avec votre clé : GET /v1/generations/{id}/content pour le premier, et /content/2, /content/3… quand un modèle d'image en renvoie plusieurs. Les images prennent généralement quelques secondes ; la vidéo prend de moins d'une minute à plusieurs minutes selon le modèle et la durée.
Une génération terminée :
Champs d'entrée
Les mêmes noms sont utilisés pour tous les modèles. Les champs et valeurs que prend chaque modèle, ainsi que ses valeurs par défaut, sont listés par modèle dans /data/models.json (options, tasks). Si un modèle ne prend pas en charge un champ ou une valeur, la requête est rejetée avec 422 invalid_input avant que quoi que ce soit ne soit facturé.
| Champ | Type | Utilisé pour |
|---|---|---|
prompt | string | Ce qu'il faut générer. Obligatoire pour le texte vers image et le texte vers vidéo. |
image_url | string (URL) | Image de départ pour l'image vers vidéo, ou image à retoucher pour l'image vers image. |
end_image_url | string (URL) | Dernière image, pour les modèles avec première et dernière image. |
image_urls | string[] | Images de référence, jusqu'à la limite du modèle. |
resolution | string | 720p, 1080p, 2K... l'une des résolutions du modèle. |
duration | number | Durée de la vidéo en secondes, l'une des durées du modèle. |
aspect_ratio | string | 16:9, 9:16, 1:1... |
audio | boolean | Génère du son avec la vidéo, quand le modèle le permet. Peut modifier le prix. |
negative_prompt | string | Ce qu'il faut éviter, sur les modèles qui l'acceptent. |
video_url | string (URL) | Un clip à transformer, prolonger ou agrandir. Sa durée est mesurée et, sur les modèles facturés à la seconde, facturée. |
audio_url | string (URL) | La voix ou le son sur lequel un modèle d'avatar parlant ou de synchronisation labiale s'anime. |
quality | string | Un niveau de qualité sur les modèles qui tarifent par niveau (par ex. low, medium, high). |
seed | integer | Une graine (seed), sur les modèles qui en acceptent une. |
Seedance 2.5 utilise par défaut 720p, 5 secondes (4–30), 16:9 et pas de son, et accepte aussi :
| Champ | Type | Utilisé pour |
|---|---|---|
video_url | string (URL) | Un clip de 4 à 30 s à retoucher. Le résultat garde sa durée : omettez donc duration. |
video_urls | string[] | Clips de référence, jusqu'à 10 et 30 secondes au total. Leurs secondes sont facturées au tarif de la vidéo en entrée. |
audio_urls | string[] | Son de référence, jusqu'à 10 et 30 secondes au total. |
image_url est une première image exacte : elle ne peut donc pas être combinée avec des médias de référence ; utilisez image_urls pour une référence visuelle plus libre. end_image_url nécessite image_url. Les médias doivent être des URL https publiques qui se téléchargent directement.
Nemesis
nemesis remet en scène un clip avec vos propres personnes, produits et lieux : le mouvement, le rythme et la caméra du clip, joués par jusqu'à 8 images de référence. Le résultat garde la durée et la forme du clip. Il est facturé au tarif d'une retouche Seedance 2.5 plus $0.02 la seconde ($0.08, $0.17 et $0.36 en 480p, 720p et 1080p), par seconde du clip en entrée plus la vidéo en sortie.
Il suit la recette de Scenario ALTER : le clip lui-même est retouché, muet, avec une de ses images redessinée avec la modification déjà faite comme première référence, et le son d'origine du clip est remis ensuite. Avec plusieurs personnes, les images sont associées de gauche à droite selon la position des personnes dans la première image.
| Champ | Type | Utilisé pour |
|---|---|---|
video_url | string (URL), obligatoire | Le clip de 4 à 30 s à remettre en scène. |
image_urls | string[], obligatoire | 1 à 8 images de référence. |
roles | string[] | Un par image : person (par défaut), product, location ou look. |
target_frame | boolean | Avant le rendu, la première image du clip est redessinée avec la modification déjà faite, dans la même pose, la même taille et la même lumière, et envoyée comme première référence : cheveux, visage et vêtements restent fidèles à vos images. Activé par défaut pour nemesis, désactivé pour nemesis-lite. Gratuit. |
guide | string | nemesis-lite uniquement (nemesis retouche toujours le clip lui-même). clip (par défaut avec une image cible) : suit l'image propre du clip. people (par défaut sans image cible) : les personnes sont remplacées et l'arrière-plan conservé. scene : tout ce qui est visible vient des références et du prompt. |
sound | string | original (activé par défaut sur nemesis) : le son d'origine du clip est remis. none (par défaut sur nemesis-lite) : muet. |
face_mesh | boolean | nemesis-lite uniquement. Suit chaque visage du clip pour que le nouveau visage garde ses expressions, ses yeux et ses lèvres. Activé par défaut avec guide: "people", désactivé pour scene et clip. Envoyez false pour le laisser désactivé. Jamais affiché dans le résultat. |
resolution | string | 480p, 720p (par défaut) ou 1080p. |
prompt | string | Consigne facultative, jusqu'à 5000 caractères. |
Sur nemesis-lite, un clip où il n'y a personne, envoyé avec guide: "people", est refusé avec invalid_input et n'est pas facturé ; envoyez-le avec scene ou clip.
Combien de temps cela prend. D'abord le clip est préparé : sur nemesis, l'image cible est dessinée, en 15 à 40 secondes environ ; sur nemesis-lite, la voix est séparée et chaque image devient le guide de profondeur, environ 25 secondes pour un clip de 8 secondes et une minute et demie pour un clip de 30 secondes. Ensuite la vidéo est rendue, ce qui représente l'essentiel de l'attente : un clip de 8 secondes en 480p prend environ 4 à 7 minutes. Interrogez la génération jusqu'à ce qu'elle soit terminée.
Nemesis Lite
nemesis-lite prend la même entrée que nemesis et la rend sur Wan 3.0 : moins cher, un peu moins fidèle sur les visages et les détails fins. Le clip dure de 2 à 15 s. Il est facturé au tarif de Wan 3.0 plus $0.02 la seconde ($0.07, $0.11 et $0.19 en 480p, 720p et 1080p), par seconde du clip en entrée plus la vidéo en sortie.
Objet de génération
| Champ | Type | Description |
|---|---|---|
id | string | Identifiant de la génération (gen_…), utilisé pour interroger. |
object | string | Toujours generation. |
model | string | Le modèle que vous avez demandé. |
status | string | Voir statuts. |
message | string | Seulement pendant qu'un résultat est confirmé auprès d'un fournisseur : ce qui se passe. |
quoted_usd | number | Le prix sur la route la moins chère, qui est la première essayée. Si elle ne peut pas le produire et qu'une route de secours plus chère le fait, le montant facturé est le prix de cette route, jusqu'à reserved_usd. |
reserved_usd | number | Ce qui est bloqué sur votre solde : le maximum que cette génération peut coûter, si une route de secours plus chère la produit après l'essai d'autres routes. La différence est libérée au règlement. Pour ne jamais payer plus de quoted_usd, réglez max_cost_usd dessus : les routes de secours plus chères sont alors ignorées. |
output | object | null | Si réussie : urls, les fichiers résultats (un modèle d'image peut en renvoyer plusieurs), avec width et height ; la vidéo a aussi duration_s et has_audio. Téléchargez-les rapidement ; les fichiers expirent. |
cost_usd | number | null | Ce qui a été facturé. Défini une fois la génération réussie ; 0 si elle échoue. |
attempts | number | Routes essayées, replis compris. Seule celle qui réussit est facturée. |
error | object | null | Si en échec : code, message et retryable ; un refus de contenu a aussi reason. Voir pourquoi une génération a échoué. |
created_at, completed_at | string | Horodatages ISO 8601. |
Statuts
| Statut | Signification |
|---|---|
queued | Acceptée, en attente d'une route. |
running | En cours de génération. Si une route échoue, la tâche reste running pendant qu'elle passe à la suivante, et pendant qu'un résultat est confirmé (voir message). |
succeeded | Terminée. output.urls contient les fichiers et cost_usd ce que vous avez payé. |
failed | Toutes les routes ont échoué ou l'entrée a été refusée. Rien n'est facturé. |
Facturation
- Vous payez avec des crédits prépayés, 100 pour un dollar, achetés par packs de $10 à $5,000. Chaque prix est un nombre entier de crédits.
- À l'envoi,
reserved_usdest bloqué sur votre solde. Si la génération échoue, la totalité est libérée. - Vous n'êtes facturé que lorsque la génération réussit, au prix indiqué pour la route qui l'a produite. En général c'est la première route à
quoted_usd. Quand une route de secours doit la produire, cela peut coûter plus : le prix de cette route ou, si une route essayée avant elle a été facturée par son fournisseur, le coût de ces tentatives plus 10 %, selon le montant le plus élevé. Jamais au-delà dereserved_usd. - Il n'y a ni quota mensuel ni limite par minute : votre solde et
max_cost_usdsont la limite. - Le prix de chaque modèle figure sur sa page et dans la grille des prix.
Solde
Le compte auquel appartient votre clé. Vérifiez-le avant un gros lot ; cela ne coûte rien et ne compte pas dans les limites de génération.
| Champ | Signification |
|---|---|
available_usd | Ce qu'une nouvelle génération peut réserver. Un envoi dont reserved_usd est supérieur reçoit 402 insufficient_credits. |
held_usd | Réservé par les générations encore en cours. Ce qu'elles n'utilisent pas revient à leur règlement. |
balance_usd | Disponible plus bloqué. |
spent_usd | Facturé pour les générations terminées, depuis toujours. |
*_credits | Les mêmes montants en crédits (100 pour un dollar), arrondis pour que le disponible n'apparaisse jamais plus élevé qu'il ne l'est. |
Téléverser un fichier de référence
Les références sont passées sous forme de liens https:// publics. Pour un fichier sur votre propre machine, demandez un lien de téléversement, envoyez-y les octets et utilisez le lien que vous recevez en retour. C'est gratuit.
| Champ | Signification |
|---|---|
upload_url | Envoyez le fichier ici avec PUT dans l'heure, avec exactement les en-têtes de upload_headers (son type et sa taille). Tout autre envoi est refusé. |
url | Le lien du fichier sur api.revana.si, valable jusqu'au expires_at (14 jours). Il ne demande aucune clé et redirige vers le fichier : tout ce qui peut récupérer un lien peut donc le lire. Utilisez-le comme référence dans POST /v1/generations. Le fichier est supprimé peu après. |
id | upl_… |
Images (image/*) jusqu'à 30 Mo, clips (video/*) jusqu'à 50 Mo, son (audio/*) jusqu'à 15 Mo. Un fichier plus gros ou d'un autre type reçoit 413 too_large ou 400 invalid_request.
Pourquoi une génération a échoué
Une génération failed a error.code, un message écrit pour être montré à la personne à l'origine de la demande, et retryable : true quand renvoyer la même requête plus tard peut fonctionner, false quand la requête elle-même doit changer. Une génération en échec n'est jamais facturée.
| Code | Réessayable | Quand |
|---|---|---|
content_policy | no | Le modèle a refusé le prompt ou le média, ou a retenu ce qu'il avait produit. reason indique la règle : sexual (contenu NSFW ou pour adultes), minors (enfants ou adolescents), copyright (contenu protégé par le droit d'auteur ou de tiers, marques, personnages), real_person (l'image d'une personne réelle ou célèbre), ou other quand le modèle ne donne pas de raison. |
invalid_input | no | Une référence n'a pas pu être lue, un prompt cite @Image2 alors qu'une seule image a été envoyée, ou une valeur est rejetée par le modèle. Le message indique laquelle. |
model_declined | no | Le modèle a répondu par des mots au lieu de produire l'image ou la vidéo, généralement parce que le prompt demande quelque chose dont il a besoin et qui n'a pas été envoyé. Faites décrire le résultat lui-même par le prompt. |
reference_changed | no | Un fichier de référence a changé après sa vérification. Envoyez-le à nouveau. |
max_cost_exceeded | no | La seule route qui pouvait s'exécuter coûte plus que max_cost_usd. |
model_busy | yes | Toutes les routes du modèle étaient à pleine capacité. Réessayez dans une minute. |
model_unavailable | yes | Aucune route du modèle ne pouvait prendre la tâche pour le moment. |
timeout | yes | Aucune route n'a renvoyé de résultat à temps, ou max_wait_s est dépassé. |
all_routes_failed | yes | Toutes les routes ont échoué pour des raisons de leur côté. |
Erreurs
Les erreurs utilisent des codes de statut HTTP et un corps JSON : {"error": {"code": "...", "message": "..."}}.
| HTTP | Code | Quand |
|---|---|---|
| 400 | invalid_request | Le corps n'est pas du JSON, il n'a pas model ou input, ou il contient un champ inconnu de l'API. |
| 401 | unauthorized | Clé API absente ou invalide. |
| 402 | insufficient_credits | Votre solde disponible ne couvre pas reserved_usd. Rechargez et réessayez. |
| 403 | account_disabled | Le compte est suspendu. Contactez le support. |
| 403 | generation_not_enabled | Votre clé peut consulter les prix mais ne peut pas encore générer. |
| 404 | not_found | Aucune génération avec cet identifiant sur votre compte. |
| 409 | idempotency_conflict | Cette Idempotency-Key a déjà été utilisée avec un corps différent. |
| 409 | not_ready | Le fichier a été demandé avant que la génération ne réussisse. |
| 413 | body_too_large | Le corps dépasse 1 Mo. Envoyez les médias sous forme d'URL. |
| 422 | invalid_input | Un champ, une valeur ou une combinaison que le modèle ne prend pas en charge, ou un média illisible. Rien n'est facturé. |
| 422 | max_cost_exceeded | Toutes les routes coûtent plus que max_cost_usd. |
| 422 | model_not_available | Aucun modèle avec cet identifiant sur l'API. Les identifiants sont sur la page des modèles. |
| 429 | rate_limited | Trop de requêtes dans la même seconde depuis un compte (une protection contre les boucles incontrôlées, pas un quota). Attendez Retry-After secondes. |
| 429 | concurrency_limit | Le compte a déjà atteint son maximum de générations en cours. Réessayez quand l'une se termine. |
| 503 | busy | Un moment de forte charge. Réessayez après Retry-After avec la même Idempotency-Key. |
| 503 | model_unavailable | Aucune route pour ce modèle n'est disponible pour le moment. Réessayez sous peu. |
| 500 | server_error | Un problème est survenu de notre côté. Vous pouvez réessayer sans risque avec la même Idempotency-Key. |
Liste des modèles
Chaque modèle, ses options et ses prix sont publiés en JSON à /data/models.json, le même fichier à partir duquel ce site est généré.