Lewati ke konten

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

KebutuhanPakai
Membalas percakapan yang sudah ada di CSKU, di channel apa punKirim pesan (POST /v1/message)
Mengirim pesan template WhatsApp (notifikasi, OTP, pengingat) ke nomor mana punProxy WABA
Memakai fitur Cloud API Meta secara langsung, dengan format body MetaProxy WABA

Proxy hanya berlaku untuk channel WhatsApp API (Token manual) dan WhatsApp API (Login Meta).

Base URL

Terminal
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:

HTTP
Business: <BUSINESS_ID>
Secret: <SECRET_KEY>

Bearer token, berisi base64 dari BUSINESS_ID|SECRET_KEY:

Terminal
TOKEN=$(printf '%s|%s' "$BUSINESS_ID" "$SECRET_KEY" | base64 | tr -d '\n')
HTTP
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.

Terminal
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:

JSON
{
  "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.

Terminal
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.

Terminal
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"
JSON
{ "id": "1234567890123456" }

Sertakan tipe file (type=...) agar Meta mengenali formatnya. Pakai ID ini di body pesan, misalnya di /messages/text:

JSON
{
  "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: link dan caption. Media yang dikirim dengan id tercatat 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:

JSON
{
  "error": {
    "source": "csku",
    "code": "unauthorized",
    "message": "unauthorized"
  }
}
codeHTTPPenyebab
unauthorized401Business ID atau Secret Key kosong atau salah.
permission_denied403Channel bukan milik bisnis ini.
channel_disabled403Channel tidak aktif.
channel_not_found404channel_merchant_id tidak ditemukan.
invalid_request400Body kosong, atau field file tidak ada di upload media.
internal_error500Konfigurasi channel tidak lengkap atau Meta tidak bisa dihubungi.

Error dari Meta, dengan HTTP status dari Meta. meta_error berisi respons error Meta apa adanya:

JSON
{
  "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.