Documentación para desarrolladores
Referencia de la API
Una URL base, una clave y JSON tanto en la petición como en la respuesta. Cada endpoint de esta página es también una herramienta MCP con el mismo nombre.
openapi.json · Códigos de error · Servidor MCP
URL base
https://storelift.net/v1
Todas las rutas de esta página son relativas a ella. Envíe GET para las lecturas y POST solo en /actions.
Autenticación
Envíe la clave en Authorization: Bearer <key> o en x-api-key. Las claves se crean en Ajustes › API; cada clave lleva sus scopes y, de forma opcional, una lista de IP permitidas, una lista de apps y un presupuesto mensual de créditos. Una clave que alcanza su presupuesto responde 402 key_budget_reached hasta que cambia el mes; las demás claves siguen funcionando.
Las claves de producción (sl_live_) para la API REST están disponibles en Pro y en los planes superiores, o en cualquier plan con un pack de créditos. Free incluye una clave de producción que solo funciona en el servidor MCP. Las claves de prueba (sl_test_) devuelven los datos del sandbox en todos los planes. Los asistentes inician sesión con OAuth a través del servidor MCP en todos los planes.
Créditos y límites
Cada llamada cuesta los créditos que se indican en ella; /account y /usage cuestan 0, y la vista previa de una escritura cuesta 0. Todas las respuestas llevan x-credits-used, x-credits-limit, x-credits-remaining y x-credits-reset.
Las peticiones por segundo se fijan por plan; si las supera, recibe 429 rate_limited con retry-after. Los endpoints de Hive se abren con créditos de API comprados o con Hive Explorer y cuentan además para una cuota diaria: 500 llamadas con créditos de un pack y 10.000 con Hive Explorer. Créditos por llamada
Sandbox
https://storelift.net/v1/sandbox responde a todas las lecturas de esta página que tienen una respuesta de ejemplo, sin clave y sin créditos. Los datos son fijos y llevan fecha, así que las pruebas se mantienen estables.
Las claves de prueba (sl_test_) devuelven los mismos datos en la URL base de producción y nunca escriben.
Cómo leer una posición
Una posición tiene tres estados y no se mezclan: measured: false significa que la consulta no se midió ese día, rank: null significa que se midió y la app queda fuera de los resultados leídos, y un número es la posición.
Errores
Todos los errores tienen el mismo cuerpo: { "error": "<code>", "message": "…", "docs": "…" }. error es estable; base en él la lógica de su código, no en message. Algunos códigos añaden campos como scope, field o limit. Todos los códigos de error
Ejemplos paso a paso
Tres tareas, desde la primera llamada hasta el resultado que usted guarda. Todos los comandos se ejecutan contra el sandbox, así que no gastan créditos ni cambian nada, y cada respuesta es la que el sandbox devuelve para ese comando.
Con su propia clave, las rutas son las mismas sin /sandbox y cada llamada cuesta los créditos que se indican en ella. Una clave de prueba (sl_test_) responde también ahí con los datos del sandbox, por 0 créditos.
Añadir a un informe las posiciones por palabra clave de esta semana
Lea las palabras clave de una app en una tienda y quédese con una sola fila. Ejecútelo cada semana y las filas irán formando una tendencia.
Busque el id de la app.
curl "https://storelift.net/v1/sandbox/apps"Respuesta
Lea todas las palabras clave que esa app tiene en seguimiento en la tienda.
curl "https://storelift.net/v1/sandbox/apps/sbx-lumen/keywords?country=us"Respuesta (keywords: 2 de 8 filas)
Resuma la respuesta en la fila que usted guarda. Una palabra clave con measured: true y rank: null se midió y la app no aparece en los resultados; se cuenta aparte de una palabra clave que no se midió.
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
}
}Un id de app que el espacio de trabajo no tiene 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"
}Preguntar quién posiciona por encima de su app
Los mismos datos a través del servidor MCP: el asistente hace dos llamadas a herramientas. Para enviarlas a mano, ponga una clave de prueba en STORELIFT_TEST_KEY.
list_appsdevuelve el id de la 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":{}}}'Respuesta
get_rivalsdevuelve las apps que posicionan por encima de ella, palabra clave por palabra clave.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"}}}'Respuesta (rivals: 2 de 3 filas)
Lo que dice la respuesta, competidor por competidor. ourRank: null es una palabra clave en la que la app no 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
}
]Un id de app que el espacio de trabajo no tiene vuelve como un error de herramienta que el asistente puede leer, no como una petición fallida:
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.Ver qué puede leer una credencial, por HTTP o por MCP
La primera llamada de cualquier integración: qué plan, qué scopes, qué apps y cuántos créditos quedan. GET /account y la herramienta whoami devuelven el mismo cuerpo, y ninguna de las dos cuesta créditos.
Por HTTP.
curl "https://storelift.net/v1/sandbox/account"Respuesta
La misma respuesta como llamada a una herramienta.
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":{}}}'Respuesta
Compruebe el scope que necesita una llamada antes de hacerla y lea el saldo antes de lanzar un 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
}Sin credenciales, el endpoint MCP responde 401 con un error JSON-RPC, y un cliente compatible con la autorización de MCP arranca a partir de esa respuesta el inicio de sesión con 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."
}
}Parámetros comunes
Se interpretan igual en todos los endpoints que los admiten; cada endpoint indica cuáles admite.
| Parámetro | Ubicación | Tipo | Descripción |
|---|---|---|---|
appId | path | string | id de la app, de list_apps |
country | query | string | código de país, p. ej. tr, us (por defecto, el primer país de la app) |
platform | query | ios | android | ios por defecto |
country | query | string | código de tienda, p. ej. us (us por defecto) |
Cuenta
El plan, los scopes y el uso de la propia clave, la búsqueda en la cuenta y el feed de alertas. Leer el plan y el uso cuesta 0 créditos.
- GET
/alertsEl feed de alertas de este espacio de trabajo — caídas y subidas de posición, palabras clave que entran… - GET
/portfolioEl día de hoy en todas las apps del espacio de trabajo, una fila por app: usuarios en directo, usuarios… - GET
/accountA quién pertenece esta clave o sesión: plan, método de autenticación, ámbitos que lleva, apps que puede… - GET
/usageTodas las cuotas del espacio de trabajo con lo usado y la hora de reinicio: palabras clave seguidas… - GET
/searchBusca en los registros de esta cuenta — nombres de apps e ids de tienda, palabras clave seguidas y las… - GET
/fetchEl registro completo de un id devuelto por search: la tarjeta de una app, una palabra clave seguida con…
Sus apps
Las apps que sigue este espacio de trabajo: posiciones, competidores, reseñas, página de la tienda, cronología de la ficha, apariciones destacadas, top charts y comprobaciones de la ficha.
- GET
/appsLista las apps seguidas en esta cuenta de Storelift (id, nombre, países, palabras clave) - GET
/apps/{appId}/keywordsPosiciones de las palabras clave de una app en un país de App Store / Google Play - GET
/apps/{appId}/rivalsApps que aparecen POR ENCIMA de esta app en la búsqueda - GET
/apps/{appId}/aiMenciones de la app en una muestra fechada de respuestas de motores de IA; no reproduce lo que ChatGPT… - GET
/apps/{appId}/ai-checkInicia una muestra de visibilidad en IA para una app en un país, con los motores disponibles para la… - GET
/apps/{appId}/historyHistorial de posiciones de las palabras clave en un país - GET
/apps/{appId}/pageLas señales de la ficha de la propia app en un país (sin nombre ni subtítulo): versión, eventos in-app… - GET
/apps/{appId}/reviewsReseñas recientes de un país: `list` contiene las reseñas de App Store y `android`, las de Google Play… - GET
/apps/{appId}/chartsPosición en las listas de App Store en un país: posiciones actuales por lista (gratis / de pago /… - GET
/apps/{appId}/reviews/searchBusca en las reseñas de una app en una tienda por texto, valoración en estrellas, versión de la app e… - GET
/apps/{appId}/reviews/statsDistribución de valoraciones en estrellas, media y porcentaje de reseñas de 1–2 estrellas de una app en… - GET
/apps/{appId}/reviews/summaryIA de reseñas para una app en una tienda: un resumen de las reseñas recientes y de sus temas — quejas… - GET
/apps/{appId}/reviews/reply-draftUn borrador de respuesta del desarrollador a una reseña, en el idioma de la tienda - GET
/apps/{appId}/timelineCambios fechados en la ficha de una app — nueva versión, capturas de pantalla, eventos in-app… - GET
/apps/{appId}/todayEl día de una app en una sola respuesta — la pantalla Hoy: compras, pruebas y renovaciones de las… - GET
/apps/{appId}/competitionCuántas apps compiten por cada palabra clave en una tienda; se devuelve para los términos vistos en dos o más apps - GET
/apps/{appId}/rivals/{rivalId}Un competidor de su app en una tienda: su nombre, su valoración y su número de valoraciones con un… - GET
/apps/{appId}/rivals/{rivalId}/adnetworksCómo monetiza un competidor con anuncios: las redes publicitarias con las que trabaja, cada una marcada como DIRECT o RESELLER - GET
/apps/{appId}/rivals/{rivalId}/marketEl mercado de un competidor en una tienda: en Google Play, el número exacto de instalaciones y el rango… - GET
/apps/{appId}/storefront-auditSu ficha de iOS en todas las tiendas de App Store: dónde se vende la app, qué tiendas muestran el texto… - GET
/apps/{appId}/suggestIdeas de palabras clave nuevas para una app en una tienda, escritas en el idioma de búsqueda de esa… - POST
/apps/{appId}/validate-listingRevisa un borrador de ficha de App Store antes de enviarlo a App Store Connect - GET
/apps/{appId}/draftUn borrador de ficha — título, subtítulo, texto promocional y descripción — creado a partir de las… - GET
/apps/{appId}/localizeRedacta la ficha completa de App Store para un nuevo idioma regional — nombre, subtítulo, campo de… - GET
/apps/{appId}/shot-textEl texto de las cuatro primeras capturas de pantalla de su app en App Store en una tienda - GET
/apps/{appId}/chart-moversQuién se movió en la lista de la categoría de la app: subidas y bajadas (3 o más puestos), novedades y… - GET
/apps/{appId}/featuringDónde muestra Apple la app hoy, por país: tarjetas editoriales (dedicated: true cuando la historia… - GET
/apps/{appId}Una app seguida con sus ids de plataforma, sus países, sus palabras clave seguidas por país y la última… - GET
/apps/{appId}/weekly-planLas sugerencias de ficha de esta semana para la app: la misma lista que la tarjeta «Esta semana» del panel, de mejor a peor
Ingresos y Apple Ads
Las fuentes conectadas de cada app: ingresos, eventos de suscripción, el embudo del App Store, precios y códigos de oferta, el antes y el después de un cambio, y las campañas, palabras clave, términos de búsqueda y comandos de Apple Ads. Scopes revenue:read y ads:read.
- GET
/apps/{appId}/revenueIngresos y descargas de una app procedentes de las fuentes que conectó el usuario: unidades diarias por… - GET
/apps/{appId}/subscriptionsRecuentos de eventos de suscripción de una app procedentes del webhook de RevenueCat / Adapty: por día… - GET
/apps/{appId}/funnelEl embudo de conversión de App Store de una app según las analíticas de App Store Connect: impresiones… - GET
/apps/{appId}/campaignsCampañas de Apple Ads que promocionan una app (identificadas por el id de App Store de la app, no por… - GET
/apps/{appId}/ads-keywordsTodas las palabras clave de Apple Ads compradas para una app en sus campañas (últimos 28 días), por… - GET
/apps/{appId}/ads-search-termsLas búsquedas que la gente escribió realmente y que activaron los anuncios de Apple Ads de la app… - GET
/apps/{appId}/ads-commandsComandos de Apple Ads para las campañas de una app — desde el panel, desde las reglas de automatización… - GET
/apps/{appId}/search-popularityLa popularidad de búsqueda de Apple, desde la cuenta de Apple Ads conectada a este espacio de trabajo… - GET
/apps/{appId}/pricingPrecios de producto y códigos de oferta de una app procedentes del webhook de RevenueCat o Adapty, en… - GET
/apps/{appId}/country-pricesPrecios por país de uno de los productos de la app, leídos de App Store Connect / Google Play (Pro)… - GET
/apps/{appId}/change-impactQué efecto tuvo un cambio: para un día de cambio (una nueva versión, capturas de pantalla, subtítulo…
Hive
Cualquier app o mercado que mida la red de Storelift, la siga usted o no. Forma parte de Hive Explorer.
- GET
/rank-checkLa posición en directo de una de sus apps para cualquier término de búsqueda en una tienda, tal como la… - GET
/keyword-difficultyDatos de demanda y dificultad de un término de búsqueda de App Store en una tienda: su demanda… - GET
/hive/findBusca apps en las listas de éxitos que medimos: filtre por categoría, tienda, lista (Top ingresos, Top… - GET
/hive/chartsUna lista de éxitos tal como la medimos por última vez: los ids de las apps en orden para una tienda… - GET
/hive/moversQuién subió, quién bajó, quién entró y quién salió de una lista de éxitos, frente a la misma lista de hace N días - GET
/hive/newApps vistas por primera vez en una lista de éxitos, de la más reciente a la más antigua, con el editor de cada una - GET
/hive/publisher/{publisherId}Todas las apps de un editor que hemos visto en una lista, con el día en que se vio cada una por primera vez - GET
/hive/resolveEncuentra el id de cualquier app: por nombre o desarrollador (los mejores resultados en esa tienda, con… - GET
/hive/similar/{appId}El estante de apps similares de la propia tienda para cualquier app (You Might Also Like de Apple… - GET
/hive/reviews/{appId}Las reseñas recientes de cualquier app en una tienda, de la más reciente a la más antigua: estrellas… - POST
/hive/keywords/{term}/metrics/measureInicia una medición de la popularidad o la dificultad de una palabra clave (o de ambas) en una tienda… - GET
/hive/apps/{id}La última medición diaria de cualquier app - GET
/hive/keywords/{term}/ranksQuién posiciona para una palabra clave, día a día - GET
/hive/keywords/{term}/metricsLee la popularidad y la dificultad actuales de una palabra clave - GET
/hive/keywords/{term}/metrics/historyLee las observaciones guardadas de las métricas de una palabra clave a lo largo del tiempo - GET
/hive/spy/{id}Las palabras clave para las que posiciona cualquier app - GET
/hive/estimate/{id}Ingresos y descargas de cualquier app - GET
/hive/gapHuecos de palabras clave entre varias apps - GET
/hive/researchInvestigación de palabras clave a partir de un término semilla - GET
/hive/landscapeQué hace falta para posicionar en una categoría
Escrituras
Cada escritura se ejecuta en dos pasos: una vista previa que no cambia nada y, después, una confirmación con el token que esa vista previa devolvió.
- GET
/jobs/{jobId}Estado de un trabajo de larga duración iniciado por una acción confirmada (comando de Apple Ads… - POST
/actionsPrevisualiza una escritura - POST
/actions/confirmAplica una escritura previsualizada