Quick Setup
Events
Payload Format
Every webhook delivery is a JSON POST with three custom headers:
The request body contains the event payload as JSON. The payload structure matches the corresponding API resource.
export.completed / export.failed
dataset.created / dataset.updated
dataset.deleted
task.completed
Verifying Signatures
Every delivery is signed with HMAC-SHA256 using the subscription’s secret. Always verify signatures before processing a webhook to ensure the request came from Avala. The signature is computed over the JSON-serialized payload with deterministic formatting (compact separators, sorted keys):Python
TypeScript
Example: Flask Webhook Handler
A complete Flask application that receives and verifies Avala webhooks:Example: Express Webhook Handler
Retry Policy
If your endpoint doesn’t respond with a2xx status code, Avala retries with exponential backoff:
After 5 failed retries, the delivery is marked as failed. Client errors (
4xx) are treated as permanent failures and are not retried.
Delivery Log
Every delivery attempt is recorded. You can inspect delivery history through the API:
Delivered entries are automatically cleaned up after 30 days. Failed entries are retained for 90 days.
Managing Webhooks
API Endpoints
Create a Subscription
Test a Webhook
Send aping event to verify your endpoint is reachable:
Testing During Development
-
Use a tunnel like ngrok to expose a local server:
Copy the HTTPS URL and use it as your webhook
target_url. -
Send a test ping via the API to verify connectivity:
-
Check the delivery log to inspect payloads, response codes, and timing:
Security
- HTTPS required — Webhook endpoints must use HTTPS.
- SSRF protection — Avala blocks delivery to private IPs, loopback addresses, and cloud metadata endpoints.
- No redirects — Webhook delivery does not follow HTTP redirects.
- Encrypted secrets — Webhook secrets are encrypted at rest and never exposed after creation.
- One subscription per URL — Each organization can have at most one subscription per target URL.