Documentation API

Documentation API GMB Club

L'API GMB Club permet de publier et planifier des posts sur vos réseaux sociaux via des intégrations externes comme Zapier, Make, ou vos propres scripts personnalisés.

HTTPS obligatoire
JSON API
RESTful
Rate Limited

Concepts clés

L'API v2 utilise la nouvelle architecture hiérarchique de GMB Club basée sur les concepts de Sphère et Bulle.

ConceptDescriptionExemple
SphèreMarque / Entreprise / Franchiseur"Auto Sud", "Boulangerie Dupont"
BulleÉtablissement / Point de vente"Auto Sud Marseille", "Dupont Paris 15e"
RessourcesComptes connectés à la bullePage Facebook, Instagram, Fiche GMB
SPHÈRE "Auto Sud" (marque) │ ├── BULLE "Auto Sud Marseille" (établissement) │ ├── Facebook "Auto Sud Marseille" │ ├── Instagram "@autosud_marseille" │ └── Fiche GMB "Auto Sud - Marseille Centre" │ └── BULLE "Auto Sud Toulon" (établissement) └── Fiche GMB "Auto Sud - Toulon"
💡

Important

Chaque clé API est liée à une Bulle spécifique et hérite automatiquement de sa Sphère parente.

Authentification

L'API utilise des clés API pour l'authentification. Chaque clé est liée à une Bulle (établissement) spécifique.

Obtenir une clé API

  1. Connectez-vous à GMB Club
  2. Sélectionnez votre Bulle (établissement) dans le header
  3. Allez dans Paramètres
  4. Section Clés APINouvelle clé
  5. Configurez les permissions et copiez la clé
⚠️

Important

La clé complète n'est affichée qu'une seule fois lors de la création. Conservez-la dans un endroit sécurisé.

Format de la clé

gmb_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Les clés commencent par gmb_live_ suivi de 64 caractères hexadécimaux.

Utilisation

Incluez la clé dans le header X-API-Key de chaque requête :

cURL
curl -H "X-API-Key: gmb_live_xxxx..." \
     -H "Content-Type: application/json" \
  https://gmb-club.avismaestrogmb.com/api/v2/me
🚫

JSON uniquement — pas de form-data

L'API accepte exclusivement du JSON. Le header Content-Type: application/json est obligatoire pour toutes les requêtes POST/PUT. L'envoi en multipart/form-data ou x-www-form-urlencoded provoquera une erreur 400 Bad Request.

Base URL

https://gmb-club.avismaestrogmb.com/api/v2

Endpoints

GET/api/v2/health

Vérifie que l'API est opérationnelle. Ne nécessite pas d'authentification.

Réponse

200 OK
{
  "status": "ok",
  "api_version": "2.0",
  "timestamp": "2025-11-29T18:00:00.000000"
}

Identité de la clé (endpoint principal)

GET/api/v2/me
Auth requise

Retourne toutes les informations sur la clé API, la bulle associée, la sphère parente, et les ressources connectées. C'est l'endpoint à appeler en premier pour récupérer les IDs nécessaires aux autres requêtes.

Réponse

200 OK
{
  "api_version": "2.0",
  "bulle": {
    "id": "abc-123-def-456",
    "name": "Auto Sud Marseille",
    "city": "Marseille",
    "address": "123 Avenue du Prado, 13008 Marseille"
  },
  "sphere": {
    "id": "xyz-789-uvw-012",
    "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": "gmb-fiche-123-456",
      "name": "Auto Sud - Marseille Centre",
      "address": "123 Avenue du Prado, 13008 Marseille"
    }
  ]
}

Utilisez cet endpoint pour

Vérifier que votre clé API fonctionne, récupérer les IDs de votre bulle et sphère, voir les plateformes connectées, et lister les fiches GMB disponibles.

Connexions sociales

GET/api/v2/connections
Authread

Retourne les détails des réseaux sociaux connectés pour cette bulle.

Réponse

[
  { "platform": "facebook", "connected": true, "page_name": "Auto Sud Marseille", "username": null, "expires_at": "2025-12-15T10:00:00" },
  { "platform": "instagram", "connected": true, "page_name": null, "username": "autosud_marseille", "expires_at": "2025-12-15T10:00:00" }
]

Limites des plateformes

GET/api/v2/platforms/limits
🔑 Authread

Retourne les limites de caractères et médias pour chaque plateforme.

Réponse

{
  "facebook": { "max_characters": 63206, "max_images": 10, "supports_carousel": true, "supports_video": true },
  "instagram": { "max_characters": 2200, "max_hashtags": 30, "max_images": 10, "supports_carousel": true },
  "gmb": { "max_characters": 1500, "max_images": 1, "supports_carousel": false },
  "linkedin": { "max_characters": 3000, "max_images": 20, "supports_pdf": true }
}

Créer un post

POST/api/v2/posts
🔑 Authschedule

Crée un nouveau post planifié ou le publie immédiatement.

🚫

Erreurs fréquentes à éviter

Content-Type : Le body doit être envoyé en JSON brut avec Content-Type: application/json. N'utilisez pas multipart/form-data ni x-www-form-urlencoded.

Plateformes en minuscules : Utilisez "facebook", "instagram", "gmb", "linkedin", "pinterest". Les majuscules ("Facebook", "Instagram") provoqueront une erreur.

image_urls = vrai tableau JSON : Envoyez ["url1", "url2"] (tableau JSON). N'envoyez pas une chaîne avec des virgules comme "url1, url2".

Body (JSON)

{
  "content": "Découvrez nos nouveautés ! 🚗 #automobile",
  "platforms": ["facebook", "instagram", "gmb"],
  "image_url": "https://exemple.com/images/promo.jpg",
  "scheduled_at": "2025-12-01T10:00:00+01:00",
  "gmb_fiche_id": "gmb-fiche-123-456"
}

Paramètres

ChampTypeRequisDescription
contentstringOuiTexte du post (1-5000 caractères). Alias : text est aussi accepté.
platformsarrayOuiTableau de plateformes en minuscules : facebook, instagram, gmb, linkedin, pinterest
image_urlstringNonURL d'une image unique
image_urlsarrayNonTableau JSON d'URLs pour un carrousel (2-10 images). Ex : ["url1", "url2"]
video_urlstringNonURL d'une vidéo
scheduled_atstringNonDate/heure ISO 8601 (défaut: +1 heure)
gmb_fiche_idstringNonID de la fiche GMB (voir endpoint /me)
publish_nowbooleanNonSi true, publie immédiatement
💡

Alias text pour content

Le champ text est accepté comme alias de content pour simplifier les intégrations. Si les deux sont envoyés, content est prioritaire. Nous recommandons d'utiliser content dans vos nouvelles intégrations.

Réponse

201 Created
{
  "id": 42,
  "content": "Découvrez nos nouveautés ! 🚗",
  "platforms": ["facebook", "instagram", "gmb"],
  "status": "pending",
  "image_url": "https://exemple.com/images/promo.jpg",
  "scheduled_facebook": "2025-12-01T10:00:00",
  "scheduled_instagram": "2025-12-01T10:00:00",
  "scheduled_gmb": "2025-12-01T10:00:00",
  "created_at": "2025-11-29T18:00:00.000000"
}

Liste des posts

GET/api/v2/posts
Authread

Retourne les posts de la bulle avec pagination.

Paramètres query

ParamètreTypeDéfautDescription
statusstring-pending, published, error
limitinteger501-100
offsetinteger0Offset pour pagination

Détails d'un post

GET/api/v2/posts/{post_id}
Authread

Récupère les détails complets d'un post spécifique.

Modifier un post

PUT/api/v2/posts/{post_id}
Authschedule

Met à jour un post en attente. Seuls les posts avec status: pending peuvent être modifiés.

Body

{
  "content": "Nouveau texte mis à jour !",
  "scheduled_at": "2025-12-02T14:00:00+01:00"
}

Supprimer un post

DELETE/api/v2/posts/{post_id}
Authdelete

Supprime un post en attente ou en erreur. Les posts déjà publiés ne peuvent pas être supprimés.

Réponse

{ "status": "deleted", "post_id": 42 }

Publier immédiatement

POST/api/v2/posts/{post_id}/publish
Authpublish

Force la publication immédiate d'un post planifié.

Permissions

Chaque clé API possède des permissions spécifiques configurables lors de la création :

read

Lire les posts, connexions et informations

schedule

Créer et modifier des posts planifiés

publish

Publier immédiatement

delete

Supprimer des posts

🚫

Permission manquante

Si une permission est manquante, l'API retourne une erreur 403 Forbidden.

Rate Limiting

Chaque clé API a des limites de requêtes configurables :

LimiteValeur par défaut
Par minute60 requêtes
Par jour1000 requêtes

Headers de réponse

X-RateLimit-Limit-Minute: 60
X-RateLimit-Remaining-Minute: 58
X-RateLimit-Reset-Minute: 2025-11-29T18:01:00
X-RateLimit-Limit-Day: 1000
X-RateLimit-Remaining-Day: 995

Codes d'erreur

CodeDescription
200Succès
201Ressource créée avec succès
400Requête invalide (paramètres manquants ou incorrects — vérifiez le Content-Type et le format JSON)
401Clé API manquante ou invalide
403Permission insuffisante
404Ressource non trouvée
422Données invalides (ex : plateforme non reconnue, format image_urls incorrect)
429Rate limit dépassé
500Erreur serveur

Exemples de code

import requests

API_KEY = "gmb_live_xxxx..."
BASE_URL = "https://gmb-club.avismaestrogmb.com/api/v2"
headers = { "X-API-Key": API_KEY, "Content-Type": "application/json" }

# 1. Récupérer les informations de la clé
me = requests.get(f"{BASE_URL}/me", headers=headers).json()
print(f"Sphère: {me['sphere']['name']}")
print(f"Bulle: {me['bulle']['name']}")

# 2. Créer un post (⚠️ json= envoie du JSON, pas data=)
response = requests.post(f"{BASE_URL}/posts", headers=headers, json={
    "content": "Post créé depuis Python !",
    "platforms": ["facebook", "instagram"],  # minuscules !
    "scheduled_at": "2025-12-01T10:00:00+01:00"
})
print(response.json())

# 3. Post avec carrousel (image_urls = vrai tableau)
response = requests.post(f"{BASE_URL}/posts", headers=headers, json={
    "content": "Nos 3 modèles phares 🚗",
    "platforms": ["facebook", "instagram"],
    "image_urls": [
        "https://exemple.com/img1.jpg",
        "https://exemple.com/img2.jpg",
        "https://exemple.com/img3.jpg"
    ]
})

# 4. Lister les posts en attente
posts = requests.get(f"{BASE_URL}/posts", headers=headers,
    params={"status": "pending", "limit": 10}).json()
for post in posts['posts']:
    print(f"Post #{post['id']}: {post['content'][:50]}...")
const API_KEY = "gmb_live_xxxx...";
const BASE_URL = "https://gmb-club.avismaestrogmb.com/api/v2";
const headers = { "X-API-Key": API_KEY, "Content-Type": "application/json" };

// 1. Récupérer les informations
const me = await fetch(`${BASE_URL}/me`, { headers }).then(r => r.json());
console.log(`Sphère: ${me.sphere.name}`);
console.log(`Bulle: ${me.bulle.name}`);

// 2. Créer un post (⚠️ JSON.stringify obligatoire)
const response = await fetch(`${BASE_URL}/posts`, {
  method: "POST", headers,
  body: JSON.stringify({
    content: "Post créé depuis JavaScript !",
    platforms: ["facebook", "gmb"],  // minuscules !
    scheduled_at: "2025-12-01T10:00:00+01:00"
  })
});
console.log("Post créé:", await response.json());

// 3. Post carrousel (image_urls = vrai tableau JSON)
const carousel = await fetch(`${BASE_URL}/posts`, {
  method: "POST", headers,
  body: JSON.stringify({
    content: "Nos modèles ✨",
    platforms: ["facebook", "instagram"],
    image_urls: ["https://ex.com/1.jpg", "https://ex.com/2.jpg"]
  })
});
# 1. Récupérer les informations de la clé
curl -H "X-API-Key: gmb_live_xxxx..." \
  https://gmb-club.avismaestrogmb.com/api/v2/me

# 2. Créer un post simple (⚠️ Content-Type JSON obligatoire)
curl -X POST https://gmb-club.avismaestrogmb.com/api/v2/posts \
  -H "X-API-Key: gmb_live_xxxx..." \
  -H "Content-Type: application/json" \
  -d '{ "content": "Nouveau post depuis cURL !", "platforms": ["facebook", "gmb"], "scheduled_at": "2025-12-01T10:00:00+01:00" }'

# 3. Post carrousel (image_urls = tableau JSON)
curl -X POST https://gmb-club.avismaestrogmb.com/api/v2/posts \
  -H "X-API-Key: gmb_live_xxxx..." \
  -H "Content-Type: application/json" \
  -d '{ "content": "Carrousel !", "platforms": ["facebook", "instagram"], "image_urls": ["https://ex.com/1.jpg", "https://ex.com/2.jpg"] }'

# 4. Lister les posts en attente
curl -H "X-API-Key: gmb_live_xxxx..." \
  "https://gmb-club.avismaestrogmb.com/api/v2/posts?status=pending&limit=10"

Zapier / Make

Configuration Make.com (étape par étape)

Utilisez le module HTTP → Make a request (et non le module "Webhook").

Étape 1 : Module HTTP

ParamètreValeur
ModuleHTTP → Make a request
URLhttps://gmb-club.avismaestrogmb.com/api/v2/posts
MethodPOST

Étape 2 : Headers

NameValue
X-API-Keygmb_live_votre_clé_api
Content-Typeapplication/json

Étape 3 : Body

🚫

Paramètre critique dans Make

Dans le champ "Body type", sélectionnez "Raw" puis choisissez "JSON (application/json)" comme content type. Ne laissez pas sur "multipart/form-data" (valeur par défaut de Make) sinon l'API retournera une erreur 400.

{
  "content": "{{contenu_du_post}}",
  "platforms": ["facebook", "instagram"],
  "image_url": "{{url_image}}",
  "scheduled_at": "{{date_planification}}"
}
💡

Variables dynamiques Make

{{contenu_du_post}} : Texte du post (mappé depuis un module précédent)

{{url_image}} : URL de l'image (optionnel — supprimez le champ si pas d'image)

{{date_planification}} : Date au format ISO 8601 (ex : 2025-12-01T10:00:00+01:00)

Plateformes : Écrivez les noms en minuscules dans le tableau JSON. "Facebook" avec majuscule ne fonctionnera pas.

Configuration Zapier

Utilisez l'action Webhooks by Zapier → Custom Request.

ParamètreValeur
MethodPOST
URLhttps://gmb-club.avismaestrogmb.com/api/v2/posts
Data Pass-Through?No
DataLe JSON ci-dessus
HeadersX-API-Key|gmb_live_xxx et Content-Type|application/json

Sécurité

MesureDescription
Clés hashéesLes clés sont stockées sous forme de hash SHA256, jamais en clair
HTTPS obligatoireToutes les requêtes doivent utiliser HTTPS
Isolation par bulleChaque clé n'a accès qu'aux données de sa bulle
Expiration optionnelleLes clés peuvent avoir une date d'expiration
RévocationLes clés peuvent être révoquées à tout moment
Rate limitingProtection contre les abus via Redis
🇫🇷FR
🇫🇷Français
🇬🇧English
🇩🇪Deutsch
🇪🇸Español
🇮🇹Italiano