Getting Started
The Sitechecker Public REST API gives you programmatic access to your projects and to the data behind them — Site Audit findings, page-level details, the saved segments you group pages by, the change history Site Monitoring records over time, Google Search Console and Google Analytics 4 performance, tracked keyword rankings, and how the site shows up in Google AI Overview and AI chat assistants.
Every endpoint is a GET over HTTPS, returns JSON, and is authenticated with a
Bearer API key.
Quickstart
Section titled “Quickstart”-
Create an API key in Account Settings → API keys and copy it.
API KeysStep-by-step, with screenshots of the creation and revoke flow. -
Put the key in your environment rather than in the command itself, so it stays out of your shell history and out of version control.
Terminal window export SITECHECKER_API_KEY="sk_live_..." -
Call the projects endpoint. It needs no parameters, which makes it the quickest way to confirm the key works.
Terminal window curl https://sitechecker.pro/api/v1/projects \-H "Authorization: Bearer $SITECHECKER_API_KEY" -
Take the
project_idfrom the response. Every other endpoint is scoped to a project and takes it as a parameter.
Base URL
Section titled “Base URL”All endpoints live under a single versioned prefix:
https://sitechecker.pro/api/v1This is the host this copy of the docs is built against, and the API reference alongside it defaults to the same one — so the examples below can be run as they are.
Authentication
Section titled “Authentication”Send your API key as a Bearer token in the Authorization header of every request.
There is no other auth scheme — no session cookie, no key in the query string.
curl https://sitechecker.pro/api/v1/projects \ -H "Authorization: Bearer $SITECHECKER_API_KEY"const response = await fetch('https://sitechecker.pro/api/v1/projects', { headers: { Authorization: `Bearer ${process.env.SITECHECKER_API_KEY}` },});
const { data, meta } = await response.json();import osimport requests
response = requests.get( 'https://sitechecker.pro/api/v1/projects', headers={'Authorization': f"Bearer {os.environ['SITECHECKER_API_KEY']}"},)
payload = response.json()$ch = curl_init('https://sitechecker.pro/api/v1/projects');curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('SITECHECKER_API_KEY')],]);
$payload = json_decode(curl_exec($ch), true);Your first response
Section titled “Your first response”List endpoints answer with the same envelope: the rows under data, the counts under
meta.
{ "data": [ { "project_id": 12345, "project_name": "example.com", "url": "https://example.com", "domain_scope": { "protocols": ["https"], "scope_type": "subdomains", "path": "/" }, "site_audit_enabled": true, "last_crawl_date": "2026-05-12T08:30:00Z", "last_crawl_status": "finished", "website_score": 78, "crawled_pages": 298 } ], "meta": { "total": 137, "limit": 50, "offset": 0 }}project_id is the value the rest of the API is keyed on — hold on to it.
Request scope
Section titled “Request scope”project_id selects the project; three further parameters narrow a request inside it.
Which of them an endpoint accepts is on its reference page.
| Parameter | Selects |
|---|---|
project_id |
The project. Every endpoint below /projects takes it. |
segment_id |
One saved segment, where the endpoint supports segments. Rank Tracker and AI Visibility group their data differently and do not take it. |
crawl_id |
One crawl, on the Site Monitoring endpoints. |
url |
One page — or, on list endpoints, the pages matching it. |
date_from, date_to |
The reporting period, on the endpoints that report over time. |
scope |
Which AI Traffic dataset to read. Each scope accepts a different set of filters. |
Site Monitoring data is organised by crawl: a summary endpoint returns one point per
crawl over the date range you ask for, each carrying the crawl_id that the matching
list and details endpoints then take. Treat that value as opaque — copy it from the
summary response rather than deriving or guessing it.
Each of GSC Insights, GA4 Insights, Rank Tracker and AI Visibility publishes a
filter-values endpoint that lists the values the project actually has data for.
Read it before building a filtered request: an unsupported filter, dimension or scope
is rejected rather than quietly ignored.
A few reports set their own period rules instead of taking date_from / date_to —
GSC Last Found Pages uses a fixed 7, 30, 60 or 90-day lookback, and Rank Tracker SERP
Opportunities is a monthly snapshot. The reference page for each says so.
Pagination
Section titled “Pagination”List endpoints page with limit and offset, and report the full size of the result
set in meta.total, so you can tell how many pages are left before fetching them.
| Parameter | Default | Range | Purpose |
|---|---|---|---|
limit |
50 |
1–100 |
How many rows to return in one response. |
offset |
0 |
from 0 |
How many rows to skip. |
# Rows 101-150 of the result set.curl "https://sitechecker.pro/api/v1/projects?limit=50&offset=100" \ -H "Authorization: Bearer $SITECHECKER_API_KEY"Errors
Section titled “Errors”Failures share one envelope. Branch on error.code — it is the stable
machine-readable value; error.message is written for humans and may be reworded.
{ "error": { "code": "INVALID_API_KEY", "message": "Invalid or missing API key." }}| Status | error.code |
What went wrong |
|---|---|---|
401 |
INVALID_API_KEY |
The key is missing, malformed, or not a key we know. |
401 |
REVOKED_API_KEY |
The key was revoked. Issue a new one — this key will not start working again. |
403 |
MISSING_PUBLIC_API_ACCESS |
The account has no active API entitlement. |
403 |
ACCESS_DENIED |
The requested project belongs to another account. |
404 |
PROJECT_NOT_FOUND, SEGMENT_NOT_FOUND, CRAWL_NOT_FOUND, KEYWORD_NOT_FOUND, OPPORTUNITY_NOT_FOUND, SNAPSHOT_UNAVAILABLE, NOT_FOUND |
The resource does not exist, or the key cannot reach it. NOT_FOUND is the generic one — a well-formed id that matches nothing, such as a change that has since been pruned. |
409 |
CRAWL_IN_PROGRESS |
The crawl is still running, so there is no audit data to return yet. |
409 |
GSC_NOT_CONNECTED |
The project has no Google Search Console connection. |
409 |
GA4_NOT_CONNECTED |
The project has no Google Analytics 4 connection. |
409 |
SITE_AUDIT_DATA_UNAVAILABLE |
The endpoint joins crawled page content the project does not have yet. |
409 |
AI_OVERVIEW_DATA_UNAVAILABLE |
Google AI Overview data has not been collected for this project yet. |
422 |
VALIDATION_ERROR, INVALID_DATE_RANGE, INVALID_FILTER, INVALID_EVENT_TYPE |
A parameter is missing, invalid, or a value this endpoint does not accept — error.message names it. A change_id or content_update_id that is malformed, or that belongs to another page, reads as INVALID_FILTER. |
422 |
UNSUPPORTED_FILTER, UNSUPPORTED_DIMENSION, UNSUPPORTED_METRIC, UNSUPPORTED_SCOPE, SEGMENT_FILTER_UNSUPPORTED |
The parameter is valid in general, but not for this endpoint or this scope. |
429 |
RATE_LIMIT_EXCEEDED |
Too many requests. Wait for the interval in the Retry-After header. |
500 |
INTERNAL_ERROR |
Something failed on our side. Safe to retry. |
502 |
UPSTREAM_ERROR |
A service the endpoint depends on — SERP data, GA4, Site Audit — is temporarily unavailable. |