How do I subscribe to webhooks?
Register a webhook URL at /account/webhooks/. We POST events (tool.run.completed, workflow.completed, etc.) with HMAC-signed payloads.
Last updated: 2026-05-04
Registering a webhook
- Sign in (Pro or above).
- Visit /account/webhooks/.
- Click Add webhook.
- Enter URL (must be HTTPS), pick events, add a description.
- Save — we send a
webhook.testping immediately to confirm your endpoint is reachable.
Available events
| Event | Fired when |
|---|---|
| `tool.run.completed` | A tool finishes (success or failure) |
| `tool.run.failed` | A tool errors out |
| `workflow.completed` | A workflow run finishes |
| `workflow.failed` | A workflow errors mid-step |
| `agent.completed` | An agent task completes |
| `subscription.upgraded` | You upgraded tier |
| `subscription.cancelled` | Cancellation activated |
| `usage.threshold` | You hit 80% / 100% of your monthly quota |
Payload shape
{
"event": "tool.run.completed", "timestamp": "2026-05-04T12:34:56Z", "webhook_id": "wh_abc123", "data": { "run_id": "run_xyz789", "tool_slug": "blog-post-generator", "status": "success", "output_url": "https://aicentraltools.com/account/runs/run_xyz789", "tokens_used": 1240 } }</code></pre>
Verifying signatures
We send X-AICT-Signature: sha256=<hex> computed as HMAC-SHA256 of the raw body using your webhook secret.
import hmac, hashlib
expected = hmac.new( webhook_secret.encode(), request.body, hashlib.sha256 ).hexdigest() if not hmac.compare_digest(expected, request.headers['X-AICT-Signature'].split('=')[1]): abort(401)</code></pre>
Retry policy
If your endpoint returns non-2xx, we retry with exponential backoff: 30s → 5min → 1h → 6h → 24h (5 attempts total). After 5 failures the webhook is paused; you'll be emailed.
Was this helpful?
Still stuck? Contact support