Get notified when a storyboard or script changes status, or when work made through the API or an AI connection changes.
Webhooks let you receive automatic notifications when something changes in your Boords workspace. Instead of polling the API to check for updates, Boords sends an HTTP request to your server when an event occurs, like a storyboard moving to Approved.
See also: Webhooks in API and webhooks, an overview of what you can automate with Boords.
Webhooks are currently in Beta alongside the Boords API. The core functionality is stable, but some details may change as we refine the experience.
You can create and manage webhook endpoints in Settings → Team → API, or via the API itself. Webhooks are available on paid plans, and you'll need an Owner or Admin role.
A few things to know:
project.created eventMost events fire for changes made through the Boords API or an AI connection, such as Claude or ChatGPT. Changes made in the Boords web app send only these events:
storyboard.updated, when anyone changes a storyboard's status, including a move between two of your team's statuses in the same category.script.updated, when anyone changes a script's status, including when the Boords Agent sets it.frame.created, when the Boords Agent adds frames to a storyboard.notification.created, for personal notification endpoints (see Personal notifications).Comments, frame edits, changes to a script's text or name, and new projects, storyboards or scripts made in the web app don't send team webhooks. To keep track of those, read the team activity feed with the API (GET /v1/teams/{team_id}/events).
Boords can notify your endpoint about the following events:
| Event | Fires when |
|---|---|
project.created | A new project is created |
project.updated | A project's name or details change |
project.archived | A project is archived |
| Event | Fires when |
|---|---|
storyboard.created | A new storyboard is created (including duplicates and new versions) |
storyboard.updated | A storyboard's status changes in the app or through the API, including a move between two of your team's statuses in the same category. Also fires when its name, details or frame order change through the API |
storyboard.archived | A storyboard is archived |
| Event | Fires when |
|---|---|
script.created | A new script is created |
script.updated | A script's status changes, in the app or through the API, including a move between two of your team's statuses in the same category. Also fires when its name or content change, or it's restored, through the API |
script.archived | A script is archived |
| Event | Fires when |
|---|---|
frame.created | A new frame is added to a storyboard, including frames the Boords Agent adds |
frame.updated | A frame's content or image changes |
frame.deleted | A frame is removed from a storyboard |
| Event | Fires when |
|---|---|
comment.created | A new comment is added to a frame |
comment.updated | A comment's text or status changes (e.g. marked as completed) |
comment.deleted | A comment is removed |
| Event | Fires when |
|---|---|
notification.created | You get an inbox notification: a mention, a reply, one of your comments marked complete or reopened, or a new comment on a storyboard you follow |
notification.created fires for comments made in the app as well as through the API. It covers storyboard comments only, not script comments.
It belongs to you rather than your team. Any team member can register one for their own account with a POST /v1/webhook_endpoints request. It can't be set up in Settings, and an endpoint can't mix it with team events.
Each webhook delivery includes a JSON payload with the event details:
{
"id": "evt_123",
"event": "frame.updated",
"occurred_at": "2026-01-25T15:22:41Z",
"data": {
"type": "frame",
"id": 12345,
"attributes": {
"storyboard_id": "s9bx1z",
"reference": "INT. OFFICE - DAY"
}
}
}The data object uses the same type, id and attributes as the matching API resource, so you can use the same parsing logic for both webhook payloads and API responses. It doesn't include the API's revision field, the previous values, or who made the change. To find out who changed a storyboard's or script's status, read the team activity feed.
Storyboard and script payloads carry two status fields. status is the status category: null for Draft, then in_progress, review_needed, changes_required or approved. custom_status is your team's own status, for example { "id": "<uuid>", "name": "Client review" }. A move between two statuses in the same category fires storyboard.updated or script.updated with status unchanged, so compare custom_status if you track your team's statuses. Editing your team's statuses in Team settings sends no webhooks, even when deleting a status moves items to its category's default.
Every webhook delivery includes a cryptographic signature so you can verify it genuinely came from Boords. This prevents attackers from sending fake events to your endpoint.
Each request includes two headers:
| Header | Contains |
|---|---|
X-Boords-Signature | HMAC SHA256 signature, as lowercase hex |
X-Boords-Timestamp | Unix timestamp of when the event was sent |
To verify a delivery:
.), and the raw request body: timestamp.raw_bodyX-Boords-Signature headerIf the signatures match, the request is authentic. We recommend always verifying signatures in production, though it's not strictly required to receive events.
Boords uses at-least-once delivery, which means:
id field to detect and skip duplicate eventsIf your endpoint is unavailable or returns an error (any non-2xx status code), Boords retries the delivery, waiting longer between each try. It makes 5 attempts in all, over about 6 minutes, and then stops. There's no delivery log or replay, so if your endpoint might be down for longer, use the API's updated_since filter to catch up.
X-Boords-Timestamp is more than a few minutes oldstoryboard.updated and script.updated fire for several kinds of change. Check status for the category, such as approved, or custom_status.id for one of your team's own statuses. A status keeps its id when your team renames it. The payload doesn't include the previous status, so store the last status you saw for each item and act only when it changesYes. Use Zapier's "Webhooks by Zapier" trigger, or a custom webhook in Make, to receive Boords webhook events. Point your Boords webhook at the Zapier or Make webhook URL, and you can start a workflow when a storyboard is approved, or when any other Boords event occurs.
Boords retries a failed delivery, waiting longer between each try. It makes 5 attempts in all, over about 6 minutes, and then stops. If your endpoint might be down for longer, use the API's updated_since filter to catch up on what changed.
It's strongly recommended for security, but not strictly required to receive events. Signature verification ensures that webhook deliveries genuinely come from Boords and haven't been tampered with.