Документация для разработчиков

Справочник 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 до конца месяца; остальные ключи работают.

Рабочие ключи (sl_live_) для REST API доступны на Pro и выше, а также на любом тарифе с пакетом кредитов. В Free входит один рабочий ключ, который работает только на MCP-сервере. Тестовые ключи (sl_test_) возвращают данные песочницы на любом тарифе. Ассистенты входят через OAuth на MCP-сервере на любом тарифе.

Кредиты и лимиты

Вызов стоит столько кредитов, сколько у него указано; /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 вызовов на кредитах из пакета, 10 000 с Hive Explorer. Кредиты за вызов

Песочница

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: 2 из 8 строк)

Сведите ответ в строку, которую храните. Слово с 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: 2 из 3 строк)

Что говорит ответ, конкурент за конкурентом. 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."
  }
}

Общие параметры

Они читаются одинаково на всех эндпоинтах, которые их принимают; у каждого эндпоинта указаны свои.

ПараметрГдеТипОписание
appIdpathstringid приложения из list_apps
countryquerystringкод страны, например tr, us (по умолчанию первая страна приложения)
platformqueryios | androidпо умолчанию ios
countryquerystringкод витрины, например us (по умолчанию us)

Аккаунт

Тариф, права доступа и расход самого ключа, поиск по аккаунту и лента оповещений. Чтение тарифа и расхода стоит 0 кредитов.

  • GET /alertsЛента оповещений этого рабочего пространства — падения и рост позиций, ключевые слова, вошедшие в…
  • GET /portfolioСегодняшний день по всем приложениям рабочего пространства, по строке на приложение: пользователи…
  • GET /accountКому принадлежит этот ключ или сессия: тариф, способ аутентификации, области доступа, приложения…
  • GET /usageВсе лимиты рабочего пространства с расходом и временем сброса: отслеживаемые ключевые слова…
  • GET /searchПоиск по собственным записям аккаунта — названиям приложений и id в магазине, отслеживаемым ключевым…
  • GET /fetchПолная запись по одному id из search: карточка приложения, одно отслеживаемое ключевое слово с текущим…

Ваши приложения

Приложения этого рабочего пространства: позиции, конкуренты, отзывы, страница в сторе, её хронология, подборки, чарты и проверки страницы.

  • GET /appsСписок приложений, отслеживаемых в этом аккаунте Storelift (id, название, страны, ключевые слова)
  • GET /apps/{appId}/keywordsПозиции одного приложения по ключевым словам в одной стране App Store / Google Play
  • GET /apps/{appId}/rivalsПриложения, которые стоят ВЫШЕ этого приложения в поиске
  • GET /apps/{appId}/aiУпоминания приложения в датированной выборке ответов ИИ-систем; это не воспроизводит то, что ChatGPT…
  • GET /apps/{appId}/ai-checkЗапускает выборку видимости в ИИ для одного приложения в одной стране с системами, доступными для…
  • GET /apps/{appId}/historyИстория позиций по ключевым словам в одной стране
  • GET /apps/{appId}/pageСигналы страницы самого приложения в магазине для одной страны (без названия и подзаголовка): версия…
  • GET /apps/{appId}/reviewsНедавние отзывы по одной стране: `list` — отзывы App Store, `android` — отзывы Google Play (окно…
  • GET /apps/{appId}/chartsПозиция в чартах App Store для одной страны: текущие позиции по спискам (бесплатные / платные /…
  • GET /apps/{appId}/reviews/searchПоиск по отзывам одного приложения в одной витрине: по тексту, оценке в звёздах, версии приложения и…
  • GET /apps/{appId}/reviews/statsРаспределение оценок в звёздах, среднее и доля отзывов с 1–2 звёздами для одного приложения в одной…
  • GET /apps/{appId}/reviews/summaryИИ для отзывов по одному приложению в одной витрине: сводка недавних отзывов и тем в них — жалобы…
  • 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Ваша страница iOS во всех витринах App Store: где продаётся приложение, какие витрины показывают…
  • GET /apps/{appId}/suggestНовые идеи ключевых слов для одного приложения в одной витрине, написанные на языке поиска этой…
  • POST /apps/{appId}/validate-listingПроверяет черновик страницы App 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}/featuringГде Apple показывает приложение сегодня, по странам: редакционные карточки (dedicated: true, когда…
  • GET /apps/{appId}Одно отслеживаемое приложение с id платформ, странами, отслеживаемыми ключевыми словами по странам и…
  • GET /apps/{appId}/weekly-planПредложения этой недели по странице приложения — тот же список, что в карточке «На этой неделе» в панели, сначала лучшие

Выручка и Apple Ads

Подключённые источники по приложению: выручка, события подписок, воронка App Store, цены и коды предложений, «до и после» изменения, а также кампании, ключевые слова, поисковые запросы и команды Apple Ads. Права revenue:read и ads:read.

  • GET /apps/{appId}/revenueДоход и загрузки одного приложения из источников, которые подключил пользователь: ежедневные единицы по…
  • GET /apps/{appId}/subscriptionsЧисло событий подписок одного приложения из вебхука RevenueCat / Adapty: по дням и по странам — начала…
  • GET /apps/{appId}/funnelВоронка конверсии App Store для одного приложения по аналитике App Store Connect: показы → просмотры…
  • GET /apps/{appId}/campaignsКампании Apple Ads, которые продвигают одно приложение (сопоставление по id приложения в App Store, а…
  • GET /apps/{appId}/ads-keywordsВсе ключевые слова Apple Ads, купленные для одного приложения во всех его кампаниях (последние 28…
  • GET /apps/{appId}/ads-search-termsЗапросы, которые люди действительно вводили и которые вызвали показ рекламы приложения в Apple Ads…
  • GET /apps/{appId}/ads-commandsКоманды Apple Ads для кампаний одного приложения — из панели, из правил автоматизации и из…
  • GET /apps/{appId}/search-popularityСобственная поисковая популярность Apple из аккаунта Apple Ads, подключённого к этому рабочему…
  • GET /apps/{appId}/pricingЦены продуктов и коды предложений одного приложения из вебхука RevenueCat или Adapty за последние 365…
  • 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/findПоиск приложений по топ-чартам, которые мы измеряем: фильтруйте по категории, витрине, чарту (Топ…
  • GET /hive/chartsОдин топ-чарт в том виде, в каком мы измерили его последний раз: id приложений по порядку для витрины…
  • GET /hive/moversКто поднялся, кто упал, кто вошёл и кто покинул один топ-чарт по сравнению с тем же чартом N дней назад
  • GET /hive/newПриложения, впервые замеченные в топ-чарте, сначала новые, с издателем каждого
  • GET /hive/publisher/{publisherId}Все приложения одного издателя, которые мы видели в чарте, с днём первого появления каждого
  • GET /hive/resolveНаходит id любого приложения: по названию или разработчику (лучшие совпадения в этой витрине, с…
  • GET /hive/similar/{appId}Блок похожих приложений самого магазина для любого приложения (You Might Also Like у Apple, Similar…
  • 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Применение записи после предпросмотра