apyhub
SEO

Research Keywords API

This collection of endpoints is designed for comprehensive keyword analysis and discovery. Use these requests to retrieve performance metrics for large lists of keywords or to generate new keyword ideas based on a seed term. This folder is divided into two main categories:

Bulk Keyword Metrics

  • Export Keywords Metrics: Submit a list of up to 5,000 keywords to get detailed data points for each, including search volume, CPC, competition score, keyword difficulty, and historical search volume trends. This is ideal for bulk analysis and data enrichment.

Keyword Discovery | Use these endpoints to expand your keyword lists and uncover new ranking opportunities.

  • Get Similar Keywords: Find keywords that are semantically similar to your seed keyword, including synonyms and close variations.
  • Get Related Keywords: Discover keywords that are topically related, based on having a high number of overlapping URLs in their search results.
  • Get Question Keywords: Generate a list of keywords phrased as common user questions, perfect for content marketing and FAQ creation.
  • Get Longtail Keywords: Find longer, more specific keyword phrases that often have lower competition and higher conversion rates.
▣ ENDPOINT 01 / 05
POST
Export Keywords Metrics
https://api.eu.apyhub.com/se-ranking/keyword-research/v1/keywords/export

QUICKSTART

GUIDE

Quickstart

Export keyword research results for a source and a list of keywords.

curl -X POST "https://api.eu.apyhub.com/se-ranking/keyword-research/v1/keywords/export?source=de" \
  -H "apy-token: $APY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keywords":["seo tools"]}'

What you'll get back

Returns a JSON array of objects. Each object can include keyword, cpc, volume, intents, difficulty, competition, history_trend, and is_data_found.

[
  {
    "keyword": "seo tools",
    "cpc": 2.34,
    "volume": 5400,
    "intents": ["I"],
    "difficulty": 42,
    "competition": 0.61,
    "history_trend": {
      "2026-01-01": 5200
    },
    "is_data_found": true
  }
]
TRY ITLIVE · 1000 ATOMS
Loading your default key…
The full key is used to call the gateway and stays in this tab — never sent to orbit or saved.
body
keywords*
Day is ignored; defaults to current month.
Day is ignored; only takes effect together with history_to.

About this endpoint

What it does

Exports bulk keyword metrics for the keywords you submit, using the selected source query parameter and request body options for sorting and optional history range filtering. The success response is a JSON array of keyword metric objects.

Query Parameter(s)

AttributeTypeMandatoryDescription
sourceStringYesKeyword data source.

Request Body

ParameterTypeMandatoryDescription
keywordsString ArrayYesList of keywords to export. Minimum 1 item, maximum 5000 items.
sortENUMNoSort field. Allowed values: volume, cpc, difficulty, competition. Default: cpc.
sort_orderENUMNoSort direction. Allowed values: asc, desc. Default: desc.
history_toStringNoDate in date format. Day is ignored; defaults to current month.
history_fromStringNoDate in date format. Day is ignored; only takes effect together with history_to.

Response

Returns a JSON array of objects. Each object may include keyword metrics such as keyword (string), volume (integer), cpc (number), difficulty (integer), competition (number), intents (string array of I, C, T, L, or N), history_trend (object keyed by YYYY-MM-DD with integer values), and is_data_found (boolean).

ParameterTypeMandatoryDescription
cpcNumberNoCPC value as a floating-point number.
volumeIntegerNoSearch volume.
intentsString ArrayNoIntent codes. Allowed values: I, C, T, L, N.
keywordStringNoKeyword text.
difficultyIntegerNoKeyword difficulty.
competitionNumberNoCompetition value as a floating-point number.
history_trendObjectNoKeyed by YYYY-MM-DD (first of month). Values are integers.
is_data_foundBooleanNoIndicates whether data was found.

Notes

keywords accepts up to 5000 items, so large bulk exports should be split before submission if you need to stay within the schema limit.

Query parameters

Name
Type
Description
sourceREQUIRED
string

Body

Name
Type
Description
bodyOPTIONAL
object
▣ ENDPOINT 02 / 05
GET
Get longtail keywords
https://api.eu.apyhub.com/se-ranking/keyword-research/v1/keywords/longtail

QUICKSTART

GUIDE

Quickstart

Get long-tail keyword suggestions for a source and keyword, with optional pagination in the query string.

curl -X GET "https://api.eu.apyhub.com/se-ranking/keyword-research/v1/keywords/longtail?source=de&keyword=running%20shoes" \
  -H "apy-token: $APY_TOKEN"

What you'll get back

Returns a JSON object with a total integer and a keywords array of strings.

{
  "total": 3,
  "keywords": ["best running shoes for men", "running shoes for flat feet", "lightweight running shoes"]
}
TRY ITLIVE · 100 ATOMS
Loading your default key…
The full key is used to call the gateway and stays in this tab — never sent to orbit or saved.

About this endpoint

What it does

Retrieves longtail keyword suggestions for a given source and keyword. The response returns the total number of results and a list of keyword strings.

Query Parameter(s)

AttributeTypeMandatoryDescription
limitIntegerNoMaximum number of results to return. Default: 100.
offsetIntegerNoNumber of results to skip before returning items. Default: 0.
sourceStringYesSource to use for the keyword lookup.
keywordStringYesThe keyword to expand into longtail suggestions.

Response

Returns a JSON object with a total integer field and a keywords string array field. total is the number of matching results, and keywords contains the returned keyword strings.

ParameterTypeMandatoryDescription
totalIntegerNoTotal number of matching results.
keywordsString ArrayNoList of keyword strings returned by the endpoint.

Query parameters

Name
Type
Description
limitOPTIONAL
integer
DEFAULT 100
offsetOPTIONAL
integer
DEFAULT 0
sourceREQUIRED
string
keywordREQUIRED
string
▣ ENDPOINT 03 / 05
GET
Get similar keywords
https://api.eu.apyhub.com/se-ranking/keyword-research/v1/keywords/similar

QUICKSTART

GUIDE

Quickstart

Fetch similar keywords for a given source and keyword, using the required query parameters.

curl -X GET "https://api.eu.apyhub.com/se-ranking/keyword-research/v1/keywords/similar?source=de&keyword=coffee"
-H "apy-token: $APY_TOKEN"

What you'll get back

Returns a JSON object with a total integer and a keywords array. Each item in keywords is an object that can include keyword, volume, cpc, intents, difficulty, competition, history_trend, and serp_features.

{
  "total": 2,
  "keywords": [
    {
      "keyword": "coffee beans",
      "volume": 90500,
      "cpc": 1.24,
      "intents": ["I", "T"],
      "difficulty": 42,
      "competition": 0.37,
      "history_trend": null,
      "serp_features": ["Featured snippet"]
    }
  ]
}
TRY ITLIVE · 1000 ATOMS
Loading your default key…
The full key is used to call the gateway and stays in this tab — never sent to orbit or saved.

About this endpoint

What it does

Returns a list of keywords similar to the keyword you provide, along with the total number of matches. The results can be sorted and filtered through query parameters, and the response includes keyword metrics such as volume, CPC, difficulty, and competition where available.

Query Parameter(s)

AttributeTypeMandatoryDescription
sortENUMNoSort field. Allowed values: keyword, volume, cpc, difficulty, competition.
limitIntegerNoMaximum number of results to return. Default: 100.
offsetIntegerNoNumber of results to skip before returning items. Default: 0.
sourceStringYesThe keyword source to query.
keywordStringYesThe seed keyword used to find similar keywords.
sort_orderENUMNoSort direction. Allowed values: asc, desc. Default: desc.
history_trendBooleanNoWhether to include history trend data. Default: false.
filter[cpc][to]NumberNoMaximum CPC value.
filter[intents]StringNoFilter by intent(s). The schema does not define the exact format.
filter[cpc][from]NumberNoMinimum CPC value.
filter[volume][to]IntegerNoMaximum search volume.
filter[volume][from]IntegerNoMinimum search volume.
filter[serp_features]StringNoFilter by SERP features. The schema does not define the exact format.
filter[difficulty][to]IntegerNoMaximum difficulty score. Range: 0 to 100.
filter[competition][to]NumberNoMaximum competition score. Range: 0 to 1.
filter[difficulty][from]IntegerNoMinimum difficulty score. Range: 0 to 100.
filter[competition][from]NumberNoMinimum competition score. Range: 0 to 1.
filter[keyword_count][to]IntegerNoMaximum number of words in the keyword.
filter[keyword_count][from]IntegerNoMinimum number of words in the keyword.
filter[characters_count][to]IntegerNoMaximum character count.
filter[characters_count][from]IntegerNoMinimum character count.
filter[multi_keyword_excluded]StringNoExcluded multi-keyword values. The schema does not define the exact format.
filter[multi_keyword_included]StringNoIncluded multi-keyword values. The schema does not define the exact format.

Response

Returns a JSON object with a total integer field and a keywords array field. Each item in keywords is an object containing keyword data such as keyword, volume, cpc, difficulty, competition, intents, history_trend, and serp_features as defined by the schema.

ParameterTypeMandatoryDescription
totalIntegerNoTotal number of matching keywords.
keywordsObject ArrayNoArray of keyword objects. Each item can include cpc (Number), volume (Integer), intents (String Array of I, C, T, L, N), keyword (String), relevance (Integer; only present on the "related keywords" endpoint), difficulty (Integer), competition (Number), history_trend (Object or null; additional properties are integers), and serp_features (String Array).

Query parameters

Name
Type
Description
sortOPTIONAL
string
keyword · volume · cpc · difficulty · competition
limitOPTIONAL
integer
DEFAULT 100
offsetOPTIONAL
integer
DEFAULT 0
sourceREQUIRED
string
keywordREQUIRED
string
sort_orderOPTIONAL
string
asc · desc
DEFAULT desc
history_trendOPTIONAL
boolean
DEFAULT false
filter[cpc][to]OPTIONAL
number
filter[intents]OPTIONAL
string
filter[cpc][from]OPTIONAL
number
filter[volume][to]OPTIONAL
integer
filter[volume][from]OPTIONAL
integer
filter[serp_features]OPTIONAL
string
filter[difficulty][to]OPTIONAL
integer
filter[competition][to]OPTIONAL
number
filter[difficulty][from]OPTIONAL
integer
filter[competition][from]OPTIONAL
number
filter[keyword_count][to]OPTIONAL
integer
filter[keyword_count][from]OPTIONAL
integer
filter[characters_count][to]OPTIONAL
integer
filter[characters_count][from]OPTIONAL
integer
filter[multi_keyword_excluded]OPTIONAL
string
filter[multi_keyword_included]OPTIONAL
string
▣ ENDPOINT 04 / 05
GET
Get question keywords
https://api.eu.apyhub.com/se-ranking/keyword-research/v1/keywords/questions

QUICKSTART

GUIDE

Quickstart

Search for question-style keyword ideas for a source and keyword.

curl -X GET "https://api.eu.apyhub.com/se-ranking/keyword-research/v1/keywords/questions?source=de&keyword=seo+tools" \
  -H "apy-token: $APY_TOKEN"

What you'll get back

Returns a JSON object with a total integer and a keywords array. Each item in keywords is an object that may include keyword, volume, cpc, difficulty, competition, intents, history_trend, and serp_features.

{
  "total": 2,
  "keywords": [
    {
      "keyword": "seo tools for small business",
      "volume": 2400,
      "cpc": 1.85,
      "difficulty": 36,
      "competition": 0.42,
      "intents": ["I", "C"],
      "history_trend": null,
      "serp_features": ["Featured snippet", "People also ask"]
    }
  ]
}
TRY ITLIVE · 1000 ATOMS
Loading your default key…
The full key is used to call the gateway and stays in this tab — never sent to orbit or saved.

About this endpoint

What it does

Returns question keyword suggestions for the provided keyword and source, with optional sorting, pagination, and query filters applied.

Query Parameter(s)

AttributeTypeMandatoryDescription
sortENUMNoSort field. Allowed values: keyword, volume, cpc, difficulty, competition.
limitIntegerNoMaximum number of results to return. Default: 100.
offsetIntegerNoNumber of results to skip before returning items. Default: 0.
sourceStringYesData source to query.
keywordStringYesKeyword to expand into question keyword suggestions.
sort_orderENUMNoSort direction. Allowed values: asc, desc. Default: desc.
history_trendBooleanNoWhether to include the history_trend field in each keyword item. Default: false.
filter[cpc][to]NumberNoUpper bound for cpc.
filter[intents]StringNoFilter by intent values.
filter[cpc][from]NumberNoLower bound for cpc.
filter[volume][to]IntegerNoUpper bound for volume.
filter[volume][from]IntegerNoLower bound for volume.
filter[serp_features]StringNoFilter by SERP features.
filter[difficulty][to]IntegerNoUpper bound for difficulty.
filter[competition][to]NumberNoUpper bound for competition.
filter[difficulty][from]IntegerNoLower bound for difficulty.
filter[competition][from]NumberNoLower bound for competition.
filter[keyword_count][to]IntegerNoUpper bound for keyword count.
filter[keyword_count][from]IntegerNoLower bound for keyword count.
filter[characters_count][to]IntegerNoUpper bound for character count.
filter[characters_count][from]IntegerNoLower bound for character count.
filter[multi_keyword_excluded]StringNoExcluded multi-keyword term(s).
filter[multi_keyword_included]StringNoIncluded multi-keyword term(s).

Response

Returns a JSON object with a total integer field and a keywords array field. Each item in keywords is an object containing keyword metrics and related metadata as defined by the output schema.

ParameterTypeMandatoryDescription
totalIntegerNoTotal number of matching keyword items.
keywordsObject ArrayNoArray of keyword result objects. Each item may include:<br>- cpc (Number): Cost per click.<br>- volume (Integer): Search volume.<br>- intents (String Array): Intent codes. Allowed values: I, C, T, L, N.<br>- keyword (String): The keyword text.<br>- relevance (Integer): Only present on the "related keywords" endpoint.<br>- difficulty (Integer): Difficulty score.<br>- competition (Number): Competition score.<br>- history_trend (Object): Nullable object with additional integer properties.<br>- serp_features (String Array): SERP feature names.

Query parameters

Name
Type
Description
sortOPTIONAL
string
keyword · volume · cpc · difficulty · competition
limitOPTIONAL
integer
DEFAULT 100
offsetOPTIONAL
integer
DEFAULT 0
sourceREQUIRED
string
keywordREQUIRED
string
sort_orderOPTIONAL
string
asc · desc
DEFAULT desc
history_trendOPTIONAL
boolean
DEFAULT false
filter[cpc][to]OPTIONAL
number
filter[intents]OPTIONAL
string
filter[cpc][from]OPTIONAL
number
filter[volume][to]OPTIONAL
integer
filter[volume][from]OPTIONAL
integer
filter[serp_features]OPTIONAL
string
filter[difficulty][to]OPTIONAL
integer
filter[competition][to]OPTIONAL
number
filter[difficulty][from]OPTIONAL
integer
filter[competition][from]OPTIONAL
number
filter[keyword_count][to]OPTIONAL
integer
filter[keyword_count][from]OPTIONAL
integer
filter[characters_count][to]OPTIONAL
integer
filter[characters_count][from]OPTIONAL
integer
filter[multi_keyword_excluded]OPTIONAL
string
filter[multi_keyword_included]OPTIONAL
string
▣ COMMON ERRORS

Errors any endpoint can return

400bad_request

Required parameter missing or malformed body.

401unauthorized

API key missing, revoked, or not authorized for this service.

429rate_limited

Your plan's per-second rate exceeded. Retry with exponential backoff.

503upstream_busy

Backend temporarily unavailable. Try again in a few seconds.