{"openapi":"3.0.0","paths":{"/v1/intl/id/text/checks":{"post":{"description":"Kirim satu teks untuk dicek kepatuhannya. **Langsung mengembalikan id**, pengecekan berjalan asinkron di belakang layar.\nSetelah mendapat id, polling `GET {id}` sampai `status` menjadi `completed` atau `failed` (biasanya 3–15 detik).\n\nYang dicek adalah **konten dalam bahasa setempat**; bahasa penjelasan risiko ditentukan oleh `explainLocale` — keduanya tidak saling memengaruhi.\nKredit dipotong saat pengiriman; jika gagal masuk antrean, kredit dikembalikan penuh secara otomatis.","operationId":"textCreate","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateIntlTextCheckDto"}}}},"responses":{"201":{"description":"Diterima, mengembalikan id pengecekan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlAcceptedResponseDto"}}}},"402":{"description":"Kredit tidak mencukupi"}},"security":[{"ApiKey":[]}],"summary":"Kirim pengecekan teks","tags":["Pengecekan Teks"]},"get":{"description":"Dikembalikan berurutan dari yang terbaru, hanya berisi ringkasan (teks dipotong sampai 100 karakter). Hanya menampilkan data situs ini.","operationId":"textList","parameters":[{"name":"page","required":false,"in":"query","description":"Nomor halaman, mulai dari 1.","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","description":"Jumlah data per halaman, maksimum 50.","schema":{"minimum":1,"maximum":50,"default":20,"type":"number"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"Hasil berhalaman","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlTextCheckListResponseDto"}}}}},"security":[{"ApiKey":[]}],"summary":"Riwayat pengecekan teks","tags":["Pengecekan Teks"]}},"/v1/intl/id/text/checks/{id}":{"get":{"description":"Saat `status` masih `processing`, pengecekan belum selesai — coba lagi nanti; hasil final baru ada di `risks` ketika `completed`.\n\nRisiko dipisah menjadi dua lapis yang **tidak boleh dicampur**:\n- `risks` — risiko kepatuhan. `kind=violation` adalah pelanggaran keras, `kind=scene-hint` adalah catatan batasan skenario.\n- `customRisks` — kata terlarang yang Anda atur sendiri, **tidak dihitung** ke `riskLevel`; jika Anda mengisi kata pengganti, akan disertakan `replacement`.","operationId":"textGetById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"Detail pengecekan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlTextCheckResponseDto"}}}},"404":{"description":"Data tidak ditemukan, bukan milik akun Anda, atau milik situs lain"}},"security":[{"ApiKey":[]}],"summary":"Ambil hasil pengecekan teks","tags":["Pengecekan Teks"]},"delete":{"description":"Tidak dapat dipulihkan.","operationId":"textRemove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"Sudah dihapus","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlDeletedResponseDto"}}}},"404":{"description":"Data tidak ditemukan atau milik situs lain"}},"security":[{"ApiKey":[]}],"summary":"Hapus data pengecekan teks","tags":["Pengecekan Teks"]}},"/v1/intl/id/text/checks/{id}/fix":{"post":{"description":"Memicu penulisan ulang oleh AI untuk pengecekan yang sudah selesai. **Langsung kembali**, penulisan ulang berjalan di belakang layar.\nPolling `GET {id}`; hasilnya ada di `fixedText` setelah selesai (`fixStatus` menjadi `completed`).\nKredit penulisan ulang dipotong terpisah dan dikembalikan otomatis bila gagal.","operationId":"textFix","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"201":{"description":"Diterima, penulisan ulang berjalan di belakang layar","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlTextFixAcceptedDto"}}}},"400":{"description":"Data ini tidak perlu ditulis ulang (tidak ada pelanggaran), atau sudah ada penulisan ulang yang sedang berjalan"},"402":{"description":"Kredit tidak mencukupi"},"404":{"description":"Data tidak ditemukan atau milik situs lain"}},"security":[{"ApiKey":[]}],"summary":"Picu penulisan ulang AI","tags":["Pengecekan Teks"]}},"/v1/intl/id/image/checks":{"post":{"description":"Kirim URL gambar yang dapat diakses publik untuk dicek kepatuhannya.\n\nPengecekan gambar bersifat **sinkron**: saat endpoint ini merespons, hasilnya sudah siap dan body respons adalah hasil lengkapnya —\ntidak perlu polling. (`GET {id}` tetap tersedia untuk penelusuran ulang.)\n\n**Selalu periksa `status`**: normalnya `completed`; bila mesin pengecekan bermasalah nilainya `failed` (kredit sudah dikembalikan otomatis,\n`labels` kosong). Kasus ini tetap mengembalikan 201, bukan 5xx — datanya sendiri berhasil dibuat.\n\n**Biaya**: 2 kredit per gambar.","operationId":"imageCreate","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateIntlImageCheckDto"}}}},"responses":{"201":{"description":"Pengecekan selesai, hasil lengkap langsung dikembalikan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlImageCheckResponseDto"}}}},"400":{"description":"Parameter tidak valid"},"402":{"description":"Kredit tidak mencukupi"}},"security":[{"ApiKey":[]}],"summary":"Kirim pengecekan gambar","tags":["Pengecekan Gambar"]},"get":{"description":"Dikembalikan berurutan dari yang terbaru, hanya berisi ringkasan.","operationId":"imageList","parameters":[{"name":"page","required":false,"in":"query","description":"Nomor halaman, mulai dari 1.","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","description":"Jumlah data per halaman, maksimum 50.","schema":{"minimum":1,"maximum":50,"default":20,"type":"number"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"Hasil berhalaman","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlImageCheckListResponseDto"}}}}},"security":[{"ApiKey":[]}],"summary":"Riwayat pengecekan gambar","tags":["Pengecekan Gambar"]}},"/v1/intl/id/image/checks/{id}":{"get":{"description":"Menelusuri kembali pengecekan gambar yang sudah dikirim.","operationId":"imageGetById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"Detail pengecekan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlImageCheckResponseDto"}}}},"404":{"description":"Data tidak ditemukan atau milik situs lain"}},"security":[{"ApiKey":[]}],"summary":"Ambil hasil pengecekan gambar","tags":["Pengecekan Gambar"]},"delete":{"description":"Penghapusan lunak, sekaligus membersihkan berkas gambar yang telah diunggah secara asinkron.","operationId":"imageRemove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"Sudah dihapus","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlDeletedResponseDto"}}}},"404":{"description":"Data tidak ditemukan atau milik situs lain"}},"security":[{"ApiKey":[]}],"summary":"Hapus data pengecekan gambar","tags":["Pengecekan Gambar"]}},"/v1/intl/id/video/checks":{"post":{"description":"Kirim URL video yang dapat diakses publik untuk dicek kepatuhannya. **Langsung mengembalikan id**, pengecekan berjalan asinkron.\nPolling `GET {id}`; durasi pengecekan kira-kira **setengah durasi video** (minimal 30 detik), disarankan polling setiap 5–10 detik.\n\nPengecekan mencakup tiga dimensi: gambar (`frames`), audio (`audios`), dan naskah lisan (`transcriptRisks`,\nsetelah ditranskripsi diproses oleh mesin yang sama dengan pengecekan teks).\n\n**Biaya**: 1 kredit per detik durasi video, dipotong saat pengiriman. Mohon laporkan `videoDuration` dengan jujur.","operationId":"videoCreate","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateIntlVideoCheckDto"}}}},"responses":{"201":{"description":"Diterima, mengembalikan id pengecekan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlAcceptedResponseDto"}}}},"402":{"description":"Kredit tidak mencukupi"}},"security":[{"ApiKey":[]}],"summary":"Kirim pengecekan video","tags":["Pengecekan Video"]},"get":{"description":"Dikembalikan berurutan dari yang terbaru, hanya berisi ringkasan.","operationId":"videoList","parameters":[{"name":"page","required":false,"in":"query","description":"Nomor halaman, mulai dari 1.","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","description":"Jumlah data per halaman, maksimum 50.","schema":{"minimum":1,"maximum":50,"default":20,"type":"number"}},{"name":"status","required":false,"in":"query","description":"Filter berdasarkan status.","schema":{"enum":["processing","completed","failed"],"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"Hasil berhalaman","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlVideoCheckListResponseDto"}}}}},"security":[{"ApiKey":[]}],"summary":"Riwayat pengecekan video","tags":["Pengecekan Video"]}},"/v1/intl/id/video/checks/{id}":{"get":{"description":"Setiap pemanggilan sekaligus mendorong satu putaran polling ke mesin pengecekan, jadi **cukup polling endpoint ini** — tidak perlu endpoint status terpisah.\n\n⚠️ **Syarat berhenti polling ada dua**: `status` sudah final (completed / failed),\n**dan** `transcriptStatus` bukan lagi `processing`. Transkripsi lisan biasanya selesai lebih lambat daripada peninjauan gambar;\nhanya melihat `status` akan membuat Anda berhenti saat transkripsi masih berjalan dan tidak pernah mendapat `transcriptRisks`.\n\n`explainLocale` menentukan bahasa penjelasan risiko lisan. Parameter ini ada di sisi baca, bukan sisi kirim —\nhasilnya keluar asinkron, sehingga pilihan bahasa saat pengiriman tidak sampai ke saat data disimpan.","operationId":"videoGetById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"explainLocale","required":false,"in":"query","description":"Bahasa penjelasan risiko. Bila tidak diisi, digunakan zh-CN.","schema":{"default":"zh-CN","enum":["zh-CN","id-ID"],"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"Detail pengecekan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlVideoCheckResponseDto"}}}},"404":{"description":"Data tidak ditemukan atau milik situs lain"}},"security":[{"ApiKey":[]}],"summary":"Ambil hasil pengecekan video","tags":["Pengecekan Video"]},"delete":{"description":"Penghapusan lunak, sekaligus membersihkan berkas video yang telah diunggah secara asinkron.","operationId":"videoRemove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"Sudah dihapus","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlDeletedResponseDto"}}}},"404":{"description":"Data tidak ditemukan atau milik situs lain"}},"security":[{"ApiKey":[]}],"summary":"Hapus data pengecekan video","tags":["Pengecekan Video"]}},"/v1/intl/id/batches":{"post":{"description":"Kirim beberapa teks + gambar + video sekaligus, dicek bersama dan disimpulkan secara agregat.\nMaksimum 10 teks, 20 gambar, 10 video, total ≤40 item per paket.\n\n**Langsung mengembalikan id**, seluruh sub-item dicek paralel di belakang layar. Polling `GET {id}` untuk melihat progres:\n`progress.done / progress.total` adalah tingkat penyelesaian; setelah semua selesai, `result` memberi kesimpulan paket (PASS / REJECT).\nSetiap sub-item membawa `checkId` yang bisa dipakai memanggil endpoint per item untuk detail lengkap.\n\n**Biaya**: dihitung per sub-item sesuai tarifnya (teks per item, gambar per lembar, video per detik). Bila kredit tidak cukup, seluruh paket ditolak saat pengiriman.","operationId":"batchCreate","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateIntlBatchDto"}}}},"responses":{"201":{"description":"Diterima, mengembalikan id paket materi","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlAcceptedResponseDto"}}}},"400":{"description":"Paket materi kosong, atau melebihi batas jumlah item"},"402":{"description":"Kredit tidak cukup untuk menutup biaya seluruh paket"},"403":{"description":"Pengecekan massal memerlukan langganan Flagship atau lebih tinggi"}},"security":[{"ApiKey":[]}],"summary":"Kirim pengecekan massal paket materi","tags":["Pengecekan Massal Paket Materi"]},"get":{"description":"Dikembalikan berurutan dari yang terbaru, lengkap dengan progres dan kesimpulan tiap paket. Sekaligus mendorong status sebagian paket yang masih berjalan.","operationId":"batchList","parameters":[{"name":"page","required":false,"in":"query","description":"Nomor halaman, mulai dari 1.","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"pageSize","required":false,"in":"query","description":"Jumlah data per halaman, maksimum 50.","schema":{"minimum":1,"maximum":50,"default":20,"type":"number"}},{"name":"explainLocale","required":false,"in":"query","description":"Bahasa penjelasan risiko (daftar ini sekaligus mendorong status sub-item, sehingga penyimpanan bisa terjadi saat ini).","schema":{"default":"zh-CN","enum":["zh-CN","id-ID"],"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"Hasil berhalaman","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlBatchListResponseDto"}}}}},"security":[{"ApiKey":[]}],"summary":"Daftar paket materi","tags":["Pengecekan Massal Paket Materi"]}},"/v1/intl/id/batches/{id}":{"get":{"description":"Setiap pemanggilan sekaligus menyegarkan status sub-item, jadi cukup polling endpoint ini. `items[].checkId` dipakai untuk mengambil detail lengkap per item.","operationId":"batchGetById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"explainLocale","required":false,"in":"query","description":"Bahasa penjelasan risiko. Bila tidak diisi, digunakan zh-CN.","schema":{"default":"zh-CN","enum":["zh-CN","id-ID"],"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"Detail paket materi","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlBatchResponseDto"}}}},"404":{"description":"Paket materi tidak ditemukan atau milik situs lain"}},"security":[{"ApiKey":[]}],"summary":"Ambil progres dan hasil paket materi","tags":["Pengecekan Massal Paket Materi"]},"delete":{"description":"Menghapus paket materi beserta seluruh data pengecekan sub-itemnya secara lunak, sekaligus membersihkan berkas gambar / video yang telah diunggah secara asinkron.","operationId":"batchRemove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"Sudah dihapus","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlDeletedResponseDto"}}}},"404":{"description":"Paket materi tidak ditemukan atau milik situs lain"}},"security":[{"ApiKey":[]}],"summary":"Hapus paket materi","tags":["Pengecekan Massal Paket Materi"]}},"/v1/intl/id/custom-rules":{"get":{"description":"Berurutan dari yang terbaru, tanpa halaman. **Hanya mengembalikan kata milik situs ini** — kata yang sama disimpan terpisah di tiap situs dan tidak saling memicu.","operationId":"customRuleList","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"Daftar aturan","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlCustomRuleListResponseDto"}}}}},"security":[{"ApiKey":[]}],"summary":"Tampilkan seluruh kata terlarang kustom di situs ini","tags":["Kata Terlarang Kustom"]},"post":{"operationId":"customRuleCreate","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateIntlCustomRuleDto"}}}},"responses":{"201":{"description":"Berhasil dibuat","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlCustomRuleResponseDto"}}}},"400":{"description":"Kata ini sudah ada di situs ini, atau kuota kamus paket Anda sudah penuh"},"403":{"description":"Kata terlarang kustom adalah fitur berbayar; langganan Anda saat ini belum mencakupnya"}},"security":[{"ApiKey":[]}],"summary":"Tambah satu kata terlarang kustom","tags":["Kata Terlarang Kustom"]}},"/v1/intl/id/custom-rules/quota":{"get":{"description":"Mengembalikan jumlah terpakai dan batas paket. ⚠️ **`used` bersifat per akun** (termasuk kata yang Anda daftarkan di situs lain), sedangkan `isPaid` adalah status langganan situs ini — keanggotaan diisolasi per situs, kuota kamus tidak.","operationId":"customRuleQuota","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"Informasi kuota","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlCustomRuleQuotaDto"}}}}},"security":[{"ApiKey":[]}],"summary":"Cek kuota kamus","tags":["Kata Terlarang Kustom"]}},"/v1/intl/id/custom-rules/settings":{"get":{"description":"Saat dimatikan, seluruh kata kustom tidak ikut dalam pengecekan (data tetap tersimpan). **Sakelar ini per akun, tidak dipisah per situs.**","operationId":"customRuleGetSettings","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"Status sakelar","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlCustomRuleSettingsDto"}}}}},"security":[{"ApiKey":[]}],"summary":"Cek status sakelar utama","tags":["Kata Terlarang Kustom"]},"patch":{"description":"Ortogonal terhadap `enabled` tiap aturan: bila sakelar utama dimatikan, `enabled` per aturan tidak berlaku.","operationId":"customRuleSetSettings","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlToggleSettingsDto"}}}},"responses":{"200":{"description":"Status sakelar setelah diperbarui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlCustomRuleSettingsDto"}}}},"403":{"description":"Kata terlarang kustom adalah fitur berbayar; langganan Anda saat ini belum mencakupnya"}},"security":[{"ApiKey":[]}],"summary":"Ubah sakelar utama","tags":["Kata Terlarang Kustom"]}},"/v1/intl/id/custom-rules/bulk-import":{"post":{"description":"Maksimum 2000 kata per panggilan. **Ramah idempotensi**: duplikat dalam batch maupun kata yang sudah ada akan dilewati, bukan menghasilkan error;\nrespons memberi tiga hitungan terpisah `imported` / `skippedDuplicate` / `rejectedQuota`.\nBagian yang melebihi kuota ditolak, sedangkan bagian yang diterima tetap ditulis.","operationId":"customRuleBulkImport","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlBulkImportDto"}}}},"responses":{"201":{"description":"Statistik hasil impor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlCustomRuleImportResultDto"}}}},"403":{"description":"Kata terlarang kustom adalah fitur berbayar; langganan Anda saat ini belum mencakupnya"}},"security":[{"ApiKey":[]}],"summary":"Impor massal kata terlarang","tags":["Kata Terlarang Kustom"]}},"/v1/intl/id/custom-rules/{id}":{"patch":{"description":"Hanya memperbarui field yang dikirim.","operationId":"customRuleUpdate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateIntlCustomRuleDto"}}}},"responses":{"200":{"description":"Aturan setelah diperbarui","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlCustomRuleResponseDto"}}}},"404":{"description":"Aturan tidak ditemukan atau milik situs lain"}},"security":[{"ApiKey":[]}],"summary":"Ubah kata terlarang kustom","tags":["Kata Terlarang Kustom"]},"delete":{"description":"Penghapusan permanen, tidak dapat dipulihkan.","operationId":"customRuleRemove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"Sudah dihapus","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlDeletedResponseDto"}}}},"404":{"description":"Aturan tidak ditemukan atau milik situs lain"}},"security":[{"ApiKey":[]}],"summary":"Hapus kata terlarang kustom","tags":["Kata Terlarang Kustom"]}},"/v1/intl/id/account":{"get":{"description":"Mengembalikan saldo kredit, paket langganan, dan jumlah pemakaian tiap jenis pengecekan bulan ini **untuk situs ini**.\n\n⚠️ Kredit dan langganan **diisolasi per situs**: saldo di sini tidak mencakup kredit Anda di situs lain, begitu pula sebaliknya.\nDisarankan memanggilnya sekali sebelum integrasi untuk memastikan kuota — kalau tidak, Anda baru tahu kredit kurang saat tertabrak 402.\n\nStatistik pemakaian mencakup semua kanal (web, API), bukan hanya panggilan API.","operationId":"accountGetAccount","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"responses":{"200":{"description":"Informasi akun","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlAccountResponseDto"}}}}},"security":[{"ApiKey":[]}],"summary":"Cek saldo dan pemakaian akun","tags":["Akun"]}},"/v1/intl/id/uploads/policy":{"post":{"description":"**Endpoint ini hanya diperlukan bila Anda belum punya penyimpanan materi yang dapat diakses publik.**\nBila materi sudah ada di penyimpanan objek atau CDN Anda sendiri, langsung isikan URL-nya ke endpoint pengecekan dan lewati langkah ini.\n\nMengembalikan satu kredensial POST Policy untuk unggah langsung lewat form standar:\n\n```bash\ncurl -X POST \"$host\" \\\n  -F \"key=$dir<nama-berkas-Anda>\" \\\n  -F \"policy=$policy\" \\\n  -F \"OSSAccessKeyId=$accessKeyId\" \\\n  -F \"signature=$signature\" \\\n  -F \"file=@./promo-01.mp4\"\n```\n\nSetelah unggah berhasil, alamat materi adalah `{cdnHost}/{key}`; isikan ke `videoUrl` / `imageUrl` pada endpoint pengecekan.\n**Kredensial kedaluwarsa dalam 5 menit** dan hanya mengizinkan penulisan ke prefiks direktori khusus akun Anda di situs ini.","operationId":"uploadCreatePolicy","parameters":[{"name":"X-End-Tenant","in":"header","required":false,"description":"Nomor tenant di sistem Anda sendiri. Dengan header ini, kamus kata terlarang dan riwayat pengecekan tenant tersebut diisolasi dalam domain terpisah; kredit dan langganan tetap dihitung pada akun pemilik API Key. Tenant baru dibuat otomatis saat pertama kali muncul. Nilai: 1–64 karakter huruf, angka, _ . : -.","schema":{"type":"string","maxLength":64,"pattern":"^[A-Za-z0-9_.:-]{1,64}$","example":"tenant-4271"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateIntlUploadPolicyDto"}}}},"responses":{"201":{"description":"Kredensial unggah langsung","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntlUploadPolicyResponseDto"}}}}},"security":[{"ApiKey":[]}],"summary":"Ambil kredensial unggah materi","tags":["Unggah Materi"]}}},"info":{"title":"ByeRisk Open API · Situs Indonesia","description":"ByeRisk API Pengecekan Kepatuhan Konten (Situs Indonesia) — membuka kemampuan pengecekan kepatuhan\nteks, video, dan gambar untuk platform lokal, beserta kamus kata terlarang kustom, agar dapat dipanggil\noleh sistem Anda maupun AI agent. Mesin pengecekan dan akun kreditnya sama persis dengan versi web.\n\n## Mulai cepat\n\n1. Buat satu Key di [Konsol → Open API](https://www.byerisk.com/id/open-api) (berformat `brsk_live_…`, **hanya ditampilkan sekali**)\n2. Sertakan `Authorization: Bearer brsk_live_…` pada setiap permintaan\n3. Kirim pengecekan untuk mendapat `id`, lalu polling sampai `status` menjadi `completed`\n\n```bash\n# 1) Kirim pengecekan teks\ncurl -X POST https://www.byerisk.com/api/v1/intl/id/text/checks \\\n  -H \"Authorization: Bearer $BYERISK_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"text\": \"Serum ini 100% ampuh memutihkan wajah dalam 3 hari, garansi uang kembali!\",\n    \"platform\": \"tiktok_id\",\n    \"vertical\": \"beauty\"\n  }'\n# → { \"success\": true, \"data\": { \"id\": \"cm5abc…\", \"status\": \"processing\" } }\n\n# 2) Polling hasilnya\ncurl https://www.byerisk.com/api/v1/intl/id/text/checks/cm5abc… \\\n  -H \"Authorization: Bearer $BYERISK_API_KEY\"\n```\n\n## Satu Key hanya milik satu situs\n\nIni hal terpenting yang perlu Anda ketahui sebelum integrasi: **API Key terikat pada satu situs**.\nKey yang dibuat di konsol situs Indonesia hanya bisa memanggil `/v1/intl/id/*`; memakainya untuk memanggil\n`/v1/*` milik situs Mandarin akan mengembalikan 401, begitu pula sebaliknya.\n\nTanpa desain ini, satu permintaan yang sama bisa saja mengecek teks berbahasa Indonesia memakai kumpulan aturan\nMandarin (hasilnya nyaris selalu «lolos»), atau memotong kredit dari akun situs lain — keduanya tidak menghasilkan\nerror apa pun, hanya diam-diam memberi jawaban yang salah.\n\nDengan alasan yang sama, kredit, langganan, riwayat pengecekan, dan kamus kata kustom **seluruhnya diisolasi per situs**.\nSaldo Anda di situs Mandarin tidak bisa dipakai di sini.\n\n## Format respons\n\nSeluruh endpoint memakai amplop yang sama: sukses `{ \"success\": true, \"data\": … }`, gagal `{ \"success\": false, \"error\": \"…\" }`.\nSkema yang dijabarkan pada tiap endpoint di bawah mengacu pada isi `data`.\n\n## Bila sistem Anda sendiri juga multi-tenant\n\nBila Anda menjual kembali / mengintegrasikan ByeRisk untuk banyak pelanggan Anda sendiri, tambahkan header\n`X-End-Tenant` berisi nomor tenant di sistem Anda, dan kami akan membuka satu domain terisolasi untuknya:\n\n```bash\ncurl -X POST https://www.byerisk.com/api/v1/intl/id/text/checks \\\n  -H \"Authorization: Bearer $BYERISK_API_KEY\" \\\n  -H \"X-End-Tenant: toko-4271\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"text\": \"…\", \"platform\": \"tiktok_id\", \"vertical\": \"general\" }'\n```\n\n- **Yang diisolasi adalah data**: kamus kata terlarang kustom, riwayat pengecekan, dan direktori unggah materi dimiliki masing-masing tenant dan tidak saling terlihat.\n- **Yang tidak diisolasi adalah akun**: kredit dan tingkat langganan tetap dihitung pada akun Anda (pemilik Key); Anda tidak perlu mengisi saldo untuk tiap tenant.\n- Nomor tenant yang muncul pertama kali dibuat otomatis, **tidak perlu didaftarkan lebih dulu**. Nilai: 1–64 karakter huruf, angka, `_`, `.`, `:`, `-`.\n- **Kirimkan identitas tenant yang stabil**, jangan nilai yang berubah tiap permintaan (misalnya id permintaan) — itu akan langsung menghabiskan batas jumlah domain untuk satu Key.\n\nPembatasan laju dihitung per **API Key** (bukan per tenant Anda); bila butuh konkurensi lebih tinggi, buatlah beberapa Key.\n\n## Apa yang dicek dan apa yang tidak\n\n| Dimensi | Cakupan | Keterangan |\n|---|---|---|\n| Teks | Kamus aturan platform + peninjauan semantik | Regulasi setempat dan aturan platform; peninjauan semantik menangani risiko lintas kalimat dan menyaring positif palsu |\n| Gambar | Risiko visual + pengenalan tulisan pada gambar | Penilaian visual tidak bergantung pada bahasa konten |\n| Video | Gambar + audio + naskah lisan | Naskah lisan ditranskripsi lalu diproses **mesin yang sama** dengan pengecekan teks |\n\n**Pengecekan gambar tidak menilai kepatuhan komersial**: yang dinilai adalah risiko pada visualnya sendiri, bukan verifikasi\nklaim khasiat atau tanda sertifikasi yang menuntut pemahaman atas tulisan di dalam gambar. Untuk risiko semacam itu,\nkirimkan teksnya secara terpisah ke pengecekan teks.\n\n## Kesimpulan risiko: dua kumpulan nilai, jangan dicampur\n\nInilah bagian yang paling sering salah diintegrasikan — **`riskLevel` pada teks dan pada gambar / video bukan enum yang sama**:\n\n| Endpoint | Nilai `riskLevel` | Arti |\n|---|---|---|\n| Pengecekan teks | `safe` / `low` / `medium` / `high` | Diambil dari `severity` tertinggi di antara pelanggaran yang cocok |\n| Pengecekan gambar dan video | `PASS` / `REVIEW` / `REJECT` | Saran penanganan dari peninjauan konten |\n\nKeduanya berasal dari dua jalur penilaian yang berbeda dan tidak punya rumus konversi. Tanganilah per endpoint,\njangan menulis satu enum `riskLevel` yang menyatukan keduanya.\n\nSetiap risiko pada teks masih membawa dua dimensi:\n\n- `kind` — `violation` pelanggaran keras (wajib diperbaiki); `scene-hint` catatan batasan skenario\n- `severity` — `high` / `medium` / `low`; `riskLevel` tingkat atas mengambil yang tertinggi di antara seluruh violation\n\nKecocokan kata terlarang kustom **ditempatkan terpisah di `customRisks`** dan tidak dihitung ke `riskLevel` —\nitu preferensi Anda sendiri, bukan penilaian kepatuhan. Yang sudah diberi kata pengganti akan membawa `replacement`\nyang bisa langsung dipakai untuk penggantian presisi.\n\n## Bahasa konten dan bahasa penjelasan adalah dua hal berbeda\n\nYang dicek selalu **konten dalam bahasa setempat**; bahasa untuk penjelasan risiko dan saran perbaikan ditentukan oleh\n`explainLocale` (`zh-CN` atau `id-ID`, default `zh-CN`). Keduanya ortogonal — tim berbahasa Mandarin bisa membaca\npenjelasan dalam bahasa Mandarin, sementara teks yang dicek tetap berbahasa Indonesia.\n\nRujukan pasal (`legalRef`) **tidak ikut diterjemahkan**: nomor dan sumber pasal harus dapat diverifikasi.\n\n## Asinkron dan polling\n\nPengecekan teks, video, dan paket materi bersifat **asinkron**: pengiriman mengembalikan `id`, hasilnya diambil dengan polling `GET`.\nPengecekan gambar bersifat sinkron dan langsung mengembalikan hasil lengkap saat pengiriman.\n\nJeda polling yang disarankan: teks 2 detik, video 5–10 detik. Durasi pengecekan video kira-kira setengah durasi videonya (minimal 30 detik).\nEndpoint GET itu sendiri sekaligus mendorong status pengecekan, jadi tidak diperlukan endpoint status terpisah.\n\n⚠️ **Syarat berhenti polling untuk video ada dua**: `status` sudah final, **dan** `transcriptStatus` bukan lagi\n`processing`. Transkripsi lisan biasanya selesai lebih lambat daripada peninjauan gambar; hanya melihat `status`\nakan membuat Anda tidak pernah mendapat risiko lisan.\n\n## Biaya\n\nMemakai akun kredit situs yang sama dengan versi web, dengan tarif yang sama:\n\n| Tindakan | Biaya |\n|---|---|\n| Pengecekan teks | Sesuai tarif paket, per panggilan |\n| Penulisan ulang AI | Sesuai tarif paket, per panggilan |\n| Pengecekan video | 1 kredit / detik |\n| Pengecekan gambar | 2 kredit / gambar |\n| Pengelolaan kata terlarang kustom | Gratis |\n\nKredit tidak cukup mengembalikan `402`. Sebelum integrasi, Anda bisa memanggil `GET /v1/intl/{country}/account` untuk mengecek saldo.\n\n## Pembatasan laju\n\nDihitung per API Key, **tiap tingkat dihitung terpisah**: kelompok pengiriman (POST pengecekan / massal) 60 kali/menit,\nkelompok kueri (GET) 600 kali/menit, kelompok konfigurasi (pengelolaan kata terlarang kustom, kredensial unggah) 120 kali/menit.\nMelewati batas mengembalikan `429` beserta header `Retry-After`; setiap respons juga membawa `X-RateLimit-Remaining`.\n\n## Kode error\n\n| Kode | Arti |\n|---|---|\n| 400 | Parameter tidak valid |\n| 401 | API Key tidak valid, sudah dicabut, sudah kedaluwarsa, **atau bukan milik situs yang sedang Anda panggil** |\n| 402 | Kredit tidak mencukupi |\n| 403 | Fitur memerlukan tingkat langganan lebih tinggi (akses API dan pengecekan massal sama-sama mulai dari Flagship; Key yang sudah dibuat tidak terpengaruh) |\n| 404 | Data tidak ditemukan, bukan milik akun Anda, atau situs tidak ada |\n| 429 | Terkena pembatasan laju |\n| 500 | Kesalahan sisi server, dapat dicoba ulang |","version":"1.0.0","contact":{}},"tags":[],"servers":[{"url":"https://www.byerisk.com/api","description":"Lingkungan produksi"}],"components":{"securitySchemes":{"ApiKey":{"scheme":"bearer","bearerFormat":"JWT","type":"http","description":"API Key yang dibuat di konsol situs terkait, berformat brsk_live_…"}},"schemas":{"CreateIntlTextCheckDto":{"type":"object","properties":{"text":{"type":"string","description":"Teks yang akan dicek, 10–5000 karakter. Yang dicek adalah konten berbahasa Indonesia itu sendiri, terpisah dari bahasa penjelasan di bawah.","minLength":10,"maxLength":5000,"example":"Serum ini 100% ampuh memutihkan wajah dalam 3 hari, sudah bersertifikat BPOM, garansi uang kembali!"},"platform":{"type":"string","description":"Platform tempat konten akan diterbitkan; menentukan kumpulan aturan platform mana yang dipakai.","enum":["tiktok_id","shopee_id","tokopedia"],"example":"tiktok_id"},"vertical":{"type":"string","description":"Industri konten. Menyebut industri spesifik = kumpulan aturan umum + kumpulan aturan khusus industri tersebut; general = hanya kumpulan umum.","enum":["general","beauty","health","food","fashion"],"example":"beauty"},"explainLocale":{"type":"string","description":"Bahasa untuk penjelasan risiko dan saran perbaikan. Ortogonal terhadap bahasa konten yang dicek — yang dicek selalu teks berbahasa Indonesia, parameter ini hanya menentukan bahasa yang kami pakai untuk menjelaskan hasilnya kepada Anda. Bila tidak diisi, digunakan zh-CN.","enum":["zh-CN","id-ID"],"default":"zh-CN"}},"required":["text","platform","vertical"]},"IntlAcceptedResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Id pengecekan ini, dipakai untuk polling hasil.","example":"cms8xhc5x0006sp59vrks7zkf"},"object":{"type":"string","description":"Tipe objek.","example":"intl_text_check"},"status":{"type":"string","description":"Status saat ini. Tepat setelah dikirim nilainya processing.","example":"processing"}},"required":["id","object","status"]},"IntlTextCheckListItemDto":{"type":"object","properties":{"id":{"type":"string","description":"Id pengecekan."},"object":{"type":"string","description":"Tipe objek.","example":"intl_text_check"},"status":{"type":"string","description":"Status."},"platform":{"type":"string","description":"Platform penerbitan."},"vertical":{"type":"object","description":"Industri konten.","nullable":true},"preview":{"type":"string","description":"Ringkasan teks (dipotong sampai 100 karakter). Untuk teks lengkap, panggil endpoint detail."},"riskLevel":{"type":"string","description":"Kesimpulan tingkat atas.","enum":["safe","low","medium","high"],"nullable":true},"riskCount":{"type":"number","description":"Jumlah risiko."},"fixStatus":{"type":"object","description":"Status penulisan ulang AI.","nullable":true},"createdAt":{"type":"object","description":"Waktu dibuat."}},"required":["id","object","status","platform","vertical","preview","riskLevel","riskCount","fixStatus","createdAt"]},"IntlTextCheckListResponseDto":{"type":"object","properties":{"object":{"type":"string","description":"Tipe objek, selalu list.","example":"list"},"page":{"type":"number","description":"Halaman saat ini.","example":1},"pageSize":{"type":"number","description":"Jumlah data per halaman.","example":20},"total":{"type":"number","description":"Total data yang cocok.","example":128},"hasMore":{"type":"boolean","description":"Apakah masih ada halaman berikutnya.","example":true},"data":{"description":"Data pada halaman ini.","type":"array","items":{"$ref":"#/components/schemas/IntlTextCheckListItemDto"}}},"required":["object","page","pageSize","total","hasMore","data"]},"IntlSummaryDto":{"type":"object","properties":{"violation":{"type":"number","description":"Jumlah pelanggaran keras terhadap regulasi / aturan platform.","example":3},"sceneHint":{"type":"number","description":"Jumlah catatan batasan skenario.","example":1},"custom":{"type":"number","description":"Jumlah kecocokan kamus kata kustom. **Tidak dihitung** ke riskLevel.","example":0},"semantic":{"type":"number","description":"Jumlah label risiko semantik (peringatan menyeluruh yang tidak bisa dilokalisasi ke posisi tertentu).","example":2}},"required":["violation","sceneHint"]},"IntlTextRiskDto":{"type":"object","properties":{"id":{"type":"object","description":"Id risiko.","nullable":true},"kind":{"type":"string","description":"Jenis risiko: `violation` pelanggaran keras regulasi / platform (wajib diperbaiki); `scene-hint` catatan batasan skenario.","enum":["violation","scene-hint"]},"severity":{"type":"string","description":"Tingkat keparahan. `riskLevel` tingkat atas mengambil yang tertinggi di antara seluruh violation.","enum":["high","medium","low"]},"matchedText":{"type":"string","description":"Potongan teks asli yang cocok.","example":"garansi uang kembali"},"startIndex":{"type":"number","description":"Indeks awal potongan yang cocok pada teks asli. **Bernilai `-1` bila kecocokan semantik tidak bisa dilokalisasi** (bukan null) — dalam kasus ini cari sendiri `matchedText` di teks asli, atau tampilkan saja sebagai peringatan menyeluruh.","example":42},"endIndex":{"type":"number","description":"Indeks akhir potongan yang cocok; juga bisa bernilai `-1`.","example":62},"category":{"type":"object","description":"Kategori risiko, sudah dilokalkan sesuai explainLocale.","nullable":true},"suggestion":{"type":"object","description":"Saran perbaikan, sudah dilokalkan sesuai explainLocale.","nullable":true},"legalRef":{"type":"object","description":"Rujukan pasal regulasi / aturan platform. **Tidak ikut diterjemahkan oleh explainLocale** — nomor dan sumber pasal harus dapat diverifikasi.","nullable":true,"example":"UU No. 8 Tahun 1999 Pasal 9"},"source":{"type":"string","description":"Sumber penilaian: `rule` kecocokan aturan deterministik; `model` penilaian model; `custom` kata kustom.","enum":["rule","model","custom"]}},"required":["id","kind","severity","matchedText","startIndex","endIndex","category","suggestion","legalRef","source"]},"IntlCustomRiskDto":{"type":"object","properties":{"matchedText":{"type":"string","description":"Potongan teks asli yang cocok."},"startIndex":{"type":"number","description":"Indeks awal (bisa bernilai -1)."},"endIndex":{"type":"number","description":"Indeks akhir (bisa bernilai -1)."},"replacement":{"type":"object","description":"Kata pengganti yang Anda atur untuk kata ini. Kosong berarti hanya mengingatkan, tanpa saran pengganti.","nullable":true},"note":{"type":"object","description":"Catatan yang Anda tulis untuk kata ini.","nullable":true}},"required":["matchedText","startIndex","endIndex","replacement","note"]},"IntlTextCheckResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Id pengecekan."},"object":{"type":"string","description":"Tipe objek.","example":"intl_text_check"},"status":{"type":"string","description":"`processing` berarti pengecekan masih berjalan, coba lagi nanti; hasil final baru ada di risks ketika `completed`.","enum":["processing","completed","failed"]},"platform":{"type":"string","description":"Platform penerbitan.","enum":["tiktok_id","shopee_id","tokopedia"]},"vertical":{"type":"string","description":"Industri konten.","enum":["general","beauty","health","food","fashion"]},"text":{"type":"string","description":"Teks asli yang dicek."},"riskLevel":{"type":"string","description":"Kesimpulan tingkat atas, diambil dari severity tertinggi di antara risiko violation. ⚠️ **Bukan kumpulan nilai yang sama** dengan `PASS` / `REVIEW` / `REJECT` pada pengecekan gambar / video.","enum":["safe","low","medium","high"],"nullable":true},"summary":{"description":"Hitungan tiap kategori.","allOf":[{"$ref":"#/components/schemas/IntlSummaryDto"}]},"risks":{"description":"Risiko kepatuhan satu per satu.","type":"array","items":{"$ref":"#/components/schemas/IntlTextRiskDto"}},"customRisks":{"description":"Kecocokan kamus kata kustom. **Terpisah dari risks dan tidak dihitung ke riskLevel** — ini preferensi Anda sendiri, bukan penilaian kepatuhan.","type":"array","items":{"$ref":"#/components/schemas/IntlCustomRiskDto"}},"semanticLabels":{"description":"Peringatan menyeluruh: model menilai ada risiko tetapi tidak dapat menunjuk potongan teks tertentu.","type":"array","items":{"type":"string"}},"fixStatus":{"type":"object","description":"Status penulisan ulang AI: null belum dipicu | processing sedang berjalan | completed selesai | failed gagal.","nullable":true},"fixedText":{"type":"object","description":"Teks lengkap hasil penulisan ulang AI, terisi setelah penulisan ulang selesai.","nullable":true},"createdAt":{"type":"object","description":"Waktu dibuat (ISO 8601)."},"updatedAt":{"type":"object","description":"Waktu pembaruan terakhir (ISO 8601)."}},"required":["id","object","status","platform","vertical","text","riskLevel","summary","risks","customRisks","semanticLabels","fixStatus","fixedText","createdAt","updatedAt"]},"IntlTextFixAcceptedDto":{"type":"object","properties":{"id":{"type":"string","description":"Id pengecekan."},"object":{"type":"string","description":"Tipe objek.","example":"intl_text_check"},"fixStatus":{"type":"string","description":"Status penulisan ulang, bernilai processing setelah diterima.","example":"processing"},"creditCost":{"type":"number","description":"Kredit yang dipakai penulisan ulang ini.","example":2}},"required":["id","object","fixStatus"]},"IntlDeletedResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Id data yang dihapus."},"object":{"type":"string","description":"Tipe objek.","example":"intl_text_check"},"deleted":{"type":"boolean","description":"Selalu true.","example":true}},"required":["id","object","deleted"]},"CreateIntlImageCheckDto":{"type":"object","properties":{"imageUrl":{"type":"string","description":"URL gambar, wajib dapat diakses publik (layanan pengecekan kami harus bisa mengunduhnya langsung). Bila Anda belum punya penyimpanan objek sendiri, panggil dulu `POST /v1/intl/{country}/uploads/policy` untuk mengambil kredensial unggah langsung.","example":"https://cdn.example.com/products/serum-01.jpg"},"imageTitle":{"type":"string","description":"Judul / nama berkas gambar, untuk mengenalinya kembali di riwayat.","example":"serum-01.jpg"},"imageSize":{"type":"number","description":"Ukuran gambar (byte).","example":254112,"minimum":1},"imageWidth":{"type":"number","description":"Lebar gambar (piksel).","example":1080},"imageHeight":{"type":"number","description":"Tinggi gambar (piksel).","example":1080},"vertical":{"type":"string","description":"Deklarasi industri konten. **Tidak memengaruhi penilaian gambar kali ini** (kebijakan penilaian gambar terikat pada konfigurasi sisi akun, lepas dari industri), hanya dipakai untuk pencatatan dan tampilan riwayat. Isi apa adanya, boleh dikosongkan.","enum":["general","beauty","health","food","fashion"]},"explainLocale":{"type":"string","description":"Bahasa untuk label risiko. Sama seperti pengecekan teks, terpisah dari bahasa tulisan di dalam gambar.","enum":["zh-CN","id-ID"],"default":"zh-CN"}},"required":["imageUrl","imageTitle","imageSize"]},"IntlImageFileDto":{"type":"object","properties":{"url":{"type":"string","description":"URL gambar (yang Anda kirim)."},"title":{"type":"string","description":"Judul / nama berkas gambar."},"sizeBytes":{"type":"object","description":"Ukuran (byte).","nullable":true},"width":{"type":"object","description":"Lebar (piksel).","nullable":true},"height":{"type":"object","description":"Tinggi (piksel).","nullable":true}},"required":["url","title","sizeBytes","width","height"]},"IntlImageLabelDto":{"type":"object","properties":{"description":{"type":"string","description":"Label risiko, sudah dilokalkan sesuai explainLocale.","example":"色情低俗"},"riskLevel":{"type":"string","description":"Tingkat untuk label ini sendiri. Data lama tidak memiliki tingkat per label, sehingga bernilai null (kami tidak mengarang nilainya).","enum":["PASS","REVIEW","REJECT"],"nullable":true}},"required":["description","riskLevel"]},"IntlImageCheckResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Id pengecekan."},"object":{"type":"string","description":"Tipe objek.","example":"intl_image_check"},"status":{"type":"string","description":"**Wajib diperiksa**: bernilai `failed` bila mesin pengecekan bermasalah (kredit sudah dikembalikan otomatis, labels kosong); kasus ini tetap mengembalikan 201.","enum":["processing","completed","failed"]},"image":{"description":"Informasi gambar.","allOf":[{"$ref":"#/components/schemas/IntlImageFileDto"}]},"vertical":{"type":"string","description":"Industri yang dideklarasikan saat pengiriman. Hanya pencatatan, **tidak memengaruhi penilaian gambar**.","enum":["general","beauty","health","food","fashion"],"nullable":true},"riskLevel":{"type":"string","description":"Kesimpulan tingkat atas. ⚠️ **Bukan kumpulan nilai yang sama** dengan safe/low/medium/high pada pengecekan teks.","enum":["PASS","REVIEW","REJECT"],"nullable":true},"labels":{"description":"Label risiko yang cocok. Array kosong bila tidak ada risiko.","type":"array","items":{"$ref":"#/components/schemas/IntlImageLabelDto"}},"createdAt":{"type":"object","description":"Waktu dibuat."},"updatedAt":{"type":"object","description":"Waktu pembaruan terakhir."}},"required":["id","object","status","image","vertical","riskLevel","labels","createdAt","updatedAt"]},"IntlImageCheckListItemDto":{"type":"object","properties":{"id":{"type":"string","description":"Id pengecekan."},"object":{"type":"string","description":"Tipe objek.","example":"intl_image_check"},"status":{"type":"string","description":"Status."},"image":{"type":"object","description":"URL dan judul gambar."},"vertical":{"type":"object","description":"Deklarasi industri.","nullable":true},"riskLevel":{"type":"string","description":"Kesimpulan tingkat atas.","enum":["PASS","REVIEW","REJECT"],"nullable":true},"labels":{"description":"Teks label risiko (daftar tidak memuat tingkat per label).","type":"array","items":{"type":"string"}},"createdAt":{"type":"object","description":"Waktu dibuat."}},"required":["id","object","status","image","vertical","riskLevel","labels","createdAt"]},"IntlImageCheckListResponseDto":{"type":"object","properties":{"object":{"type":"string","description":"Tipe objek, selalu list.","example":"list"},"page":{"type":"number","description":"Halaman saat ini.","example":1},"pageSize":{"type":"number","description":"Jumlah data per halaman.","example":20},"total":{"type":"number","description":"Total data yang cocok.","example":128},"hasMore":{"type":"boolean","description":"Apakah masih ada halaman berikutnya.","example":true},"data":{"description":"Data pada halaman ini.","type":"array","items":{"$ref":"#/components/schemas/IntlImageCheckListItemDto"}}},"required":["object","page","pageSize","total","hasMore","data"]},"CreateIntlVideoCheckDto":{"type":"object","properties":{"videoUrl":{"type":"string","description":"URL video, wajib dapat diakses publik. Bila Anda belum punya penyimpanan objek sendiri, panggil dulu endpoint kredensial unggah langsung.","example":"https://cdn.example.com/videos/promo-01.mp4"},"videoTitle":{"type":"string","description":"Judul / nama berkas video.","example":"promo-01.mp4"},"videoSize":{"type":"number","description":"Ukuran video dalam satuan **MB** (bukan byte). Maksimum 1024 (1GB).","example":12.4,"minimum":0.01,"maximum":1024},"videoDuration":{"type":"number","description":"Durasi video (detik). **Biaya dihitung dari nilai ini** (1 kredit/detik), mohon laporkan dengan jujur.","example":45,"minimum":1},"videoWidth":{"type":"number","description":"Lebar video (piksel).","example":1080},"videoHeight":{"type":"number","description":"Tinggi video (piksel).","example":1920},"platform":{"type":"string","description":"Platform penerbitan. Hanya menentukan kumpulan aturan platform untuk **naskah lisan**; bila tidak diisi, dipakai platform default situs ini.","enum":["tiktok_id","shopee_id","tokopedia"]},"vertical":{"type":"string","description":"Industri konten. Hanya menentukan kumpulan aturan industri untuk **naskah lisan**: menyebut industri spesifik = kumpulan umum + kumpulan industri tersebut; tidak diisi atau general = dilonggarkan ke seluruh kumpulan industri (lebih baik melapor berlebih). Penilaian gambar dan audio tidak terkait dengannya.","enum":["general","beauty","health","food","fashion"]}},"required":["videoUrl","videoTitle","videoSize","videoDuration"]},"IntlVideoCheckListItemDto":{"type":"object","properties":{"id":{"type":"string","description":"Id pengecekan."},"object":{"type":"string","description":"Tipe objek.","example":"intl_video_check"},"status":{"type":"string","description":"Status peninjauan video."},"video":{"type":"object","description":"URL, judul, dan durasi video."},"vertical":{"type":"object","description":"Deklarasi industri.","nullable":true},"riskLevel":{"type":"string","description":"Kesimpulan tingkat atas.","enum":["PASS","REVIEW","REJECT"],"nullable":true},"labels":{"description":"Label risiko.","type":"array","items":{"type":"string"}},"transcriptStatus":{"type":"object","description":"Status transkripsi lisan.","nullable":true},"createdAt":{"type":"object","description":"Waktu dibuat."}},"required":["id","object","status","video","vertical","riskLevel","labels","transcriptStatus","createdAt"]},"IntlVideoCheckListResponseDto":{"type":"object","properties":{"object":{"type":"string","description":"Tipe objek, selalu list.","example":"list"},"page":{"type":"number","description":"Halaman saat ini.","example":1},"pageSize":{"type":"number","description":"Jumlah data per halaman.","example":20},"total":{"type":"number","description":"Total data yang cocok.","example":128},"hasMore":{"type":"boolean","description":"Apakah masih ada halaman berikutnya.","example":true},"data":{"description":"Data pada halaman ini.","type":"array","items":{"$ref":"#/components/schemas/IntlVideoCheckListItemDto"}}},"required":["object","page","pageSize","total","hasMore","data"]},"IntlVideoFileDto":{"type":"object","properties":{"url":{"type":"string","description":"URL video."},"title":{"type":"string","description":"Judul / nama berkas video."},"sizeMb":{"type":"object","description":"Ukuran (MB).","nullable":true},"durationSeconds":{"type":"object","description":"Durasi (detik).","nullable":true},"width":{"type":"object","description":"Lebar (piksel).","nullable":true},"height":{"type":"object","description":"Tinggi (piksel).","nullable":true}},"required":["url","title","sizeMb","durationSeconds","width","height"]},"IntlVideoFrameDto":{"type":"object","properties":{"timeSeconds":{"type":"number","description":"Titik waktu kemunculan gambar yang cocok di dalam video (detik).","example":12},"riskLevel":{"type":"string","description":"Tingkat untuk gambar ini.","enum":["PASS","REVIEW","REJECT"],"nullable":true},"description":{"type":"string","description":"Keterangan kecocokan."},"imageUrl":{"type":"object","description":"URL cuplikan gambar yang cocok. **URL bertanda tangan berumur pendek dan akan kedaluwarsa** — simpan sendiri bila Anda perlu menyimpannya jangka panjang.","nullable":true},"ocrText":{"type":"object","description":"Tulisan yang dikenali di dalam gambar.","nullable":true}},"required":["timeSeconds","riskLevel","description","imageUrl","ocrText"]},"IntlVideoAudioDto":{"type":"object","properties":{"startSeconds":{"type":"number","description":"Titik awal potongan yang cocok (detik)."},"endSeconds":{"type":"number","description":"Titik akhir potongan yang cocok (detik)."},"riskLevel":{"type":"string","description":"Tingkat untuk potongan ini.","enum":["PASS","REVIEW","REJECT"],"nullable":true},"description":{"type":"string","description":"Keterangan kecocokan."},"text":{"type":"object","description":"Teks suara dari potongan yang cocok.","nullable":true}},"required":["startSeconds","endSeconds","riskLevel","description","text"]},"IntlTranscriptRiskDto":{"type":"object","properties":{"matchedText":{"type":"string","description":"Potongan naskah lisan asli yang cocok."},"severity":{"type":"string","description":"Tingkat keparahan.","enum":["high","medium","low"]},"category":{"type":"object","description":"Kategori risiko, sudah dilokalkan.","nullable":true},"suggestion":{"type":"object","description":"Saran perbaikan, sudah dilokalkan.","nullable":true},"legalRef":{"type":"object","description":"Rujukan pasal, tidak ikut diterjemahkan.","nullable":true},"replacement":{"type":"object","description":"Kalimat patuh yang bisa langsung menggantikan matchedText; kosong berarti hanya bisa dihapus.","nullable":true},"startSeconds":{"type":"number","description":"Titik awal kalimat tempat kecocokan berada (detik), bisa langsung dipakai untuk seek."},"endSeconds":{"type":"number","description":"Titik akhir kalimat tempat kecocokan berada (detik)."},"sentence":{"type":"object","description":"Kalimat utuh tempat kecocokan berada, sebagai konteks untuk Anda.","nullable":true},"source":{"type":"string","description":"Sumber penilaian.","enum":["rule","model","custom"]}},"required":["matchedText","severity","category","suggestion","legalRef","replacement","startSeconds","endSeconds","sentence","source"]},"IntlVideoCheckResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Id pengecekan."},"object":{"type":"string","description":"Tipe objek.","example":"intl_video_check"},"status":{"type":"string","description":"Status peninjauan video. ⚠️ **Ini bukan satu-satunya syarat berhenti polling** — perhatikan juga `transcriptStatus`, karena transkripsi lisan biasanya selesai lebih lambat daripada peninjauan gambar.","enum":["processing","completed","failed"]},"video":{"description":"Informasi video.","allOf":[{"$ref":"#/components/schemas/IntlVideoFileDto"}]},"platform":{"type":"string","description":"Platform yang dipakai untuk pengecekan naskah lisan.","enum":["tiktok_id","shopee_id","tokopedia"],"nullable":true},"vertical":{"type":"string","description":"Industri yang dipakai untuk pengecekan naskah lisan.","enum":["general","beauty","health","food","fashion"],"nullable":true},"riskLevel":{"type":"string","description":"Kesimpulan tingkat atas (gambar + audio).","enum":["PASS","REVIEW","REJECT"],"nullable":true},"labels":{"description":"Label risiko keseluruhan.","type":"array","items":{"type":"string"}},"frames":{"description":"Kecocokan pada gambar, dengan titik waktu per detik.","type":"array","items":{"$ref":"#/components/schemas/IntlVideoFrameDto"}},"audios":{"description":"Kecocokan pada audio, dengan titik awal dan akhir dalam detik.","type":"array","items":{"$ref":"#/components/schemas/IntlVideoAudioDto"}},"transcript":{"type":"object","description":"Transkripsi lengkap naskah lisan.","nullable":true},"transcriptStatus":{"type":"object","description":"Status transkripsi lisan: `null` tidak diaktifkan | `processing` sedang ditranskripsi | `completed` | `failed` | `empty` tanpa jalur audio. **Selama masih `processing`, risiko lisan belum lengkap — lanjutkan polling.**","nullable":true},"transcriptRisks":{"description":"Pelanggaran pada naskah lisan. Diproses oleh mesin yang sama dengan pengecekan teks, dan dihitung setara dengan gambar / audio dalam kesimpulan.","type":"array","items":{"$ref":"#/components/schemas/IntlTranscriptRiskDto"}},"createdAt":{"type":"object","description":"Waktu dibuat."},"updatedAt":{"type":"object","description":"Waktu pembaruan terakhir."}},"required":["id","object","status","video","platform","vertical","riskLevel","labels","frames","audios","transcript","transcriptStatus","transcriptRisks","createdAt","updatedAt"]},"IntlBatchImageDto":{"type":"object","properties":{"url":{"type":"string","description":"URL gambar, dapat diakses publik."},"name":{"type":"string","description":"Judul / nama berkas gambar."},"size":{"type":"number","description":"Ukuran gambar (byte).","example":254112},"width":{"type":"number","description":"Lebar (piksel)."},"height":{"type":"number","description":"Tinggi (piksel)."}},"required":["url","name","size"]},"IntlBatchVideoDto":{"type":"object","properties":{"url":{"type":"string","description":"URL video, dapat diakses publik."},"name":{"type":"string","description":"Judul / nama berkas video."},"size":{"type":"number","description":"Ukuran video dalam satuan **MB** (sama seperti pengecekan video tunggal, bukan byte).","example":12.4},"duration":{"type":"number","description":"Durasi video (detik), dasar perhitungan biaya.","example":45},"width":{"type":"number","description":"Lebar (piksel)."},"height":{"type":"number","description":"Tinggi (piksel)."}},"required":["url","name","size","duration"]},"CreateIntlBatchDto":{"type":"object","properties":{"name":{"type":"string","description":"Nama paket materi, 1–60 karakter.","example":"Kampanye Ramadan · batch 1"},"platform":{"type":"string","description":"Platform penerbitan, berlaku untuk seluruh paket.","enum":["tiktok_id","shopee_id","tokopedia"],"example":"tiktok_id"},"vertical":{"type":"string","description":"Industri konten, berlaku untuk seluruh paket.","enum":["general","beauty","health","food","fashion"],"example":"beauty"},"texts":{"description":"Sub-item teks, maksimum 10. **Teks yang kurang dari 10 karakter akan dibuang, bukan membuat seluruh paket gagal** — bila sepuluh teks dikirim sekaligus lalu semuanya ditolak gara-gara satu teks terlalu pendek, sementara pesan error tidak menyebut yang mana, itu bukan kontrak yang baik.","type":"array","items":{"type":"string"}},"images":{"description":"Sub-item gambar, maksimum 20.","type":"array","items":{"$ref":"#/components/schemas/IntlBatchImageDto"}},"videos":{"description":"Sub-item video, maksimum 10.","type":"array","items":{"$ref":"#/components/schemas/IntlBatchVideoDto"}},"explainLocale":{"type":"string","description":"Bahasa penjelasan risiko.","enum":["zh-CN","id-ID"],"default":"zh-CN"}},"required":["name","platform","vertical"]},"IntlBatchCountsDto":{"type":"object","properties":{"texts":{"type":"number","description":"Jumlah sub-item teks."},"images":{"type":"number","description":"Jumlah sub-item gambar."},"videos":{"type":"number","description":"Jumlah sub-item video."}},"required":["texts","images","videos"]},"IntlBatchProgressDto":{"type":"object","properties":{"total":{"type":"number","description":"Total sub-item.","example":12},"done":{"type":"number","description":"Jumlah sub-item yang selesai.","example":9},"percent":{"type":"number","description":"Persentase penyelesaian (0–100).","example":75}},"required":["total","done","percent"]},"IntlBatchItemSummaryDto":{"type":"object","properties":{"violation":{"type":"number","description":"Jumlah pelanggaran."},"sceneHint":{"type":"number","description":"Jumlah catatan skenario."}},"required":["violation","sceneHint"]},"IntlBatchListItemDto":{"type":"object","properties":{"id":{"type":"string","description":"Id paket materi."},"object":{"type":"string","description":"Tipe objek.","example":"intl_batch"},"name":{"type":"string","description":"Nama paket materi."},"status":{"type":"string","description":"Status paket."},"counts":{"description":"Jumlah sub-item per jenis.","allOf":[{"$ref":"#/components/schemas/IntlBatchCountsDto"}]},"progress":{"description":"Progres.","allOf":[{"$ref":"#/components/schemas/IntlBatchProgressDto"}]},"result":{"type":"object","description":"Kesimpulan paket.","nullable":true},"summary":{"description":"Hitungan seluruh paket.","allOf":[{"$ref":"#/components/schemas/IntlBatchItemSummaryDto"}]},"createdAt":{"type":"object","description":"Waktu dibuat."},"finishedAt":{"type":"object","description":"Waktu selesai.","nullable":true}},"required":["id","object","name","status","counts","progress","result","summary","createdAt","finishedAt"]},"IntlBatchListResponseDto":{"type":"object","properties":{"object":{"type":"string","description":"Tipe objek, selalu list.","example":"list"},"page":{"type":"number","description":"Halaman saat ini.","example":1},"pageSize":{"type":"number","description":"Jumlah data per halaman.","example":20},"total":{"type":"number","description":"Total data yang cocok.","example":128},"hasMore":{"type":"boolean","description":"Apakah masih ada halaman berikutnya.","example":true},"data":{"description":"Data pada halaman ini.","type":"array","items":{"$ref":"#/components/schemas/IntlBatchListItemDto"}}},"required":["object","page","pageSize","total","hasMore","data"]},"IntlBatchItemDto":{"type":"object","properties":{"id":{"type":"string","description":"Id sub-item (bukan id pengecekan)."},"kind":{"type":"string","description":"Jenis sub-item. Perhatikan nilainya `text`, bukan `script` yang dipakai secara internal — konsisten dengan jalur endpoint per item.","enum":["text","image","video"]},"checkId":{"type":"string","description":"**Id pengecekan per item** yang bersesuaian. Pakai untuk memanggil `/text|image|video/checks/{id}` guna mengambil detail lengkap."},"index":{"type":"number","description":"Indeks urutan sub-item saat dikirim.","example":0},"status":{"type":"string","description":"Status sub-item.","enum":["processing","completed","failed"]},"riskLevel":{"type":"object","description":"Kesimpulan sub-item. Untuk teks: safe/low/medium/high; untuk gambar dan video: PASS/REVIEW/REJECT.","nullable":true},"summary":{"description":"Hitungan sub-item.","allOf":[{"$ref":"#/components/schemas/IntlBatchItemSummaryDto"}]},"text":{"type":"string","description":"Sub-item teks: teks asli."},"riskCount":{"type":"number","description":"Sub-item teks: jumlah risiko."},"image":{"type":"object","description":"Sub-item gambar: URL dan judul."},"video":{"type":"object","description":"Sub-item video: URL, judul, dan durasi."},"labels":{"description":"Sub-item gambar / video: label risiko.","type":"array","items":{"type":"string"}},"transcriptStatus":{"type":"object","description":"Sub-item video: status transkripsi lisan.","nullable":true}},"required":["id","kind","checkId","index","status","riskLevel","summary"]},"IntlBatchResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Id paket materi."},"object":{"type":"string","description":"Tipe objek.","example":"intl_batch"},"name":{"type":"string","description":"Nama paket materi."},"platform":{"type":"string","description":"Platform penerbitan.","enum":["tiktok_id","shopee_id","tokopedia"]},"vertical":{"type":"string","description":"Industri konten.","enum":["general","beauty","health","food","fashion"]},"status":{"type":"string","description":"Status paket.","enum":["processing","completed","failed"]},"progress":{"description":"Progres.","allOf":[{"$ref":"#/components/schemas/IntlBatchProgressDto"}]},"result":{"type":"string","description":"Kesimpulan paket, baru terisi setelah seluruh sub-item selesai.","enum":["PASS","REJECT"],"nullable":true},"summary":{"description":"Hitungan seluruh paket.","allOf":[{"$ref":"#/components/schemas/IntlBatchItemSummaryDto"}]},"items":{"description":"Rincian sub-item.","type":"array","items":{"$ref":"#/components/schemas/IntlBatchItemDto"}},"createdAt":{"type":"object","description":"Waktu dibuat."},"finishedAt":{"type":"object","description":"Waktu selesai.","nullable":true}},"required":["id","object","name","platform","vertical","status","progress","result","summary","items","createdAt","finishedAt"]},"IntlCustomRuleResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Id aturan."},"object":{"type":"string","description":"Tipe objek.","example":"intl_custom_rule"},"keyword":{"type":"string","description":"Kata yang dicek.","example":"garansi uang kembali"},"matchType":{"type":"string","description":"Cara pencocokan.","enum":["keyword","phrase"]},"replacement":{"type":"object","description":"Kata pengganti; kosong berarti hanya mengingatkan.","nullable":true},"note":{"type":"object","description":"Catatan, hanya Anda yang bisa melihatnya.","nullable":true},"enabled":{"type":"boolean","description":"Apakah aktif."},"createdAt":{"type":"object","description":"Waktu dibuat."},"updatedAt":{"type":"object","description":"Waktu pembaruan terakhir."}},"required":["id","object","keyword","matchType","replacement","note","enabled","createdAt","updatedAt"]},"IntlCustomRuleListResponseDto":{"type":"object","properties":{"object":{"type":"string","description":"Tipe objek, selalu list.","example":"list"},"data":{"description":"Seluruh aturan di situs ini (jumlah kamus tidak besar, tanpa halaman).","type":"array","items":{"$ref":"#/components/schemas/IntlCustomRuleResponseDto"}},"total":{"type":"number","description":"Total aturan."}},"required":["object","data","total"]},"IntlCustomRuleQuotaDto":{"type":"object","properties":{"object":{"type":"string","description":"Tipe objek.","example":"intl_custom_rule_quota"},"used":{"type":"number","description":"Jumlah terpakai. **Kuota bersifat per akun dan dibagi lintas situs** — termasuk kata yang Anda daftarkan di situs lain.","example":12},"limit":{"type":"number","description":"Batas kamus pada paket Anda saat ini. Paket gratis bernilai 0.","example":500},"isPaid":{"type":"boolean","description":"Apakah langganan situs ini sedang berbayar.","example":true}},"required":["object","used","limit","isPaid"]},"IntlCustomRuleSettingsDto":{"type":"object","properties":{"object":{"type":"string","description":"Tipe objek.","example":"intl_custom_rule_settings"},"enabled":{"type":"boolean","description":"Sakelar utama tingkat akun. Saat dimatikan, seluruh kata kustom tidak ikut dalam pengecekan (data tetap tersimpan)."}},"required":["object","enabled"]},"IntlToggleSettingsDto":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Sakelar utama tingkat akun. Setelah dimatikan, seluruh kata kustom tidak ikut dalam pengecekan (data tetap tersimpan), ortogonal terhadap `enabled` tiap aturan. **Sakelar ini sendiri tidak dipisah per situs negara**: ia menjawab pertanyaan «apakah akun ini memakai kamus kata kustom»."}},"required":["enabled"]},"IntlBulkImportItemDto":{"type":"object","properties":{"keyword":{"type":"string","description":"Kata yang akan dicek.","maxLength":100},"replacement":{"type":"string","description":"Kata pengganti.","maxLength":100},"note":{"type":"string","description":"Catatan.","maxLength":200}},"required":["keyword"]},"IntlBulkImportDto":{"type":"object","properties":{"items":{"description":"Daftar kata yang akan diimpor, maksimum 2000 per panggilan. Duplikat dalam batch maupun kata yang sudah ada akan dilewati otomatis (dihitung terpisah dalam respons), tanpa menghasilkan error.","type":"array","items":{"$ref":"#/components/schemas/IntlBulkImportItemDto"}}},"required":["items"]},"IntlCustomRuleImportResultDto":{"type":"object","properties":{"object":{"type":"string","description":"Tipe objek.","example":"intl_custom_rule_import_result"},"total":{"type":"number","description":"Total kata yang dikirim kali ini."},"imported":{"type":"number","description":"Jumlah yang benar-benar ditulis."},"skippedDuplicate":{"type":"number","description":"Jumlah yang dilewati karena duplikat dalam batch atau sudah ada di kamus."},"rejectedQuota":{"type":"number","description":"Jumlah yang ditolak karena melebihi kuota paket."}},"required":["object","total","imported","skippedDuplicate","rejectedQuota"]},"CreateIntlCustomRuleDto":{"type":"object","properties":{"keyword":{"type":"string","description":"Kata yang akan dicek. Untuk situs Indonesia, isilah kata berbahasa Indonesia — yang dicek adalah teks berbahasa Indonesia, kata berbahasa Mandarin tidak akan pernah cocok.","example":"garansi uang kembali","maxLength":100},"matchType":{"type":"string","description":"Cara pencocokan: keyword = pencocokan sub-string (default, muncul di posisi mana pun tetap dihitung); phrase = pencocokan batas kata. **Untuk bahasa yang dipisah spasi seperti bahasa Indonesia, disarankan memakai phrase** — pencocokan sub-string membuat kata pendek salah mengenai kata yang lebih panjang.","enum":["keyword","phrase"],"default":"keyword"},"replacement":{"type":"string","description":"Kata pengganti. Setelah diisi, hasil kecocokan akan membawa `replacement` yang bisa dipakai untuk penggantian presisi sekali klik; bila dikosongkan, sistem hanya mengingatkan.","example":"kebijakan pengembalian berlaku","maxLength":100},"note":{"type":"string","description":"Catatan, hanya Anda yang bisa melihatnya.","maxLength":200},"enabled":{"type":"boolean","description":"Apakah aktif. Setelah dinonaktifkan, data tetap tersimpan tetapi tidak ikut dalam pengecekan.","default":true}},"required":["keyword"]},"UpdateIntlCustomRuleDto":{"type":"object","properties":{"keyword":{"type":"string","description":"Kata yang akan dicek.","maxLength":100},"replacement":{"type":"string","description":"Kata pengganti.","maxLength":100},"note":{"type":"string","description":"Catatan.","maxLength":200},"enabled":{"type":"boolean","description":"Apakah aktif."}}},"IntlAccountCreditsDto":{"type":"object","properties":{"total":{"type":"number","description":"Total kredit yang tersedia di situs ini.","example":8420},"subscription":{"type":"number","description":"Bagian dari bonus langganan."},"activity":{"type":"number","description":"Bagian dari bonus kegiatan."},"booster":{"type":"number","description":"Bagian dari paket tambahan kredit."},"expiringSoon":{"type":"object","description":"Bagian yang akan kedaluwarsa dalam 7 hari; null bila tidak ada.","nullable":true}},"required":["total","subscription","activity","booster","expiringSoon"]},"IntlAccountResponseDto":{"type":"object","properties":{"object":{"type":"string","description":"Tipe objek.","example":"intl_account"},"country":{"type":"string","description":"Situs tempat panggilan ini berlangsung.","example":"id"},"credits":{"description":"Saldo kredit **situs ini**. Kredit diisolasi per situs; saldo situs Mandarin tidak termasuk di sini.","allOf":[{"$ref":"#/components/schemas/IntlAccountCreditsDto"}]},"subscription":{"type":"object","description":"Tingkat langganan di situs ini."},"usageThisMonth":{"type":"object","description":"Jumlah tiap jenis pengecekan di situs ini bulan ini (bulan kalender), mencakup seluruh kanal web maupun API."}},"required":["object","country","credits","subscription","usageThisMonth"]},"CreateIntlUploadPolicyDto":{"type":"object","properties":{"kind":{"type":"string","description":"Jenis materi, menentukan batas ukuran: video maksimum 1GB, image maksimum 10MB.","enum":["video","image"]}},"required":["kind"]},"IntlUploadPolicyResponseDto":{"type":"object","properties":{"object":{"type":"string","description":"Tipe objek.","example":"intl_upload_policy"},"kind":{"type":"string","description":"Jenis materi.","enum":["video","image"]},"host":{"type":"string","description":"Alamat tujuan unggah langsung (form di-POST ke sini)."},"cdnHost":{"type":"string","description":"Domain akses materi setelah unggah berhasil; alamat materi = `{cdnHost}/{key}`."},"dir":{"type":"string","description":"Prefiks direktori yang boleh ditulisi. key wajib diawali dengannya, kalau tidak akan ditolak."},"policy":{"type":"string","description":"Kebijakan unggah (base64)."},"accessKeyId":{"type":"string","description":"AccessKeyId untuk unggah langsung."},"signature":{"type":"string","description":"Tanda tangan kebijakan."},"maxSizeBytes":{"type":"number","description":"Batas ukuran untuk jenis materi ini (byte)."},"expiresAt":{"type":"string","description":"Waktu kedaluwarsa kredensial (ISO 8601), hangus setelah 5 menit."}},"required":["object","kind","host","cdnHost","dir","policy","accessKeyId","signature","maxSizeBytes","expiresAt"]}}}}