API 레퍼런스
기본 URL 하나, 키 하나, 입력과 출력은 JSON입니다. 아래의 모든 엔드포인트는 같은 이름의 MCP 도구이기도 합니다.
openapi.json · 오류 코드 · MCP 서버
기본 URL
https://storelift.net/v1
아래의 모든 경로는 이 주소를 기준으로 합니다. 조회에는 GET을 보내고, POST는 /actions에서만 씁니다.
인증
키는 Authorization: Bearer <key> 또는 x-api-key에 넣어 보냅니다. 키는 설정 › API에서 만들며, 키마다 스코프, 선택 사항인 IP 허용 목록, 선택 사항인 앱 목록, 선택 사항인 월간 크레딧 예산을 가집니다. 예산에 도달한 키는 달이 바뀔 때까지 402 key_budget_reached로 응답하고, 다른 키는 계속 작동합니다.
REST API용 라이브 키(sl_live_)는 Pro 이상에서, 또는 어느 요금제에서든 크레딧 팩이 있으면 쓸 수 있습니다. Free에는 MCP 서버에서만 작동하는 라이브 키 1개가 포함됩니다. 테스트 키(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워크스페이스의 모든 앱에 대한 오늘 현황을 앱당 한 행으로 반환합니다. 실시간 사용자, 사용자와 신규… - GET
/account이 키 또는 세션의 소유 정보입니다. 플랜, 인증 방식, 부여된 권한 범위, 읽을 수 있는 앱, 크레딧… - GET
/usage워크스페이스의 모든 한도를 사용량, 재설정 시각과 함께 반환합니다. 추적 키워드, 앱, 키워드 발굴, AI… - GET
/search이 계정의 자체 레코드(앱 이름과 스토어 ID, 추적 키워드, 사용자보다 순위가 높은 경쟁 앱)를 검색해… - GET
/fetchsearch가 반환한 ID 하나의 전체 레코드입니다. 앱 카드, 현재 상태와 순위 기록이 담긴 추적 키워드…
내 앱
이 워크스페이스가 추적하는 앱입니다. 순위, 경쟁 앱, 리뷰, 스토어 페이지, 등록 정보 변경 타임라인, 피처링, 차트, 등록 정보 점검을 다룹니다.
- GET
/apps이 Storelift 계정에서 추적 중인 앱 나열(ID, 이름, 국가, 키워드) - GET
/apps/{appId}/keywordsApp Store / Google Play의 한 국가에서 한 앱의 키워드 순위 - GET
/apps/{appId}/rivals검색에서 이 앱보다 순위가 높은 앱 - GET
/apps/{appId}/aiAI 엔진 답변을 날짜별 표본으로 모은 것 속 앱 언급입니다. ChatGPT, Claude, Gemini가… - GET
/apps/{appId}/ai-check한 국가의 한 앱에 대해 AI 가시성 표본 수집을 시작합니다. 해당 실행에서 사용할 수 있는 엔진을… - GET
/apps/{appId}/history한 국가의 키워드 순위 기록 - GET
/apps/{appId}/page한 국가에서 앱 자체의 스토어 등록 정보 신호입니다(이름과 부제는 포함하지 않습니다). 버전, 앱 내… - GET
/apps/{appId}/reviews한 국가의 최근 리뷰입니다. `list`는 App Store 리뷰이고, `android`는 Google… - GET
/apps/{appId}/charts한 국가의 App Store 차트 순위입니다. 목록별(무료 / 유료 / 매출, 전체와 카테고리 내) 현재… - GET
/apps/{appId}/reviews/search한 스토어프런트에서 한 앱의 리뷰를 텍스트, 별점, 앱 버전, 기간으로 검색해 최신순으로 반환합니다.… - GET
/apps/{appId}/reviews/stats한 스토어프런트에서 한 앱의 별점 분포, 평균, 1~2점 리뷰 비율과 함께 일별 추이(하루 건수와 평균)… - GET
/apps/{appId}/reviews/summary한 스토어프런트에서 한 앱의 리뷰 AI입니다. 최근 리뷰의 요약과 그 안의 주제(불만, 요청, 칭찬)를… - GET
/apps/{appId}/reviews/reply-draft리뷰 하나에 대한 개발자 답글 초안, 해당 스토어프런트의 언어로 - GET
/apps/{appId}/timeline한 앱의 등록 정보에 생긴 날짜별 변경입니다. 스토어 페이지에서 읽은 새 버전, 스크린샷, 앱 내 이벤트… - GET
/apps/{appId}/today한 앱의 하루를 한 번의 응답으로 반환합니다. '오늘' 화면에 해당합니다. 연결된 소스의 구매·체험·갱신… - GET
/apps/{appId}/competition한 스토어프런트에서 키워드마다 경쟁하는 앱 수, 두 개 이상의 앱에서 확인된 검색어 대상 - GET
/apps/{appId}/rivals/{rivalId}한 스토어프런트에서 내 앱의 경쟁 앱 하나입니다. 이름, 평점, 평가 수와 그 90일 기록(이름 변경은… - GET
/apps/{appId}/rivals/{rivalId}/adnetworks경쟁 앱이 광고로 수익을 내는 방식: 함께 일하는 광고 네트워크, 각각 DIRECT 또는 RESELLER로 표시 - GET
/apps/{appId}/rivals/{rivalId}/market한 스토어프런트에서 경쟁 앱의 시장 데이터입니다. Google Play에서는 정확한 설치 수와 앱 내 구입… - GET
/apps/{appId}/storefront-audit모든 App Store 스토어프런트에서의 iOS 등록 정보입니다. 앱이 판매되는 곳, 자국어 대신 대체… - GET
/apps/{appId}/suggest한 스토어프런트에서 한 앱의 새 키워드 아이디어를 해당 스토어프런트의 검색 언어로 반환합니다. 사람들이… - POST
/apps/{appId}/validate-listingApp Store 등록 정보 초안을 App Store Connect로 보내기 전에 점검 - GET
/apps/{appId}/draft등록 정보 초안(제목, 부제, 프로모션 텍스트, 설명)입니다. 한 스토어프런트에서 이 앱에 대해 측정한… - GET
/apps/{appId}/localize새 로케일용 App Store 등록 정보 전체(이름, 부제, 키워드 필드, 설명)를 앱의 원본 등록 정보를… - GET
/apps/{appId}/shot-text한 스토어프런트에서 App Store 스크린샷 처음 네 장의 캡션 텍스트 - GET
/apps/{appId}/chart-movers앱이 속한 카테고리 차트에서 누가 움직였는지 반환합니다. 상승·하락(3계단 이상), 신규 진입, 이탈한… - GET
/apps/{appId}/featuringApple이 오늘 앱을 어디에 노출하는지 국가별로 반환합니다. 에디토리얼 카드(dedicated… - GET
/apps/{appId}추적 중인 앱 하나를 플랫폼 ID, 국가, 국가별 추적 키워드, 최신 측정 스냅샷(국가별 키워드 표)과… - GET
/apps/{appId}/weekly-plan이 앱의 이번 주 등록 정보 제안 — 대시보드의 '이번 주 할 일' 카드와 같은 목록, 효과가 큰 순
매출 및 Apple Ads
앱별로 연결한 소스의 데이터입니다. 매출, 구독 이벤트, App Store 퍼널, 가격과 오퍼 코드, 변경 전후 비교, 그리고 Apple Ads의 캠페인, 키워드, 검색어, 명령을 다룹니다. 스코프는 revenue:read와 ads:read입니다.
- GET
/apps/{appId}/revenue사용자가 연결한 소스에서 가져온 한 앱의 수익과 다운로드입니다. App Store Connect의 국가별… - GET
/apps/{appId}/subscriptionsRevenueCat / Adapty 웹훅에서 가져온 한 앱의 구독 이벤트 수입니다. 일별·국가별로 체험… - GET
/apps/{appId}/funnelApp Store Connect 분석에서 가져온 한 앱의 App Store 전환 퍼널입니다. 노출 → 제품… - GET
/apps/{appId}/campaigns한 앱을 홍보하는 Apple Ads 캠페인입니다(이름이 아니라 앱의 App Store ID로 매칭합니다).… - GET
/apps/{appId}/ads-keywords한 앱을 위해 모든 캠페인에서 구매한 Apple Ads 키워드 전체를 지출 순으로 반환합니다(최근… - GET
/apps/{appId}/ads-search-terms앱의 Apple Ads를 노출시킨, 사람들이 실제로 입력한 검색을 지출 순으로 반환합니다(최근 28일).… - GET
/apps/{appId}/ads-commands한 앱의 캠페인에 대한 Apple Ads 명령을 최신순으로 반환합니다. 대시보드, 자동화 규칙… - GET
/apps/{appId}/search-popularity이 워크스페이스에 연결된 Apple Ads 계정에서 가져온 Apple 자체의 검색 인기도입니다. 앱의… - GET
/apps/{appId}/pricingRevenueCat 또는 Adapty 웹훅에서 가져온 한 앱의 상품 가격과 오퍼 코드입니다(최근… - GET
/apps/{appId}/country-prices앱의 상품 하나에 대한 국가별 가격을 App Store Connect / Google Play에서 읽어… - GET
/apps/{appId}/change-impact변경이 가져온 결과를 반환합니다. 변경일 하나(새 버전, 스크린샷, 부제, 키워드 필드, 캠페인 시작.…
Hive
내가 추적하든 아니든, Storelift 네트워크가 측정하는 모든 앱과 시장입니다. Hive Explorer에 포함됩니다.
- GET
/rank-check한 스토어프런트에서 임의의 검색어에 대한 내 앱의 실시간 순위를 스토어가 지금 보여 주는 그대로… - GET
/keyword-difficulty한 스토어프런트에서 App Store 검색어 하나의 수요와 난이도 입력값입니다. 수요(`demand`)와… - GET
/hive/findStorelift가 측정하는 인기 차트 전체에서 앱을 찾습니다. 카테고리, 스토어프런트, 차트(최고 매출… - GET
/hive/chartsStorelift가 마지막으로 측정한 인기 차트 하나입니다. 스토어프런트, 목록 종류, 선택적 카테고리에… - GET
/hive/movers인기 차트 하나에서 N일 전의 같은 차트와 비교해 누가 오르고, 내리고, 들어오고, 나갔는지 - GET
/hive/new인기 차트에서 처음 확인된 앱, 최신순, 각 앱의 개발자 포함 - GET
/hive/publisher/{publisherId}한 개발자의 앱 중 차트에서 확인된 모든 앱, 각각 처음 확인된 날짜 포함 - GET
/hive/resolve어떤 앱이든 ID를 찾습니다. 이름이나 개발자로(해당 스토어프런트의 상위 일치 결과… - GET
/hive/similar/{appId}어떤 앱이든 스토어 자체의 유사 앱 선반(Apple의 You Might Also Like, Google의… - GET
/hive/reviews/{appId}한 스토어프런트에서 어떤 앱이든 최근 리뷰를 최신순으로 반환합니다. 별점, 제목, 본문, 버전, 날짜와… - POST
/hive/keywords/{term}/metrics/measure저장된 값이 없거나 오래되었을 때, 한 스토어프런트에서 키워드 하나의 인기도와 난이도(또는 그중 하나)… - 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미리 본 쓰기 적용