Proxy WhatsApp API (WABA)
Kirim pesan teks, template, dan media lewat WhatsApp Cloud API Meta memakai kredensial CSKU, dengan pesan terkirim tercatat di inbox.
Proxy WABA meneruskan request Anda ke WhatsApp Cloud API Meta memakai nomor WhatsApp API yang sudah terhubung di CSKU. Anda tidak perlu menyimpan access token Meta di sistem Anda. Body request memakai format Meta apa adanya, dan pesan yang berhasil terkirim ikut tercatat di menu Chat.
Kapan dipakai
| Kebutuhan | Pakai |
|---|---|
| Membalas percakapan yang sudah ada di CSKU, di channel apa pun | Kirim pesan (POST /v1/message) |
| Mengirim pesan template WhatsApp (notifikasi, OTP, pengingat) ke nomor mana pun | Proxy WABA |
| Memakai fitur Cloud API Meta secara langsung, dengan format body Meta | Proxy WABA |
Proxy hanya berlaku untuk channel WhatsApp API (Token manual) dan WhatsApp API (Login Meta).
Base URL
https://api.csku.ai/v1/waba/{channel_merchant_id}
{channel_merchant_id} adalah ID channel WhatsApp API Anda, tampil di daftar channel pada Integrasi → WhatsApp API. Channel harus milik bisnis yang sama dengan kredensial dan berstatus aktif.
Autentikasi
Pakai Business ID (Pengaturan → Informasi Bisnis) dan Secret Key (Pengaturan → Secret Key). Pilih salah satu cara.
Header terpisah:
Business: <BUSINESS_ID>
Secret: <SECRET_KEY>
Bearer token, berisi base64 dari BUSINESS_ID|SECRET_KEY:
TOKEN=$(printf '%s|%s' "$BUSINESS_ID" "$SECRET_KEY" | base64 | tr -d '\n')
Authorization: Bearer <TOKEN>
Pemisahnya pipa, bukan titik dua
Proxy WABA memakai | di antara Business ID dan Secret Key. Ini berbeda dari Public API utama yang memakai :. Lihat Autentikasi.
Jika header Secret diisi, header Authorization diabaikan. WABA API Key dari dashboard (berawalan csku_waba_) tidak berlaku untuk endpoint ini. Jangan bagikan Secret Key dan jangan menaruhnya di kode aplikasi mobile atau browser.
Kirim pesan teks
POST /messages/text
Body diteruskan tanpa diubah ke https://graph.facebook.com/v20.0/{phone_number_id}/messages, jadi formatnya mengikuti dokumentasi Cloud API Meta.
curl -X POST "https://api.csku.ai/v1/waba/$CHANNEL_ID/messages/text" \
-H "Business: $BUSINESS_ID" \
-H "Secret: $SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{
"messaging_product": "whatsapp",
"recipient_type": "individual",
"to": "6281234567890",
"type": "text",
"text": { "body": "Halo, pesanan Anda sudah dikirim." }
}'
Respons sukses adalah respons Meta apa adanya:
{
"messaging_product": "whatsapp",
"contacts": [{ "input": "6281234567890", "wa_id": "6281234567890" }],
"messages": [{ "id": "wamid.HBgM..." }]
}
Aturan 24 jam
Pesan bebas (teks, gambar, dokumen) hanya bisa dikirim dalam 24 jam sejak pesan terakhir pelanggan. Di luar jendela itu, Meta menolak pesan dan Anda harus memakai template yang sudah disetujui.
Kirim pesan template
POST /messages/template
Template harus sudah disetujui Meta. Isi components sesuai variabel di template Anda.
curl -X POST "https://api.csku.ai/v1/waba/$CHANNEL_ID/messages/template" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"messaging_product": "whatsapp",
"to": "6281234567890",
"type": "template",
"template": {
"name": "order_shipped",
"language": { "code": "id" },
"components": [
{
"type": "header",
"parameters": [
{ "type": "image", "image": { "link": "https://example.com/paket.jpg" } }
]
},
{
"type": "body",
"parameters": [
{ "type": "text", "text": "Budi" },
{ "type": "text", "text": "INV-1024" }
]
}
]
}
}'
Daftar template lewat GET /templates belum stabil. Lihat nama dan isi template di dashboard atau di Meta Business Manager.
Upload media
POST /media
Unggah file lewat multipart dengan field file. CSKU meneruskannya ke Meta dan mengembalikan ID media.
curl -X POST "https://api.csku.ai/v1/waba/$CHANNEL_ID/media" \
-H "Business: $BUSINESS_ID" \
-H "Secret: $SECRET_KEY" \
-F "[email protected];type=application/pdf"
{ "id": "1234567890123456" }
Sertakan tipe file (type=...) agar Meta mengenali formatnya. Pakai ID ini di body pesan, misalnya di /messages/text:
{
"messaging_product": "whatsapp",
"to": "6281234567890",
"type": "document",
"document": { "id": "1234567890123456", "filename": "invoice.pdf", "caption": "Invoice Anda" }
}
Pesan di inbox
Setiap pesan yang diterima Meta (status di bawah 400) dicatat sebagai pesan agen di percakapan nomor tujuan di menu Chat. Jika belum ada percakapan, CSKU membuat percakapan baru. Isi yang tercatat:
- Teks: isi
text.body. - Template: isi body template dengan variabel terisi, atau nama template jika isinya tidak bisa diambil.
- Gambar, video, dokumen:
linkdancaption. Media yang dikirim denganidtercatat tanpa link.
Pencatatan berjalan setelah respons dikirim, jadi pesan bisa muncul di inbox beberapa detik kemudian.
Error
Ada dua sumber error, dibedakan oleh error.source.
Error dari CSKU, dengan HTTP status sesuai kode:
{
"error": {
"source": "csku",
"code": "unauthorized",
"message": "unauthorized"
}
}
code | HTTP | Penyebab |
|---|---|---|
unauthorized | 401 | Business ID atau Secret Key kosong atau salah. |
permission_denied | 403 | Channel bukan milik bisnis ini. |
channel_disabled | 403 | Channel tidak aktif. |
channel_not_found | 404 | channel_merchant_id tidak ditemukan. |
invalid_request | 400 | Body kosong, atau field file tidak ada di upload media. |
internal_error | 500 | Konfigurasi channel tidak lengkap atau Meta tidak bisa dihubungi. |
Error dari Meta, dengan HTTP status dari Meta. meta_error berisi respons error Meta apa adanya:
{
"error": {
"source": "meta",
"meta_error": {
"error": {
"message": "(#131047) Re-engagement message",
"type": "OAuthException",
"code": 131047,
"fbtrace_id": "A1b2C3..."
}
}
}
}
Arti kode error Meta ada di dokumentasi error Cloud API. Kode 131047 berarti jendela 24 jam sudah lewat; kirim template.
Batasan
- Body tidak divalidasi oleh CSKU. Format salah dikembalikan sebagai error Meta.
- Request ke Meta dibatasi 30 detik. Jika lewat, Anda menerima
internal_error. - Batas ukuran media, rate limit, dan aturan template mengikuti ketentuan Meta untuk nomor Anda.
- Proxy hanya untuk mengirim pesan dan upload media. Balasan pelanggan masuk ke menu Chat seperti channel lainnya.