Fundamentals
ASO API Examples: curl + Python Recipes for App Store Data
Working ASO API recipes: curl and Python examples for app search, estimated revenue, keyword difficulty, and review mining — plus credit math and rate limits.
If you already know what an App Store data API is and how to pick one,
this page is the code: five copy-paste recipes — each as curl and Python (requests) — for the
building blocks of most ASO tooling: keyword shortlists, competitor dashboards, niche scanners,
and review mining across 1.1M+ iOS apps. Setup once: create a key in Settings → API Keys
(see the REST API quickstart) and
export GETAPPNICHE_API_KEY="getappniche_...". All endpoints live under
https://api.getappniche.com/api/v1/*, cost 1 credit per call (keyword difficulty: 10), and
every response reports credits_charged.
1. Search apps by keyword and estimated revenue
Find working apps in a niche — here, habit trackers with $3k+ estimated monthly revenue:
curl -H "Authorization: Bearer $GETAPPNICHE_API_KEY" \
"https://api.getappniche.com/api/v1/apps?search=habit%20tracker&min_revenue=3000&limit=10"
import os, requests
headers = {"Authorization": f"Bearer {os.environ['GETAPPNICHE_API_KEY']}"}
resp = requests.get("https://api.getappniche.com/api/v1/apps", headers=headers,
params={"search": "habit tracker", "min_revenue": 3000, "limit": 10})
resp.raise_for_status()
for app in resp.json()["items"]:
print(app["title"], app["revenue_est_monthly"]) # revenue is an estimate
Other filters: category, min_rating, min_reviews, min_downloads, growth filters,
sort_by/sort_dir, limit (max 100), offset. Run this weekly per niche and diff the
results — that’s a niche scanner that spots new entrants before they chart.
2. Pull one app’s detail record
App IDs use {store}:{store_id} format — apple:284882215 is Yelp:
curl -H "Authorization: Bearer $GETAPPNICHE_API_KEY" \
"https://api.getappniche.com/api/v1/apps/apple:284882215"
app = requests.get("https://api.getappniche.com/api/v1/apps/apple:284882215",
headers=headers).json() # full record incl. estimated revenue/downloads
This is the competitor-dashboard primitive: loop it over a watchlist of app_ids on a schedule,
store the estimated figures with a timestamp, and you have your own trend lines. A 404 means
the app_id isn’t in {store}:{store_id} shape.
3. Score one ASO keyword (10 credits)
Keyword difficulty is the one expensive call — 10 credits instead of 1 — so aim it at terms that survived a cheap first pass:
curl -H "Authorization: Bearer $GETAPPNICHE_API_KEY" \
"https://api.getappniche.com/api/v1/keywords/difficulty?keyword=habit%20tracker&store=apple&country=US&language=en"
score = requests.get("https://api.getappniche.com/api/v1/keywords/difficulty",
headers=headers, params={"keyword": "habit tracker", "store": "apple",
"country": "US", "language": "en"}).json() # difficulty + opportunity
Use it as the final gate in keyword research: brainstorm wide, then spend 10 credits only on terms you’d actually put in a title.
4. Batch-score a keyword shortlist
There’s no batch REST endpoint (the MCP server has a
batch_keyword_difficulty tool; over REST you loop) — and a loop must respect the
60 requests/minute rate limit, so build the sleep in from the start:
for kw in "habit tracker" "mood journal" "water reminder"; do
curl -s -H "Authorization: Bearer $GETAPPNICHE_API_KEY" --get \
--data-urlencode "keyword=$kw" -d "store=apple" -d "country=US" -d "language=en" \
"https://api.getappniche.com/api/v1/keywords/difficulty"
sleep 1.1 # stay under 60 requests/minute
done
import time
scores = {}
for kw in ["habit tracker", "mood journal", "water reminder"]:
resp = requests.get("https://api.getappniche.com/api/v1/keywords/difficulty",
headers=headers, params={"keyword": kw, "store": "apple",
"country": "US", "language": "en"})
if resp.status_code == 429: # rate limited: honor Retry-After, retry once
time.sleep(int(resp.headers.get("Retry-After", "5")))
resp = requests.get(resp.url, headers=headers)
resp.raise_for_status()
scores[kw] = resp.json()
time.sleep(1.1) # 60 rpm ceiling — ~1s per call stays safely under it
Sort scores by opportunity and you have a ranked shortlist. At 10 credits per keyword, a
20-term list costs 200 credits — budget for it (math below).
5. Pull an app’s reviews for mining
curl -H "Authorization: Bearer $GETAPPNICHE_API_KEY" \
"https://api.getappniche.com/api/v1/reviews?store=apple&store_id=284882215&limit=20"
reviews = requests.get("https://api.getappniche.com/api/v1/reviews", headers=headers,
params={"store": "apple", "store_id": 284882215, "limit": 20}
).json() # enriched rows with sentiment and topic signals, …
Pipe negative-sentiment rows from your top three competitors into a topic count and you get a feature-gap list — the programmatic version of competitor review analysis.
Budgeting your 5,000 credits
The Pro plan includes 5,000 credits/month. Worked example — a weekly niche-scan pipeline:
- 1 app search per week (recipe 1): 1 × 4 ≈ 4/month
- 50 app-detail pulls per week (recipe 2): 50 × 4 = 200/month
- 20 keyword scores per week (recipe 4): 20 × 10 × 4 = 800/month
- Daily reviews for 3 competitors (recipe 5): 3 × 30 = 90/month
Total ≈ 1,094 credits/month — about 22% of the allowance, with keyword difficulty ~75% of it. Rule of thumb: search, detail, and reviews are effectively free at hobby scale; the budget question is always “how many keywords do I score?” (hard ceiling: 500/month if you spend everything there). Extra 500-credit packs are available in the app if a project spikes.
Honest limits
- Revenue and downloads are estimates, modeled from public signals — ranges for comparing apps, never accounting data.
- iOS App Store data only.
- No rank-tracking endpoint — current keyword difficulty/opportunity scores, not a time series of where an app ranked. If rank history is your core workflow, this API won’t provide it.
Prefer no code at all?
The same data is exposed over MCP, so an AI agent can run every recipe above from plain-English prompts — see using the GetAppNiche MCP with Claude and the App Store MCP server guide. Either way, access is included in the plan: see pricing, grab a key, and your first call returns live data in under two minutes.