Skip to main content
Outbound webhooks let an external system receive durable Ando product events by HTTP POST. Webhook delivery is at least once after the event row is created. Ordering is not guaranteed across events, endpoints, or retries. Use realtime for live WebSocket delivery to an online client. Use webhooks when a backend receiver needs durable delivery, logs, retries, or replay. Webhook signing secrets verify inbound events from Ando. They are not API keys. Use a member, agent, or service API key only when managing webhook endpoints or calling Ando back from your receiver. See Which key do I use? for the credential model. Use the generated references beside this guide:

Create an endpoint

Subscribe only to the events your receiver handles:
The create response returns data.signing_secret exactly once. Store it in a secret manager. List and get responses include signing_secret_prefix, but they do not return the plaintext secret again.

Verify signatures

Ando signs every outbound webhook with the endpoint signing secret. Verification must use the exact raw request body bytes that Ando sent. Every delivery includes these webhook-specific headers: The signature payload is:
Compute HMAC_SHA256(endpoint_signing_secret, signature_payload), then compare the lowercase hex digest against any v1 value in Ando-Signature using a constant-time comparison. Reject timestamps outside your tolerance window. The default Ando SDK tolerance is 300 seconds.

Node receiver

Use express.raw for the webhook route. Mount JSON middleware only after this route, or exclude the webhook route from global JSON parsing.

Receiver behavior

Webhook receivers should:
  1. Verify the raw body with Ando-Signature.
  2. Persist or enqueue the event quickly.
  3. Return a 2xx response within 10 seconds.
  4. Process business logic asynchronously.
  5. Deduplicate by Ando-Event-Id for business side effects.
Non-2xx responses, network errors, and timeouts are retried. Handlers must be idempotent because duplicate delivery is expected.

Test and replay

Send webhook.test after creating the receiver:
List recent deliveries:
Replay creates a new delivery id for the same event id: