Get keyword metrics (popularity, difficulty) for up to 25 terms; with include=related, keyword research.
popularity is 5–100 (search volume proxy; popularity_source: apple = Apple Search Ads data),
difficulty 0–100 (how entrenched the top 10 is), est_downloads_at_1 the modelled daily downloads of the
#1 result. Terms not measured in the last 7 days are measured live (≤ 5 per call, 2–5 s each) when
wait=true; others return pending: true — call again in a minute.
include=related adds ~10 related terms with their metrics, suggestions the store's autocomplete,
top_apps the current top 10 apps. Pass app= to get that app's rank and a metadata relevance (0–1) for
every term — the core of an ASO keyword audit.
Request
curl "https://api.appgoat.ai/v1/keywords?qs=photo+editor%2Ccollage+maker&store=apple" \
-H "x-api-key: $APPGOAT_API_KEY"const res = await fetch("https://api.appgoat.ai/v1/keywords?qs=photo+editor%2Ccollage+maker&store=apple", {
headers: {
"x-api-key": process.env.APPGOAT_API_KEY,
},
});
const { data, meta } = await res.json();import os, requests
res = requests.get(
"https://api.appgoat.ai/v1/keywords?qs=photo+editor%2Ccollage+maker&store=apple",
headers={"x-api-key": os.environ["APPGOAT_API_KEY"]}
)
body = res.json()Query parameters
qstringOne term. Use
qs for several.qsstringComma-separated terms (≤ 25; ≤ 5 with related / suggestions).
store"apple" | "play"Required unless
app is given.countrystringDefault "us"
includestringComma list: related, suggestions, top_apps.
appstringAny app identifier (as in
{app}); adds app.rank and app.relevance per term.waitbooleanBlock up to ~25 s for a refresh (default). false = answer immediately from cache with a job id.
Default true
Response
200 with data: Keyword[]. See the envelope for meta.
termstringstoreStorecountrystringpopularityinteger | null5–100.
popularity_source"apple" | "proxy" | nulldifficultyinteger | null0–100.
difficulty_breakdownobject | nullresults_countinteger | nullest_downloads_at_1integer | nullmeasured_atstring | nullpendingbooleanBeing measured; call again in a minute.
top_app_idsstring[]top_appsAppCard[]relatedKeywordMetrics[]suggestionsstring[]appobjectapp.storeStoreapp.app_idstringapp.rankinteger | nullapp.relevancenumber0–1: term coverage in title (1), subtitle (0.7), description (0.4).
Example
{
"data": [
{
"term": "photo editor",
"store": "apple",
"country": "us",
"popularity": 62,
"popularity_source": "proxy",
"difficulty": 81,
"results_count": 200,
"est_downloads_at_1": 2900,
"measured_at": "2026-10-20T10:00:00Z",
"pending": false,
"top_app_ids": [
"1",
"2"
],
"app": {
"store": "apple",
"app_id": "1",
"rank": 14,
"relevance": 1
}
}
],
"meta": {
"credits_used": 1,
"store": "apple"
}
}Status codes
200
One entry per term, in request order.
A parameter is missing or invalid (
error.param names it).Missing or invalid API key.
insufficient_credits (the call costs more than you have left; nothing was done) or plan_limit (a feature of a higher plan).429
rate_limitedToo many requests per second for your plan.