Skip to content
Merchant guide
HTTPS · Signed events

Receiving events — headers and response rules

Every delivery is a single POST request with a JSON body. This page documents the request exactly — the headers and their meanings, and the response rules that make a delivery succeed on the first attempt.

Reviewed against implementation
YOUR INTEGRATION, AT A GLANCE
Webhook delivery · Headers
POST /your-webhook-endpoint
Content-Type: application/json
webhook-event-type: order.created
webhook-id: <endpoint_id>
webhook-event-id: <event_id>
webhook-delivery-id: <delivery_id>
webhook-timestamp: <unix_seconds>
webhook-signature: v1=<hmac_sha256_hex>
See the implementation
On this page

01Delivery headers

Header names are always lowercase:

HeaderValue
webhook-idThe endpoint id (UUID) — constant across all deliveries of that endpoint.
webhook-delivery-idThe delivery id (UUID) — the primary dedupe key: every retry of the same delivery repeats it, while a manual replay creates a new one.
webhook-event-idThe textual event identity — e.g. mwh:order-created:<tenant>:<order> — constant across retries and replays. Rare exception: events are kept 14 days while deliveries are kept 30, so a delivery manually replayed after its event row was purged carries the raw event UUID in this header.
webhook-event-typeThe event type — same value as type in the payload (or ping for the test event).
webhook-timestampUnix seconds as a decimal string — the signing time of THIS attempt.
webhook-signaturev1=<hex> where hex = HMAC-SHA256 over ${timestamp}.${endpoint_id}.${event_id}.${delivery_id}.${body} using the endpoint secret.

02Remaining headers and response rules

  • Content-Type: application/json — the body is the payload itself as JSON.
  • User-Agent: YallaBuy-Webhooks/1.0 — use it to recognize platform traffic in your firewall.
  • The platform waits at most 10 seconds for your response on each attempt — beyond that the attempt is classified TIMEOUT.
  • Any 2xx response settles the delivery as successful — the body does not matter.
  • Your response body is ignored entirely: up to 64 KB is drained and never parsed — a short 2xx is enough.