Mediengenerierung
POST /api/media/generate — asynchrone Generierung von Bildern, Videos, TTS, Musik und 3D. Parameter model, prompt, opts. Abfragen mit GET /api/media/jobs/{id}.
Asynchrone Mediengenerierung: Bilder, Video, Voiceover (TTS), Speech-to-Text, Musik und 3D. Sie erstellen eine Aufgabe und fragen das Ergebnis ab. Die vollständige Modellliste finden Sie im Medienmodellkatalog; Webhooks, Fehler und Abrechnung finden Sie im Webhook-Abschnitt.
Erstellungsparameter
| Parameter | Typ | Beschreibung |
|---|---|---|
modelreq. | string | Ein Medienmodellname, z. B. veo-3.1 oder gpt-image-2 (siehe den Katalog). |
promptreq. | string | Textbeschreibung. |
opts | object | Zusätzliche Generierungsoptionen (modellabhängig): Auflösung, Dauer usw. |
Erstellen und abfragen
Beim Erstellen wird 202 mit { ok: true, jobId, status: "processing" } zurückgegeben. Fragen Sie GET /api/media/jobs/{jobId} ab, bis status: "success" erreicht ist, und übernehmen Sie dann die 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"}ok: false und es fällt keine Gebühr an. Die Preise auf der Website sind Richtwerte; die genaue Gebühr wird im Header x-pv-cost-rub jeder akzeptierten Antwort zurückgegeben. Stream-Bodies bleiben standardmäßig unverändert; senden Sie x-pv-cost: 1, um die Kosten zum abschließenden Nutzungsereignis dieses Protokolls hinzuzufügen.Erweiterte Parameter (opts)
Neben model und prompt können Sie zusätzliche Optionen in opts übergeben. Die Menge hängt vom Modell ab. Der vollständige maschinenlesbare Vertrag ist über GET /api/model-capabilities verfügbar (oder über GET /api/model-capabilities/{model} für ein bestimmtes Modell).
| Parameter | Typ | Beschreibung |
|---|---|---|
aspect_ratio | string | Aspect ratio: 1:1, 16:9, 9:16, 4:3, 3:4. |
duration | string|number | Videodauer in Sekunden (5, 10, 15). |
resolution | string | Resolution: 480p, 720p, 1080p, 4K. |
image_url | string (URL) | Quellbild für I2V / Bild-zu-Bild. |
negative_prompt | string | Was bei der Generierung ausgeschlossen werden soll (qwen-image, wan-2-7). |
guidance | number | Guidance-Skala — Prompt-Treue (flux-2, qwen-image, seedance). |
seed | number | Seed für ein reproduzierbares Ergebnis (flux-2). |
stability | number | Stabilität 0–1 (hailuo, happyhorse, seedance, TTS). |
camera | string | Kamerabewegung, z. B. "pan left" (kling-3.0, hailuo). |
first_frame_url | string (URL) | First frame for I2V (kling-3.0, wan-2-7). |
last_frame_url | string (URL) | Letzter Frame für I2V (seedance, kling-3.0, wan-2-7). |
reference_image | string (URL) | Stil-/Charakterreferenz (happyhorse). |
similarity_boost | number | Stimmähnlichkeit 0–1 (ElevenLabs TTS). |
speed | number | Sprechgeschwindigkeit 0.5–2 (ElevenLabs TTS). |
GET /api/model-capabilities/{model}-Antwort.Ihre eigenen Dateien: base64 statt eines Links
URL-Optionen (image_url, input_urls, mask_url und die übrigen) sind Links, die der Anbieter abruft. Daher akzeptieren sie nur öffentliche https://-Adressen. Eine Inline-Zeichenfolge data:image/...;base64,… in einem dieser Felder wird mit 400 abgelehnt.
Um Ihre eigene Datei zu senden, verwenden Sie stattdessen das entsprechende Feld *_base64: Der Dienst speichert die Bytes, veröffentlicht sie und übergibt den resultierenden Link an den Anbieter. Bis zu 16 Dateien pro Anfrage in input_base64.
| Parameter | Typ | Beschreibung |
|---|---|---|
image_base64 | string | Quellbild. Ersetzt image_url. |
mask_base64 | string | Inpainting-Maske (nur image/*). Ersetzt mask_url. |
input_base64 | string[] | Referenzen für Bild-zu-Bild und mehrere Eingaben. Ersetzt input_urls. |
audio_base64 | string | Quellaudio. Ersetzt audio_url. |
video_base64 | string | Quellvideo. Ersetzt video_url. |
data:image/png;base64,…-Zeichenfolge einschließlich des Präfixes — der Dateityp wird daraus ausgelesen.Anfragevertrag: strict, quote_id, max_price_rub
POST /api/media/generate und POST /api/media/price akzeptieren denselben Body, sodass Sie zunächst ein Angebot erstellen und ihn anschließend unverändert übermitteln können. Es gibt keine weiteren Felder auf oberster Ebene: Ein unbekanntes Feld wird an beiden Endpunkten mit 400 und dem Code unknown_field abgelehnt, der es benennt (field, fields), mit oder ohne strict. Generierungsparameter gehören in opts.
| Parameter | Typ | Beschreibung |
|---|---|---|
modelreq. | string | Öffentliche Modell-ID oder eine ihrer Routen (base:alias). |
prompt | string | Text; nur erforderlich, wenn die Modelloperation ihn benötigt. |
opts | object | Modelloptionen. Exaktes Schema: operations[].requestJsonSchema in GET /v1/model-capabilities/{model}. |
strict | boolean | Strikter Modus (oder der Header x-getvibe-strict: 1): Eine Anfrage, die nicht exakt wie angegeben ausgeführt werden würde (ein Parameter wird entfernt, ein Wert begrenzt, ein Schlüssel liegt außerhalb des Modellvertrags), wird mit 422 strict_validation_failed und einer Liste von Verstößen abgelehnt, bevor ein Angebot erstellt oder eine Gebühr berechnet wird. Ein dokumentiertes Feld, das das Modell akzeptiert und ignoriert (duration bei Modellen mit Quellenlänge), stellt keinen Verstoß dar: Es wird als Warnung param_ignored zurückgegeben. |
quote_id | string | mq_… aus POST /api/media/price. Der Auftrag wird nur zu diesem Preis ausgeführt; ein veraltetes, bereits verwendetes oder umgeleitetes Angebot wird mit 409/422 abgelehnt, bevor irgendetwas ausgeführt wird. |
max_price_rub | number | Obergrenze für diesen einen Auftrag in der Kontowährung. Wenn der Kostenvoranschlag höher ist: 422 media_max_price_exceeded und es wird nichts ausgeführt. Ein Auftrag mit Messung wird niemals über diesem Betrag abgerechnet. |
webhook_url | string | Öffentliche https-URL, die eine signierte Abschlussbenachrichtigung empfängt. |
Dateien nach ID (Files API)
Jede Quelldatei kann auf drei Arten gesendet werden: als Link (image_url, audio_url, video_url …), als Inline-Bytes (image_base64, audio_base64, video_base64 …) oder als ID Ihrer eigenen Datei aus POST /v1/files. Die ID-Felder sind im requestJsonSchema jeder Operation aufgeführt und werden im Strict-Modus akzeptiert.
| Parameter | Typ | Beschreibung |
|---|---|---|
image_file_id | string | Anstelle von image_url. |
audio_file_id | string | Anstelle von audio_url. |
video_file_id | string | Anstelle von video_url. |
mask_file_id | string | Anstelle von mask_url. |
first_frame_file_id / last_frame_file_id | string | Instead of first_frame_url / last_frame_url. |
input_file_ids | string[] | An input_urls angehängt. |
reference_*_file_ids | string[] | Appended to reference_image_urls / reference_audio_urls / reference_video_urls. |
Videoabrechnung nach der Länge der Eingabedatei
Bei Modellen, deren Ausgabelänge einer hochgeladenen Audiospur folgt — 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 (beide Eingaben) — messen /api/media/price und die Vorabprüfung von max_price_rub auf /api/media/generate diese Datei serverseitig (link, data: URI, base64 oder *_file_id) und berechnen den Preis anhand der gemessenen Sekunden. Die Antwort enthält sourceSeconds (outputSeconds für Lippensynchronisation), und estimateReason gibt an, dass die Länge gemessen wurde. Kann die Datei nicht gelesen werden, basiert der Preis weiterhin auf der vorherigen Grundlage (eine Sekunde, der Katalogschätzung oder dem Routenmaximum), und estimateReason gibt dies an. Die Abrechnung entspricht dem Sekundensatz × den tatsächlich gerenderten Sekunden, jedoch niemals mehr als max_price_rub. opts.duration wird bei diesen Modellen akzeptiert und ignoriert, wobei eine param_ignored-Warnung ausgegeben wird.
Stimmenklonen
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.
| Parameter | Typ | Beschreibung |
|---|---|---|
one recording | ≤ 10 MB | wav/mp3, up to 60 s. Larger: 422 voice_sample_too_large / voice_sample_invalid. |
recordings per voice | ≤ 25 | Bereits hinzugefügte werden mitgezählt. Mehr: 422 voice_samples_limit. |
voice length | ≤ 300 s | Alle Aufzeichnungen zusammen, einschließlich der bereits hinzugefügten. Länger: 422 voice_samples_limit; kürzer als das Engine-Minimum: 422 voice_samples_invalid. |
recordings size | ≤ 50 MB | Alle Aufzeichnungen einer Anfrage zusammen. Mehr dazu: 422 voice_samples_too_large. |
request body | ≤ 70 953 644 B | 50 MB an Aufzeichnungen als Base64 (×4/3) plus JSON. Größere Datenmengen: 413 payload_too_large (JSON, mit max_body_bytes). Senden Sie lange Mengen in Teilen über …/samples oder als audio_url-Links. |
additions per 24 h | 20 | Pro Client. Mehr dazu: 429 voice_samples_rate_limited. |
Stimmveränderung und Forced Alignment
| Parameter | Typ | Beschreibung |
|---|---|---|
elevenlabs-voice-changer | model | opts.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-alignment | model | prompt 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: Ergebnis der Übermittlung unbekannt
Wenn die Startbestätigung des Anbieters nicht eintrifft, bleibt der Auftrag im Status: "submitting" mit stage: "submission_unknown", errorCode: "media_submission_uncertain" und failure.advice: "reconcile_first" – fragen Sie weiterhin dieselbe jobId ab und erstellen Sie kein Duplikat. Um diesen Pfad kostenlos zu testen, senden Sie POST /api/media/generate mit einem Sandbox-Schlüssel und dem Header x-pv-sandbox-outcome: submission_uncertain. Die Antwort ist ein normales 202 mit einer jobId; bei der Abfrage wird 60 Sekunden lang eine unbekannte Übermittlung zurückgegeben, danach ein Auftrag, der nie gestartet wurde (failure.code: "submission_not_started", charged: false). Nichts wird gespeichert, an einen Anbieter gesendet oder berechnet. Ein regulärer Schlüssel mit diesem Header erhält 400 sandbox_outcome_requires_sandbox_key.
Speech-to-Text (Transkription)
Derselbe Endpunkt wie für den Rest der Generierung: Geben Sie den Namen des STT-Modells in model an, lassen Sie prompt als leere Zeichenfolge stehen und übergeben Sie die Aufnahme in opts.audio_url. Das Transkript kommt in resultText bei GET /api/media/jobs/{id} an; resultUrls bleibt leer — die Transkription erzeugt keine Datei.
# 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}Modelle
whisper-large-v3-turbo— $0.00025 pro Audiominute. Am günstigsten und schnellsten, 99 Sprachen.nemotron-asr-multilingual— $0.00025 pro Minute. Mehrsprachige NVIDIA-ASR, setzt automatisch Satzzeichen.whisper-large-v3— $0.000563 pro Minute. Vollständiges Whisper: langsamer als turbo, bei verrauschtem Audio genauer.universal-2— $0.003125 pro Minute.speech-to-text— $0.01 pro Minute (ElevenLabs Scribe). Unterstützt Sprecherdiarisierung und Tags für Audioereignisse.
Parameter
| Parameter | Typ | Beschreibung |
|---|---|---|
audio_urlreq. | string (URL) | Öffentlicher https-Link, der die Datei direkt bereitstellt. Weiterleitungen und private Netzwerkadressen werden abgelehnt. Verwenden Sie stattdessen audio_base64, wenn die Datei nicht online verfügbar ist. |
audio_base64 | string | Die Aufzeichnung inline als data:audio/mpeg;base64,… Ersetzt audio_url. |
language_code | string | Sprachcode (en, ru, …). Wird automatisch erkannt, wenn er nicht angegeben wird. |
duration_minutes | number | Aufnahmedauer in Minuten – wird für die Vorab-Preisschätzung verwendet. Die endgültige Gebühr wird gemessen (siehe unten). |
diarize | boolean | Sprecherdiarisierung (universal-2, Speech-to-Text). |
tag_audio_events | boolean | Markieren Sie Audioereignisse wie Lachen oder Applaus (Sprache-zu-Text). |
keyterms | string[] | Hinweisliste mit Begriffen und Namen (Speech-to-Text; +30 % Preis). |
Formate und Limits
mp3, wav, m4a/mp4, flac, ogg/opus und webm werden akzeptiert. Die Dateigröße beträgt maximal 25 MB — ungefähr 26 Minuten MP3 mit 128 kbit/s oder mehrere Stunden Sprache in Opus. Alles Größere wird sofort mit einer ausdrücklichen Meldung abgelehnt und nicht berechnet; teilen Sie die Aufzeichnung stattdessen auf.
whisper-large-v3-turbo, whisper-large-v3 und nemotron-asr-multilingual wird der Endbetrag anhand der gemessenen Länge der Aufnahme berechnet, die aus dem Transkript stammt — nicht anhand des Werts, den Sie in duration_minutes übergeben haben. Die Mindestgebühr beträgt einen Kopeken. Der genaue Betrag wird für den abgeschlossenen Auftrag immer als priceRub zurückgegeben.Readiness-Webhook (statt Polling)
Um Polling zu vermeiden, registrieren Sie eine Adresse mediaWebhookUrl in Ihrem Dashboard. Wenn die Aufgabe abgeschlossen ist (erfolgreich oder mit Fehler), unternimmt der Dienst bis zu fünf Zustellversuche einer POST mit einem JSON-Body:
// 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"
}Datei wird abgerufen: /api/media/file/{id}/{idx}
Die URL des Generierungsergebnisses (Bild, Video, Audio oder 3D-Modell) aus resultUrls. Verwenden Sie sie so, wie sie vom Dienst zurückgegeben wird: Sie lässt sich ohne API-Schlüssel öffnen und funktioniert in <img>, <video> oder einem Browser. Der Provider bleibt verborgen: Die Upstream-Adresse wird serverseitig aufgelöst, der Client sieht sie nie.
| Parameter | Typ | Beschreibung |
|---|---|---|
idreq. | string (path) | Task-ID (jobId) aus der Antwort von /api/media/jobs/{id}. |
idxreq. | integer (path) | Ergebnisindex (0-basiert). Für ein einzelnes Ergebnis: 0. |
query params | wie in resultUrls | Erstellen Sie die URL nicht selbst und ändern Sie die vom Dienst zurückgegebenen Parameter nicht. |
download | string (query) | download=1 gibt die Datei als Anhang zurück, dessen Name und Erweiterung dem Inhalt folgen (.glb für ein 3D-Modell). Ohne diesen Parameter wird die Datei im Browser geöffnet. |
# 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_SIGNATUREresultsExpireAt-Feld von /api/media/jobs/{id}). Die fertige Datei wird in unseren Speicher kopiert und resultUrls wechselt zu einer dauerhaften Adresse der Form https://getvibeapi.com/media/r/…; auch eine zuvor zurückgegebene /api/media/file/…-URL bleibt funktionsfähig. Beide unterstützen Range-Anfragen (Springen in Video und Audio). Nach 7 Tagen wird die Datei gelöscht und die URL antwortet mit 410 Gone und dem Code media_result_expired – laden Sie alles, was Sie benötigen, vorher herunter.