Skip to content

List saved keywords

GET
/v1/keywords
curl --request GET \
--url 'https://api-v1.tailwind.ai/v1/keywords?limit=50' \
--header 'Authorization: Bearer <token>'

The authenticated organization’s saved keywords, newest first. This is the same list the Tailwind dashboard’s Saved Keywords page shows — it is not keyword research; these are terms the organization has already chosen to track.

search
string
<= 255 characters

Only return keywords containing this text.

limit
integer
default: 50 >= 1 <= 100

Keywords per page.

cursor
string

Opaque cursor from a previous response’s pagination.nextCursor.

A page of saved keywords

Media typeapplication/json
object
data
object
keywords
Array<object>

A keyword on the organization’s saved list — the same list the Tailwind dashboard’s Saved Keywords page shows.

object
id

Saved keyword ID

string
term

The keyword text

string
savedAt

When the keyword was added to the list

string format: date-time
urls

URLs of the organization’s own that this keyword is associated with

Array<string>
tags

Tags the organization has applied to this keyword

Array<object>
object
id
string
name
string
pinterestSearchVolume

Estimated monthly Pinterest search volume, or 0 when unknown

integer
commercialIntentScore

How strongly the term signals buying intent. Absent when Tailwind has no interest data for it.

number
detectedLanguage

Language detected for the term, e.g. “english”. Absent when Tailwind has no interest data for it.

string
pagination
object
limit
integer
hasMore
boolean
nextCursor

Pass as cursor to fetch the next page

string
totalCount

Total matching keywords across all pages

integer
meta
object
requestId

Unique request ID for debugging

string
Examplegenerated
{
"data": {
"keywords": [
{
"id": "example",
"term": "example",
"savedAt": "2026-04-15T12:00:00Z",
"urls": [
"example"
],
"tags": [
{
"id": "example",
"name": "example"
}
],
"pinterestSearchVolume": 1,
"commercialIntentScore": 1,
"detectedLanguage": "example"
}
],
"pagination": {
"limit": 1,
"hasMore": true,
"nextCursor": "example",
"totalCount": 1
}
},
"meta": {
"requestId": "example"
}
}

Invalid request

Media typeapplication/json
object
error
object
code

Error code

string
message

Error message

string
reason

Machine-readable denial reason. Present on PAYMENT_REQUIRED errors: insufficient_credits, trial_exhausted, no_access, account_not_connected, legacy_post_limit_exceeded.

string
resolve_url

Present on PAYMENT_REQUIRED errors: where the denial can be resolved. Reason-specific, because buying credits does not clear a trial, access or connection denial. Requests sent with X-Request-Source: mcp receive an informational plans page instead, so agent surfaces never present a purchase link.

string
meta
object
requestId

Unique request ID for debugging

string
Example
{
"error": {
"code": "BAD_REQUEST",
"message": "Invalid request body"
},
"meta": {
"requestId": "abc123"
}
}

Authentication required or invalid bearer credentials

Media typeapplication/json
object
error
object
code

Error code

string
message

Error message

string
reason

Machine-readable denial reason. Present on PAYMENT_REQUIRED errors: insufficient_credits, trial_exhausted, no_access, account_not_connected, legacy_post_limit_exceeded.

string
resolve_url

Present on PAYMENT_REQUIRED errors: where the denial can be resolved. Reason-specific, because buying credits does not clear a trial, access or connection denial. Requests sent with X-Request-Source: mcp receive an informational plans page instead, so agent surfaces never present a purchase link.

string
meta
object
requestId

Unique request ID for debugging

string
Example
{
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid API key"
},
"meta": {
"requestId": "abc123"
}
}

Rate limit exceeded

Media typeapplication/json
object
error
object
code

Error code

string
message

Error message

string
reason

Machine-readable denial reason. Present on PAYMENT_REQUIRED errors: insufficient_credits, trial_exhausted, no_access, account_not_connected, legacy_post_limit_exceeded.

string
resolve_url

Present on PAYMENT_REQUIRED errors: where the denial can be resolved. Reason-specific, because buying credits does not clear a trial, access or connection denial. Requests sent with X-Request-Source: mcp receive an informational plans page instead, so agent surfaces never present a purchase link.

string
meta
object
requestId

Unique request ID for debugging

string
Example
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Daily rate limit of 5000 requests exceeded. Resets at midnight UTC."
},
"meta": {
"requestId": "abc123"
}
}