WEBHOOKS
Events and payloads
wa pushes events to the URLs configured per device — three URLs, set on the device page. The two OTP events ride the status URL, since they are outcomes of a message you sent. Every request is a signed JSON POST.
Answer 2xx within ten secondsAnything else counts as a failure. wa then retries on a widening backoff — 1, 2, 4, 8, 16 and 32 minutes, then hourly — 29 retries after the first attempt, spanning a little over a day, after which the delivery is dead-lettered and stops. You can replay a dead delivery from the dashboard.
The events
Ignore events you do not handleNew event kinds are added over time, and the two OTP events share the status URL with message.status. Answer 2xx to anything you do not recognise and move on — refusing an unknown event fills your delivery log with dead rows for a day and changes nothing.
The envelope
Every delivery has the same four outer fields plus its data, which is what changes with the event.
Fields are additive: new keys may appear without a version bump, and existing keys never change meaning. Verify the signature before you trust any of it — how to do that.