Position bucket time-series (Top 1 / 2-3 / 4-10 / 11-30 / 31-50 / 51-100 / no position).
const url = 'https://sitechecker.pro/api/v1/gsc-insights/rankings-history?project_id=12345&date_from=2026-02-19&date_to=2026-05-19&history_grouping=daily&device=desktop&country=usa&brand_type=all&position_buckets=top_1%2Ctop_2_3%2Ctop_4_10&filters=%7B%22join%22%3A%22and%22%2C%22rules%22%3A%5B%7B%22field%22%3A%22keyword%22%2C%22operator%22%3A%22regex%22%2C%22value%22%3A%22seo%7Caudit%22%7D%2C%7B%22field%22%3A%22clicks%22%2C%22operator%22%3A%22gte%22%2C%22value%22%3A100%7D%5D%7D';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/gsc-insights/rankings-history?project_id=12345&date_from=2026-02-19&date_to=2026-05-19&history_grouping=daily&device=desktop&country=usa&brand_type=all&position_buckets=top_1%2Ctop_2_3%2Ctop_4_10&filters=%7B%22join%22%3A%22and%22%2C%22rules%22%3A%5B%7B%22field%22%3A%22keyword%22%2C%22operator%22%3A%22regex%22%2C%22value%22%3A%22seo%7Caudit%22%7D%2C%7B%22field%22%3A%22clicks%22%2C%22operator%22%3A%22gte%22%2C%22value%22%3A100%7D%5D%7D' \ --header 'Authorization: Bearer <token>'Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Example
12345Project ID.
Example
2026-02-19Start of the monitoring period (inclusive), ISO date (UTC).
Example
2026-05-19End of the monitoring period (inclusive), ISO date (UTC).
Time bucket for history points.
Filter the underlying GSC rows by device before aggregation.
Example
usaFilter the underlying GSC rows by country (ISO-3166-1 alpha-3, lowercase) before aggregation. Use values from gsc_insights_filter_values.
Brand/non-brand keyword filter based on the brand rules configured in Settings. Requires brand_settings_configured=true.
Keyword text search applied before bucketing.
Example
top_1,top_2_3,top_4_10Comma-separated bucket subset to return. Default: all buckets.
Example
{"join":"and","rules":[{"field":"keyword","operator":"regex","value":"seo|audit"},{"field":"clicks","operator":"gte","value":100}]}Advanced filter object (URL-encoded JSON): {“join”:“and|or”,“rules”:[{“field”:…,“operator”:…,“value”:…}, {“join”:“or”,“rules”:[…]}]}. Text fields (keyword, page_url, top_ranking_keyword, top_ranking_page): equals, not_equals, contains, not_contains, starts_with, ends_with, regex, not_regex, in, not_in. Numeric fields (clicks, impressions, ctr, average_position): equals, gte, lte, between, plus gt/lt for integer fields. Enum fields (country, device): equals, in. Nested groups are supported one level deep; rules inside one “or” group must target the same text field. Simple query params are AND-joined with this object.
Responses
Section titled “Responses”Bucket counts per history point
object
Position bucket time-series: keyword counts per bucket per point.
object
object
Point date / period start.
Count in Top 1 bucket.
Count in Top 2-3 bucket.
Count in Top 4-10 bucket.
Count in Top 11-30 bucket.
Count in Top 31-50 bucket.
Count in Top 51-100 bucket.
Queries with no position by backend definition.
Standard GSC Insights meta block: request scope echo, source availability and data freshness. Extended per endpoint (history_grouping, resolved_compare_*, ga4_channel_scope…).
object
Project ID.
Selected period start.
Selected period end.
Optional comparison period start.
Optional comparison period end.
Source connection/data availability statuses keyed by source (e.g. gsc, ga4).
object
Latest data date used per source (e.g. gsc_date, ga4_date).
object
Example
{ "data": { "points": [ { "date": "2026-05-01", "top_1": 12, "top_2_3": 34, "top_4_10": 120, "top_11_30": 260, "top_31_50": 190, "top_51_100": 310, "no_position": 45 } ] }, "meta": { "project_id": 12345, "date_from": "2026-05-01", "date_to": "2026-05-31", "source_status": { "gsc": "connected", "ga4": "not_connected" }, "data_freshness": { "gsc_date": "2026-06-30", "ga4_date": "2026-07-02" } }}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." }}Google Search Console is not connected
Also returned as site_audit_data_unavailable on endpoints that join Site Audit page content.
object
object
Example
{ "error": { "code": "gsc_not_connected", "message": "Google Search Console is not connected for this project." }}Validation error, invalid date range or invalid filter
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." }}