Skip to main content
Beta. This endpoint is new and its response shape may still change. It is the drill-down companion to Export Page Analytics: that endpoint tells you how much bots crawled each page, this one tells you exactly what HTML they got.
Returns, for one page of one domain, which rendered HTML snapshot each bot was served on each day — plus a download link for the HTML itself. This makes propagation lag visible: on the same day ClaudeBot may already hold your new content while GPTBot is still being served the previous version. Every response row is one date, with the bots nested inside.
Always call this endpoint from a server-side environment (backend API, serverless function, build script, etc.). Never include your API key in client-side code — it will be visible to anyone inspecting your frontend.
Programmatic (API key) access requires the Pro plan and above — requests from Starter accounts return 403 plan_upgrade_required.
Snapshot data begins on 2026-07-09 (legacyCutover). Windows that start earlier are automatically clamped to that date (the response echoes your original start as requestedStartDate); windows that end before it return 400 invalid_request.

One page per request

Unlike the other export endpoints, this one requires a url — there is no site-wide mode. Naming a single page keeps the query an index lookup instead of an aggregate over every path you own, which is what keeps it fast. Use Export Page Analytics to discover which pages to ask about: the path values it returns can be passed straight back here as url.

Request

Headers

Body Parameters

Window rules (same as the other export endpoints): period and startDate/endDate are mutually exclusive, dates must be real YYYY-MM-DD calendar dates, neither may be in the future, startDate ≤ endDate, and the span is capped at 365 days.

Example Request

Response

Success (200)

Fields

Why a bot can have several served entries in one day. A bot may be served from more than one place on the same day — some hits from cache, others from a fresh render — or it may see more than one version if you republished. Each combination is its own entry so nothing is lost; the bot’s total and tiers are the sum of them.

Downloading the HTML

htmlUrl is a temporary, pre-authorized link: fetch it with a plain GET, no Authorization header. It is served as plain text, so opening it in a browser shows the raw source rather than rendering the captured page.
Treat htmlUrl as a secret. Anyone with the link can read that page’s stored HTML until htmlUrlExpiresAt — roughly 24 hours — without authenticating. Don’t log these links or paste them anywhere public. For a durable reference that re-checks permissions on every request, keep the snapshotId and use Get Snapshot instead.
htmlUrl can be null. Snapshot HTML is retained on a rolling basis while the crawl history is kept indefinitely, so older entries may have metadata (contentHash, renderStatus, contentSizeBytes) with no downloadable copy left. The day-by-day record of which bot saw which version stays accurate either way.

Error Responses

A URL that resolves fine but has never been crawled returns 200 with an empty rows array and path populated — not a 404. That lets you tell “this page was never crawled” apart from “I sent a bad URL”.

Examples

Spotting propagation lag

Find dates where bots were not all on the same version of a page:

Auditing what a specific bot was served

Each API request counts against your monthly quota. pageSize counts days, so a single request can cover a whole 365-day window (pageSize: 400) rather than paging through it.