Webhooks are the alternative to polling. Subscribe an HTTPS URL on your side to one or more event topics; we’ll POST a signed JSON payload every time something matters. Use them to rebuild a static site, fan out to Slack/Discord, sync orders to your warehouse, or refresh a CDN cache.Documentation Index
Fetch the complete documentation index at: https://docs.neuraldraft.io/llms.txt
Use this file to discover all available pages before exploring further.
Setup in 60 seconds
Stand up an endpoint
Any HTTPS URL that responds 2xx within 30 seconds. Keep it cheap;
do the heavy work asynchronously after acknowledging.
Subscribe
Create the endpoint via API or dashboard. The response includes a
signing_secret — store it; it’s shown only once.Event topics
| Topic | Fires when |
|---|---|
blog_post.published | A post transitions to status=published, manually or via scheduler. |
blog_post.translated | A post translation finishes (per language). |
social_post.published | A scheduled or on-demand publish succeeded on at least one platform. |
social_post.failed | All platforms in a post returned an error. |
order.created | A new Order row is created (manual or Stripe Checkout). |
order.paid | An Order transitions to payment_status=paid. |
order.fulfilled | An Order transitions to status=delivered. |
order.cancelled | An Order transitions to status=cancelled. |
order.refunded | A full or partial refund completes. |
booking.confirmed | A booking is confirmed (auto or manual). |
booking.cancelled | A booking is cancelled (admin or customer). |
booking.completed | A booking is marked complete after the appointment. |
content.changed | A translation key value changes — useful for SSG rebuild triggers. |
image.generated | An async image generation job completes. |
connect.account_updated | Stripe Connect status changes (onboarding, requirements). |
Delivery shape
Verifying the signature
The signature is a hex-encoded HMAC-SHA256 of the raw body (do not parse and re-stringify) using yoursigning_secret. The header is
t=<unix>,v1=<hex>; future signature versions will append additional
algorithms (e.g. v2=).
Retry behavior
If your endpoint doesn’t respond2xx within 30 seconds, we retry with
exponential backoff: 30 s, 2 m, 10 m, 1 h, 6 h. After 5 failed attempts the
delivery is marked failed and visible in the dashboard.
| Attempt | Delay since previous |
|---|---|
| 1 | (immediate) |
| 2 | 30 seconds |
| 3 | 2 minutes |
| 4 | 10 minutes |
| 5 | 1 hour |
| 6 | 6 hours |
data payload is always the resource as it stood at delivery time
(not the resource as it stands now). A redeliver replays the original payload.
Best practices
Acknowledge fast, work async
Acknowledge fast, work async
Return
2xx as soon as you’ve persisted the raw payload (or queued a job).
Don’t run business logic in the request handler — anything over a few
seconds risks a retry that double-processes.Idempotent processing
Idempotent processing
Treat
X-Neural-Draft-Delivery as the dedupe key. Index it; reject (and
2xx) duplicates. Retries happen — they’re a feature, not a bug.Replay protection
Replay protection
Reject deliveries with timestamps more than 5 minutes off. The verifier
helpers above do this for you.
Rotate secrets
Rotate secrets
Rotate the signing secret quarterly, or instantly if you suspect a leak.
The dashboard supports a transition window — both old and new secrets
accepted for up to 24 hours.
Monitor failures
Monitor failures
Subscribe a
webhook.delivery_failed event to your alerting; or watch the
last_delivery_status field on the endpoint resource. A failed state for
more than an hour is your cue to investigate.Use one endpoint per concern
Use one endpoint per concern
A single endpoint subscribed to many topics is fine; the
X-Neural-Draft-Event
header tells you which one. But splitting concerns by URL (orders, content,
bookings) makes failure isolation cleaner.