Thème
Langue

Génération de médias

POST /api/media/generate — génération asynchrone d’images, de vidéos, de TTS, de musique et de contenu 3D. Paramètres model, prompt, opts. Interrogez l’état avec GET /api/media/jobs/{id}.

Génération asynchrone de médias : images, vidéo, voix off (TTS), synthèse vocale, musique et 3D. Vous créez une tâche et interrogez le résultat. La liste complète des modèles figure dans le catalogue des modèles de médias ; les webhooks, les erreurs et la facturation sont présentés dans la section consacrée aux webhooks.

POSThttps://getvibeapi.com/api/media/generate
GEThttps://getvibeapi.com/api/media/jobs/{id}

Créer des paramètres

ParamètreTypeDescription
modelreq.stringUn nom de modèle multimédia, par exemple veo-3.1 ou gpt-image-2 (voir le catalogue).
promptreq.stringDescription textuelle.
optsobjectOptions de génération supplémentaires (dépendantes du modèle) : résolution, durée, etc.

Créer et interroger

La création renvoie 202 avec { ok: true, jobId, status: "processing" }. Interrogez GET /api/media/jobs/{jobId} jusqu’à status: "success", puis récupérez le resultUrls.

# 1. create a generation job
curl https://getvibeapi.com/api/media/generate \
  -H "Authorization: Bearer $GETVIBE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "veo-3.1",
    "prompt": "a cat on a skateboard, slow motion"
  }'
# → {"ok":true,"jobId":"...","status":"processing"}
La facturation repose sur le volume réel généré (résolution, durée). Si le modèle est indisponible ou si la requête est rejetée, la réponse contient ok: false et aucun montant n’est facturé. Les prix affichés sur le site sont indicatifs ; le montant exact est renvoyé dans l’en-tête x-pv-cost-rub de chaque réponse acceptée. Par défaut, les corps des flux restent inchangés ; envoyez x-pv-cost: 1 pour ajouter le coût à l’événement d’utilisation final de ce protocole.

Paramètres avancés (opts)

En plus de model et prompt, vous pouvez transmettre des options supplémentaires dans opts. L’ensemble dépend du modèle. Le contrat complet lisible par machine est disponible via GET /api/model-capabilities (ou GET /api/model-capabilities/{model} pour un modèle spécifique).

Paramètres avancés couramment utilisés
ParamètreTypeDescription
aspect_ratiostringAspect ratio: 1:1, 16:9, 9:16, 4:3, 3:4.
durationstring|numberDurée de la vidéo en secondes (5, 10, 15).
resolutionstringResolution: 480p, 720p, 1080p, 4K.
image_urlchaîne (URL)Image source pour I2V / image-à-image.
negative_promptstringÉléments à exclure de la génération (qwen-image, wan-2-7).
guidancenumberÉchelle de guidage — respect du prompt (flux-2, qwen-image, seedance).
seednumberSeed pour un résultat reproductible (flux-2).
stabilitynumberStabilité 0–1 (hailuo, happyhorse, seedance, TTS).
camerastringMouvement de caméra, par exemple « pan left » (kling-3.0, hailuo).
first_frame_urlchaîne (URL)First frame for I2V (kling-3.0, wan-2-7).
last_frame_urlchaîne (URL)Dernière image pour I2V (seedance, kling-3.0, wan-2-7).
reference_imagechaîne (URL)Référence de style/personnage (happyhorse).
similarity_boostnumberSimilarité de la voix 0–1 (ElevenLabs TTS).
speednumberDébit de parole 0.5–2 (ElevenLabs TTS).
Tous les paramètres sont facultatifs, sauf indication contraire. Les paramètres inconnus sont ignorés. La liste complète, avec les types, les plages et les exemples, figure dans la réponse GET /api/model-capabilities/{model}.

Vos propres fichiers : base64 au lieu d’un lien

Les options d’URL (image_url, input_urls, mask_url et les autres) sont des liens que le fournisseur récupère ; elles acceptent donc uniquement des adresses https:// publiques. Une chaîne data:image/...;base64,… inline dans l’un de ces champs est rejetée avec 400.

Pour envoyer votre propre fichier, utilisez plutôt le champ *_base64 correspondant : le service stocke les octets, les publie et transmet le lien obtenu au fournisseur. Jusqu’à 16 fichiers par requête dans input_base64.

Fichiers intégrés
ParamètreTypeDescription
image_base64stringImage source. Remplace image_url.
mask_base64stringMasque d’inpainting (uniquement image/*). Remplace mask_url.
input_base64string[]Références pour image-à-image et entrées multiples. Remplace input_urls.
audio_base64stringAudio source. Remplace audio_url.
video_base64stringVidéo source. Remplace video_url.
La valeur est la chaîne data:image/png;base64,… complète, préfixe inclus : le type de fichier est lu à partir de celle-ci.

Contrat de requête : strict, quote_id, max_price_rub

POST /api/media/generate et POST /api/media/price acceptent le même corps de requête ; vous pouvez donc obtenir un devis, puis le soumettre sans modification. Il n’existe aucun autre champ de niveau supérieur : tout champ inconnu est refusé sur les deux endpoints avec 400 et le code unknown_field qui le désigne (field, fields), avec ou sans strict. Les paramètres de génération doivent être placés dans opts.

Champs de niveau supérieur
ParamètreTypeDescription
modelreq.stringIdentifiant public du modèle ou l’une de ses routes (base:alias).
promptstringTexte ; requis uniquement lorsque l’opération du modèle l’exige.
optsobjectOptions du modèle. Schéma exact : operations[].requestJsonSchema dans GET /v1/model-capabilities/{model}.
strictbooleanMode strict (ou l’en-tête x-getvibe-strict: 1) : toute requête qui ne serait pas exécutée exactement telle qu’elle est écrite (un paramètre supprimé, une valeur ramenée dans les limites autorisées, une clé hors du contrat du modèle) est refusée avec le code 422 strict_validation_failed et une liste violations, avant tout devis ou toute facturation. Un champ documenté que le modèle accepte et ignore (duration sur les modèles dont la durée dépend de celle de la source) ne constitue pas une violation : il est signalé par un avertissement param_ignored.
quote_idstringmq_… provenant de POST /api/media/price. La tâche s’exécute uniquement à ce prix ; un devis obsolète, déjà utilisé ou réacheminé est refusé avec 409/422 avant toute exécution.
max_price_rubnumberPlafond pour cette tâche dans la devise du compte. Si le devis est supérieur : 422 media_max_price_exceeded et rien ne s’exécute. Une tâche facturée à l’usage ne sera jamais facturée au-delà de ce plafond.
webhook_urlstringURL https publique qui reçoit une notification de fin signée.

Fichiers par identifiant (API Files)

Tout fichier source peut être envoyé de trois façons : sous forme de lien (image_url, audio_url, video_url…), d’octets intégrés (image_base64, audio_base64, video_base64…) ou d’identifiant de votre propre fichier provenant de POST /v1/files. Les champs d’identifiant sont répertoriés dans le requestJsonSchema de chaque opération et sont acceptés en mode strict.

ParamètreTypeDescription
image_file_idstringÀ la place de image_url.
audio_file_idstringÀ la place de audio_url.
video_file_idstringÀ la place de video_url.
mask_file_idstringÀ la place de mask_url.
first_frame_file_id / last_frame_file_idstringInstead of first_frame_url / last_frame_url.
input_file_idsstring[]Ajouté à input_urls.
reference_*_file_idsstring[]Appended to reference_image_urls / reference_audio_urls / reference_video_urls.

Vidéo facturée selon la durée du fichier d’entrée

Pour les modèles dont la longueur de sortie suit celle d’un fichier importé — kling-ai-avatar, omnihuman-v2, omnihuman-2-0, omnihuman-v1.5, omnihuman-1-5, volcengine-lipsync (audio), kling-motion-control, wan-animate, topaz-video-upscale, p-video-edit (video), lipsync-2-pro, sync-3, react-1 (les deux entrées) — /api/media/price et la vérification préalable max_price_rub sur /api/media/generate mesurent ce fichier côté serveur (lien, URI data:, base64 ou *_file_id) et facturent les secondes mesurées. La réponse contient sourceSeconds (outputSeconds pour la synchronisation labiale), et estimateReason indique que la durée a été mesurée. Si le fichier ne peut pas être lu, le prix conserve sa base précédente (une seconde, l’estimation du catalogue ou le maximum de la route) et estimateReason l’indique. Le montant facturé correspond au tarif par seconde multiplié par le nombre de secondes effectivement rendues, sans jamais dépasser max_price_rub. opts.duration est accepté pour ces modèles et ignoré, avec un avertissement param_ignored.

Clonage de voix

POSThttps://getvibeapi.com/api/media/voices
GEThttps://getvibeapi.com/api/media/voices
POSThttps://getvibeapi.com/api/media/voices/{voice_id}/samples
DELETEhttps://getvibeapi.com/api/media/voices/{voice_id}

Create: { name, consent: true, engine, audio_url | audio_base64 } or several recordings samples: [{ audio_url } | { audio_base64 }, …] (engine: "elevenlabs" only). An ElevenLabs voice is used by voice-clone-tts and by the Voice Changer (elevenlabs-voice-changer). Appending recordings to an ElevenLabs voice is free. Every recording is downloaded and measured before the supplier is called: a refusal changes and charges nothing.

Limites et codes d’erreur
ParamètreTypeDescription
one recording≤ 10 MBwav/mp3, up to 60 s. Larger: 422 voice_sample_too_large / voice_sample_invalid.
recordings per voice≤ 25Comptabilise ceux déjà ajoutés. Plus d’informations : 422 voice_samples_limit.
voice length≤ 300 sTous les enregistrements regroupés, y compris ceux déjà ajoutés. Plus long : 422 voice_samples_limit ; plus court que le minimum du moteur : 422 voice_samples_invalid.
recordings size≤ 50 MBTous les enregistrements d’une même requête regroupés. Plus d’informations : 422 voice_samples_too_large.
request body≤ 70 953 644 B50 MB d’enregistrements encodés en base64 (×4/3), plus le JSON. Au-delà : 413 payload_too_large (JSON, avec max_body_bytes). Envoyez les ensembles longs en plusieurs parties via …/samples, ou sous forme de liens audio_url.
additions per 24 h20Par client. Plus d’informations : 429 voice_samples_rate_limited.
Autres réponses : 404 voice_not_found (voix inconnue, supprimée ou appartenant à un autre compte), 409 voice_samples_unsupported (des enregistrements peuvent être ajoutés uniquement à une voix ElevenLabs), 409 voice_slots_full, 502 voice_samples_failed (le fournisseur a refusé les enregistrements ; la voix reste inchangée). Une voix ElevenLabs est facturée mensuellement ; les prix figurent dans GET /api/media/voices (pricing).

Changeur de voix et alignement forcé

ParamètreTypeDescription
elevenlabs-voice-changermodelopts.voice_id (your ElevenLabs voice) + the source recording opts.audio_url | audio_base64 | audio_file_id, up to 5 minutes. Priced on the measured length: 1 minute = 1000 characters.
forced-alignmentmodelprompt is the transcript, opts.audio_url | audio_base64 | audio_file_id the recording. Result: word timings in resultMeta.words and an SRT file in resultUrls. Priced per 1000 characters of text.

Sandbox : résultat de soumission inconnu

Lorsque la confirmation de démarrage du fournisseur n’arrive pas, la tâche reste au statut : "submitting" avec l’étape : "submission_unknown", errorCode : "media_submission_uncertain" et failure.advice : "reconcile_first" — continuez d’interroger le même jobId et ne créez pas de doublon. Pour tester ce chemin gratuitement, envoyez POST /api/media/generate avec une clé sandbox et l’en-tête x-pv-sandbox-outcome: submission_uncertain. La réponse est un 202 normal avec un jobId ; son interrogation renvoie une soumission inconnue pendant 60 secondes, puis une tâche qui n’a jamais démarré (failure.code : "submission_not_started", charged: false). Rien n’est stocké, envoyé à un fournisseur ou facturé. Une clé standard avec cet en-tête renvoie 400 sandbox_outcome_requires_sandbox_key.

Speech-to-text (transcription)

Même endpoint que pour le reste de la génération : placez le nom du modèle STT dans model, laissez prompt comme chaîne vide et transmettez l'enregistrement dans opts.audio_url. La transcription arrive dans resultText sur GET /api/media/jobs/{id} ; resultUrls reste vide, car la transcription ne produit aucun fichier.

# speech-to-text: create the job, then read the transcript
curl https://getvibeapi.com/api/media/generate \
  -H "Authorization: Bearer $GETVIBE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "whisper-large-v3-turbo",
    "prompt": "",
    "opts": {
      "audio_url": "https://example.com/meeting.mp3",
      "language_code": "en"
    }
  }'
# → {"ok":true,"jobId":"JOB_ID","status":"processing","priceRub":0.03}

curl https://getvibeapi.com/api/media/jobs/JOB_ID \
  -H "Authorization: Bearer $GETVIBE_API_KEY"
# → {"status":"success","resultText":"the transcribed text…","resultUrls":[],"priceRub":0.03}

Modèles

  • whisper-large-v3-turbo — $0.00025 par minute d’audio. Le moins cher et le plus rapide, 99 langues.
  • nemotron-asr-multilingual — $0.00025 par minute. ASR multilingue NVIDIA, ajoute automatiquement la ponctuation.
  • whisper-large-v3 — $0.000563 par minute. Whisper complet : plus lent que turbo, mais plus précis sur les fichiers audio bruyants.
  • universal-2 — $0.003125 par minute.
  • speech-to-text — $0.01 par minute (ElevenLabs Scribe). Prend en charge la diarisation des intervenants et les balises d’événements audio.

Paramètres

ParamètreTypeDescription
audio_urlreq.chaîne (URL)Lien https public qui sert directement le fichier. Les redirections et les adresses de réseaux privés sont refusées. Utilisez plutôt audio_base64 si le fichier n’est pas accessible en ligne.
audio_base64stringL’enregistrement intégré directement sous forme de données :audio/mpeg;base64,… Remplace audio_url.
language_codestringCode de langue (en, ru, …). Détecté automatiquement lorsqu’il est omis.
duration_minutesnumberDurée de l’enregistrement en minutes, utilisée pour l’estimation préalable du prix. Le montant final est mesuré (voir ci-dessous).
diarizebooleanDiarisation des locuteurs (universal-2, speech-to-text).
tag_audio_eventsbooleanÉtiquetez les événements audio tels que les rires ou les applaudissements (reconnaissance vocale).
keytermsstring[]Liste d’indices de termes et de noms (synthèse vocale ; prix majoré de +30 %).

Formats et limites

mp3, wav, m4a/mp4, flac, ogg/opus et webm sont acceptés. La taille du fichier est de 25 MB maximum — environ 26 minutes en mp3 à 128 kbps, ou plusieurs heures de parole en opus. Tout fichier plus volumineux est refusé immédiatement avec un message explicite et n’est pas facturé ; divisez plutôt l’enregistrement.

La facturation est à la minute d’audio. Pour whisper-large-v3-turbo, whisper-large-v3 et nemotron-asr-multilingual, le montant final est calculé à partir de la durée mesurée de l’enregistrement, obtenue depuis la transcription — et non à partir de la valeur que vous avez transmise dans duration_minutes. Le montant minimal facturé est d’un kopeck. Le montant exact est toujours renvoyé sous la forme de priceRub une fois la tâche terminée.

Webhook de disponibilité (au lieu de l’interrogation périodique)

Pour éviter l’interrogation périodique, enregistrez une adresse mediaWebhookUrl dans votre tableau de bord. Lorsque la tâche est terminée (succès ou erreur), le service effectue jusqu’à cinq tentatives de livraison d’un POST avec un corps JSON :

// POST to your mediaWebhookUrl when a job finishes
{
  "jobId": "...",
  "status": "success",            // or "fail"
  "model": "veo-3.1",
  "kind": "video",                // image | video | audio | music | 3d
  "resultUrls": ["https://getvibeapi.com/api/media/file/..."],
  "failMsg": null,
  "createdAt": "2026-06-17T10:00:00.000Z"
}
Les détails de livraison, les codes d’erreur et la facturation sont présentés dans Cycle de vie des webhooks et des tâches multimédias. En bref : le webhook est signé avec les en-têtes Standard Webhooks, les doublons sont possibles et la livraison s’arrête après cinq tentatives échouées. L’interrogation reste la source de vérité.

Récupération du fichier : /api/media/file/{id}/{idx}

GEThttps://getvibeapi.com/api/media/file/{id}/{idx}

L’URL du résultat de génération (image, vidéo, audio ou modèle 3D) provenant de resultUrls. Utilisez-la telle qu’elle est renvoyée par le service : elle s’ouvre sans clé API et fonctionne dans <img>, <video> ou un navigateur. Le fournisseur est masqué : l’adresse en amont est résolue côté serveur et le client ne la voit jamais.

Paramètres de chemin et de requête
ParamètreTypeDescription
idreq.chaîne (chemin)Identifiant de tâche (jobId) issu de la réponse /api/media/jobs/{id}.
idxreq.integer (path)Index du résultat (base 0). Pour un résultat unique : 0.
query paramscomme dans resultUrlsNe construisez pas vous-même l’URL et ne modifiez pas les paramètres renvoyés par le service.
downloadchaîne (requête)download=1 renvoie le fichier en tant que pièce jointe dont le nom et l’extension suivent le contenu (.glb pour un modèle 3D). Sans cette option, le fichier s’ouvre dans le navigateur.
# The signed URL is returned in resultUrls of the /api/media/jobs/{id} response
# or in the webhook body. Opens directly in the browser / <img> — no key needed.
https://getvibeapi.com/api/media/file/JOB_ID/0?sig=HMAC_SIGNATURE
Les résultats sont conservés pendant 7 jours après la fin de la tâche (le champ resultsExpireAt de /api/media/jobs/{id}). Le fichier terminé est copié dans notre stockage et resultUrls bascule vers une adresse permanente de la forme https://getvibeapi.com/media/r/… ; l’URL /api/media/file/… précédemment renvoyée continue également de fonctionner. Les deux prennent en charge les requêtes Range (pour se déplacer dans les vidéos et les fichiers audio). Après 7 jours, le fichier est supprimé et l’URL répond 410 Gone avec le code media_result_expired : téléchargez ce dont vous avez besoin avant cette échéance.
Génération multimédia de GetVibe API — image, vidéo, audio, musique, 3D | GetVibe API