Tracking lists
Read a project’s tracking lists through the API: interests, categories, publishers, trends and mention lists, with their items, metrics, roll-ups and matched publications.
Tracking lists are the watchlists you build in the app under TRACKING — interests, categories, publishers, trends and mentions. These endpoints read them back, read-only: the lists a project owns, the items inside each one, the same per-item analytics the tracking pages render, the side-panel roll-ups, and — for mention lists — the publications that matched. Everything is scoped to the project your API key belongs to, and every endpoint here requires the key in the X-API-Key header (or Authorization: Bearer).
#The five kinds
A list has exactly one kind, and the kind decides what an item’s key is. The four item kinds live in one family; mention lists are the fifth and are shaped differently — their items are keywords, and they carry scan state.
entity— a person, organisation, place, event or product.keyis the entity UUID, or, for lists built before entity resolution, the plain entity name (both are accepted and returned verbatim).category— a Google category path, case-sensitive, e.g./Finance/Investing/Stocks & Bonds.publisher— a clean domain, lower-case and withoutwww., e.g.example-sport.com.trend— a trend UUID, the same id used by the Trends API and byhttps://app.d2tr.com/trend/<id>.mention— a keyword watchlist. Items are terms: a keyword plus a match type (broad,phraseorexact), so one keyword watched in two modes counts as two terms.
#Scope: markets, window, history
The three analytics endpoints (/metrics, /rollup, /matches) share one scope model, and the resolved scope is echoed back so you can log exactly what you measured.
countrystringoptionaldefaultall- ISO 3166-1 alpha-2 (
us,de,ru) orall. An explicit country must be one of the key’s markets, otherwise403.allmeans “every market this key is entitled to”, and the resolved set comes back inscope.markets. langstringoptionaldefaultall- ISO 639-1 language code (
en,ru) orall. periodstringoptionaldefault7d24h,7d,30d, orcustom. Withcustomyou must senddate_fromanddate_to.date_fromstring (ISO-8601)optional- Start of a custom window, UTC. Clamped to your plan’s history — see below.
date_tostring (ISO-8601)optional- End of a custom window, UTC. Defaults to now.
grainstringoptionaldefaultdayhourorday. Drives bucket size for time series;houris only sensible on short windows. Not accepted on/matches.
#List the project’s tracking lists
/v1/tracking/listsAPI keyEvery list the key’s project owns, newest-updated first, with its item count and the project’s quota usage per kind. This is the index you call first — the list ids feed every other endpoint on this page.
kindstringoptional- Restrict to one kind:
entity,category,publisher,trendormention. Omit for all five. Any other value returns422. project_idstring (UUID)optional- Internal keys only. Self-serve keys are already bound to a project and may not override it.
limitintegeroptionaldefault50- Page size,
1–200. offsetintegeroptionaldefault0- Page offset,
0or greater.
curl -s "https://d2tr.com/api/v1/tracking/lists?limit=2" \
-H "X-API-Key: $D2TR_API_KEY"{
"lists": [
{
"id": "7a4f1d90-3c62-4e88-9b01-2ad5f0c91b44",
"kind": "entity",
"name": "Competitors",
"color_index": 2,
"item_count": 18,
"created_at": "2026-06-02T09:11:00+00:00",
"updated_at": "2026-09-10T14:32:00+00:00"
},
{
"id": "c0d8b512-77ae-41f5-9f2c-0b6e1f33ac10",
"kind": "mention",
"name": "Brand watch",
"color_index": 0,
"item_count": 516,
"countries": ["RU", "US"],
"langs": ["RU", "EN"],
"search_scope": "title",
"match_types": ["exact", "phrase"],
"active": true,
"matches_count": 12843,
"new_publications_24h": 17,
"last_scanned_at": "2026-09-12T05:00:11+00:00",
"next_scan_at": "2026-09-12T06:00:00+00:00",
"scan_status": "succeeded",
"scan_error": null,
"created_at": "2026-05-14T11:02:00+00:00",
"updated_at": "2026-09-12T05:00:11+00:00"
}
],
"usage": {
"entity": { "used": 18, "limit": 1800 },
"category": { "used": 30, "limit": 1010 },
"publisher": { "used": 11, "limit": 1010 },
"trend": { "used": 3, "limit": null },
"mention": { "used": 516, "limit": 1500 }
},
"total": 7,
"limit": 2,
"offset": 0
}#List detail with items
/v1/tracking/lists/{list_id}API keyOne list and everything in it. Items come back newest-added first and are not paginated — lists are small by design (a few dozen items; mention lists cap at 300 keywords / 900 terms).
list_idstring (UUID)required- The list to fetch. Lists of both families resolve through this one route.
curl -s "https://d2tr.com/api/v1/tracking/lists/7a4f1d90-3c62-4e88-9b01-2ad5f0c91b44" \
-H "X-API-Key: $D2TR_API_KEY"{
"id": "7a4f1d90-3c62-4e88-9b01-2ad5f0c91b44",
"kind": "entity",
"name": "Competitors",
"color_index": 2,
"item_count": 3,
"created_at": "2026-06-02T09:11:00+00:00",
"updated_at": "2026-09-10T14:32:00+00:00",
"items": [
{
"key": "c6e08b32-91d4-4f0a-8e77-5b20c1d9a4e3",
"name": "Politics of South America",
"type": "topic",
"added_at": "2026-09-10T14:32:00+00:00"
},
{
"key": "Chuvashia",
"name": "Chuvashia",
"type": null,
"added_at": "2026-07-21T08:04:00+00:00"
},
{
"key": "5f0b9c71-2d3e-4a16-bb88-90c7e2143d55",
"name": "Example Motors",
"type": "organization",
"added_at": "2026-06-02T09:12:00+00:00"
}
]
}{
"id": "c0d8b512-77ae-41f5-9f2c-0b6e1f33ac10",
"kind": "mention",
"name": "Brand watch",
"color_index": 0,
"item_count": 4,
"countries": ["RU", "US"],
"langs": ["RU", "EN"],
"search_scope": "title",
"active": true,
"mentions": ["example motors", "example ev"],
"match_types": ["exact", "phrase"],
"items": [
{
"id": "b2c1e0a9-8f77-4d33-90ab-1c2d3e4f5a60",
"raw_text": "example motors",
"match_type": "exact",
"position": 0,
"matches_count": 8123,
"added_at": "2026-05-14T11:02:00+00:00"
},
{
"id": "d4e5f6a7-1b2c-4d3e-8f90-a1b2c3d4e5f6",
"raw_text": "example motors",
"match_type": "phrase",
"position": 1,
"matches_count": 3390,
"added_at": "2026-05-14T11:02:00+00:00"
}
],
"matches_count": 12843,
"new_publications_24h": 17,
"extraction_started_at": "2026-05-14T11:02:00+00:00",
"last_scanned_at": "2026-09-12T05:00:11+00:00",
"next_scan_at": "2026-09-12T06:00:00+00:00",
"scan_status": "succeeded",
"scan_error": null,
"created_at": "2026-05-14T11:02:00+00:00",
"updated_at": "2026-09-12T05:00:11+00:00"
}#List metrics
/v1/tracking/lists/{list_id}/metricsAPI keyThe per-item table you see on a tracking list page: impressions, publications and the movement against the previous window, one row per item, plus a summary for the page you requested. Rows are returned for every requested item — an item with no activity in the window comes back with zeros rather than disappearing, so you can drive a stable table from it.
list_idstring (UUID)required- The list to measure.
countrystringoptionaldefaultall- Market, or
allfor every entitled market. See Scope. langstringoptionaldefaultall- Language filter, or
all. periodstringoptionaldefault7d24h,7d,30dorcustom.date_fromstring (ISO-8601)optional- Required with
period=custom. Clamped to the plan’s history window. date_tostring (ISO-8601)optional- Required with
period=custom. grainstringoptionaldefaultdayhourorday.limitintegeroptionaldefault50- Items per call,
1–200. One call measures exactly one page of items. offsetintegeroptionaldefault0- Item offset,
0or greater. Items are ordered newest-added first.
curl -s "https://d2tr.com/api/v1/tracking/lists/7a4f1d90-3c62-4e88-9b01-2ad5f0c91b44/metrics?country=us&lang=en&period=7d&grain=day&limit=2" \
-H "X-API-Key: $D2TR_API_KEY"#Entity rows
{
"list_id": "7a4f1d90-3c62-4e88-9b01-2ad5f0c91b44",
"kind": "entity",
"scope": {
"country": "us",
"markets": ["us"],
"lang": "en",
"from": "2026-09-05T00:00:00+00:00",
"to": "2026-09-12T00:00:00+00:00",
"grain": "day",
"prev_from": "2026-08-29T00:00:00+00:00",
"prev_to": "2026-09-05T00:00:00+00:00",
"history_days": 30,
"clamped": false
},
"items": [
{
"key": "c6e08b32-91d4-4f0a-8e77-5b20c1d9a4e3",
"name": "Politics of South America",
"resolved_id": "c6e08b32-91d4-4f0a-8e77-5b20c1d9a4e3",
"resolved_type": "topic",
"impressions": 1243500,
"publications_count": 41,
"publishers_count": 12,
"trends_count": 3,
"avg_position": 3.2,
"delta_pct": 18.4,
"rank_delta": 2,
"lived_hours": 96.5,
"avg_lifespan_hours": 31.2,
"impressions_spark": [0, 0, 1200, 8400, 19000, 41000, 88000, 120000, 96000, 74000,
51000, 40000, 33000, 28000, 24000, 19000, 15000, 12000,
9000, 7000, 5200, 3900, 2400, 1100],
"publications_spark": [0, 0, 1, 2, 3, 5, 6, 4, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
"related": ["Brazil", "Argentina", "Mercosur"],
"last_seen": "2026-09-11T18:40:00+00:00"
},
{
"key": "Chuvashia",
"name": "Chuvashia",
"resolved_id": null,
"resolved_type": null,
"impressions": 0,
"publications_count": 0,
"publishers_count": 0,
"trends_count": 0,
"avg_position": null,
"delta_pct": null,
"rank_delta": null,
"lived_hours": null,
"avg_lifespan_hours": null,
"impressions_spark": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"publications_spark": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"related": [],
"last_seen": null
}
],
"summary": {
"scope": "page",
"impressions": 1243500,
"publications_count": 41,
"publishers_count": 12,
"trends_count": 3,
"delta_pct": 18.4,
"impressions_spark": [0, 0, 1200, 8400, 19000, 41000, 88000, 120000, 96000, 74000,
51000, 40000, 33000, 28000, 24000, 19000, 15000, 12000,
9000, 7000, 5200, 3900, 2400, 1100]
},
"total": 18,
"limit": 2,
"offset": 0
}#Category rows
Same envelope; key is the taxonomy path and there is no resolved_type. Related items are sibling categories.
{
"key": "/Finance/Investing/Stocks & Bonds",
"name": "/Finance/Investing/Stocks & Bonds",
"resolved_id": "/Finance/Investing/Stocks & Bonds",
"impressions": 884200,
"publications_count": 233,
"publishers_count": 54,
"trends_count": 9,
"avg_position": 4.1,
"delta_pct": -6.2,
"rank_delta": -1,
"impressions_spark": [ "…24 integers…" ],
"publications_spark": [ "…24 integers…" ],
"related": ["/Finance/Investing", "/Finance/Banking"],
"last_seen": "2026-09-11T21:05:00+00:00"
}#Publisher rows
key is the domain; requested domains are matched case-insensitively and with or without www.. related carries the publisher’s top entities rather than sibling publishers.
{
"key": "example-sport.com",
"name": "Example Sport",
"resolved_id": "example-sport.com",
"impressions": 2410900,
"publications_count": 512,
"trends_count": 27,
"avg_position": 2.8,
"delta_pct": 11.9,
"rank_delta": 3,
"impressions_spark": [ "…24 integers…" ],
"publications_spark": [ "…24 integers…" ],
"related": ["Premier League", "Example FC"],
"last_seen": "2026-09-11T23:12:00+00:00"
}#Trend rows
Trend items add the forecast block the app shows on a tracked trend, and carry the trend’s label and lifecycle state.
{
"key": "3f8b1c2a-9d44-4e10-8f21-77a0c6b5e123",
"name": "Champions League final",
"resolved_id": "3f8b1c2a-9d44-4e10-8f21-77a0c6b5e123",
"state": "hot",
"impressions": 5120400,
"publications_count": 428,
"publishers_count": 96,
"avg_position": 2.4,
"delta_pct": null,
"impressions_spark": [ "…24 integers…" ],
"publications_spark": [ "…24 integers…" ],
"forecast": {
"pct_next24h": 12.5,
"pct_next7d": -38.0,
"pct_next30d": -71.2,
"predicted_total_reach": 6100000,
"predicted_end_at": "2026-09-19T00:00:00+00:00",
"confidence": 0.62
},
"cabinet_url": "https://app.d2tr.com/trend/3f8b1c2a-9d44-4e10-8f21-77a0c6b5e123",
"last_seen": "2026-09-11T19:40:00+00:00"
}#Mention rows
For a mention list, an “item” is a term, and the row counts the publications it matched inside the window. summary adds a time series at the requested grain.
{
"list_id": "c0d8b512-77ae-41f5-9f2c-0b6e1f33ac10",
"kind": "mention",
"scope": {
"country": "all",
"markets": ["ru", "us"],
"lang": "all",
"from": "2026-09-05T00:00:00+00:00",
"to": "2026-09-12T00:00:00+00:00",
"grain": "day",
"prev_from": "2026-08-29T00:00:00+00:00",
"prev_to": "2026-09-05T00:00:00+00:00",
"history_days": 30,
"clamped": false
},
"items": [
{
"key": "example motors|exact",
"term_id": "b2c1e0a9-8f77-4d33-90ab-1c2d3e4f5a60",
"name": "example motors",
"match_type": "exact",
"publications_count": 214,
"impressions": 980400,
"impressions_spark": [ "…24 integers…" ],
"last_seen": "2026-09-11T20:15:00+00:00"
}
],
"summary": {
"scope": "page",
"publications_count": 214,
"impressions": 980400,
"timeseries": [
{ "ts": "2026-09-05T00:00:00+00:00", "urls": 24, "impressions": 108200 },
{ "ts": "2026-09-06T00:00:00+00:00", "urls": 31, "impressions": 142900 }
]
},
"total": 4,
"limit": 50,
"offset": 0
}#List roll-up
/v1/tracking/lists/{list_id}/rollupAPI keyThe side panels of a tracking list page, aggregated over the whole list rather than a page of items: who published, which trends the list rode, what it co-occurs with. Not paginated — each block is a short top-N.
list_idstring (UUID)required- The list to aggregate.
countrystringoptionaldefaultall- Market, or
all. See Scope. langstringoptionaldefaultall- Language filter, or
all. periodstringoptionaldefault7d24h,7d,30dorcustom.date_fromstring (ISO-8601)optional- Required with
period=custom. Clamped to the plan’s history window. date_tostring (ISO-8601)optional- Required with
period=custom.
curl -s "https://d2tr.com/api/v1/tracking/lists/7a4f1d90-3c62-4e88-9b01-2ad5f0c91b44/rollup?country=all&period=7d" \
-H "X-API-Key: $D2TR_API_KEY"{
"list_id": "7a4f1d90-3c62-4e88-9b01-2ad5f0c91b44",
"kind": "entity",
"scope": {
"country": "all",
"markets": ["ru", "us"],
"lang": "all",
"from": "2026-09-05T00:00:00+00:00",
"to": "2026-09-12T00:00:00+00:00",
"prev_from": "2026-08-29T00:00:00+00:00",
"prev_to": "2026-09-05T00:00:00+00:00",
"history_days": 30,
"clamped": false
},
"item_count": 18,
"publishers": [
{ "name": "example-sport.com", "pubs": 84, "imps": 1820400, "delta_pct": 7.1 }
],
"trends": [
{
"id": "3f8b1c2a-9d44-4e10-8f21-77a0c6b5e123",
"name": "Champions League final",
"pubs": 31,
"imps": 640200,
"delta_pct": 22.8
}
],
"related": [
{ "name": "Brazil", "entity_id": "1a2b3c4d-5e6f-4071-8293-a4b5c6d7e8f9", "pubs": 12, "imps": 210400 }
],
"groups": [{ "name": "Sports", "pubs": 96, "imps": 2410900 }],
"types": [{ "name": "organization", "pubs": 58, "imps": 1340200 }]
}{
"list_id": "c0d8b512-77ae-41f5-9f2c-0b6e1f33ac10",
"kind": "mention",
"scope": { "country": "all", "markets": ["ru", "us"], "lang": "all", "from": "…", "to": "…" },
"publishers": [{ "name": "example-news.ru", "urls": 143 }],
"entities": [{ "name": "Example Motors", "urls": 96 }],
"categories": [{ "name": "/Autos & Vehicles", "urls": 88 }]
}#Mention matches
/v1/tracking/lists/{list_id}/matchesAPI keyThe publications a mention list matched, newest first, with the hits that produced each match. This endpoint exists only for kind=mention; calling it on any other list returns 400 and {"code": "kind_mismatch"}.
list_idstring (UUID)required- A mention list.
countrystringoptionaldefaultall- Market, or
all. Resolved against both the list’s own countries and the key’s markets — a country the list does not watch yields an empty payload, not an error. langstringoptionaldefaultall- Language filter. A language outside the list’s
langsyields an empty payload. date_fromstring (ISO-8601)optional- Window start, clamped to the plan’s history window. Publications are filtered on when the article was first seen in Discover.
date_tostring (ISO-8601)optional- Window end. Defaults to now.
mentionstring (repeatable)optional- Restrict to one or more keywords, e.g.
&mention=example+motors&mention=example+ev. match_typesstringoptional- Comma-separated subset of
broad,phrase,exact. scopestringoptionaldefaultall- Where the hit occurred:
all,title,bodyorboth. qstringoptional- Free-text filter over the matched publications (title and domain).
limitintegeroptionaldefault200- Number of publications,
1–1000. It bounds publications, not hits.
curl -s "https://d2tr.com/api/v1/tracking/lists/c0d8b512-77ae-41f5-9f2c-0b6e1f33ac10/matches?country=us&lang=en&scope=title&limit=1" \
-H "X-API-Key: $D2TR_API_KEY"{
"list_id": "c0d8b512-77ae-41f5-9f2c-0b6e1f33ac10",
"kind": "mention",
"scope": {
"country": "us",
"markets": ["us"],
"lang": "en",
"from": "2026-09-05T00:00:00+00:00",
"to": "2026-09-12T00:00:00+00:00",
"history_days": 30,
"clamped": false
},
"publications": [
{
"id": "e4db50a5-77a2-4fa0-bdd7-4f2386e671f3",
"url": "https://www.example-news.com/example-motors-q3",
"cabinet_url": "https://app.d2tr.com/article/e4db50a5-77a2-4fa0-bdd7-4f2386e671f3",
"title": "Example Motors beats Q3 delivery estimates",
"publisher": "Example News",
"domain": "example-news.com",
"country": "US",
"lang": "EN",
"first_seen_at": "2026-09-11T07:31:00+00:00",
"article_first_seen_at": "2026-09-11T06:58:00+00:00",
"snippet": "…Example Motors beats Q3 delivery estimates…"
}
],
"hits": {
"e4db50a5-77a2-4fa0-bdd7-4f2386e671f3": {
"count": 2,
"mentions": [
{
"term_id": "b2c1e0a9-8f77-4d33-90ab-1c2d3e4f5a60",
"raw_text": "example motors",
"match_type": "exact",
"field": "title",
"matched_text": "Example Motors",
"snippet": "…Example Motors beats Q3 delivery estimates…"
}
]
}
},
"summary": {
"matches": 318,
"publications": 214,
"mentions": { "example motors": 214, "example ev": 104 }
},
"limit": 1
}#Linking back into the app
Every publication the API returns carries a cabinet_url — the canonical link to that article inside the app, ready to paste into a report, a Slack message or a ticket. It is an additive field: it appears on the mention publications[] above, on the trend roll-up’s top_articles[], and on the existing article payloads of Articles, Trend articles and the Discover feed. Nothing was removed or renamed to make room for it.
You can also build it yourself from the id you already have. Article pages take the URL id — the field is called id on v1 article payloads and url_id on v2 feed payloads, and both are the same identifier:
# from a v1 payload: .articles[].id
# from a v2 payload: .items[].url_id
# from /matches: .publications[].id
https://app.d2tr.com/article/<url_id>
# tracked trends (item key of a kind=trend list, or .trends[].id)
https://app.d2tr.com/trend/<trend_id>curl -s "https://d2tr.com/api/v1/tracking/lists/$LIST/matches?country=us&limit=50" \
-H "X-API-Key: $D2TR_API_KEY" \
| jq -r '.publications[] | [.article_first_seen_at, .domain, .cabinet_url] | @tsv'#Errors
The shared status codes and their bodies are documented under Errors & rate limits. These are the ones specific to tracking lists — the machine-readable ones carry an object in detail with a stable code:
403 project_key_required— the key is not bound to a project (an internal or legacy key). Create a key inProject → API Access. Internal keys may instead pass?project_id=.403 market_not_entitled— the key is market-scoped but its project has no markets, socountry=allresolves to nothing. Add markets inProject → Settings.403(region) — an explicitcountryoutside the key’s markets:"API key not authorised for region FR. Allowed: ['RU', 'US']".404—{"detail": "tracking list not found"}: unknown id, or a list owned by another project.400 kind_mismatch—/matchescalled on a list that is notkind=mention.422 list_too_large—/rollupon a list with more than500items; the body echoes thelimit. Plain validation failures (badkind,limitout of range,period=customwithout dates) return the usual422list.503 computing— the aggregate was not in cache and took too long to build. It is being computed in the background: honourRetry-After(about 15 s) and repeat the identical request.
{
"detail": {
"code": "project_key_required",
"message": "Use a project API key (dt_live_…) from Project → API Access"
}
}{
"detail": {
"code": "computing",
"message": "Metrics are being computed, retry shortly"
}
}