annuaire-shopify

Documentation API annuaire-shopify

API REST pour intégrer la base de 70 000 boutiques Shopify dans votre outil B2B. Authentification Bearer, pagination par curseur, notifications automatiques signées HMAC. Disponible avec le format Pro avec API à 199 €/mois — 25 places ouvertes au lancement.

En bref

  • Base URL : https://api.annuaire-shopify.fr/v1
  • Authentification : jeton Bearer dans l’en-tête Authorization
  • Format : JSON REST classique, pas de GraphQL
  • Pagination : curseur opaque (cursor / next_cursor)
  • Limites de débit : 50 000 appels / mois, 20 requêtes / seconde
  • Notifications automatiques : POST signés HMAC-SHA256, 5 actifs maximum
  • Spécification : OpenAPI 3.1 disponible au téléchargement (lien à brancher côté dev)
  • Format requis : Pro avec API 199 €/mois — voir tarifs

Pour le guide narratif et les patterns d’intégration côté code, voir le guide API annuaire Shopify qui complète cette référence.

Authentification

Toutes les requêtes nécessitent un jeton Bearer dans l’en-tête Authorization. Le jeton est généré dans le tableau de bord et porte les droits de votre compte.

GET /v1/stores HTTP/1.1
Host: api.annuaire-shopify.fr
Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxx
Accept: application/json

Gestion des clés

  • Plusieurs clés actives par compte (utile pour la rotation sans interruption).
  • Une clé par environnement recommandée (staging, production).
  • Révocation immédiate depuis le tableau de bord.
  • Stockage : jamais commit. Variable d’environnement en dev, gestionnaire de secrets en production (AWS Secrets Manager, GCP Secret Manager, Vault, Doppler).

Codes d’erreur d’authentification

Code Signification
401 Unauthorized En-tête Authorization absent ou mal formé.
401 invalid_key Le jeton n’existe pas ou a été révoqué.
403 forbidden Le jeton est valide mais ne porte pas le droit demandé.

Endpoint principal : /v1/stores

Liste les boutiques Shopify de la base. C’est l’endpoint que vous utiliserez à 90 %.

Méthode

GET /v1/stores

Paramètres de requête

Paramètre Type Défaut Description
tld string Filtre par extension de domaine (fr, com, de, es, co.uk, com.au…).
theme string Nom exact du thème Shopify utilisé (Dawn, Prestige, Turbo, Custom…).
theme_version string Version exacte du thème (utile pour audits techniques).
first_seen_after date ISO Marchands ajoutés à la base après cette date.
updated_since date ISO Pour les synchronisations incrémentales. Recommandé sur les flux automatisés.
domain string Recherche directe sur un domaine précis (retour 1 ligne max).
limit int 100 Nombre de résultats par page. Maximum 100.
cursor string Curseur de pagination retourné par la requête précédente.

Roadmap — les filtres techno secondaires (klaviyo, shopify_plus, judge_me, recharge, yotpo) ne sont pas encore disponibles. Ils seront ajoutés au fur et à mesure des étapes 1 et 2 de la roadmap publique, sans casser la signature existante de l’endpoint.

Réponse

{
  "data": [
    {
      "id": "str_a8f3c2",
      "domain": "exemple-marchand.fr",
      "store_name": "Exemple Marchand",
      "tld": "fr",
      "theme": "Prestige",
      "theme_version": "9.4.0",
      "first_seen": "2024-08-12",
      "last_verified": "2026-04-22"
    }
  ],
  "next_cursor": "eyJpZCI6InN0cl9hOGYzYzIifQ==",
  "remaining_quota": 49823
}

Le champ remaining_quota est renvoyé sur chaque réponse 2xx pour faciliter la surveillance côté client.

Exemple curl

Liste 100 marchands sur extension .fr avec thème Prestige :

curl -H "Authorization: Bearer $API_KEY" \
  "https://api.annuaire-shopify.fr/v1/stores?tld=fr&theme=Prestige&limit=100"

Codes de réponse

Code Signification
200 OK Réponse standard.
204 No Content Aucun résultat pour le filtre demandé (corps vide).
400 Bad Request Paramètre invalide. Le corps précise lequel.
401 Unauthorized Voir section authentification.
403 Forbidden Quota dépassé ou droit insuffisant.
429 Too Many Requests Limite de débit atteinte. En-tête Retry-After en secondes.
500 Internal Server Error Erreur côté serveur. Réessayer avec délai exponentiel.

Endpoint domaine unique : /v1/stores/{domain}

Récupère une fiche par domaine canonique. Utile pour l’enrichissement CRM unitaire (« est-ce que ce compte tourne sous Shopify ? »).

Méthode

GET /v1/stores/exemple-marchand.fr

Réponse

{
  "id": "str_a8f3c2",
  "domain": "exemple-marchand.fr",
  "store_name": "Exemple Marchand",
  "tld": "fr",
  "theme": "Prestige",
  "theme_version": "9.4.0",
  "first_seen": "2024-08-12",
  "last_verified": "2026-04-22"
}

Codes de réponse spécifiques

Code Signification
200 OK Le domaine est dans la base.
404 Not Found Le domaine n’est pas dans la base — soit non détecté, soit non-Shopify.

Pagination par curseur

L’API utilise un curseur opaque, pas un décalage numérique. C’est volontaire : sur une base qui change pendant l’itération, un décalage saute ou duplique des lignes.

Pattern d’utilisation

  1. Première requête sans cursor.
  2. La réponse contient next_cursor (ou null si dernière page).
  3. Passer ce curseur dans la requête suivante.
  4. Continuer jusqu’à next_cursor: null.

Précisions

  • Ne décodez jamais le curseur. Format interne, susceptible de changer.
  • Ne stockez pas les curseurs entre deux runs. Pour reprendre une synchronisation incrémentale, utilisez updated_since avec un timestamp.
  • Le curseur peut être invalidé si la base est ré-indexée. Dans ce cas, l’API renvoie 400 cursor_expired et vous relancez depuis le début.

Notifications automatiques (webhooks)

Plutôt que d’interroger l’endpoint en boucle, vous pouvez recevoir des notifications push sur les événements qui correspondent à vos filtres.

Configuration

Dans le tableau de bord :

  1. Onglet « Notifications automatiques ».
  2. Ajouter un point de réception (URL HTTPS).
  3. Filtres optionnels (par extension, par thème, par événement).
  4. Générer le secret HMAC partagé.

Quota : 5 notifications automatiques actives par compte sur le format Pro avec API.

Événements supportés

Événement Déclenchement
store.detected Un nouveau domaine Shopify est ajouté à la base.
store.updated Une fiche existante voit un de ses champs changer (nouveau thème par exemple).
store.removed Un domaine ne répond plus à la signature /products.json depuis 14 jours (boutique fermée ou migration off-Shopify).

Charge utile

{
  "event": "store.detected",
  "id": "evt_2x9f3a",
  "timestamp": "2026-04-27T08:14:22Z",
  "data": {
    "id": "str_b7d4e1",
    "domain": "nouveau-marchand.fr",
    "store_name": "Nouveau Marchand",
    "tld": "fr",
    "theme": "Dawn",
    "first_seen": "2026-04-27"
  }
}

Vérification de signature HMAC-SHA256

Chaque POST inclut un en-tête X-Annuaire-Signature calculé en HMAC-SHA256 sur le corps brut, encodé hexadécimal.

import hmac
import hashlib

def verify(body: bytes, signature: str, secret: str) -> bool:
    expected = hmac.new(
        secret.encode(), body, hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(expected, signature)

Deux pièges à éviter :

  • Calculer la signature sur le corps brut, pas sur un JSON re-sérialisé.
  • Utiliser compare_digest (temps constant), pas ==. Sinon vous exposez un oracle temporel.

Politique de nouvelle tentative

Si votre point de réception renvoie un statut non-2xx ou met plus de 10 secondes à répondre, l’annuaire retente avec un délai exponentiel : 1 min, 5 min, 30 min, 2 h, 8 h. Au-delà de 5 échecs consécutifs, la notification automatique passe en paused et une alerte email est envoyée. Réactivation manuelle depuis le tableau de bord.

Idempotence

Chaque événement a un id unique (evt_*). Indexez vos événements reçus sur ce champ avec un INSERT ... ON CONFLICT DO NOTHING pour éviter les doublons sur nouvelle tentative.

Limites de débit

Sur le format Pro avec API à 199 €/mois :

  • 50 000 appels API / mois sur l’ensemble des endpoints.
  • 20 requêtes / seconde en pic court (token bucket).
  • 5 notifications automatiques actives simultanées.
  • 3 sièges utilisateur sur le tableau de bord.
  • 20 000 boutiques accessibles / mois dans les listings.

Comportement au dépassement

Seuil Action
80 % du quota mensuel Alerte email envoyée à l’adresse du compte.
100 % du quota mensuel Statut 429 Too Many Requests jusqu’au prochain cycle de facturation. En-tête Retry-After indique le temps avant reset.
2 mois consécutifs proches du plafond Proposition de bascule en accord sur mesure avec quotas adaptés.

Pas de débit silencieux, pas de surfacturation cachée.

Surveillance côté client

Chaque réponse 2xx inclut deux en-têtes :

X-Quota-Remaining: 49823
X-Rate-Limit-Remaining: 18

Permet de monitorer la consommation et d’ajuster votre cadence.

Idempotence sur écritures

Pour les futurs endpoints en POST/PATCH (gestion de listes personnalisées, étiquettes), l’API supporte un en-tête Idempotency-Key.

POST /v1/lists HTTP/1.1
Authorization: Bearer $API_KEY
Idempotency-Key: 7c9e6679-7425-40de-944b-e07fc1f90ae7
Content-Type: application/json

{
  "name": "Ma liste",
  "filters": {"tld": "fr"}
}

Vous générez un UUID v4 par opération métier. L’API garantit qu’une nouvelle tentative avec la même clé dans les 24 heures ne ré-applique pas l’opération.

Spécification OpenAPI

La spec complète au format OpenAPI 3.1 est disponible au téléchargement (lien à brancher côté dev : https://api.annuaire-shopify.fr/v1/openapi.json).

Compatible avec :

  • openapi-typescript pour générer les types TypeScript.
  • datamodel-code-generator pour les modèles Pydantic.
  • Swagger UI / Redoc pour la documentation interactive auto-générée.

Statut de la roadmap

Voici ce qui est disponible aujourd’hui et ce qui est sur la roadmap publique.

Disponible aujourd’hui

  • Endpoint /v1/stores avec filtres tld, theme, theme_version, first_seen_after, updated_since, domain.
  • Endpoint /v1/stores/{domain}.
  • Pagination par curseur, surveillance des quotas via en-têtes.
  • Notifications automatiques store.detected, store.updated, store.removed avec signature HMAC.

Sur la roadmap (sans date publique)

  • Étape 1 : filtres shopify_plus et klaviyo (booléens). Notifications automatiques associées.
  • Étape 2 : filtres recharge, yotpo, judge_me, markets (booléens).
  • Étape 3 : filtre vertical (secteur). Notifications automatiques associées.
  • Plus tard : endpoint MCP pour intégration directe Claude / autre agent IA.

Les ajouts se feront sans casser la signature existante des endpoints. Si vous itérez aujourd’hui sur les filtres disponibles, votre intégration restera fonctionnelle après livraison des étapes suivantes.

Limites assumées

Transparence sur ce qui n’est pas garanti à ce format tarifaire :

  • Pas d’engagement de service contractuel sur le format Pro avec API à 199 €/mois. Disponibilité 99,5 % annoncée en meilleur effort, non opposable juridiquement. Pour un engagement de service avec pénalités, c’est un accord sur mesure.
  • Géo-distribution mono-région. L’API est servie depuis AWS eu-west-3 (Paris). Latence P50 ~180 ms depuis l’Europe, ~250 ms depuis l’East Coast US, ~400 ms depuis APAC.
  • Pas de SDK officiel. REST + JSON, n’importe quel client HTTP suffit. Un SDK Python communautaire est sur la liste, mais on stabilise la signature avant de geler une distribution.
  • Pas de bac à sable séparé. Une seule URL api.annuaire-shopify.fr. Pour itérer en dev sans consommer le quota production, utilisez les filtres restrictifs (domain= sur un domaine connu, limit=1).

Démarrer

  1. Souscrire à Pro avec API sur la page tarifs — 25 places ouvertes au lancement.
  2. Générer un jeton dans le tableau de bord, onglet « Clés API ».
  3. Tester avec curl : curl -H "Authorization: Bearer $API_KEY" "https://api.annuaire-shopify.fr/v1/stores?limit=10".
  4. Configurer les notifications automatiques dans le tableau de bord si votre flux le nécessite.
  5. Surveiller le quota via les en-têtes X-Quota-Remaining et X-Rate-Limit-Remaining.

Pour le guide narratif avec exemples Python / Node complets et calcul de seuil de rentabilité face à un outil maison, voir le guide API annuaire Shopify.

Support technique

← Retour à l’accueil · Voir tarifs · Guide API narratif · Cas d’usage développeurs · Roadmap publique

V1 statique : le formulaire ouvre un email prérempli. Une intégration serveur sera branchée après validation.

Décision simple

Vous voulez tester sur votre cible ?

Recevez 10 fiches d’exemple, sans carte bancaire, puis passez au CSV ou Pro si la donnée colle à votre marché.