Subscribe to four events — pdf.generated, pdf.downloaded, pdf.expired, batch.completed — and we'll POST signed payloads to your URL with automatic retries (60s → 5m → 15m).
Notifications arrive within seconds of completion. Latency is bounded by your endpoint, not by a poll interval.
Every request carries X-Webhook-Signature: sha256=<hex>. Verify with your webhook secret to reject forged calls.
Register a hooks.slack.com URL and we'll send a Block Kit message with a download button — no Slack-specific code on your side.
| Use webhooks | Poll for status | |
|---|---|---|
| Completion latency | Within seconds | Bounded by your poll interval |
| Server load | One request per completion | Items × poll count |
| Receiver setup | Public HTTPS endpoint required | Client-only, no inbound endpoint |
| Slack/Discord delivery | Just register the URL | Build it yourself |
// Register a webhook endpoint
await fetch("/api/webhooks", {
method: "POST",
headers: { "Authorization": `Bearer ${API_KEY}` },
body: JSON.stringify({
url: "https://your-app.example.com/hooks/pdf",
events: ["pdf.generated", "batch.completed"],
}),
});
// Verify the X-Webhook-Signature header on incoming requests:
// sha256=HMAC_SHA256(payload, webhook_secret)
//
// 5xx responses are retried with backoff: 60s → 5m → 15m (3 tries total).
// Slack incoming-webhook URLs auto-receive Block Kit payloads.