# API reference > https://storelift.net/docs/api/ One base URL, one key, JSON in and out. Every endpoint below is also an MCP tool with the same name. OpenAPI 3.1: https://storelift.net/openapi.json ## Base URL `https://storelift.net/v1` Every path below is relative to it. Send `GET` for reads and `POST` only on `/actions`. ## Authentication Send the key in `Authorization: Bearer ` or in `x-api-key`. Create keys under Settings › API; each key carries scopes, an optional IP allow list, an optional app list and an optional monthly credit budget. A key that reaches its budget answers `402 key_budget_reached` until the month turns; the other keys keep working. Live keys (`sl_live_`) for the REST API are on Pro and above, or on any plan with a credit pack. Free includes one live key that works on the MCP server only. Test keys (`sl_test_`) return the sandbox data on every plan. Assistants sign in over OAuth through the [MCP server](https://storelift.net/mcp-server/) on every plan. ## Credits and limits Each call costs the credits listed on it; `/account` and `/usage` cost 0, and a write's preview costs 0. Every response carries `x-credits-used`, `x-credits-limit`, `x-credits-remaining` and `x-credits-reset`. Requests per second are set per plan; past it you get `429 rate_limited` with `retry-after`. Hive endpoints open with purchased API credits or with Hive Explorer and also count against a daily allowance: 500 calls on pack credits, 10,000 with Hive Explorer. [Credits per call](https://storelift.net/hive/api/) ## Sandbox `https://storelift.net/v1/sandbox` answers every read below that has a sample response, with no key and no credits. The data is fixed and dated, so tests stay stable. Test keys (`sl_test_`) return the same data on the live base URL and never write. ## Reading a rank A rank has three states and they stay distinct: `measured: false` means the query was not measured that day, `rank: null` means it was measured and the app is outside the results read, and a number is the rank. ## Errors Every error has the same body: `{ "error": "", "message": "…", "docs": "…" }`. `error` is stable; branch on it, not on `message`. Some codes add fields such as `scope`, `field` or `limit`. [All error codes](https://storelift.net/docs/api/errors/) ## Worked examples Three jobs, from the first call to the result you keep. Every command runs against the sandbox, so it spends no credits and changes nothing, and each response is what the sandbox returns for it. With your own key the paths are the same without `/sandbox` and each call costs the credits listed on it. A test key (`sl_test_`) answers with the sandbox data there too, at 0 credits. ### Add this week's keyword ranks to a report Read one app's keywords in one storefront and keep a single row. Run it weekly and the rows line up into a trend. Scope: `apps:read` · Credits: 2 · 0 in the sandbox or with a test key · Plan: Sandbox and test key: every plan · live key: Pro and above · Works from: API 1.5.0 1. Find the app id. ```sh curl "https://storelift.net/v1/sandbox/apps" ``` Response: ```json { "apps": [ { "id": "sbx-lumen", "name": "Lumen — Sleep Sounds", "icon": null, "iosId": "1000000001", "androidPkg": "net.storelift.sandbox.lumen", "bundleId": "net.storelift.sandbox.lumen", "countries": [ "us", "gb", "de" ], "keywords": [ "sleep sounds", "white noise", "rain sounds" ], "keywordsByCountry": { "us": [ "sleep sounds", "white noise", "rain sounds" ], "gb": [ "sleep sounds", "white noise", "rain sounds" ], "de": [ "sleep sounds", "white noise", "rain sounds" ] }, "manualRivals": null, "keywordTags": null, "buriedKeywords": null, "goal": null, "tasksDone": null }, { "id": "sbx-quill", "name": "Quill Notes", "icon": null, "iosId": "1000000002", "androidPkg": null, "bundleId": "net.storelift.sandbox.quill", "countries": [ "us", "jp" ], "keywords": [ "notes", "markdown notes", "journal" ], "keywordsByCountry": { "us": [ "notes", "markdown notes", "journal" ], "jp": [ "notes", "markdown notes", "journal" ] }, "manualRivals": null, "keywordTags": null, "buriedKeywords": null, "goal": null, "tasksDone": null } ] } ``` 2. Read every tracked keyword of that app in the storefront. ```sh curl "https://storelift.net/v1/sandbox/apps/sbx-lumen/keywords?country=us" ``` Response (keywords: 2 of 8 rows): ```json { "country": "us", "platform": "ios", "live": true, "measuredAt": "2026-09-27T02:10:00.000Z", "keywords": [ { "term": "sleep sounds", "measured": true, "rank": null, "demand": 73, "hintCount": 6, "popularity": 73, "popularitySource": "p2", "popularityWeek": null, "popularityNone": false, "difficulty": 70, "difficultyBand": "brutal", "difficultyNone": false, "popularityMeasuring": false, "difficultyMeasuring": false, "measuring": false, "searchDepth": 200 }, { "term": "white noise", "measured": true, "rank": 57, "demand": 37, "hintCount": 4, "popularity": 37, "popularitySource": "p2", "popularityWeek": null, "popularityNone": false, "difficulty": 70, "difficultyBand": "brutal", "difficultyNone": false, "popularityMeasuring": false, "difficultyMeasuring": false, "measuring": false, "searchDepth": 200 } ] } ``` Fold the answer into the row you store. A keyword with `measured: true` and `rank: null` was measured and the app is absent from the results; it is counted apart from a keyword that was not measured. ```js function weeklyRow(body) { const ranked = body.keywords.filter((k) => k.measured && k.rank !== null); const best = ranked.reduce((a, b) => (a && a.rank <= b.rank ? a : b), null); return { measuredAt: body.measuredAt, country: body.country, platform: body.platform, keywords: body.keywords.length, ranked: ranked.length, absent: body.keywords.filter((k) => k.measured && k.rank === null).length, notMeasured: body.keywords.filter((k) => !k.measured).length, best: best && { term: best.term, rank: best.rank }, }; } ``` Result: ```json { "measuredAt": "2026-09-27T02:10:00.000Z", "country": "us", "platform": "ios", "keywords": 8, "ranked": 6, "absent": 2, "notMeasured": 0, "best": { "term": "nature sounds", "rank": 29 } } ``` An app id the workspace does not have answers `404`: ```sh curl "https://storelift.net/v1/sandbox/apps/sbx-unknown/keywords?country=us" ``` ```json { "error": "not_found", "message": "No such app in this workspace.", "docs": "https://storelift.net/docs/api/errors#not_found" } ``` ### Ask who ranks above you The same data through the [MCP server](https://storelift.net/mcp-server/): the assistant makes two tool calls. To send them by hand, put a test key in `STORELIFT_TEST_KEY`. Scope: `apps:read` · Credits: 2 · 0 with a test key · Plan: Test key and OAuth: every plan · live key: every plan · Works from: API 1.5.0 · tools in storelift-mcp 1.1.1 1. `list_apps` returns the app id. ```sh curl "https://storelift.net/mcp" \ -H "Authorization: Bearer $STORELIFT_TEST_KEY" \ -H "content-type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"list_apps","arguments":{}}}' ``` Response: ```json { "apps": [ { "id": "sbx-lumen", "name": "Lumen — Sleep Sounds", "icon": null, "iosId": "1000000001", "androidPkg": "net.storelift.sandbox.lumen", "bundleId": "net.storelift.sandbox.lumen", "countries": [ "us", "gb", "de" ], "keywords": [ "sleep sounds", "white noise", "rain sounds" ], "keywordsByCountry": { "us": [ "sleep sounds", "white noise", "rain sounds" ], "gb": [ "sleep sounds", "white noise", "rain sounds" ], "de": [ "sleep sounds", "white noise", "rain sounds" ] }, "manualRivals": null, "keywordTags": null, "buriedKeywords": null, "goal": null, "tasksDone": null }, { "id": "sbx-quill", "name": "Quill Notes", "icon": null, "iosId": "1000000002", "androidPkg": null, "bundleId": "net.storelift.sandbox.quill", "countries": [ "us", "jp" ], "keywords": [ "notes", "markdown notes", "journal" ], "keywordsByCountry": { "us": [ "notes", "markdown notes", "journal" ], "jp": [ "notes", "markdown notes", "journal" ] }, "manualRivals": null, "keywordTags": null, "buriedKeywords": null, "goal": null, "tasksDone": null } ] } ``` 2. `get_rivals` returns the apps ranking above it, keyword by keyword. ```sh curl "https://storelift.net/mcp" \ -H "Authorization: Bearer $STORELIFT_TEST_KEY" \ -H "content-type: application/json" \ -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"get_rivals","arguments":{"appId":"sbx-lumen","country":"us"}}}' ``` Response (rivals: 2 of 3 rows): ```json { "country": "us", "platform": "ios", "rivals": [ { "id": "1000000101", "name": "Calm Rain", "ratings": 57046, "terms": [ { "term": "sleep sounds", "theirRank": 1, "ourRank": null }, { "term": "white noise", "theirRank": 1, "ourRank": 57 } ] }, { "id": "1000000102", "name": "Noisli", "ratings": 16114, "terms": [ { "term": "sleep sounds", "theirRank": 2, "ourRank": null }, { "term": "white noise", "theirRank": 2, "ourRank": 57 } ] } ] } ``` What the answer says, rival by rival. `ourRank: null` is a keyword the app is absent from. ```js function rivalsAhead(body) { return body.rivals.map((r) => ({ name: r.name, ratings: r.ratings, aheadOn: r.terms.length, absentOn: r.terms.filter((t) => t.ourRank === null).length, })); } ``` Result: ```json [ { "name": "Calm Rain", "ratings": 57046, "aheadOn": 8, "absentOn": 2 }, { "name": "Noisli", "ratings": 16114, "aheadOn": 8, "absentOn": 2 }, { "name": "Deep Sleep Tones", "ratings": 64683, "aheadOn": 8, "absentOn": 2 } ] ``` An app id the workspace does not have comes back as a tool error the assistant can read, not as a failed request: ```sh curl "https://storelift.net/mcp" \ -H "Authorization: Bearer $STORELIFT_TEST_KEY" \ -H "content-type: application/json" \ -d '{"jsonrpc":"2.0","id":9,"method":"tools/call","params":{"name":"get_rivals","arguments":{"appId":"sbx-unknown","country":"us"}}}' ``` ```text ERROR: No such app in this workspace. ``` ### See what a credential can read, over HTTP or MCP The first call of any integration: which plan, which scopes, which apps and how many credits are left. `GET /account` and the `whoami` tool return the same body, and neither costs credits. Scope: none · Credits: 0 · Plan: Sandbox, test key and OAuth: every plan · live key: Pro and above · Works from: API 1.5.0 · tools in storelift-mcp 1.5.0 1. Over HTTP. ```sh curl "https://storelift.net/v1/sandbox/account" ``` Response: ```json { "plan": "studio", "auth": "test_key", "scopes": [ "apps:read", "reviews:read", "ai:read", "revenue:read", "hive:read", "hive:spy", "hive:estimate", "ads:read" ], "apps": [ { "id": "sbx-lumen", "name": "Lumen — Sleep Sounds", "countries": [ "us", "gb", "de" ] }, { "id": "sbx-quill", "name": "Quill Notes", "countries": [ "us", "jp" ] } ], "appRestriction": false, "credits": { "used": 0, "limit": 50000, "resetsAt": null }, "hive": { "perDay": 10000 }, "ratePerSecond": 10, "docs": "https://storelift.net/guide/storelift-api/" } ``` 2. The same answer as a tool call. ```sh curl "https://storelift.net/mcp" \ -H "Authorization: Bearer $STORELIFT_TEST_KEY" \ -H "content-type: application/json" \ -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"whoami","arguments":{}}}' ``` Response: ```json { "plan": "studio", "auth": "test_key", "scopes": [ "apps:read", "reviews:read", "ai:read", "revenue:read", "hive:read", "hive:spy", "hive:estimate", "ads:read" ], "apps": [ { "id": "sbx-lumen", "name": "Lumen — Sleep Sounds", "countries": [ "us", "gb", "de" ] }, { "id": "sbx-quill", "name": "Quill Notes", "countries": [ "us", "jp" ] } ], "appRestriction": false, "credits": { "used": 0, "limit": 50000, "resetsAt": null }, "hive": { "perDay": 10000 }, "ratePerSecond": 10, "docs": "https://storelift.net/guide/storelift-api/" } ``` Check the scope a call needs before you make it, and read the balance before a batch. ```js function allowance(body) { return { plan: body.plan, auth: body.auth, scopes: body.scopes, apps: body.apps.map((a) => a.id), creditsLeft: body.credits.limit - body.credits.used, ratePerSecond: body.ratePerSecond, }; } ``` Result: ```json { "plan": "studio", "auth": "test_key", "scopes": [ "apps:read", "reviews:read", "ai:read", "revenue:read", "hive:read", "hive:spy", "hive:estimate", "ads:read" ], "apps": [ "sbx-lumen", "sbx-quill" ], "creditsLeft": 50000, "ratePerSecond": 10 } ``` Without credentials the MCP endpoint answers `401` with a JSON-RPC error, and a client that supports MCP authorization starts the OAuth sign-in from it: ```sh curl "https://storelift.net/mcp" \ -H "content-type: application/json" \ -d '{"jsonrpc":"2.0","id":9,"method":"tools/call","params":{"name":"whoami","arguments":{}}}' ``` ```json { "jsonrpc": "2.0", "id": 9, "error": { "code": -32001, "message": "No credentials were sent. Sign in with OAuth on any plan, or add Authorization: Bearer . Live keys require Pro, Studio, Enterprise, or an eligible Free account with purchased API credits or active Explorer. Tool access still depends on plan, scopes and credits. Generate a key at Storelift → Settings → API keys." } } ``` ## Common parameters These read the same on every endpoint that takes them; each endpoint lists the ones it takes. - `appId` (path, string) — app id from list_apps - `country` (query, string) — country code, e.g. tr, us (defaults to the app's first country) - `platform` (query, ios | android) — defaults to ios - `country` (query, string) — storefront code, e.g. us (defaults to us) ## [Account](https://storelift.net/docs/api/account/) The key's own plan, scopes and usage, the account search and the alert feed. Reading plan and usage costs 0 credits. - [`GET /alerts`](https://storelift.net/docs/api/account/#list_alerts) — The alert feed of this workspace — rank drops and rises, keywords entering or leaving the results, rivals… (1) - [`GET /portfolio`](https://storelift.net/docs/api/account/#get_portfolio_overview) — Today across every app in the workspace, one row per app: live users, users and new users, ad revenue,… (2) - [`GET /account`](https://storelift.net/docs/api/account/#whoami) — Who this key or session belongs to: plan, how it authenticated, the scopes it carries, the apps it may… (0) - [`GET /usage`](https://storelift.net/docs/api/account/#get_usage) — Every quota of the workspace with what is used and the reset time: tracked keywords, apps, discovery, AI… (0) - [`GET /search`](https://storelift.net/docs/api/account/#search) — Search this account's own records — app names and store ids, tracked keywords, and the rival apps that… (1) - [`GET /fetch`](https://storelift.net/docs/api/account/#fetch) — The full record behind one id from search: an app card, one tracked keyword with its current state and… (1) ## [Your apps](https://storelift.net/docs/api/apps/) The apps this workspace tracks: ranks, rivals, reviews, store page, listing timeline, featuring, charts and listing checks. - [`GET /apps`](https://storelift.net/docs/api/apps/#list_apps) — List the apps tracked in this Storelift account (id, name, countries, keywords) (1) - [`GET /apps/{appId}/keywords`](https://storelift.net/docs/api/apps/#get_keywords) — Keyword ranks for one app in one App Store / Google Play country (1) - [`GET /apps/{appId}/rivals`](https://storelift.net/docs/api/apps/#get_rivals) — Apps that rank ABOVE this app in search (1) - [`GET /apps/{appId}/ai`](https://storelift.net/docs/api/apps/#get_ai_visibility) — App mentions in a dated sample of AI engine answers; this does not reproduce what ChatGPT, Claude or… (1) - [`GET /apps/{appId}/ai-check`](https://storelift.net/docs/api/apps/#run_ai_visibility_check) — Start an AI visibility sample for one app in one country, with the engines available for the run (1) - [`GET /apps/{appId}/history`](https://storelift.net/docs/api/apps/#get_history) — Keyword rank history for one country (1) - [`GET /apps/{appId}/page`](https://storelift.net/docs/api/apps/#get_store_page) — The app's own store listing signals for one country (name and subtitle are not included): version, in-app… (1) - [`GET /apps/{appId}/reviews`](https://storelift.net/docs/api/apps/#get_reviews) — Recent reviews for one country: `list` holds the App Store reviews, `android` the Google Play reviews (a… (1) - [`GET /apps/{appId}/charts`](https://storelift.net/docs/api/apps/#get_charts) — App Store chart position for one country: current ranks per list (free / paid / grossing, overall and in… (1) - [`GET /apps/{appId}/reviews/search`](https://storelift.net/docs/api/apps/#search_reviews) — Search one app's reviews in one storefront by text, star rating, app version and date range, newest first… (1) - [`GET /apps/{appId}/reviews/stats`](https://storelift.net/docs/api/apps/#get_review_stats) — Star-rating distribution, average and share of 1–2 star reviews for one app in one storefront, plus a… (1) - [`GET /apps/{appId}/reviews/summary`](https://storelift.net/docs/api/apps/#summarize_reviews) — Review AI for one app in one storefront: a summary of the recent reviews and the themes in them —… (1) - [`GET /apps/{appId}/reviews/reply-draft`](https://storelift.net/docs/api/apps/#draft_review_reply) — A developer reply draft for one review, in the storefront's language (1) - [`GET /apps/{appId}/timeline`](https://storelift.net/docs/api/apps/#get_listing_timeline) — Dated changes to one app's listing — new version, screenshots, in-app events, featuring from the store… (1) - [`GET /apps/{appId}/today`](https://storelift.net/docs/api/apps/#get_today) — One app's day in one answer — the Today screen: purchases, trials and renewals from the connected sources,… (1) - [`GET /apps/{appId}/competition`](https://storelift.net/docs/api/apps/#get_keyword_competition) — How many apps compete on each keyword in one storefront, returned for terms seen on two or more apps (1) - [`GET /apps/{appId}/rivals/{rivalId}`](https://storelift.net/docs/api/apps/#get_rival_detail) — One rival of your app in one storefront: its name, rating and rating count with a 90-day history of them… (1) - [`GET /apps/{appId}/rivals/{rivalId}/adnetworks`](https://storelift.net/docs/api/apps/#get_rival_ad_networks) — How a rival monetises with ads: the ad networks it works with, each marked DIRECT or RESELLER (1) - [`GET /apps/{appId}/rivals/{rivalId}/market`](https://storelift.net/docs/api/apps/#get_rival_market) — A rival's market in one storefront: on Google Play the exact install count and in-app purchase price… (1) - [`GET /apps/{appId}/storefront-audit`](https://storelift.net/docs/api/apps/#get_storefront_audit) — Your iOS listing in every App Store storefront: where the app is sold, which storefronts serve the… (1) - [`GET /apps/{appId}/suggest`](https://storelift.net/docs/api/apps/#suggest_keywords) — New keyword ideas for one app in one storefront, written in that storefront's search language: terms of… (1) - [`POST /apps/{appId}/validate-listing`](https://storelift.net/docs/api/apps/#validate_listing) — Check a draft App Store listing before it goes to App Store Connect (1) - [`GET /apps/{appId}/draft`](https://storelift.net/docs/api/apps/#draft_listing) — A listing draft — title, subtitle, promotional text and description — built from the keywords measured for… (1) - [`GET /apps/{appId}/localize`](https://storelift.net/docs/api/apps/#localize_listing) — Write the full App Store listing for a new locale — name, subtitle, keyword field and description — from… (1) - [`GET /apps/{appId}/shot-text`](https://storelift.net/docs/api/apps/#get_screenshot_text) — The caption text on your first four App Store screenshots in one storefront (1) - [`GET /apps/{appId}/chart-movers`](https://storelift.net/docs/api/apps/#get_chart_movers) — Who moved in the app's own category chart: risers and fallers (3+ places), new entrants and drop-outs,… (1) - [`GET /apps/{appId}/featuring`](https://storelift.net/docs/api/apps/#get_featuring) — Where Apple shows the app today, per country: editorial cards (dedicated: true when the story is about… (1) - [`GET /apps/{appId}`](https://storelift.net/docs/api/apps/#get_app) — One tracked app with its platform ids, countries, tracked keywords per country and the latest measurement… (1) - [`GET /apps/{appId}/weekly-plan`](https://storelift.net/docs/api/apps/#get_weekly_plan) — This week's listing suggestions for the app — the same list as the dashboard's "This week" card, best first (1) ## [Revenue & Apple Ads](https://storelift.net/docs/api/growth/) The connected sources per app: revenue, subscription events, the App Store funnel, prices and offer codes, the before/after of a change, and Apple Ads campaigns, keywords, search terms and commands. Scopes revenue:read and ads:read. - [`GET /apps/{appId}/revenue`](https://storelift.net/docs/api/growth/#get_revenue) — Revenue and downloads for one app from the sources the user connected: App Store Connect daily units per… (1) - [`GET /apps/{appId}/subscriptions`](https://storelift.net/docs/api/growth/#get_subscription_events) — Subscription event counts for one app from the RevenueCat / Adapty webhook: per day and per country —… (1) - [`GET /apps/{appId}/funnel`](https://storelift.net/docs/api/growth/#get_store_funnel) — The App Store conversion funnel for one app from App Store Connect analytics: impressions → product page… (1) - [`GET /apps/{appId}/campaigns`](https://storelift.net/docs/api/growth/#get_ads_campaigns) — Apple Ads campaigns that promote one app (matched by the app's App Store id, not by name): spend,… (1) - [`GET /apps/{appId}/ads-keywords`](https://storelift.net/docs/api/growth/#get_ads_keywords) — Every Apple Ads keyword bought for one app across its campaigns (last 28 days), by spend: bid, match type,… (1) - [`GET /apps/{appId}/ads-search-terms`](https://storelift.net/docs/api/growth/#get_ads_search_terms) — The searches people actually typed that triggered the app's Apple Ads (last 28 days), by spend: the search… (1) - [`GET /apps/{appId}/ads-commands`](https://storelift.net/docs/api/growth/#get_ads_command_status) — Apple Ads commands for one app's campaigns — from the dashboard, from automation rules and from… (1) - [`GET /apps/{appId}/search-popularity`](https://storelift.net/docs/api/growth/#get_search_popularity) — Apple's own search popularity, from the Apple Ads account connected to this workspace: the most searched… (1) - [`GET /apps/{appId}/pricing`](https://storelift.net/docs/api/growth/#get_pricing_offers) — Product prices and offer codes for one app from the RevenueCat or Adapty webhook, over the last 365 days:… (1) - [`GET /apps/{appId}/country-prices`](https://storelift.net/docs/api/growth/#get_country_prices) — Country prices for one of the app's products, read from App Store Connect / Google Play (Pro): per country… (1) - [`GET /apps/{appId}/change-impact`](https://storelift.net/docs/api/growth/#get_change_impact) — What a change did: for one change day (a new version, screenshots, subtitle, keyword field, a campaign… (1) ## [Hive](https://storelift.net/docs/api/hive/) Any app or market the Storelift network measures, whether you track it or not. Part of Hive Explorer. - [`GET /rank-check`](https://storelift.net/docs/api/hive/#check_rank) — The live rank of one of your apps for any search term in one storefront, as the store shows it right now —… (10) - [`GET /keyword-difficulty`](https://storelift.net/docs/api/hive/#get_keyword_metrics) — Demand and difficulty inputs for one App Store search term in one storefront: its demand (`demand`) and… (10) - [`GET /hive/find`](https://storelift.net/docs/api/hive/#find_apps) — Find apps across the top charts we measure: filter by category, storefront, chart (Top Grossing, Top Free,… (20) - [`GET /hive/charts`](https://storelift.net/docs/api/hive/#market_charts) — One top chart as we last measured it: the ranked app ids for a storefront, list kind and optional… (10) - [`GET /hive/movers`](https://storelift.net/docs/api/hive/#market_movers) — Who climbed, who fell, who entered and who left one top chart, against the same chart N days ago (10) - [`GET /hive/new`](https://storelift.net/docs/api/hive/#market_new_apps) — Apps seen on a top chart for the first time, newest first, with the publisher behind each one (10) - [`GET /hive/publisher/{publisherId}`](https://storelift.net/docs/api/hive/#market_publisher) — Every app of one publisher that we have seen on a chart, with the day each was first seen (10) - [`GET /hive/resolve`](https://storelift.net/docs/api/hive/#hive_search_apps) — Find any app's id: by name or developer (the top matches in that storefront, with publisher, category,… (10) - [`GET /hive/similar/{appId}`](https://storelift.net/docs/api/hive/#hive_similar_apps) — The store's own similar-apps shelf for any app (Apple's You Might Also Like, Google's Similar apps), in… (10) - [`GET /hive/reviews/{appId}`](https://storelift.net/docs/api/hive/#hive_app_reviews) — Any app's recent reviews in one storefront, newest first: stars, title, text, version and date, plus the… (10) - [`POST /hive/keywords/{term}/metrics/measure`](https://storelift.net/docs/api/hive/#hive_measure_keyword_metrics) — Start a measurement of one keyword's popularity and/or difficulty in one storefront when the stored value… (50) - [`GET /hive/apps/{id}`](https://storelift.net/docs/api/hive/#hive_app_details) — Any app's latest daily measurement (10) - [`GET /hive/keywords/{term}/ranks`](https://storelift.net/docs/api/hive/#hive_keyword_ranks) — Who ranks for a keyword, day by day (10) - [`GET /hive/keywords/{term}/metrics`](https://storelift.net/docs/api/hive/#hive_keyword_metrics) — Read a keyword's current popularity and difficulty (10) - [`GET /hive/keywords/{term}/metrics/history`](https://storelift.net/docs/api/hive/#hive_keyword_metrics_history) — Read stored keyword metric observations over time (20) - [`GET /hive/spy/{id}`](https://storelift.net/docs/api/hive/#hive_keyword_spy) — The keywords any app ranks for (200) - [`GET /hive/estimate/{id}`](https://storelift.net/docs/api/hive/#hive_estimate) — Revenue and downloads for any app (500) - [`GET /hive/gap`](https://storelift.net/docs/api/hive/#get_keyword_gap) — Keyword gap across several apps (400) - [`GET /hive/research`](https://storelift.net/docs/api/hive/#hive_keyword_research) — Keyword research from a seed term (50) - [`GET /hive/landscape`](https://storelift.net/docs/api/hive/#hive_category_landscape) — What it takes to rank in a category (10) ## [Writes](https://storelift.net/docs/api/actions/) Every write runs in two steps: a preview that changes nothing, then a confirm with the token it returned. - [`GET /jobs/{jobId}`](https://storelift.net/docs/api/actions/#get_job) — Status of a long-running job started by a confirmed action (Apple Ads command, review reply, listing… (0) - [`POST /actions`](https://storelift.net/docs/api/actions/#preview_action) — Preview a write (0) - [`POST /actions/confirm`](https://storelift.net/docs/api/actions/#confirm_action) — Apply a previewed write (per action)