API リファレンス
ベース URL は一つ、キーも一つ、入出力は JSON です。以下のエンドポイントはすべて、同じ名前の MCP ツールとしても使えます。
openapi.json · エラーコード · MCP サーバー
ベース URL
https://storelift.net/v1
以下のパスはすべて、このベース URL からの相対パスです。読み取りには GET を送り、POST を送るのは /actions だけです。
認証
キーは Authorization: Bearer <key> または x-api-key で送ります。キーは 設定 › APIキー で作成します。キーごとにスコープを持ち、任意で IP 許可リスト、アプリのリスト、月間のクレジット予算を設定できます。予算に達したキーは、月が替わるまで 402 key_budget_reached を返します。ほかのキーは引き続き使えます。
REST API 用の本番キー(sl_live_)は、Pro 以上か、どのプランでもクレジットパックがあれば使えます。Free には、MCP サーバーでのみ使える本番キーが一つ含まれます。テストキー(sl_test_)は、どのプランでもサンドボックスのデータを返します。アシスタントは、どのプランでも MCP サーバー を通じて OAuth でサインインします。
クレジットと上限
各呼び出しは、そこに記載されたクレジットを消費します。/account と /usage は 0 で、書き込みのプレビューも 0 です。すべてのレスポンスに x-credits-used、x-credits-limit、x-credits-remaining、x-credits-reset が付きます。
毎秒のリクエスト数はプランごとに決まっています。それを超えると、retry-after 付きの 429 rate_limited が返ります。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 エンドポイントは JSON-RPC エラー付きの 401 を返し、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 で得たアプリID |
country | query | string | 国コード。例:tr、us(既定はアプリの最初の国) |
platform | query | ios | android | 既定は ios |
country | query | string | ストアフロントコード。例:us(既定は us) |
アカウント
キー自身のプラン、スコープ、利用状況と、アカウント内の検索、アラートのフィード。プランと利用状況の読み取りは 0 クレジットです。
- GET
/alertsこのワークスペースのアラートフィードです。順位の下落と上昇、検索結果へのキーワードの出入り、競合に抜かれた・抜い… - GET
/portfolioワークスペース内の全アプリの今日を、アプリごとに1行で返します。ライブユーザー、ユーザーと新規ユーザー、広告収益… - GET
/accountこのキーまたはセッションの持ち主を返します。プラン、認証方法、付与されたスコープ、読み取れるアプリ、クレジット残… - GET
/usageワークスペースのすべての利用枠を、使用量とリセット時刻とともに返します。追跡キーワード、アプリ、キーワード発見… - GET
/searchこのアカウント自身のレコード(アプリ名とストアID、追跡キーワード、ユーザーより上位にいる競合アプリ)を検索し… - GET
/fetchsearch が返したID 1件の完全なレコードです。アプリカード、現在の状態と順位履歴を含む追跡キーワード1件…
自分のアプリ
このワークスペースが追跡しているアプリ:順位、競合、レビュー、ストアページ、ストアページの変更履歴、フィーチャー掲載、チャート、ストアページのチェック。
- GET
/appsこのStoreliftアカウントで追跡しているアプリを一覧します(ID、名前、国、キーワード) - GET
/apps/{appId}/keywordsApp Store / Google Play の1つの国における、1つのアプリのキーワード順位 - GET
/apps/{appId}/rivals検索でこのアプリより上位にいるアプリ - GET
/apps/{appId}/aiAIエンジンの回答を日付付きでサンプリングした中での、アプリへの言及です。ChatGPT、Claude、Gemi… - GET
/apps/{appId}/ai-check1つの国の1つのアプリについて、AI可視性のサンプルを開始します。その実行で利用できるエンジンを使います。Stu… - GET
/apps/{appId}/history1つの国のキーワード順位履歴 - GET
/apps/{appId}/page1つの国における、アプリ自身のストア掲載シグナルです(名前とサブタイトルは含みません)。バージョン、App内イベ… - GET
/apps/{appId}/reviews1つの国の最近のレビューです。`list` はApp Storeのレビュー、`android` はGoogle… - GET
/apps/{appId}/charts1つの国のApp Storeランキング順位です。リスト別(無料/有料/売上、総合とカテゴリ内)の現在の順位と、そ… - GET
/apps/{appId}/reviews/search1つのストアフロントで、1つのアプリのレビューをテキスト、星評価、アプリのバージョン、期間で検索し、新しい順に返… - GET
/apps/{appId}/reviews/stats1つのストアフロントにおける1つのアプリの星評価の分布、平均、1〜2つ星レビューの割合に加え、日ごとの推移(1日… - GET
/apps/{appId}/reviews/summary1つのストアフロントにおける1つのアプリのレビューAIです。最近のレビューの要約と、そこに含まれるテーマ(不満… - GET
/apps/{appId}/reviews/reply-draft1件のレビューに対するデベロッパ返信の下書き(そのストアフロントの言語) - GET
/apps/{appId}/timeline1つのアプリの掲載情報に加わった日付付きの変更です。ストアページから読んだ新バージョン、スクリーンショット、Ap… - GET
/apps/{appId}/today1つのアプリの1日を1回の応答で返します。「今日」画面にあたります。連携したソースからの購入・トライアル・更新… - GET
/apps/{appId}/competition1つのストアフロントで各キーワードを何本のアプリが競っているか(2本以上のアプリで見つかった語句が対象) - GET
/apps/{appId}/rivals/{rivalId}1つのストアフロントにおける、自分のアプリの競合1件です。名前、評価、評価数とそれらの90日間の履歴(名前の変更… - GET
/apps/{appId}/rivals/{rivalId}/adnetworks競合が広告でどう収益化しているか:取引している広告ネットワーク(DIRECT または RESELLER の区別付き) - GET
/apps/{appId}/rivals/{rivalId}/market1つのストアフロントにおける競合の市場データです。Google Playでは、正確なインストール数とアプリ内課金… - GET
/apps/{appId}/storefront-auditすべてのApp StoreストアフロントにおけるiOSの掲載情報です。アプリが販売されている場所、自国語ではなく… - GET
/apps/{appId}/suggest1つのストアフロントにおける1つのアプリの新しいキーワード案を、そのストアフロントの検索言語で返します。ストアの… - POST
/apps/{appId}/validate-listingApp Storeの掲載情報の下書きを、App Store Connectに送る前にチェックします - GET
/apps/{appId}/draft掲載情報の下書き(タイトル、サブタイトル、プロモーションテキスト、説明文)です。1つのストアフロントでこのアプリ… - GET
/apps/{appId}/localize新しいロケール向けに、App Storeの掲載情報一式(名前、サブタイトル、キーワード欄、説明文)を、アプリの元… - GET
/apps/{appId}/shot-text1つのストアフロントで、App Storeの最初の4枚のスクリーンショットに入っているキャプションの文字 - GET
/apps/{appId}/chart-moversアプリ自身のカテゴリランキングで誰が動いたかを返します。上昇・下落(3位以上)、新規ランクイン、圏外になったアプ… - GET
/apps/{appId}/featuringAppleが今日アプリをどこに表示しているかを国別に返します。エディトリアルカード(dedicated… - GET
/apps/{appId}追跡中のアプリ1件を、プラットフォームID、国、国別の追跡キーワード、最新の計測スナップショット(国別のキーワー… - GET
/apps/{appId}/weekly-planこのアプリの今週の掲載情報の提案 — ダッシュボードの「今週やること」カードと同じ一覧で、効果の高い順
収益と Apple Ads
アプリごとに接続したデータソース:収益、サブスクリプションのイベント、App Store のファネル、価格とオファーコード、変更の前後比較、そして Apple Ads のキャンペーン、キーワード、検索語句、コマンド。スコープは revenue:read と ads:read です。
- GET
/apps/{appId}/revenueユーザーが連携したソースから取得した、1つのアプリの収益とダウンロードです。App Store… - GET
/apps/{appId}/subscriptionsRevenueCat / Adapty のWebhookから取得した、1つのアプリのサブスクリプションイベント数… - GET
/apps/{appId}/funnelApp Store Connectのアナリティクスから取得した、1つのアプリのApp… - GET
/apps/{appId}/campaigns1つのアプリを宣伝しているApple Adsキャンペーンです(名前ではなくアプリのApp Store… - GET
/apps/{appId}/ads-keywords1つのアプリのために全キャンペーンで購入しているApple Adsキーワードを、広告費の多い順にすべて返します(… - GET
/apps/{appId}/ads-search-termsアプリのApple Adsを表示させた、ユーザーが実際に入力した検索を広告費の多い順に返します(直近28日間)。… - GET
/apps/{appId}/ads-commands1つのアプリのキャンペーンに対するApple Adsコマンドを、新しい順に返します。ダッシュボード、自動化ルール… - GET
/apps/{appId}/search-popularityこのワークスペースに連携したApple Adsアカウントから取得した、Apple自身の検索人気度です。アプリのカ… - GET
/apps/{appId}/pricingRevenueCatまたはAdaptyのWebhookから取得した、1つのアプリの商品価格とオファーコードです(… - GET
/apps/{appId}/country-pricesアプリの商品1つの国別価格を、App Store Connect / Google… - GET
/apps/{appId}/change-impact変更が何をもたらしたかを返します。1つの変更日(新バージョン、スクリーンショット、サブタイトル、キーワード欄、キ…
Hive
Storelift のネットワークが計測しているあらゆるアプリと市場。あなたが追跡しているかどうかは問いません。Hive Explorer の一部です。
- GET
/rank-check1つのストアフロントで、任意の検索語に対する自分のアプリのライブ順位を、ストアがいま表示しているとおりに返します… - GET
/keyword-difficulty1つのストアフロントにおける、App Storeの検索語1つの需要と難易度の入力値です。需要(`demand`)… - GET
/hive/findStoreliftが計測しているランキング全体からアプリを探します。カテゴリ、ストアフロント、ランキング(トップ… - GET
/hive/chartsStoreliftが最後に計測した時点のランキング1つです。ストアフロント、リストの種類、任意のカテゴリについて… - GET
/hive/movers1つのランキングで、N日前の同じランキングと比べて誰が上がり、下がり、入り、外れたか - GET
/hive/newランキングに初めて現れたアプリ(新しい順、それぞれのパブリッシャー付き) - GET
/hive/publisher/{publisherId}1つのパブリッシャーのアプリのうちランキングで確認できたものすべて(それぞれの初回検出日付き) - GET
/hive/resolve任意のアプリのIDを探します。名前またはデベロッパ名から(そのストアフロントでの上位の一致を、パブリッシャー、カ… - GET
/hive/similar/{appId}任意のアプリについて、ストア自身の類似アプリの棚(Appleの「You Might Also… - GET
/hive/reviews/{appId}1つのストアフロントにおける任意のアプリの最近のレビューを新しい順に返します。星、タイトル、本文、バージョン、日… - POST
/hive/keywords/{term}/metrics/measure保存済みの値がない、または古い場合に、1つのストアフロントにおける1つのキーワードの人気度と難易度(またはその一… - GET
/hive/apps/{id}任意のアプリの最新の日次計測 - GET
/hive/keywords/{term}/ranksあるキーワードで順位のついているアプリ(日ごと) - GET
/hive/keywords/{term}/metricsキーワードの現在の人気度と難易度を読み取ります - GET
/hive/keywords/{term}/metrics/history保存済みのキーワード指標の観測値を時系列で読み取ります - GET
/hive/spy/{id}任意のアプリが順位を持つキーワード - GET
/hive/estimate/{id}任意のアプリの収益とダウンロード - GET
/hive/gap複数アプリ間のキーワードギャップ - GET
/hive/researchシード語からのキーワード調査 - GET
/hive/landscapeカテゴリで上位に入るために必要な水準
書き込み
書き込みはすべて二段階で実行されます。何も変更しないプレビューと、そこで返されたトークンを使う確認です。
- GET
/jobs/{jobId}確認済みのアクション(Apple Adsコマンド、レビュー返信、掲載情報の更新)が開始した長時間ジョブのステータ… - POST
/actions書き込みをプレビューします - POST
/actions/confirmプレビュー済みの書き込みを適用します