For developers
Everything we measure
can be read out.
One key opens both the REST API and the MCP endpoint; both are read-only and both come with the Studio plan. Your data is not locked to our screen - it reaches your script, your dashboard or your assistant in the same shape.
Carry it into your own dashboard
Pull the rank history into an internal dashboard, a spreadsheet or a weekly report. The data is yours; it does not have to stay on our screen.
A pre-release check
Before you ship new metadata, let your script read the cusp band: what position are you in on the word you just dropped from the subtitle, and is it really expendable?
Ask your assistant
With the MCP endpoint connected, “which of my keywords are in the threshold band and which is the most popular?” gets an answer without a single screenshot.
Start in one line
Three ways in, one key. Pick the one you are: an assistant that speaks MCP, a terminal, or a script.
claude mcp add --transport http rankcusp \
https://rankcusp.com/api/mcp \
--header "Authorization: Bearer rc_live_…" \
--header "Accept-Language: tr"That is the whole setup. The second header is what makes the verdicts come back in your language; drop it and they arrive in English. Ask “which of my keywords are in the cusp band?” and the assistant calls the tools below by itself.
The key
Create one from the Account screen. A key is shown once - we keep only a digest of it, so a lost key cannot be recovered; you revoke it and take a new one.
What an assistant can do
Nine tools. Eight of them only read; the last adds keywords, and says so to the client before it is called. An assistant reaches them the moment it is connected, and they are what the CLI calls underneath.
list_apps- The apps and rivals on the account. The
appIdevery other tool wants comes from here. cusp_actions- The 11-30 band, ordered by popularity: the short list of words worth spending characters on.
get_keyword- One keyword - rank, popularity, difficulty - with the verdict written out in your language: whether it is worth targeting, and on what grounds.
ranking_keywords- What an app already ranks for, out of the pooled record of every search this product has run. Point it at a rival to read theirs - Apple publishes no endpoint for this, so the answer is only as wide as what has been observed.
keyword_competitors- Who else ranks for a phrase, deeper than the ten the first page shows. An app at 40 where you sit at 60 is the one worth studying.
audit_metadata- Reads a draft title, subtitle and keyword field before you ship them, and says what repeats, what is wasted, and how many characters you get back.
country_priorities- Which storefront deserves the next hour: cusp counts per country, and where the rivals are weakest.
list_keywords- Every tracked keyword for one country, with its rank and its previous rank.
add_keywords- The one that writes. Adds keywords to an app's tracked set in a storefront, from a list or a pasted line. They arrive unscored - scoring costs requests to Apple and waits for the collector - so a null popularity here is not a zero.
The CLI
One `curl` and a key. It prints tables meant to be read in a terminal - an unmeasured value stays an em dash there too, so no zero is ever invented.
$ rankcusp cusp 1544… --country us
KEYWORD RANK Δ POP DIFF CUSP
─────────────── ──── ── ─── ──── ────
habit tracker 14 +5 32 41 •
streak tracking 23 - - 38 • rankcusp- Opens the session: what is connected, what you can ask, and a prompt.
rankcusp apps- The apps and rivals on the account.
rankcusp keywords <appId> --country <cc>- Every tracked keyword in one storefront.
rankcusp cusp <appId> --country <cc>- The cusp band for one app, ordered by popularity.
rankcusp keyword <appId> <phrase> --country <cc>- A single keyword with its verdict.
rankcusp audit --country <cc> --title … --keywords …- Checks a draft metadata set before you ship it.
rankcusp countries <appId>- Which storefront to work on next.
rankcusp tools- Lists the tools - how an assistant finds its own way around.
Endpoints
- GET
/api/v1/apps - The apps and rivals on the account. The
appIdevery other call wants comes from here. - GET
/api/v1/keywords?app=…&country=… - Tracked keywords: rank, previous rank, popularity, difficulty, and whether it is in the cusp band.
- GET
/api/v1/keywords?app=…&country=…&cusp=1 - The 11-30 band only - the ones a metadata edit pays off on most.
- GET
/api/v1/keywords?app=…&country=…&keyword=… - A single keyword: its first page and the verdict - should it be targeted, and on what grounds.
- POST
/api/mcp - The MCP endpoint (JSON-RPC 2.0). It carries the nine tools above.
What does a response look like?
The example below shows the shape of a call asking for the cusp band. Look at the second row: previousRank and popularity are null. That means the keyword was measured for the first time and its popularity could not be read yet - not that it is zero.
{
"total": 2,
"maxPageSize": 200,
"keywords": [
{
"keyword": "habit tracker",
"country": "us",
"rank": 14,
"previousRank": 19,
"delta": 5,
"popularity": 32,
"difficulty": 41,
"cusp": true,
"lastMeasuredAt": "2026-08-12T04:12:09.114Z"
},
{
"keyword": "streak tracking",
"country": "us",
"rank": 23,
"previousRank": null,
"delta": null,
"popularity": null,
"difficulty": 38,
"cusp": true,
"lastMeasuredAt": "2026-08-12T04:12:11.902Z"
}
]
}What you need to know
- An unmeasured value comes back as `null`, never as zero.
rank: nullmeans “outside the top 200”,popularity: nullmeans “not measured yet”. A client that replaces those with zero will, sooner or later, take their average. - Verdicts come back in your own language. The MCP endpoint reads the client's language; the CLI takes
RANKCUSP_LANG=tr. The numbers are the same in every language. - 120 requests per minute. Over that, a
429and aretry-after. - At most 200 rows per page; walk forward with
offset. - Only one tool writes.
add_keywordsadds to a tracked set and declares itself as writing, so a client can ask before calling it. Everything else, and every REST route, only reads. countryis required on every call: the same phrase in two storefronts is two different searches, and therefore two different rows.- A key stands for an account, not for a person. Generating separate keys instead of sharing one makes revoking one possible without breaking the other.