Webhook payloads

On this page 3

Every event this instance can send, generated from the module the payloads are built from.

Generated from OpenAPI 1.0.0.

The envelope

Every payload has the same shape, so a receiver can be written once:

{
  "event": "pr:opened",
  "delivered_at": "2026-08-13T10:00:00.000Z",
  "repository": { "full_name": "owner/name", "owner": "owner", "name": "name", "id": 1 },
  "sender": { "handle": "somebody", "id": 2 },
  "subject": { "type": "pull_request", "id": 3, "number": 12, "title": "A change", "url": "/owner/name/pull/12" },
  "action": "opened"
}

Three rules the shapes follow:

  • Numbers are numbers and times are ISO 8601 strings. Both survive JSON, both parse everywhere, and neither depends on knowing this instance's timezone.
  • sender is null when nothing did it. A scheduled action or a recovery sweep has no person behind it, and a receiver that assumes one crashes on the day it is missing.
  • Nothing is a database row. These are named fields chosen for the receiver, so a column rename here is not a breaking change to somebody's CI.

Signing

Each delivery carries a signature over the exact bytes sent. Verify it before trusting the body: a webhook endpoint that skips the check is an endpoint anybody can post to.

The events

EventSent when
pr:openedsomebody opened a pull request
pr:synchronizedthe head of an open pull request moved, so a review already written may be stale
pr:ready_for_reviewa draft became ready, and nothing else about it changed
pr:mergedthe work landed
pr:closedthe work will not land, and anything queued against it should stop
review:requestedsomebody is waiting on a specific reviewer
review:submitteda verdict arrived
issue:openedthere is something new to triage
issue:closedwork queued against it should stop
comment:createdsomebody replied
release:publisheda release went out
check:reporteda check run said something about a commit; action is its status
run:transitioneda workflow run changed state; action is the new one
job:transitionedone job of a run changed state; action is the new one
run:action_requireda run has stopped and needs somebody; action is approval, gate or event
artifact:expiredan artifact passed its date and was deleted; the file is already gone when this arrives
deployment:statusa deployment was recorded, changed state, or was rolled back; action is the state
status:reportedthe older commit-status API said something; action is its state
test:monitora rule about the tests changed state; action is alarm or recovered
test:flakya test crossed from steady to unreliable, once rather than every run
test:recordeda suite reported its results, with the totals and the run id to read the detail from

check:reported, status:reported, run:transitioned and job:transitioned carry an extra key - check, run or job - and put the new state in action, so one subscription covers a whole lifecycle and a receiver switches on one field.