Docs

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.

En ligneTous les modèles de la page des modèles fonctionnent sur ce point de terminaison. Images et vidéo, une seule forme de requête ; les options et les prix de chaque modèle se trouvent dans /data/models.json.
NouveauLes modèles de langage aussi. GPT, Claude, Gemini, Grok, DeepSeek, Qwen et d'autres sur POST /v1/chat/completions, compatible OpenAI, facturés au token sur le même crédit : voir chat completions.
URL de basehttps://api.revana.si/v1
AuthentificationAuthorization: Bearer <key>
EnvoyerPOST /v1/generations
InterrogerGET /v1/generations/{id}
ModèlesGET /v1/models (sans clé) : tous les modèles avec lesquels vous pouvez générer dès maintenant
SoldeGET /v1/balance : ce que le compte de votre clé peut dépenser
TéléverserPOST /v1/uploads : un lien pour un fichier de référence sur votre ordinateur
FormatJSON 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

POSThttps://api.revana.si/v1/generations

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.

ChampTypeDescription
modelstring, obligatoireUn identifiant de modèle de la page des modèles, par ex. seedance-2.5.
inputobject, obligatoireLe prompt et les réglages ; voir champs d'entrée. Les champs inconnus sont refusés.
max_cost_usdnumber, facultatifLe 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_sinteger, facultatifLes 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-Keyheader, facultatifJusqu'à 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

GEThttps://api.revana.si/v1/generations/{id}

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é.

ChampTypeUtilisé pour
promptstringCe qu'il faut générer. Obligatoire pour le texte vers image et le texte vers vidéo.
image_urlstring (URL)Image de départ pour l'image vers vidéo, ou image à retoucher pour l'image vers image.
end_image_urlstring (URL)Dernière image, pour les modèles avec première et dernière image.
image_urlsstring[]Images de référence, jusqu'à la limite du modèle.
resolutionstring720p, 1080p, 2K... l'une des résolutions du modèle.
durationnumberDurée de la vidéo en secondes, l'une des durées du modèle.
aspect_ratiostring16:9, 9:16, 1:1...
audiobooleanGénère du son avec la vidéo, quand le modèle le permet. Peut modifier le prix.
negative_promptstringCe qu'il faut éviter, sur les modèles qui l'acceptent.
video_urlstring (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_urlstring (URL)La voix ou le son sur lequel un modèle d'avatar parlant ou de synchronisation labiale s'anime.
qualitystringUn niveau de qualité sur les modèles qui tarifent par niveau (par ex. low, medium, high).
seedintegerUne 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 :

ChampTypeUtilisé pour
video_urlstring (URL)Un clip de 4 à 30 s à retoucher. Le résultat garde sa durée : omettez donc duration.
video_urlsstring[]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_urlsstring[]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.

ChampTypeUtilisé pour
video_urlstring (URL), obligatoireLe clip de 4 à 30 s à remettre en scène.
image_urlsstring[], obligatoire1 à 8 images de référence.
rolesstring[]Un par image : person (par défaut), product, location ou look.
target_framebooleanAvant 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.
guidestringnemesis-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.
soundstringoriginal (activé par défaut sur nemesis) : le son d'origine du clip est remis. none (par défaut sur nemesis-lite) : muet.
face_meshbooleannemesis-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.
resolutionstring480p, 720p (par défaut) ou 1080p.
promptstringConsigne 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

ChampTypeDescription
idstringIdentifiant de la génération (gen_…), utilisé pour interroger.
objectstringToujours generation.
modelstringLe modèle que vous avez demandé.
statusstringVoir statuts.
messagestringSeulement pendant qu'un résultat est confirmé auprès d'un fournisseur : ce qui se passe.
quoted_usdnumberLe 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_usdnumberCe 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.
outputobject | nullSi 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_usdnumber | nullCe qui a été facturé. Défini une fois la génération réussie ; 0 si elle échoue.
attemptsnumberRoutes essayées, replis compris. Seule celle qui réussit est facturée.
errorobject | nullSi en échec : code, message et retryable ; un refus de contenu a aussi reason. Voir pourquoi une génération a échoué.
created_at, completed_atstringHorodatages ISO 8601.

Statuts

StatutSignification
queuedAcceptée, en attente d'une route.
runningEn 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).
succeededTerminée. output.urls contient les fichiers et cost_usd ce que vous avez payé.
failedToutes 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_usd est 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à de reserved_usd.
  • Il n'y a ni quota mensuel ni limite par minute : votre solde et max_cost_usd sont la limite.
  • Le prix de chaque modèle figure sur sa page et dans la grille des prix.

Solde

GEThttps://api.revana.si/v1/balance

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.

ChampSignification
available_usdCe qu'une nouvelle génération peut réserver. Un envoi dont reserved_usd est supérieur reçoit 402 insufficient_credits.
held_usdRéservé par les générations encore en cours. Ce qu'elles n'utilisent pas revient à leur règlement.
balance_usdDisponible plus bloqué.
spent_usdFacturé pour les générations terminées, depuis toujours.
*_creditsLes 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

POSThttps://api.revana.si/v1/uploads

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.

ChampSignification
upload_urlEnvoyez 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é.
urlLe 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.
idupl_…

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.

CodeRéessayableQuand
content_policynoLe 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_inputnoUne 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_declinednoLe 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_changednoUn fichier de référence a changé après sa vérification. Envoyez-le à nouveau.
max_cost_exceedednoLa seule route qui pouvait s'exécuter coûte plus que max_cost_usd.
model_busyyesToutes les routes du modèle étaient à pleine capacité. Réessayez dans une minute.
model_unavailableyesAucune route du modèle ne pouvait prendre la tâche pour le moment.
timeoutyesAucune route n'a renvoyé de résultat à temps, ou max_wait_s est dépassé.
all_routes_failedyesToutes 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": "..."}}.

HTTPCodeQuand
400invalid_requestLe corps n'est pas du JSON, il n'a pas model ou input, ou il contient un champ inconnu de l'API.
401unauthorizedClé API absente ou invalide.
402insufficient_creditsVotre solde disponible ne couvre pas reserved_usd. Rechargez et réessayez.
403account_disabledLe compte est suspendu. Contactez le support.
403generation_not_enabledVotre clé peut consulter les prix mais ne peut pas encore générer.
404not_foundAucune génération avec cet identifiant sur votre compte.
409idempotency_conflictCette Idempotency-Key a déjà été utilisée avec un corps différent.
409not_readyLe fichier a été demandé avant que la génération ne réussisse.
413body_too_largeLe corps dépasse 1 Mo. Envoyez les médias sous forme d'URL.
422invalid_inputUn champ, une valeur ou une combinaison que le modèle ne prend pas en charge, ou un média illisible. Rien n'est facturé.
422max_cost_exceededToutes les routes coûtent plus que max_cost_usd.
422model_not_availableAucun modèle avec cet identifiant sur l'API. Les identifiants sont sur la page des modèles.
429rate_limitedTrop 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.
429concurrency_limitLe compte a déjà atteint son maximum de générations en cours. Réessayez quand l'une se termine.
503busyUn moment de forte charge. Réessayez après Retry-After avec la même Idempotency-Key.
503model_unavailableAucune route pour ce modèle n'est disponible pour le moment. Réessayez sous peu.
500server_errorUn 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é.