Webhooks
Receive real-time notifications when data changes. Webhooks are configured separately from API keys in Admin > Webhooks, and fire for both CMS and external API writes of a single record. Bulk CSV / JSON imports only send events to webhooks that opt in (see Bulk Imports below).
Configuration
Create a webhook in Admin > Webhooks by providing a URL endpoint and optional event subscriptions.
- URL - The HTTPS endpoint that will receive POST requests when events occur.
- Event subscriptions - Select which tables and actions should trigger the webhook: create, update and delete for single-record writes, plus create-many and update-many for rows written by a bulk import. If no subscriptions are added, the webhook receives every single-record event from all tables, but no bulk import events.
- Signing secret - Auto-generated for each webhook. Used to verify that payloads are authentic (see Verification docs).
How It Works
- A record is created, updated, or deleted (via CMS or API), or a bulk import creates or updates rows.
- The system checks which webhooks are subscribed to that event. Rows from a bulk import only match a subscription that includes create-many or update-many for that table.
- An event for each matching webhook is saved together with the change itself, so a saved change is never missing its events.
- The event is queued and sent as a POST request to the webhook's URL with the event payload.
- Your endpoint receives the payload and processes it.
Behavior
Deliveries never block the API response. Each attempt has a 5-second timeout. A delivery that fails (an error response, a redirect, a timeout or a network error) is retried up to 4 more times over about 10 minutes. If it still fails, it is kept as dead-lettered and a Super can replay it with
POST /api/v1/webhooks/replay.- Sensitive fields (passwords, 2FA secrets) are automatically stripped from the record payload.
- A delivery can occasionally arrive more than once. Use its
deliveryIdto ignore duplicates.
Bulk Imports
Rows written by a bulk import (a CSV or JSON upload in the Data Manager that creates new records or updates existing ones) only send events to a webhook that asks for them. To opt in, add a subscription for the table and tick create-many, update-many, or both.
- Each row sends its own event, with the same event name and payload as a single-record write:
product.createfor a created row,product.updatefor an updated one. - Only rows that actually change send an event. Rows skipped because nothing changed, and rows that fail, send nothing.
- Volume follows the file: a 10,000-row import sends 10,000 events to each opted-in webhook. Large imports send them batch by batch while the import runs. Make sure your endpoint can handle that load before you opt in.
- create-many and update-many don't include single-record events. Tick create and update as well to receive both.
- There is no bulk delete, so deletes always arrive one record at a time.
Next Steps
- Payloads & Events - Payload format, headers, and event naming conventions.
- Verification - How to verify webhook signatures with your signing secret.