Langkau ke kandungan
WbizTool

API v2 (beta)

Webhook

Endpoint webhook ialah URL pada pelayan anda yang dipanggil oleh WbizTool apabila sesuatu berlaku pada mesej: ia dihantar, gagal, dibatalkan atau tamat tempoh. Anda mendapat berita itu serta-merta tanpa meninjau berulang kali, dan setiap permintaan ditandatangani supaya anda boleh menyemak bahawa ia datang daripada WbizTool.

OperasiEndpointSkop
Tambah endpointPOST /api/v2/webhooksmessages:read
Senaraikan endpointGET /api/v2/webhooksmessages:read
Dapatkan endpointGET /api/v2/webhooks/{id}messages:read
Buang endpointDELETE /api/v2/webhooks/{id}messages:read
Ganti rahsia tandatanganPOST /api/v2/webhooks/{id}/rotate-secretmessages:read
Hantar peristiwa ujianPOST /api/v2/webhooks/{id}/testmessages:read

Endpoint dimiliki oleh ruang kerja dan menerima peristiwa untuk semua mesejnya, tidak kira apa yang menghantarnya: API, papan pemuka, kempen, peringatan atau integrasi. Itulah sebabnya kunci yang dihadkan kepada sebahagian nombor tidak boleh mengurusnya: setiap panggilan menjawab 403 number_not_allowed.

Peristiwa#

JenisBila
message.sentMesej telah dihantar dari nombor anda.
message.failedMesej tidak dapat dihantar; error.message menyatakan sebabnya.
message.cancelledMesej yang menunggu telah dibatalkan: dengan API, dari papan pemuka, atau kerana nombor atau kempennya dibuang.
message.expiredMesej tidak dihantar sebelum expires_at-nya.
pingPeristiwa ujian yang anda minta.

Peristiwa untuk nombor (disambungkan, log keluar) dan untuk mesej masuk akan datang kemudian. Tanda sampai dan dibaca tidak menghantar peristiwa; dapatkan mesej itu untuk melihatnya.

Tambah endpoint#

POSThttps://wbiztool.com/api/v2/webhooks

Body: JSON (application/json)

Badan

urlstringwajib

Endpoint anda: alamat https:// awam, sehingga 500 aksara. Alamat http://, peribadi dan setempat (seperti localhost atau 192.168.x.x) ditolak.

eventsarray of stringspilihan

Jenis peristiwa yang diterimanya: mana-mana daripada message.sent, message.failed, message.cancelled dan message.expired. Lalai: keempat-empatnya. ping sentiasa tiba apabila anda memintanya.

descriptionstringpilihan

Nota untuk diri anda sendiri, sehingga 100 aksara, seperti Order system.

Satu ruang kerja boleh mempunyai sehingga 5 endpoint. Responsnya ialah 201 dengan endpoint dan secret tandatangannya, yang dipaparkan kali ini sahaja. Simpannya di tempat yang boleh dibaca oleh penerima anda, seperti pemboleh ubah persekitaran. Respons kemudian hanya menunjukkan secret_last4; jika anda kehilangan rahsia itu, gantikannya.

curl -X POST https://wbiztool.com/api/v2/webhooks \
  -H "Authorization: Bearer $WBIZTOOL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/wbiztool/events",
    "events": ["message.sent", "message.failed"],
    "description": "Order system"
  }'

Respons (201):

{
  "id": 41,
  "url": "https://example.com/wbiztool/events",
  "description": "Order system",
  "events": ["message.sent", "message.failed"],
  "secret_last4": "9c1e",
  "active": true,
  "disabled_reason": null,
  "created_at": "2026-10-18T11:20:05.733Z",
  "last_delivery": null,
  "secret": "3f0b…9c1e"
}

secret yang sebenar ialah 64 aksara heksadesimal. Cubaan semula permintaan ini dengan Idempotency-Key yang sama tidak menambah endpoint kedua, dan responsnya tidak menyertakan rahsia.

Ralat semasa menambah endpoint#

HTTPKodBila
400validation_failedurl tiada atau terlalu panjang, events kosong atau mempunyai jenis yang tidak dikenali, atau ada medan yang tidak dikenali
403webhook_limit_reachedRuang kerja sudah mempunyai 5 endpoint
403number_not_allowedKunci dihadkan kepada sebahagian nombor
422invalid_webhook_urlurl bukan alamat https:// awam

Senaraikan endpoint#

GEThttps://wbiztool.com/api/v2/webhooks

Endpoint ruang kerja yang menerima peristiwa, yang tertua dahulu, dalam satu senarai data.

curl https://wbiztool.com/api/v2/webhooks \
  -H "Authorization: Bearer $WBIZTOOL_API_KEY"

Senarai ini tidak menyertakan endpoint yang telah berhenti. Pemilik juga boleh melihat endpoint, dan membuangnya, di Tetapan → Kunci API di bawah Endpoint webhook.

Dapatkan endpoint#

GEThttps://wbiztool.com/api/v2/webhooks/{id}

Satu endpoint. last_delivery menunjukkan keputusan penghantaran terakhirnya. Endpoint yang tidak wujud atau telah dibuang menjawab 404 webhook_not_found; endpoint yang telah berhenti dipaparkan dengan active: false.

Buang endpoint#

DELETEhttps://wbiztool.com/api/v2/webhooks/{id}

Tiada apa-apa lagi dihantar kepadanya, termasuk cubaan semula yang masih menunggu. Responsnya ialah {"id": 41, "deleted": true}.

Ganti rahsia tandatangan#

POSThttps://wbiztool.com/api/v2/webhooks/{id}/rotate-secret

Mencipta rahsia baharu untuk endpoint. Responsnya ialah 200 dengan endpoint dan secret baharunya, yang dipaparkan kali ini sahaja. Rahsia lama berhenti serta-merta: peristiwa yang dihantar selepas ini ditandatangani dengan rahsia baharu, termasuk cubaan semula peristiwa terdahulu. Kemas kini penerima anda dengan segera.

curl -X POST https://wbiztool.com/api/v2/webhooks/41/rotate-secret \
  -H "Authorization: Bearer $WBIZTOOL_API_KEY"

Hantar peristiwa ujian#

POSThttps://wbiztool.com/api/v2/webhooks/{id}/test

Memasukkan peristiwa ping ke dalam baris gilir untuk endpoint ini, ditandatangani seperti setiap peristiwa, supaya anda boleh menguji penerima anda. Responsnya ialah 202:

{ "event_id": "evt_8a2f4c1d9b7e6a5f4c3b2a19", "type": "ping", "queued": true }

Endpoint anda menerima:

{
  "id": "evt_8a2f4c1d9b7e6a5f4c3b2a19",
  "type": "ping",
  "created_at": "2026-10-18T11:21:40.002Z",
  "data": { "webhook_id": 41 }
}

Payload peristiwa#

Setiap peristiwa ialah POST dengan badan JSON:

{
  "id": "evt_c41d7e2a9f3b8c6d5e4f3a21",
  "type": "message.sent",
  "created_at": "2026-10-18T10:15:09.912Z",
  "data": {
    "message": {
      "id": 9817263,
      "status": "sent",
      "from": { "id": 101, "phone": "919800000000", "platform": "whatsapp" },
      "to": { "phone": "+919876543210", "contact_id": 991 },
      "text": "Hi Asha, your order #1042 is ready.",
      "media": null,
      "send_at": null,
      "expires_at": null,
      "created_at": "2026-10-18T10:15:02.311Z",
      "sent_at": "2026-10-18T10:15:09.870Z",
      "error": null
    }
  }
}
MedanPenerangan
idID peristiwa, evt_ diikuti 24 aksara. Peristiwa yang sama mengekalkan ID-nya pada setiap cubaan semula.
typeSalah satu jenis peristiwa.
created_atBila peristiwa itu berlaku.
data.messageBagi peristiwa message.*: Message seperti keadaannya pada masa itu. media.url di dalamnya berfungsi sekurang-kurangnya selama 26 jam.
data.webhook_idBagi ping: ID endpoint.

Pengepala:

PengepalaNilai
Content-Typeapplication/json
User-AgentWbizTool-Webhooks/2
WbizTool-Event-Idid peristiwa, sama pada setiap cubaan semula
WbizTool-TimestampBila cubaan ini dihantar, dalam saat Unix, seperti 1792310409
WbizTool-Signaturev1= diikuti HMAC-SHA256 heks bagi <timestamp>.<raw body>, dibuat dengan rahsia endpoint

Sahkan tandatangan#

Semak setiap permintaan sebelum anda mempercayainya: kira tandatangan daripada badan mentah (sebelum rangka kerja anda menghuraikan JSON), bandingkannya dengan pengepala dalam masa malar, dan tolak cap masa yang berbeza lebih daripada 5 minit, supaya permintaan lama tidak boleh dimainkan semula. Ia skema yang sama seperti tandatangan webhook API v1, dengan rahsia endpoint itu sendiri.

Kemudian gunakan WbizTool-Event-Id untuk membuang ulangan: peristiwa yang sama boleh tiba lebih daripada sekali, contohnya apabila respons anda hilang dan kami mencuba lagi.

import hashlib, hmac, json, os, time

SECRET = os.environ["WBIZTOOL_WEBHOOK_SECRET"]

def verify(secret: str, body: bytes, headers) -> bool:
    ts, sig = headers.get("WbizTool-Timestamp", ""), headers.get("WbizTool-Signature", "")
    if not ts.isdigit() or abs(time.time() - int(ts)) > 300:
        return False
    mac = "v1=" + hmac.new(secret.encode(), ts.encode() + b"." + body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(mac, sig)

# Flask
from flask import Flask, request

app = Flask(__name__)
seen = set()  # use your database in production

@app.post("/wbiztool/events")
def events():
    body = request.get_data()  # the raw bytes
    if not verify(SECRET, body, request.headers):
        return "", 401
    event_id = request.headers["WbizTool-Event-Id"]
    if event_id in seen:
        return "", 200  # a repeat: already handled
    seen.add(event_id)
    event = json.loads(body)
    if event["type"] == "message.failed":
        message = event["data"]["message"]
        print("Failed:", message["id"], message["error"]["message"])
    return "", 200

Dalam Django, hantar request.body dan request.headers.

Jawab 2xx dengan cepat, kemudian lakukan kerja yang perlahan selepas itu (contohnya dalam baris gilir).

Cubaan semula#

  • Jawab dengan sebarang 2xx dalam masa 10 saat. Selain itu dikira sebagai kegagalan: kod status lain (termasuk 4xx), tiada jawapan dalam masa 10 saat, atau tiada sambungan dalam masa 3 saat. Ubah hala diikuti, paling banyak 3 kali, dan setiap satu mesti membawa ke alamat awam.
  • Penghantaran yang gagal dicuba semula selepas 1, 5 dan 15 minit, kemudian 1, 2, 4, 8 dan 8 jam: 9 cubaan dalam kira-kira 23 jam. Selepas cubaan terakhir, peristiwa itu digugurkan.
  • Cubaan semula mempunyai badan dan WbizTool-Event-Id yang sama, dengan WbizTool-Timestamp dan tandatangan yang baharu.
  • Susunan tidak dijamin. message.sent yang dicuba semula boleh tiba selepas peristiwa yang lebih baharu. Gunakan status mesej, atau dapatkan mesej itu, apabila susunan penting.

last_delivery pada endpoint menunjukkan keputusan penghantaran terakhir: state (pending, delivered atau failed), status_code yang dijawab oleh pelayan anda, dan bila peristiwa itu dicipta.

Bila endpoint berhenti#

Endpoint berhenti menerima peristiwa apabila salah satu perkara ini berlaku. Ia kekal dalam GET /webhooks dengan active: false dan disabled_reason, supaya anda boleh melihat sebabnya; ia masih boleh dibaca dan dibuang, tetapi tidak boleh diuji atau diberi rahsia baharu (404).

  • Ia telah gagal selama 24 jam. Jika tiada apa-apa berjaya dihantar kepadanya selama 24 jam sementara penghantarannya terus gagal, ia dimatikan dan cubaan semula yang menunggu digugurkan. Tetapan → Kunci API kemudian memaparkannya sebagai Tidak aktif. Betulkan pelayan anda, kemudian tambah endpoint semula.
  • Kunci yang menciptanya ditarik balik atau tamat tempoh. Menarik balik kunci menghentikan semua yang disediakannya. Tambah endpoint semula dengan kunci lain.
  • Ia dibuang, dengan Buang endpoint atau di Tetapan → Kunci API.

Endpoint yang telah berhenti tidak dikira dalam had 5.

Objek endpoint webhook#

MedanJenisPenerangan
idintegerID endpoint.
urlstringTempat peristiwa dihantar.
descriptionstringNota anda; "" apabila tiada.
eventsarrayJenis peristiwa yang diterimanya.
secretstringRahsia tandatangan: hanya dalam respons kepada Tambah endpoint dan Ganti rahsia tandatangan.
secret_last4string4 aksara terakhir rahsia, untuk mengetahui rahsia mana yang anda miliki.
activebooleanfalse apabila ia tidak lagi menerima peristiwa – lihat Bila endpoint berhenti.
disabled_reasonstring or nullSebab ia berhenti (gagal selama 24 jam, atau kunci yang menciptanya ditarik balik atau tamat tempoh); null semasa aktif.
created_atstringBila ia ditambah.
last_deliveryobject or nullPenghantaran terakhir yang dicuba: state, status_code (atau null apabila pelayan anda tidak menjawab) dan created_at. null sebelum yang pertama.

Berkaitan#