GET /v1/events, or have AppGoat push each event as it happens. Webhooks are free to use on paid plans; on Free, creating one returns 402 plan_limit.
Create an endpoint
secret (whsec_…). It is returned only once; rotate it with PATCH /v1/webhooks/{id} and rotate_secret. event_types: null (the default) sends every type. Send a test event with POST /v1/webhooks/{id}/test. An organization can have up to 20 endpoints.
The delivery
Everywebhook delivery is a POST with the event as JSON and these headers:
Verify the signature
Compute HMAC-SHA256 of<t>.<raw request body> with your secret, compare it in constant time with v1, and reject timestamps older than 5 minutes.
Retries
A non-2xx answer (redirects included) or a timeout is retried after 1 min, 5 min, 30 min, 2 h, 6 h, 12 h and 24 h (8 attempts over about 2 days); after the last one the delivery is marked failed. Inspect them withGET /v1/webhooks/{id}/deliveries. An endpoint that fails 50 times in a row is disabled; PATCH it with active: true to turn it back on.
Endpoint URLs must resolve to public addresses: localhost, private networks and URLs with credentials are refused with invalid_param.