Skip to content

Tracked keyword list for the selected date range.

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

keyword
string

Substring keyword text search.

tracked_keyword_id
integer

Direct lookup of one tracked keyword row.

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_TmV3IFlvcms

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.

ai_overview
string
default: all
Allowed values: all with_overview without_overview

AI Overview presence filter. Default: all.

target_url
string

Substring filter on the target URL set for the keyword.

ranked_url
string

Substring filter on the URL that actually ranks.

volume_from
integer

Minimum search volume.

volume_to
integer

Maximum search volume.

fields
string
Allowed values: cpc ad_competition created_at updated_at allintitle kgr serp_features gsc.impressions gsc.clicks gsc.average_position gsc.ctr ai_overview_user_position ai_overview_citations_count ai_overview_citation_url gsc_metrics ai_overview

Comma-separated optional response fields, each requested under its own name (e.g. fields=cpc,gsc.clicks). gsc_metrics and ai_overview are shorthands for their whole block (gsc.* and ai_overview_). gsc. metrics reflect the latest synced GSC snapshot, not the selected date range.

order_by
string

Sort as “_asc” or “_desc”, e.g. position_asc. Sortable fields: position, volume, keyword, change_1d/7d/30d/90d/all_time, best_position, created_at, updated_at.

limit
integer
default: 50 >= 1 <= 50

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

offset
integer
0

Pagination offset.

Paginated tracked keywords

Media typeapplication/json
object
data
Array<object>

Tracked keyword row. position uses the Rank Tracker table logic for the selected range; null = not ranked. Deltas keep the backend sign convention: negative = improved. Optional fields appear only when requested via fields=; gsc.* reflect the latest synced GSC snapshot, not the date range.

object
tracked_keyword_id
integer
keyword
string
search_engine
string
nullable
device
string
nullable
location_id
string
nullable
location_name
string
nullable
country_code
string
nullable
country_name
string
nullable
language_code
string
nullable
language_name
string
nullable
position
integer
nullable
volume
integer
nullable
ranked_url
string
nullable
target_url
string
nullable
group_id
string
nullable
group_name
string
nullable
best_position
integer
nullable
best_position_date
string format: date
nullable
change_1d
integer
nullable
change_7d
integer
nullable
change_30d
integer
nullable
change_90d
integer
nullable
change_all_time
integer
nullable
has_ai_overview
boolean
brand_mentioned
boolean
cpc

Only with fields=cpc.

number format: float
nullable
ad_competition

Only with fields=ad_competition.

integer
nullable
created_at

Only with fields=created_at.

string format: date
nullable
updated_at

Only with fields=updated_at.

string format: date
nullable
allintitle

Only with fields=allintitle.

integer
nullable
kgr

Only with fields=kgr.

number format: float
nullable
serp_features

Only with fields=serp_features. Public machine values.

Array<string>
nullable
gsc

Latest synced GSC snapshot values. Each metric is requested on its own (fields=gsc.impressions, gsc.clicks, gsc.average_position, gsc.ctr) or all at once with fields=gsc_metrics; the block carries only the requested metrics.

object
impressions

Only with fields=gsc.impressions.

integer
nullable
clicks

Only with fields=gsc.clicks.

integer
nullable
average_position

Only with fields=gsc.average_position. GSC average position — not the Rank Tracker position.

number format: float
nullable
ctr

Only with fields=gsc.ctr. Percentage value.

number format: float
nullable
ai_overview_user_position

Only with fields=ai_overview_user_position (or fields=ai_overview). Domain position inside the AI Overview.

integer
nullable
ai_overview_citations_count

Only with fields=ai_overview_citations_count (or fields=ai_overview). Number of links cited in the AI Overview.

integer
nullable
ai_overview_citation_url

Only with fields=ai_overview_citation_url (or fields=ai_overview). Cited URL of the domain, if any.

string
nullable
meta
object
total

Reusable OpenAPI response schemas for the Public REST API: the error/meta envelope and one item schema per resource. Property names come from the Field registry so the documented contract and the runtime response shapes stay in lock-step.

integer
limit
integer
offset
integer
Example
{
"data": [
{
"tracked_keyword_id": 123456,
"keyword": "seo checker",
"search_engine": "google",
"device": "desktop",
"country_code": "US",
"country_name": "United States",
"language_code": "en",
"language_name": "English",
"position": 3,
"volume": 2900,
"ranked_url": "/de/on-page-seo-checker/",
"target_url": "/de/on-page-seo-checker/",
"group_name": "Home Pages",
"best_position": 2,
"best_position_date": "2025-10-26",
"change_1d": -1,
"change_7d": 2,
"change_30d": 7,
"change_90d": 83,
"change_all_time": 99,
"has_ai_overview": true,
"brand_mentioned": false,
"cpc": 11.24,
"ad_competition": 10,
"allintitle": 53,
"kgr": 0.02,
"serp_features": [
"featured_snippet",
"video"
],
"gsc": {
"impressions": 3278,
"clicks": 27,
"average_position": 12.4,
"ctr": 0.82
},
"ai_overview_user_position": 3,
"ai_overview_citations_count": 2
}
],
"meta": {
"total": 137,
"limit": 50,
"offset": 0
}
}

Missing or invalid API key

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: validation_error bad_request project_not_found segment_not_found forbidden crawl_in_progress not_found upstream_error unauthorized rate_limit_exceeded api_access_denied 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 segment_filter_unsupported unsupported_scope ai_overview_data_unavailable prompt_data_unavailable
message
required
string
Example
{
"error": {
"code": "unauthorized",
"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 api_access_denied when the account has no active API entitlement, and as forbidden 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 forbidden crawl_in_progress not_found upstream_error unauthorized rate_limit_exceeded api_access_denied 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 segment_filter_unsupported unsupported_scope ai_overview_data_unavailable prompt_data_unavailable
message
required
string
Example
{
"error": {
"code": "api_access_denied",
"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 forbidden crawl_in_progress not_found upstream_error unauthorized rate_limit_exceeded api_access_denied 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 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, or invalid_date_range / invalid_filter / invalid_event_type / unsupported_filter / unsupported_dimension / 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 forbidden crawl_in_progress not_found upstream_error unauthorized rate_limit_exceeded api_access_denied 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 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 forbidden crawl_in_progress not_found upstream_error unauthorized rate_limit_exceeded api_access_denied 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 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 forbidden crawl_in_progress not_found upstream_error unauthorized rate_limit_exceeded api_access_denied 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 segment_filter_unsupported unsupported_scope ai_overview_data_unavailable prompt_data_unavailable
message
required
string
Example
{
"error": {
"code": "internal_error",
"message": "Internal server error."
}
}