Download OpenAPI specification:Download
Tarik data CRM, kirim pesan WhatsApp, dan terima webhook dengan token API Kareeb.
Referensi endpoint yang menerima token API Kareeb (awalan kt_). Endpoint layar operator tidak termasuk dan bisa berubah kapan saja; bangun integrasi hanya di atas jalur di halaman ini.
Semua permintaan memakai HTTPS ke https://kareeb.id, badan dan jawaban dalam JSON. Token dibuat oleh admin organisasi di Kareeb (menu Token API) dan hanya ditampilkan sekali. Setiap endpoint menyebut satu izin; token tanpa izin itu dijawab 403 yang menyebut nama izinnya.
Penolakan dengan kode mengirim detail berupa objek: bercabanglah pada code, bukan pada kalimat message. Kolom baru bisa ditambahkan kapan saja, jadi abaikan kolom yang belum Anda kenal.
Organisasi dan izin token yang dikirim di header, untuk diperiksa saat sistem Anda pertama kali tersambung. Hanya menerima token API; sesi operator ditolak dengan 403. Daftar scopes mengikuti urutan tetap daftar izin, apa pun urutan saat token dibuat. Token, hash, dan awalannya tidak pernah dikembalikan. Panggilan ini tercatat sebagai pemakaian token.
Izin: tidak perlu izin khusus, cukup token yang masih aktif.
| org_id required | integer Organisasi tempat token bertindak. |
| org_name required | string Nama organisasi. |
| token_id required | integer Id token. |
| scopes required | Array of strings Izin token, dalam urutan tetap daftar izin. |
| created_at required | string <date-time> Waktu token dibuat. |
{- "org_id": 1,
- "org_name": "Rumah Sakit Sentra",
- "token_id": 12,
- "scopes": [
- "write:messages",
- "read:templates"
], - "created_at": "2026-11-04T02:00:00+00:00"
}Template yang boleh disebut saat mengirim, dari salinan template Meta di Kareeb. Semua status ikut; hanya APPROVED yang bisa dikirim. Tidak berhalaman, paling banyak 500 baris. Template di akun WhatsApp yang tidak lagi dipakai organisasi, dan template di akun yang tidak dipakai cabang mana pun, tidak ditampilkan. Komponen template, id Meta, dan id akun WhatsApp tidak pernah ikut. Daftar ini sesegar sinkronisasi template terakhir; token tidak bisa memulai sinkronisasi, admin melakukannya dari menu Template. Jawaban dikirim dengan Cache-Control: no-store.
Izin: read:templates.
| Cache-Control | string Selalu no-store. Value: "no-store" |
required | Array of objects (Template) | ||||||||||||||||
Array
| |||||||||||||||||
{- "templates": [
- {
- "name": "pengingat_kontrol",
- "language": "id",
- "category": "UTILITY",
- "status": "APPROVED",
- "parameter_count": 3,
- "needs_cta": false,
- "workspace_id": 1,
- "synced_at": "2026-11-04T04:12:00+00:00"
}
]
}Membuat kampanye bertanda source=api di antrean yang sama dengan kampanye dari layar, sehingga muncul di halaman Kampanye lengkap dengan corongnya. Hanya WhatsApp. Penerima yang belum ada menjadi kontak baru. Pengiriman berangkat dari cabang Utama. Dengan scheduled_at, kampanye menunggu sampai waktu itu lalu dijalankan oleh penjadwal Kareeb. Kunci idempotency_key yang sama dijawab 200 dengan kampanye pertama dan tidak mengirim apa pun lagi. Permintaan yang ditolak 422 tidak membuat apa pun, sehingga kuncinya tetap bebas dipakai ulang.
Izin: send:broadcast.
| template_name required | string non-empty Harus ada di Kareeb, di akun WhatsApp cabang Utama, dan berstatus APPROVED. |
| template_language | string non-empty Default: "id" Kode bahasa template. |
required | Array of objects [ 1 .. 5000 ] items 1 sampai 5.000 penerima per permintaan. |
| idempotency_key required | string [ 1 .. 128 ] characters 1 sampai 128 karakter, unik di semua broadcast organisasi. |
| name | string or null <= 120 characters Nama di halaman Kampanye. Bawaan: "API: " diikuti nama template. |
| scheduled_at | string or null <date-time> Waktu kirim, wajib dengan zona waktu, paling jauh 30 hari ke depan. Kosongkan untuk langsung masuk antrean. |
| id | integer Id kampanye. |
| replay | boolean true bila kunci ini sudah pernah dipakai. |
| idempotency_key | string Kunci kampanye. |
| template_name | string Nama template. |
| template_language | string Kode bahasa template. |
| scheduled_at | string or null <date-time> Waktu kirim yang dijadwalkan, atau null. |
Array of objects Penerima yang diterima oleh permintaan ini. Kosong pada replay. | |
Array of objects Penerima yang ditolak beserta alasannya. Kiriman tetap berjalan untuk penerima lain. Kosong pada replay. | |
object Keadaan antrean saat ini, dibaca langsung. |
| id | integer Id kampanye. |
| replay | boolean true bila kunci ini sudah pernah dipakai. |
| idempotency_key | string Kunci kampanye. |
| template_name | string Nama template. |
| template_language | string Kode bahasa template. |
| scheduled_at | string or null <date-time> Waktu kirim yang dijadwalkan, atau null. |
Array of objects Penerima yang diterima oleh permintaan ini. Kosong pada replay. | |
Array of objects Penerima yang ditolak beserta alasannya. Kiriman tetap berjalan untuk penerima lain. Kosong pada replay. | |
object Keadaan antrean saat ini, dibaca langsung. |
{- "template_name": "pengingat_kontrol",
- "template_language": "id",
- "recipients": [
- {
- "wa_id": "6281234567890",
- "params": {
- "1": "Budi",
- "2": "Selasa 10.00"
}
}, - {
- "wa_id": "6281234567891",
- "params": {
- "1": "Sari",
- "2": "Rabu 09.00"
}
}
], - "idempotency_key": "kontrol-2026-11-05",
- "name": "Pengingat kontrol besok"
}{- "id": 0,
- "replay": true,
- "idempotency_key": "string",
- "template_name": "string",
- "template_language": "string",
- "scheduled_at": "2019-08-24T14:15:22Z",
- "accepted": [
- {
- "wa_id": "string",
- "contact_id": 0,
- "recipient_id": 0
}
], - "refused": [
- {
- "wa_id": "string",
- "reason": "string"
}
], - "status": {
- "state": "string",
- "targeted": 0,
- "queued": 0,
- "sent": 0,
- "failed": 0
}
}Satu teks (hanya di dalam jendela 24 jam) atau satu template yang sudah disetujui, ke satu pelanggan WhatsApp. Isi tepat satu dari to atau contact_id, dan tepat satu dari text atau template. Pemeriksaan berjalan berurutan: batas permintaan per token, kunci, cabang, tujuan, saluran, berhenti berlangganan, lalu jendela 24 jam untuk teks atau syarat template. Pesan tercatat tanpa nama pengirim, ditandai sebagai kiriman API, dan tidak mengambil alih percakapan dari Agen AI. Status kirim selanjutnya datang lewat webhook message.status.
Izin: write:messages.
| to | string or null Nomor WhatsApp tujuan, 7 sampai 20 digit format internasional. Tanda plus dan spasi di tepi dibuang. Nomor yang belum dikenal menjadi kontak WhatsApp baru di cabang itu. |
| contact_id | integer or null Kontak di cabang tempat panggilan ini berjalan. Isi to atau contact_id, salah satu saja. |
| text | string or null [ 1 .. 4096 ] characters Teks bebas, 1 sampai 4096 karakter, hanya di dalam jendela 24 jam. Isi text atau template, salah satu saja. |
object or null | |
| idempotency_key required | string [ 1 .. 128 ] characters 1 sampai 128 karakter, unik per organisasi. |
| workspace_id | integer or null Cabang pengirim, harus milik organisasi token. Bawaan: cabang Utama. |
| message_id | integer Id pesan di Kareeb. |
| conversation_id | integer Id percakapan. |
| wa_message_id | string or null Id pesan dari Meta. Status kirim di webhook message.status memakai id ini. |
| contact_id | integer Id kontak. |
| replay | boolean true bila kunci ini sudah pernah dikirim. |
| message_id | integer Id pesan di Kareeb. |
| conversation_id | integer Id percakapan. |
| wa_message_id | string or null Id pesan dari Meta. Status kirim di webhook message.status memakai id ini. |
| contact_id | integer Id kontak. |
| replay | boolean true bila kunci ini sudah pernah dikirim. |
{- "to": "6281234567890",
- "template": {
- "name": "pengingat_kontrol",
- "language": "id",
- "body_params": {
- "1": "Budi",
- "2": "Rumah Sakit Sentra",
- "3": "Selasa 10.00"
}
}, - "idempotency_key": "janji-88123-h1"
}{- "message_id": 0,
- "conversation_id": 0,
- "wa_message_id": "string",
- "contact_id": 0,
- "replay": true
}Kontak beserta status berhenti berlangganan dan persetujuan terbaru per tujuan. Token API membaca data cabang Utama organisasi Anda. Kontak bisa berubah (label, nama), jadi jalankan jalan penuh dari since_id=0 secara berkala. Kursor id hanya melihat baris baru, tidak melihat perubahan pada baris lama. Lihat panduan Tarik data untuk aturan jalan penuh.
Izin: read:contacts.
| since_id | integer >= 0 Default: 0 Kursor eksklusif: hanya baris dengan id lebih besar dari angka ini. Mulai dari 0. |
| limit | integer [ 1 .. 1000 ] Default: 200 Jumlah baris per halaman, 1 sampai 1000. |
required | Array of objects (Kontak) |
| count required | integer Jumlah baris di halaman ini. |
| next_since_id required | integer or null Id baris terakhir di halaman ini, untuk since_id berikutnya. Null pada halaman kosong. |
| has_more required | boolean Petunjuk saja: true bila halaman ini penuh. Tanda selesai yang pasti adalah items kosong. |
{- "items": [
- {
- "id": 0,
- "wa_id": "string",
- "channel": "wa",
- "phone": "string",
- "bsuid": "string",
- "username": "string",
- "name": "string",
- "tags": [
- "string"
], - "fields": {
- "property1": "string",
- "property2": "string"
}, - "created_at": "2019-08-24T14:15:22Z",
- "opted_out_at": "2019-08-24T14:15:22Z",
- "consent_reminders": "granted",
- "consent_reminders_at": "2019-08-24T14:15:22Z",
- "consent_marketing": "granted",
- "consent_marketing_at": "2019-08-24T14:15:22Z"
}
], - "count": 0,
- "next_since_id": 0,
- "has_more": true
}Percakapan per kontak dan saluran. Token API membaca data cabang Utama organisasi Anda. Status percakapan bisa berubah, jadi jalankan jalan penuh secara berkala. Kursor id hanya melihat baris baru, tidak melihat perubahan pada baris lama. Lihat panduan Tarik data untuk aturan jalan penuh.
Izin: read:conversations.
| since_id | integer >= 0 Default: 0 Kursor eksklusif: hanya baris dengan id lebih besar dari angka ini. Mulai dari 0. |
| limit | integer [ 1 .. 1000 ] Default: 200 Jumlah baris per halaman, 1 sampai 1000. |
required | Array of objects (Percakapan) |
| count required | integer Jumlah baris di halaman ini. |
| next_since_id required | integer or null Id baris terakhir di halaman ini, untuk since_id berikutnya. Null pada halaman kosong. |
| has_more required | boolean Petunjuk saja: true bila halaman ini penuh. Tanda selesai yang pasti adalah items kosong. |
{- "items": [
- {
- "id": 0,
- "contact_id": 0,
- "channel": "wa",
- "opened_at": "2019-08-24T14:15:22Z",
- "last_inbound_at": "2019-08-24T14:15:22Z",
- "last_activity_at": "2019-08-24T14:15:22Z",
- "status": "open",
- "handled_by": "bot",
- "assigned_to": 0,
- "unread_count": 0,
- "created_at": "2019-08-24T14:15:22Z"
}
], - "count": 0,
- "next_since_id": 0,
- "has_more": true
}Pesan masuk dan keluar beserta status kirim terbaiknya. Mencakup semua cabang organisasi. Isi mentah dari Meta tidak ikut. Tabel ini hanya bertambah, jadi jalan bertahap dengan since_id sudah cukup.
Izin: read:messages.
| since_id | integer >= 0 Default: 0 Kursor eksklusif: hanya baris dengan id lebih besar dari angka ini. Mulai dari 0. |
| limit | integer [ 1 .. 1000 ] Default: 200 Jumlah baris per halaman, 1 sampai 1000. |
required | Array of objects (Pesan) |
| count required | integer Jumlah baris di halaman ini. |
| next_since_id required | integer or null Id baris terakhir di halaman ini, untuk since_id berikutnya. Null pada halaman kosong. |
| has_more required | boolean Petunjuk saja: true bila halaman ini penuh. Tanda selesai yang pasti adalah items kosong. |
{- "items": [
- {
- "id": 0,
- "conversation_id": 0,
- "contact_id": 0,
- "direction": "in",
- "wa_message_id": "string",
- "msg_type": "string",
- "body": "string",
- "template_name": "string",
- "media_id": "string",
- "media_mime": "string",
- "sent_by": 0,
- "created_at": "2019-08-24T14:15:22Z",
- "media_dihapus_pada": "2019-08-24T14:15:22Z",
- "delivery_status": "sent",
- "failure_reason": "string",
- "jalur_kirim": "string"
}
], - "count": 0,
- "next_since_id": 0,
- "has_more": true
}Kampanye dari layar Kampanye dan dari POST /api/broadcasts. Token API membaca data cabang Utama organisasi Anda. Status kampanye berubah selama pengiriman, jadi jalankan jalan penuh secara berkala. Kursor id hanya melihat baris baru, tidak melihat perubahan pada baris lama. Lihat panduan Tarik data untuk aturan jalan penuh.
Izin: read:campaigns.
| since_id | integer >= 0 Default: 0 Kursor eksklusif: hanya baris dengan id lebih besar dari angka ini. Mulai dari 0. |
| limit | integer [ 1 .. 1000 ] Default: 200 Jumlah baris per halaman, 1 sampai 1000. |
required | Array of objects (Kampanye) |
| count required | integer Jumlah baris di halaman ini. |
| next_since_id required | integer or null Id baris terakhir di halaman ini, untuk since_id berikutnya. Null pada halaman kosong. |
| has_more required | boolean Petunjuk saja: true bila halaman ini penuh. Tanda selesai yang pasti adalah items kosong. |
{- "items": [
- {
- "id": 0,
- "name": "string",
- "template_name": "string",
- "template_language": "string",
- "segment_id": 0,
- "cta_target_url": "string",
- "ignore_duplicates": true,
- "source": "ui",
- "idempotency_key": "string",
- "state": "draft",
- "cost": 0,
- "variabel": [
- { }
], - "created_at": "2019-08-24T14:15:22Z",
- "started_at": "2019-08-24T14:15:22Z",
- "finished_at": "2019-08-24T14:15:22Z"
}
], - "count": 0,
- "next_since_id": 0,
- "has_more": true
}Satu baris per kampanye dengan angka corong yang sama dengan halaman Laporan. Angkanya berubah setiap kali penerima bereaksi, jadi endpoint ini selalu dibaca dengan jalan penuh dari since_id=0. Token API membaca data cabang Utama organisasi Anda.
Izin: read:campaigns.
| since_id | integer >= 0 Default: 0 Kursor eksklusif: hanya baris dengan id lebih besar dari angka ini. Mulai dari 0. |
| limit | integer [ 1 .. 1000 ] Default: 200 Jumlah baris per halaman, 1 sampai 1000. |
required | Array of objects (StatistikKampanye) |
| count required | integer Jumlah baris di halaman ini. |
| next_since_id required | integer or null Id baris terakhir di halaman ini, untuk since_id berikutnya. Null pada halaman kosong. |
| has_more required | boolean Petunjuk saja: true bila halaman ini penuh. Tanda selesai yang pasti adalah items kosong. |
{- "items": [
- {
- "id": 0,
- "name": "string",
- "state": "string",
- "source": "ui",
- "template_name": "string",
- "template_language": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "started_at": "2019-08-24T14:15:22Z",
- "finished_at": "2019-08-24T14:15:22Z",
- "targeted": 0,
- "sent": 0,
- "delivered": 0,
- "read": 0,
- "replied": 0,
- "clicked": 0,
- "converted": 0,
- "converted_amount": 0,
- "failed": 0,
- "cost": 0,
- "roi": 0
}
], - "count": 0,
- "next_since_id": 0,
- "has_more": true
}Corong per penerima: terkirim, sampai, dibaca, dibalas, diklik, menghasilkan pesanan. Kursornya sendiri, terpisah dari daftar kampanye. Token API membaca data cabang Utama organisasi Anda.
Izin: read:campaigns.
| since_id | integer >= 0 Default: 0 Kursor eksklusif: hanya baris dengan id lebih besar dari angka ini. Mulai dari 0. |
| limit | integer [ 1 .. 1000 ] Default: 200 Jumlah baris per halaman, 1 sampai 1000. |
| campaign_id | integer >= 1 Batasi ke satu kampanye, misalnya id dari jawaban POST /api/broadcasts. |
required | Array of objects (PenerimaKampanye) |
| count required | integer Jumlah baris di halaman ini. |
| next_since_id required | integer or null Id baris terakhir di halaman ini, untuk since_id berikutnya. Null pada halaman kosong. |
| has_more required | boolean Petunjuk saja: true bila halaman ini penuh. Tanda selesai yang pasti adalah items kosong. |
{- "items": [
- {
- "id": 0,
- "campaign_id": 0,
- "contact_id": 0,
- "send_state": "queued",
- "error": "string",
- "sent_at": "2019-08-24T14:15:22Z",
- "slug": "string",
- "wa_message_id": "string",
- "delivery_status": "sent",
- "failure_reason": "string",
- "clicked": true,
- "replied": true,
- "converted_order_id": 0,
- "converted_amount": 0,
- "converted_at": "2019-08-24T14:15:22Z",
- "converted_source": "string"
}
], - "count": 0,
- "next_since_id": 0,
- "has_more": true
}Pesanan yang dibuat di percakapan. Tautan pembayaran tidak ikut. Token API membaca data cabang Utama organisasi Anda. Status pesanan berubah (misalnya menjadi paid), jadi jalankan jalan penuh secara berkala. Kursor id hanya melihat baris baru, tidak melihat perubahan pada baris lama. Lihat panduan Tarik data untuk aturan jalan penuh.
Izin: read:orders.
| since_id | integer >= 0 Default: 0 Kursor eksklusif: hanya baris dengan id lebih besar dari angka ini. Mulai dari 0. |
| limit | integer [ 1 .. 1000 ] Default: 200 Jumlah baris per halaman, 1 sampai 1000. |
required | Array of objects (Pesanan) |
| count required | integer Jumlah baris di halaman ini. |
| next_since_id required | integer or null Id baris terakhir di halaman ini, untuk since_id berikutnya. Null pada halaman kosong. |
| has_more required | boolean Petunjuk saja: true bila halaman ini penuh. Tanda selesai yang pasti adalah items kosong. |
{- "items": [
- {
- "id": 0,
- "conversation_id": 0,
- "contact_id": 0,
- "items": [
- {
- "name": "string",
- "qty": 0,
- "price": 0
}
], - "amount": 0,
- "currency": "string",
- "status": "draft",
- "provider": "string",
- "external_id": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "paid_at": "2019-08-24T14:15:22Z"
}
], - "count": 0,
- "next_since_id": 0,
- "has_more": true
}Komentar masuk di unggahan Instagram dan Halaman Facebook milik organisasi. Amplopnya sendiri: next_since_id berisi id terakhir hanya bila halaman penuh, dan null bila halaman tidak penuh atau kosong. Berhenti saat null, lalu simpan id terbesar yang Anda terima sebagai since_id berikutnya. Saluran yang sakelar komentar sebagai lead-nya mati tidak mengekspor apa pun, termasuk komentar yang tersimpan saat sakelar masih menyala. Token API membaca data cabang Utama organisasi Anda.
Izin: read:comments.
| since_id | integer >= 0 Default: 0 Kursor eksklusif: hanya baris dengan id lebih besar dari angka ini. Mulai dari 0. |
| limit | integer [ 1 .. 500 ] Default: 200 Jumlah baris per halaman, 1 sampai 500. |
required | Array of objects (Komentar) |
| next_since_id required | integer or null Id terakhir bila halaman penuh; null bila tidak penuh atau kosong. |
{- "komentar": [
- {
- "id": 0,
- "channel": "ig",
- "post_id": "string",
- "comment_id": "string",
- "thread_id": 0,
- "body": "string",
- "author_name": "string",
- "commented_at": "2019-08-24T14:15:22Z",
- "replied": true
}
], - "next_since_id": 0
}Satu kontak menurut id, tanpa kursor dan tanpa halaman. Berguna untuk mencocokkan satu baris tanpa menelusuri seluruh daftar. Kolom persetujuan tidak ada di sini; bacalah dari GET /api/export/contacts. Token API membaca data cabang Utama organisasi Anda.
Izin: read:contacts.
| contact_id required | integer Id kontak, sama dengan id di GET /api/export/contacts. |
| id | integer Id kontak. |
| wa_id | string Sama dengan di daftar kontak. |
| channel | string Enum: "wa" "ig" "messenger" Saluran kontak. |
| phone | string or null Nomor telepon, bila ada. |
| bsuid | string or null Id pengguna khusus bisnis dari Meta. |
| username | string or null Nama pengguna WhatsApp, bila ada. |
| name | string or null Nama kontak. |
object Data tambahan kontak. Tidak pernah null. | |
| tags | Array of strings Label kontak. Tidak pernah null. |
| auto_tags | Array of strings Bagian dari tags yang diusulkan pelabel otomatis dan belum dibatalkan operator. Tidak pernah null. |
| opted_out_at | string or null <date-time> Terisi berarti pelanggan meminta berhenti dikirimi pesan. |
| blocked_at | string or null <date-time> Terisi bila WhatsApp melaporkan nomor ini tidak bisa menerima pesan dari bisnis Anda. |
object or null Iklan pertama yang membawa kontak ini, bila ada. Null berarti tidak pernah datang dari iklan. | |
| created_at | string <date-time> Waktu kontak tercatat. |
{- "id": 0,
- "wa_id": "string",
- "channel": "wa",
- "phone": "string",
- "bsuid": "string",
- "username": "string",
- "name": "string",
- "fields": {
- "property1": "string",
- "property2": "string"
}, - "tags": [
- "string"
], - "auto_tags": [
- "string"
], - "opted_out_at": "2019-08-24T14:15:22Z",
- "blocked_at": "2019-08-24T14:15:22Z",
- "asal_iklan": {
- "headline": "string",
- "source_type": "string",
- "source_url": "string"
}, - "created_at": "2019-08-24T14:15:22Z"
}Sistem pemantauan Anda mengirim satu sebutan publik tentang merek (komentar YouTube, unggahan Threads, ulasan Google). Sebutan muncul di halaman Pemantauan cabang Utama, tempat agen CS menanganinya. Ini bukan percakapan, bukan kontak, dan tidak bisa dipakai untuk broadcast. Kunci idempotensinya adalah pasangan sumber dan external_id: kiriman ulang dijawab 200 tanpa menimpa apa pun. Hanya menerima token API; sesi operator ditolak dengan 403. Badan paling besar 16 KB.
Izin: write:pemantauan.
| sumber required | string Enum: "youtube" "threads" "google_reviews" "lainnya" Asal sebutan. instagram dan facebook ditolak karena komentar di unggahan sendiri sudah masuk lewat Meta. |
| external_id required | string [ 1 .. 200 ] characters Id di platform, 1 sampai 200 karakter. Bersama sumber menjadi kunci idempotensi. |
| referensi required | string [ 1 .. 100 ] characters Id sebutan di sistem Anda, 1 sampai 100 karakter. Dikembalikan di webhook pemantauan.status_changed. |
| url required | string <= 2000 characters Diawali https:// atau http://, paling panjang 2000 karakter. Kareeb tidak membukanya; halaman menampilkannya sebagai tautan. |
| teks required | string [ 1 .. 4000 ] characters 1 sampai 4000 karakter. |
| penulis | string or null <= 120 characters Nama tampilan, paling panjang 120 karakter. |
| penulis_ref | string or null <= 64 characters Nilai pengelompokan dari sistem Anda, paling panjang 64 karakter. Tidak ditampilkan. |
| diterbitkan_pada | string or null <date-time> ISO 8601 dengan zona waktu. Lebih dari 5 menit di masa depan ditolak. |
| sentimen | string or null Enum: "positif" "netral" "negatif" "perlu ditinjau" null Label sentimen. Kosong atau null berarti tanpa label. |
| topik | string or null <= 60 characters Paling panjang 60 karakter. |
| kedaluwarsa_pada | string or null <date-time> Kapan teks harus dihapus. Dibatasi oleh masa simpan Pemantauan di Kareeb; kosong berarti batas itu. |
| id | integer Id sebutan di Kareeb. |
| status | string Enum: "baru" "ditangani" "dibalas" "diabaikan" Status saat ini. |
| replay | boolean true bila pasangan sumber dan external_id sudah ada. |
| url_crm | string Jalur halaman Pemantauan untuk sebutan ini. |
| id | integer Id sebutan di Kareeb. |
| status | string Enum: "baru" "ditangani" "dibalas" "diabaikan" Status saat ini. |
| replay | boolean true bila pasangan sumber dan external_id sudah ada. |
| url_crm | string Jalur halaman Pemantauan untuk sebutan ini. |
{- "sumber": "youtube",
- "external_id": "Ugx-contoh-komentar",
- "referensi": "sebutan-4821",
- "teks": "Pengirimannya lama sekali.",
- "penulis": "Pemirsa Contoh",
- "penulis_ref": "a1b2c3",
- "diterbitkan_pada": "2026-10-24T09:00:00+07:00",
- "sentimen": "negatif",
- "topik": "pengiriman",
- "kedaluwarsa_pada": "2026-11-23T09:00:00+07:00"
}{- "id": 0,
- "status": "baru",
- "replay": true,
- "url_crm": "string"
}Menghapus teks, penulis, penulis_ref, dan url satu sebutan; barisnya, id, dan statusnya tetap. Pakai saat platform menghapus komentar itu atau masa simpan sistem Anda habis. Aman diulang: sebutan yang tidak dikenal dijawab 200 dengan ditemukan false. Tetap berjalan untuk organisasi yang dinonaktifkan atau berstatus baca saja, karena penghapusan adalah kewajiban. Penghitung permintaan dipakai bersama dengan /api/pemantauan/masuk.
Izin: write:pemantauan.
| sumber required | string Enum: "youtube" "threads" "google_reviews" "lainnya" Sama dengan saat dikirim. |
| external_id required | string [ 1 .. 200 ] characters Sama dengan saat dikirim. |
| ditemukan | boolean Sebutan ada. |
| dihapus | boolean Isinya dihapus oleh permintaan ini. false bila sudah terhapus sebelumnya atau tidak ditemukan. |
| id | integer or null Id sebutan, atau null bila tidak ditemukan. |
{- "sumber": "youtube",
- "external_id": "Ugx-contoh-komentar"
}{- "ditemukan": true,
- "dihapus": true,
- "id": 7
}Backend aplikasi Anda meminta token berumur pendek, lalu aplikasi membuka panggilan langsung ke mesin suara dengan token itu. Kunci API mesin suara tetap di Kareeb. Berikan user_id apa adanya sebagai userId di SDK browser mesin suara, karena dari situlah transkrip panggilan menemukan cabang dan sesi ini. Minta token tepat sebelum setiap panggilan. Jangan menaruh nama, nomor rekam medis, atau nomor telepon di session_ref. Selesainya panggilan dikabarkan lewat webhook call.finished.
Izin: write:suara.
| session_ref required | string [ 1 .. 120 ] characters Id sesi buram dari sistem Anda, 1 sampai 120 karakter yang dapat dicetak. |
| workspace_id | integer or null Cabang, harus milik organisasi token. Bawaan: cabang Utama. |
| token | string Token untuk SDK browser mesin suara. |
| agent_id | string Agen suara yang menjawab. |
| conversation_id | string or null Id dari mesin suara, bila ada. |
| user_id | string Berikan apa adanya sebagai userId di SDK. |
| expires_at | null Selalu null karena mesin suara tidak menyebut umur token. Minta token baru tepat sebelum setiap panggilan. |
{- "session_ref": "sesi-7f3a9c",
- "workspace_id": 4
}{- "token": "...",
- "agent_id": "...",
- "conversation_id": "...",
- "user_id": "4:sesi-7f3a9c",
- "expires_at": null
}Semua webhook memakai amplop yang sama: id, timestamp, event, data. Kareeb menandatangani byte badan persis seperti dikirim; hitung HMAC-SHA256 dari byte mentah itu dengan secret webhook (hex huruf kecil) lalu bandingkan dengan X-Kareeb-Signature memakai perbandingan waktu tetap. Jawab 2xx dalam 10 detik. Kiriman yang gagal dicoba lagi pada putaran penjadwal berikutnya, sekitar tiap 5 menit, paling banyak 5 kali. Setelah 10 kegagalan berturut-turut, langganan dinonaktifkan dan admin perlu mengaktifkannya lagi. Pengiriman bersifat at least once: buang duplikat dengan id di badan, yang sama untuk satu kejadian di semua endpoint dan semua percobaan.
Kartu baru muncul di Pipeline, dari percakapan atau dibuat operator. data berisi baris lead.
Semua webhook memakai amplop yang sama: id, timestamp, event, data. Kareeb menandatangani byte badan persis seperti dikirim; hitung HMAC-SHA256 dari byte mentah itu dengan secret webhook (hex huruf kecil) lalu bandingkan dengan X-Kareeb-Signature memakai perbandingan waktu tetap. Jawab 2xx dalam 10 detik. Kiriman yang gagal dicoba lagi pada putaran penjadwal berikutnya, sekitar tiap 5 menit, paling banyak 5 kali. Setelah 10 kegagalan berturut-turut, langganan dinonaktifkan dan admin perlu mengaktifkannya lagi. Pengiriman bersifat at least once: buang duplikat dengan id di badan, yang sama untuk satu kejadian di semua endpoint dan semua percobaan.
| X-Kareeb-Signature required | string HMAC-SHA256 dari byte badan mentah dengan secret webhook, hex huruf kecil, tanpa awalan sha256=. |
| X-Kareeb-Event required | string Nama peristiwa, sama dengan event di badan. |
| X-Kareeb-Delivery required | string Id kiriman ke endpoint Anda. Sama pada setiap percobaan ulang kiriman yang sama, berbeda untuk setiap endpoint. |
| id required | string <uuid> Id kejadian (UUID). Sama di semua percobaan ulang; pakai untuk membuang duplikat. |
| timestamp required | string <date-time> Waktu kejadian diantrekan. |
| event required | string Nama peristiwa. Value: "lead.created" |
required | object |
{- "id": "0b6f2c1e-6d0a-4f7b-9a51-3c2d8e4f1a20",
- "timestamp": "2026-11-04T03:15:02+00:00",
- "event": "lead.created",
- "data": {
- "id": 31,
- "contact_id": 88,
- "conversation_id": 412,
- "stage": "incoming",
- "value_idr": null,
- "note": null,
- "created_at": "2026-11-04T03:00:00+00:00",
- "updated_at": "2026-11-04T03:00:00+00:00"
}
}Kartu dipindah ke tahap lain. data berisi baris lead beserta from_stage. Hanya dikirim bila tahapnya benar berubah.
Semua webhook memakai amplop yang sama: id, timestamp, event, data. Kareeb menandatangani byte badan persis seperti dikirim; hitung HMAC-SHA256 dari byte mentah itu dengan secret webhook (hex huruf kecil) lalu bandingkan dengan X-Kareeb-Signature memakai perbandingan waktu tetap. Jawab 2xx dalam 10 detik. Kiriman yang gagal dicoba lagi pada putaran penjadwal berikutnya, sekitar tiap 5 menit, paling banyak 5 kali. Setelah 10 kegagalan berturut-turut, langganan dinonaktifkan dan admin perlu mengaktifkannya lagi. Pengiriman bersifat at least once: buang duplikat dengan id di badan, yang sama untuk satu kejadian di semua endpoint dan semua percobaan.
| X-Kareeb-Signature required | string HMAC-SHA256 dari byte badan mentah dengan secret webhook, hex huruf kecil, tanpa awalan sha256=. |
| X-Kareeb-Event required | string Nama peristiwa, sama dengan event di badan. |
| X-Kareeb-Delivery required | string Id kiriman ke endpoint Anda. Sama pada setiap percobaan ulang kiriman yang sama, berbeda untuk setiap endpoint. |
| id required | string <uuid> Id kejadian (UUID). Sama di semua percobaan ulang; pakai untuk membuang duplikat. |
| timestamp required | string <date-time> Waktu kejadian diantrekan. |
| event required | string Nama peristiwa. Value: "lead.stage_changed" |
required | object |
{- "id": "0b6f2c1e-6d0a-4f7b-9a51-3c2d8e4f1a20",
- "timestamp": "2026-11-04T03:15:02+00:00",
- "event": "lead.stage_changed",
- "data": {
- "id": 31,
- "contact_id": 88,
- "conversation_id": 412,
- "stage": "qualified",
- "value_idr": 1500000,
- "note": null,
- "created_at": "2026-11-04T03:00:00+00:00",
- "updated_at": "2026-11-04T05:10:00+00:00",
- "from_stage": "incoming"
}
}Pelanggan mengirim pesan. data memakai nama kolom yang sama dengan GET /api/export/messages, ditambah wa_id, contact_name, dan channel kontak. Webhook ini memuat isi pesan dan nomor pelanggan.
Semua webhook memakai amplop yang sama: id, timestamp, event, data. Kareeb menandatangani byte badan persis seperti dikirim; hitung HMAC-SHA256 dari byte mentah itu dengan secret webhook (hex huruf kecil) lalu bandingkan dengan X-Kareeb-Signature memakai perbandingan waktu tetap. Jawab 2xx dalam 10 detik. Kiriman yang gagal dicoba lagi pada putaran penjadwal berikutnya, sekitar tiap 5 menit, paling banyak 5 kali. Setelah 10 kegagalan berturut-turut, langganan dinonaktifkan dan admin perlu mengaktifkannya lagi. Pengiriman bersifat at least once: buang duplikat dengan id di badan, yang sama untuk satu kejadian di semua endpoint dan semua percobaan.
| X-Kareeb-Signature required | string HMAC-SHA256 dari byte badan mentah dengan secret webhook, hex huruf kecil, tanpa awalan sha256=. |
| X-Kareeb-Event required | string Nama peristiwa, sama dengan event di badan. |
| X-Kareeb-Delivery required | string Id kiriman ke endpoint Anda. Sama pada setiap percobaan ulang kiriman yang sama, berbeda untuk setiap endpoint. |
| id required | string <uuid> Id kejadian (UUID). Sama di semua percobaan ulang; pakai untuk membuang duplikat. |
| timestamp required | string <date-time> Waktu kejadian diantrekan. |
| event required | string Nama peristiwa. Value: "message.inbound" |
required | object |
{- "id": "0b6f2c1e-6d0a-4f7b-9a51-3c2d8e4f1a20",
- "timestamp": "2026-11-04T03:15:02+00:00",
- "event": "message.inbound",
- "data": {
- "id": 9140,
- "conversation_id": 412,
- "contact_id": 88,
- "direction": "in",
- "wa_message_id": "wamid.HBgN...",
- "msg_type": "text",
- "body": "Baik, saya datang hari Selasa.",
- "media_id": null,
- "media_mime": null,
- "created_at": "2026-11-04T03:20:00+00:00",
- "wa_id": "6281234567890",
- "contact_name": "Budi",
- "channel": "wa"
}
}Antrean kampanye habis. data berisi baris kampanye yang dibaca ulang setelah selesai, sehingga state sudah done.
Semua webhook memakai amplop yang sama: id, timestamp, event, data. Kareeb menandatangani byte badan persis seperti dikirim; hitung HMAC-SHA256 dari byte mentah itu dengan secret webhook (hex huruf kecil) lalu bandingkan dengan X-Kareeb-Signature memakai perbandingan waktu tetap. Jawab 2xx dalam 10 detik. Kiriman yang gagal dicoba lagi pada putaran penjadwal berikutnya, sekitar tiap 5 menit, paling banyak 5 kali. Setelah 10 kegagalan berturut-turut, langganan dinonaktifkan dan admin perlu mengaktifkannya lagi. Pengiriman bersifat at least once: buang duplikat dengan id di badan, yang sama untuk satu kejadian di semua endpoint dan semua percobaan.
| X-Kareeb-Signature required | string HMAC-SHA256 dari byte badan mentah dengan secret webhook, hex huruf kecil, tanpa awalan sha256=. |
| X-Kareeb-Event required | string Nama peristiwa, sama dengan event di badan. |
| X-Kareeb-Delivery required | string Id kiriman ke endpoint Anda. Sama pada setiap percobaan ulang kiriman yang sama, berbeda untuk setiap endpoint. |
| id required | string <uuid> Id kejadian (UUID). Sama di semua percobaan ulang; pakai untuk membuang duplikat. |
| timestamp required | string <date-time> Waktu kejadian diantrekan. |
| event required | string Nama peristiwa. Value: "campaign.finished" |
required | object |
{- "id": "0b6f2c1e-6d0a-4f7b-9a51-3c2d8e4f1a20",
- "timestamp": "2026-11-04T03:15:02+00:00",
- "event": "campaign.finished",
- "data": {
- "id": 42,
- "name": "Pengingat kontrol besok",
- "template_name": "pengingat_kontrol",
- "template_language": "id",
- "segment_id": null,
- "cta_target_url": null,
- "ignore_duplicates": false,
- "state": "done",
- "pause_reason": null,
- "source": "api",
- "cost": null,
- "scheduled_at": null,
- "variabel": [ ],
- "jeda_otomatis": null,
- "lanjut_pada": null,
- "created_at": "2026-11-04T01:00:00+00:00",
- "started_at": "2026-11-04T01:00:02+00:00",
- "finished_at": "2026-11-04T01:04:40+00:00"
}
}Percakapan ditutup, dibuka lagi, atau dikembalikan ke antrean. Hanya id dan status, tanpa isi pesan. Hanya dikirim bila statusnya benar berubah.
Semua webhook memakai amplop yang sama: id, timestamp, event, data. Kareeb menandatangani byte badan persis seperti dikirim; hitung HMAC-SHA256 dari byte mentah itu dengan secret webhook (hex huruf kecil) lalu bandingkan dengan X-Kareeb-Signature memakai perbandingan waktu tetap. Jawab 2xx dalam 10 detik. Kiriman yang gagal dicoba lagi pada putaran penjadwal berikutnya, sekitar tiap 5 menit, paling banyak 5 kali. Setelah 10 kegagalan berturut-turut, langganan dinonaktifkan dan admin perlu mengaktifkannya lagi. Pengiriman bersifat at least once: buang duplikat dengan id di badan, yang sama untuk satu kejadian di semua endpoint dan semua percobaan.
| X-Kareeb-Signature required | string HMAC-SHA256 dari byte badan mentah dengan secret webhook, hex huruf kecil, tanpa awalan sha256=. |
| X-Kareeb-Event required | string Nama peristiwa, sama dengan event di badan. |
| X-Kareeb-Delivery required | string Id kiriman ke endpoint Anda. Sama pada setiap percobaan ulang kiriman yang sama, berbeda untuk setiap endpoint. |
| id required | string <uuid> Id kejadian (UUID). Sama di semua percobaan ulang; pakai untuk membuang duplikat. |
| timestamp required | string <date-time> Waktu kejadian diantrekan. |
| event required | string Nama peristiwa. Value: "conversation.status_changed" |
required | object |
{- "id": "0b6f2c1e-6d0a-4f7b-9a51-3c2d8e4f1a20",
- "timestamp": "2026-11-04T03:15:02+00:00",
- "event": "conversation.status_changed",
- "data": {
- "conversation_id": 412,
- "from_status": "open",
- "status": "closed"
}
}Operator mengubah status sebutan yang dikirim lewat POST /api/pemantauan/masuk. Hanya id dan status, tanpa teks, penulis, atau nama operator. dibalas adalah keterangan operator; Kareeb tidak bisa memeriksa balasan di platform lain.
Semua webhook memakai amplop yang sama: id, timestamp, event, data. Kareeb menandatangani byte badan persis seperti dikirim; hitung HMAC-SHA256 dari byte mentah itu dengan secret webhook (hex huruf kecil) lalu bandingkan dengan X-Kareeb-Signature memakai perbandingan waktu tetap. Jawab 2xx dalam 10 detik. Kiriman yang gagal dicoba lagi pada putaran penjadwal berikutnya, sekitar tiap 5 menit, paling banyak 5 kali. Setelah 10 kegagalan berturut-turut, langganan dinonaktifkan dan admin perlu mengaktifkannya lagi. Pengiriman bersifat at least once: buang duplikat dengan id di badan, yang sama untuk satu kejadian di semua endpoint dan semua percobaan.
| X-Kareeb-Signature required | string HMAC-SHA256 dari byte badan mentah dengan secret webhook, hex huruf kecil, tanpa awalan sha256=. |
| X-Kareeb-Event required | string Nama peristiwa, sama dengan event di badan. |
| X-Kareeb-Delivery required | string Id kiriman ke endpoint Anda. Sama pada setiap percobaan ulang kiriman yang sama, berbeda untuk setiap endpoint. |
| id required | string <uuid> Id kejadian (UUID). Sama di semua percobaan ulang; pakai untuk membuang duplikat. |
| timestamp required | string <date-time> Waktu kejadian diantrekan. |
| event required | string Nama peristiwa. Value: "pemantauan.status_changed" |
required | object |
{- "id": "0b6f2c1e-6d0a-4f7b-9a51-3c2d8e4f1a20",
- "timestamp": "2026-11-04T03:15:02+00:00",
- "event": "pemantauan.status_changed",
- "data": {
- "pemantauan_id": 7,
- "referensi": "sebutan-4821",
- "sumber": "youtube",
- "external_id": "Ugx-contoh-komentar",
- "from_status": "baru",
- "status": "ditangani",
- "at": "2026-11-04T04:00:00+00:00"
}
}Meta melaporkan sent, delivered, read, atau failed untuk pesan yang dikirim Kareeb, dari API, broadcast, maupun kotak masuk. Hanya id dan status, tanpa teks atau nomor telepon. Status yang diulang Meta diantrekan lagi, jadi buang duplikat dengan pasangan wa_message_id dan status.
Semua webhook memakai amplop yang sama: id, timestamp, event, data. Kareeb menandatangani byte badan persis seperti dikirim; hitung HMAC-SHA256 dari byte mentah itu dengan secret webhook (hex huruf kecil) lalu bandingkan dengan X-Kareeb-Signature memakai perbandingan waktu tetap. Jawab 2xx dalam 10 detik. Kiriman yang gagal dicoba lagi pada putaran penjadwal berikutnya, sekitar tiap 5 menit, paling banyak 5 kali. Setelah 10 kegagalan berturut-turut, langganan dinonaktifkan dan admin perlu mengaktifkannya lagi. Pengiriman bersifat at least once: buang duplikat dengan id di badan, yang sama untuk satu kejadian di semua endpoint dan semua percobaan.
| X-Kareeb-Signature required | string HMAC-SHA256 dari byte badan mentah dengan secret webhook, hex huruf kecil, tanpa awalan sha256=. |
| X-Kareeb-Event required | string Nama peristiwa, sama dengan event di badan. |
| X-Kareeb-Delivery required | string Id kiriman ke endpoint Anda. Sama pada setiap percobaan ulang kiriman yang sama, berbeda untuk setiap endpoint. |
| id required | string <uuid> Id kejadian (UUID). Sama di semua percobaan ulang; pakai untuk membuang duplikat. |
| timestamp required | string <date-time> Waktu kejadian diantrekan. |
| event required | string Nama peristiwa. Value: "message.status" |
required | object |
{- "id": "0b6f2c1e-6d0a-4f7b-9a51-3c2d8e4f1a20",
- "timestamp": "2026-11-04T03:15:02+00:00",
- "event": "message.status",
- "data": {
- "message_id": 9137,
- "conversation_id": 412,
- "wa_message_id": "wamid.HBgM...",
- "status": "failed",
- "occurred_at": "2026-11-04T03:15:00+00:00",
- "failure_reason": "Message undeliverable"
}
}Panggilan Agen AI suara di aplikasi Anda berakhir. Tanpa transkrip dan tanpa ringkasan.
Semua webhook memakai amplop yang sama: id, timestamp, event, data. Kareeb menandatangani byte badan persis seperti dikirim; hitung HMAC-SHA256 dari byte mentah itu dengan secret webhook (hex huruf kecil) lalu bandingkan dengan X-Kareeb-Signature memakai perbandingan waktu tetap. Jawab 2xx dalam 10 detik. Kiriman yang gagal dicoba lagi pada putaran penjadwal berikutnya, sekitar tiap 5 menit, paling banyak 5 kali. Setelah 10 kegagalan berturut-turut, langganan dinonaktifkan dan admin perlu mengaktifkannya lagi. Pengiriman bersifat at least once: buang duplikat dengan id di badan, yang sama untuk satu kejadian di semua endpoint dan semua percobaan.
| X-Kareeb-Signature required | string HMAC-SHA256 dari byte badan mentah dengan secret webhook, hex huruf kecil, tanpa awalan sha256=. |
| X-Kareeb-Event required | string Nama peristiwa, sama dengan event di badan. |
| X-Kareeb-Delivery required | string Id kiriman ke endpoint Anda. Sama pada setiap percobaan ulang kiriman yang sama, berbeda untuk setiap endpoint. |
| id required | string <uuid> Id kejadian (UUID). Sama di semua percobaan ulang; pakai untuk membuang duplikat. |
| timestamp required | string <date-time> Waktu kejadian diantrekan. |
| event required | string Nama peristiwa. Value: "call.finished" |
required | object |
{- "id": "0b6f2c1e-6d0a-4f7b-9a51-3c2d8e4f1a20",
- "timestamp": "2026-11-04T03:15:02+00:00",
- "event": "call.finished",
- "data": {
- "call_id": 55,
- "channel": "app",
- "conversation_id": 420,
- "contact_id": 91,
- "session_ref": "sesi-7f3a9c",
- "duration_s": 184,
- "outcome": "completed",
- "handoff": false,
- "ended_at": "2026-11-04T06:03:04+00:00"
}
}Sambungan ke model Agen AI berganti antara menjawab dan gagal. Dikirim hanya saat berganti, tanpa kunci dan tanpa isi jawaban.
Semua webhook memakai amplop yang sama: id, timestamp, event, data. Kareeb menandatangani byte badan persis seperti dikirim; hitung HMAC-SHA256 dari byte mentah itu dengan secret webhook (hex huruf kecil) lalu bandingkan dengan X-Kareeb-Signature memakai perbandingan waktu tetap. Jawab 2xx dalam 10 detik. Kiriman yang gagal dicoba lagi pada putaran penjadwal berikutnya, sekitar tiap 5 menit, paling banyak 5 kali. Setelah 10 kegagalan berturut-turut, langganan dinonaktifkan dan admin perlu mengaktifkannya lagi. Pengiriman bersifat at least once: buang duplikat dengan id di badan, yang sama untuk satu kejadian di semua endpoint dan semua percobaan.
| X-Kareeb-Signature required | string HMAC-SHA256 dari byte badan mentah dengan secret webhook, hex huruf kecil, tanpa awalan sha256=. |
| X-Kareeb-Event required | string Nama peristiwa, sama dengan event di badan. |
| X-Kareeb-Delivery required | string Id kiriman ke endpoint Anda. Sama pada setiap percobaan ulang kiriman yang sama, berbeda untuk setiap endpoint. |
| id required | string <uuid> Id kejadian (UUID). Sama di semua percobaan ulang; pakai untuk membuang duplikat. |
| timestamp required | string <date-time> Waktu kejadian diantrekan. |
| event required | string Nama peristiwa. Value: "agen_ai.sambungan" |
required | object |
{- "id": "0b6f2c1e-6d0a-4f7b-9a51-3c2d8e4f1a20",
- "timestamp": "2026-11-04T03:15:02+00:00",
- "event": "agen_ai.sambungan",
- "data": {
- "status": "gagal",
- "kode": 0,
- "host": "",
- "sejak": "2026-11-04T07:00:00+00:00"
}
}