/v1/brands/{brand_id}/seo/keywords List the brand's keywords
A page of the brand's keyword library: saved (starred) keywords and the rank tracked ones, each with its search volume, difficulty and intent, its last, previous and best position, the brand page that ranked, its opportunity score, the article that targets it and its evidence (Search Console over the last 28 settled days against the 28 before, the site's own ranking, the competitors that rank where it does not, the research seed that suggested it, the prompts mapped to it), plus totals over the rank tracked rows (top 3, top 10, improved, declined), how many keywords each lens holds and the plan's limits. Offset-paginated and filtered and sorted over every row: lens reads another set of the brand's keywords than the library, filter narrows to rank tracked, saved, recommended or starred keywords, status to the article's state, ai_overview to what Google's AI Overview does with the brand, cluster_id to the members of one keyword cluster.
Path parameters
-
Brand UUID.
Query parameters
-
Page size (1-100).
default: 20
-
Keywords to skip.
default: 0
-
Column the rows are ordered by. Besides the table's columns:
clicks,impressionsandgsc_position(Search Console),ranked_position(the site's own ranking),gap_position(the best competitor's position) andprompts(prompts mapped to the keyword).one of created, keyword, source, page, volume, ai, questions, kd, intent, market, position, best, checked, opportunity, clicks, impressions, gsc_position, ranked_position, gap_position, prompts · default: created
-
ascordesc.one of asc, desc · default: desc
-
Only keywords containing this text.
-
Narrows the lens read:
all,rank_tracked,saved(no rank checks: in the library, the starred ones),recommended(high score, no article yet),starred, or an article state:planned,published,failed.one of all, rank_tracked, saved, recommended, starred, planned, published, failed · default: all
-
Only keywords whose newest article is in this state;
nonefor no article. -
shows(Google answers with an AI Overview),cites(it cites the brand's site),names(its text names the brand),not_you(shown, without the brand), orany. -
Only the keywords of this cluster.
-
Which of the brand's keywords to read; omitted, the library (rank tracked or starred).
tracked,starred,near_page_one(Search Console's position, else the site's own ranking, 11 to 20),zero_click(no click from 100 or more Search Console impressions),competitors(a competitor ranks for it and the site does not),ideas(a research run suggested it in the last 30 days) orall. -
Only the ideas a research run of this seed found (
POST .../seo/keyword-research), compared as stored: lowercase, spacing collapsed. -
Only the rows of exactly this keyword, compared as stored.
-
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
-
Show fields
- checks_limit integer (nullable) nullable
Rank checks per day the plan allows.
- tracked_limit integer (nullable) nullable
Most keywords the plan can track; null is unlimited.
-
Show fields
-
Keywords checked at least once.
-
Keywords that moved down at the last check.
-
Keywords that moved up at the last check.
-
Keywords the site ranks for in the top 100.
-
Keywords rank tracked.
- avg_position number (nullable) nullable
- last_checked_at string (nullable) nullable
- saved integer
Keywords saved without rank checks.
-
-
The Google market the numbers are for.
Show fields
-
Language code of the brand's market.
-
Google location code of the brand's market.
- chosen boolean
True when this is the market saved with
PUT /seo/keyword-market. - language_fallback boolean
True when keyword data is not available in the brand's language there, so the numbers are for this
language_codeinstead (Catalan in Spain is measured in Spanish). - location_fallback boolean
True when keyword data is not available for the brand's country, so the numbers are for this
location_codeinstead (Russia is measured in Kazakhstan). - location_name string (nullable) nullable
The country the numbers are for, when known.
-
-
Keywords matching the filters, across every page.
- domain string (nullable) nullable
The brand's site the positions are for.
- lenses KeywordLensCounts
How many keywords each lens holds, whatever the filters.
Show fields
- all integer
Every keyword of the brand, in the library or evidence only.
- competitors integer
A competitor ranks for it and the brand's site does not.
- ideas integer
A research run suggested it in the last 30 days.
- near_page_one integer
Search Console's position, else the site's own ranking, between 11 and 20.
- starred integer
Starred (saved).
- tracked integer
Rank tracked.
- zero_click integer
No click from 100 or more Search Console impressions.
-
- 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"
}