Discover

Authenticated feed and realtime endpoints for URL-level Google Discover intelligence.

The v2 feed is the fast, paginated stream of per-URL profiles — the consolidated data surface built around a single super-method, the discover_url_profile dossier per (url, country, language). Three endpoints cover it: /v2/feed for a filtered, windowed list, /v2/live for the freshest items only, and /v2/feed/{url_id} for every market profile of one URL. All three require an API key and are region-scoped to your key. Send the key in a header — X-API-Key: <key> or Authorization: Bearer <key>; there is no query-parameter auth.

#List the feed

GET/v2/feedAPI key

Filtered, region-scoped feed of full URL profiles. Filter by country, language, category and entity; window it with period (or a custom date_from/date_to range) and sort by any impressions window or timestamp. Returns a paginated envelope with items, total, and the echoed limit/offset.

Query parameters
countrystringoptional
ISO 3166-1 alpha-2 (e.g. us, ru). Validated against your key's region scope; out-of-scope returns 403.
langstringoptional
ISO 639-1 language code (e.g. en, ru).
categorystringoptional
Google NL category. Multiple values are ;-separated.
entitystringoptional
Knowledge Graph id (/m/...) or normalized name. Multiple values are ;-separated.
matchstringoptionaldefault any
How multiple categories/entities combine: any or all.
periodstringoptional
1h, 24h, 7d, 30d or custom. A non-custom period sets date_from = now() - window. Omitting it defaults the sort to impressions_24h.
date_fromstringoptional
ISO 8601 lower bound. Used when period=custom (or when no period is given).
date_tostringoptional
ISO 8601 upper bound. Ignored (forced to null) for non-custom periods.
sort_bystringoptionaldefault derived
One of impressions_1h, impressions_24h, impressions_7d, impressions_30d, first_seen, last_seen, avg_position. An unknown value returns 400.
sort_orderstringoptionaldefault desc
asc or desc.
include_markdownbooloptionaldefault false
Include the full article markdown (markdown_content). Disables response caching.
limitintoptionaldefault 50
Page size, 1–200.
offsetintoptionaldefault 0
Rows to skip; must be >= 0.
curl
curl "https://d2tr.com/api/v2/feed?country=us&lang=en&category=/Sports&period=24h&limit=2" \
  -H "X-API-Key: $D2TR_API_KEY"
Response
{
  "items": [
    {
      "url_id": "6f1c2e0a-8d5b-4a9e-9c2f-1a2b3c4d5e6f",
      "url": "https://example.com/big-game-recap",
      "domain": "example.com",
      "favicon": "https://example.com/favicon.ico",
      "country": "us",
      "language": "en",
      "title": "Big Game Recap: Late Comeback Stuns Fans",
      "summary": "A fourth-quarter surge decided the match…",
      "publisher": "Example Sports",
      "first_seen": "2026-07-01T08:12:00+00:00",
      "last_seen": "2026-07-01T14:03:00+00:00",
      "lifespan": "05:51:00",
      "avg_position": 3.4,
      "impressions": {
        "last_1h":  { "current": 1200,  "previous": 900,    "delta_pct": 33.3 },
        "last_24h": { "current": 48200, "previous": 41000,  "delta_pct": 17.5 },
        "last_7d":  { "current": 210000,"previous": 180000, "delta_pct": 16.6 },
        "last_30d": { "current": 210000,"previous": null,   "delta_pct": null },
        "breakdown": { "hourly_24h": [800, 1100, "…"], "daily_30d": [12000, "…"] }
      },
      "content_language": "en",
      "content_language_fit": true,
      "date_published": "2026-07-01T08:00:00+00:00",
      "date_modified": "2026-07-01T13:40:00+00:00",
      "article_meta": {
        "meta_title": "Big Game Recap",
        "meta_description": "Late comeback stuns fans.",
        "headline": "Late Comeback Stuns Fans",
        "section": "Sports"
      },
      "enrichment": {
        "actors": ["Team A", "Team B"],
        "topic": ["sports", "football"],
        "format_group": "news",
        "format_type": "recap",
        "entities": { "people": ["…"], "orgs": ["…"] }
      },
      "categories": [{ "name": "/Sports", "confidence": 0.92 }],
      "rss_feeds": null,
      "trend": {
        "trend_id": "b1a2c3d4-0000-1111-2222-333344445555",
        "name": "Championship Final",
        "semantic_type": "event_based",
        "key_entities": ["Team A", "Team B"],
        "key_topics": ["football"]
      },
      "entities": [{ "kg_id": "/m/02xyz", "name": "Team A", "type": "org" }],
      "images": [
        {
          "source_url": "https://example.com/img/hero.jpg",
          "width": 1200,
          "height": 630,
          "content_type": "image/jpeg",
          "storage_urls": {
            "original": "https://<supabase>/…/orig.jpg",
            "w512": "https://<supabase>/…/w512.jpg",
            "w256": "https://<supabase>/…/w256.jpg",
            "w128": "https://<supabase>/…/w128.jpg",
            "w64":  "https://<supabase>/…/w64.jpg"
          }
        }
      ],
      "markdown_content": null,
      "refreshed_at": "2026-07-01T14:05:00+00:00"
    }
  ],
  "total": 137,
  "limit": 2,
  "offset": 0
}

#Realtime: the live feed

GET/v2/liveAPI key

The freshest materials only — items first seen within a recent window, always sorted first_seen descending. Same filters as /v2/feed, but the window is expressed as since_minutes and the sort is fixed (not caller-controllable). Ideal for polling for newly-surfaced URLs.

Query parameters
countrystringoptional
ISO alpha-2, region-scoped.
langstringoptional
ISO 639-1 language code.
categorystringoptional
Google NL category; ;-separated for multiple.
entitystringoptional
Knowledge Graph id (/m/...) or name; ;-separated for multiple.
matchstringoptionaldefault any
any or all.
since_minutesintoptionaldefault 60
How far back counts as "fresh", 5–1440.
include_markdownbooloptionaldefault false
Include markdown; disables caching.
limitintoptionaldefault 50
Page size, 1–200.
offsetintoptionaldefault 0
Rows to skip; must be >= 0.
curl
curl "https://d2tr.com/api/v2/live?country=us&since_minutes=120&limit=1" \
  -H "Authorization: Bearer $D2TR_API_KEY"
Response
{
  "since": "2026-07-01T12:05:00+00:00",
  "items": [
    {
      "url_id": "9a8b7c6d-1234-5678-9abc-def012345678",
      "url": "https://news.example/breaking",
      "title": "Breaking: …",
      "country": "us",
      "language": "en",
      "first_seen": "2026-07-01T13:58:00+00:00",
      "impressions": {
        "last_1h": { "current": 340, "previous": null, "delta_pct": null },
        "…": "…"
      },
      "…": "…"
    }
  ],
  "total": 12,
  "limit": 1,
  "offset": 0
}

#One URL, every market

GET/v2/feed/{url_id}API key

Every market (country/language) profile for a single URL. One URL can surface in several markets, each with its own metrics, so this returns a bare JSON array of feed items — no pagination wrapper. Restricted keys only see their in-scope markets.

Path & query parameters
url_idstringrequired
Path segment — the urls.id UUID.
include_markdownbooloptionaldefault true
Query — include markdown_content. Note this defaults to true here, unlike /v2/feed and /v2/live.
curl
curl "https://d2tr.com/api/v2/feed/6f1c2e0a-8d5b-4a9e-9c2f-1a2b3c4d5e6f?include_markdown=false" \
  -H "X-API-Key: $D2TR_API_KEY"
Response
[
  {
    "url_id": "6f1c2e0a-8d5b-4a9e-9c2f-1a2b3c4d5e6f",
    "country": "us",
    "language": "en",
    "title": "Big Game Recap: Late Comeback Stuns Fans",
    "impressions": { "…": "…" },
    "…": "…"
  },
  {
    "url_id": "6f1c2e0a-8d5b-4a9e-9c2f-1a2b3c4d5e6f",
    "country": "gb",
    "language": "en",
    "title": "Big Game Recap: Late Comeback Stuns Fans",
    "impressions": { "…": "…" },
    "…": "…"
  }
]