GMB Club

Desarrolladores

Documentacion API

La API de GMB Club permite publicar y programar posts via Zapier, Make o tus propios scripts. Tambien permite recuperar articulos generados.

HTTPSJSON APIRESTfulRate Limited

Conceptos clave

La API v2 usa la arquitectura Esfera/Burbuja de GMB Club.

ConceptDescriptionEjemplo
EsferaMarca / Empresa"Auto Sud"
BurbujaEstablecimiento / Punto de venta"Auto Sud Marseille"
RecursosCuentas conectadasFacebook, Instagram, GMB
💡

Important

Una clave API cubre o bien un solo establecimiento (clave de burbuja), o bien todos los establecimientos de la marca (clave de esfera). Una clave de burbuja solo ve los datos de su establecimiento; una clave de esfera ve los de todos. Llame primero a GET /api/v2/me: el campo «burbuja» está rellenado para una clave de burbuja y vale null para una clave de esfera.

Autenticacion

La API utiliza claves API para la autenticación. Una clave puede tener dos alcances: cubre o bien un solo establecimiento (clave de burbuja), o bien todos los establecimientos de la marca (clave de esfera). Una clave de burbuja solo ve los datos de su establecimiento; una clave de esfera ve los de todos los establecimientos, la opción ideal para un sitio multiestablecimiento: una sola clave, una sola integración. Llame a GET /api/v2/me en primer lugar para saber de qué alcance dispone: el campo «burbuja» está rellenado para una clave de burbuja y vale null para una clave de esfera.

⚠️

Alcance de la clave: burbuja o esfera

Una única regla de alcance, válida para toda la API:

  1. Una clave cubre un establecimiento (clave de burbuja) o toda la marca (clave de esfera). Define lo que está autorizado, nunca lo que se apunta.
  2. Toda ruta que actúa sobre un objetivo acepta un parámetro de objetivo: bulle_id para un establecimiento, fiche_id para una ficha de Google. Siempre en el mismo lugar: parámetro de URL en lectura, campo del cuerpo en escritura.
  3. Sin parámetro: una clave de burbuja apunta a su establecimiento; una clave de esfera recibe un 400 que nombra el parámetro que falta. Nunca una elección arbitraria.
  4. Las rutas de lista sin parámetro devuelven el conjunto de la marca, y cada elemento lleva su bulle_id.
  5. Un objetivo fuera del alcance de la clave devuelve 403; un objetivo inexistente, 404.

Respuestas posibles (mensajes del backend, en francés):

CodeRespuesta (detail)
403Cet établissement n'appartient pas à votre périmètre.
403Cette fiche GMB n'appartient pas à votre périmètre.
404Établissement introuvable : <identifiant>
404Aucune fiche GMB associée à cette clé API.
400Cette clé API couvre plusieurs établissements. Précisez `bulle_id` (liste : GET /api/v2/bulles).
400Cette clé API couvre plusieurs fiches Google. Précisez `fiche_id` (liste : GET /api/v2/me).

Obtener una clave API

  1. Inicia sesion en GMB Club
  2. Seleccione su burbuja en el encabezado
  3. Ajustes → Claves API → Nueva clave
  4. Elija el alcance: «Este establecimiento» o «Toda la marca»
  5. Configura permisos y copia la clave

Una clave «Toda la marca» cubre todos los establecimientos, incluidos los creados más adelante: es la opción correcta para un sitio único que da servicio a varios establecimientos — un solo secreto que gestionar, sin ninguna intervención prevista al abrir un nuevo establecimiento.

⚠️

Important

La clave solo se muestra una vez.

Formato

text
gmb_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Uso

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

Solo JSON

Content-Type: application/json obligatorio para POST/PUT.

Base URL

text
https://app.gmb-club.com/api/v2

Endpoints

GET/api/v2/health

Verifica que la API funciona. Sin autenticacion.

JSON
{
  "status": "ok",
  "api_version": "2.0",
  "timestamp": "2026-07-27T18:00:00.000000Z"
}

Identidad de la clave

GET/api/v2/meAuthread

Devuelve info sobre la clave, burbuja, esfera y recursos.

JSON
{
  "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
  }]
}
💡

Clave de esfera

Con una clave de esfera, el campo bulle vale null y el array gmb_fiches lista todas las fichas de la marca.

Conexiones sociales

GET/api/v2/connectionsAuthread

Detalles de redes sociales conectadas.

JSON
[
  { "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 }
]
ParametroTypeDefecto
bulle_idstringRestringir a un establecimiento. Por defecto: el de la clave, o todos los establecimientos de la marca.

Con una clave de esfera, bulle_id indica a qué establecimiento pertenece cada página de Facebook o cuenta de Instagram.

Limites de plataforma

GET/api/v2/platforms/limitsAuthread

Limites de caracteres y medios por plataforma.

JSON
{
  "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?>" }
  }
}
⚠️

Shape, not frozen values

character_limits contiene una entrada por plataforma (9 en total); image_limits y video_limits cubren instagram, facebook, linkedin, pinterest, gmb. Los valores se derivan del código y evolucionan: llame al endpoint para obtener las cifras actualizadas, no las fije en su integración.

Crear un post

POST/api/v2/postsAuthschedule

Crea un post programado o publica inmediatamente.

🚫

Errores comunes

Content-Type: application/json. Plataformas en minusculas. image_urls = array JSON real.
⚠️

Clave de esfera: bulle_id obligatorio

Con una clave de esfera, bulle_id es ahora obligatorio en POST /posts. Antes la llamada tenía éxito eligiendo un establecimiento por defecto, lo que podía publicar en la ficha de Google equivocada. Las integraciones existentes que utilizan una clave de esfera deben añadir este campo.

Body (JSON)

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"
}

Parametros

CampoTypeRequeridoDescription
contentstringSiTexto del post (1-5000 car.)
platformsarraySiArray: facebook, instagram, gmb, linkedin, pinterest, tiktok, snapchat, youtube. La plataforma debe estar conectada en el establecimiento; de lo contrario, HTTP 400 « Plateforme non connectée ».
image_urlstringNoURL de imagen unica
image_urlsarrayNoArray JSON de URLs para carrusel (2-10)
video_urlstringNoURL de video
scheduled_atstringNoISO 8601 (defecto: +1h)
gmb_fiche_idstringNoID de ficha GMB
publish_nowbooleanNoSi true, publica inmediatamente
bulle_idstringClave de esferaObligatorio con una clave de esfera: el establecimiento apuntado. Deducido automáticamente con una clave de burbuja.
💡

content or text

Provide at least content (or its alias text). Per-platform scheduling is available via scheduled_instagram, scheduled_facebook, scheduled_gmb, etc., and per-platform content via content_per_platform.

Response:

JSON
{
  "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": []
}

Listar posts

GET/api/v2/postsAuthread

Posts con paginacion.

ParametroTypeDefectoDescription
statusstring-pending, published, error
limitinteger501-100
offsetinteger0Offset de paginacion
bulle_idstring-Restringir a un establecimiento. Por defecto: el de la clave, o todos los establecimientos de la marca.
⚠️

Bare array

This endpoint returns a JSON array directly, with no wrapper object — unlike GET /articles which returns an object { articles, total, ... }.
JSON
[
  {
    "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": []
  }
]
💡

Respuesta completa, campo por campo

Tres precisiones. Hay un trío scheduled_ / published_ / error_ por plataforma: la fecha prevista, la fecha de publicación efectiva y el mensaje de error eventual. Una plataforma no afectada por esta publicación tiene sus tres campos en null. platform_refs contiene las referencias de las publicaciones en cada plataforma una vez publicadas; warnings, las advertencias no bloqueantes.
GET/api/v2/posts/{post_id}Authread

Recupera un post por su identificador. Devuelve el mismo objeto que un elemento de GET /api/v2/posts.

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

Actualiza un post pendiente.

💡

Partial update

Partial update of a pending post (content, scheduled_at). Only the fields you send are updated.

Body (JSON)

JSON
{
  "content": "Updated text!",
  "scheduled_at": "2025-12-02T14:00:00+01:00"
}
DEL/api/v2/posts/{post_id}Authdelete

Elimina un post pendiente o con error.

POST/api/v2/posts/{post_id}/publishAuthpublish

Fuerza publicacion inmediata.

Publicación social simplificada

Tres endpoints pensados para las integraciones Make, n8n y Zapier: publicar, verificar la cuota, seguir el estado. Todos exigen una clave de burbuja (véase «Alcance de la clave»).

POST/api/v2/social/publishAuthpublish

Publica o programa un post en una o varias plataformas.

Body (JSON)

CampoTypeRequerido
platformsarraySi
textstringSi
image_urlstringNo
image_urlsarrayNo
video_urlstringNo
scheduled_atstringNo
bulle_idstringClave de esfera

platforms: facebook, instagram, linkedin, pinterest, tiktok, snapchat, youtube, gmb. text: 1 a 63206 caracteres. image_url para una imagen única, image_urls para un carrusel. scheduled_at (ISO 8601) ausente = publicación inmediata.

Response:

JSON
{
  "post_id": "post-abc-123",
  "status": "scheduled",
  "scheduled_at": "2026-08-01T09:00:00+02:00",
  "platforms": ["facebook", "instagram"],
  "quota": {}
}

status vale publishing (publicación inmediata) o scheduled (programada).

GET/api/v2/social/quotaAuthread

Estado de la cuota mensual de publicación del establecimiento. Conviene llamarlo antes de una publicación para evitar un rechazo.

JSON
{ "bulle_id": "abc-123" }

La respuesta se completa con los contadores de cuota mensual del establecimiento.

bulle_idObligatorio con una clave de esfera (el establecimiento apuntado). Facultativo con una clave de burbuja.

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

Estado detallado de un post. Los objetos scheduled, published y errors llevan una entrada por plataforma, a null si la plataforma no está afectada.

JSON
{
  "post_id": "post-abc-123",
  "status": "scheduled",
  "platforms": ["facebook", "instagram"],
  "content": "Nos nouveautés sont arrivées !",
  "scheduled": { "instagram": "2026-08-01T09:00:00+02:00", "facebook": "2026-08-01T09:00:00+02:00", "linkedin": null, "pinterest": null, "tiktok": null, "snapchat": null, "youtube": null, "gmb": null },
  "published": { "instagram": null, "facebook": null, "linkedin": null, "pinterest": null, "tiktok": null, "snapchat": null, "youtube": null, "gmb": null },
  "errors": { "instagram": null, "facebook": null, "linkedin": null, "pinterest": null, "tiktok": null, "snapchat": null, "youtube": null, "gmb": null }
}

Listar articulos

GET/api/v2/articlesAuthread

Articulos generados para esta burbuja.

💡

Sitio sin tu sitio ni Wix

Llama este endpoint periodicamente para recuperar articulos.
JSON
{
  "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
}
💡

Sitio multiestablecimiento

Cada artículo indica el establecimiento para el que fue redactado. Con una clave de esfera, una sola llamada devuelve los artículos de todos los establecimientos, y bulle_id indica en qué página publicar cada uno. bulle_id vale null si el artículo solo está vinculado a la marca, sin establecimiento. La correspondencia completa de los establecimientos se obtiene mediante GET /api/v2/bulles.

Parametros

ParametroTypeDefecto
statusstringpublished · draft · all
updated_sincestringISO 8601 — artículos modificados desde esta fecha (filtro sobre updated_at, orden del más antiguo al más reciente).
bulle_idstringRestringir a un establecimiento. Por defecto: el de la clave, o todos los establecimientos de la marca.
💡

Mantenerse sincronizado

Detectar una corrección. since filtra sobre la fecha de publicación: un artículo publicado hace un mes y corregido esta mañana no aparece en ella. Para recuperar las correcciones, utilice updated_since, que filtra sobre updated_at. Los resultados se ordenan entonces del más antiguo al más reciente, lo que permite reanudar una sincronización allí donde se detuvo conservando el último valor recibido.

Construya sus URLs con slug, nunca con el título. El slug se fija en la primera publicación y nunca se recalcula, aunque el título se corrija después. Derivar la URL del título expondría sus páginas a un cambio de dirección tras la indexación.

Detectar una retirada. Un artículo despublicado ya no aparece en status=published. Con status=all, vuelve a aparecer con su estado real («draft»), una señal explícita. Un artículo eliminado, en cambio, desaparece por completo: trate la lista recibida como la fuente de verdad — lo que ya no está en ella ya no está en línea.

GET/api/v2/articles/{article_id}Authread

Contenido completo de un articulo por ID.

JSON
{
  "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

POST/api/v2/articles/{article_id}/confirmAuthread

Pingback enviado por tu script después de renderizar un artículo obtenido. Tiene dos efectos: 1. permite a GMB Club saber qué artículos están realmente en línea en tu sitio, y no solo expuestos por la API; 2. al enviar `rendered_url`, alimenta el enlazado interno de tus artículos, el efecto más útil en el día a día. Opcional pero recomendado.

💡

Quand l'appeler

Después de inyectar el HTML del artículo en el DOM de tu página. El endpoint es idempotente: volver a llamarlo solo actualiza la marca de tiempo de confirmación, gana el último ping. Puedes por tanto volver a llamarlo para comprobar que un artículo sigue renderizado al cabo de varios días.

Cuerpo JSON opcional. El campo `rendered_url` (string, máx. 2048 caracteres, debe empezar por http:// o https://) es la URL pública de la página en la que tu script acaba de renderizar el artículo. Es la única dirección de tu sitio que GMB Club conoce: permite que tus próximos artículos citen los anteriores con un enlace que apunta al lugar correcto. Sin ella no es posible ningún enlazado interno en tu sitio — nunca adivinamos una URL, y un enlace inventado sería un enlace roto. Técnicamente opcional, pero muy recomendable.

JavaScript
// 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

Les endpoints articles acceptent les requêtes cross-origin depuis n'importe quel domaine (Access-Control-Allow-Origin: *). Tu peux donc appeler le pingback directement depuis le <script> de ta page, ou côté serveur lors d'un build statique ou d'un rendu SSR, comme tu préfères.
PHP
$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);
Node.js
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}` }),
});
Python
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
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/confirm

Réponse 200 lors d'une confirmation réussie :

JSON
{
  "article_id": 42,
  "confirmed_at": "2026-05-25T14:30:00Z",
  "confirmation_source": "pingback"
}

Enlazado interno de tus artículos

Cuando confirmas la dirección de tus artículos publicados, GMB Club puede relacionarlos entre sí: un artículo nuevo citará con naturalidad los anteriores, sobre una expresión de su texto, con un enlace a la página correcta de tu sitio. El ámbito es el establecimiento, no la marca: los artículos de una burbuja solo se enlazan entre ellos, y una enseña con varios establecimientos nunca verá que un artículo de una ciudad remita a otra ciudad. Solo son candidatos los artículos publicados y cuya dirección ha sido confirmada; un artículo sin dirección confirmada simplemente se ignora. El beneficio se construye con el tiempo: con dos o tres artículos en línea no hay casi nada que enlazar, el interés llega con el volumen.

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

Toute opération coûteuse (réponse à un avis, publication, scan SEO, rapport, envoi de demandes d'avis, audit ou application de fiche) accepte "dry_run": true dans le corps. L'API renvoie alors un aperçu (champs would_*, quota courant) sans rien exécuter ni consommer de quota. Recommandé dans vos scénarios Make ou n8n pour valider un appel avant de le lancer pour de vrai.
💡

Fiche par défaut : fiche_id optionnel

Sur les endpoints liés à une fiche Google (metrics, reviews, optimizer, acquisition, visibility), le paramètre fiche_id est facultatif : s'il est omis, l'API utilise la fiche rattachée à votre clé API.
💡

Opérations longues : réponse 202

Les traitements longs (génération de rapports, envoi de demandes d'avis, génération d'articles) renvoient un code 202 avec un identifiant. Le résultat se récupère ensuite via les endpoints de lecture correspondants (par exemple GET /v2/reports pour un rapport, ou GET /v2/articles pour un article).

Espace de travail

Sphère de la clé

GET/api/v2/spheresAuthread

Retourne la sphère (marque) rattachée à la clé API : nom, slug, ton et langue par défaut.

JSON
[
  {
    "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

GET/api/v2/bullesAuthread

Liste les bulles (établissements) de la sphère, avec leur ville et le nombre de fiches Google rattachées.

JSON
[
  { "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

GET/api/v2/bulles/{bulle_id}Authread

Retourne 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.

JSON
{
  "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

GET/api/v2/reviewsAuthread

Retourne les avis Google de la fiche, paginés et filtrables (note, statut de réponse, mot-clé, dates), triables par date ou note.

Parametros

ParametroTypeDefecto
min_starsinteger1-5 · 1
max_starsinteger1-5 · 5
statusstringresponded · drafts · unresponded
keywordstring-
date_fromstringISO 8601
date_tostringISO 8601
sort_bystringdate_desc
fiche_idstringFiche par défaut : fiche_id optionnel
limitinteger1-100 · 25
pageinteger1
JSON
{
  "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

GET/api/v2/reviews/summaryAuthread

Retourne la note moyenne, le total d'avis et leur répartition par statut (répondus, brouillons, sans réponse).

JSON
{
  "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 }
}

Répondre à un avis

POST/api/v2/reviews/{review_id}/replyAuthpublish

Publie une réponse à un avis directement sur Google. Opération coûteuse : supporte dry_run.

Body (JSON)

JSON
{
  "text": "Merci beaucoup pour votre retour, à très bientôt !",
  "dry_run": false
}
⚠️

410 Gone

Si l'avis a disparu de Google entre-temps, l'API renvoie 410.

Response:

JSON
{
  "posted": true,
  "review_id": "rev-abc",
  "rating": 5,
  "customer_name": "Julie A.",
  "fiche_name": "Auto Sud - Marseille Centre"
}

Acquisition d'avis

Statistiques d'acquisition

GET/api/v2/acquisition/statsAuthread

Retourne les statistiques des demandes d'avis sur 30 jours : nombre envoyé, par canal (SMS, email) et par statut.

JSON
{
  "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

POST/api/v2/acquisition/review-requestsAuthpublish

Envoie 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)

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[]

Chaque contact porte au minimum un nom (customer_name) et un canal (channel) : « sms » nécessite customer_phone, « email » nécessite customer_email. Champ optionnel : custom_message. Les quotas SMS et email sont mensuels et par bulle.

Response:

JSON
{
  "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

GET/api/v2/gmb/metricsAuthread

Retourne les KPIs de la fiche Google sur une période : vues, recherches, appels, clics vers le site, demandes d'itinéraire.

ParametroTypeDefecto
period_daysinteger1-90 · 30
fiche_idstringFiche par défaut : fiche_id optionnel
JSON
{
  "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

GET/api/v2/gmb/optimizerAuthread

Retourne le dernier score d'optimisation de la fiche (0 à 100), en cache. Lecture rapide, sans nouvel audit.

JSON
{
  "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

POST/api/v2/gmb/optimizer/auditAuthpublish

Lance 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.

JSON
{
  "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

POST/api/v2/gmb/optimizer/applyAuthpublish

Applique une liste de modifications {field, value} sur la fiche Google (écriture réelle chez Google). Opération coûteuse : supporte dry_run.

Body (JSON)

JSON
{
  "changes": [
    { "field": "description", "value": "Garage automobile à Marseille..." }
  ],
  "dry_run": true
}

Response (dry_run):

JSON
{
  "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

GET/api/v2/visibility/scanAuthread

Retourne le dernier scan de visibilité de la fiche dans le Local Pack Google : score et position moyenne autour du point de vente.

JSON
{
  "fiche_id": "gmb-fiche-123",
  "snapshot_id": "snap-789",
  "visibility_score": 74,
  "scanned_at": "2026-07-04T10:00:00Z"
}

Si no hay ningún escaneo disponible, la respuesta adopta la forma siguiente, y no la forma plana con visibility_score:

JSON
{ "fiche_id": "gmb-fiche-123", "snapshot": null }

SEO & mots-clés

Données SEO

GET/api/v2/seo/dataAuthread

Retourne 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).

ParametroTypeDefecto
kindstringsnapshot · competitors · (défaut : snapshot)
bulle_idstringObligatorio con una clave de esfera (el establecimiento apuntado). Facultativo con una clave de burbuja.

Response:

Con datos (caso normal), la respuesta es plana:

JSON
{
  "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": {}
}
⚠️

Bloques de contenido condicionales

Los cinco bloques de contenido — ranked_keywords, competitors, onpage, pagespeed, ai_analysis — están ausentes de la respuesta cuando el escaneo no los produjo: no valen null, no están presentes. Compruebe su presencia antes de leerlos.

Cuando aún no se ha ejecutado ningún escaneo para este establecimiento:

JSON
{ "kind": "snapshot", "snapshot": null, "bulle_id": "abc-123" }

Con kind=competitors:

JSON
{
  "kind": "competitors",
  "bulle_id": "abc-123",
  "competitors": [],
  "snapshot_date": "2026-03-10T04:00:00Z"
}

Sin escaneo: competitors vale [] y snapshot_date está ausente.

Mots-clés suivis

GET/api/v2/seo/tracked-keywordsAuthread

Liste les mots-clés suivis pour la fiche, avec leur position actuelle, la variation (delta) et le volume de recherche.

bulle_idObligatorio con una clave de esfera (el establecimiento apuntado). Facultativo con una clave de burbuja.

JSON
[
  {
    "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

POST/api/v2/seo/tracked-keywordsAuthpublish

Ajoute un mot-clé au suivi de positionnement de la fiche.

Body (JSON)

JSON
{ "keyword": "garage marseille centre" }

bulle_idObligatorio con una clave de esfera: el establecimiento apuntado. Deducido automáticamente con una clave de burbuja.

Response:

JSON
{
  "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

GET/api/v2/seo/search-consoleAuthread

Retourne les données Google Search Console en direct (impressions, clics, position) selon les dimensions, filtres et dates demandés.

ParametroTypeDefecto
dimensionsarrayquery · page · date · country · device
daysinteger1-365
start_datestringISO 8601
end_datestringISO 8601
row_limitinteger-
query_containsstring-
query_equalsstring-
page_containsstring-
page_equalsstring-
countrystring-
devicestring-
search_typestring-
bulle_idstringObligatorio con una clave de esfera (el establecimiento apuntado). Facultativo con una clave de burbuja.

Response:

JSON
{
  "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

POST/api/v2/seo/scanAuthpublish

Lance un scan SEO complet de la fiche. Soumis à un quota mensuel (429 si dépassé). Opération coûteuse : supporte dry_run.

Body (JSON)

JSON
{ "dry_run": false }

bulle_idObligatorio con una clave de esfera: el establecimiento apuntado. Deducido automáticamente con una clave de burbuja.

⚠️

429

Rate limit excedido

Response:

JSON
{
  "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é

POST/api/v2/seo/keyword-lookupAuthpublish

Analyse un mot-clé à la demande : volume de recherche, difficulté, mots-clés liés. Opération coûteuse : supporte dry_run.

Body (JSON)

JSON
{ "keyword": "vidange voiture marseille", "dry_run": false }

bulle_idObligatorio con una clave de esfera: el establecimiento apuntado. Deducido automáticamente con una clave de burbuja.

Response:

JSON
{
  "kind": "keyword-lookup",
  "keyword": "vidange voiture marseille",
  "result": {}
}

Articles SEO (création & publication)

Créer des articles

POST/api/v2/articlesAuthpublish

Cré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)

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é."
}

Parametros

CampoTypeRequerido
titlestring (min 3)Si
target_keywordstring (min 2)Si
site_id · site_idsinteger · integer[]No
wix_site_id · wix_site_idsinteger · integer[]No
ai_word_count_targetinteger · 1500No
generate_contentboolean · trueNo
generate_imageboolean · falseNo
tonestring · professionalNo
languagestring · frNo
featured_image_url · meta_title · meta_description · excerptstringNo
bulle_idstringClave de esfera
💡

201 Created

La génération est asynchrone : l'article est d'abord créé puis rédigé en arrière-plan. Récupérez son contenu final via GET /v2/articles/{id}.

Response:

JSON
{
  "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
}
💡

Sin CMS (sitio a medida)

Al proporcionar bulle_id en lugar de un sitio CMS (site_ids / wix_site_ids), el artículo se crea y se vincula al establecimiento, sin CMS. Es el modo de los sitios a medida (Next.js, Astro, tema propio): el artículo se sirve luego mediante GET /api/v2/articles, que su sitio consume por sí mismo.
JSON
{
  "title": "5 conseils pour entretenir sa voiture",
  "target_keyword": "entretien voiture marseille",
  "bulle_id": "abc-123"
}

La respuesta lleva entonces kind = api en created[], con site_id en null:

JSON
{
  "created": [ { "id": 43, "kind": "api", "site_id": null } ],
  "count": 1,
  "generating": true
}

Modifier un article

PUT/api/v2/articles/{article_id}Authpublish

Met à jour partiellement un article (seuls les champs fournis sont modifiés). Renvoie 409 si l'article est déjà publié en ligne.

Body (JSON)

JSON
{
  "title": "Nouveau titre",
  "content_html": "<h2>...</h2>",
  "excerpt": "...",
  "meta_title": "...",
  "meta_description": "...",
  "target_keyword": "...",
  "featured_image_url": "https://..."
}
💡

Partial update

All fields are optional: only the fields you send are updated, the rest stay unchanged.

Response:

JSON
{ "article_id": 42, "updated_fields": ["title", "meta_description"], "status": "draft" }

Publier ou programmer un article

POST/api/v2/articles/{article_id}/publishAuthpublish

Publie un article immédiatement, ou le programme si scheduled_at (date ISO future) est fourni. Opération coûteuse : supporte dry_run.

Body (JSON)

JSON
{
  "scheduled_at": "2026-07-15T09:00:00+02:00",
  "dry_run": false
}

Response:

JSON
{
  "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

GET/api/v2/qr-codesAuthread

Retourne les QR codes traqués de la bulle, avec le nombre de scans et le type de redirection (gate).

JSON
[
  {
    "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_idRestringir a un establecimiento. Por defecto: el de la clave, o todos los establecimientos de la marca.

Créer un QR code

POST/api/v2/qr-codesAuthpublish

Crée un QR code traqué pointant vers une URL cible, avec une couleur et un logo optionnels.

Body (JSON)

JSON
{
  "target_url": "https://g.page/r/xxxx/review",
  "name": "Avis Auto Sud",
  "color_hex": "#000000",
  "with_logo": true
}

bulle_idFacultativo: sin él, una clave de esfera crea un código QR a nivel de la marca (válido).

Response:

JSON
{
  "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

GET/api/v2/sitesAuthread

Liste les sites connectés à la bulle. Filtrable par plateforme (wordpress, wix, shopify, prestashop).

ParametroTypeDefecto
platformstringwordpress · wix
bulle_idstringRestringir a un establecimiento. Por defecto: el de la clave, o todos los establecimientos de la marca.
JSON
[
  {
    "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

GET/api/v2/reportsAuthread

Retourne les rapports déjà générés, avec les URLs de téléchargement PDF et CSV.

ParametroTypeDefecto
typestringfiche · (défaut : fiche)
limitinteger1-100 · 20
bulle_idstringRestringir a un establecimiento. Por defecto: el de la clave, o todos los establecimientos de la marca.
JSON
[
  {
    "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

POST/api/v2/reportsAuthpublish

Gé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)

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 and date_end required

The date_start and date_end fields (ISO format, YYYY-MM-DD) are required in the request body.
💡

202 Accepted

Les traitements longs (génération de rapports, envoi de demandes d'avis, génération d'articles) renvoient un code 202 avec un identifiant. Le résultat se récupère ensuite via les endpoints de lecture correspondants (par exemple GET /v2/reports pour un rapport, ou GET /v2/articles pour un article).

Response:

JSON
{ "generated": true, "type": "combine", "report_id": "rep-1", "fiches_count": 2 }

Images

Uploader une image

POST/api/v2/images/uploadAuthpublish

Envoie 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)

JSON
{ "url": "https://example.com/photo.jpg" }
// ou : { "image_base64": "data:image/png;base64,iVBORw0..." }

Response:

JSON
{
  "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

POST/api/v2/images/generateAuthpublish

Gé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)

JSON
{
  "prompt": "Un mécanicien souriant dans un garage moderne et lumineux",
  "align_with_brand": true
}

bulle_idObligatorio con una clave de esfera cuando align_with_brand vale true (el establecimiento cuya identidad se alinea).

Response:

JSON
{
  "generated": true,
  "image_url": "https://app.gmb-club.com/static/uploads/mcp/xxxx.webp",
  "brand_aligned": true
}

Permisos

Permisos configurables:

read

Leer posts, articulos, conexiones

schedule

Crear y modificar posts programados

publish

Publicar inmediatamente

delete

Eliminar posts

Rate Limiting

Limites de solicitudes configurables:

LimiteValor por defecto
Por minuto60
Por dia1000

Codigos de error

CodeDescription
200Exito
201Recurso creado
202Opérations longues : réponse 202
400Solicitud invalida
401Clave API invalida
403Permiso insuficiente
404No encontrado
409Conflit d'état (ex. article déjà publié)
410Ressource disparue chez le fournisseur (ex. avis supprimé de Google)
422Datos invalidos
429Rate limit excedido
500Error del servidor
502Service externe en échec (Google, DataForSEO)
503Service non configuré ou indisponible

Ejemplos de codigo

Python
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

Les modules officiels Make.com et n8n (n8n-nodes-gmb-club) couvrent les opérations principales prêtes à l'emploi. Pour les endpoints non encore exposés par un module, appelez l'API directement : module « Make an API Call » sur Make, ou node « HTTP Request » avec le credential GMB Club sur n8n.
💡

dry_run

Astuce : dans vos scénarios Make ou n8n, activez dry_run: true sur les opérations coûteuses pour valider l'appel avant de l'exécuter pour de vrai.

Make.com

Usa el modulo HTTP > Make a request.

🚫

Parametro critico

Body type: Raw > JSON. No dejar en multipart/form-data.

Zapier

Usa Webhooks by Zapier > Custom Request.

Seguridad

MedidaDescription
Claves hasheadasSHA256, nunca en texto plano
HTTPS obligatorioTodas las solicitudes via HTTPS
Aislamiento por burbujaCada clave accede solo a su burbuja
Expiracion opcionalLas claves pueden expirar
RevocacionRevocable en cualquier momento
Rate limitingProteccion via Redis