The GetAppNiche REST API lets you pull the same iOS App Store data you see in the app — app
search with revenue and download estimates, ASO keyword difficulty, and reviews — into your own
scripts, Google Sheets, n8n/Zapier-style automations, or anything else that can make an HTTP
request. You don’t need to be a full-time developer: if you can run a curl command or paste a
snippet into an automation tool, you can use it.
Base URL:
https://api.getappniche.com
1. Create an API key
Sign in (or
create an account), then go to Settings → API
Keys after signing in to API Keys.
Click Create key, name it, and copy the secret — it’s shown once. Keys look like
getappniche_... and can be rotated or revoked anytime.
2. Authenticate
Send your key as a Bearer token on every request:
Authorization: Bearer YOUR_API_KEY
Keep the key in an environment variable or secret manager. Never place it in a browser URL,
client-side bundle, notebook you plan to share, or committed .env file.
3. Endpoints
| Endpoint | Credits | Use it for |
|---|---|---|
GET /api/v1/apps | 1 | Search and filter apps by category, keyword, revenue, downloads, rating, growth. |
GET /api/v1/apps/{app_id} | 1 | One app’s full detail record. app_id uses {store}:{store_id} format, e.g. apple:284882215. |
GET /api/v1/keywords/difficulty | 10 | Score one ASO keyword’s difficulty and opportunity. |
GET /api/v1/reviews | 1 | Fetch enriched review rows with sentiment and topic signals. |
Search apps
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.getappniche.com/api/v1/apps?search=habit%20tracker&min_revenue=3000&limit=10"
Useful query parameters: store, category, search, min_rating, min_reviews,
min_downloads, min_revenue, growth filters, limit (max 100), offset, sort_by,
sort_dir.
The list response contains items, total, limit, and offset. Increment offset by the number
of items returned until you have the sample you need or the response is empty. Deep catalog scraping
is intentionally limited; use targeted filters rather than walking every page.
An abbreviated response looks like this. The app is fictional, but the field names and nesting match the API contract:
{
"items": [
{
"app_id": "apple:1234567890",
"store": "apple",
"title": "Example Habit Tracker",
"rating": 4.7,
"rating_count": 8420,
"reviews_delta_7d": 140,
"downloads_est_monthly": 30000,
"revenue_est_monthly": 90000,
"source_updated_at": "2026-07-19T04:10:00Z"
}
],
"total": 17,
"limit": 10,
"offset": 0
}
Treat rating_count and source_updated_at as observed context. Fields ending in _est_monthly are
modeled values; label them as estimates wherever you store or present them.
App detail
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.getappniche.com/api/v1/apps/apple:284882215"
Keyword difficulty
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.getappniche.com/api/v1/keywords/difficulty?keyword=habit%20tracker&store=apple&country=US&language=en"
Reviews
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.getappniche.com/api/v1/reviews?store=apple&store_id=284882215&limit=20"
Want more complete scripts? The MIT-licensed getappniche-examples repo has runnable examples built on these endpoints.
Python example
import requests
API_KEY = "YOUR_API_KEY"
headers = {"Authorization": f"Bearer {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()
data = resp.json()
for app in data["items"]:
print(app["title"], app["revenue_est_monthly"])
JavaScript example
const API_KEY = "YOUR_API_KEY";
const url = new URL("https://api.getappniche.com/api/v1/apps");
url.searchParams.set("search", "habit tracker");
url.searchParams.set("min_revenue", "3000");
url.searchParams.set("limit", "10");
const resp = await fetch(url, {
headers: { Authorization: `Bearer ${API_KEY}` },
});
if (!resp.ok) throw new Error(`API error ${resp.status}`);
const data = await resp.json();
console.log(data);
Production request habits
- Set a connection and response timeout; do not let a stalled request block a worker indefinitely.
- Retry
429and temporary5xxresponses with backoff. Do not retry401,402, or422without changing the request. - Respect
Retry-Afteron rate-limit responses. - Cache stable app-detail records when your workflow asks for the same app repeatedly.
- Log the endpoint, status, request time, and app ID—but never the full Authorization header.
- Store the source date beside data used in a report. Keyword and MCP responses include
credits_charged; REST search, detail, and review usage is recorded in Settings.
Credits and rate limits
- Your plan includes 5,000 API credits per month, refreshed automatically each month.
- Keyword-difficulty responses and MCP tool results include
credits_charged. Search, detail, and review request costs are visible in the per-request usage history in Settings. - Balance and per-request history live at Settings. Extra packs of 500 credits are available inside the app.
- Rate limit: 60 requests per minute per API key. Exceed it and you get HTTP 429 with a
Retry-Afterheader telling you how long to wait.
Errors and how to fix them
| Status | Meaning | Fix |
|---|---|---|
401 | Missing or invalid API key | Check the Authorization: Bearer ... header and that the full key (starting getappniche_) was pasted. |
402 | Plan doesn’t include API access, or you’re out of credits | Check your balance in Settings; buy a credit pack or wait for the monthly refresh. |
404 | App not found | Verify the app_id uses {store}:{store_id} format, e.g. apple:284882215. |
422 | Invalid parameters | Check parameter names and values against the endpoint docs above (e.g. limit max is 100). |
429 | Rate limited | Slow down to under 60 requests/minute and respect the Retry-After header. |
Using an AI assistant instead?
If you want Claude, Cursor, or another AI agent to query this data directly — no code at all — use the client-specific configs, tool reference, and verification prompts on the GetAppNiche MCP page.