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.
Parameter pembuatan
| Parameter | Tipe | Deskripsi |
|---|---|---|
modelreq. | string | Nama model media, misalnya veo-3.1 atau gpt-image-2 (lihat katalog). |
promptreq. | string | Deskripsi teks. |
opts | object | Opsi 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"}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 | Tipe | Deskripsi |
|---|---|---|
aspect_ratio | string | Aspect ratio: 1:1, 16:9, 9:16, 4:3, 3:4. |
duration | string|number | Durasi video dalam detik (5, 10, 15). |
resolution | string | Resolution: 480p, 720p, 1080p, 4K. |
image_url | string (URL) | Gambar sumber untuk I2V / image-to-image. |
negative_prompt | string | Apa yang dikecualikan dari pembuatan (qwen-image, wan-2-7). |
guidance | number | Guidance scale — kepatuhan pada prompt (flux-2, qwen-image, seedance). |
seed | number | Seed untuk hasil yang dapat direproduksi (flux-2). |
stability | number | Stabilitas 0–1 (hailuo, happyhorse, seedance, TTS). |
camera | string | Gerakan kamera, misalnya "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) | Frame terakhir untuk I2V (seedance, kling-3.0, wan-2-7). |
reference_image | string (URL) | Referensi gaya/karakter (happyhorse). |
similarity_boost | number | Kemiripan suara 0–1 (ElevenLabs TTS). |
speed | number | Kecepatan bicara 0,5–2 (ElevenLabs TTS). |
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.
| Parameter | Tipe | Deskripsi |
|---|---|---|
image_base64 | string | Gambar sumber. Menggantikan image_url. |
mask_base64 | string | Mask inpainting (hanya image/*). Menggantikan mask_url. |
input_base64 | string[] | Referensi untuk image-to-image dan multi-input. Menggantikan input_urls. |
audio_base64 | string | Audio sumber. Menggantikan audio_url. |
video_base64 | string | Video sumber. Menggantikan video_url. |
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.
| Parameter | Tipe | Deskripsi |
|---|---|---|
modelreq. | string | Id model publik atau salah satu route-nya (base:alias). |
prompt | string | Teks; diperlukan hanya ketika operasi model memerlukannya. |
opts | object | Opsi model. Skema persis: operations[].requestJsonSchema di GET /v1/model-capabilities/{model}. |
strict | boolean | Mode 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_id | string | mq_… 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_rub | number | Batas 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_url | string | URL 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.
| Parameter | Tipe | Deskripsi |
|---|---|---|
image_file_id | string | Sebagai ganti image_url. |
audio_file_id | string | Sebagai ganti audio_url. |
video_file_id | string | Sebagai ganti video_url. |
mask_file_id | string | Sebagai ganti mask_url. |
first_frame_file_id / last_frame_file_id | string | Instead of first_frame_url / last_frame_url. |
input_file_ids | string[] | Ditambahkan ke input_urls. |
reference_*_file_ids | string[] | 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
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 | Tipe | Deskripsi |
|---|---|---|
one recording | ≤ 10 MB | wav/mp3, up to 60 s. Larger: 422 voice_sample_too_large / voice_sample_invalid. |
recordings per voice | ≤ 25 | Menghitung yang sudah ditambahkan. Selengkapnya: 422 voice_samples_limit. |
voice length | ≤ 300 s | Semua rekaman digabungkan, termasuk yang sudah ditambahkan. Lebih panjang: 422 voice_samples_limit; lebih pendek dari minimum engine: 422 voice_samples_invalid. |
recordings size | ≤ 50 MB | Semua rekaman untuk satu permintaan digabungkan. Lebih dari itu: 422 voice_samples_too_large. |
request body | ≤ 70 953 644 B | 50 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 h | 20 | Per klien. Selengkapnya: 429 voice_samples_rate_limited. |
Pengubah Suara dan Penyelarasan Paksa
| Parameter | Tipe | Deskripsi |
|---|---|---|
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: 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
| Parameter | Tipe | Deskripsi |
|---|---|---|
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_base64 | string | Rekaman secara inline sebagai data:audio/mpeg;base64,… Menggantikan audio_url. |
language_code | string | Kode bahasa (en, ru, …). Terdeteksi otomatis jika dihilangkan. |
duration_minutes | number | Durasi rekaman dalam menit — dipakai untuk estimasi harga di awal. Biaya akhir diukur (lihat di bawah). |
diarize | boolean | Diariisasi pembicara (universal-2, speech-to-text). |
tag_audio_events | boolean | Tandai peristiwa audio seperti tawa atau tepuk tangan (speech-to-text). |
keyterms | string[] | 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.
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"
}Mengambil file: /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 | Tipe | Deskripsi |
|---|---|---|
idreq. | string (path) | ID tugas (jobId) dari respons /api/media/jobs/{id}. |
idxreq. | integer (path) | Indeks hasil (berbasis 0). Untuk satu hasil — 0. |
query params | seperti pada resultUrls | Jangan membangun URL sendiri atau mengubah parameter yang dikembalikan oleh layanan. |
download | string (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_SIGNATUREresultsExpireAt 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.