Platform Webhook Events
Webhook events are categorized into two scopes:
- project events related to a specific project
- organization events related to the organization itself
For an overview of Platform Webhooks including delivery behavior and signing, see Platform Webhooks.
Platform Webhooks is an early access feature
Platform Webhooks is available to organizations on an early access allowlist. The API rejects a request from an organization outside the allowlist with 403 and the error code access_disabled.
Event envelope
Every event arrives in the same envelope regardless of type:
{
"id": "<event UUID>",
"type": "<event-type>",
"timestamp": "<ISO 8601 UTC>",
"payload": {
"organization_slug": "<org-slug>",
"project_ref": "<project-ref>"
// event-specific fields
}
}For example:
{
"id": "019f3c9c-c758-766d-acb2-94eb089b3f69",
"type": "v1.project.paused",
"timestamp": "2026-07-07T12:45:35.449Z",
"payload": {
"project_ref": "your-project-ref",
"organization_slug": "your-org-slug",
"actor": { "user_id": "6cf38595-f5ff-43ca-ba0f-84617bbe192e" }
}
}Organization scoped events always have project_ref set to null because they do not relate to a specific project.
The version prefix in the type field, such as v1, identifies the payload schema. For how versions change over time and how to handle an unrecognized version, see Versioning.
New fields can be added to an existing version without a version bump. Design your handler to ignore fields it does not recognize.
Common payload fields
actor
Represents a user who performed or triggered an action.
Present on all events. null when the event was triggered by an automated system process rather than a user.
"actor": {
"user_id": "6cf38595-f5ff-43ca-ba0f-84617bbe192e"
}is_test
Present only on test events sent through the Send a test event endpoint. Always true. Check this field before triggering any side effect.
Project events
Project events fire when a change occurs or an action is taken in a specific project. The payload always includes both non-nullable organization_slug and project_ref.
| Event | Fires when |
|---|---|
v1.project.created | A project is created |
v1.project.paused | A project is paused |
v1.project.restored | A paused project is restored |
v1.project.restarted | A project is restarted |
v1.project.removed | A project is deleted |
v1.project.transferred | A project is transferred to another organization |
v1.project.status.changed | A project's status transitions |
v1.project.backup.started | A project backup begins |
v1.project.branch.created | A preview branch is created |
v1.project.branch.updated | A preview branch is updated |
v1.project.branch.removed | A preview branch is deleted |
v1.project.created
Fires when a project is created and begins initial setup. When receiving this event, a project might not be healthy yet.
{
"actor": { "user_id": "6cf38595-f5ff-43ca-ba0f-84617bbe192e" },
"source": null
}source is null for projects created from scratch. When a project is cloned, source carries the origin:
"source": {
"type": "clone",
"project_ref": "abcdefghijklmnoprstu"
}v1.project.paused
Fires when a project is paused.
{
"reason": "inactivity",
"actor": null
}reason is one of the following:
| Value | Description |
|---|---|
api_request | Paused by a user via the API or dashboard. actor carries the user ID. |
inactivity | Paused automatically due to inactivity. actor is null. |
other | Paused for another system reason. actor is null. |
v1.project.restored
Fires when a paused project is restored. When receiving this event, a project might not be healthy yet.
{
"actor": { "user_id": "6cf38595-f5ff-43ca-ba0f-84617bbe192e" }
}v1.project.restarted
Fires when a project is restarted.
{
"actor": { "user_id": "6cf38595-f5ff-43ca-ba0f-84617bbe192e" }
}v1.project.removed
Fires when a project is deleted.
{
"actor": { "user_id": "6cf38595-f5ff-43ca-ba0f-84617bbe192e" }
}v1.project.transferred
Fires when a project is transferred to another organization. A corresponding event is emitted for both the source and the target organizations.
Use source and target to determine whether the transfer is outgoing or incoming from the perspective of the receiving organization.
{
"actor": { "user_id": "6cf38595-f5ff-43ca-ba0f-84617bbe192e" },
"source": { "organization_slug": "from-org" },
"target": { "organization_slug": "to-org" }
}v1.project.status.changed
Fires when a project's status transitions.
{
"previous_status": "RESTARTING",
"current_status": "ACTIVE_HEALTHY",
"actor": null
}previous_status and current_status are one of:
| Value | Description |
|---|---|
ACTIVE_HEALTHY | Project is running normally |
ACTIVE_UNHEALTHY | Project is running but has issues |
COMING_UP | Project is starting |
RESTARTING | Project is restarting |
RESTORING | Project is being restored from pause |
RESTORE_FAILED | Restore operation failed |
PAUSING | Project is in the process of pausing |
PAUSE_FAILED | Pause operation failed |
UPGRADING | Project is being upgraded |
RESIZING | Project is being resized |
GOING_DOWN | Project is shutting down |
INIT_FAILED | Initialization failed |
INACTIVE | Project is inactive |
REMOVED | Project has been removed |
UNKNOWN | Status cannot be determined |
actor is null for system-initiated transitions. This event fires during normal project operations such as restarts, upgrades, and scaling.
v1.project.backup.started
Fires when a project backup begins.
{
"actor": null
}actor is null for scheduled backups and carries a user_id when the backup is triggered manually.
v1.project.branch.created
Fires when a preview branch is created.
{
"branch": {
"ref": "abcdefghijklmnoprstu",
"name": "feature/login",
"git_branch": "feature/login",
"is_default": false
},
"actor": { "user_id": "6cf38595-f5ff-43ca-ba0f-84617bbe192e" }
}git_branch is null when the branch is not connected to a Git branch.
v1.project.branch.updated
Fires when a preview branch is updated.
{
"branch": {
"ref": "abcdefghijklmnoprstu",
"name": "feature/login",
"git_branch": "feature/login",
"is_default": false
},
"actor": { "user_id": "6cf38595-f5ff-43ca-ba0f-84617bbe192e" }
}git_branch is null when the branch is not connected to a Git branch.
v1.project.branch.removed
Fires when a preview branch is deleted.
{
"branch": {
"ref": "abcdefghijklmnoprstu",
"name": "feature/login",
"git_branch": "feature/login",
"is_default": false
},
"actor": { "user_id": "6cf38595-f5ff-43ca-ba0f-84617bbe192e" }
}git_branch is null when the branch is not connected to a Git branch.
Organization events
Organization events fire when something changes at the organization level. The payload always includes organization_slug and project_ref is always null.
| Event | Fires after |
|---|---|
v1.organization.member.invitation.created | A member is invited to the organization |
v1.organization.member.invitation.canceled | A pending invitation is canceled |
v1.organization.member.added | A member joins the organization |
v1.organization.member.removed | A member is removed from the organization |
v1.organization.member.role.assigned | A role is assigned to a member |
v1.organization.member.role.updated | An existing role assignment is updated |
v1.organization.member.role.removed | A role is removed from a member |
v1.organization.billing.plan.upgraded | The billing plan is upgraded |
v1.organization.billing.plan.downgraded | The billing plan is downgraded |
v1.organization.member.invitation.created
Fires when a member is invited to the organization.
{
"member": {
"invitation": {
"email": "user@example.com",
"role": {
"name": "Developer",
"projects": [{ "ref": "abcdefghijklmnoprstu" }]
}
}
},
"actor": { "user_id": "6cf38595-f5ff-43ca-ba0f-84617bbe192e" }
}role.projects is null for organization-wide roles that apply to all projects.
v1.organization.member.invitation.canceled
Fires when a pending invitation is canceled.
{
"member": {
"invitation": {
"email": "user@example.com"
}
},
"actor": { "user_id": "6cf38595-f5ff-43ca-ba0f-84617bbe192e" }
}v1.organization.member.added
Fires when a member joins the organization by accepting an invitation.
{
"member": {
"user_id": "6cf38595-f5ff-43ca-ba0f-84617bbe192e",
"primary_email": "user@example.com",
"role": {
"name": "Developer",
"projects": [{ "ref": "abcdefghijklmnoprstu" }]
}
},
"actor": { "user_id": "6cf38595-f5ff-43ca-ba0f-84617bbe192e" }
}role.projects is null for organization-wide roles that apply to all projects.
v1.organization.member.removed
Fires when a member is removed from the organization.
{
"member": {
"user_id": "6cf38595-f5ff-43ca-ba0f-84617bbe192e",
"primary_email": "user@example.com"
},
"actor": { "user_id": "6cf38595-f5ff-43ca-ba0f-84617bbe192e" }
}v1.organization.member.role.assigned
Fires when a role is assigned to a member.
{
"member": {
"user_id": "6cf38595-f5ff-43ca-ba0f-84617bbe192e",
"primary_email": "user@example.com",
"role": {
"name": "Developer",
"projects": [{ "ref": "abcdefghijklmnoprstu" }]
}
},
"actor": { "user_id": "6cf38595-f5ff-43ca-ba0f-84617bbe192e" }
}role.projects is null for organization-wide roles that apply to all projects.
v1.organization.member.role.updated
Fires when an existing role assignment is updated.
{
"member": {
"user_id": "6cf38595-f5ff-43ca-ba0f-84617bbe192e",
"primary_email": "user@example.com",
"role": {
"name": "Admin",
"projects": null
}
},
"actor": { "user_id": "6cf38595-f5ff-43ca-ba0f-84617bbe192e" }
}role.projects is null for organization-wide roles that apply to all projects.
v1.organization.member.role.removed
Fires when a role is removed from a member.
{
"member": {
"user_id": "6cf38595-f5ff-43ca-ba0f-84617bbe192e",
"primary_email": "user@example.com",
"role": {
"name": "Developer",
"projects": [{ "ref": "abcdefghijklmnoprstu" }]
}
},
"actor": { "user_id": "6cf38595-f5ff-43ca-ba0f-84617bbe192e" }
}role.projects is null for organization-wide roles that apply to all projects.
v1.organization.billing.plan.upgraded
Fires when the organization's billing plan is upgraded.
{
"billing": { "plan": "pro" },
"actor": { "user_id": "6cf38595-f5ff-43ca-ba0f-84617bbe192e" }
}plan is one of free, pro, team, or enterprise.
v1.organization.billing.plan.downgraded
Fires when the organization's billing plan is downgraded.
{
"billing": { "plan": "free" },
"actor": { "user_id": "6cf38595-f5ff-43ca-ba0f-84617bbe192e" }
}plan is one of free, pro, team, or enterprise.