01Base address and authentication
The base is https://storelift.net/v1. Create a key under Settings → API; it is shown once and stored only as a hash, so a lost key is replaced rather than recovered.
Send it as x-api-key, or as a bearer token if your client only does Authorization headers:
curl -s https://storelift.net/v1/apps \
-H "x-api-key: sl_live_..."02The 9 endpoints
| Endpoint | What it returns |
|---|---|
GET /v1/apps | The apps this account tracks. Every other call starts here — the id comes from this one. |
GET /v1/apps/{id} | One app plus the latest run's snapshot. |
GET /v1/apps/{id}/keywords | Current rank per tracked keyword in one storefront, with the measurement state and the depth searched. |
GET /v1/apps/{id}/rivals | The apps standing above you, each with the terms they beat you on and both positions. |
GET /v1/apps/{id}/ai | Whether an assistant names your app for your category, with the stored series. Studio measures it. |
GET /v1/apps/{id}/history | The rank series per keyword, trimmed to the plan's history window. |
GET /v1/apps/{id}/page | Your own listing as the store serves it, both platforms, plus the dated changes detected on it. |
GET /v1/apps/{id}/reviews | Recent reviews with the star summary, the count new in this run, and the Play side when measured. |
GET /v1/apps/{id}/charts | Top-chart position for the app's genre and storefront, with the series. |
Endpoints below /apps/{id} take country (a storefront code such as us, defaulting to the app's first) and, where both stores are measured, platform=ios|android.
03The three measurement states survive the boundary
This is the part worth reading before you write the integration. A rank field can be a number, but the absence of a number is two different things and the API keeps them apart:
measured: true,rank: 7— the app was found at position 7.measured: true,rank: null— the search ran and the app was not in the results at the depth we read.measured: false— the search could not be run that day. Nothing is known about the position.
{
"country": "de",
"platform": "ios",
"live": true,
"measuredAt": "2026-09-19T02:14:08.921Z",
"keywords": [
{ "term": "traumdeutung", "measured": true, "rank": 7, "demand": 6, "searchDepth": 200 },
{ "term": "traumsymbole", "measured": true, "rank": null, "demand": 3, "searchDepth": 200 },
{ "term": "traumtagebuch", "measured": false, "rank": null, "demand": null, "searchDepth": null }
]
}Folding the last two into a zero would describe a collapse that never happened, and every average built on top of it would be wrong. If your code needs one number, treat measured: false as a gap in the series, not as a value.
04What it does not do
- It does not write. Every endpoint is
GET; anything else returnsmethod_not_allowed. There is no path from the API to your listing, your tracked keywords or your billing. - It does not measure on demand. The endpoints read what the nightly run collected. Asking twice does not send a second query to the stores.
- It does not carry the revenue layer. Connected accounts (App Store Connect, Apple Ads, RevenueCat, GA4) stay in the dashboard — a deliberate line, not an oversight.
- History is trimmed by plan.
historyandchartsboth cut at the plan's window, so the same key cannot reach further through one endpoint than the other.
05Errors
| Status | error | When |
|---|---|---|
| 401 | missing_api_key | No key in the request. |
| 401 | invalid_api_key | The key is unknown or was revoked. |
| 401 | account_deleted | The account behind the key is gone. |
| 403 | plan_required | The plan does not include API access. The response carries the current plan. |
| 405 | method_not_allowed | Every endpoint is GET. Nothing writes. |
| 404 | not_found | That app id is not in this account. |
| 404 | unknown_endpoint | No such path under /v1. |
Every error is JSON with an error field. plan_required also returns plan, so a client can say which plan the key is on rather than guessing.
Frequently asked
Is there a rate limit?
There is no per-key quota. The gateway in front of the API has an account-wide ceiling, and each call updates a usage counter on the key so you can see in Settings whether an old key is still in use.
Can I use it on the free plan?
No — API access starts at Pro. The free tools on this site need no account at all, and the free plan still measures one app daily.
API or MCP server?
A script wants the API: fixed shapes, one call, no model in the loop. An assistant wants the MCP server, because the tools carry their own descriptions and it can pick the right call without you writing the integration. Both read the same measurements.
See this for your own app
Paste your store link, add your keywords. Rank, the apps above you and demand are measured every day.
Free plan: 1 app, 25 keywords in each of 2 storefronts, 30 days of history, no card, no end date. Pro is $20/mo.
Start free →