API v2 (beta)
Pindah dari v1 ke v2
API v2 melakukan apa yang dilakukan v1, dengan kunci yang lebih aman, satu gaya URL, kode status HTTP yang sebenarnya, dan webhook JSON yang ditandatangani. Halaman ini memetakan setiap endpoint dan field v1 ke padanannya di v2. Hal-hal yang baru di v2 sendiri ada di ikhtisar.
Yang berubah di semua endpoint#
- Kunci:
client_id+api_keydi v1 menjadi satu header,Authorization: Bearer wbz_live_…. Buat kunci v2 di Pengaturan → Kunci API, pada kartu Kunci API v2, hanya dengan scope yang dibutuhkan aplikasi. Kunci v1 tidak berfungsi di v2, dan kunci v2 tidak berfungsi di v1. - Hanya JSON: tanpa field formulir. Unggahan file dikirim ke
POST /media(multipart) dan dikirim denganmedia_id. - Method dan URL:
GETuntuk membaca,POSTuntuk membuat,PATCHuntuk mengubah,DELETEuntuk membatalkan atau menghapus, di bawahhttps://wbiztool.com/api/v2. - Kode status HTTP sebagai pengganti
"status": 0atau1(lihat Respons dan error). - Nomor telepon dalam format internasional dengan
+, tanpacountry_code. - Waktu dalam ISO 8601 dengan offset, sebagai pengganti field tanggal, waktu, dan zona waktu yang terpisah.
- Webhook berupa endpoint yang Anda tambahkan sekali untuk workspace, dengan peristiwa JSON yang ditandatangani, sebagai pengganti URL
webhookdi setiap pesan.
Per endpoint#
Path v2 relatif terhadap https://wbiztool.com/api/v2.
Mengirim, per field#
| v1 | v2 | Catatan |
|---|---|---|
client_id + api_key (body atau Authorization: Bearer) | Authorization: Bearer wbz_live_… | Kunci v2 baru; tanpa client_id |
phone + country_code | to.phone | Satu nomor dalam E.164 dengan +: "9876543210" dengan "country_code": "91" menjadi {"phone": "+919876543210"}. Kode negara tidak ditambahkan untuk Anda |
phone dengan @username (Telegram) | to.username | @name, t.me/name, atau tg: diikuti ID, dari akun Telegram |
group_name | to.group | Nama persis grup |
| (tidak ada di v1) | to.contact_id | Kontak tersimpan |
whatsapp_client | from | id nomor; opsional jika satu nomor terhubung, seperti sebelumnya |
msg (atau message) | text | Hingga 3.000 karakter, seperti sebelumnya |
msg_type 0, 1, 2 | tidak ada | Pesan dengan media adalah pesan media; media.type (image atau file) jika tautannya tidak menunjukkan jenisnya |
img_url / file_url | media.url | Tautan http(s) publik |
file (unggah di request yang sama) | media.media_id | Unggah dulu, lalu kirim ID-nya sesering yang Anda mau |
file_name | media.file_name | Untuk file |
date + time + timezone milik schedule_msg/ | send_at | Satu waktu dengan offset-nya: 24/12/2026, 10:30, dan Asia/Kolkata menjadi "2026-12-24T10:30:00+05:30" |
expire_after_seconds | expires_at | Sebuah waktu, bukan durasi: waktu sekarang ditambah jumlah detiknya, dengan offset-nya |
webhook | endpoint webhook | Ditambahkan sekali dengan POST /webhooks, untuk setiap pesan di workspace |
msg_id di respons | id | Message itu sendiri yang dikembalikan, beserta status-nya |
Pengiriman yang sama di v1 dan v2:
# v1
curl -X POST https://wbiztool.com/api/v1/send_msg/ \
-H "Authorization: Bearer YOUR_V1_KEY" \
-H "Content-Type: application/json" \
-d '{"whatsapp_client": 101, "msg_type": 1, "country_code": "91", "phone": "9876543210",
"img_url": "https://example.com/offers/diwali-sale.jpg", "msg": "Our Diwali sale starts today",
"expire_after_seconds": 3600}'
# v2
curl -X POST https://wbiztool.com/api/v2/messages \
-H "Authorization: Bearer $WBIZTOOL_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: diwali-9876543210" \
-d '{"from": 101, "to": {"phone": "+919876543210"},
"media": {"url": "https://example.com/offers/diwali-sale.jpg"}, "text": "Our Diwali sale starts today",
"expires_at": "2026-10-20T11:30:00+05:30"}'
Beberapa perilaku v1 sengaja dihilangkan:
- Tidak ada tebakan kode negara. v1 menaruh
country_codedi depan nomor (dengan91, selalu di depan nomor 10 digit). v2 menerima nomor persis seperti yang ditulis dengan+. - Tidak ada pengunduhan file saat Anda memanggil API. v1 mengambil
img_urldanfile_urlselama request. v2 memeriksa bahwa tautan itu publik dan mengambil file saat pesan dikirim; tautan yang buruk muncul sebagai pesanfailed. - Tidak ada baris gagal saat ditolak. Saat v1 menolak pengiriman yang melewati batas harian 1.000, v1 tetap menyimpan pesan itu sebagai gagal. v2 tidak menyimpan apa pun saat menolak pengiriman.
- Field yang tidak dikenal ditolak, bukan diabaikan.
Status#
Angka dan kata di v1 menjadi satu field status:
| v1 | status v2 |
|---|---|
0 Created / Pending | queued, atau scheduled selama send_at-nya belum tiba |
1 Sent | sent, delivered, atau read (centang WhatsApp) |
2 Failed | failed |
3 Cancelled | cancelled |
4 Expired | expired |
Peristiwa webhook adalah message.sent, message.failed, message.cancelled, dan message.expired, sesuai dengan SENT, FAILED, CANCELLED, dan EXPIRED di v1.
Respons dan error#
v1 menjawab banyak error dengan HTTP 200 atau 400 dan "status": 0, dan keberhasilan dengan "status": 1. v2 memakai kode status HTTP:
- Berhasil berarti
200,201(dibuat), atau202(masuk antrean), dan body-nya adalah objek itu sendiri, seperti Message. Tidak ada pembungkusstatus: 1. - Error berupa
4xxatau5xxdengan satu bentuk:{"error": {"code", "message", "field", "docs", "request_id"}}. Gunakancodeuntuk percabangan, bukanmessageberbahasa Inggris. Setiap kode ada di halaman error.
# v1
result = response.json()
if result.get("status") == 1:
msg_id = result["msg_id"]
# v2
if response.status_code == 202:
message_id = response.json()["id"]
else:
error = response.json()["error"]
if error["code"] == "number_daily_cap_reached":
... # try again tomorrow
Beberapa pesan v1 dan kode v2-nya:
| Pesan v1 | Kode v2 |
|---|---|
Auth Error: invalid api key | 401 invalid_api_key, api_key_revoked, atau api_key_expired |
Invalid phone number / Invalid Contact Number "…" | 422 invalid_phone |
Msg cant be null | 400 text_required |
Message length is too long | 400 text_too_long |
Invalid whatsapp client | 422 number_not_found |
Invalid whatsapp client id. | 422 from_required |
Not enough credits | 402 no_credits |
Daily limit reached: … | 429 number_daily_cap_reached |
Demo Account can not access apis | 403 demo_account |
Account Disabled | 403 account_disabled |
Invalid JSON format: … | 400 invalid_json |
Webhook#
Di v1, setiap pesan dapat membawa URL webhook yang menerima msg_id=…&status=SENT dalam format form-encoded. Di v2:
- Tambahkan endpoint sekali dengan
POST /webhooksdan simpansecret-nya. - Endpoint menerima peristiwa JSON untuk setiap pesan di workspace, dengan Message lengkap di
data.message. Cocokkan dengan catatan Anda berdasarkandata.message.id. - Verifikasi tanda tangan: skemanya sama dengan v1 (
WbizTool-Timestamp,WbizTool-Signature: v1=…), tetapi dengan rahasia milik endpoint itu sendiri, bukan rahasia workspace. - Buang duplikat dengan
WbizTool-Event-Id. Percobaan ulang berlangsung sekitar 23 jam, bukan 4 percobaan dalam beberapa menit seperti di v1, dan respons4xxjuga dicoba ulang.
Peristiwa koneksi v1 (webhook_url di whatsapp/connect/) belum memiliki peristiwa v2: lakukan polling GET /numbers/{id} sebagai gantinya.
Daftar periksa#
Buat kunci v2 per aplikasi
Di Pengaturan → Kunci API, hanya dengan scope yang dibutuhkan. Coba dulu dengan kunci uji, yang memeriksa semuanya dan tidak mengirim apa pun.
Ubah request
URL dan method baru, body JSON,
to/from/text/media, nomor telepon dengan+, waktu dengan offset. TambahkanIdempotency-Keyke setiap pengiriman.Ubah penanganan error
Periksa status HTTP, lalu
error.code. Tangani429dengan menunggu selamaRetry-After.Pindahkan webhook
Tambahkan endpoint, verifikasi tanda tangan dengan rahasianya, dan buang duplikat berdasarkan ID peristiwa.
Beralih dan cabut
Setelah aplikasi berjalan di v2, hapus kunci v1-nya di Pengaturan → Kunci API.
