Skip to content

API referenceWebhook events

run.completed

A webhook event: the signed JSON body we send to your endpoints.

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

HeaderDescription
X-ShortsIntel-Signaturet=<unix seconds>,v1=<hex HMAC-SHA256 over "<t>.<body>">; two v1 during a rotation overlap.
X-ShortsIntel-Event-IdThe event id, evt_..., same as the body's id.
X-ShortsIntel-Event-TypeThe 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 of run.completed, tracker.changed, webhook.testrun.completed, tracker.changed or webhook.test.
  • created_atstringrequiredformat date-timeWhen the event was created.
  • run_idstringrequirednullableThe Run behind the event.
  • kindstringrequirednullableThe Run's kind, lower case, e.g. research.
  • statusstringrequirednullablecompleted, partial or failed.
  • charge_creditsnumberrequirednullableWhat the Run cost, as GET /v1/runs/{id} shows it.
  • tracker_idstringrequirednullableOn tracker.changed.
  • change_report_idstringrequirednullableOn tracker.changed.
  • collectionsarray of objectOn tracker.changed only: 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.

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.