开发者文档

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 额度。

把本周的关键词排名加进报告

读取一款应用在一个店面的关键词,保留成一行。每周运行一次,这些行就连成一条趋势。

权限范围
apps:read
额度
2 · 在沙盒中或使用测试密钥时为 0
套餐
沙盒、测试密钥: 所有套餐 · 正式密钥: Pro 及以上
起始版本
API 1.5.0
  1. 找到应用 ID。

    curl "https://storelift.net/v1/sandbox/apps"
    响应
  2. 读取该应用在这个店面追踪的全部关键词。

    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。

权限范围
apps:read
额度
2 · 使用测试密钥时为 0
套餐
测试密钥、OAuth: 所有套餐 · 正式密钥: 所有套餐
起始版本
API 1.5.0 · 工具见于 storelift-mcp 1.1.1
  1. 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":{}}}'
    响应
  2. 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 工具返回相同的响应体,两者都不消耗额度。

权限范围
无
额度
0
套餐
沙盒、测试密钥、OAuth: 所有套餐 · 正式密钥: Pro 及以上
起始版本
API 1.5.0 · 工具见于 storelift-mcp 1.5.0
  1. 通过 HTTP。

    curl "https://storelift.net/v1/sandbox/account"
    响应
  2. 同样的回答,以工具调用的形式。

    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."
  }
}

通用参数

在接受这些参数的每个接口上,它们的含义都相同;每个接口会列出自己接受的参数。

参数位置类型说明
appIdpathstring来自 list_apps 的 App ID
countryquerystring国家或地区代码,例如 tr、us(默认为该 App 的第一个国家或地区)
platformqueryios | android默认为 ios
countryquerystring店面代码,例如 us(默认 us)

账号

密钥自身的套餐、权限范围和用量,账号搜索,以及提醒动态。读取套餐和用量消耗 0 额度。

  • GET /alerts此工作区的提醒动态:排名下降与上升、关键词进入或退出搜索结果、竞品超过你或被你超过、竞品商店页面的变…
  • GET /portfolio工作区内所有 App 今天的情况,每个 App 一行:实时用户、用户和新用户、广告收入、订阅收入和试…
  • GET /account此密钥或会话的归属信息:套餐、认证方式、带有的权限范围、可读取的 App…
  • GET /usage工作区的全部配额及其已用量和重置时间:跟踪的关键词、App、关键词挖掘、AI 提问、评论…
  • GET /search搜索此账户自己的记录(App 名称和商店 ID、跟踪的关键词,以及排在用户之上的竞品),并返回可传给…
  • GET /fetchsearch 返回的某个 ID 背后的完整记录:一张 App 卡片、一个带当前状态和排名历史的跟踪关…

你的应用

这个工作区追踪的应用:排名、竞品、评论、商店页面、页面变更时间线、编辑推荐、榜单和页面检查。

收入与 Apple Ads

每款应用已连接的数据来源:收入、订阅事件、App Store 转化漏斗、价格和优惠代码、一次改动前后的对比,以及 Apple Ads 的广告系列、关键词、搜索词和命令。权限范围为 revenue:read 和 ads:read。

Hive

Storelift 网络测量到的任意应用或市场,不论你是否追踪它。属于 Hive Explorer。

写入

每次写入都分两步:先是不做任何改动的预览,再用预览返回的令牌确认。