Référence de l'API
Une URL de base, une clé, du JSON en entrée comme en sortie. Chaque endpoint ci-dessous est aussi un outil MCP du même nom.
openapi.json · Codes d'erreur · Serveur MCP
URL de base
https://storelift.net/v1
Tous les chemins ci-dessous sont relatifs à cette URL. Envoyez GET pour les lectures et POST uniquement sur /actions.
Authentification
Envoyez la clé dans Authorization: Bearer <key> ou dans x-api-key. Créez les clés sous Réglages › API ; chaque clé porte des scopes, une liste facultative d'adresses IP autorisées, une liste facultative d'apps et un budget mensuel de crédits facultatif. Une clé qui atteint son budget répond 402 key_budget_reached jusqu'au changement de mois ; les autres clés continuent de fonctionner.
Les clés live (sl_live_) pour l'API REST sont disponibles à partir de Pro, ou sur n'importe quel plan avec un pack de crédits. Free inclut une clé live qui ne fonctionne qu'avec le serveur MCP. Les clés de test (sl_test_) renvoient les données de la sandbox sur tous les plans. Les assistants se connectent via OAuth par le serveur MCP sur tous les plans.
Crédits et limites
Chaque appel coûte le nombre de crédits indiqué pour lui ; /account et /usage coûtent 0, et l'aperçu d'une écriture coûte 0. Chaque réponse porte x-credits-used, x-credits-limit, x-credits-remaining et x-credits-reset.
Le nombre de requêtes par seconde est fixé par plan ; au-delà, vous recevez 429 rate_limited avec retry-after. Les endpoints Hive s'ouvrent avec des crédits API achetés ou avec Hive Explorer et sont aussi décomptés d'un quota quotidien : 500 appels avec les crédits d'un pack, 10 000 avec Hive Explorer. Crédits par appel
Sandbox
https://storelift.net/v1/sandbox répond à toutes les lectures ci-dessous qui ont un exemple de réponse, sans clé et sans crédits. Les données sont fixes et datées, ce qui garde les tests stables.
Les clés de test (sl_test_) renvoient les mêmes données sur l'URL de base live et n'écrivent jamais.
Lire un rang
Un rang a trois états, et ils restent distincts : measured: false signifie que la requête n'a pas été mesurée ce jour-là, rank: null qu'elle a été mesurée et que l'app est en dehors des résultats lus, et un nombre est le rang.
Erreurs
Toutes les erreurs ont le même corps : { "error": "<code>", "message": "…", "docs": "…" }. error est stable ; branchez votre logique sur ce champ, pas sur message. Certains codes ajoutent des champs tels que scope, field ou limit. Tous les codes d'erreur
Exemples commentés
Trois tâches, du premier appel au résultat que vous conservez. Chaque commande s'exécute sur la sandbox : elle ne dépense donc aucun crédit et ne change rien, et chaque réponse est celle que la sandbox renvoie pour cette commande.
Avec votre propre clé, les chemins sont les mêmes sans /sandbox et chaque appel coûte le nombre de crédits indiqué pour lui. Une clé de test (sl_test_) y répond aussi avec les données de la sandbox, pour 0 crédit.
Ajouter à un rapport les rangs par mot-clé de la semaine
Lisez les mots-clés d'une app dans un pays et gardez-en une seule ligne. Refaites-le chaque semaine : les lignes s'alignent et forment une tendance.
Trouvez l'identifiant de l'app.
curl "https://storelift.net/v1/sandbox/apps"Réponse
Lisez tous les mots-clés suivis de cette app dans ce pays.
curl "https://storelift.net/v1/sandbox/apps/sbx-lumen/keywords?country=us"Réponse (keywords: 2 lignes sur 8)
Ramenez la réponse à la ligne que vous stockez. Un mot-clé avec measured: true et rank: null a été mesuré et l'app est absente des résultats ; il est compté à part d'un mot-clé qui n'a pas été mesuré.
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 },
};
}Résultat
{
"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 identifiant d'app que l'espace de travail ne possède pas répond 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"
}Demander qui est classé au-dessus de vous
Les mêmes données par le serveur MCP : l'assistant fait deux appels d'outil. Pour les envoyer à la main, placez une clé de test dans STORELIFT_TEST_KEY.
list_appsrenvoie l'identifiant de l'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":{}}}'Réponse
get_rivalsrenvoie les apps classées au-dessus d'elle, mot-clé par mot-clé.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"}}}'Réponse (rivals: 2 lignes sur 3)
Ce que dit la réponse, concurrent par concurrent. ourRank: null désigne un mot-clé dont l'app est absente.
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,
}));
}Résultat
[
{
"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 identifiant d'app que l'espace de travail ne possède pas revient sous forme d'erreur d'outil que l'assistant peut lire, et non comme une requête en échec :
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.Voir ce que des identifiants d'accès peuvent lire, en HTTP ou par MCP
Le premier appel de toute intégration : quel plan, quels scopes, quelles apps et combien de crédits il reste. GET /account et l'outil whoami renvoient le même corps, et aucun des deux ne coûte de crédits.
En HTTP.
curl "https://storelift.net/v1/sandbox/account"Réponse
La même réponse sous forme d'appel d'outil.
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":{}}}'Réponse
Vérifiez le scope dont un appel a besoin avant de le faire, et lisez le solde avant un traitement par lot.
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,
};
}Résultat
{
"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
}Sans identifiants d'accès, l'endpoint MCP répond 401 avec une erreur JSON-RPC, et un client qui prend en charge l'autorisation MCP lance la connexion OAuth à partir de cette réponse :
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."
}
}Paramètres communs
Ils se lisent de la même façon sur tous les endpoints qui les acceptent ; chaque endpoint indique ceux qu'il accepte.
| Paramètre | Emplacement | Type | Description |
|---|---|---|---|
appId | path | string | identifiant d’app issu de list_apps |
country | query | string | code pays, p. ex. tr, us (par défaut, le premier pays de l’app) |
platform | query | ios | android | ios par défaut |
country | query | string | code pays, p. ex. us (us par défaut) |
Compte
Le plan, les scopes et l'usage de la clé elle-même, la recherche dans le compte et le flux d'alertes. Lire le plan et l'usage coûte 0 crédit.
- GET
/alertsLe flux d’alertes de cet espace de travail — baisses et hausses de position, mots-clés qui entrent dans… - GET
/portfolioLa journée en cours pour toutes les apps de l’espace de travail, une ligne par app : utilisateurs en… - GET
/accountÀ qui appartient cette clé ou cette session : forfait, mode d’authentification, portées incluses, apps… - GET
/usageTous les quotas de l’espace de travail, avec la consommation et l’heure de remise à zéro : mots-clés… - GET
/searchRecherche dans les enregistrements de ce compte — noms d’apps et identifiants de store, mots-clés… - GET
/fetchL’enregistrement complet derrière un identifiant issu de search : une carte d’app, un mot-clé suivi…
Vos apps
Les apps que suit cet espace de travail : rangs, concurrents, avis, page du store, chronologie de la fiche, mises en avant, top charts et contrôles de la fiche.
- GET
/appsListe les apps suivies dans ce compte Storelift (identifiant, nom, pays, mots-clés) - GET
/apps/{appId}/keywordsPositions des mots-clés d’une app dans un pays de l’App Store / de Google Play - GET
/apps/{appId}/rivalsApps classées AU-DESSUS de cette app dans la recherche - GET
/apps/{appId}/aiMentions de l’app dans un échantillon daté de réponses de moteurs d’IA ; cela ne reproduit pas ce que… - GET
/apps/{appId}/ai-checkLance un échantillon de visibilité IA pour une app dans un pays, avec les moteurs disponibles pour… - GET
/apps/{appId}/historyHistorique des positions des mots-clés pour un pays - GET
/apps/{appId}/pageLes signaux de la fiche de l’app elle-même pour un pays (le nom et le sous-titre ne sont pas inclus)… - GET
/apps/{appId}/reviewsAvis récents pour un pays : `list` contient les avis de l’App Store, `android` ceux de Google Play (une… - GET
/apps/{appId}/chartsPosition dans les classements de l’App Store pour un pays : positions actuelles par liste (gratuit /… - GET
/apps/{appId}/reviews/searchRecherche dans les avis d’une app dans un pays par texte, note en étoiles, version de l’app et période… - GET
/apps/{appId}/reviews/statsRépartition des étoiles, moyenne et part des avis à 1–2 étoiles pour une app dans un pays, plus une… - GET
/apps/{appId}/reviews/summaryIA des avis pour une app dans un pays : un résumé des avis récents et de leurs thèmes — réclamations… - GET
/apps/{appId}/reviews/reply-draftUn brouillon de réponse du développeur pour un avis, dans la langue du pays - GET
/apps/{appId}/timelineModifications datées de la fiche d’une app — nouvelle version, captures d’écran, événements dans l’app… - GET
/apps/{appId}/todayLa journée d’une app en une seule réponse — l’écran Aujourd’hui : achats, essais et renouvellements… - GET
/apps/{appId}/competitionCombien d’apps sont en concurrence sur chaque mot-clé dans un pays, renvoyé pour les termes vus sur deux apps ou plus - GET
/apps/{appId}/rivals/{rivalId}Un concurrent de votre app dans un pays : son nom, sa note et son nombre de notes avec leur historique… - GET
/apps/{appId}/rivals/{rivalId}/adnetworksComment un concurrent monétise par la publicité : les régies publicitaires avec lesquelles il travaille, chacune marquée DIRECT ou RESELLER - GET
/apps/{appId}/rivals/{rivalId}/marketLe marché d’un concurrent dans un pays : sur Google Play, le nombre exact d’installations et la… - GET
/apps/{appId}/storefront-auditVotre fiche iOS dans chaque pays de l’App Store : où l’app est vendue, quels pays affichent le texte ou… - GET
/apps/{appId}/suggestDe nouvelles idées de mots-clés pour une app dans un pays, rédigées dans la langue de recherche de ce… - POST
/apps/{appId}/validate-listingVérifie un brouillon de fiche App Store avant son envoi à App Store Connect - GET
/apps/{appId}/draftUn brouillon de fiche — titre, sous-titre, texte promotionnel et description — construit à partir des… - GET
/apps/{appId}/localizeRédige la fiche App Store complète pour une nouvelle langue — nom, sous-titre, champ de mots-clés et… - GET
/apps/{appId}/shot-textLe texte des légendes de vos quatre premières captures d’écran App Store dans un pays - GET
/apps/{appId}/chart-moversQui a bougé dans le classement de la catégorie de l’app : hausses et baisses (3 places et plus)… - GET
/apps/{appId}/featuringOù Apple montre l’app aujourd’hui, par pays : cartes éditoriales (dedicated: true quand l’article porte… - GET
/apps/{appId}Une app suivie avec ses identifiants de plateforme, ses pays, ses mots-clés suivis par pays et le… - GET
/apps/{appId}/weekly-planLes suggestions de fiche de la semaine pour l’app — la même liste que la carte « Cette semaine » du tableau de bord, les meilleures en premier
Revenus et Apple Ads
Les sources connectées par app : revenus, événements d'abonnement, entonnoir de l'App Store, prix et codes d'offre, l'avant/après d'un changement, ainsi que les campagnes, mots-clés, termes de recherche et commandes Apple Ads. Scopes revenue:read et ads:read.
- GET
/apps/{appId}/revenueRevenus et téléchargements d’une app à partir des sources connectées par l’utilisateur : unités… - GET
/apps/{appId}/subscriptionsNombre d’événements d’abonnement d’une app issus du webhook RevenueCat / Adapty : par jour et par pays… - GET
/apps/{appId}/funnelL’entonnoir de conversion App Store d’une app d’après les statistiques d’App Store Connect… - GET
/apps/{appId}/campaignsCampagnes Apple Ads qui font la promotion d’une app (associées par l’identifiant App Store de l’app… - GET
/apps/{appId}/ads-keywordsTous les mots-clés Apple Ads achetés pour une app dans l’ensemble de ses campagnes (28 derniers jours)… - GET
/apps/{appId}/ads-search-termsLes recherches que les gens ont réellement tapées et qui ont déclenché les annonces Apple Ads de l’app… - GET
/apps/{appId}/ads-commandsCommandes Apple Ads pour les campagnes d’une app — depuis le tableau de bord, les règles… - GET
/apps/{appId}/search-popularityLa popularité de recherche d’Apple elle-même, depuis le compte Apple Ads connecté à cet espace de… - GET
/apps/{appId}/pricingPrix des produits et codes d’offre d’une app issus du webhook RevenueCat ou Adapty, sur les 365… - GET
/apps/{appId}/country-pricesPrix par pays pour l’un des produits de l’app, lus dans App Store Connect / Google Play (Pro) : par… - GET
/apps/{appId}/change-impactCe qu’une modification a produit : pour un jour de modification (nouvelle version, captures d’écran…
Hive
N'importe quelle app ou n'importe quel marché que mesure le réseau Storelift, que vous les suiviez ou non. Fait partie de Hive Explorer.
- GET
/rank-checkLa position en direct de l’une de vos apps pour n’importe quel terme de recherche dans un pays, telle… - GET
/keyword-difficultyDonnées de demande et de difficulté pour un terme de recherche App Store dans un pays : sa demande… - GET
/hive/findTrouve des apps dans les classements que nous mesurons : filtrez par catégorie, pays, classement (Top… - GET
/hive/chartsUn classement tel que nous l’avons mesuré en dernier : les identifiants d’apps classés pour un pays, un… - GET
/hive/moversQui a monté, qui a baissé, qui est entré et qui est sorti d’un classement, par rapport au même classement il y a N jours - GET
/hive/newApps vues pour la première fois dans un classement, de la plus récente à la plus ancienne, avec l’éditeur derrière chacune - GET
/hive/publisher/{publisherId}Toutes les apps d’un éditeur que nous avons vues dans un classement, avec le jour où chacune a été vue pour la première fois - GET
/hive/resolveTrouve l’identifiant de n’importe quelle app : par nom ou développeur (les meilleurs résultats dans ce… - GET
/hive/similar/{appId}Le rayon d’apps similaires du store pour n’importe quelle app (You Might Also Like d’Apple, Similar… - GET
/hive/reviews/{appId}Les avis récents de n’importe quelle app dans un pays, du plus récent au plus ancien : étoiles, titre… - POST
/hive/keywords/{term}/metrics/measureLance une mesure de la popularité et/ou de la difficulté d’un mot-clé dans un pays lorsque la valeur… - GET
/hive/apps/{id}La dernière mesure quotidienne de n’importe quelle app - GET
/hive/keywords/{term}/ranksQui est classé sur un mot-clé, jour par jour - GET
/hive/keywords/{term}/metricsLit la popularité et la difficulté actuelles d’un mot-clé - GET
/hive/keywords/{term}/metrics/historyLit les observations stockées des métriques d’un mot-clé dans le temps - GET
/hive/spy/{id}Les mots-clés sur lesquels n’importe quelle app est classée - GET
/hive/estimate/{id}Revenus et téléchargements de n’importe quelle app - GET
/hive/gapÉcart de mots-clés entre plusieurs apps - GET
/hive/researchRecherche de mots-clés à partir d’un terme de départ - GET
/hive/landscapeCe qu’il faut pour se classer dans une catégorie
Écritures
Chaque écriture se déroule en deux étapes : un aperçu qui ne change rien, puis une confirmation avec le jeton qu'il a renvoyé.
- GET
/jobs/{jobId}État d’une tâche de longue durée lancée par une action confirmée (commande Apple Ads, réponse à un… - POST
/actionsPrévisualise une écriture - POST
/actions/confirmApplique une écriture prévisualisée