Buildkite · event: job.finished ·
content type: application/json
This is a representative sample — fake IDs, real structure. To see a payload with your data, point the provider at a capture URL (button below).
One click creates a free capture bin with this exact payload already in it — pretty-printed, headers inspectable, replayable to your own endpoint:
Then paste the bin's URL into Buildkite's webhook settings to capture a real delivery. No signup.
content-type: application/json x-buildkite-event: job.finished x-buildkite-signature: timestamp=1788511427,signature=a6b9dd2ed6fa8efa5f2c1f3c8313c709992d1c2dddf7d0ca574cb9708b11df0c
{
"event": "job.finished",
"job": {
"id": "b63254c0-3271-4a98-8270-7cfbd6c2f14e",
"graphql_id": "Sm9iLS0tYjYzMjU0YzAtMzI3MS00YTk4LTgyNzAtN2NmYmQ2YzJmMTRl",
"type": "script",
"name": ":package: Build",
"step_key": "build",
"agent_query_rules": [],
"state": "failed",
"web_url": "https://buildkite.com/acme/deploy-service/builds/482#b63254c0-3271-4a98-8270-7cfbd6c2f14e",
"log_url": "https://api.buildkite.com/v2/organizations/acme/pipelines/deploy-service/builds/482/jobs/b63254c0-3271-4a98-8270-7cfbd6c2f14e/log",
"command": "scripts/build.sh",
"soft_failed": false,
"exit_status": 1,
"signal": null,
"signal_reason": null,
"created_at": "2026-08-30 06:40:11 UTC",
"scheduled_at": "2026-08-30 06:40:11 UTC",
"runnable_at": "2026-08-30 06:40:12 UTC",
"started_at": "2026-08-30 06:40:19 UTC",
"finished_at": "2026-08-30 06:43:47 UTC",
"retried": false,
"retried_in_job_id": null,
"retries_count": null,
"retry_source": {
"job_id": "7f21c9d4-08b3-4e5a-9c66-d1e8f2a40b73",
"retry_type": "manual",
"retried_by": {
"name": "Ada Deveraux",
"email": "ada@acme.dev"
}
},
"agent": {
"id": "0192a8c4-77d1-4b0e-8f3a-5c6d9e2b1f08",
"name": "buildkite-agent-7c9f",
"web_url": "https://buildkite.com/organizations/acme/agents/0192a8c4-77d1-4b0e-8f3a-5c6d9e2b1f08"
}
},
"build": {
"id": "9e7a2c66-3f19-4a1d-8b52-c0de4f6a91b3",
"url": "https://api.buildkite.com/v2/organizations/acme/pipelines/deploy-service/builds/482",
"web_url": "https://buildkite.com/acme/deploy-service/builds/482",
"number": 482,
"state": "failing",
"branch": "main",
"commit": "59b20b8d5c6ff8d09518454d4dd8b7b30f095ab5",
"message": "fix: retry webhook deliveries on 5xx"
},
"pipeline": {
"id": "7f3b9d21-5a64-4c08-9e17-b2a8d0c4e6f5",
"url": "https://api.buildkite.com/v2/organizations/acme/pipelines/deploy-service",
"web_url": "https://buildkite.com/acme/deploy-service",
"name": "Deploy Service",
"slug": "deploy-service",
"repository": "git@github.com:acme/deploy-service.git",
"default_branch": "main"
},
"sender": {
"id": "8a7693f8-dbae-4783-9137-84090fce9045",
"name": "Ada Deveraux"
}
}
"timestamp.rawBody" (dot-joined), keyed with the webhook's
Token — here bk_wh_sample_token_Vq2mXr8Lp4Tz. Try
the signature debugger (Buildkite scheme) or
a capture bin's Buildkite scheme for live ✓/✗ badges. Full wire-format
notes on the build.finished example.job.scheduled,
job.started, job.finished, job.activated
(a block step unblocked via web/API), and job.promised_exit_status
(a running job declares an anticipated failure before finishing; state is
still running and a normal job.finished still follows).
Route on the event field, not just the header.retry_source tells you if this job is a retry:
null for first runs; otherwise the original job_id,
retry_type (manual / automatic) and
retried_by (null for automatic retries). Handlers that
count failures without checking it double-count retried jobs.exit_status with
soft_failed: true does not fail the build. And note the API
quirk: passed/failed are API-only aliases derived from exit
status — a finished wait-step job always counts as passed because it
never runs and has no exit status.async field to
job.finished: true means the parent continued immediately
regardless of the triggered build's result; false means it waited.Reproduce this delivery against any endpoint (your handler, a bin, staging):
$ curl -X POST https://your-endpoint.example/hook \
-H 'content-type: application/json' \
-H 'x-buildkite-event: job.finished' \
-H 'x-buildkite-signature: timestamp=1788511427,signature=a6b9dd2ed6fa8efa5f2c1f3c8313c709992d1c2dddf7d0ca574cb9708b11df0c' \
-d '{
"event": "job.finished",
"job": {
"id": "b63254c0-3271-4a98-8270-7cfbd6c2f14e",
"graphql_id": "Sm9iLS0tYjYzMjU0YzAtMzI3MS00YTk4LTgyNzAtN2NmYmQ2YzJmMTRl",
"type": "script",
"name": ":package: Build",
"step_key": "build",
"agent_query_rules": [],
"state": "failed",
"web_url": "https://buildkite.com/acme/deploy-service/builds/482#b63254c0-3271-4a98-8270-7cfbd6c2f14e",
"log_url": "https://api.buildkite.com/v2/organizations/acme/pipelines/deploy-service/builds/482/jobs/b63254c0-3271-4a98-8270-7cfbd6c2f14e/log",
"command": "scripts/build.sh",
"soft_failed": false,
"exit_status": 1,
"signal": null,
"signal_reason": null,
"created_at": "2026-08-30 06:40:11 UTC",
"scheduled_at": "2026-08-30 06:40:11 UTC",
"runnable_at": "2026-08-30 06:40:12 UTC",
"started_at": "2026-08-30 06:40:19 UTC",
"finished_at": "2026-08-30 06:43:47 UTC",
"retried": false,
"retried_in_job_id": null,
"retries_count": null,
"retry_source": {
"job_id": "7f21c9d4-08b3-4e5a-9c66-d1e8f2a40b73",
"retry_type": "manual",
"retried_by": {
"name": "Ada Deveraux",
"email": "ada@acme.dev"
}
},
"agent": {
"id": "0192a8c4-77d1-4b0e-8f3a-5c6d9e2b1f08",
"name": "buildkite-agent-7c9f",
"web_url": "https://buildkite.com/organizations/acme/agents/0192a8c4-77d1-4b0e-8f3a-5c6d9e2b1f08"
}
},
"build": {
"id": "9e7a2c66-3f19-4a1d-8b52-c0de4f6a91b3",
"url": "https://api.buildkite.com/v2/organizations/acme/pipelines/deploy-service/builds/482",
"web_url": "https://buildkite.com/acme/deploy-service/builds/482",
"number": 482,
"state": "failing",
"branch": "main",
"commit": "59b20b8d5c6ff8d09518454d4dd8b7b30f095ab5",
"message": "fix: retry webhook deliveries on 5xx"
},
"pipeline": {
"id": "7f3b9d21-5a64-4c08-9e17-b2a8d0c4e6f5",
"url": "https://api.buildkite.com/v2/organizations/acme/pipelines/deploy-service",
"web_url": "https://buildkite.com/acme/deploy-service",
"name": "Deploy Service",
"slug": "deploy-service",
"repository": "git@github.com:acme/deploy-service.git",
"default_branch": "main"
},
"sender": {
"id": "8a7693f8-dbae-4783-9137-84090fce9045",
"name": "Ada Deveraux"
}
}'