Documentação para desenvolvedores
Referência da API
Uma URL base, uma chave, JSON na ida e na volta. Cada endpoint abaixo também é uma ferramenta MCP com o mesmo nome.
openapi.json · Códigos de erro · Servidor MCP
URL base
https://storelift.net/v1
Todos os caminhos abaixo são relativos a ela. Envie GET para leituras e POST só em /actions.
Autenticação
Envie a chave em Authorization: Bearer <key> ou em x-api-key. Crie as chaves em Configurações › API; cada chave tem escopos, uma lista opcional de IPs permitidos, uma lista opcional de apps e um orçamento mensal opcional de créditos. Uma chave que atinge o orçamento responde 402 key_budget_reached até a virada do mês; as outras chaves continuam funcionando.
As chaves de produção (sl_live_) da API REST estão no Pro e acima, ou em qualquer plano com um pacote de créditos. O Free inclui uma chave de produção que funciona só no servidor MCP. As chaves de teste (sl_test_) devolvem os dados do sandbox em todos os planos. Os assistentes fazem login por OAuth pelo servidor MCP em todos os planos.
Créditos e limites
Cada chamada custa os créditos indicados nela; /account e /usage custam 0, e a prévia de uma escrita custa 0. Toda resposta traz x-credits-used, x-credits-limit, x-credits-remaining e x-credits-reset.
As requisições por segundo são definidas por plano; acima disso você recebe 429 rate_limited com retry-after. Os endpoints do Hive abrem com créditos de API comprados ou com o Hive Explorer e também contam para uma cota diária: 500 chamadas com créditos de pacote, 10.000 com o Hive Explorer. Créditos por chamada
Sandbox
https://storelift.net/v1/sandbox responde a todas as leituras abaixo que têm resposta de exemplo, sem chave e sem créditos. Os dados são fixos e datados, então os testes ficam estáveis.
As chaves de teste (sl_test_) devolvem os mesmos dados na URL base de produção e nunca escrevem.
Como ler uma posição
Uma posição tem três estados, e eles ficam separados: measured: false significa que a consulta não foi medida naquele dia, rank: null significa que ela foi medida e o app está fora dos resultados lidos, e um número é a posição.
Erros
Todo erro tem o mesmo corpo: { "error": "<code>", "message": "…", "docs": "…" }. error é estável; faça a ramificação por ele, não por message. Alguns códigos acrescentam campos como scope, field ou limit. Todos os códigos de erro
Exemplos passo a passo
Três trabalhos, da primeira chamada ao resultado que você guarda. Todos os comandos rodam no sandbox, então não gastam créditos nem mudam nada, e cada resposta é a que o sandbox devolve para o comando.
Com a sua própria chave, os caminhos são os mesmos sem /sandbox e cada chamada custa os créditos indicados nela. Uma chave de teste (sl_test_) também responde ali com os dados do sandbox, por 0 créditos.
Leve as posições das palavras-chave da semana para um relatório
Leia as palavras-chave de um app em uma loja e guarde uma única linha. Rode toda semana e as linhas formam uma tendência.
Encontre o id do app.
curl "https://storelift.net/v1/sandbox/apps"Resposta
Leia todas as palavras-chave acompanhadas desse app na loja.
curl "https://storelift.net/v1/sandbox/apps/sbx-lumen/keywords?country=us"Resposta (keywords: 2 de 8 linhas)
Resuma a resposta na linha que você guarda. Uma palavra-chave com measured: true e rank: null foi medida e o app não está nos resultados; ela é contada à parte de uma palavra-chave que não foi medida.
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 },
};
}Resultado
{
"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
}
}Um id de app que o workspace não tem responde 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"
}Pergunte quem está acima de você
Os mesmos dados pelo servidor MCP: o assistente faz duas chamadas de ferramenta. Para enviá-las à mão, coloque uma chave de teste em STORELIFT_TEST_KEY.
list_appsdevolve o id do app.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":{}}}'Resposta
get_rivalsdevolve os apps posicionados acima dele, palavra-chave por palavra-chave.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"}}}'Resposta (rivals: 2 de 3 linhas)
O que a resposta diz, concorrente por concorrente. ourRank: null é uma palavra-chave em que o app não aparece.
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,
}));
}Resultado
[
{
"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
}
]Um id de app que o workspace não tem volta como um erro de ferramenta que o assistente consegue ler, não como uma requisição que falhou:
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.Veja o que uma credencial pode ler, por HTTP ou MCP
A primeira chamada de qualquer integração: qual plano, quais escopos, quais apps e quantos créditos restam. GET /account e a ferramenta whoami devolvem o mesmo corpo, e nenhuma das duas custa créditos.
Por HTTP.
curl "https://storelift.net/v1/sandbox/account"Resposta
A mesma resposta como chamada de ferramenta.
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":{}}}'Resposta
Confira o escopo que uma chamada exige antes de fazê-la e leia o saldo antes de um lote.
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,
};
}Resultado
{
"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
}Sem credenciais, o endpoint MCP responde 401 com um erro JSON-RPC, e um cliente compatível com a autorização MCP inicia o login OAuth a partir dele:
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."
}
}Parâmetros comuns
Eles funcionam do mesmo jeito em todos os endpoints que os aceitam; cada endpoint lista os que aceita.
| Parâmetro | Local | Tipo | Descrição |
|---|---|---|---|
appId | path | string | id do app, de list_apps |
country | query | string | código do país, ex.: tr, us (padrão: o primeiro país do app) |
platform | query | ios | android | padrão: ios |
country | query | string | código da loja, ex.: us (padrão us) |
Conta
O plano, os escopos e o uso da própria chave, a busca na conta e o feed de alertas. Ler o plano e o uso custa 0 créditos.
- GET
/alertsO feed de alertas deste espaço de trabalho — quedas e subidas de posição, palavras-chave que entram nos… - GET
/portfolioO dia de hoje em todos os apps do espaço de trabalho, uma linha por app: usuários ao vivo, usuários e… - GET
/accountA quem pertence esta chave ou sessão: plano, como se autenticou, os escopos que carrega, os apps que… - GET
/usageTodas as cotas do espaço de trabalho, com o que foi usado e o horário de renovação: palavras-chave… - GET
/searchPesquisa nos registros desta conta — nomes de apps e ids de loja, palavras-chave acompanhadas e os apps… - GET
/fetchO registro completo de um id retornado por search: o cartão de um app, uma palavra-chave acompanhada…
Seus apps
Os apps que este workspace acompanha: posições, concorrentes, avaliações, página na loja, linha do tempo da página, destaques, top charts e verificações da página.
- GET
/appsLista os apps acompanhados nesta conta do Storelift (id, nome, países, palavras-chave) - GET
/apps/{appId}/keywordsPosições das palavras-chave de um app em um país da App Store / Google Play - GET
/apps/{appId}/rivalsApps que aparecem ACIMA deste app na busca - GET
/apps/{appId}/aiMenções ao app em uma amostra datada de respostas de mecanismos de IA; isso não reproduz o que o… - GET
/apps/{appId}/ai-checkInicia uma amostra de visibilidade em IA para um app em um país, com os mecanismos disponíveis para a… - GET
/apps/{appId}/historyHistórico de posições das palavras-chave em um país - GET
/apps/{appId}/pageOs sinais da página da loja do próprio app em um país (sem nome e subtítulo): versão, eventos no app… - GET
/apps/{appId}/reviewsAvaliações recentes de um país: `list` traz as avaliações da App Store e `android`, as do Google Play… - GET
/apps/{appId}/chartsPosição nas paradas da App Store em um país: posições atuais por lista (gratuitos / pagos /… - GET
/apps/{appId}/reviews/searchPesquisa as avaliações de um app em uma loja por texto, nota em estrelas, versão do app e intervalo de… - GET
/apps/{appId}/reviews/statsDistribuição das notas em estrelas, média e parcela de avaliações de 1–2 estrelas de um app em uma… - GET
/apps/{appId}/reviews/summaryIA de avaliações para um app em uma loja: um resumo das avaliações recentes e dos temas nelas… - GET
/apps/{appId}/reviews/reply-draftUm rascunho de resposta do desenvolvedor a uma avaliação, no idioma da loja - GET
/apps/{appId}/timelineMudanças datadas na página da loja de um app — nova versão, capturas de tela, eventos no app, destaques… - GET
/apps/{appId}/todayO dia de um app em uma única resposta — a tela Hoje: compras, testes gratuitos e renovações das fontes… - GET
/apps/{appId}/competitionQuantos apps competem por cada palavra-chave em uma loja; retornado para termos vistos em dois ou mais apps - GET
/apps/{appId}/rivals/{rivalId}Um concorrente do seu app em uma loja: nome, nota e número de notas com um histórico de 90 dias (uma… - GET
/apps/{appId}/rivals/{rivalId}/adnetworksComo um concorrente monetiza com anúncios: as redes de anúncios com que ele trabalha, cada uma marcada como DIRECT ou RESELLER - GET
/apps/{appId}/rivals/{rivalId}/marketO mercado de um concorrente em uma loja: no Google Play, o número exato de instalações e a faixa de… - GET
/apps/{appId}/storefront-auditSua página do iOS em todas as lojas da App Store: onde o app é vendido, quais lojas exibem o texto ou… - GET
/apps/{appId}/suggestNovas ideias de palavras-chave para um app em uma loja, escritas no idioma de busca dessa loja: termos… - POST
/apps/{appId}/validate-listingVerifica um rascunho de página da App Store antes de ele ir para o App Store Connect - GET
/apps/{appId}/draftUm rascunho de página da loja — título, subtítulo, texto promocional e descrição — criado a partir das… - GET
/apps/{appId}/localizeEscreve a página completa da App Store para uma nova localidade — nome, subtítulo, campo de… - GET
/apps/{appId}/shot-textO texto das legendas das quatro primeiras capturas de tela do seu app na App Store em uma loja - GET
/apps/{appId}/chart-moversQuem se moveu na parada da categoria do app: quem subiu e quem caiu (3 ou mais posições), novos… - GET
/apps/{appId}/featuringOnde a Apple exibe o app hoje, por país: cartões editoriais (dedicated: true quando a história é sobre… - GET
/apps/{appId}Um app acompanhado com seus ids de plataforma, países, palavras-chave acompanhadas por país e a medição… - GET
/apps/{appId}/weekly-planAs sugestões desta semana para a página da loja do app: a mesma lista do cartão "Esta semana" do painel, da melhor para a pior
Receita e Apple Ads
As fontes conectadas de cada app: receita, eventos de assinatura, o funil da App Store, preços e códigos de oferta, o antes e depois de uma mudança, e campanhas, palavras-chave, termos de busca e comandos do Apple Ads. Escopos revenue:read e ads:read.
- GET
/apps/{appId}/revenueReceita e downloads de um app a partir das fontes que o usuário conectou: unidades diárias por país do… - GET
/apps/{appId}/subscriptionsContagens de eventos de assinatura de um app a partir do webhook do RevenueCat / Adapty: por dia e por… - GET
/apps/{appId}/funnelO funil de conversão da App Store de um app a partir das análises do App Store Connect: impressões →… - GET
/apps/{appId}/campaignsCampanhas do Apple Ads que promovem um app (associadas pelo id do app na App Store, não pelo nome)… - GET
/apps/{appId}/ads-keywordsTodas as palavras-chave do Apple Ads compradas para um app em suas campanhas (últimos 28 dias), por… - GET
/apps/{appId}/ads-search-termsAs buscas que as pessoas realmente digitaram e que acionaram os anúncios do app no Apple Ads (últimos… - GET
/apps/{appId}/ads-commandsComandos do Apple Ads para as campanhas de um app — vindos do painel, das regras de automação e de… - GET
/apps/{appId}/search-popularityA popularidade de busca da própria Apple, a partir da conta do Apple Ads conectada a este espaço de… - GET
/apps/{appId}/pricingPreços de produtos e códigos de oferta de um app a partir do webhook do RevenueCat ou do Adapty, nos… - GET
/apps/{appId}/country-pricesPreços por país de um dos produtos do app, lidos do App Store Connect / Google Play (Pro): por país, o… - GET
/apps/{appId}/change-impactO que uma mudança causou: para um dia de mudança (uma nova versão, capturas de tela, subtítulo, campo…
Hive
Qualquer app ou mercado que a rede do Storelift mede, quer você o acompanhe ou não. Faz parte do Hive Explorer.
- GET
/rank-checkA posição ao vivo de um dos seus apps para qualquer termo de busca em uma loja, do jeito que a loja… - GET
/keyword-difficultyDados de demanda e dificuldade de um termo de busca da App Store em uma loja: a demanda (`demand`) e as… - GET
/hive/findEncontre apps nas paradas que medimos: filtre por categoria, loja, parada (Maior faturamento, Top… - GET
/hive/chartsUma parada como a medimos pela última vez: os ids dos apps em ordem para uma loja, um tipo de lista e… - GET
/hive/moversQuem subiu, quem caiu, quem entrou e quem saiu de uma parada, em comparação com a mesma parada de N dias atrás - GET
/hive/newApps vistos em uma parada pela primeira vez, do mais recente para o mais antigo, com o desenvolvedor de cada um - GET
/hive/publisher/{publisherId}Todos os apps de um desenvolvedor que já vimos em uma parada, com o dia em que cada um foi visto pela primeira vez - GET
/hive/resolveEncontre o id de qualquer app: por nome ou desenvolvedor (os melhores resultados nessa loja, com… - GET
/hive/similar/{appId}A seção de apps semelhantes da própria loja para qualquer app (You Might Also Like da Apple, Similar… - GET
/hive/reviews/{appId}As avaliações recentes de qualquer app em uma loja, da mais recente para a mais antiga: estrelas… - POST
/hive/keywords/{term}/metrics/measureInicia uma medição da popularidade e/ou da dificuldade de uma palavra-chave em uma loja quando o valor… - GET
/hive/apps/{id}A medição diária mais recente de qualquer app - GET
/hive/keywords/{term}/ranksQuem ranqueia para uma palavra-chave, dia a dia - GET
/hive/keywords/{term}/metricsLê a popularidade e a dificuldade atuais de uma palavra-chave - GET
/hive/keywords/{term}/metrics/historyLê as observações guardadas das métricas de uma palavra-chave ao longo do tempo - GET
/hive/spy/{id}As palavras-chave para as quais qualquer app ranqueia - GET
/hive/estimate/{id}Receita e downloads de qualquer app - GET
/hive/gapLacunas de palavras-chave entre vários apps - GET
/hive/researchPesquisa de palavras-chave a partir de um termo semente - GET
/hive/landscapeO que é preciso para ranquear em uma categoria
Escritas
Toda escrita roda em dois passos: uma prévia que não muda nada e, depois, uma confirmação com o token que ela devolveu.
- GET
/jobs/{jobId}Status de um trabalho de longa duração iniciado por uma ação confirmada (comando do Apple Ads, resposta… - POST
/actionsPré-visualiza uma gravação - POST
/actions/confirmAplica uma gravação pré-visualizada