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
| 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 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 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_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.