API 参考
一个基础 URL,一个密钥,收发都是 JSON。下面每个接口同时也是一个同名的 MCP 工具。
openapi.json · 错误代码 · MCP 服务器
基础 URL
https://storelift.net/v1
下面的每个路径都相对于它。读取用 GET,只有 /actions 用 POST。
身份验证
在 Authorization: Bearer <key> 或 x-api-key 中发送密钥。在“设置 › API”里创建密钥;每个密钥都带有权限范围,并可选设置 IP 白名单、应用列表和每月额度预算。达到预算的密钥会一直返回 402 key_budget_reached,直到进入下个月;其他密钥照常工作。
用于 REST API 的正式密钥(sl_live_)在 Pro 及以上套餐提供,任何套餐购买额度包后也可使用。Free 套餐包含一个仅适用于 MCP 服务器的正式密钥。测试密钥(sl_test_)在任何套餐下都返回沙盒数据。AI 助手在任何套餐下都通过 MCP 服务器以 OAuth 登录。
额度与限制
每次调用消耗的额度都标在该接口上;/account 和 /usage 消耗 0 额度,写入的预览也消耗 0 额度。每个响应都带有 x-credits-used、x-credits-limit、x-credits-remaining 和 x-credits-reset。
每秒请求数按套餐设定;超过后会收到 429 rate_limited 和 retry-after。Hive 接口需要购买的 API 额度或 Hive Explorer 才能开通,并且还计入每日上限:使用额度包的额度每天 500 次调用,使用 Hive Explorer 每天 10,000 次。每次调用的额度
沙盒
https://storelift.net/v1/sandbox 可以响应下面每个带示例响应的读取接口,不需要密钥,也不消耗额度。数据是固定且带日期的,所以测试结果保持稳定。
测试密钥(sl_test_)在正式的基础 URL 上返回同样的数据,并且从不写入。
如何读排名
排名有三种状态,并且始终区分开来:measured: false 表示这个查询当天没有测量,rank: null 表示已经测量、但应用不在读取到的结果之内,如果是数字,它就是排名。
错误
每个错误的响应体都相同:{ "error": "<code>", "message": "…", "docs": "…" }。error 是稳定的;请根据它做分支,而不是根据 message。有些代码还会附带 scope、field 或 limit 这样的字段。全部错误代码
完整示例
三项工作,从第一次调用到你最终保留的结果。每条命令都在沙盒上运行,所以不消耗额度,也不改动任何东西,每个响应都是沙盒针对它返回的内容。
用你自己的密钥时,路径相同,只是去掉 /sandbox,每次调用消耗该接口上标明的额度。测试密钥(sl_test_)在那里同样返回沙盒数据,消耗 0 额度。
把本周的关键词排名加进报告
读取一款应用在一个店面的关键词,保留成一行。每周运行一次,这些行就连成一条趋势。
找到应用 ID。
curl "https://storelift.net/v1/sandbox/apps"响应
读取该应用在这个店面追踪的全部关键词。
curl "https://storelift.net/v1/sandbox/apps/sbx-lumen/keywords?country=us"响应 (keywords: 共 8 行,显示 2 行)
把响应汇总进你保存的那一行。measured: true 且 rank: null 的关键词表示已经测量、但应用不在结果中;它要和没有测量的关键词分开计数。
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 },
};
}结果
{
"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
}
}工作区里没有的应用 ID 会返回 404:
curl "https://storelift.net/v1/sandbox/apps/sbx-unknown/keywords?country=us"{
"error": "not_found",
"message": "No such app in this workspace.",
"docs": "https://storelift.net/docs/api/errors#not_found"
}问问谁排在你前面
同样的数据,通过 MCP 服务器获取:助手会发出两次工具调用。要手动发送,就把测试密钥放进 STORELIFT_TEST_KEY。
list_apps返回应用 ID。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":{}}}'响应
get_rivals逐个关键词返回排在它前面的应用。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"}}}'响应 (rivals: 共 3 行,显示 2 行)
逐个竞品来看,响应说明了什么。ourRank: null 表示应用没有出现在这个关键词的结果里。
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,
}));
}结果
[
{
"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
}
]工作区里没有的应用 ID,会以助手能读懂的工具错误返回,而不是一次失败的请求:
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"}}}'ERROR: No such app in this workspace.通过 HTTP 或 MCP 查看一个凭据能读取什么
任何集成的第一次调用:哪个套餐、哪些权限范围、哪些应用,以及还剩多少额度。GET /account 和 whoami 工具返回相同的响应体,两者都不消耗额度。
通过 HTTP。
curl "https://storelift.net/v1/sandbox/account"响应
同样的回答,以工具调用的形式。
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":{}}}'响应
发起调用之前先检查它需要的权限范围,批量调用之前先读取余额。
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,
};
}结果
{
"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
}没有凭据时,MCP 端点返回 401 和一个 JSON-RPC 错误,支持 MCP 授权的客户端会由此开始 OAuth 登录:
curl "https://storelift.net/mcp" \
-H "content-type: application/json" \
-d '{"jsonrpc":"2.0","id":9,"method":"tools/call","params":{"name":"whoami","arguments":{}}}'{
"jsonrpc": "2.0",
"id": 9,
"error": {
"code": -32001,
"message": "No credentials were sent. Sign in with OAuth on any plan, or add Authorization: Bearer <your Storelift API key>. 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."
}
}通用参数
在接受这些参数的每个接口上,它们的含义都相同;每个接口会列出自己接受的参数。
| 参数 | 位置 | 类型 | 说明 |
|---|---|---|---|
appId | path | string | 来自 list_apps 的 App ID |
country | query | string | 国家或地区代码,例如 tr、us(默认为该 App 的第一个国家或地区) |
platform | query | ios | android | 默认为 ios |
country | query | string | 店面代码,例如 us(默认 us) |
账号
密钥自身的套餐、权限范围和用量,账号搜索,以及提醒动态。读取套餐和用量消耗 0 额度。
- GET
/alerts此工作区的提醒动态:排名下降与上升、关键词进入或退出搜索结果、竞品超过你或被你超过、竞品商店页面的变… - GET
/portfolio工作区内所有 App 今天的情况,每个 App 一行:实时用户、用户和新用户、广告收入、订阅收入和试… - GET
/account此密钥或会话的归属信息:套餐、认证方式、带有的权限范围、可读取的 App… - GET
/usage工作区的全部配额及其已用量和重置时间:跟踪的关键词、App、关键词挖掘、AI 提问、评论… - GET
/search搜索此账户自己的记录(App 名称和商店 ID、跟踪的关键词,以及排在用户之上的竞品),并返回可传给… - GET
/fetchsearch 返回的某个 ID 背后的完整记录:一张 App 卡片、一个带当前状态和排名历史的跟踪关…
你的应用
这个工作区追踪的应用:排名、竞品、评论、商店页面、页面变更时间线、编辑推荐、榜单和页面检查。
- GET
/apps列出此 Storelift 账户跟踪的 App(ID、名称、国家或地区、关键词) - GET
/apps/{appId}/keywords某个 App 在 App Store / Google Play 某个国家或地区的关键词排名 - GET
/apps/{appId}/rivals在搜索中排在此 App 之上的 App - GET
/apps/{appId}/ai在一份标有日期的 AI 引擎回答样本中对 App 的提及;这并不复现 ChatGPT、Claude… - GET
/apps/{appId}/ai-check为某个 App 在某个国家或地区启动一次 AI 可见度抽样,使用本次运行可用的引擎。需要… - GET
/apps/{appId}/history某个国家或地区的关键词排名历史 - GET
/apps/{appId}/pageApp 自身在某个国家或地区的商店页面信号(不含名称和副标题):版本、App… - GET
/apps/{appId}/reviews某个国家或地区的近期评论:`list` 是 App Store 评论,`android` 是… - GET
/apps/{appId}/charts某个国家或地区的 App Store 排行榜位置:各榜单(免费 / 付费 /… - GET
/apps/{appId}/reviews/search在某个店面中按文本、星级、App 版本和日期范围搜索某个 App… - GET
/apps/{appId}/reviews/stats某个 App 在某个店面的星级分布、平均分和 1–2 星评论占比,另有按天的曲线(每天的数量和平均分… - GET
/apps/{appId}/reviews/summary某个 App 在某个店面的评论 AI:近期评论的摘要及其中的主题(抱怨、需求、称赞),每个主题都引用… - GET
/apps/{appId}/reviews/reply-draft针对某条评论的开发者回复草稿,使用该店面的语言 - GET
/apps/{appId}/timeline某个 App 商店页面上带日期的变更:来自商店页面的新版本、截图、App 内活动和推荐位,以及来自… - GET
/apps/{appId}/today一次回答给出某个 App 的一天,即“今天”页面:来自已连接数据源的购买、试用和续订,新评论,相对昨… - GET
/apps/{appId}/competition某个店面中每个关键词有多少个 App 在竞争,针对出现在两个或更多 App 上的词返回 - GET
/apps/{appId}/rivals/{rivalId}你的 App 在某个店面的一个竞品:其名称、评分和评分数及它们的 90… - GET
/apps/{appId}/rivals/{rivalId}/adnetworks竞品如何通过广告变现:其合作的广告网络,每个都标记为 DIRECT 或 RESELLER - GET
/apps/{appId}/rivals/{rivalId}/market竞品在某个店面的市场数据:在 Google Play 上是精确安装量和 App… - GET
/apps/{appId}/storefront-audit你的 iOS 商店页面在每个 App Store 店面的情况:App… - GET
/apps/{appId}/suggest某个 App 在某个店面的新关键词创意,用该店面的搜索语言书写:人们会在商店搜索框中输入的 1–3… - POST
/apps/{appId}/validate-listing在提交到 App Store Connect 之前检查 App Store 商店文案草稿 - GET
/apps/{appId}/draft一份商店文案草稿(标题、副标题、推广文本和描述),基于在某个店面为此 App… - GET
/apps/{appId}/localize为新的语言区域撰写完整的 App Store 商店文案(名称、副标题、关键词字段和描述),以… - GET
/apps/{appId}/shot-text你在某个店面的前四张 App Store 截图上的说明文字 - GET
/apps/{appId}/chart-moversApp 所在类别排行榜中谁发生了变动:上升者和下降者(3 位及以上)、新上榜和跌出榜单的… - GET
/apps/{appId}/featuringApple 今天在各个国家或地区的哪些位置展示了该 App:编辑推荐卡片(dedicated… - GET
/apps/{appId}一个被跟踪的 App,包含其平台 ID、国家或地区、各国家或地区的跟踪关键词以及最新的测量快照(各国… - GET
/apps/{appId}/weekly-plan该 App 本周的商店页面建议,与仪表板“本周要做”卡片中的列表相同,按效果从高到低排列
收入与 Apple Ads
每款应用已连接的数据来源:收入、订阅事件、App Store 转化漏斗、价格和优惠代码、一次改动前后的对比,以及 Apple Ads 的广告系列、关键词、搜索词和命令。权限范围为 revenue:read 和 ads:read。
- GET
/apps/{appId}/revenue来自用户已连接数据源的某个 App 的收入和下载量:App Store Connect… - GET
/apps/{appId}/subscriptions来自 RevenueCat / Adapty Webhook 的某个 App… - GET
/apps/{appId}/funnel来自 App Store Connect 分析的某个 App 的 App Store… - GET
/apps/{appId}/campaigns推广某个 App 的 Apple Ads 广告系列(按 App 的 App Store ID… - GET
/apps/{appId}/ads-keywords为某个 App 在其所有广告系列中购买的全部 Apple Ads 关键词(最近 28… - GET
/apps/{appId}/ads-search-terms触发了该 App 的 Apple Ads 的、人们实际输入的搜索(最近 28… - GET
/apps/{appId}/ads-commands针对某个 App 的广告系列的 Apple Ads 指令,来自仪表板、自动化规则和… - GET
/apps/{appId}/search-popularityApple 自己的搜索热度,来自连接到此工作区的 Apple Ads 账户:该国家或地区中 App… - GET
/apps/{appId}/pricing来自 RevenueCat 或 Adapty Webhook 的某个 App… - GET
/apps/{appId}/country-prices该 App 某个产品的各国家或地区价格,读取自 App Store Connect /… - GET
/apps/{appId}/change-impact一次变更带来了什么:针对某个变更日(新版本、截图、副标题、关键词字段、广告系列开始,默认为商店页面时…
Hive
Storelift 网络测量到的任意应用或市场,不论你是否追踪它。属于 Hive Explorer。
- GET
/rank-check你的某个 App 在某个店面中对任意搜索词的实时排名,按商店此刻显示的情况给出,该词无需被跟踪。状态… - GET
/keyword-difficulty某个 App Store 搜索词在某个店面的需求和难度输入项:其需求(`demand`)和相关搜索… - GET
/hive/find在我们测量的排行榜中查找 App:可按类别、店面、榜单(畅销榜、免费榜、付费榜或 iPad… - GET
/hive/charts我们最近一次测量到的某个排行榜:某个店面、榜单类型和可选类别下按排名排列的 App… - GET
/hive/movers与 N 天前的同一排行榜相比,谁上升、谁下降、谁上榜、谁离榜 - GET
/hive/new首次出现在排行榜上的 App,从新到旧排列,并附各自的开发者 - GET
/hive/publisher/{publisherId}某个开发者在排行榜上被我们看到过的所有 App,并附各自首次出现的日期 - GET
/hive/resolve查找任意 App 的 ID:可按名称或开发者查找(该店面里最匹配的结果,附开发者、类别、评分和评分数… - GET
/hive/similar/{appId}商店自己为任意 App 提供的类似 App 货架(Apple 的 You Might Also… - GET
/hive/reviews/{appId}任意 App 在某个店面的近期评论,从新到旧排列:星级、标题、正文、版本和日期,并附所返回行的星级分… - POST
/hive/keywords/{term}/metrics/measure当保存的值缺失或已过时时,启动对某个关键词在某个店面的热度和/或难度的测量。新鲜的值或已核实的缺失会… - GET
/hive/apps/{id}任意 App 最新的每日测量 - GET
/hive/keywords/{term}/ranks谁在某个关键词上有排名,按天给出 - GET
/hive/keywords/{term}/metrics读取关键词当前的热度和难度 - GET
/hive/keywords/{term}/metrics/history读取已保存的关键词指标观测值随时间的变化 - GET
/hive/spy/{id}任意 App 有排名的关键词 - GET
/hive/estimate/{id}任意 App 的收入和下载量 - GET
/hive/gap多个 App 之间的关键词差距 - GET
/hive/research从种子词出发的关键词研究 - GET
/hive/landscape在某个类别中获得排名需要什么
写入
每次写入都分两步:先是不做任何改动的预览,再用预览返回的令牌确认。
- GET
/jobs/{jobId}由已确认的操作(Apple Ads 指令、评论回复、商店页面更新)启动的长时间作业的状态:queue… - POST
/actions预览一次写入 - POST
/actions/confirm应用一次已预览的写入