Programmatic (API key) access requires the Pro plan and above — requests
from Starter accounts return
403 plan_upgrade_required. The Export all
(JSON) button in the Analytics dashboard is
available on all plans.Request
Headers
Body Parameters
Choose the reporting window in one of two ways — a rollingperiod, or an explicit startDate/endDate range. The two are mutually exclusive.
The window applies to every domain in the response. By default the export covers every domain your account can access; pass
domainId to scope it to one.
Fetching non-overlapping reports. Use
startDate/endDate to page through
history in adjacent, gap-free chunks (e.g. one month at a time) without
double-counting. The response echoes back the resolved startDate and
endDate, so your next request can start the day after the previous
endDate. Both bounds are inclusive, so advance by one day to avoid
overlap.400 invalid_request:
periodandstartDate/endDatecannot be combined.endDatecannot be sent on its own — it requires astartDate.- Dates must be real calendar dates in
YYYY-MM-DDform (e.g.2026-02-30is rejected). startDatemust not be afterendDate, and neither may be in the future.- The range may span at most 365 days (inclusive), the same cap as the
365dperiod.
Example Request
Rolling period:Response
Success (200)
Each
botSeries entry contains a count for every bot listed in
botTotals. The example above is trimmed to a few bots for brevity; the
actual response includes all of them, with 0 where there was no traffic.Fields
Granular bot breakdown
Every bot is reported as its own field. The bots that the dashboard and PDF report fold into “Other” and “Other social” each appear individually here:
The named bots already shown in reports are also present individually:
googlebot, googleextendedbot, bingbot, openaibot, anthropicbot, perplexitybot, twitterbot, facebookbot, and linkedinbot.
social_other is a catch-all for social crawlers that can’t be identified
individually. It’s reported as its own field rather than merged into another bot.Error Responses
When you receive a 429, the
usage and limit fields tell you where you stand against your monthly quota. Per-minute limits (60 req/min) reset automatically after 60 seconds. See Authentication for plan limits.Examples
JavaScript / Node.js
Paging through history without overlap
Because both bounds are inclusive, start each window the day after the previousendDate to fetch adjacent, gap-free chunks:
Prefer a one-off download? The Analytics dashboard has
an Export all (JSON) button that produces the same document for the
selected period without needing an API key — and it’s available on every plan.