Skip to content

Rank Tracker Pages

GET
/api/v1/pages
curl --request GET \
--url 'https://sitechecker.pro/api/v1/pages?project_id=12345&date_from=2026-02-22&date_to=2026-05-22&search_engine=google&device=desktop&location_id=loc_TmV3IFlvcmssVW5pdGVkIFN0YXRlcw&language_code=en&group_id=SG9tZSBQYWdlcw&rankings=all&movement_window=1d&serp_feature=ads&fields=keyword_refs&limit=50&offset=0' \
--header 'Authorization: Bearer <token>'

Returns URL-level Rank Tracker metrics for pages ranking for the project’s tracked keywords over the selected date range. Filters such as device or location choose the keywords the page aggregates are built from, rather than filtering the pages themselves.

project_id
required
integer
Example
12345

Project ID.

date_from
required
string format: date
Example
2026-02-22

Start of the Rank Tracker date range (inclusive, Y-m-d). Clamped to the project’s available indicator dates.

date_to
required
string format: date
Example
2026-05-22

End of the Rank Tracker date range (inclusive, Y-m-d). Visibility-style fields are snapshots for the latest available check within this range (as_of_date).

search
string

Free-text search over connected keyword text.

url
string

Substring filter on the ranked/page URL.

search_engine
string
Example
google

Search engine machine value from rank_tracker_filter_values (e.g. google).

device
string
Allowed values: desktop mobile tablet

Device filter.

location_id
string
Example
loc_TmV3IFlvcmssVW5pdGVkIFN0YXRlcw

Opaque location id from rank_tracker_filter_values tracking_profiles (loc_… value).

language_code
string
Example
en

Language code (ISO alpha-2) from rank_tracker_filter_values.

group_id
string
Example
SG9tZSBQYWdlcw

Keyword group id from the groups endpoint (opaque value).

rankings
string
default: all
Allowed values: all top_1 top_3 top_10 top_30 top_50 top_100 no_position moved_up moved_down not_changed

Ranking filter. Bucket filters are cumulative (top_10 = positions 1-10); response distribution buckets are exclusive. Movement filters (moved_up/moved_down/not_changed) compare against the movement_window snapshot.

movement_window
string
default: 7d
Allowed values: 1d 7d 30d 90d all_time

Comparison window for movement rankings filters. Only valid with rankings=moved_up, moved_down or not_changed. Default: 7d.

serp_feature
string
Allowed values: ads featured_snippet people_also_ask shopping top_carousel video

Filter keywords whose SERP contains the feature.

volume_from
integer

Minimum search volume.

volume_to
integer

Maximum search volume.

fields
string
Allowed values: keyword_refs

Use fields=keyword_refs to attach lightweight {tracked_keyword_id, keyword} references per page.

order_by
string

Sort as “_asc” or “_desc”. Sortable fields: page_url, top_keyword, top_keyword_volume, top_keyword_position, tracked_keywords_count, url_average_position, url_keywords_volume, url_potential_rank, url_visibility.

limit
integer
default: 50 >= 1 <= 50

Page size. Rank Tracker list endpoints cap at 50 rows per request.

offset
integer
0

Pagination offset.

Paginated URL-level aggregates

Media typeapplication/json
object
data
Array<object>

URL-level aggregates computed over the filtered keyword pool. url_visibility is a percentage snapshot for as_of_date; keyword_refs appear only with fields=keyword_refs.

object
page_url

Page URL.

string
top_keyword

Best-performing tracked keyword this page ranks for.

string
nullable
top_keyword_volume

Monthly search volume of that keyword.

integer
nullable
top_keyword_position

Position this page holds for that keyword.

integer
nullable
url_visibility

Visibility of this page across the filtered keyword pool, as a percentage snapshot for as_of_date.

number format: float
nullable
url_visibility_change_1d

Visibility change over the last day, in percentage points.

number format: float
nullable
url_visibility_change_7d

Visibility change over the last 7 days, in percentage points.

number format: float
nullable
url_visibility_change_30d

Visibility change over the last 30 days, in percentage points.

number format: float
nullable
url_visibility_change_90d

Visibility change over the last 90 days, in percentage points.

number format: float
nullable
url_visibility_change_all_time

Visibility change since tracking began, in percentage points.

number format: float
nullable
tracked_keywords_count

Tracked keywords this page ranks for.

integer
ai_overview_keywords_count

How many of them return an AI Overview.

integer
nullable
url_keywords_volume

Combined monthly search volume of those keywords.

integer
nullable
url_average_position

Mean position across those keywords.

number format: float
nullable
url_potential_rank

Traffic potential score for the page, weighting volume by position.

number format: float
nullable
groups

Keyword groups the page ranks in.

Array<object>
object
group_id

Id of the group, as returned by the groups endpoint.

string
group_name

Display name of the group.

string
keywords_count

Tracked keywords this page ranks for inside the group.

integer
keyword_refs

Only with fields=keyword_refs. Lightweight references without metrics.

Array<object>
nullable
object
tracked_keyword_id
integer
keyword
string
meta

Pagination meta plus the snapshot date used for visibility-style fields.

object
total

Rows matching the request, before pagination.

integer
limit

Page size that was applied.

integer
offset

Pagination offset that was applied.

integer
as_of_date

Date the visibility-style fields were snapshotted on.

string format: date
nullable
Example
{
"data": [
{
"page_url": "/youtube-keyword-tool/",
"top_keyword": "youtube keyword tool",
"top_keyword_volume": 2400,
"top_keyword_position": 23,
"url_visibility": 15.22,
"url_visibility_change_1d": -6,
"url_visibility_change_7d": -13,
"url_visibility_change_30d": 14,
"url_visibility_change_90d": 18,
"url_visibility_change_all_time": 27,
"tracked_keywords_count": 2,
"ai_overview_keywords_count": 0,
"url_keywords_volume": 3120,
"url_average_position": 21.5,
"url_potential_rank": 140.4,
"groups": [
{
"group_id": "RXh0cmEgVG9vbHM",
"group_name": "Extra Tools",
"keywords_count": 2
}
],
"keyword_refs": [
{
"tracked_keyword_id": 123456,
"keyword": "youtube keyword tool"
}
]
}
],
"meta": {
"total": 137,
"limit": 50,
"offset": 0,
"as_of_date": "2026-05-22"
}
}

Missing or invalid API key

Media typeapplication/json

Returned as INVALID_API_KEY when the key is missing or unknown, and as REVOKED_API_KEY when the key exists but was revoked — the latter needs a new key.

object
error
required
object
code
required
string
Allowed values: VALIDATION_ERROR BAD_REQUEST PROJECT_NOT_FOUND SEGMENT_NOT_FOUND ACCESS_DENIED CRAWL_IN_PROGRESS NOT_FOUND UPSTREAM_ERROR INVALID_API_KEY REVOKED_API_KEY RATE_LIMIT_EXCEEDED MISSING_PUBLIC_API_ACCESS INTERNAL_ERROR CRAWL_NOT_FOUND INVALID_DATE_RANGE INVALID_FILTER INVALID_EVENT_TYPE KEYWORD_NOT_FOUND OPPORTUNITY_NOT_FOUND SNAPSHOT_UNAVAILABLE GSC_NOT_CONNECTED GA4_NOT_CONNECTED SITE_AUDIT_DATA_UNAVAILABLE GA4_DATA_UNAVAILABLE UNSUPPORTED_FILTER UNSUPPORTED_DIMENSION UNSUPPORTED_METRIC SEGMENT_FILTER_UNSUPPORTED UNSUPPORTED_SCOPE AI_OVERVIEW_DATA_UNAVAILABLE PROMPT_DATA_UNAVAILABLE
message
required
string
Example
{
"error": {
"code": "INVALID_API_KEY",
"message": "Invalid or missing API key."
}
}

No active API entitlement for the account, or the project belongs to another account

Media typeapplication/json

Returned as MISSING_PUBLIC_API_ACCESS when the account has no active API entitlement, and as ACCESS_DENIED when the requested project belongs to another account.

object
error
required
object
code
required
string
Allowed values: VALIDATION_ERROR BAD_REQUEST PROJECT_NOT_FOUND SEGMENT_NOT_FOUND ACCESS_DENIED CRAWL_IN_PROGRESS NOT_FOUND UPSTREAM_ERROR INVALID_API_KEY REVOKED_API_KEY RATE_LIMIT_EXCEEDED MISSING_PUBLIC_API_ACCESS INTERNAL_ERROR CRAWL_NOT_FOUND INVALID_DATE_RANGE INVALID_FILTER INVALID_EVENT_TYPE KEYWORD_NOT_FOUND OPPORTUNITY_NOT_FOUND SNAPSHOT_UNAVAILABLE GSC_NOT_CONNECTED GA4_NOT_CONNECTED SITE_AUDIT_DATA_UNAVAILABLE GA4_DATA_UNAVAILABLE UNSUPPORTED_FILTER UNSUPPORTED_DIMENSION UNSUPPORTED_METRIC SEGMENT_FILTER_UNSUPPORTED UNSUPPORTED_SCOPE AI_OVERVIEW_DATA_UNAVAILABLE PROMPT_DATA_UNAVAILABLE
message
required
string
Example
{
"error": {
"code": "MISSING_PUBLIC_API_ACCESS",
"message": "API access is not available: the account has no active API entitlement."
}
}

Project not found

Media typeapplication/json

The exact missing resource is in error.code: PROJECT_NOT_FOUND, SEGMENT_NOT_FOUND, CRAWL_NOT_FOUND, KEYWORD_NOT_FOUND, OPPORTUNITY_NOT_FOUND, SNAPSHOT_UNAVAILABLE or NOT_FOUND.

object
error
required
object
code
required
string
Allowed values: VALIDATION_ERROR BAD_REQUEST PROJECT_NOT_FOUND SEGMENT_NOT_FOUND ACCESS_DENIED CRAWL_IN_PROGRESS NOT_FOUND UPSTREAM_ERROR INVALID_API_KEY REVOKED_API_KEY RATE_LIMIT_EXCEEDED MISSING_PUBLIC_API_ACCESS INTERNAL_ERROR CRAWL_NOT_FOUND INVALID_DATE_RANGE INVALID_FILTER INVALID_EVENT_TYPE KEYWORD_NOT_FOUND OPPORTUNITY_NOT_FOUND SNAPSHOT_UNAVAILABLE GSC_NOT_CONNECTED GA4_NOT_CONNECTED SITE_AUDIT_DATA_UNAVAILABLE GA4_DATA_UNAVAILABLE UNSUPPORTED_FILTER UNSUPPORTED_DIMENSION UNSUPPORTED_METRIC SEGMENT_FILTER_UNSUPPORTED UNSUPPORTED_SCOPE AI_OVERVIEW_DATA_UNAVAILABLE PROMPT_DATA_UNAVAILABLE
message
required
string
Example
{
"error": {
"code": "PROJECT_NOT_FOUND",
"message": "Project not found."
}
}

Validation error

Media typeapplication/json

Rejected query parameters. error.code is VALIDATION_ERROR for parameter validation (including a query parameter the endpoint does not accept), or INVALID_DATE_RANGE / INVALID_FILTER / INVALID_EVENT_TYPE / UNSUPPORTED_FILTER / UNSUPPORTED_DIMENSION / UNSUPPORTED_METRIC / UNSUPPORTED_SCOPE / SEGMENT_FILTER_UNSUPPORTED for module-specific rules.

object
error
required
object
code
required
string
Allowed values: VALIDATION_ERROR BAD_REQUEST PROJECT_NOT_FOUND SEGMENT_NOT_FOUND ACCESS_DENIED CRAWL_IN_PROGRESS NOT_FOUND UPSTREAM_ERROR INVALID_API_KEY REVOKED_API_KEY RATE_LIMIT_EXCEEDED MISSING_PUBLIC_API_ACCESS INTERNAL_ERROR CRAWL_NOT_FOUND INVALID_DATE_RANGE INVALID_FILTER INVALID_EVENT_TYPE KEYWORD_NOT_FOUND OPPORTUNITY_NOT_FOUND SNAPSHOT_UNAVAILABLE GSC_NOT_CONNECTED GA4_NOT_CONNECTED SITE_AUDIT_DATA_UNAVAILABLE GA4_DATA_UNAVAILABLE UNSUPPORTED_FILTER UNSUPPORTED_DIMENSION UNSUPPORTED_METRIC SEGMENT_FILTER_UNSUPPORTED UNSUPPORTED_SCOPE AI_OVERVIEW_DATA_UNAVAILABLE PROMPT_DATA_UNAVAILABLE
message
required
string
Example
{
"error": {
"code": "VALIDATION_ERROR",
"message": "project_id is required."
}
}

Rate limit exceeded — retry after the interval in the Retry-After header

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: VALIDATION_ERROR BAD_REQUEST PROJECT_NOT_FOUND SEGMENT_NOT_FOUND ACCESS_DENIED CRAWL_IN_PROGRESS NOT_FOUND UPSTREAM_ERROR INVALID_API_KEY REVOKED_API_KEY RATE_LIMIT_EXCEEDED MISSING_PUBLIC_API_ACCESS INTERNAL_ERROR CRAWL_NOT_FOUND INVALID_DATE_RANGE INVALID_FILTER INVALID_EVENT_TYPE KEYWORD_NOT_FOUND OPPORTUNITY_NOT_FOUND SNAPSHOT_UNAVAILABLE GSC_NOT_CONNECTED GA4_NOT_CONNECTED SITE_AUDIT_DATA_UNAVAILABLE GA4_DATA_UNAVAILABLE UNSUPPORTED_FILTER UNSUPPORTED_DIMENSION UNSUPPORTED_METRIC SEGMENT_FILTER_UNSUPPORTED UNSUPPORTED_SCOPE AI_OVERVIEW_DATA_UNAVAILABLE PROMPT_DATA_UNAVAILABLE
message
required
string
Example
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Try again later."
}
}

Internal server error

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: VALIDATION_ERROR BAD_REQUEST PROJECT_NOT_FOUND SEGMENT_NOT_FOUND ACCESS_DENIED CRAWL_IN_PROGRESS NOT_FOUND UPSTREAM_ERROR INVALID_API_KEY REVOKED_API_KEY RATE_LIMIT_EXCEEDED MISSING_PUBLIC_API_ACCESS INTERNAL_ERROR CRAWL_NOT_FOUND INVALID_DATE_RANGE INVALID_FILTER INVALID_EVENT_TYPE KEYWORD_NOT_FOUND OPPORTUNITY_NOT_FOUND SNAPSHOT_UNAVAILABLE GSC_NOT_CONNECTED GA4_NOT_CONNECTED SITE_AUDIT_DATA_UNAVAILABLE GA4_DATA_UNAVAILABLE UNSUPPORTED_FILTER UNSUPPORTED_DIMENSION UNSUPPORTED_METRIC SEGMENT_FILTER_UNSUPPORTED UNSUPPORTED_SCOPE AI_OVERVIEW_DATA_UNAVAILABLE PROMPT_DATA_UNAVAILABLE
message
required
string
Example
{
"error": {
"code": "INTERNAL_ERROR",
"message": "Internal server error."
}
}