Entwicklerdokumentation

Themen auflisten

GET/sites/{siteId}/topics
Berechtigung
search:read
MCP-Tool
topics

Pages grouped into topics, with search totals per topic The website's pages grouped by the folder of their address and the words their Search Console queries share. Groups smaller than minPages go to ungrouped (with search data) or uncovered (crawled content pages without impressions). Pages are matched without scheme, www. and trailing slash. Deterministic: the same data gives the same ids and names. Kept for an hour per website and period; computed at most 2 times per website per minute.

Die Beschreibungen kommen aus dem OpenAPI-Dokument und sind auf Englisch.

Parameter

NameOrtDetails
siteIdPflichtPfadstringWebsite id, from GET /sites.
startQuerydate (YYYY-MM-DD)First day, YYYY-MM-DD (from works too); with end. Default: the last 28 days of final data (ending 3 days ago). At most 16 months.
endQuerydate (YYYY-MM-DD)Last day, YYYY-MM-DD (to works too), not in the future. Alone: the 28 days ending there.
sortQueryclicksopportunitypagesimpressionsdefault clicksopportunity: topics with many pages but weak clicks first (largest clicksShort).
minPagesQueryintegerdefault 2, min 1, max 50Smallest topic, in pages (min_pages works too).
limitQueryintegerdefault 50, min 1, max 200Most topics returned, 1 to 200.

Antwort

200 · application/json

FeldDetails
periodobject · required; The period asked for
period.fromdate (YYYY-MM-DD) · required; First day
period.todate (YYYY-MM-DD) · required; Last day
queriesWindowobject or null · required; The 28 days the top queries cover; null when no page × query pairs are stored
queriesWindow.fromdate (YYYY-MM-DD) · required; First day
queriesWindow.todate (YYYY-MM-DD) · required; Last day
sortclicks | opportunity | pages | impressions · required; Order of topics
minPagesinteger · required; Smallest topic, in pages
searchDatatrue or false · required; Any page had Search Console impressions in the period
pagesCappedtrue or false · required; More than 20,000 Search Console pages: the 20,000 with the most impressions were grouped
totalTopicsinteger · required; Topics of at least minPages pages
topicslist of object · required; Topics, in the asked order, at most limit
topics[].idstring · required; Stable id: the same data gives the same id
topics[].namestring · required; Readable name
topics[].nameFromqueries | section | page · required; What the name comes from: shared query words, the address folder, or one page
topics[].sectionstring or null · required; The address folder all pages share, if one
topics[].wordslist of string · required; The shared query words the name is made of (empty unless nameFrom is queries)
topics[].pageCountinteger · required; Pages in the topic
topics[].pagesWithoutSearchDatainteger · required; Pages without impressions in the period
topics[].pageslist of object · required; Its pages, most clicks first (at most 50)
topics[].pages[].urlstring · required; Page address
topics[].pages[].clicksinteger · required; Clicks in the period
topics[].pages[].impressionsinteger · required; Impressions in the period
topics[].pages[].positionnumber or null · required; Average position; null without impressions
topics[].pagesTruncatedtrue or false · required; More than 50 pages
topics[].clicksinteger · required; Clicks in the period
topics[].impressionsinteger · required; Impressions in the period
topics[].ctrnumber · required; Clicks divided by impressions, a fraction (0.05 = 5%), computed from sums
topics[].positionnumber or null · required; Average position weighted by impressions; null without impressions
topics[].clicksPer28Daysnumber · required; Clicks scaled to 28 days
topics[].strengthstrong | weak | no_clicks · required; strong: at least 5 clicks per page per 28 days; weak: fewer; no_clicks: none
topics[].clicksShortnumber · required; Clicks per 28 days short of strong (0 when strong)
topics[].topQuerieslist of object · required; Top queries of the topic (at most 10), from the stored page × query pairs
topics[].topQueries[].querystring · required; Query
topics[].topQueries[].clicksinteger · required; Clicks
topics[].topQueries[].impressionsinteger · required; Impressions
topics[].topQueries[].ctrnumber · required; Clicks divided by impressions, a fraction (0.05 = 5%), computed from sums
topics[].topQueries[].positionnumber · required; Average position in Google, weighted by impressions (1 is the top)
ungroupedobject · required; Pages with search data that are in no listed topic
ungrouped.pageCountinteger · required; Pages with search data in groups smaller than minPages
ungrouped.clicksinteger · required; Their clicks
ungrouped.impressionsinteger · required; Their impressions
ungrouped.pageslist of object · required; Those pages, most clicks first (at most 50)
ungrouped.pages[].urlstring · required; Page address
ungrouped.pages[].clicksinteger · required; Clicks in the period
ungrouped.pages[].impressionsinteger · required; Impressions in the period
ungrouped.pages[].positionnumber or null · required; Average position; null without impressions
uncoveredobject · required; Crawled content pages Google does not show
uncovered.pageCountinteger · required; Crawled content pages with no impressions, in groups smaller than minPages
uncovered.pageslist of object · required; Those pages (at most 200)
uncovered.pages[].urlstring · required; Page address
uncovered.pages[].sectionstring or null · required; Its address folder
uncovered.truncatedtrue or false · required; More than 200
cachedtrue or false · required; Answered from the hour-long cache
computedAtstring · required; When the grouping was computed
notestring · required; How topics are built
linkstring · required; The Pages screen in the app

Hinweise

GET /sites/{siteId}/topics gruppiert die Seiten der Website in Themen: Seiten, die einen Ordner in ihrer Adresse teilen oder deren Search-Console-Suchanfragen gemeinsame Wörter haben. Es nutzt nur die gecrawlten Seiten und die Search-Console-Daten, die MonoRanks bereits speichert.

Jedes Thema hat id, name, pageCount, bis zu 50 pages (jede mit url, clicks, impressions, position), clicks, impressions, ctr, position (nach Impressionen gewichtet), clicksPer28Days, strength und bis zu 10 topQueries. Die Antwort listet außerdem ungrouped-Seiten (in Gruppen kleiner als minPages) und uncovered-Seiten (gecrawlte Inhaltsseiten ohne Impressionen im Zeitraum).

Was Details
strength strong heißt mindestens 5 Klicks pro Seite in 28 Tagen, weak weniger, no_clicks keine. clicksShort sagt, wie viele Klicks pro 28 Tage einem Thema bis strong fehlen.
sort clicks (Standard), opportunity (viele Seiten, aber wenige Klicks zuerst), pages oder impressions.
Zeitraum start und end (YYYY-MM-DD; from und to gehen auch). Standard: die letzten 28 Tage mit endgültigen Search-Console-Daten, endend vor 3 Tagen. end darf nicht in der Zukunft liegen.
minPages das kleinste Thema, 1 bis 50 Seiten (Standard 2). min_pages geht auch.
  • Dieselben Daten ergeben immer dieselben Themen, IDs und Namen. Eine Antwort wird pro Website und Zeitraum eine Stunde lang aufbewahrt.

Fehler

StatusBedeutung
400Bad request. Codes: bad_period, period_too_long, bad_sort, bad_limit, bad_min_pages.
401Missing, unknown or revoked key. Codes: missing_key, invalid_key.
403The key lacks the scope, covers another website, or its owner lost access. Codes: missing_scope, other_site, owner_left, no_owner, forbidden.
404Not found. Codes: not_found.
429A limit is reached. rate_limited: too many requests this hour for this key. Codes: rate_limited.

Beispielanfrage

curl \
  -H "Authorization: Bearer mr_ws_…" \
  "https://app.monoranks.com/api/v1/sites/SITE_ID/topics"

Beispielantwort

{
  "period": {
    "from": "2026-09-06",
    "to": "2026-10-03"
  },
  "queriesWindow": {
    "from": "2026-09-04",
    "to": "2026-10-01"
  },
  "sort": "clicks",
  "minPages": 2,
  "searchData": true,
  "pagesCapped": false,
  "totalTopics": 14,
  "topics": [
    {
      "id": "t_8f3a2c1d",
      "name": "gravel bike",
      "nameFrom": "queries",
      "section": null,
      "words": [
        "gravel",
        "bike"
      ],
      "pageCount": 6,
      "pagesWithoutSearchData": 1,
      "pages": [
        {
          "url": "https://acmebikes.com/guides/how-to-choose-a-gravel-bike",
          "clicks": 912,
          "impressions": 24300,
          "position": 6.8
        },
        {
          "url": "https://acmebikes.com/bikes/gravel",
          "clicks": 655,
          "impressions": 18120,
          "position": 9.1
        }
      ],
      "pagesTruncated": false,
      "clicks": 1840,
      "impressions": 51200,
      "ctr": 0.0359,
      "position": 8.3,
      "clicksPer28Days": 1840,
      "strength": "strong",
      "clicksShort": 0,
      "topQueries": [
        {
          "query": "best gravel bike under 1500",
          "clicks": 214,
          "impressions": 8650,
          "ctr": 0.0247,
          "position": 7.9
        }
      ]
    }
  ],
  "ungrouped": {
    "pageCount": 9,
    "clicks": 140,
    "impressions": 6100,
    "pages": [
      {
        "url": "https://acmebikes.com/about",
        "clicks": 31,
        "impressions": 420,
        "position": 3.4
      }
    ]
  },
  "uncovered": {
    "pageCount": 3,
    "pages": [
      {
        "url": "https://acmebikes.com/bikes/kids/balance-bike-12",
        "section": "bikes"
      }
    ],
    "truncated": false
  },
  "cached": false,
  "computedAt": "2026-10-06T08:14:02.311Z",
  "note": "Pages grouped into topics by their address and their Search Console queries. …",
  "link": "https://app.monoranks.com/sites/3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6f4c13/pages"
}

Der MCP-Server macht dasselbe mit dem Tool topics.