Tracked keyword list for the selected date range.
const 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';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}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>'Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Example
12345Project ID.
Example
2026-02-22Start of the Rank Tracker date range (inclusive, Y-m-d). Clamped to the project’s available indicator dates.
Example
2026-05-22End 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).
Substring keyword text search.
Direct lookup of one tracked keyword row.
Example
googleSearch engine machine value from rank_tracker_filter_values (e.g. google).
Device filter.
Example
loc_TmV3IFlvcmsOpaque location id from rank_tracker_filter_values tracking_profiles (loc_… value).
Example
enLanguage code (ISO alpha-2) from rank_tracker_filter_values.
Example
SG9tZSBQYWdlcwKeyword group id from the groups endpoint (opaque value).
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.
Comparison window for movement rankings filters. Only valid with rankings=moved_up, moved_down or not_changed. Default: 7d.
Filter keywords whose SERP contains the feature.
AI Overview presence filter. Default: all.
Substring filter on the target URL set for the keyword.
Substring filter on the URL that actually ranks.
Minimum search volume.
Maximum search volume.
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.
Sort as “
Page size. Rank Tracker list endpoints cap at 50 rows per request.
Pagination offset.
Responses
Section titled “Responses”Paginated tracked keywords
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
Only with fields=cpc.
Only with fields=ad_competition.
Only with fields=created_at.
Only with fields=updated_at.
Only with fields=allintitle.
Only with fields=kgr.
Only with fields=serp_features. Public machine values.
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
Only with fields=gsc.impressions.
Only with fields=gsc.clicks.
Only with fields=gsc.average_position. GSC average position — not the Rank Tracker position.
Only with fields=gsc.ctr. Percentage value.
Only with fields=ai_overview_user_position (or fields=ai_overview). Domain position inside the AI Overview.
Only with fields=ai_overview_citations_count (or fields=ai_overview). Number of links cited in the AI Overview.
Only with fields=ai_overview_citation_url (or fields=ai_overview). Cited URL of the domain, if any.
object
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.
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
object
object
Example
{ "error": { "code": "unauthorized", "message": "Invalid or missing API key." }}No active API entitlement for the account, or the project belongs to another account
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
object
Example
{ "error": { "code": "api_access_denied", "message": "API access is not available: the account has no active API entitlement." }}Project not found
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
object
Example
{ "error": { "code": "project_not_found", "message": "Project not found." }}Validation error
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
object
Example
{ "error": { "code": "validation_error", "message": "project_id is required." }}Rate limit exceeded — retry after the interval in the Retry-After header
object
object
Example
{ "error": { "code": "rate_limit_exceeded", "message": "Rate limit exceeded. Try again later." }}Internal server error
object
object
Example
{ "error": { "code": "internal_error", "message": "Internal server error." }}