Referensi API
Semua endpoint, payload webhook, dan kode error REST API KonekSip.
Base URL
https://koneksip.com/api
Deskripsi OpenAPI 3.1 yang bisa dibaca mesin untuk API ini ada di https://koneksip.com/api/openapi.json. Tidak butuh API key, dan bisa diimpor ke Postman atau Insomnia.
Autentikasi
Semua permintaan API memerlukan autentikasi dengan API key, dikirim lewat header Authorization.
Autentikasi Header
Kirim API key Anda sebagai Bearer token pada setiap permintaan.
Authorization: Bearer YOUR_API_KEY
Catatan: Jaga API key Anda tetap aman dan jangan pernah membagikannya secara publik.
Konvensi
- Body request dan response berupa JSON. Kirim
Content-Type: application/jsonpada request yang memiliki body. - Id pada path (
{message_id},{receiver}, ...) harus di-URL-encode. message_idadalah id pesan di channelnya. Nilainya sama di response kirim, di webhook, dan di path Mark as Read, React, Edit, dan Delete. Formatnya tergantung channel:3EB0…pada channel Tidak Resmi (QR),wamid.…pada channel Resmi (Cloud API), dan header Message-ID (<…@…>) pada email.- Keberhasilan ditentukan oleh status HTTP:
200berarti permintaan berhasil. Tidak ada fieldstatusdi body. - Body sukses selalu berisi
messagedan, jika ada hasil, fielddata. Hanya response yang memakaidata, field request bersifat datar. - Setiap paket memiliki batas pesan bulanan. Setelah tercapai, endpoint pengiriman mengembalikan
429 quota_exceededsampai bulan depan atau sampai upgrade. - Request yang mengirim pesan atau email dibatasi 60 per menit untuk setiap API key, dan seluruh request digabung 120 per menit. Setiap response membawa
X-RateLimit-Limit,X-RateLimit-Remaining, danX-RateLimit-Reset(detik sampai jendela direset). - Pengguna WhatsApp yang memakai username bisa menghubungi Anda tanpa nomor telepon. Meta lalu mengenalinya dengan business-scoped user ID (BSUID, misalnya
ID.13491208655302741918). Percakapan seperti itu memakai BSUID sebagaireceiver-nya: Anda melihatnya di webhook dan di endpoint baca, dan membalas dengan mengirim BSUID itu sebagaireceiver. Ini berlaku di channel Resmi (Cloud API). Receiver berupa nomor telepon tetap berfungsi. - Error dijelaskan di Error.
- Beberapa endpoint hanya berfungsi di channel Tidak Resmi (QR) dan menyebutkannya, channel Resmi mendapat error
unsupported_channeldi sana.
Idempotensi
Kirim header Idempotency-Key (string unik apa pun, maksimal 255 karakter) pada POST /api/messages dan POST /api/emails. Jika Anda mengulang setelah timeout dengan key dan body yang sama, response sukses pertama dikembalikan lagi, dengan header Idempotent-Replayed: true, dan tidak ada yang terkirim dua kali. Key diingat selama 24 jam. Memakai ulang key dengan body berbeda mengembalikan idempotency_key_reused, pengulangan saat request pertama masih berjalan mengembalikan idempotency_in_progress. Request yang gagal tidak menyimpan key.
Idempotency-Key: 7c9e6679-7425-40de-944b-e07fc1f90ae7
Kirim Teks
Kirim pesan teks ke nomor WhatsApp. Setiap pesan, apa pun jenisnya, dikirim dengan POST /api/messages, field type (text, media, buttons atau template) menentukan jenisnya dan field lain di body bergantung padanya.
Kirim Media
Kirim gambar, video, dokumen, atau file audio.
Kirim List
Kirim pesan dengan menu hingga 10 pilihan. Pelanggan menekan tombol, memilih satu baris, dan pilihannya tiba di webhook Anda.
Hanya channel Resmi (Cloud API). Jenis channel lain ditolak dengan error unsupported_channel. Seperti semua pesan bebas di channel Resmi, list hanya bisa dikirim dalam 24 jam setelah pesan terakhir pelanggan, gunakan template di luar jendela itu.
Kirim Template
Kirim template pesan WhatsApp yang sudah disetujui. Di luar jendela layanan pelanggan 24 jam Meta, ini satu-satunya cara memulai percakapan di channel Resmi.
Hanya channel Resmi. Permintaan untuk channel Tidak Resmi ditolak dengan error wrong_channel_type. Buat dan setujui template di dashboard terlebih dulu.
Tandai Chat Sudah Dibaca
Kirim tanda baca (centang biru) untuk pesan terakhir yang dikirim pelanggan di sebuah chat.
Beri Reaksi
Tambahkan reaksi emoji pada sebuah pesan.
Edit Pesan
Ubah teks pesan yang Anda kirim.
Hanya channel Tidak Resmi. Hanya pesan yang dikirim oleh channel ini yang dapat diedit. {message_id} adalah id pesan di channel Anda, encode untuk dipakai di URL.
Hapus Pesan
Hapus pesan untuk semua orang, atau hanya di sisi Anda.
Hanya channel Tidak Resmi. Menghapus untuk semua orang hanya berfungsi pada pesan yang dikirim oleh channel ini, pesan dari orang lain mengembalikan not_allowed.
Daftar Percakapan
Baca percakapan, pesan, kontak, dan template Anda. Daftar dibagi per halaman: kirim limit (1 sampai 100) dan teruskan next_cursor halaman sebelumnya untuk mendapat halaman berikutnya. next_cursor bernilai null di halaman terakhir. Endpoint ini butuh langganan aktif, tetapi channel tidak harus terhubung.
Percakapan channel ini, dari yang paling baru aktif. Obrolan grup ikut disertakan.
Daftar Pesan
Pesan dalam satu percakapan, dari yang terbaru.
Ambil Satu Pesan
Satu pesan menurut ID-nya, misalnya message_id yang dikembalikan saat Anda mengirimnya, untuk membaca status pengiriman terbarunya.
Daftar Kontak
Pelanggan organisasi Anda, dari yang terlama. Ini daftar pelanggan yang sama dengan yang Anda kelola di menu Pelanggan.
Daftar Template
Template pesan sebuah channel Resmi (Cloud API), untuk dipakai dengan Kirim Template. Hanya template yang disetujui yang dikembalikan kecuali Anda mengirim all=true. Jenis channel lain mengembalikan wrong_channel_type.
Status Channel
Ambil channel pemilik API key, termasuk apakah saat ini sedang terhubung. Gunakan untuk memeriksa channel sebelum mengirim.
Webhook
Atur URL webhook untuk menerima pesan WhatsApp masuk secara real-time. Saat seseorang mengirim pesan ke nomor WhatsApp Anda yang terhubung, sistem otomatis mengirim data pesan ke endpoint webhook Anda.
Penting: URL webhook Anda harus dapat diakses publik dan menerima request POST dengan payload JSON. Pengiriman diulang hingga 5 kali dengan backoff jika endpoint Anda tidak terjangkau atau error.
Menyiapkan Webhook
1. Atur URL Webhook
Di pengaturan channel Anda, tambahkan URL webhook:
- Klik ikon pengaturan pada channel Anda
- Masukkan URL webhook Anda (mis. https://yourdomain.com/webhook)
- Simpan pengaturan
Pengiriman
- Setiap event dikirim sebagai
POSTdengan body JSON. Jawab dengan status2xxapa pun, isi response diabaikan. - Header pada setiap request:
X-Webhook-Id(sama denganid),X-Webhook-Event(sama dengantype),X-Webhook-Timestamp(sama dengancreated_at), danUser-Agent: KonekSip-Webhook/1.0. - Pengiriman yang gagal diulang 5 kali lagi, berjarak 1 detik, 5 detik, 30 detik, 2 menit, dan 10 menit, dan setiap percobaan habis waktu setelah 10 detik.
idyang sama dikirim lagi pada percobaan ulang, gunakan untuk mengabaikan duplikat.- Urutan pengiriman tidak dijamin, event yang diulang bisa tiba setelah event yang lebih baru. Urutkan event berdasarkan
created_at. - Redirect tidak diikuti, dan URL yang mengarah ke alamat privat atau internal ditolak.
Format Pesan Masuk
Saat pesan diterima, webhook Anda akan menerima request POST dengan data berikut. Setiap event memakai amplop yang sama: id, type, created_at, channel_id, dan data.
Event Percakapan
Selain pesan, webhook menerima event tentang percakapan itu sendiri. Bentuk amplopnya sama. receiver mengenali percakapan, dengan format yang sama seperti di endpoint percakapan. assigned_by bernilai null saat percakapan ditugaskan otomatis.
Praktik Terbaik
- Selalu periksa apakah
is_mebernilai false sebelum membalas untuk menghindari loop - Gunakan HTTPS untuk URL webhook Anda demi keamanan
- Terapkan timeout dan penanganan error pada webhook Anda
- Catat pesan masuk untuk debugging dan analitik
- Pertimbangkan pembatasan laju untuk mencegah spam
- Validasi struktur data masuk sebelum diproses
Kesalahan
Setiap error berbentuk { "code": "...", "message": "..." } dengan status HTTP yang sesuai. Gunakan code di logika Anda, message ditujukan untuk manusia dan bisa berubah.
| HTTP | Code | Deskripsi |
|---|---|---|
| 400 | invalid_json |
Body request bukan JSON yang valid |
| 413 | payload_too_large |
Body request terlalu besar |
| 415 | unsupported_media_type |
Body harus dikirim sebagai JSON dengan Content-Type: application/json |
| 400 | unsupported_channel |
Jenis channel ini tidak mendukung aksi tersebut |
| 400 | wrong_channel_type |
Endpoint tidak tersedia untuk jenis channel ini |
| 401 | invalid_api_key |
API key tidak ada atau salah |
| 403 | subscription_ended |
Masa uji coba atau langganan telah berakhir |
| 403 | not_allowed |
Aksi tidak diizinkan pada resource ini |
| 404 | not_found |
Endpoint, pesan, atau chat tidak ada |
| 409 | channel_not_connected |
Channel berhenti atau tidak terhubung |
| 409 | idempotency_in_progress |
Request dengan Idempotency-Key yang sama masih diproses |
| 422 | validation_failed |
Request tidak valid, errors mencantumkan tiap field |
| 422 | invalid_receiver |
Penerima bukan nomor WhatsApp yang valid |
| 422 | channel_misconfigured |
Pengaturan channel belum lengkap |
| 422 | verification_failed |
Kredensial tidak dapat diverifikasi |
| 422 | idempotency_key_reused |
Idempotency-Key sudah dipakai dengan request yang berbeda |
| 429 | rate_limited |
Terlalu banyak request atau kegagalan pengiriman, tunggu retry_after detik (juga dikirim sebagai header Retry-After) |
| 429 | quota_exceeded |
Batas pesan bulanan paket Anda tercapai, pengiriman dilanjutkan bulan depan atau setelah upgrade |
| 500 | request_failed |
Request gagal di sisi kami |
| 502 | provider_error |
WhatsApp atau Meta menolak request, message berisi alasannya |
Butuh Bantuan?
Jika Anda punya pertanyaan atau butuh bantuan, tim dukungan kami siap membantu.