Rank Tracker Competitor Keywords
const url = 'https://sitechecker.pro/api/v1/competitor_keywords?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=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/competitor_keywords?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=cpc&limit=50&offset=0' \ --header 'Authorization: Bearer <token>'Returns tracked keywords with the project’s and selected competitors’ ranking positions for comparison. The matrix grows with every competitor added, so the response is paginated by keyword rows.
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_TmV3IFlvcmssVW5pdGVkIFN0YXRlcwOpaque 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).
Return matrix data for one tracked competitor (id from competitor_domains). The main domain row is always included.
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.
Minimum search volume.
Maximum search volume.
Comma-separated extra keyword metadata: cpc, serp_features.
Sort as “
Page size. Rank Tracker list endpoints cap at 50 rows per request.
Pagination offset.
Responses
Section titled “Responses”Paginated keyword rows with domain positions
object
Keyword x competitors matrix row. domains[] lists the main domain first; position_change is positive when the domain moved up over the selected range.
object
Tracked keyword id.
Keyword text.
Search engine the keyword is tracked on.
Device the keyword is tracked on.
Id of the tracked location.
Display name of the tracked location.
Country the keyword is tracked for, as ISO-3166-1 alpha-2.
Display name of that country.
Language the keyword is tracked for, as ISO-639-1.
Display name of that language.
Monthly search volume.
Only with fields=cpc.
Only with fields=serp_features.
One entry per domain in the comparison — the project and the selected competitors — with the position each holds for this keyword.
object
Domain the row is for.
True on the project row.
Tracked competitor id. Null on the project row.
Position this domain holds for the keyword. Null when it does not rank in the top 100.
Position change against the comparison period. Negative means the ranking improved.
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.
Page size that was applied.
Pagination offset that was applied.
Example
{ "data": [ { "tracked_keyword_id": 123456, "keyword": "ai overview checker", "search_engine": "google", "device": "desktop", "location_id": "loc_TmV3IFlvcmssVW5pdGVkIFN0YXRlcw", "location_name": "New York,United States", "country_code": "US", "country_name": "United States", "language_code": "en", "language_name": "English", "volume": 30, "cpc": 11.75, "domains": [ { "domain": "sitechecker.pro", "is_main_domain": true, "competitor_id": 456, "position": 2, "position_change": 11 } ] } ], "meta": { "total": 137, "limit": 50, "offset": 0 }}Missing or invalid API key
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
object
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
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
object
Example
{ "error": { "code": "MISSING_PUBLIC_API_ACCESS", "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 (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
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." }}