Tema
Bahasa

Pembuatan media

POST /api/media/generate — pembuatan gambar, video, TTS, musik, dan 3D secara asinkron. Parameter model, prompt, opts. Polling dengan GET /api/media/jobs/{id}.

Generasi media asinkron: gambar, video, voiceover (TTS), speech-to-text, musik, dan 3D. Anda membuat task lalu melakukan polling hasilnya. Daftar model lengkap ada di katalog media-models; webhook, error, dan penagihan ada di bagian webhook.

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

Parameter pembuatan

ParameterTipeDeskripsi
modelreq.stringNama model media, misalnya veo-3.1 atau gpt-image-2 (lihat katalog).
promptreq.stringDeskripsi teks.
optsobjectOpsi pembuatan tambahan (bergantung model): resolusi, durasi, dan sebagainya.

Buat dan polling

Pembuatan mengembalikan 202 dengan { ok: true, jobId, status: "processing" }. Polling GET /api/media/jobs/{jobId} sampai status: "success", lalu ambil 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"}
Penagihan didasarkan pada volume generasi yang sebenarnya (resolusi, durasi). Jika model tidak tersedia atau permintaan ditolak, respons menyertakan ok: false dan tidak ada biaya. Harga di situs bersifat indikatif; biaya persisnya dikembalikan di header x-pv-cost-rub setiap respons yang diterima. Isi stream tidak berubah secara bawaan; kirim x-pv-cost: 1 untuk menambahkan biaya ke event usage terakhir protokol tersebut.

Parameter lanjutan (opts)

Selain model dan prompt, Anda dapat memberikan opsi tambahan di opts. Kumpulannya bergantung pada model. Kontrak lengkap yang dapat dibaca mesin tersedia melalui GET /api/model-capabilities (atau GET /api/model-capabilities/{model} untuk model tertentu).

Parameter lanjutan yang umum digunakan
ParameterTipeDeskripsi
aspect_ratiostringAspect ratio: 1:1, 16:9, 9:16, 4:3, 3:4.
durationstring|numberDurasi video dalam detik (5, 10, 15).
resolutionstringResolution: 480p, 720p, 1080p, 4K.
image_urlstring (URL)Gambar sumber untuk I2V / image-to-image.
negative_promptstringApa yang dikecualikan dari pembuatan (qwen-image, wan-2-7).
guidancenumberGuidance scale — kepatuhan pada prompt (flux-2, qwen-image, seedance).
seednumberSeed untuk hasil yang dapat direproduksi (flux-2).
stabilitynumberStabilitas 0–1 (hailuo, happyhorse, seedance, TTS).
camerastringGerakan kamera, misalnya "pan left" (kling-3.0, hailuo).
first_frame_urlstring (URL)First frame for I2V (kling-3.0, wan-2-7).
last_frame_urlstring (URL)Frame terakhir untuk I2V (seedance, kling-3.0, wan-2-7).
reference_imagestring (URL)Referensi gaya/karakter (happyhorse).
similarity_boostnumberKemiripan suara 0–1 (ElevenLabs TTS).
speednumberKecepatan bicara 0,5–2 (ElevenLabs TTS).
Semua parameter bersifat opsional kecuali dinyatakan lain. Parameter yang tidak dikenal akan diabaikan. Daftar lengkap beserta tipe, rentang, dan contohnya ada di respons GET /api/model-capabilities/{model}.

File Anda sendiri: base64 alih-alih tautan

Opsi URL (image_url, input_urls, mask_url dan sisanya) adalah tautan yang diambil oleh provider, sehingga hanya menerima alamat https:// publik. String data:image/...;base64,… inline di salah satu field tersebut ditolak dengan 400.

Untuk mengirim file Anda sendiri, gunakan field *_base64 yang sesuai: layanan menyimpan byte-nya, mempublikasikannya, dan meneruskan tautan yang dihasilkan ke provider. Hingga 16 file per permintaan di input_base64.

File inline
ParameterTipeDeskripsi
image_base64stringGambar sumber. Menggantikan image_url.
mask_base64stringMask inpainting (hanya image/*). Menggantikan mask_url.
input_base64string[]Referensi untuk image-to-image dan multi-input. Menggantikan input_urls.
audio_base64stringAudio sumber. Menggantikan audio_url.
video_base64stringVideo sumber. Menggantikan video_url.
Nilainya adalah string data:image/png;base64,… lengkap termasuk prefiksnya — jenis file dibaca dari string itu.

Kontrak permintaan: strict, quote_id, max_price_rub

POST /api/media/generate dan POST /api/media/price menerima body yang sama, sehingga Anda dapat meminta penawaran lalu mengirimkannya tanpa perubahan. Tidak ada field top-level lain: field yang tidak dikenal ditolak di kedua endpoint dengan 400 dan kode unknown_field yang menyebutkannya (field, fields), dengan atau tanpa strict. Parameter generasi diletakkan di dalam opts.

Field tingkat atas
ParameterTipeDeskripsi
modelreq.stringId model publik atau salah satu route-nya (base:alias).
promptstringTeks; diperlukan hanya ketika operasi model memerlukannya.
optsobjectOpsi model. Skema persis: operations[].requestJsonSchema di GET /v1/model-capabilities/{model}.
strictbooleanMode ketat (atau header x-getvibe-strict: 1): permintaan yang tidak dapat dijalankan persis seperti yang ditulis (parameter dihapus, nilai dibatasi, kunci di luar kontrak model) ditolak dengan 422 strict_validation_failed dan daftar pelanggaran, sebelum ada estimasi harga atau pembebanan biaya. Field terdokumentasi yang diterima dan diabaikan oleh model (duration pada model yang mengikuti panjang sumber) bukan merupakan pelanggaran: field tersebut dikembalikan sebagai peringatan param_ignored.
quote_idstringmq_… dari POST /api/media/price. Job hanya berjalan pada harga itu; quote yang kedaluwarsa, sudah dipakai, atau dirutekan ulang akan ditolak dengan 409/422 sebelum apa pun berjalan.
max_price_rubnumberBatas atas untuk satu pekerjaan ini dalam mata uang akun. Jika kuotasi lebih tinggi: 422 media_max_price_exceeded dan tidak ada yang dijalankan. Pekerjaan metered tidak pernah ditagih melebihi batas ini.
webhook_urlstringURL https publik yang menerima notifikasi penyelesaian bertanda tangan.

File berdasarkan id (Files API)

Setiap file sumber dapat dikirim dengan tiga cara: sebagai tautan (image_url, audio_url, video_url…), sebagai byte inline (image_base64, audio_base64, video_base64…) atau sebagai id file Anda sendiri dari POST /v1/files. Field id tercantum di requestJsonSchema setiap operasi dan diterima dalam mode strict.

ParameterTipeDeskripsi
image_file_idstringSebagai ganti image_url.
audio_file_idstringSebagai ganti audio_url.
video_file_idstringSebagai ganti video_url.
mask_file_idstringSebagai ganti mask_url.
first_frame_file_id / last_frame_file_idstringInstead of first_frame_url / last_frame_url.
input_file_idsstring[]Ditambahkan ke input_urls.
reference_*_file_idsstring[]Appended to reference_image_urls / reference_audio_urls / reference_video_urls.

Video dihargai berdasarkan panjang file masukan

Untuk model yang panjang outputnya mengikuti trek yang diunggah — 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 (kedua input) — /api/media/price dan pemeriksaan awal max_price_rub pada /api/media/generate mengukur file tersebut di sisi server (link, data: URI, base64 atau *_file_id) dan menetapkan harga berdasarkan detik yang terukur. Respons menyertakan sourceSeconds (outputSeconds untuk lip-sync), dan estimateReason menyatakan bahwa durasi telah diukur. Jika file tidak dapat dibaca, harga tetap menggunakan dasar sebelumnya (satu detik, estimasi katalog, atau maksimum rute), dan estimateReason menyatakannya. Biaya yang dikenakan adalah tarif per detik × detik yang benar-benar dirender, tidak pernah melebihi max_price_rub. opts.duration pada model-model ini diterima dan diabaikan dengan peringatan param_ignored.

Kloning suara

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.

Batas dan kode error
ParameterTipeDeskripsi
one recording≤ 10 MBwav/mp3, up to 60 s. Larger: 422 voice_sample_too_large / voice_sample_invalid.
recordings per voice≤ 25Menghitung yang sudah ditambahkan. Selengkapnya: 422 voice_samples_limit.
voice length≤ 300 sSemua rekaman digabungkan, termasuk yang sudah ditambahkan. Lebih panjang: 422 voice_samples_limit; lebih pendek dari minimum engine: 422 voice_samples_invalid.
recordings size≤ 50 MBSemua rekaman untuk satu permintaan digabungkan. Lebih dari itu: 422 voice_samples_too_large.
request body≤ 70 953 644 B50 MB rekaman sebagai base64 (×4/3) ditambah JSON. Lebih besar: 413 payload_too_large (JSON, dengan max_body_bytes). Kirim kumpulan panjang dalam beberapa bagian melalui …/samples, atau sebagai tautan audio_url.
additions per 24 h20Per klien. Selengkapnya: 429 voice_samples_rate_limited.
Jawaban lain: 404 voice_not_found (voice tidak dikenal, sudah dihapus, atau milik akun lain), 409 voice_samples_unsupported (rekaman hanya dapat ditambahkan ke voice ElevenLabs), 409 voice_slots_full, 502 voice_samples_failed (pihak penyedia menolak rekaman; voice tidak berubah). Voice ElevenLabs ditagih setiap bulan; harga tersedia di GET /api/media/voices (pricing).

Pengubah Suara dan Penyelarasan Paksa

ParameterTipeDeskripsi
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: hasil submit tidak diketahui

Jika konfirmasi mulai dari supplier tidak datang, job tetap berada di status: "submitting" dengan stage: "submission_unknown", errorCode: "media_submission_uncertain" dan failure.advice: "reconcile_first" — terus polling jobId yang sama dan jangan membuat duplikat. Untuk menguji jalur ini tanpa biaya, kirim POST /api/media/generate dengan sandbox key dan header x-pv-sandbox-outcome: submission_uncertain. Jawabannya adalah 202 normal dengan jobId; polling-nya menjawab sebagai submit yang tidak diketahui selama 60 detik, lalu sebagai job yang tidak pernah dimulai (failure.code: "submission_not_started", charged: false). Tidak ada yang disimpan, dikirim ke supplier, atau ditagih. Key reguler dengan header ini akan mendapat 400 sandbox_outcome_requires_sandbox_key.

Speech-to-text (transkripsi)

Endpoint yang sama seperti bagian generasi lainnya: taruh nama model STT di model, biarkan prompt sebagai string kosong, dan masukkan rekaman di opts.audio_url. Transkrip muncul di resultText pada GET /api/media/jobs/{id}; resultUrls tetap kosong — transkripsi tidak menghasilkan file.

# 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}

Model

  • whisper-large-v3-turbo — $0.00025 per menit audio. Termurah dan tercepat, 99 bahasa.
  • nemotron-asr-multilingual — $0.00025 per menit. NVIDIA multilingual ASR, memberi tanda baca sendiri.
  • whisper-large-v3 — $0.000563 per menit. Whisper lengkap: lebih lambat dari turbo, lebih akurat pada audio berisik.
  • universal-2 — $0.003125 per menit.
  • speech-to-text — $0.01 per menit (ElevenLabs Scribe). Mendukung diarisasi pembicara dan tag peristiwa audio.

Parameter

ParameterTipeDeskripsi
audio_urlreq.string (URL)Tautan https publik yang menyajikan file secara langsung. Redirect dan alamat jaringan privat ditolak. Gunakan audio_base64 sebagai gantinya jika file tidak tersedia online.
audio_base64stringRekaman secara inline sebagai data:audio/mpeg;base64,… Menggantikan audio_url.
language_codestringKode bahasa (en, ru, …). Terdeteksi otomatis jika dihilangkan.
duration_minutesnumberDurasi rekaman dalam menit — dipakai untuk estimasi harga di awal. Biaya akhir diukur (lihat di bawah).
diarizebooleanDiariisasi pembicara (universal-2, speech-to-text).
tag_audio_eventsbooleanTandai peristiwa audio seperti tawa atau tepuk tangan (speech-to-text).
keytermsstring[]Daftar petunjuk istilah dan nama (speech-to-text; harga +30%).

Format dan batasan

mp3, wav, m4a/mp4, flac, ogg/opus dan webm diterima. Ukuran file maksimum 25 MB — kira-kira 26 menit mp3 128 kbps, atau beberapa jam ucapan dalam opus. Apa pun yang lebih besar langsung ditolak dengan pesan eksplisit dan tidak ditagih; pisahkan rekamannya sebagai gantinya.

Penagihan dihitung per menit audio. Untuk whisper-large-v3-turbo, whisper-large-v3 dan nemotron-asr-multilingual jumlah akhir dihitung dari panjang rekaman yang terukur, diambil dari transkrip — bukan dari nilai yang Anda berikan di duration_minutes. Biaya minimum satu kopeck. Jumlah persisnya selalu dikembalikan sebagai priceRub pada job yang telah selesai.

Webhook kesiapan (sebagai ganti polling)

Untuk menghindari polling, daftarkan satu alamat mediaWebhookUrl di dashboard Anda. Saat tugas selesai (berhasil atau error), layanan melakukan hingga lima kali percobaan pengiriman POST dengan body 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"
}
Detail pengiriman, kode error, dan penagihan ada di Webhook and media task lifecycle. Singkatnya: webhook ditandatangani dengan header Standard Webhooks, duplikat mungkin terjadi, dan pengiriman berhenti setelah lima percobaan gagal. Polling tetap menjadi sumber kebenaran.

Mengambil file: /api/media/file/{id}/{idx}

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

URL hasil pembuatan (gambar, video, audio, atau model 3D) dari resultUrls. Gunakan seperti yang dikembalikan oleh layanan: URL tersebut terbuka tanpa API key dan berfungsi di <img>, <video>, atau browser. Penyedianya disembunyikan: alamat upstream diselesaikan di sisi server, klien tidak pernah melihatnya.

Parameter path dan query
ParameterTipeDeskripsi
idreq.string (path)ID tugas (jobId) dari respons /api/media/jobs/{id}.
idxreq.integer (path)Indeks hasil (berbasis 0). Untuk satu hasil — 0.
query paramsseperti pada resultUrlsJangan membangun URL sendiri atau mengubah parameter yang dikembalikan oleh layanan.
downloadstring (query)download=1 mengembalikan file sebagai lampiran yang nama dan ekstensinya mengikuti konten (.glb untuk model 3D). Tanpanya file akan terbuka di browser.
# 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
Hasil disimpan selama 7 hari setelah job selesai (field resultsExpireAt dari /api/media/jobs/{id}). File yang sudah jadi disalin ke penyimpanan kami dan resultUrls beralih ke alamat permanen dengan bentuk https://getvibeapi.com/media/r/…; URL /api/media/file/… yang sebelumnya dikembalikan tetap berfungsi. Keduanya mendukung Range request (seeking pada video dan audio). Setelah 7 hari file dihapus dan URL menjawab 410 Gone dengan kode media_result_expired — unduh yang Anda butuhkan sebelum itu.
Pembuatan media GetVibe API — gambar, video, audio, musik, 3D | GetVibe API