List change reports
/v1/trackers/{id}/changesThis Tracker's Change Reports, newest first, readable after the Tracker is deleted. Each item is { id, tracker_id, run_id, cycle_key, triggers, changes, summary, created_at }. changes holds one key per tripped trigger, each with before/after numbers: followers { before, after, change, change_pct }; new_videos { since, count, videos }; outliers and velocity lists whose entries carry before (null for a video new to the Tracker) and after. Advertiser Trackers: new_ads { since, count, ads }; stopped_ads { count, ads } (an Ad that left Meta's library counts as stopped, with removed_from_library: true); variant_growth entries { before, after, added }; new_countries_or_placements entries { countries, placements } listing only what is new; every Ad entry carries id, library_id and its Ad Library url; truncated: true when the cycle stopped at its page cap with Ads left unread, incomplete: true when the library failed part-way through the read (the Run's result says so too). Hashtag Trackers: median_views { before, after, change, change_pct, sample_based: true }; new_top_videos { since, count, videos }, each video { id, url, views }. Sound Trackers: video_count { before, after, change, change_pct } (rises only); new_top_video { since, before, after }, each side { id, url, views }. Quiet cycles are absent by design: if a day produced no report, nothing tripped that day.
Price
Free.
Parameters
| Name | In | Type | Required | Default | Description |
|---|---|---|---|---|---|
id | path | string | Required | — | Tracker id. |
limit | query | integermin 1; max 100 | Optional | 25 | Items per page. |
cursor | query | string | Optional | — | Opaque next_cursor from the previous page. |
Responses
200 OK
{ items, next_cursor }.
object
itemsarray of objectrequiredidstringrequiredtracker_idstringrequiredrun_idstringrequirednullablecycle_keystringrequiredOne report per Tracker per cycle.triggersarray of stringrequiredCreator:new_videos,followers,outlier,velocity. Advertiser:new_ads,stopped_ads,variant_growth,new_countries_or_placements.changesanyThe before/after numbers behind the triggers.summarystringrequirednullablecreated_atstringrequired
next_cursorstringrequirednullablePass back ascursor. Null on the last page.
200 · `{ items, next_cursor }`.
{
"items": [
{
"id": "chg_2ac910f4d8",
"tracker_id": "trk_4b1e90c7aa",
"run_id": "run_c07a41bb92",
"cycle_key": "tiktok:creator:someone:2026-09-08",
"triggers": [
"new_videos",
"outlier"
],
"changes": {
"new_videos": {
"before": 61,
"after": 62,
"count": 1,
"videos": [
{
"id": "7300000000000000000",
"url": "https://www.tiktok.com/@someone/video/7300000000000000000",
"posted_at": "2026-09-05T06:32:11.000Z",
"views": 1284000
}
]
},
"outliers": [
{
"id": "7300000000000000000",
"url": "https://www.tiktok.com/@someone/video/7300000000000000000",
"views": 1284000,
"outlier": 4.21,
"threshold": 3
}
]
},
"summary": "1 new video, 1 outlier at 4.2x median",
"created_at": "2026-09-08T04:00:11.402Z"
}
],
"next_cursor": null
}400 Bad Request
invalid_request for a cursor that is not a next_cursor this API issued. Nothing is charged.
object
RFC 9457 problem document, served as application/problem+json. Branch on code, never on the prose.
typestringrequiredtitlestringrequiredstatusintegerrequiredcodestringrequiredone ofmissing_authorization,invalid_key,key_revoked,invalid_token,organization_not_selected,organization_access_revoked,connection_revoked,forbidden,invalid_request,unsupported_platform,unsupported_kind,kind_deprecated,not_found,video_too_long,idempotency_conflict,run_not_ready,advertiser_ambiguous,insufficient_balance,rate_limit_exceeded,concurrency_limit_exceeded,tracker_limit_exceeded,webhook_limit_exceeded,webhook_rotation_in_progress,collection_limit_exceeded,collection_name_taken,collection_kind_mismatch,media_unavailable,vendor_error,source_unavailable,service_unavailable,internal_errorStable machine-readable code.detailstring
400 · Example
{
"type": "https://www.shortsintel.com/docs/reference/errors/invalid_request",
"title": "Invalid request",
"status": 400,
"code": "invalid_request",
"detail": "`cursor` is not a cursor this API issued. Pass back the `next_cursor` from the previous page."
}401 Unauthorized
missing_authorization, invalid_key, key_revoked or invalid_token.
object
RFC 9457 problem document, served as application/problem+json. Branch on code, never on the prose.
typestringrequiredtitlestringrequiredstatusintegerrequiredcodestringrequiredone ofmissing_authorization,invalid_key,key_revoked,invalid_token,organization_not_selected,organization_access_revoked,connection_revoked,forbidden,invalid_request,unsupported_platform,unsupported_kind,kind_deprecated,not_found,video_too_long,idempotency_conflict,run_not_ready,advertiser_ambiguous,insufficient_balance,rate_limit_exceeded,concurrency_limit_exceeded,tracker_limit_exceeded,webhook_limit_exceeded,webhook_rotation_in_progress,collection_limit_exceeded,collection_name_taken,collection_kind_mismatch,media_unavailable,vendor_error,source_unavailable,service_unavailable,internal_errorStable machine-readable code.detailstring
401 · Example
{
"type": "https://www.shortsintel.com/docs/reference/errors/invalid_key",
"title": "Invalid key",
"status": 401,
"code": "invalid_key",
"detail": "That API key does not exist. Keys look like `sk_live_...` and are created in the console."
}404 Not Found
not_found — including anything belonging to another Customer.
object
RFC 9457 problem document, served as application/problem+json. Branch on code, never on the prose.
typestringrequiredtitlestringrequiredstatusintegerrequiredcodestringrequiredone ofmissing_authorization,invalid_key,key_revoked,invalid_token,organization_not_selected,organization_access_revoked,connection_revoked,forbidden,invalid_request,unsupported_platform,unsupported_kind,kind_deprecated,not_found,video_too_long,idempotency_conflict,run_not_ready,advertiser_ambiguous,insufficient_balance,rate_limit_exceeded,concurrency_limit_exceeded,tracker_limit_exceeded,webhook_limit_exceeded,webhook_rotation_in_progress,collection_limit_exceeded,collection_name_taken,collection_kind_mismatch,media_unavailable,vendor_error,source_unavailable,service_unavailable,internal_errorStable machine-readable code.detailstring
404 · Example
{
"type": "https://www.shortsintel.com/docs/reference/errors/not_found",
"title": "Not found",
"status": 404,
"code": "not_found",
"detail": "No such resource for this Customer."
}Request samples
curl "https://www.shortsintel.com/v1/trackers/trk_4b1e90c7aa/changes?limit=25" \
-H "Authorization: Bearer sk_live_YOUR_KEY"const response = await fetch(
"https://www.shortsintel.com/v1/trackers/trk_4b1e90c7aa/changes?limit=25",
{
method: "GET",
headers: {
"Authorization": "Bearer sk_live_YOUR_KEY",
},
},
);
if (!response.ok) {
throw new Error(`ShortsIntel ${response.status}`);
}
const data = await response.json();import requests
response = requests.get(
"https://www.shortsintel.com/v1/trackers/trk_4b1e90c7aa/changes?limit=25",
headers={
"Authorization": "Bearer sk_live_YOUR_KEY",
},
)
response.raise_for_status()
data = response.json()Related guides
- Pagination: Following
next_cursorthrough a list. - Trackers: Standing watches on a creator or a Meta Advertiser: how a cycle runs, when it reports a change, and how to pause one.