curl --request GET \
--url https://api.appgoat.ai/v1/keywords \
--header 'x-api-key: <api-key>'const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.appgoat.ai/v1/keywords', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.appgoat.ai/v1/keywords"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text){
"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"
}
}{
"error": {
"code": "invalid_param",
"message": "limit must be ≤ 100",
"hint": "Fix the parameter and retry.",
"docs": "https://appgoat.ai/docs/errors#invalid_param",
"param": "limit"
}
}{
"error": {
"code": "invalid_param",
"message": "<string>",
"hint": "<string>",
"docs": "<string>",
"param": "<string>"
}
}Get keywords
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.
curl --request GET \
--url https://api.appgoat.ai/v1/keywords \
--header 'x-api-key: <api-key>'const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.appgoat.ai/v1/keywords', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.appgoat.ai/v1/keywords"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text){
"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"
}
}{
"error": {
"code": "invalid_param",
"message": "limit must be ≤ 100",
"hint": "Fix the parameter and retry.",
"docs": "https://appgoat.ai/docs/errors#invalid_param",
"param": "limit"
}
}{
"error": {
"code": "invalid_param",
"message": "<string>",
"hint": "<string>",
"docs": "<string>",
"param": "<string>"
}
}Authorizations
Create a key at https://dash.appgoat.ai.
Query Parameters
One term. Use qs for several.
"photo editor"
Comma-separated terms (≤ 25; ≤ 5 with related / suggestions).
"photo editor,collage maker"
Required unless app is given.
apple, play Comma list: related, suggestions, top_apps.
Any app identifier (as in {app}); adds app.rank and app.relevance per term.
Block up to ~25 s for a refresh (default). false = answer immediately from cache with a job id.