Appleak for developers
Everything Appleak researches about the App Store and Google Play, from your own code or your AI assistant: one key, paid from the same credits as the app.
What it is
The Appleak API is a REST API at https://appleak.app/api/v1, and the same endpoints are tools on an MCP server at https://appleak.app/api/mcp. Both answer to one key.
- Free reads: find an app by name or store link, read its listing and revenue estimate, the top charts, new releases and the UGC video library.
- Runs: category reports, research, teardowns, Ad Search, Influencer Search and live UGC video search. Each costs exactly what it costs in the app, from your plan’s credits.
The API comes with every paid plan: Basic, Starter and Pro. Pro gets the highest limits.
Your first call
Make a key on the Developers page, then:
export APPLEAK_KEY=apk_live_YOUR_KEY
# Your balance and what each run costs (free)
curl https://appleak.app/api/v1/me -H "Authorization: Bearer $APPLEAK_KEY"
# Start a category report, then wait for it
curl https://appleak.app/api/v1/reports -H "Authorization: Bearer $APPLEAK_KEY" \
-H "Content-Type: application/json" -H "Idempotency-Key: meditation-1" \
-d '{"question":"what do users hate about meditation apps"}'
curl "https://appleak.app/api/v1/jobs/JOB_ID?wait=30" -H "Authorization: Bearer $APPLEAK_KEY"Keys
Send the key as Authorization: Bearer apk_live_… on every request. Only that header is read: not a cookie, and not the address, which ends up in logs.
- A key is shown once, when you make it. Appleak keeps a fingerprint of it, never the key. Lost it? Revoke it and make another.
- A read-only key can look things up but cannot start a run that spends credits: the one to hand an AI assistant you are trying out.
- A key can have its own credits a day, so a script that goes wrong stops there.
- Revoked keys stop working within a minute.
Credits and what runs cost
Credits are the app’s own: the same balance pays for runs in the app and through the API, and a run costs the same in both. Reads are free. Prices as they stand now:
| Run | Credits | Endpoint |
|---|---|---|
| Category report | 1 | POST /api/v1/reports |
| Research | 1 | POST /api/v1/research |
| App teardown | 1 | POST /api/v1/teardowns |
| Ad Search | 1, Find more 10 | POST /api/v1/ad-search |
| Influencer Search | 1, Find more 100 | POST /api/v1/creators |
| UGC video search | 1 | POST /api/v1/videos/search |
- An answer Appleak already holds is free: a teardown read in the last six hours, an Ad Search or Influencer Search run today, a UGC phrase searched in the last six hours. It comes back as a finished job with
credits: 0. - A run that fails, or is cancelled before it starts, is refunded, into the month it was charged in.
GET /api/v1/meshows your balance and these prices.
Limits by plan
| Plan | Credits a month | Requests a minute | Runs at once | Keys |
|---|---|---|---|---|
| Basic | 750 | 30 | 1 | 2 |
| Starter | 2,000 | 60 | 2 | 5 |
| Pro | 4,500 | 180 | 5 | 20 |
Every answer carries x-ratelimit-limit, x-ratelimit-remaining and x-ratelimit-reset. Runs past your plan’s runs at once wait their turn as queued. App searches and listings share the stores’ patience with the site, so a burst of them may be asked to wait a few seconds.
Runs are jobs
A run can take from a few seconds to half an hour, so starting one answers at once with 202 and a job:
statusisqueued,running,done,failedorcancelled;progressis 0–100 where the run says.GET /api/v1/jobs/{id}?wait=30answers as soon as it is done, or after 30 seconds. Ask again until it is done; the result is on the job.- Send an
Idempotency-Keyheader with each start. The same key again gets the same job, charged once; the same key with a different request is refused. - The same run, still waiting or going, is not started twice: you get the one already going (
duplicate: true). Sendforce: trueto start another anyway. - A category report started through the API is also in your History in the app.
Errors
Every error has one shape, { "error": { "type", "message" } }, and a status that says which kind:
| Status | Type | When |
|---|---|---|
| 400 | invalid_request | The input does not fit the endpoint. The issues list says which field and why. |
| 401 | missing_key / invalid_key | No key, a malformed one, or one that was revoked. |
| 402 | plan_excluded / plan_limit | The API needs a paid plan, or the free plan’s credits are used up. The plan field says which. |
| 403 | read_only_key | A read-only key tried to start a run that spends credits. |
| 404 | not_found | No such endpoint, app or job of yours. |
| 409 | not_cancellable | The run has started; only a waiting run can be cancelled. |
| 422 | idempotency_mismatch | An Idempotency-Key was used before for a different request. |
| 429 | rate_limited / quota / key_cap / plan_exhausted | Too many requests this minute, a daily cap, or this period’s credits are used up. Retry-After says how long to wait. |
| 503 | off / runs_not_open / not_set_up | The API is switched off, or runs are not open yet. Free reads may still work. |
AI assistants and the reference
The MCP server: connect Claude Code, Cursor, VS Code or Claude Desktop, and your assistant can search apps, read charts and start runs itself.
The reference lists every endpoint with its inputs and an example answer, and openapi.json describes them for client generators and agent tool loaders.