run.completed
When it fires
A Run reached a terminal state: completed, partial or failed. The type is run.completed for all three; branch on status in the payload.
We POST it to every active endpoint you registered with the Webhooks endpoints. A 2xx acknowledges it; anything else is retried. The webhooks guide covers delivery, retries and replays.
Headers
| Header | Description |
|---|---|
X-ShortsIntel-Signature | t=<unix seconds>,v1=<hex HMAC-SHA256 over "<t>.<body>">; two v1 during a rotation overlap. |
X-ShortsIntel-Event-Id | The event id, evt_..., same as the body's id. |
X-ShortsIntel-Event-Type | The dotted event type, same as the body's type. |
Payload
application/json, the same shape for every event; fields that do not apply to run.completed are null or left out.
object
The thin webhook payload, exactly the bytes that were signed.
idstringrequiredEvent id,evt_.... Stable for one fact: a replay or a re-emission carries the same id, so dedupe on it.typestringrequiredone ofrun.completed,tracker.changed,webhook.testrun.completed,tracker.changedorwebhook.test.created_atstringrequiredformatdate-timeWhen the event was created.run_idstringrequirednullableThe Run behind the event.kindstringrequirednullableThe Run's kind, lower case, e.g.research.statusstringrequirednullablecompleted,partialorfailed.charge_creditsnumberrequirednullableWhat the Run cost, asGET /v1/runs/{id}shows it.tracker_idstringrequirednullableOntracker.changed.change_report_idstringrequirednullableOntracker.changed.collectionsarray of objectOntracker.changedonly: the Collections the Tracker sits in as of the event, by id and name, so you can route changes without a lookup. Absent on other events.idstringrequiredThe Collection's id.namestringrequiredThe Collection's name.
linksmap of stringrequiredAbsolute URLs to fetch the detail with your own key:run,tracker,changes, andwebhookon a test event.
Example payload
Indented for reading. The bytes on the wire are compact, and the signature covers those raw bytes.
{
"id": "evt_Xq3bN7tLw2RkV9pMdC4sYe",
"type": "run.completed",
"created_at": "2026-09-12T08:00:41.000Z",
"run_id": "run_c07a41bb92",
"kind": "research",
"status": "completed",
"charge_credits": 120,
"tracker_id": null,
"change_report_id": null,
"links": {
"run": "https://www.shortsintel.com/v1/runs/run_c07a41bb92"
}
}Verifying the signature
Verify the signature header against the raw body before you trust or parse it. The webhooks guide walks through it with a worked example and verifiers in TypeScript and Python: Verifying a signature.