Documentation développeur

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.

Scope
apps:read
Crédits
2 · 0 dans la sandbox ou avec une clé de test
Plan
Sandbox et clé de test: tous les plans · clé live: Pro et plans supérieurs
Fonctionne depuis
API 1.5.0
  1. Trouvez l'identifiant de l'app.

    curl "https://storelift.net/v1/sandbox/apps"
    Réponse
  2. 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.

Scope
apps:read
Crédits
2 · 0 avec une clé de test
Plan
Clé de test et OAuth: tous les plans · clé live: tous les plans
Fonctionne depuis
API 1.5.0 · outils dans storelift-mcp 1.1.1
  1. list_apps renvoie 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
  2. get_rivals renvoie 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.

Scope
aucun
Crédits
0
Plan
Sandbox, clé de test et OAuth: tous les plans · clé live: Pro et plans supérieurs
Fonctionne depuis
API 1.5.0 · outils dans storelift-mcp 1.5.0
  1. En HTTP.

    curl "https://storelift.net/v1/sandbox/account"
    Réponse
  2. 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ètreEmplacementTypeDescription
appIdpathstringidentifiant d’app issu de list_apps
countryquerystringcode pays, p. ex. tr, us (par défaut, le premier pays de l’app)
platformqueryios | androidios par défaut
countryquerystringcode 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.

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.

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.

É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é.