Developer docs

Get page history

GET/sites/{siteId}/pages/{pageId}/history
Scope
pages:read
MCP tool
page_history

What changed on a page, audit by audit From stored readings (nothing is crawled), newest first; kept for 12 months. wordCount changes count from 10 words and 5 percent; robots is reported only when noindex stayed the same.

Parameters

NameInDetails
siteIdRequiredpathstringWebsite id, from GET /sites.
pageIdRequiredpathstringPage id, from GET /sites/{siteId}/pages.
limitqueryintegerdefault 30, min 1, max 100Entries to return, 1 to 100.

Response

200 · application/json

FieldDetails
pageobject · required
page.idstring · required; Page id
page.urlstring · required; Page address
entrieslist of values · required; Newest first
entries[].crawlIdstring
entries[].atstring
entries[].kindstring
entries[].statusnumber
entries[].redirectHopsnumber
entries[].pageScorenumber
entries[].aeoScorenumber
entries[].wordCountnumber
entries[].titlestring
entries[].firsttrue or false
entries[].noSnapshottrue or false
entries[].changeslist of objects
entries[].changes[].fieldstring
entries[].changes[].beforestring
entries[].changes[].afterstring
moretrue or false · required; Older entries exist
notestring · required; How the entries are compared
linkstring · required; The page history in the app

Notes

GET /sites/{siteId}/pages/{pageId}/history (or GET /sites/{siteId}/pages/history?url=) says what changed on one page from one audit or recheck to the next, newest first. It uses what MonoRanks stored when it read the page; nothing is crawled for it. The app shows the same timeline on the page’s detail screen.

{
  "page": { "id": "…", "url": "https://example.com/pricing/" },
  "entries": [
    { "crawlId": "…", "at": "2026-10-01T09:12:00Z", "kind": "recheck", "status": 200, "redirectHops": 0, "pageScore": 86, "aeoScore": 71,
      "wordCount": 912, "title": "Pricing – Example", "first": false, "noSnapshot": false,
      "changes": [ { "field": "title", "before": "Pricing", "after": "Pricing – Example" }, { "field": "pageScore", "before": 78, "after": 86 } ] }
  ],
  "more": true, "note": "…", "link": "https://app.monoranks.com/sites/SITE_ID/pages/PAGE_ID#history"
}
What Details
What is compared field is one of status, redirect, title, description, h1, headings (number of H2 headings), canonical, noindex, robots, wordCount, schemaTypes, internalLinks, pageScore and aeoScore. An empty changes list means nothing changed.
Small moves are not changes Word count must move by at least 10 words and 5%. Spacing in titles and the order of schema types are ignored.
Outages noSnapshot is true when the reading had no readable HTML. That entry shows only the status change, and the next reading is compared with the last one that had readable HTML.
How far back Readings are kept for 12 months; first marks the oldest one kept. Rechecks and page scores are stored from version 1.0.92 on, so older entries have pageScore and aeoScore set to null.

Errors

StatusMeaning
400Bad request. Codes: bad_limit, missing_page.
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.
429Too many requests this hour for this key. Codes: rate_limited.

Example request

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

Example response

{
  "page": {
    "id": "c7a9e1b3-5d7f-4b9c-8e1a-3c5e7a9b1d2f",
    "url": "https://acmebikes.com/products/trail-pro-29"
  },
  "entries": [
    {
      "crawlId": "d4f6a8c0-2e4a-4c6e-8a0c-4e6a8c0e2a4b",
      "at": "2026-10-04T02:41:12.000Z",
      "kind": "audit",
      "status": 200,
      "redirectHops": 0,
      "pageScore": 86,
      "aeoScore": 71,
      "wordCount": 842,
      "title": "Trail Pro 29 Mountain Bike | Acme Bikes",
      "first": false,
      "noSnapshot": false,
      "changes": [
        {
          "field": "title",
          "before": "Trail Pro 29 | Acme Bikes",
          "after": "Trail Pro 29 Mountain Bike | Acme Bikes"
        },
        {
          "field": "pageScore",
          "before": 79,
          "after": 86
        }
      ]
    },
    {
      "crawlId": "e5a7c9e1-3f5b-4d7f-9b1d-5f7b9d1f3b5c",
      "at": "2026-09-27T02:38:51.000Z",
      "kind": "audit",
      "status": 200,
      "redirectHops": 0,
      "pageScore": 79,
      "aeoScore": 71,
      "wordCount": 836,
      "title": "Trail Pro 29 | Acme Bikes",
      "first": true,
      "noSnapshot": false,
      "changes": []
    }
  ],
  "more": false,
  "note": "One entry per audit or recheck that read this page, newest first.",
  "link": "https://app.monoranks.com/sites/3f6c2a1e-8b4d-4c7a-9e21-5d0b7a6f4c13/pages/c7a9e1b3-5d7f-4b9c-8e1a-3c5e7a9b1d2f#history"
}

The MCP server does the same with the tool page_history.