POST /v1/webhooks, and pick the events you want. We post each event to your link as JSON. Copy the signing secret when it is shown: you see it once.
The events
What we send
data is the same as the API’s own answer for that thing: a message event carries the message as GET /v1/messages/{id} shows it. Every message event (and message.received) also has customer: { "phone": "+9198250*****" | null, "user_id": "IN.1349…" | null, "username": "ramesh_k" | null }. phone can be null: a customer who uses a WhatsApp username may not share their number. Headers: X-GetReply-Event (the type) and X-GetReply-Signature.
Check the signature
X-GetReply-Signature looks like t=1761142268,v1=5f2a…. v1 is the HMAC-SHA256 of t, a dot, and the raw body, with your secret. Right after you make a new secret there are two v1 values: accept either. Check the time too, so an old request can’t be sent again.
Answer fast, then work
Answer with any 2xx straight away, then do your work. Each event has anid: if the same id comes twice, handle it once.
- We wait up to 10 seconds for your answer. Any 2xx answer counts as delivered, and that event is never sent again.
- Anything else is tried again, 6 tries in all (see the table).
- A webhook that only fails for 24 hours is switched off. Switch it on again in Developer → Webhooks.
- After you make a new secret, the old one keeps signing for 24 hours.
- Every try is kept 7 days (Developer → Webhooks → Deliveries).
A webhook that keeps failing is switched off. Turn it back on in the app: Developer → Webhooks → Switch on.