DokumentasiMenangani error

Menangani error

Pahami respons error dan kegagalan transkripsi, lalu tentukan kapan request perlu diperbaiki atau dicoba ulang.

Bedakan request yang ditolak API dengan transkripsi yang gagal setelah diterima. Pada kasus pertama, Anda mendapat respons error langsung. Pada kasus kedua, job sudah dibuat, tetapi akhirnya memiliki status bernilai failed.

Struktur respons error

Jika request ke /v1 ditolak, respons error mengikuti format berikut:

{
  "error": {
    "code": "insufficient_minutes",
    "message": "Not enough minutes",
    "retryable": false,
    "action_url": "https://transcript1.com/dashboard/billing",
    "minutes_needed": 20,
    "minutes_remaining": 3
  }
}

Gunakan code untuk menentukan penanganan di aplikasi. Teks message boleh ditampilkan kepada pengguna, tetapi jangan jadikan teksnya patokan karena bisa berubah. Nilai retryable: true menandakan request yang sama mungkin berhasil jika dicoba lagi nanti.

Selain retryable, beberapa error menyertakan informasi tambahan:

FieldKode errorKeterangan
action_urlinsufficient_minutes, no_active_plan, topup_needs_userLink untuk membeli paket atau top-up.
minutes_needed, minutes_remaininginsufficient_minutesJumlah menit yang dibutuhkan request dan saldo menit Anda. Kebutuhan menit bernilai null jika belum diketahui.
reason, packstopup_needs_userAlasan kartu tidak ditagih, dan jumlah bundel yang diminta.
supported_platformsunsupported_platformDaftar nilai platform yang diterima: ["youtube", "x", "tiktok", "instagram", "facebook", "bluesky", "twitch", "dailymotion", "pinterest", "linkedin", "snapchat"].
missing_chunksupload_incompleteDaftar indeks chunk yang belum sampai ke server.
max_bytesmedia_too_largeBatas ukuran file yang berlaku untuk Anda, dalam byte.
paramsinvalid_requestRincian validasi body atau query: setiap field dipasangkan dengan penjelasan masalahnya.

Saat API menolak request

Status HTTPcodeBisa retryPenyebab dan tindakan
400, 422invalid_requestTidakAda parameter atau field body yang belum diisi atau tidak valid. Contohnya diarize bersama source: "captions", atau reuse_recent bersama webhook_url. Body yang bukan JSON valid juga memakai kode ini.
422invalid_urlTidakLink tidak diterima atau platform tidak sesuai dengan link. Gunakan YouTube, X, TikTok, Instagram, Facebook, Bluesky, atau platform lain dalam daftar sumber.
422unsupported_platformTidakNilai platform tidak termasuk platform yang didukung.
422unsupported_mediaTidakEkstensi file unggahan tidak didukung.
401unauthorizedTidakKredensial belum dikirim, tidak valid, sudah kedaluwarsa, atau sudah dicabut. Kode ini juga berlaku untuk token unggahan yang tidak valid atau kedaluwarsa.
403insufficient_scopeTidakToken OAuth belum memiliki scope transcriptions:read atau transcriptions:write yang diperlukan.
403email_not_verifiedTidakAlamat email belum diverifikasi. Selesaikan verifikasi sebelum membuat transkripsi atau sesi langsung.
402insufficient_minutesTidakSaldo menit yang bisa dipakai sudah 0 atau tidak cukup untuk transkripsi ini, atau kurang dari satu menit yang dimulai pada sesi langsung. Jika top-up otomatis aktif, transcript1 mencoba top-up lebih dulu. Beli menit di action_url, atau biarkan agen membelinya dengan POST /v1/topups atau tool MCP top_up.
402no_active_planTidakPembelian top-up memerlukan paket berbayar aktif. Kode ini berasal dari POST /v1/topups dan endpoint penagihan dasbor, bukan endpoint transkripsi.
402topup_needs_userHanya untuk pending dan in_progressPOST /v1/topups tidak menagih kartu. reason menjelaskan alasannya: not_allowed (kredensial tidak boleh membeli top-up, atau pemiliknya bukan admin tim), cap_reached (batas bulanan untuk agen sudah tidak cukup), card_declined, authentication_required, atau no_card. Pengguna bisa membeli bundel di action_url. Untuk pending (pembayaran belum dikonfirmasi) dan in_progress (top-up lain sedang berjalan), tagihan masih mungkin berhasil: coba lagi nanti dengan Idempotency-Key yang sama, bukan meminta pengguna membeli.
404not_foundTidakTidak ada transkripsi dengan ID tersebut, atau transkripsi milik tim lain.
409upload_incompleteTidakBelum semua chunk diterima. Kirim bagian yang kurang, lalu ulangi langkah penyelesaian unggahan.
409invalid_stateTidakTranskripsi tidak sedang menunggu unggahan. Anda tidak bisa mengirim chunk atau menyelesaikan unggahan.
409session_endedTidakSesi langsung sudah berakhir, sehingga POST /v1/live/sessions/:id/token tidak bisa menerbitkan token. Juga dikirim sebagai event error WebSocket.
422unsupported_languageTidaklanguage pada sesi langsung tidak didukung.
422unsupported_translationTidakBahasa translate_to pada sesi langsung tidak didukung, atau terjemahan langsung tidak tersedia.
409idempotency_conflictTidakHeader Idempotency-Key sudah dipakai untuk parameter yang berbeda.
413media_too_largeTidakFile melewati batas ukuran Anda. Periksa batas unggahan.
413invalid_requestTidakBody JSON melebihi 1 MB. Untuk file yang terlalu besar, kodenya media_too_large.
429rate_limitedYaJumlah request per menit melewati batas. Tunggu sesuai jumlah detik pada Retry-After.
429too_many_active_jobsYaTerlalu banyak transkripsi berjalan atau sesi unggahan terbuka. Tunggu sesuai jumlah detik pada Retry-After.
429too_many_live_sessionsYaSemua sesi langsung bersamaan pada paket Anda sedang terpakai. Tunggu sesuai jumlah detik pada Retry-After (30).
500internal_errorYaAda masalah pada sistem kami. Coba kembali beberapa saat lagi.
503service_unavailableYatranscript1 sementara tidak bisa diakses. Coba kembali beberapa saat lagi.
503live_capacityYaSeluruh kapasitas langsung sedang terpakai. Tunggu sesuai jumlah detik pada Retry-After (30), lalu buat sesi lagi.
503live_unavailableTidakTranskripsi langsung sedang tidak tersedia.

Jika browser memakai cookie login sebagai autentikasi, API juga memeriksa origin request. Akses dari situs lain mendapat 403 forbidden_origin. Pemeriksaan ini tidak berlaku untuk request API yang memakai header Authorization dengan kredensial bearer.

Semua respons 429 menyertakan Retry-After dalam detik. Rincian batasnya ada di biaya dan batas penggunaan.

Tentukan kapan perlu retry

  • Retry hanya untuk retryable bernilai true: rate_limited, too_many_active_jobs, too_many_live_sessions, live_capacity, internal_error, service_unavailable, dan topup_needs_user dengan reason pending atau in_progress. Jika ada Retry-After, tunggu sesuai nilainya. Jika tidak, tambah jeda pada setiap percobaan.
  • Saat mengulang POST /v1/transcriptions atau POST /v1/topups, pakai header Idempotency-Key yang sama. Dengan begitu, Anda tidak terkena biaya kedua jika request pertama ternyata sudah berhasil.
  • Untuk kode lain, perbaiki request terlebih dahulu. Mengirim request yang sama tanpa perubahan tidak menyelesaikan masalahnya.

Transkripsi langsung

POST /v1/live/sessions dan endpoint langsung lainnya memakai struktur error yang sama. invalid_request, unsupported_language, insufficient_minutes, dan email_not_verified juga berlaku untuk endpoint tersebut, bersama kode khusus transkripsi langsung pada tabel di atas. Pembuatan sesi tidak idempoten, jadi percobaan ulang setelah too_many_live_sessions atau live_capacity membuat sesi baru.

Setelah sesi ada, masalah datang lewat WebSocket sebagai event error dan kode penutupan, bukan sebagai error HTTP. Lihat Transkripsi langsung untuk semua event.

Kode penutupanArti
1000Penutupan normal, setelah session.ended.
1011Error server yang tidak terduga. Lanjutkan dengan token baru.
1012Server restart, setelah reconnect. Lanjutkan dengan token baru.
4001Token tidak valid, kedaluwarsa, atau sudah dipakai.
4004Sesi tidak ditemukan atau sudah berakhir.
4008Pelanggaran protokol: frame audio berukuran ganjil atau terlalu besar.
4010Digantikan oleh koneksi yang lebih baru ke sesi yang sama.

Sesi langsung yang berakhir karena alasan seperti balance_exhausted atau idle_timeout bukanlah error: sesi mengirim session.ended dengan alasan berakhir dan disimpan. Lihat Alasan berakhir.

Saat proses transkripsi gagal

Job bisa gagal setelah API menerima request dan mengirim respons. Jika status berubah menjadi failed, objek transkripsi memuat error: { "code", "message" }. Periksa error saat polling atau ketika menerima webhook transcription.failed. Jika terjemahan gagal, webhook transcription.translation.failed dikirim dan transkrip tidak pernah ikut gagal.

error.codePenyebabLangkah berikutnya
media_unavailableVideo tidak ditemukan atau sudah tidak tersedia.Jangan langsung retry. Periksa URL.
media_privateVideo hanya bisa diakses secara privat.Gunakan postingan publik, atau video YouTube berstatus publik maupun unlisted.
login_requiredPlatform meminta Anda login untuk mengakses video.Tidak ada retry untuk kegagalan permanen ini.
no_audioVideo tidak memiliki track audio.Tidak ada retry untuk kegagalan permanen ini.
age_restrictedVideo memiliki batasan usia.Unggah file rekamannya, bukan mengulang link yang sama.
live_streamSiaran masih berlangsung atau belum dimulai.Coba lagi setelah siaran berakhir.
no_captionsMode captions pada source tidak menemukan track subtitle yang bisa dipakai.Ubah ke source: "auto" atau "stt".
media_too_longDurasi melebihi batas speech to text, yaitu 5 jam.Bagi rekaman menjadi beberapa bagian sebelum mengirimnya lagi.
unsupported_mediaFile tidak bisa dibaca atau tidak memiliki track audio.Kirim file dengan format yang didukung.
no_speechTidak ada ucapan yang terdeteksi.Jangan retry.
unsupported_languageBahasa dalam rekaman tidak didukung.Ubah language ke kode yang didukung atau "auto" sebelum mencoba lagi.
insufficient_minutesSaldo menit habis sebelum transkripsi bisa ditagih, dan top-up otomatis, jika aktif, tidak berhasil menambah menit.Isi saldo dengan top-up, lalu coba lagi.
fetch_failedMedia tetap gagal diambil setelah beberapa percobaan.Boleh dicoba lagi nanti.
transcription_failedSpeech to text tetap gagal setelah beberapa percobaan.Boleh dicoba lagi nanti.

Jika transkripsi gagal atau dibatalkan, Anda tidak membayar. Menit yang sudah dipotong untuk job tersebut dikembalikan ke saldo.

Pembaruan terakhir 5 November 2026