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.
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.
| Concept | Description | Exemple |
|---|---|---|
| Sphère | Marque / Entreprise / Franchiseur | "Auto Sud", "Boulangerie Dupont" |
| Bulle | Établissement / Point de vente | "Auto Sud Marseille", "Dupont Paris 15e" |
| Ressources | Comptes connectés à la bulle | Page Facebook, Instagram, Fiche GMB |
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
- Connectez-vous à GMB Club
- Sélectionnez votre Bulle (établissement) dans le header
- Allez dans Paramètres
- Section Clés API → Nouvelle clé
- 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_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxLes 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 -H "X-API-Key: gmb_live_xxxx..." \
-H "Content-Type: application/json" \
https://gmb-club.avismaestrogmb.com/api/v2/meJSON 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/v2Endpoints
Vérifie que l'API est opérationnelle. Ne nécessite pas d'authentification.
Réponse
{
"status": "ok",
"api_version": "2.0",
"timestamp": "2025-11-29T18:00:00.000000"
}Identité de la clé (endpoint principal)
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
{
"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
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
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
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
| Champ | Type | Requis | Description |
|---|---|---|---|
content | string | Oui | Texte du post (1-5000 caractères). Alias : text est aussi accepté. |
platforms | array | Oui | Tableau de plateformes en minuscules : facebook, instagram, gmb, linkedin, pinterest |
image_url | string | Non | URL d'une image unique |
image_urls | array | Non | Tableau JSON d'URLs pour un carrousel (2-10 images). Ex : ["url1", "url2"] |
video_url | string | Non | URL d'une vidéo |
scheduled_at | string | Non | Date/heure ISO 8601 (défaut: +1 heure) |
gmb_fiche_id | string | Non | ID de la fiche GMB (voir endpoint /me) |
publish_now | boolean | Non | Si 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
{
"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
Retourne les posts de la bulle avec pagination.
Paramètres query
| Paramètre | Type | Défaut | Description |
|---|---|---|---|
status | string | - | pending, published, error |
limit | integer | 50 | 1-100 |
offset | integer | 0 | Offset pour pagination |
Détails d'un post
Récupère les détails complets d'un post spécifique.
Modifier un post
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
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
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 :
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 :
| Limite | Valeur par défaut |
|---|---|
| Par minute | 60 requêtes |
| Par jour | 1000 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: 995Codes d'erreur
| Code | Description |
|---|---|
200 | Succès |
201 | Ressource créée avec succès |
400 | Requête invalide (paramètres manquants ou incorrects — vérifiez le Content-Type et le format JSON) |
401 | Clé API manquante ou invalide |
403 | Permission insuffisante |
404 | Ressource non trouvée |
422 | Données invalides (ex : plateforme non reconnue, format image_urls incorrect) |
429 | Rate limit dépassé |
500 | Erreur 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ètre | Valeur |
|---|---|
| Module | HTTP → Make a request |
| URL | https://gmb-club.avismaestrogmb.com/api/v2/posts |
| Method | POST |
Étape 2 : Headers
| Name | Value |
|---|---|
X-API-Key | gmb_live_votre_clé_api |
Content-Type | application/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ètre | Valeur |
|---|---|
| Method | POST |
| URL | https://gmb-club.avismaestrogmb.com/api/v2/posts |
| Data Pass-Through? | No |
| Data | Le JSON ci-dessus |
| Headers | X-API-Key|gmb_live_xxx et Content-Type|application/json |
Sécurité
| Mesure | Description |
|---|---|
| Clés hashées | Les clés sont stockées sous forme de hash SHA256, jamais en clair |
| HTTPS obligatoire | Toutes les requêtes doivent utiliser HTTPS |
| Isolation par bulle | Chaque clé n'a accès 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 |