Rank Tracking
Read stored Google, Bing, and Yandex keyword ranking snapshots for connected websites.
Overview
The rank-tracking endpoints return stored keyword ranking snapshots collected from connected webmaster providers, synced on a schedule -- never a live SERP check. All four endpoints require an API key, cost 0 credits, and are read-only.
Rank tracking reads snapshots collected from connected webmaster providers. Google, Bing, and Yandex report different search populations, so RankParse keeps their positions, dates, and availability separate. Use the GSC endpoints for Google-only live API dimensions and Google Ads for keyword volume.
Bing and Yandex tracking is opt-in per account, so many accounts only have Google connected. A missing engine in a response means that engine isn't connected/attached -- never a zero or bottom rank. Check enabled_engines on the rankings response to tell "not enabled for this account" apart from "enabled but not attached to this site". A present engine can also carry a non-available availability (e.g. provider_limited, common for Bing/Yandex; pending_first_sync; stale; sync_failed) together with a null position -- that's a data-quality or sync-timing signal, not evidence the keyword ranks nowhere.
GET /v1/rank-tracking/sites
Lists the websites configured for rank tracking, including each engine's attached property and sync freshness. Costs 0 credits.
Request
curl "https://api.rankparse.com/v1/rank-tracking/sites" \
-H "X-API-Key: rp_your_key"Response
{
"sites": [
{
"site_id": "site_abc123",
"canonical_host": "example.com",
"display_name": "example.com",
"providers": {
"google": {
"engine": "google",
"property_id": "prop_g1",
"property_url": "https://example.com/",
"is_active": true,
"last_synced_at": 1756112400000,
"data_as_of": "2026-08-25",
"latest_sync_status": "success",
"latest_sync_error_code": null
}
}
}
]
}Only engines with an attached property for a site appear under providers -- a missing key (no bing above) means Bing isn't connected for this site, not that it has zero rankings.
GET /v1/rank-tracking/keywords
Lists the tracked keyword IDs and query text for one site. Costs 0 credits.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
site_id | string | Yes | From GET /v1/rank-tracking/sites |
limit | integer | No | Max keywords to return (default 100, max 100) |
offset | integer | No | Pagination offset (default 0) |
Request
curl "https://api.rankparse.com/v1/rank-tracking/keywords?site_id=site_abc123" \
-H "X-API-Key: rp_your_key"Response
{
"site_id": "site_abc123",
"canonical_host": "example.com",
"keywords": [
{ "id": "kw_1", "query": "buy widgets", "created_at": 1753900800000 }
],
"total": 1,
"limit": 100,
"offset": 0
}GET /v1/rank-tracking/rankings
Returns current-vs-previous-period ranking summaries for a site's tracked keywords, across every engine enabled for the account by default. Costs 0 credits.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
site_id | string | Yes | From GET /v1/rank-tracking/sites |
keyword_id | string | No | Restrict to one tracked keyword |
engine | string | No | all (default), google, bing, or yandex |
period_days | integer | No | Comparison window in days (default 28, max 90) |
limit | integer | No | Max keywords to return (default 100, max 100) |
offset | integer | No | Pagination offset (default 0) |
Request: compare all engines over 28 days
curl "https://api.rankparse.com/v1/rank-tracking/rankings?site_id=site_abc123&engine=all&period_days=28" \
-H "X-API-Key: rp_your_key"Request: one keyword only
curl "https://api.rankparse.com/v1/rank-tracking/rankings?site_id=site_abc123&keyword_id=kw_1" \
-H "X-API-Key: rp_your_key"Response
{
"site_id": "site_abc123",
"canonical_host": "example.com",
"enabled_engines": ["google", "bing", "yandex"],
"period_days": 28,
"limit": 100,
"offset": 0,
"total": 1,
"keywords": [
{
"id": "kw_1",
"query": "buy widgets",
"engines": {
"google": {
"engine": "google",
"property_id": "prop_g1",
"property_url": "https://example.com/",
"availability": "available",
"data_as_of": "2026-08-25",
"top_page": "https://example.com/widgets",
"current_period": { "start_date": "2026-07-29", "end_date": "2026-08-25" },
"previous_period": { "start_date": "2026-07-01", "end_date": "2026-07-28" },
"current": { "clicks": 12, "impressions": 340, "ctr": 0.035, "position": 6.2, "click_position": 5.9 },
"previous": { "clicks": 9, "impressions": 310, "ctr": 0.029, "position": 7.1, "click_position": 6.8 },
"movement": 0.9
},
"bing": {
"engine": "bing",
"property_id": "prop_b1",
"property_url": "https://example.com/",
"availability": "provider_limited",
"data_as_of": "2026-08-20",
"top_page": null,
"current_period": { "start_date": "2026-07-29", "end_date": "2026-08-25" },
"previous_period": { "start_date": "2026-07-01", "end_date": "2026-07-28" },
"current": { "clicks": null, "impressions": null, "ctr": null, "position": null, "click_position": null },
"previous": { "clicks": null, "impressions": null, "ctr": null, "position": null, "click_position": null },
"movement": null
}
}
}
]
}bing above is provider_limited with entirely null current/previous metrics -- that's a data-quality gap for that period, not a signal the keyword doesn't rank on Bing. yandex is absent from this keyword's engines even though it's listed in enabled_engines: Yandex is enabled for the account but not attached to this particular site.
movement is previous.position minus current.position; positive means the keyword moved up (a lower, better position number). It's null unless both periods have a non-null position.
GET /v1/rank-tracking/history
Returns day-by-day ranking history for one keyword on one search engine over a date range. engine is required here -- history is always single-engine (all is not accepted; call rankings first to compare engines). Costs 0 credits.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
site_id | string | Yes | From GET /v1/rank-tracking/sites |
keyword_id | string | Yes | From GET /v1/rank-tracking/keywords |
engine | string | Yes | google, bing, or yandex |
start_date | string | Yes | YYYY-MM-DD, inclusive |
end_date | string | Yes | YYYY-MM-DD, inclusive. Span capped at 400 days |
Request
curl "https://api.rankparse.com/v1/rank-tracking/history?site_id=site_abc123&keyword_id=kw_1&engine=google&start_date=2026-08-01&end_date=2026-08-25" \
-H "X-API-Key: rp_your_key"Response
{
"site_id": "site_abc123",
"keyword_id": "kw_1",
"query": "buy widgets",
"engine": "google",
"property_id": "prop_g1",
"property_url": "https://example.com/",
"availability": "available",
"data_as_of": "2026-08-25",
"last_attempt_at": 1756112400000,
"last_success_at": 1756112400000,
"error_code": null,
"start_date": "2026-08-01",
"end_date": "2026-08-25",
"rows": [
{ "date": "2026-08-01", "clicks": 1, "impressions": 30, "ctr": 0.033, "position": 6.8, "click_position": 6.5 },
{ "date": "2026-08-03", "clicks": 0, "impressions": 25, "ctr": 0, "position": 7.2, "click_position": null }
]
}rows is ascending by date, and a missing calendar date (2026-08-02 above) simply means no synced observation that day -- never treat a gap as a zero or dropped rank.
Errors
| Status | Code | Meaning |
|---|---|---|
400 | invalid_rank_tracking_engine | engine is missing, not one of the allowed values, or (on /history) is all |
400 | invalid_rank_tracking_period | period_days is out of range |
400 | invalid_rank_tracking_date | start_date/end_date are missing, malformed, out of order, or span more than 400 days |
400 | rank_tracking_provider_disabled | engine is a real engine name that isn't enabled for this account |
400 | rank_tracking_property_not_attached | (/history only) the keyword has no primary property attached for that engine |
404 | rank_tracking_site_not_found | No site with that site_id belongs to this API key |
404 | rank_tracking_keyword_not_found | No keyword with that keyword_id belongs to this API key on this site |
429 | rate_limited | 60 requests/minute exceeded |
Distinct from GSC and Google Ads
Rank tracking, Google Search Console, and Google Ads are three separate data products and none of them change the others:
- The GSC endpoints expose live, Google-only Search Console dimensions (pages, devices, countries, URL inspection).
- The Google Ads keyword tools return search volume and competition -- never organic rankings, for any engine.
- Rank tracking is the only family that reads stored Google, Bing, and Yandex position snapshots side by side.