Langsung ke konten
WbizTool

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_key di 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 dengan media_id.
  • Method dan URL: GET untuk membaca, POST untuk membuat, PATCH untuk mengubah, DELETE untuk membatalkan atau menghapus, di bawah https://wbiztool.com/api/v2.
  • Kode status HTTP sebagai pengganti "status": 0 atau 1 (lihat Respons dan error).
  • Nomor telepon dalam format internasional dengan +, tanpa country_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 webhook di setiap pesan.

Per endpoint#

Path v2 relatif terhadap https://wbiztool.com/api/v2.

Mengirim, per field#

v1v2Catatan
client_id + api_key (body atau Authorization: Bearer)Authorization: Bearer wbz_live_…Kunci v2 baru; tanpa client_id
phone + country_codeto.phoneSatu 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_nameto.groupNama persis grup
(tidak ada di v1)to.contact_idKontak tersimpan
whatsapp_clientfromid nomor; opsional jika satu nomor terhubung, seperti sebelumnya
msg (atau message)textHingga 3.000 karakter, seperti sebelumnya
msg_type 0, 1, 2tidak adaPesan dengan media adalah pesan media; media.type (image atau file) jika tautannya tidak menunjukkan jenisnya
img_url / file_urlmedia.urlTautan http(s) publik
file (unggah di request yang sama)media.media_idUnggah dulu, lalu kirim ID-nya sesering yang Anda mau
file_namemedia.file_nameUntuk file
date + time + timezone milik schedule_msg/send_atSatu waktu dengan offset-nya: 24/12/2026, 10:30, dan Asia/Kolkata menjadi "2026-12-24T10:30:00+05:30"
expire_after_secondsexpires_atSebuah waktu, bukan durasi: waktu sekarang ditambah jumlah detiknya, dengan offset-nya
webhookendpoint webhookDitambahkan sekali dengan POST /webhooks, untuk setiap pesan di workspace
msg_id di responsidMessage 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_code di depan nomor (dengan 91, 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_url dan file_url selama request. v2 memeriksa bahwa tautan itu publik dan mengambil file saat pesan dikirim; tautan yang buruk muncul sebagai pesan failed.
  • 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:

v1status v2
0 Created / Pendingqueued, atau scheduled selama send_at-nya belum tiba
1 Sentsent, delivered, atau read (centang WhatsApp)
2 Failedfailed
3 Cancelledcancelled
4 Expiredexpired

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), atau 202 (masuk antrean), dan body-nya adalah objek itu sendiri, seperti Message. Tidak ada pembungkus status: 1.
  • Error berupa 4xx atau 5xx dengan satu bentuk: {"error": {"code", "message", "field", "docs", "request_id"}}. Gunakan code untuk percabangan, bukan message berbahasa 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 v1Kode v2
Auth Error: invalid api key401 invalid_api_key, api_key_revoked, atau api_key_expired
Invalid phone number / Invalid Contact Number "…"422 invalid_phone
Msg cant be null400 text_required
Message length is too long400 text_too_long
Invalid whatsapp client422 number_not_found
Invalid whatsapp client id.422 from_required
Not enough credits402 no_credits
Daily limit reached: …429 number_daily_cap_reached
Demo Account can not access apis403 demo_account
Account Disabled403 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:

  1. Tambahkan endpoint sekali dengan POST /webhooks dan simpan secret-nya.
  2. Endpoint menerima peristiwa JSON untuk setiap pesan di workspace, dengan Message lengkap di data.message. Cocokkan dengan catatan Anda berdasarkan data.message.id.
  3. Verifikasi tanda tangan: skemanya sama dengan v1 (WbizTool-Timestamp, WbizTool-Signature: v1=…), tetapi dengan rahasia milik endpoint itu sendiri, bukan rahasia workspace.
  4. Buang duplikat dengan WbizTool-Event-Id. Percobaan ulang berlangsung sekitar 23 jam, bukan 4 percobaan dalam beberapa menit seperti di v1, dan respons 4xx juga dicoba ulang.

Peristiwa koneksi v1 (webhook_url di whatsapp/connect/) belum memiliki peristiwa v2: lakukan polling GET /numbers/{id} sebagai gantinya.

Daftar periksa#

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

  2. Ubah request

    URL dan method baru, body JSON, to / from / text / media, nomor telepon dengan +, waktu dengan offset. Tambahkan Idempotency-Key ke setiap pengiriman.

  3. Ubah penanganan error

    Periksa status HTTP, lalu error.code. Tangani 429 dengan menunggu selama Retry-After.

  4. Pindahkan webhook

    Tambahkan endpoint, verifikasi tanda tangan dengan rahasianya, dan buang duplikat berdasarkan ID peristiwa.

  5. Beralih dan cabut

    Setelah aplikasi berjalan di v2, hapus kunci v1-nya di Pengaturan → Kunci API.

Terkait#