Développeurs
Documentation API
L'API GMB Club permet de publier et planifier des posts sur vos réseaux sociaux via Zapier, Make, ou vos propres scripts. Elle permet aussi de récupérer les articles générés.
Concepts clés
L'API v2 utilise l'architecture hiérarchique Sphère / Bulle de GMB Club.
| Concept | Description | Exemple |
|---|---|---|
| Sphère | Marque / Entreprise / Franchiseur | "Auto Sud" |
| Bulle | Établissement / Point de vente | "Auto Sud Marseille" |
| Ressources | Comptes connectés à la bulle | Facebook, Instagram, GMB |
Important
Authentification
L'API utilise des clés API pour l'authentification. Une clé peut avoir deux portées : elle couvre soit un seul établissement (clé de bulle), soit tous les établissements de la marque (clé de sphère). Une clé de bulle ne voit que les données de son établissement ; une clé de sphère voit celles de tous les établissements — l'option idéale pour un site multi-établissements : une seule clé, une seule intégration. Appelez GET /api/v2/me en premier pour savoir de quelle portée vous disposez : le champ « bulle » est renseigné pour une clé de bulle et vaut null pour une clé de sphère.
Portée de la clé : bulle ou sphère
Une seule règle de périmètre, valable pour toute l'API :
- Une clé couvre un établissement (clé de bulle) ou toute la marque (clé de sphère). Elle définit ce qui est autorisé, jamais ce qui est visé.
- Toute route qui agit sur une cible accepte un paramètre de cible :
bulle_idpour un établissement,fiche_idpour une fiche Google. Toujours au même endroit : paramètre d'URL en lecture, champ du corps en écriture. - Sans paramètre : une clé de bulle vise son établissement ; une clé de sphère reçoit un
400qui nomme le paramètre manquant. Jamais de choix arbitraire. - Les routes de liste sans paramètre renvoient l'ensemble de la marque, et chaque élément porte son
bulle_id. - Une cible hors du périmètre de la clé renvoie
403; une cible inexistante,404.
Réponses possibles (messages du backend, en français) :
| Code | Réponse (detail) |
|---|---|
403 | Cet établissement n'appartient pas à votre périmètre. |
403 | Cette fiche GMB n'appartient pas à votre périmètre. |
404 | Établissement introuvable : <identifiant> |
404 | Aucune fiche GMB associée à cette clé API. |
400 | Cette clé API couvre plusieurs établissements. Précisez `bulle_id` (liste : GET /api/v2/bulles). |
400 | Cette clé API couvre plusieurs fiches Google. Précisez `fiche_id` (liste : GET /api/v2/me). |
Obtenir une clé API
- Connectez-vous à GMB Club
- Sélectionnez votre bulle dans l'en-tête
- Paramètres → Clés API → Nouvelle clé
- Choisissez la portée : « Cet établissement » ou « Toute la marque »
- Configurez les permissions et copiez la clé
Une clé « Toute la marque » couvre tous les établissements, y compris ceux créés plus tard : c'est le bon choix pour un site unique qui dessert plusieurs établissements — un seul secret à gérer, aucune intervention à prévoir à l'ouverture d'un nouvel établissement.
Important
Format de la clé
gmb_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxUtilisation
curl -H "X-API-Key: gmb_live_xxxx..." \
-H "Content-Type: application/json" \
https://app.gmb-club.com/api/v2/meJSON uniquement
Base URL
https://app.gmb-club.com/api/v2Endpoints
/api/v2/healthVérifie que l'API est opérationnelle. Ne nécessite pas d'authentification.
{
"status": "ok",
"api_version": "2.0",
"timestamp": "2026-07-27T18:00:00.000000Z"
}Identité de la clé
/api/v2/meAuthreadRetourne les informations sur la clé API, la bulle, la sphère et les ressources connectées. Endpoint à appeler en premier.
{
"api_version": "2.0",
"bulle": { "id": "abc-123", "name": "Auto Sud Marseille", "city": "Marseille" },
"sphere": { "id": "xyz-789", "name": "Auto Sud", "slug": "auto-sud" },
"permissions": ["read", "schedule", "publish"],
"rate_limits": { "per_minute": 60, "per_day": 1000 },
"connected_platforms": ["facebook", "instagram", "gmb", "linkedin"],
"gmb_fiches": [{
"id": "accounts/115473832376124235338/locations/12517715818229047311",
"name": "Auto Sud - Marseille Centre",
"address": "12 rue de la Paix, 13001, Marseille",
"service_area": false
}]
}Clé de sphère
bulle vaut null et le tableau gmb_fiches liste toutes les fiches de la marque.Connexions sociales
/api/v2/connectionsAuthreadRetourne les détails des réseaux sociaux connectés pour cette bulle.
[
{ "platform": "facebook", "connected": true, "name": "Auto Sud Marseille", "bulle_id": "abc-123", "expires_at": "2025-12-15T10:00:00", "needs_reconnect": false },
{ "platform": "instagram", "connected": true, "name": "autosud_marseille", "bulle_id": "abc-456", "expires_at": "2025-12-15T10:00:00", "needs_reconnect": false }
]| Paramètre | Type | Défaut |
|---|---|---|
bulle_id | string | Restreindre à un établissement. Défaut : celui de la clé, ou tous les établissements de la marque. |
Avec une clé de sphère, bulle_id indique à quel établissement appartient chaque page Facebook ou compte Instagram.
Limites des plateformes
/api/v2/platforms/limitsAuthreadRetourne les limites de caractères et médias pour chaque plateforme.
{
"character_limits": { "<plateforme>": "<int>" },
"image_limits": {
"<plateforme>": { "max_size_mb": "<int>", "carousel_min": "<int?>", "carousel_max": "<int?>" }
},
"video_limits": {
"<plateforme>": { "max_size_mb": "<int>", "max_duration_sec": "<int?>" }
}
}Forme, pas valeurs figées
Créer un post
/api/v2/postsAuthscheduleCrée un nouveau post planifié ou le publie immédiatement.
Erreurs fréquentes
Clé de sphère : bulle_id obligatoire
bulle_id est désormais obligatoire sur POST /posts. Auparavant l'appel réussissait en choisissant un établissement par défaut, ce qui pouvait publier sur la mauvaise fiche Google. Les intégrations existantes qui utilisent une clé de sphère doivent ajouter ce champ.Body (JSON)
{
"content": "Discover our new arrivals! 🚗 #automobile",
"platforms": ["facebook", "instagram", "gmb"],
"image_url": "https://example.com/images/promo.jpg",
"scheduled_at": "2025-12-01T10:00:00+01:00",
"gmb_fiche_id": "gmb-fiche-123-456"
}Paramètres
| Champ | Type | Requis | Description |
|---|---|---|---|
content | string | Oui | Texte du post (1-5000 car.) |
platforms | array | Oui | Tableau : facebook, instagram, gmb, linkedin, pinterest, tiktok, snapchat, youtube. La plateforme doit être connectée sur l'établissement, sinon HTTP 400 « Plateforme non connectée ». |
image_url | string | Non | URL d'une image unique |
image_urls | array | Non | Tableau JSON d'URLs pour carrousel (2-10) |
video_url | string | Non | URL d'une vidéo |
scheduled_at | string | Non | Date/heure ISO 8601 (défaut: +1h) |
gmb_fiche_id | string | Non | ID de la fiche GMB (voir /me) |
publish_now | boolean | Non | Si true, publie immédiatement |
bulle_id | string | Clé de sphère | Obligatoire avec une clé de sphère : l'établissement ciblé. Déduit automatiquement avec une clé de bulle. |
content ou text
Réponse :
{
"id": 42,
"content": "Discover our new arrivals! 🚗 #automobile",
"platforms": ["facebook", "instagram", "gmb"],
"status": "scheduled",
"image_url": "https://example.com/images/promo.jpg",
"scheduled_gmb": "2025-12-01T10:00:00+01:00",
"created_at": "2025-11-29T18:00:00Z",
"updated_at": "2025-11-29T18:00:00Z",
"warnings": []
}Liste des posts
/api/v2/postsAuthreadRetourne les posts de la bulle avec pagination.
| Paramètre | Type | Défaut | Description |
|---|---|---|---|
status | string | - | pending, published, error |
limit | integer | 50 | 1-100 |
offset | integer | 0 | Offset pour pagination |
bulle_id | string | - | Restreindre à un établissement. Défaut : celui de la clé, ou tous les établissements de la marque. |
Tableau nu
[
{
"id": 42,
"bulle_id": "abc-123",
"content": "Discover our new arrivals! 🚗",
"platforms": ["facebook", "gmb"],
"status": "published",
"image_url": "https://example.com/images/promo.jpg",
"image_urls": null,
"video_url": null,
"scheduled_instagram": null,
"scheduled_facebook": "2025-12-01T10:00:00+01:00",
"scheduled_gmb": "2025-12-01T10:00:00+01:00",
"scheduled_linkedin": null,
"scheduled_pinterest": null,
"scheduled_tiktok": null,
"scheduled_snapchat": null,
"scheduled_youtube": null,
"published_instagram": null,
"published_facebook": "2025-12-01T10:00:05+01:00",
"published_gmb": "2025-12-01T10:00:05+01:00",
"published_linkedin": null,
"published_pinterest": null,
"published_tiktok": null,
"published_snapchat": null,
"published_youtube": null,
"error_instagram": null,
"error_facebook": null,
"error_gmb": null,
"error_linkedin": null,
"error_pinterest": null,
"error_tiktok": null,
"error_snapchat": null,
"error_youtube": null,
"platform_refs": { "facebook": "...", "gmb": "..." },
"created_at": "2025-11-29T18:00:00Z",
"updated_at": "2025-12-01T10:00:05Z",
"warnings": []
}
]Réponse complète, champ par champ
scheduled_ / published_ / error_ par plateforme : la date prévue, la date de publication effective, et le message d'erreur éventuel. Une plateforme non concernée par ce post a ses trois champs à null. platform_refs contient les références des publications chez chaque plateforme une fois publiées ; warnings, les avertissements non bloquants./api/v2/posts/{post_id}AuthreadRécupère un post par son identifiant. Renvoie le même objet qu'un élément de GET /api/v2/posts.
/api/v2/posts/{post_id}AuthscheduleMet à jour un post en attente (status: pending uniquement).
Mise à jour partielle
Body (JSON)
{
"content": "Updated text!",
"scheduled_at": "2025-12-02T14:00:00+01:00"
}/api/v2/posts/{post_id}AuthdeleteSupprime un post en attente ou en erreur.
/api/v2/posts/{post_id}/publishAuthpublishForce la publication immédiate d'un post planifié.
Publication sociale simplifiée
Trois endpoints pensés pour les intégrations Make, n8n et Zapier : publier, vérifier le quota, suivre le statut. Ils exigent tous une clé de bulle (voir « Portée de la clé »).
Liste des articles
/api/v2/articlesAuthreadRetourne les articles générés pour cette bulle. Idéal pour intégrer sur un site custom.
Site sans intégration native
{
"articles": [{
"id": 12,
"title": "5 tips for maintaining your car",
"excerpt": "Expert tips to extend your vehicle's life.",
"content_html": "<h2>Introduction</h2><p>Regular maintenance...</p>",
"featured_image_url": "https://storage.example.com/images/article-12.jpg",
"meta_title": "5 car maintenance tips | Auto Sud Marseille",
"meta_description": "Our experts share their best car maintenance tips.",
"target_keyword": "car maintenance Marseille",
"status": "published",
"published_at": "2026-03-10T14:00:00Z",
"created_at": "2026-03-08T09:00:00Z",
"updated_at": "2026-03-12T08:30:00Z",
"slug": "5-conseils-pour-entretenir-sa-voiture",
"bulle_id": "abc-123",
"bulle_name": "Auto Sud Marseille"
}],
"total": 24, "limit": 10, "offset": 0
}Site multi-établissements
bulle_id indique sur quelle page publier chacun. bulle_id vaut null si l'article n'est rattaché qu'à la marque, sans établissement. La correspondance complète des établissements s'obtient par GET /api/v2/bulles.Paramètres
| Paramètre | Type | Défaut |
|---|---|---|
status | string | published · draft · all |
updated_since | string | ISO 8601 — articles modifiés depuis cette date (filtre sur updated_at, tri du plus ancien au plus récent). |
bulle_id | string | Restreindre à un établissement. Défaut : celui de la clé, ou tous les établissements de la marque. |
Rester synchronisé
Détecter une correction. since filtre sur la date de publication : un article publié il y a un mois puis corrigé ce matin n'y apparaît pas. Pour rattraper les corrections, utilisez updated_since, qui filtre sur updated_at. Les résultats sont alors triés du plus ancien au plus récent, ce qui permet de reprendre une synchronisation là où elle s'est arrêtée en conservant la dernière valeur reçue.
Construisez vos URLs avec slug, jamais avec le titre. Le slug est figé à la première publication et n'est jamais recalculé, même si le titre est corrigé ensuite. Dériver l'URL du titre exposerait vos pages à un changement d'adresse après indexation.
Détecter un retrait. Un article dépublié n'apparaît plus dans status=published. Avec status=all, il vous revient avec son statut réel (« draft »), un signal explicite. Un article supprimé, lui, disparaît complètement : traitez la liste reçue comme la source de vérité — ce qui n'y est plus n'est plus en ligne.
/api/v2/articles/{article_id}AuthreadRécupère le contenu complet d'un article par son ID.
{
"id": 12,
"title": "5 conseils pour entretenir sa voiture",
"excerpt": "Nos conseils d'expert.",
"content_html": "<h2>Introduction</h2><p>...</p>",
"featured_image_url": "https://storage.example.com/images/article-12.jpg",
"meta_title": "5 conseils entretien | Auto Sud",
"meta_description": "Nos experts partagent leurs conseils.",
"target_keyword": "entretien voiture marseille",
"status": "published",
"published_at": "2026-03-10T14:00:00Z",
"created_at": "2026-03-08T09:00:00Z",
"updated_at": "2026-03-12T08:30:00Z",
"slug": "5-conseils-pour-entretenir-sa-voiture",
"bulle_id": "abc-123",
"bulle_name": "Auto Sud Marseille"
}Confirmer le rendu d'un article
/api/v2/articles/{article_id}/confirmAuthreadPingback envoyé par votre script après avoir rendu un article fetché. Il a deux effets : 1. il permet à GMB Club de savoir quels articles sont réellement en ligne sur votre site, et non simplement exposés par l'API ; 2. en envoyant `rendered_url`, il alimente le maillage interne de vos articles, ce qui en fait l'effet le plus utile au quotidien. Optionnel mais recommandé.
Quand l'appeler
Corps JSON optionnel. Le champ `rendered_url` (string, max 2048 caractères, doit commencer par http:// ou https://) est l'URL publique de la page sur laquelle votre script vient de rendre l'article. C'est la seule adresse de votre site que GMB Club connaisse : elle permet à vos prochains articles de citer les précédents avec un lien qui pointe au bon endroit. Sans elle, aucun maillage interne n'est possible sur votre site — nous ne devinons jamais une URL, un lien inventé serait un lien mort. Techniquement optionnel, mais vivement recommandé.
// Après avoir affiché l'article dans le DOM
fetch(`https://app.gmb-club.com/api/v2/articles/${article.id}/confirm`, {
method: "POST",
headers: {
"X-API-Key": "gmb_live_xxxx...",
"Content-Type": "application/json"
},
body: JSON.stringify({ rendered_url: location.href })
});Astuce CORS
$ch = curl_init("https://app.gmb-club.com/api/v2/articles/{$id}/confirm");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
"rendered_url" => "https://monsite.fr/blog/article-{$id}"
]));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"X-API-Key: gmb_live_xxxx...",
"Content-Type: application/json"
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);await fetch(`https://app.gmb-club.com/api/v2/articles/${id}/confirm`, {
method: "POST",
headers: {
"X-API-Key": process.env.GMB_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({ rendered_url: `https://monsite.fr/blog/article-${id}` }),
});import requests
requests.post(
f"https://app.gmb-club.com/api/v2/articles/{id}/confirm",
headers={"X-API-Key": "gmb_live_xxxx...", "Content-Type": "application/json"},
json={"rendered_url": f"https://monsite.fr/blog/article-{id}"},
)curl -X POST \
-H "X-API-Key: gmb_live_xxxx..." \
-H "Content-Type: application/json" \
-d '{"rendered_url": "https://monsite.fr/blog/123"}' \
https://app.gmb-club.com/api/v2/articles/42/confirmRéponse 200 lors d'une confirmation réussie :
{
"article_id": 42,
"confirmed_at": "2026-05-25T14:30:00Z",
"confirmation_source": "pingback"
}Maillage interne de vos articles
Conventions transverses
Trois mécanismes reviennent sur la plupart des endpoints v2. Les comprendre une fois évite bien des erreurs.
Aperçu sans risque : dry_run
Fiche par défaut : fiche_id optionnel
Opérations longues : réponse 202
Espace de travail
Sphère de la clé
/api/v2/spheresAuthreadRetourne la sphère (marque) rattachée à la clé API : nom, slug, ton et langue par défaut.
[
{
"id": "xyz-789",
"name": "Auto Sud",
"slug": "auto-sud",
"default_language": "fr",
"default_tone": "professionnel",
"created_at": "2026-01-15T09:00:00Z"
}
]Établissements de la sphère
/api/v2/bullesAuthreadListe les bulles (établissements) de la sphère, avec leur ville et le nombre de fiches Google rattachées.
[
{ "id": "abc-123", "name": "Auto Sud Marseille", "city": "Marseille", "tone": "professionnel", "language": "fr", "sphere_id": "xyz-789", "created_at": "2026-01-20T11:00:00Z" },
{ "id": "abc-456", "name": "Auto Sud Aix", "city": "Aix-en-Provence", "tone": "professionnel", "language": "fr", "sphere_id": "xyz-789", "created_at": "2026-01-20T11:05:00Z" }
]Détail d'un établissement
/api/v2/bulles/{bulle_id}AuthreadRetourne le détail d'une bulle : ton et langue effectifs (hérités de la sphère si non définis), nombre de fiches Google, réseaux connectés.
{
"id": "abc-123",
"name": "Auto Sud Marseille",
"city": "Marseille",
"tone": "professionnel",
"language": "fr",
"sphere_id": "xyz-789",
"created_at": "2026-01-20T11:00:00Z",
"effective_tone": "professionnel",
"effective_language": "fr",
"gmb_fiches_count": 2
}Avis Google
Lister les avis
/api/v2/reviewsAuthreadRetourne les avis Google de la fiche, paginés et filtrables (note, statut de réponse, mot-clé, dates), triables par date ou note.
Paramètres
| Paramètre | Type | Défaut |
|---|---|---|
min_stars | integer | 1-5 · 1 |
max_stars | integer | 1-5 · 5 |
status | string | responded · drafts · unresponded |
keyword | string | - |
date_from | string | ISO 8601 |
date_to | string | ISO 8601 |
sort_by | string | date_desc |
fiche_id | string | Fiche par défaut : fiche_id optionnel |
limit | integer | 1-100 · 25 |
page | integer | 1 |
{
"fiche": { "id": "gmb-fiche-123", "name": "Auto Sud - Marseille Centre", "address": "12 rue de la Paix, Marseille", "place_id": "ChIJ...", "average_rating": 4.6, "total_reviews": 128 },
"reviews": [{
"review_id": "rev-abc",
"customer_name": "Julie A.",
"rating": 5,
"text": "Service impeccable, je recommande !",
"review_timestamp": "2026-07-01T09:12:00Z",
"response_text": null,
"reply_date": null,
"responded": false,
"author_photo": "https://lh3.googleusercontent.com/..."
}],
"average_rating": 4.6,
"total_reviews": 128,
"filtered_count": 1,
"status_counts": { "all": 128, "responded": 90, "drafts": 12, "unresponded": 26 },
"page": 1,
"total_pages": 3
}Résumé des avis
/api/v2/reviews/summaryAuthreadRetourne la note moyenne, le total d'avis et leur répartition par statut (répondus, brouillons, sans réponse).
{
"fiche": { "id": "gmb-fiche-123", "name": "Auto Sud - Marseille Centre" },
"average_rating": 4.6,
"total_reviews": 128,
"status_counts": { "all": 128, "responded": 90, "drafts": 12, "unresponded": 26 }
}Acquisition d'avis
Statistiques d'acquisition
/api/v2/acquisition/statsAuthreadRetourne les statistiques des demandes d'avis sur 30 jours : nombre envoyé, par canal (SMS, email) et par statut.
{
"fiche_id": "gmb-fiche-123",
"total_requests": 84,
"by_channel": { "sms": 50, "email": 34 },
"by_status": {},
"last_30_days": 84
}Envoyer des demandes d'avis
/api/v2/acquisition/review-requestsAuthpublishEnvoie des demandes d'avis par SMS et/ou email à une liste de contacts. Soumise aux quotas mensuels. Réponse 202 avec un batch_id ; supporte dry_run.
Body (JSON)
{
"contacts": [
{ "customer_name": "Julie A.", "channel": "sms", "customer_phone": "+33612345678" },
{ "customer_name": "Marc D.", "channel": "email", "customer_email": "[email protected]", "custom_message": "Merci pour votre visite !" }
],
"dry_run": false
}contacts[]
Réponse :
{
"queued": true,
"queued_count": 2,
"batch_id": "batch-abc-123",
"contacts": [
{ "customer_name": "Julie A.", "channel": "sms", "contact": "+33612345678" },
{ "customer_name": "Marc D.", "channel": "email", "contact": "[email protected]" }
],
"fiche_name": "Auto Sud - Marseille Centre"
}Fiche Google
Statistiques Google Business
/api/v2/gmb/metricsAuthreadRetourne les KPIs de la fiche Google sur une période : vues, recherches, appels, clics vers le site, demandes d'itinéraire.
| Paramètre | Type | Défaut |
|---|---|---|
period_days | integer | 1-90 · 30 |
fiche_id | string | Fiche par défaut : fiche_id optionnel |
{
"fiche_id": "gmb-fiche-123",
"fiche_name": "Auto Sud - Marseille Centre",
"period_days": 30,
"kpis": {
"views_total": 5420,
"views_search": 3110,
"views_maps": 2310,
"calls": 87,
"website": 214,
"directions": 156,
"messages": 12,
"bookings": 4
},
"timeseries": [
{ "label": "2026-06-01", "vues": 180, "interactions": 22 }
],
"breakdown": {}
}Score d'optimisation
/api/v2/gmb/optimizerAuthreadRetourne le dernier score d'optimisation de la fiche (0 à 100), en cache. Lecture rapide, sans nouvel audit.
{
"kind": "gmb",
"fiche_id": "gmb-fiche-123",
"fiche_name": "Auto Sud - Marseille Centre",
"display_name": "Auto Sud - Marseille Centre",
"score": 82,
"breakdown": {},
"scored_at": "2026-07-05T08:00:00Z"
}Lancer un audit complet
/api/v2/gmb/optimizer/auditAuthpublishLance un audit complet de la fiche (données Google + analyse IA) et renvoie un score détaillé avec des suggestions d'amélioration. Opération coûteuse : supporte dry_run.
{
"kind": "gmb",
"fiche_id": "gmb-fiche-123",
"fiche_name": "Auto Sud - Marseille Centre",
"score": 82,
"breakdown": {},
"suggestions": [
{ "field": "description", "reason": "Trop courte", "suggested_value": "..." },
{ "field": "hours", "reason": "Horaires du dimanche manquants" }
],
"review_count": 128,
"avg_rating": 4.6,
"analyzed_at": "2026-07-05T08:00:00Z"
}Appliquer des changements
/api/v2/gmb/optimizer/applyAuthpublishApplique une liste de modifications {field, value} sur la fiche Google (écriture réelle chez Google). Opération coûteuse : supporte dry_run.
Body (JSON)
{
"changes": [
{ "field": "description", "value": "Garage automobile à Marseille..." }
],
"dry_run": true
}Réponse (dry_run) :
{
"dry_run": true,
"fiche_id": "gmb-fiche-123",
"fiche_name": "Auto Sud - Marseille Centre",
"changes": [ { "field": "description", "value": "Garage automobile à Marseille..." } ],
"fields": ["description"]
}Score de visibilité Local Pack
/api/v2/visibility/scanAuthreadRetourne le dernier scan de visibilité de la fiche dans le Local Pack Google : score et position moyenne autour du point de vente.
{
"fiche_id": "gmb-fiche-123",
"snapshot_id": "snap-789",
"visibility_score": 74,
"scanned_at": "2026-07-04T10:00:00Z"
}Si aucun scan n'est disponible, la réponse prend la forme suivante — et non la forme à plat avec visibility_score :
{ "fiche_id": "gmb-fiche-123", "snapshot": null }SEO & mots-clés
Données SEO
/api/v2/seo/dataAuthreadRetourne le dernier snapshot SEO complet de la fiche. Le paramètre kind précise le contenu : snapshot (positions, trafic, santé) ou competitors (concurrents identifiés).
| Paramètre | Type | Défaut |
|---|---|---|
kind | string | snapshot · competitors · (défaut : snapshot) |
bulle_id | string | Obligatoire avec une clé de sphère (l'établissement ciblé). Facultatif avec une clé de bulle. |
Réponse :
Avec des données (cas normal), la réponse est à plat :
{
"kind": "snapshot",
"snapshot_id": 42,
"bulle_id": "abc-123",
"created_at": "2026-03-10T04:00:00Z",
"website_url": "https://auto-sud-marseille.fr",
"has_ai_analysis": true,
"ranked_keywords": {},
"competitors": {},
"onpage": {},
"pagespeed": {},
"ai_analysis": {}
}Blocs de contenu conditionnels
ranked_keywords, competitors, onpage, pagespeed, ai_analysis — sont absents de la réponse quand le scan ne les a pas produits : ils ne valent pas null, ils n'y sont pas. Testez leur présence avant de les lire.Quand aucun scan n'a encore tourné pour cet établissement :
{ "kind": "snapshot", "snapshot": null, "bulle_id": "abc-123" }Avec kind=competitors :
{
"kind": "competitors",
"bulle_id": "abc-123",
"competitors": [],
"snapshot_date": "2026-03-10T04:00:00Z"
}Sans scan : competitors vaut [] et snapshot_date est absent.
Mots-clés suivis
/api/v2/seo/tracked-keywordsAuthreadListe les mots-clés suivis pour la fiche, avec leur position actuelle, la variation (delta) et le volume de recherche.
bulle_id — Obligatoire avec une clé de sphère (l'établissement ciblé). Facultatif avec une clé de bulle.
[
{
"id": 12,
"keyword": "garage marseille",
"last_position": 4,
"previous_position": 6,
"delta": 2,
"last_search_volume": 1300,
"last_url": "https://autosud.fr/",
"last_checked_at": "2026-07-05T06:00:00Z",
"created_at": "2026-05-01T09:00:00Z",
"history": [ { "checked_at": "2026-07-05T06:00:00Z", "position": 4 } ]
}
]Ajouter un mot-clé au suivi
/api/v2/seo/tracked-keywordsAuthpublishAjoute un mot-clé au suivi de positionnement de la fiche.
Body (JSON)
{ "keyword": "garage marseille centre" }bulle_id — Obligatoire avec une clé de sphère : l'établissement ciblé. Déduit automatiquement avec une clé de bulle.
Réponse :
{
"id": 34,
"keyword": "garage marseille centre",
"last_position": null,
"previous_position": null,
"delta": null,
"last_search_volume": null,
"last_url": null,
"last_checked_at": null,
"created_at": "2026-07-20T10:00:00Z",
"history": []
}Données Search Console
/api/v2/seo/search-consoleAuthreadRetourne les données Google Search Console en direct (impressions, clics, position) selon les dimensions, filtres et dates demandés.
| Paramètre | Type | Défaut |
|---|---|---|
dimensions | array | query · page · date · country · device |
days | integer | 1-365 |
start_date | string | ISO 8601 |
end_date | string | ISO 8601 |
row_limit | integer | - |
query_contains | string | - |
query_equals | string | - |
page_contains | string | - |
page_equals | string | - |
country | string | - |
device | string | - |
search_type | string | - |
bulle_id | string | Obligatoire avec une clé de sphère (l'établissement ciblé). Facultatif avec une clé de bulle. |
Réponse :
{
"bulle_id": "abc-123",
"site_url": "https://autosud.fr/",
"start_date": "2026-06-01",
"end_date": "2026-06-30",
"dimensions": ["query"],
"search_type": "web",
"row_count": 1,
"rows": [ { "keys": ["garage marseille"], "clicks": 42, "impressions": 800, "ctr": 0.0525, "position": 4.2 } ]
}Lancer un scan SEO
/api/v2/seo/scanAuthpublishLance un scan SEO complet de la fiche. Soumis à un quota mensuel (429 si dépassé). Opération coûteuse : supporte dry_run.
Body (JSON)
{ "dry_run": false }bulle_id — Obligatoire avec une clé de sphère : l'établissement ciblé. Déduit automatiquement avec une clé de bulle.
429
Réponse :
{
"ran": true,
"kind": "full",
"bulle_id": "abc-123",
"scanned_at": "2026-07-20T10:00:00Z",
"quota_used": 3,
"quota_limit": 10
}Analyser un mot-clé
/api/v2/seo/keyword-lookupAuthpublishAnalyse un mot-clé à la demande : volume de recherche, difficulté, mots-clés liés. Opération coûteuse : supporte dry_run.
Body (JSON)
{ "keyword": "vidange voiture marseille", "dry_run": false }bulle_id — Obligatoire avec une clé de sphère : l'établissement ciblé. Déduit automatiquement avec une clé de bulle.
Réponse :
{
"kind": "keyword-lookup",
"keyword": "vidange voiture marseille",
"result": {}
}Articles SEO (création & publication)
Créer des articles
/api/v2/articlesAuthpublishCrée un ou plusieurs articles pour les sites connectés (WordPress, Wix). La rédaction IA se fait en arrière-plan. Soumise à un quota. Réponse 201.
Body (JSON)
{
"title": "Comment entretenir sa voiture en été",
"target_keyword": "entretien voiture été",
"site_ids": [12, 34],
"wix_site_ids": [7],
"ai_word_count_target": 1500,
"generate_content": true,
"generate_image": false,
"tone": "professional",
"language": "fr",
"meta_title": "Entretien voiture été | Auto Sud",
"meta_description": "Nos conseils d'expert pour préparer l'été.",
"excerpt": "Préparez votre véhicule pour l'été."
}Paramètres
| Champ | Type | Requis |
|---|---|---|
title | string (min 3) | Oui |
target_keyword | string (min 2) | Oui |
site_id · site_ids | integer · integer[] | Non |
wix_site_id · wix_site_ids | integer · integer[] | Non |
ai_word_count_target | integer · 1500 | Non |
generate_content | boolean · true | Non |
generate_image | boolean · false | Non |
tone | string · professional | Non |
language | string · fr | Non |
featured_image_url · meta_title · meta_description · excerpt | string | Non |
bulle_id | string | Clé de sphère |
201 Created
Réponse :
{
"created": [ { "id": 42, "title": "Comment entretenir sa voiture en été", "site_id": 12 } ],
"skipped": [ { "wix_site_id": 7, "reason": "already_exists" } ],
"count": 1,
"generating": true
}Sans CMS (site sur mesure)
bulle_id au lieu d'un site CMS (site_ids / wix_site_ids), l'article est créé et rattaché à l'établissement, sans CMS. C'est le mode des sites sur mesure (Next.js, Astro, thème maison) : l'article est ensuite servi par GET /api/v2/articles, que votre site consomme lui-même.{
"title": "5 conseils pour entretenir sa voiture",
"target_keyword": "entretien voiture marseille",
"bulle_id": "abc-123"
}La réponse porte alors kind = api dans created[], avec site_id à null :
{
"created": [ { "id": 43, "kind": "api", "site_id": null } ],
"count": 1,
"generating": true
}Modifier un article
/api/v2/articles/{article_id}AuthpublishMet à jour partiellement un article (seuls les champs fournis sont modifiés). Renvoie 409 si l'article est déjà publié en ligne.
Body (JSON)
{
"title": "Nouveau titre",
"content_html": "<h2>...</h2>",
"excerpt": "...",
"meta_title": "...",
"meta_description": "...",
"target_keyword": "...",
"featured_image_url": "https://..."
}Mise à jour partielle
Réponse :
{ "article_id": 42, "updated_fields": ["title", "meta_description"], "status": "draft" }Publier ou programmer un article
/api/v2/articles/{article_id}/publishAuthpublishPublie un article immédiatement, ou le programme si scheduled_at (date ISO future) est fourni. Opération coûteuse : supporte dry_run.
Body (JSON)
{
"scheduled_at": "2026-07-15T09:00:00+02:00",
"dry_run": false
}Réponse :
{
"scheduled": true,
"article_id": 42,
"title": "Comment entretenir sa voiture en été",
"scheduled_at": "2026-07-15T09:00:00+02:00"
}QR codes
Lister les QR codes
/api/v2/qr-codesAuthreadRetourne les QR codes traqués de la bulle, avec le nombre de scans et le type de redirection (gate).
[
{
"id": 1,
"bulle_id": "abc-123",
"name": "Avis Auto Sud",
"target": "Page Google Reviews",
"scan_count": 342,
"last_scanned_at": "2026-07-18T15:00:00Z",
"is_active": true,
"gate_enabled": true,
"gate_threshold": 4,
"created_at": "2026-04-01T10:00:00Z"
}
]bulle_id — Restreindre à un établissement. Défaut : celui de la clé, ou tous les établissements de la marque.
Créer un QR code
/api/v2/qr-codesAuthpublishCrée un QR code traqué pointant vers une URL cible, avec une couleur et un logo optionnels.
Body (JSON)
{
"target_url": "https://g.page/r/xxxx/review",
"name": "Avis Auto Sud",
"color_hex": "#000000",
"with_logo": true
}bulle_id — Facultatif : sans lui, une clé de sphère crée un QR code au niveau de la marque (valide).
Réponse :
{
"id": 1,
"name": "Avis Auto Sud",
"target_url": "https://g.page/r/xxxx/review",
"short_url": "https://gmb.link/xxxx",
"png_url": "https://app.gmb-club.com/static/qr/xxxx.png",
"color_hex": "#000000",
"with_logo": true,
"scan_count": 0,
"created_at": "2026-07-20T10:00:00Z"
}Sites & rapports
Sites connectés
/api/v2/sitesAuthreadListe les sites connectés à la bulle. Filtrable par plateforme (wordpress, wix, shopify, prestashop).
| Paramètre | Type | Défaut |
|---|---|---|
platform | string | wordpress · wix |
bulle_id | string | Restreindre à un établissement. Défaut : celui de la clé, ou tous les établissements de la marque. |
[
{
"platform": "wordpress",
"id": 1,
"site_url": "https://autosud.fr",
"site_name": "Auto Sud",
"sphere_id": "xyz-789",
"bulle_id": "abc-123",
"is_shared": false,
"has_api_key": true,
"wp_version": "6.5",
"plugin_version": "1.4.0",
"theme_name": "GeneratePress"
},
{
"platform": "wix",
"id": 2,
"site_url": "https://autosud-aix.wixsite.com",
"site_name": "Auto Sud Aix",
"sphere_id": "xyz-789",
"bulle_id": "abc-456",
"is_shared": false,
"has_token": true
}
]Lister les rapports
/api/v2/reportsAuthreadRetourne les rapports déjà générés, avec les URLs de téléchargement PDF et CSV.
| Paramètre | Type | Défaut |
|---|---|---|
type | string | fiche · (défaut : fiche) |
limit | integer | 1-100 · 20 |
bulle_id | string | Restreindre à un établissement. Défaut : celui de la clé, ou tous les établissements de la marque. |
[
{
"fiche_name": "Auto Sud - Marseille Centre",
"report_name": "Rapport juin 2026",
"period": "2026-06",
"generated_at": "2026-07-01T08:00:00Z",
"pdf_url": "https://app.gmb-club.com/static/reports/rep-1.pdf",
"csv_url": "https://app.gmb-club.com/static/reports/rep-1.csv"
}
]Générer un rapport
/api/v2/reportsAuthpublishGénère un rapport PDF. type = fiche pour un établissement, ou combine avec au moins deux fiche_ids. Traitement asynchrone (~1 à 2 min) : réponse 202, résultat récupérable via GET /v2/reports.
Body (JSON)
{
"type": "combine",
"fiche_ids": ["gmb-fiche-123", "gmb-fiche-456"],
"date_start": "2026-06-01",
"date_end": "2026-06-30",
"report_name": "Rapport juin 2026",
"dry_run": false
}date_start et date_end requis
202 Accepted
Réponse :
{ "generated": true, "type": "combine", "report_id": "rep-1", "fiches_count": 2 }Images
Uploader une image
/api/v2/images/uploadAuthpublishEnvoie une image (image_base64 OU url, jamais les deux). Formats JPEG, PNG, WebP, GIF, 8 Mo maximum. Retourne une image_url réutilisable dans les posts et articles.
Body (JSON)
{ "url": "https://example.com/photo.jpg" }
// ou : { "image_base64": "data:image/png;base64,iVBORw0..." }Réponse :
{
"uploaded": true,
"image_url": "https://app.gmb-club.com/static/uploads/mcp/xxxx.webp",
"size_bytes": 84213,
"format": "webp"
}Générer une image par IA
/api/v2/images/generateAuthpublishGénère une image par IA à partir d'un prompt. align_with_brand (activé par défaut) applique la charte de la marque. Retourne une image_url.
Body (JSON)
{
"prompt": "Un mécanicien souriant dans un garage moderne et lumineux",
"align_with_brand": true
}bulle_id — Obligatoire avec une clé de sphère quand align_with_brand vaut true (l'établissement dont on aligne la charte).
Réponse :
{
"generated": true,
"image_url": "https://app.gmb-club.com/static/uploads/mcp/xxxx.webp",
"brand_aligned": true
}Permissions
Chaque clé API possède des permissions configurables :
readLire les posts, articles, connexions et informations
scheduleCréer et modifier des posts planifiés
publishPublier immédiatement
deleteSupprimer des posts
Rate Limiting
Chaque clé API a des limites de requêtes configurables :
| Limite | Valeur par défaut |
|---|---|
| Par minute | 60 |
| Par jour | 1000 |
Codes d'erreur
| Code | Description |
|---|---|
200 | Succès |
201 | Ressource créée |
202 | Opérations longues : réponse 202 |
400 | Requête invalide (vérifiez Content-Type et format JSON) |
401 | Clé API manquante ou invalide |
403 | Permission insuffisante |
404 | Ressource non trouvée |
409 | Conflit d'état (ex. article déjà publié) |
410 | Ressource disparue chez le fournisseur (ex. avis supprimé de Google) |
422 | Données invalides |
429 | Rate limit dépassé |
500 | Erreur serveur |
502 | Service externe en échec (Google, DataForSEO) |
503 | Service non configuré ou indisponible |
Exemples de code
import requests
API_KEY = "gmb_live_xxxx..."
BASE_URL = "https://app.gmb-club.com/api/v2"
headers = { "X-API-Key": API_KEY, "Content-Type": "application/json" }
# 1. Get key info
me = requests.get(f"{BASE_URL}/me", headers=headers).json()
print(f"Sphere: {me['sphere']['name']}")
print(f"Bubble: {me['bulle']['name']}")
# 2. Create a post
response = requests.post(f"{BASE_URL}/posts", headers=headers, json={
"content": "Post from Python!",
"platforms": ["facebook", "instagram"],
"scheduled_at": "2025-12-01T10:00:00+01:00"
})
print(response.json())
# 3. Get published articles
articles = requests.get(f"{BASE_URL}/articles", headers=headers,
params={"status": "published", "limit": 10}).json()
for article in articles['articles']:
print(f"#{article['id']}: {article['title']}")Make · n8n · Zapier
Modules Make.com & n8n
dry_run
Configuration Make.com
Utilisez le module HTTP → Make a request.
Paramètre critique
Configuration Zapier
Utilisez l'action Webhooks by Zapier → Custom Request.
Sécurité
| Mesure | Description |
|---|---|
| Clés hashées | Stockées en SHA256, jamais en clair |
| HTTPS obligatoire | Toutes les requêtes doivent utiliser HTTPS |
| Isolation par bulle | Chaque clé n'accède qu'aux données de sa bulle |
| Expiration optionnelle | Les clés peuvent avoir une date d'expiration |
| Révocation | Les clés peuvent être révoquées à tout moment |
| Rate limiting | Protection contre les abus via Redis |

/api/v2/social/publishAuthpublishPublie ou planifie un post sur une ou plusieurs plateformes.
Body (JSON)
platformstextimage_urlimage_urlsvideo_urlscheduled_atbulle_idplatforms: facebook, instagram, linkedin, pinterest, tiktok, snapchat, youtube, gmb.text: 1 à 63206 caractères.image_urlpour une image unique,image_urlspour un carrousel.scheduled_at(ISO 8601) absent = publication immédiate.Réponse :
statusvautpublishing(publication immédiate) ouscheduled(planifiée).