Lewati ke isi
CSWA.AIDocs

Memulai API & Webhook

Lima langkah dari nol: buat kunci, kirim pesan pertama, pasang webhook, uji dengan kunci test, atasi galat umum.

± 5 menit

API CSWA.AI menghubungkan aplikasi, CRM, toko online, atau alat otomasi Anda ke WhatsApp: kirim pesan, baca percakapan, kelola kontak, dan terima pesan masuk secara langsung lewat webhook. Ikuti lima langkah ini dari nol.

Yang Anda butuhkan

  • Paket berlangganan aktif dan minimal satu nomor WhatsApp terhubung (WhatsApp Device atau WhatsApp API Official).
  • Peran Pemilik atau Admin di ruang kerja.

1. Buat kunci API#

  1. Langkah 1: Buka Integrasi › API & Webhook

    Buka API & Webhook, lalu klik Buat kunci.

  2. Langkah 2: Beri nama, pilih mode & izin

    Pilih Test untuk mencoba dulu (tanpa pesan sungguhan), atau Produksi untuk kirim sungguhan. Centang izin seperlunya — mis. hanya pesan:kirim untuk sistem yang cuma mengirim notifikasi.

  3. Langkah 3: Salin kunci — hanya tampil sekali

    Simpan kunci di variabel lingkungan server (mis. CSWA_API_KEY). Jangan taruh di kode yang berjalan di peramban, di aplikasi HP, atau di URL.

2. Kirim pesan pertama#

Salin perintah ini ke terminal, ganti kunci dan nomor tujuan (format internasional tanpa tanda +):

Terminal
curl -X POST "https://api.cswa.ai/v1/messages" \
  -H "Authorization: Bearer KUNCI_API_ANDA" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"to":"6281234567890","type":"text","text":{"body":"Halo! Pesan pertama dari API 👋"}}'

Jawaban berhasil (202) — pesan masuk antrean lalu dikirim dari nomor WhatsApp Anda:

Respons
{
  "id": "kk_0123456789abcdef0123456789abcdef0123",
  "status": "queued",
  "conversation_id": "ct_0123456789abcdef",
  "channel_id": "chd_pr_0123456789abcdef",
  "test": false
}

3. Pasang webhook & verifikasi tanda tangan#

Di tab Webhook, klik Tambah URL, isi URL https server Anda, centang event (mis. message.received), lalu salin rahasia. Setiap kiriman membawa header X-CSWA-Signature; tolak kiriman yang tanda tangannya tidak cocok.

server.js (Node.js)
// Node.js (Express) — baca badan MENTAH, jangan JSON.parse dulu.
import crypto from "node:crypto";
import express from "express";

const RAHASIA = process.env.WEBHOOK_SECRET; // whsec_…
const app = express();

app.post("/webhook", express.raw({ type: "application/json" }), (req, res) => {
  const badan = req.body.toString("utf8");
  const bagian = Object.fromEntries((req.get("X-CSWA-Signature") || "").split(",").map((x) => x.split("=")));
  const semuaV1 = (req.get("X-CSWA-Signature") || "").split(",").filter((x) => x.startsWith("v1=")).map((x) => x.slice(3));
  const t = Number(bagian.t);
  if (!t || Math.abs(Date.now() / 1000 - t) > 300) return res.status(400).send("stempel waktu kedaluwarsa");
  const harus = crypto.createHmac("sha256", RAHASIA).update(`${t}.${badan}`).digest("hex");
  const cocok = semuaV1.some((v) => v.length === harus.length && crypto.timingSafeEqual(Buffer.from(v), Buffer.from(harus)));
  if (!cocok) return res.status(401).send("tanda tangan salah");

  res.sendStatus(200); // jawab cepat (≤ 10 detik), proses di belakang
  const event = JSON.parse(badan);
  // Cegah ganda: simpan event.id yang sudah diproses.
  console.log(event.type, event.data);
});

app.listen(3000);

Contoh PHP & Python ada di Menerima webhook. Klik Uji kirim di dasbor untuk memastikan server Anda menjawab 2xx.

4. Uji dengan kunci test#

Kunci …_test_… menjalankan semua pemeriksaan (izin, nomor, jendela 24 jam, STOP, template) lalu mengembalikan respons simulasi — tidak ada pesan terkirim dan tidak ada data yang berubah (percakapan, catatan, AI Agent, kontak & tag, broadcast, follow up, tagihan, resi, tiket, URL webhook). Respons membawa "test": true. Unggah media dan Uji kirim webhook tetap berjalan sungguhan. Setelah semua lancar, ganti dengan kunci produksi (…_live_…).

5. Galat umum & solusinya#

401 kunci_tidak_sahKunci salah, dicabut, atau kedaluwarsa. Pastikan header Authorization: Bearer <kunci> tanpa spasi tambahan.
403 izin_kurangKunci tidak punya izin untuk endpoint itu. Ubah izin kunci di dasbor.
422 di_luar_jendela_24_jamWhatsApp API Official: pelanggan belum chat dalam 24 jam. Kirim type template.
422 kontak_berhentiPelanggan membalas STOP. Pesan tidak dikirim sampai ia mengirim MULAI.
409 kanal_terputusNomor WhatsApp terputus. Tautkan ulang di menu WhatsApp / Koneksi Akun.
429 batas_permintaanLebih dari 60 permintaan/menit. Tunggu sesuai header Retry-After.
403 mode_test_sajaProfil masih masa coba: hanya kunci test yang berlaku. Berlangganan paket untuk kunci produksi.
503 fitur_nonaktifAPI sedang dinonaktifkan sementara. Ulangi setelah Retry-After.

Daftar lengkap ada di Batas & galat; semua endpoint ada di Referensi API.