/v1/brands/{brand_id}/seo/keywords/{keyword_id}/history Get a keyword's rank history
One keyword with its rank checks, newest first, a page at a time, with who held the top of the results page each time.
Path parameters
-
Tracked keyword id (UUID).
-
Brand UUID.
Query parameters
-
Page size (default 20, max 100).
default: 20
-
Continuation token from a previous response's
next_cursor. -
Preview the call without executing it. Runs auth, scope, eligibility and body validation, then returns
200with adry_runobject reporting the request-unit and credit cost plus a non-consuming quota snapshot. Nothing is debited, reserved, dispatched or mutated. An invalid body still returns422.default: false
Responses
-
A keyword of the brand, in the library or (through a
lens) evidence only; its last position when tracked.Show fields
-
Where the keyword first came from.
- article KeywordArticle (nullable) nullable
The newest article targeting it.
- best_position integer (nullable) nullable
Best position ever seen.
- change integer (nullable) nullable
Positions gained since the previous check; positive is better.
- checking boolean
A rank check is queued and has not landed yet.
- cluster KeywordClusterRef (nullable) nullable
The topic cluster it sits in; null when it stands alone or clusters were never built.
- created_at string (nullable) nullable
- gap_best_position integer (nullable) nullable
The best position among
gap_domains. - gap_domains array of string (nullable) nullable
Competitor sites that rank for it where the brand's site does not.
- gap_synced_at string (nullable) nullable
When the competitors' rankings were read.
- gsc_clicks integer (nullable) nullable
Search Console clicks over the last 28 settled days; null when the query is not among the ones kept (10 or more impressions, the 10,000 most seen).
- gsc_impressions integer (nullable) nullable
Search Console impressions over the same 28 days.
- gsc_position number (nullable) nullable
Search Console average position over the 28 days.
- gsc_prev_position number (nullable) nullable
Search Console average position over the 28 days before; null without impressions.
- gsc_synced_at string (nullable) nullable
When the Search Console numbers were read.
- gsc_url string (nullable) nullable
The page Search Console shows most for the query.
- idea_at string (nullable) nullable
When a research run last suggested it; ideas older than 30 days are cleared.
- idea_seed string (nullable) nullable
The research seed that last suggested it.
- last_check_failed_at string (nullable) nullable
Set when the provider could not answer the last check.
- last_checked_at string (nullable) nullable
- last_position integer (nullable) nullable
Google position at the last check; null when outside the top 100, or never checked.
- last_url string (nullable) nullable
The brand's page Google ranked at the last check; null when Google hid the page behind its own redirect.
- metrics KeywordMetrics (nullable) nullable
- object string
Always
tracked_keyword. - opportunity_score integer (nullable) nullable
The keyword's 0 to 100 score (volume, difficulty against what the site already ranks for, position, intent, AI Overview), halved once an article targets the keyword; content opportunities rank the keyword by the same score. Null until scored.
- opportunity_tier enum (nullable) nullable
highfrom 65,mediumfrom 40, elselow. - previous_position integer (nullable) nullable
Position at the check before.
- prompt_count integer
The brand's prompts mapped to this keyword.
- rank_tracked boolean
Rank checks run for it and it counts against the plan's tracking cap.
falsewithstarredis a saved keyword, free and uncapped;falsewithout it is evidence only, outside the library. - ranked_etv number (nullable) nullable
Estimated monthly traffic that ranking brings.
- ranked_position integer (nullable) nullable
The site's best position in its ranking keywords; null when it does not rank.
- ranked_synced_at string (nullable) nullable
When the ranking was read.
- ranked_url string (nullable) nullable
The site's page that ranks at
ranked_position. - serp KeywordSerp (nullable) nullable
The Google page around the keyword, shared by every brand tracking it in this market; null until any rank check there has read it.
checked_atsays when. - starred boolean
On the brand's shortlist; a saved keyword is starred. With
rank_tracked, what puts a keyword in the library. - target_url string (nullable) nullable
The page that should rank for it.
- next_cursor string (nullable) nullable
Opaque continuation token. Pass back as
?cursor=to fetch the next page.nullwhenhas_moreis false. - object string
-
Show fields
-
Stable machine-readable error code from the catalog.
-
Human-readable description suitable for logging.
- details object
Optional, code-specific context (e.g.
errorsarray forvalidation_error,retry_afterforservice_unavailable). Shape depends onerror.code; treat as opaque otherwise.Show fields
Empty object (no properties).
-
- request_id string
Server-generated correlation id for the request. Mirrors the
X-Correlation-IDresponse header. Include this when contacting support.
Example response
{
"error": {
"code": "validation_error",
"message": "Request validation failed"
},
"request_id": "9f6c4e8a-1d3b-4c8b-9f1e-7a3b1c2d3e4f"
}-
Show fields
-
Stable machine-readable error code from the catalog.
-
Human-readable description suitable for logging.
- details object
Optional, code-specific context (e.g.
errorsarray forvalidation_error,retry_afterforservice_unavailable). Shape depends onerror.code; treat as opaque otherwise.Show fields
Empty object (no properties).
-
- request_id string
Server-generated correlation id for the request. Mirrors the
X-Correlation-IDresponse header. Include this when contacting support.
Example response
{
"error": {
"code": "unauthorized",
"message": "Missing or invalid credentials"
},
"request_id": "9f6c4e8a-1d3b-4c8b-9f1e-7a3b1c2d3e4f"
}-
Show fields
-
Stable machine-readable error code from the catalog.
-
Human-readable description suitable for logging.
- details object
Optional, code-specific context (e.g.
errorsarray forvalidation_error,retry_afterforservice_unavailable). Shape depends onerror.code; treat as opaque otherwise.Show fields
Empty object (no properties).
-
- request_id string
Server-generated correlation id for the request. Mirrors the
X-Correlation-IDresponse header. Include this when contacting support.
Example response
{
"error": {
"code": "forbidden",
"message": "You do not have permission to access this resource"
},
"request_id": "9f6c4e8a-1d3b-4c8b-9f1e-7a3b1c2d3e4f"
}-
Show fields
-
Stable machine-readable error code from the catalog.
-
Human-readable description suitable for logging.
- details object
Optional, code-specific context (e.g.
errorsarray forvalidation_error,retry_afterforservice_unavailable). Shape depends onerror.code; treat as opaque otherwise.Show fields
Empty object (no properties).
-
- request_id string
Server-generated correlation id for the request. Mirrors the
X-Correlation-IDresponse header. Include this when contacting support.
Example response
{
"error": {
"code": "not_found",
"message": "Resource not found"
},
"request_id": "9f6c4e8a-1d3b-4c8b-9f1e-7a3b1c2d3e4f"
}-
Show fields
-
Stable machine-readable error code from the catalog.
-
Human-readable description suitable for logging.
- details object
Optional, code-specific context (e.g.
errorsarray forvalidation_error,retry_afterforservice_unavailable). Shape depends onerror.code; treat as opaque otherwise.Show fields
Empty object (no properties).
-
- request_id string
Server-generated correlation id for the request. Mirrors the
X-Correlation-IDresponse header. Include this when contacting support.
Example response
{
"error": {
"code": "conflict",
"message": "Resource conflict"
},
"request_id": "9f6c4e8a-1d3b-4c8b-9f1e-7a3b1c2d3e4f"
}-
Show fields
-
Stable machine-readable error code from the catalog.
-
Human-readable description suitable for logging.
- details object
Optional, code-specific context (e.g.
errorsarray forvalidation_error,retry_afterforservice_unavailable). Shape depends onerror.code; treat as opaque otherwise.Show fields
Empty object (no properties).
-
- request_id string
Server-generated correlation id for the request. Mirrors the
X-Correlation-IDresponse header. Include this when contacting support.
Example response
{
"error": {
"code": "rate_limit_exceeded",
"message": "Per-minute rate limit exceeded"
},
"request_id": "9f6c4e8a-1d3b-4c8b-9f1e-7a3b1c2d3e4f"
}-
Show fields
-
Stable machine-readable error code from the catalog.
-
Human-readable description suitable for logging.
- details object
Optional, code-specific context (e.g.
errorsarray forvalidation_error,retry_afterforservice_unavailable). Shape depends onerror.code; treat as opaque otherwise.Show fields
Empty object (no properties).
-
- request_id string
Server-generated correlation id for the request. Mirrors the
X-Correlation-IDresponse header. Include this when contacting support.
Example response
{
"error": {
"code": "internal_error",
"message": "An unexpected error occurred"
},
"request_id": "9f6c4e8a-1d3b-4c8b-9f1e-7a3b1c2d3e4f"
}-
Show fields
-
Stable machine-readable error code from the catalog.
-
Human-readable description suitable for logging.
- details object
Optional, code-specific context (e.g.
errorsarray forvalidation_error,retry_afterforservice_unavailable). Shape depends onerror.code; treat as opaque otherwise.Show fields
Empty object (no properties).
-
- request_id string
Server-generated correlation id for the request. Mirrors the
X-Correlation-IDresponse header. Include this when contacting support.
Example response
{
"error": {
"code": "service_unavailable",
"message": "Service temporarily unavailable, please retry"
},
"request_id": "9f6c4e8a-1d3b-4c8b-9f1e-7a3b1c2d3e4f"
}