Skip to content

API referenceWebhook events

tracker.changed

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

When it fires

A Tracker cycle produced a Change Report. Quiet cycles send nothing.

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 tracker.changed 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_9tR2kPq7wXsL4mVbZf6HaQ",
  "type": "tracker.changed",
  "created_at": "2026-09-12T06:00:12.000Z",
  "run_id": "run_5e8d13a0f7",
  "kind": "tracker_cycle",
  "status": "completed",
  "charge_credits": 10,
  "tracker_id": "trk_4b1e90c7aa",
  "change_report_id": "chg_2ac910f4d8",
  "collections": [
    {
      "id": "col_7d20e1b5c4",
      "name": "Competitors"
    }
  ],
  "links": {
    "run": "https://www.shortsintel.com/v1/runs/run_5e8d13a0f7",
    "tracker": "https://www.shortsintel.com/v1/trackers/trk_4b1e90c7aa",
    "changes": "https://www.shortsintel.com/v1/trackers/trk_4b1e90c7aa/changes"
  }
}

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.