GMB Club

Entwickler

Dokumentation API

Die GMB Club API ermöglicht es, Posts über Zapier, Make oder eigene Skripte zu veröffentlichen und zu planen.

HTTPSJSON APIRESTfulRate Limited

Kernkonzepte

Die v2 API nutzt die hierarchische Sphäre/Blase-Architektur.

ConceptDescriptionBeispiel
SphäreMarke / Unternehmen"Auto Sud"
BlaseStandort / Verkaufsstelle"Auto Sud Marseille"
RessourcenVerbundene KontenFacebook, Instagram, GMB
💡

Important

Ein API-Schlüssel deckt entweder einen einzelnen Standort ab (Blase-Schlüssel) oder alle Standorte der Marke (Sphäre-Schlüssel). Ein Blase-Schlüssel sieht nur die Daten seines Standorts; ein Sphäre-Schlüssel sieht die aller Standorte. Rufen Sie zuerst GET /api/v2/me auf: Das Feld „bulle“ ist bei einem Blase-Schlüssel gefüllt und ist null bei einem Sphäre-Schlüssel.

Authentifizierung

Die API verwendet API-Schlüssel zur Authentifizierung. Ein Schlüssel kann zwei Reichweiten haben: Er deckt entweder einen einzelnen Standort ab (Blase-Schlüssel) oder alle Standorte der Marke (Sphäre-Schlüssel). Ein Blase-Schlüssel sieht nur die Daten seines Standorts; ein Sphäre-Schlüssel sieht die aller Standorte — die ideale Option für eine Website mit mehreren Standorten: ein einziger Schlüssel, eine einzige Integration. Rufen Sie zuerst GET /api/v2/me auf, um zu erfahren, über welche Reichweite Sie verfügen: Das Feld „bulle“ ist bei einem Blase-Schlüssel gefüllt und ist null bei einem Sphäre-Schlüssel.

⚠️

Reichweite des Schlüssels: Blase oder Sphäre

Eine einzige Geltungsbereichsregel, gültig für die gesamte API:

  1. Ein Schlüssel deckt einen Standort ab (Blase-Schlüssel) oder die gesamte Marke (Sphäre-Schlüssel). Er legt fest, was erlaubt ist, niemals, was angesteuert wird.
  2. Jede Route, die auf ein Ziel wirkt, akzeptiert einen Zielparameter: bulle_id für einen Standort, fiche_id für eine Google-Fiche. Immer an derselben Stelle: URL-Parameter beim Lesen, Feld im Body beim Schreiben.
  3. Ohne Parameter: Ein Blase-Schlüssel steuert seinen Standort an; ein Sphäre-Schlüssel erhält einen 400, der den fehlenden Parameter benennt. Niemals eine willkürliche Auswahl.
  4. Listen-Routen ohne Parameter geben die gesamte Marke zurück, und jedes Element trägt seine bulle_id.
  5. Ein Ziel außerhalb des Geltungsbereichs des Schlüssels gibt 403 zurück; ein nicht existierendes Ziel 404.

Mögliche Antworten (Meldungen des Backends, auf Französisch):

CodeAntwort (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).

API-Schlüssel erhalten

  1. Bei GMB Club anmelden
  2. Wählen Sie Ihre Blase in der Kopfzeile aus
  3. Einstellungen → API-Schlüssel → Neuer Schlüssel
  4. Wählen Sie den Geltungsbereich: „Dieser Standort“ oder „Gesamte Marke“
  5. Berechtigungen konfigurieren

Ein Schlüssel für die „Gesamte Marke“ deckt alle Standorte ab, einschließlich der später angelegten: Das ist die richtige Wahl für eine einzelne Website, die mehrere Standorte bedient – nur ein einziges Geheimnis zu verwalten, kein Eingriff beim Eröffnen eines neuen Standorts nötig.

⚠️

Important

Schlüssel wird nur einmal angezeigt.

Format

text
gmb_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Verwendung

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

Nur JSON

Content-Type: application/json ist für POST/PUT erforderlich.

Base URL

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

Endpoints

GET/api/v2/health

Prüft die API-Verfügbarkeit. Keine Auth nötig.

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

Schlüssel-Identitat

GET/api/v2/meAuthread

Gibt Infos über Schlüssel, Blase, Sphäre und Ressourcen zurück.

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
  }]
}
💡

Sphäre-Schlüssel

Mit einem Sphäre-Schlüssel ist das Feld bulle null und das Array gmb_fiches listet alle Einträge der Marke auf.

Soziale Verbindungen

GET/api/v2/connectionsAuthread

Details der verbundenen Netzwerke.

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 }
]
ParameterTypeStandard
bulle_idstringAuf einen Standort einschränken. Standard: der des Schlüssels oder alle Standorte der Marke.

Mit einem Sphäre-Schlüssel gibt bulle_id an, zu welchem Standort jede Facebook-Seite oder jedes Instagram-Konto gehört.

Plattform-Limits

GET/api/v2/platforms/limitsAuthread

Zeichen- und Medienlimits pro Plattform.

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 enthält einen Eintrag pro Plattform (9 insgesamt); image_limits und video_limits decken instagram, facebook, linkedin, pinterest, gmb ab. Die Werte werden aus dem Code abgeleitet und ändern sich: Rufen Sie den Endpoint auf, um die aktuellen Zahlen zu erhalten, und schreiben Sie sie nicht fest in Ihre Integration.

Post erstellen

POST/api/v2/postsAuthschedule

Erstellt einen geplanten Post oder veröffentlicht sofort.

🚫

Häufige Fehler

Content-Type: application/json. Plattformen klein. image_urls = JSON-Array.
⚠️

Sphäre-Schlüssel: bulle_id erforderlich

Mit einem Sphäre-Schlüssel ist bulle_id nunmehr obligatorisch bei POST /posts. Zuvor gelang der Aufruf, indem ein Standard-Standort ausgewählt wurde, was auf der falschen Google-Fiche veröffentlichen konnte. Bestehende Integrationen, die einen Sphäre-Schlüssel verwenden, müssen dieses Feld ergänzen.

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

Parameter

FeldTypeErforderlichDescription
contentstringJa, außer StorysPost-Text (1-5000 Zeichen)
platformsarrayJaArray: facebook, instagram, gmb, linkedin, pinterest, tiktok, snapchat, youtube. Die Plattform muss auf dem Standort verbunden sein, andernfalls HTTP 400 « Plateforme non connectée ».
image_urlstringNeinEinzelbild-URL
image_urlsarrayNeinURL-Array für Karussell (2-10)
video_urlstringNeinVideo-URL
platform_formatsobjectNeinFormat pro Plattform. Instagram und Facebook: post oder story. Snapchat: story, saved_story oder spotlight. Fehlt es: Standardformat. Ein unbekanntes Format wird abgelehnt.
scheduled_atstringNeinISO 8601 (Standard: +1h)
gmb_fiche_idstringNeinGMB-Profil-ID
publish_nowbooleanNeinSofort veröffentlichen
bulle_idstringSphäre-SchlüsselErforderlich mit einem Sphäre-Schlüssel: der angesteuerte Standort. Wird mit einem Blase-Schlüssel automatisch abgeleitet.
💡

content or text

Geben Sie mindestens content (oder den Alias text) an, außer wenn alle Plattformen eine Story veröffentlichen. Eine Planung pro Plattform ist über scheduled_instagram, scheduled_facebook, scheduled_gmb usw. möglich, ein Inhalt pro Plattform über content_per_platform.
💡

Instagram- und Facebook-Storys

Mit platform_formats erhält jede Plattform ihr eigenes Format: Derselbe Post kann auf Instagram und Facebook als Story und anderswo als klassischer Beitrag erscheinen. Eine Story enthält ein einziges Bild (JPEG, 9:16 empfohlen) oder ein einziges vertikales Video von 3 bis 60 Sekunden: kein Karussell, kein PDF, kein reiner Text. Ein Video über 60 Sekunden wird abgelehnt. Der Text wird in einer Story nie angezeigt, er gehört ins Bild; wenn alle Plattformen eine Story veröffentlichen, kann content entfallen. Storys nutzen die bereits erteilten Veröffentlichungsberechtigungen: Eine erneute Verbindung ist nicht nötig.

Beispiel: eine Story auf Instagram und Facebook

JSON
{
  "platforms": ["instagram", "facebook"],
  "platform_formats": { "instagram": "story", "facebook": "story" },
  "image_url": "https://example.com/images/story-9x16.jpg",
  "scheduled_at": "2026-11-02T09:00:00+01:00",
  "bulle_id": "abc-123"
}

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

Posts auflisten

GET/api/v2/postsAuthread

Posts mit Paginierung. Ein Post, den der Kunde von seiner Website genommen hat (Kästchen « Auf meiner Website anzeigen » in der App deaktiviert), wird nicht zurückgegeben.

ParameterTypeStandardDescription
statusstring-pending, published, error
limitinteger501-100
offsetinteger0Offset
bulle_idstring-Auf einen Standort einschränken. Standard: der des Schlüssels oder alle Standorte der Marke.
⚠️

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": "..." },
    "platform_formats": null,
    "shown_on_site": true,
    "video_poster_url": null,
    "created_at": "2025-11-29T18:00:00Z",
    "updated_at": "2025-12-01T10:00:05Z",
    "warnings": []
  }
]
💡

Vollständige Antwort, Feld für Feld

Hinweise. Es gibt pro Plattform ein Trio scheduled_ / published_ / error_: das geplante Datum, das tatsächliche Veröffentlichungsdatum und die etwaige Fehlermeldung. Eine für diesen Beitrag nicht betroffene Plattform hat ihre drei Felder auf null. platform_refs enthält die Referenzen der Veröffentlichungen bei jeder Plattform, sobald sie veröffentlicht sind; warnings die nicht blockierenden Warnhinweise. platform_formats gibt das pro Plattform gewählte Format an (null: Standardformat). shown_on_site zeigt, ob der Post auf der Website des Kunden angezeigt wird (Kästchen « Auf meiner Website anzeigen » in der App). video_poster_url ist das Vorschaubild des Videos (sein erstes Bild), das anstelle des Bildes angezeigt wird; ohne Video nicht vorhanden.
GET/api/v2/posts/{post_id}Authread

Ruft einen Post anhand seiner ID ab. Liefert dasselbe Objekt wie ein Element von GET /api/v2/posts.

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

Aktualisiert einen ausstehenden Post (nur status: pending): Inhalt, Zeitplan oder Format pro Plattform.

💡

Partial update

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

Format eines Posts ändern

platform_formats enthält nur die zu ändernden Plattformen, mit denselben Werten wie beim Erstellen: post oder story für Instagram und Facebook, story, saved_story oder spotlight für Snapchat. Nicht aufgeführte Plattformen behalten ihr Format. Eine bereits veröffentlichte Plattform kann ihr Format nicht mehr ändern (422). Das Medium des Posts muss zum neuen Format passen: Eine Story nimmt ein Bild oder ein Video, nie ein Karussell oder ein PDF (sonst 422).

Body (JSON)

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

Ausstehenden Post löschen.

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

Sofortige Veröffentlichung.

Vereinfachte Social-Media-Veröffentlichung

Drei Endpoints, konzipiert für die Integrationen Make, n8n und Zapier: veröffentlichen, das Kontingent prüfen, den Status verfolgen. Sie alle erfordern einen Blase-Schlüssel (siehe „Reichweite des Schlüssels“).

POST/api/v2/social/publishAuthpublish

Veröffentlicht oder plant einen Post auf einer oder mehreren Plattformen.

Body (JSON)

FeldTypeErforderlich
platformsarrayJa
textstringNein
image_urlstringNein
image_urlsarrayNein
video_urlstringNein
scheduled_atstringNein
platform_formatsobjectNein
bulle_idstringSphäre-Schlüssel

platforms: facebook, instagram, linkedin, pinterest, tiktok, snapchat, youtube, gmb. text: bis zu 63206 Zeichen, optional, wenn keine Plattform ihn anzeigt (Storys). image_url für ein einzelnes Bild, image_urls für ein Karussell. platform_formats: Format pro Plattform, dieselben Werte wie bei POST /posts. scheduled_at (ISO 8601) fehlt = sofortige Veröffentlichung.

Response:

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

status ist publishing (sofortige Veröffentlichung) oder scheduled (geplant).

GET/api/v2/social/quotaAuthread

Status des monatlichen Veröffentlichungskontingents des Standorts. Vor einer Veröffentlichung aufzurufen, um eine Ablehnung zu vermeiden.

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

Die Antwort wird durch die monatlichen Kontingentzähler des Standorts ergänzt.

bulle_id — Erforderlich mit einem Sphäre-Schlüssel (der angesteuerte Standort). Optional mit einem Blase-Schlüssel.

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

Detaillierter Status eines Posts. Die Objekte scheduled, published und errors enthalten einen Eintrag pro Plattform, null wenn die Plattform nicht betroffen ist.

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

Artikel auflisten

GET/api/v2/articlesAuthread

Generierte Artikel abrufen.

💡

Site ohne Ihre Website (gängige CMS unterstützt)

Endpoint periodisch aufrufen.
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",
    "category": "Tips",
    "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
}
💡

Website mit mehreren Standorten

Jeder Artikel gibt den Standort an, für den er verfasst wurde. Mit einem Sphäre-Schlüssel liefert ein einziger Aufruf die Artikel aller Standorte, und bulle_id gibt an, auf welcher Seite jeder einzelne veröffentlicht werden soll. bulle_id ist null, wenn der Artikel nur mit der Marke verknüpft ist, ohne Standort. Die vollständige Zuordnung der Standorte erhalten Sie über GET /api/v2/bulles.
💡

Die Rubrik eines Artikels

Das Feld `category` (String, beim Schreiben maximal 80 Zeichen, `null` wenn keine Rubrik gesetzt ist) ist eine frei gewählte Bezeichnung: „Ratgeber“, „Tipps“, „Augengesundheit“, „Trends“ … Jedes Konto legt sein eigenes Vokabular fest, es gibt keine vorgegebene Liste. Es wird von `GET /articles` und `GET /articles/{article_id}` zurückgegeben und lässt sich sowohl beim Anlegen als auch beim Aktualisieren schreiben. Einen Filter `?category=` gibt es auf der Liste nicht: Das Feld kommt mit jedem Artikel zurück, gefiltert wird auf Ihrer Seite.

Parameter

ParameterTypeStandard
statusstringpublished · draft · all
updated_sincestringISO 8601 – seit diesem Datum geänderte Artikel (Filter auf updated_at, sortiert vom ältesten zum neuesten).
bulle_idstringAuf einen Standort einschränken. Standard: der des Schlüssels oder alle Standorte der Marke.
💡

Synchron bleiben

Eine Korrektur erkennen. since filtert nach dem Veröffentlichungsdatum: Ein vor einem Monat veröffentlichter und heute Morgen korrigierter Artikel erscheint darin nicht. Um Korrekturen nachzuholen, verwenden Sie updated_since, das nach updated_at filtert. Die Ergebnisse werden dann vom ältesten zum neuesten sortiert, wodurch sich eine Synchronisierung genau dort fortsetzen lässt, wo sie stehen geblieben ist, indem der zuletzt empfangene Wert beibehalten wird.

Bilden Sie Ihre URLs mit slug, niemals mit dem Titel. Der Slug wird bei der ersten Veröffentlichung festgelegt und niemals neu berechnet, selbst wenn der Titel später korrigiert wird. Die URL aus dem Titel abzuleiten würde Ihre Seiten der Gefahr einer Adressänderung nach der Indexierung aussetzen.

Eine Entfernung erkennen. Ein depublizierter Artikel erscheint nicht mehr in status=published. Mit status=all kommt er mit seinem tatsächlichen Status zurück (« draft »), ein eindeutiges Signal. Ein gelöschter Artikel hingegen verschwindet vollständig: Behandeln Sie die empfangene Liste als Quelle der Wahrheit – was nicht mehr darin ist, ist nicht mehr online.

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

Artikelinhalt per 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",
  "category": "Conseils",
  "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"
}

Rendering eines Artikels bestätigen

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

Pingback, den Ihr Skript nach dem Rendern eines abgerufenen Artikels sendet. Er hat zwei Wirkungen: 1. GMB Club erfährt, welche Artikel auf Ihrer Website tatsächlich online sind und nicht nur über die API bereitgestellt werden; 2. durch das Senden von `rendered_url` speist er die interne Verlinkung Ihrer Artikel — im Alltag die nützlichere Wirkung. Optional, aber empfohlen.

💡

Wann aufrufen

Nachdem Sie das HTML des Artikels in das DOM Ihrer Seite eingefügt haben. Der Endpoint ist idempotent: Ein erneuter Aufruf aktualisiert lediglich den Bestätigungszeitstempel, der letzte Ping gewinnt. Sie können ihn also erneut aufrufen, um zu prüfen, ob ein Artikel nach mehreren Tagen noch gerendert wird.

Optionaler JSON-Body. Das Feld `rendered_url` (String, max. 2048 Zeichen, muss mit http:// oder https:// beginnen) ist die öffentliche URL der Seite, auf der Ihr Skript den Artikel soeben gerendert hat. Es ist die einzige Adresse Ihrer Website, die GMB Club kennt: Sie ermöglicht es Ihren künftigen Artikeln, frühere mit einem Link an der richtigen Stelle zu zitieren. Ohne sie ist auf Ihrer Website keine interne Verlinkung möglich — wir erraten niemals eine URL, und ein erfundener Link wäre ein toter Link. Technisch optional, aber dringend empfohlen.

JavaScript
// After rendering the article in the 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 })
});
💡

CORS-Tipp

Die Artikel-Endpunkte akzeptieren Cross-Origin-Anfragen von jeder Domain (Access-Control-Allow-Origin: *). Sie können den Pingback also direkt aus dem <script> Ihrer Seite aufrufen oder serverseitig während eines statischen Builds oder eines SSR-Renderings, ganz wie Sie möchten.
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

Antwort 200 bei erfolgreicher Bestätigung:

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

Interne Verlinkung Ihrer Artikel

Wenn Sie die Adresse Ihrer veröffentlichten Artikel bestätigen, kann GMB Club sie miteinander verknüpfen: Ein neuer Artikel zitiert frühere ganz natürlich, an einer Wendung seines Textes, mit einem Link zur richtigen Seite Ihrer Website. Der Bezugsrahmen ist der Standort, nicht die Marke: Die Artikel einer Blase werden nur untereinander verlinkt, und eine Kette mit mehreren Standorten wird nie erleben, dass ein Artikel einer Stadt auf eine andere Stadt verweist. Nur veröffentlichte Artikel mit bestätigter Adresse kommen infrage; ein Artikel ohne bestätigte Adresse wird einfach übergangen. Der Nutzen entsteht mit der Zeit: Bei zwei oder drei Artikeln online gibt es kaum etwas zu verknüpfen, der Wert kommt mit dem Volumen.

Übergreifende Konventionen

Drei Mechanismen tauchen bei den meisten v2-Endpunkten auf. Wer sie einmal verstanden hat, vermeidet viele Fehler.

✅

Risikofreie Vorschau: dry_run

Jede kostenintensive Operation (Antwort auf eine Bewertung, Veröffentlichung, SEO-Scan, Bericht, Versand von Bewertungsanfragen, Audit oder Anwenden von Eintragsänderungen) akzeptiert "dry_run": true im Body. Die API liefert dann eine Vorschau (Felder would_*, aktuelles Kontingent), ohne etwas auszuführen oder Kontingent zu verbrauchen. Empfohlen in Ihren Make- oder n8n-Szenarien, um einen Aufruf zu prüfen, bevor Sie ihn tatsächlich ausführen.
💡

Standard-Eintrag: fiche_id optional

Bei Endpunkten, die sich auf einen Google-Eintrag beziehen (metrics, reviews, optimizer, acquisition, visibility), ist der Parameter fiche_id optional: Wird er weggelassen, verwendet die API den Eintrag, der mit Ihrem API-Schlüssel verknüpft ist.
💡

Lange Operationen: Antwort 202

Langlaufende Verarbeitungen (Berichtserstellung, Versand von Bewertungsanfragen, Artikelgenerierung) liefern einen Code 202 mit einer Kennung. Das Ergebnis rufen Sie anschließend über die entsprechenden Lese-Endpunkte ab (zum Beispiel GET /v2/reports für einen Bericht oder GET /v2/articles für einen Artikel).

Arbeitsbereich

Sphäre des Schlüssels

GET/api/v2/spheresAuthread

Liefert die mit dem API-Schlüssel verknüpfte Sphäre (Marke): Name, Slug, Standardton und Standardsprache.

JSON
[
  {
    "id": "xyz-789",
    "name": "Auto Sud",
    "slug": "auto-sud",
    "default_language": "fr",
    "default_tone": "professionnel",
    "created_at": "2026-01-15T09:00:00Z"
  }
]

Standorte der Sphäre

GET/api/v2/bullesAuthread

Listet die Bubbles (Standorte) der Sphäre auf, mit ihrer Stadt und der Anzahl der verknüpften Google-Einträge.

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

Details eines Standorts

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

Liefert die Details einer Bubble: effektiver Ton und effektive Sprache (von der Sphäre geerbt, falls nicht gesetzt), Anzahl der Google-Einträge, verbundene Netzwerke.

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
}

Google-Bewertungen

Bewertungen auflisten

GET/api/v2/reviewsAuthread

Liefert die Google-Bewertungen des Eintrags, paginiert und filterbar (Note, Antwortstatus, Keyword, Daten), sortierbar nach Datum oder Note.

Parameter

ParameterTypeStandard
min_starsinteger1-5 · 1
max_starsinteger1-5 · 5
statusstringresponded · drafts · unresponded
keywordstring-
date_fromstringISO 8601
date_tostringISO 8601
sort_bystringdate_desc
fiche_idstringStandard-Eintrag: fiche_id optional
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
}

Zusammenfassung der Bewertungen

GET/api/v2/reviews/summaryAuthread

Liefert die Durchschnittsnote, die Gesamtzahl der Bewertungen und ihre Verteilung nach Status (beantwortet, Entwürfe, unbeantwortet).

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

Auf eine Bewertung antworten

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

Veröffentlicht eine Antwort auf eine Bewertung direkt bei Google. Kostenintensive Operation: unterstützt dry_run.

Body (JSON)

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

410 Gone

Ist die Bewertung inzwischen von Google verschwunden, liefert die API 410.

Response:

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

Bewertungsakquise

Akquise-Statistiken

GET/api/v2/acquisition/statsAuthread

Liefert die Statistiken der Bewertungsanfragen über 30 Tage: Anzahl gesendet, nach Kanal (SMS, E-Mail) und nach Status.

JSON
{
  "fiche_id": "gmb-fiche-123",
  "total_requests": 84,
  "by_channel": { "sms": 50, "email": 34 },
  "by_status": {},
  "last_30_days": 84
}

Bewertungsanfragen senden

POST/api/v2/acquisition/review-requestsAuthpublish

Sendet Bewertungsanfragen per SMS und/oder E-Mail an eine Kontaktliste. Unterliegt den monatlichen Kontingenten. Antwort 202 mit einer batch_id; unterstützt 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[]

Jeder Kontakt enthält mindestens einen Namen (customer_name) und einen Kanal (channel): „sms“ erfordert customer_phone, „email“ erfordert customer_email. Optionales Feld: custom_message. Die SMS- und E-Mail-Kontingente gelten monatlich und pro Bubble.

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

Google-Eintrag

Google-Business-Statistiken

GET/api/v2/gmb/metricsAuthread

Liefert die KPIs des Google-Eintrags über einen Zeitraum: Aufrufe, Suchanfragen, Anrufe, Klicks zur Website, Routenanfragen.

ParameterTypeStandard
period_daysinteger1-90 · 30
fiche_idstringStandard-Eintrag: fiche_id optional
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": {}
}

Optimierungsscore

GET/api/v2/gmb/optimizerAuthread

Liefert den letzten Optimierungsscore des Eintrags (0 bis 100), aus dem Cache. Schnelle Abfrage, ohne neues 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"
}

Vollständiges Audit starten

POST/api/v2/gmb/optimizer/auditAuthpublish

Startet ein vollständiges Audit des Eintrags (Google-Daten + KI-Analyse) und liefert einen detaillierten Score mit Verbesserungsvorschlägen. Kostenintensive Operation: unterstützt 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"
}

Änderungen anwenden

POST/api/v2/gmb/optimizer/applyAuthpublish

Wendet eine Liste von Änderungen {field, value} auf den Google-Eintrag an (echter Schreibvorgang bei Google). Kostenintensive Operation: unterstützt 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"]
}

Antwort ohne dry_run: success, applied, errors, warnings, services_not_added (falls vorhanden), fiche_id, fiche_name, display_name. Ein Vorschlag für Leistungen oder Kategorien wird in die bestehende Liste des Eintrags eingefügt; nur eine vollständige Liste im Google-Format ersetzt sie.

Local-Pack-Sichtbarkeitsscore

GET/api/v2/visibility/scanAuthread

Liefert den letzten Sichtbarkeitsscan des Eintrags im Google Local Pack: Score und durchschnittliche Position rund um den Standort.

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

Wenn kein Scan verfügbar ist, hat die Antwort die folgende Form — und nicht die flache Form mit visibility_score:

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

SEO & Keywords

SEO-Daten

GET/api/v2/seo/dataAuthread

Liefert den letzten vollständigen SEO-Snapshot des Eintrags. Der Parameter kind bestimmt den Inhalt: snapshot (Positionen, Traffic, Zustand) oder competitors (identifizierte Konkurrenten).

ParameterTypeStandard
kindstringsnapshot · competitors · (défaut : snapshot)
bulle_idstringErforderlich mit einem Sphäre-Schlüssel (der angesteuerte Standort). Optional mit einem Blase-Schlüssel.

Response:

Mit Daten (Normalfall) ist die Antwort flach strukturiert:

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

Bedingte Inhaltsblöcke

Die fünf Inhaltsblöcke – ranked_keywords, competitors, onpage, pagespeed, ai_analysis – fehlen in der Antwort, wenn der Scan sie nicht erzeugt hat: Sie haben nicht den Wert null, sie sind schlicht nicht vorhanden. Prüfen Sie ihre Existenz, bevor Sie sie auslesen.

Wenn für diesen Standort noch kein Scan durchgelaufen ist:

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

Mit kind=competitors:

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

Ohne Scan: competitors hat den Wert [] und snapshot_date fehlt.

Verfolgte Keywords

GET/api/v2/seo/tracked-keywordsAuthread

Listet die für den Eintrag verfolgten Keywords auf, mit aktueller Position, Veränderung (delta) und Suchvolumen.

bulle_id — Erforderlich mit einem Sphäre-Schlüssel (der angesteuerte Standort). Optional mit einem Blase-Schlüssel.

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

Keyword zur Verfolgung hinzufügen

POST/api/v2/seo/tracked-keywordsAuthpublish

Fügt ein Keyword zur Ranking-Verfolgung des Eintrags hinzu.

Body (JSON)

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

bulle_id — Erforderlich mit einem Sphäre-Schlüssel: der angesteuerte Standort. Wird mit einem Blase-Schlüssel automatisch abgeleitet.

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

Search-Console-Daten

GET/api/v2/seo/search-consoleAuthread

Liefert die Google-Search-Console-Daten live (Impressionen, Klicks, Position) nach den angeforderten Dimensionen, Filtern und Daten.

ParameterTypeStandard
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_idstringErforderlich mit einem Sphäre-Schlüssel (der angesteuerte Standort). Optional mit einem Blase-Schlüssel.

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

SEO-Scan starten

POST/api/v2/seo/scanAuthpublish

Startet einen vollständigen SEO-Scan des Eintrags. Unterliegt einem monatlichen Kontingent (429 bei Überschreitung). Kostenintensive Operation: unterstützt dry_run.

Body (JSON)

JSON
{ "dry_run": false }

bulle_id — Erforderlich mit einem Sphäre-Schlüssel: der angesteuerte Standort. Wird mit einem Blase-Schlüssel automatisch abgeleitet.

⚠️

429

Rate-Limit

Response:

JSON
{
  "ran": true,
  "kind": "full",
  "status": "running",
  "job_id": "scan-3f9c2a71",
  "bulle_id": "abc-123",
  "quota_used": 3,
  "quota_limit": 10
}
💡

GET /seo/scan-status

Der Scan läuft im Hintergrund: Die Antwort enthält status (running) und eine job_id, die an GET /seo/scan-status übergeben wird, um den Snapshot abzurufen. Ein zweiter Aufruf während eines laufenden Scans liefert dieselbe job_id mit already_running: true.

Einen SEO-Scan verfolgen

GET/api/v2/seo/scan-statusAuth

Status eines mit POST /seo/scan gestarteten Scans: running, done oder error. Bei done enthält result den Snapshot und den Kontingentstand; bei error enthält error eine anzeigbare Meldung.

ParameterTypeErforderlich
job_idstring (8-64)Ja
bulle_idstringSphäre-Schlüssel
JSON
{
  "status": "done",
  "result": { "snapshot": {}, "quota": {} },
  "error": null
}

Keyword analysieren

POST/api/v2/seo/keyword-lookupAuthpublish

Analysiert ein Keyword auf Abruf: Suchvolumen, Schwierigkeit, verwandte Keywords. Kostenintensive Operation: unterstützt dry_run.

Body (JSON)

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

bulle_id — Erforderlich mit einem Sphäre-Schlüssel: der angesteuerte Standort. Wird mit einem Blase-Schlüssel automatisch abgeleitet.

Response:

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

SEO/GEO-Artikel (Erstellung & Veröffentlichung)

Artikel erstellen

POST/api/v2/articlesAuthpublish

Erstellt einen oder mehrere Artikel für die verbundenen Websites (WordPress, Wix, Shopify, PrestaShop). Das KI-Schreiben läuft im Hintergrund. Unterliegt einem Kontingent. Antwort 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é.",
  "category": "Conseils"
}

Parameter

FeldTypeErforderlich
titlestring (min 3)Ja
target_keywordstring (min 2)Ja
site_id · site_idsinteger · integer[]Nein
wix_site_id · wix_site_idsinteger · integer[]Nein
shopify_site_id · shopify_site_idsinteger · integer[]Nein
prestashop_site_id · prestashop_site_idsinteger · integer[]Nein
ai_word_count_targetinteger · 1500Nein
generate_contentboolean · trueNein
generate_imageboolean · falseNein
tonestring · professionalNein
languagestring · frNein
featured_image_url · meta_title · meta_description · excerptstringNein
categorystring (max 80) · nullNein
bulle_idstringSphäre-Schlüssel
💡

201 Created

Die Generierung ist asynchron: Der Artikel wird zuerst erstellt und dann im Hintergrund geschrieben. Rufen Sie den endgültigen Inhalt über GET /v2/articles/{id} ab.

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

Ohne CMS (maßgeschneiderte Website)

Indem Sie bulle_id anstelle einer CMS-Website (site_ids / wix_site_ids) angeben, wird der Artikel erstellt und dem Standort zugeordnet, ohne CMS. Das ist der Modus für maßgeschneiderte Websites (Next.js, Astro, eigenes Theme): Der Artikel wird anschließend über GET /api/v2/articles ausgeliefert, das Ihre Website selbst konsumiert.
JSON
{
  "title": "5 conseils pour entretenir sa voiture",
  "target_keyword": "entretien voiture marseille",
  "bulle_id": "abc-123"
}

Die Antwort trägt dann kind = api in created[], mit site_id auf null:

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

Artikel ändern

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

Aktualisiert einen Artikel teilweise (nur die übergebenen Felder werden geändert). Liefert 409, wenn der Artikel bereits online veröffentlicht ist.

Body (JSON)

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

Partial update

Alle Felder sind optional: Nur die gesendeten Felder werden geändert, die übrigen bleiben unverändert. Achtung bei `category`: Wird das Feld weggelassen, bleibt die bestehende Rubrik erhalten, während ein leerer String ("") sie entfernt. Einen Titel zu korrigieren, ohne `category` mitzusenden, löscht die Rubrik also nie.

Response:

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

Artikel veröffentlichen oder planen

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

Veröffentlicht einen Artikel sofort oder plant ihn, wenn scheduled_at (zukünftiges ISO-Datum) angegeben ist. Kostenintensive Operation: unterstützt 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

QR-Codes auflisten

GET/api/v2/qr-codesAuthread

Liefert die getrackten QR-Codes der Bubble, mit Anzahl der Scans und Weiterleitungstyp (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_id — Auf einen Standort einschränken. Standard: der des Schlüssels oder alle Standorte der Marke.

QR-Code erstellen

POST/api/v2/qr-codesAuthpublish

Erstellt einen getrackten QR-Code, der auf eine Ziel-URL verweist, mit optionaler Farbe und optionalem Logo.

Body (JSON)

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

bulle_id — Optional: Ohne ihn erstellt ein Sphäre-Schlüssel einen QR-Code auf Markenebene (gültig).

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

Websites & Berichte

Verbundene Websites

GET/api/v2/sitesAuthread

Listet die mit der Bubble verbundenen Websites auf. Filterbar nach Plattform (wordpress, wix, shopify, prestashop).

ParameterTypeStandard
platformstringwordpress · wix · shopify · prestashop
bulle_idstringAuf einen Standort einschränken. Standard: der des Schlüssels oder alle Standorte der Marke.
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
  }
]

Berichte auflisten

GET/api/v2/reportsAuthread

Liefert die bereits erstellten Berichte, mit den Download-URLs für PDF und CSV.

ParameterTypeStandard
typestringfiche · (défaut : fiche)
limitinteger1-100 · 20
bulle_idstringAuf einen Standort einschränken. Standard: der des Schlüssels oder alle Standorte der Marke.
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"
  }
]

Bericht erstellen

POST/api/v2/reportsAuthpublish

Erstellt einen PDF-Bericht. type = fiche für einen Standort oder combine mit mindestens zwei fiche_ids. Asynchrone Verarbeitung (ca. 1 bis 2 Min.): Antwort 202, Ergebnis abrufbar über 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

Langlaufende Verarbeitungen (Berichtserstellung, Versand von Bewertungsanfragen, Artikelgenerierung) liefern einen Code 202 mit einer Kennung. Das Ergebnis rufen Sie anschließend über die entsprechenden Lese-Endpunkte ab (zum Beispiel GET /v2/reports für einen Bericht oder GET /v2/articles für einen Artikel).

Response:

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

Bilder

Bild hochladen

POST/api/v2/images/uploadAuthpublish

Sendet ein Bild (image_base64 ODER url, niemals beides). Formate JPEG, PNG, WebP, GIF, maximal 8 MB. Liefert eine image_url, die in Posts und Artikeln wiederverwendbar ist.

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

Bild per KI generieren

POST/api/v2/images/generateAuthpublish

Generiert ein Bild per KI aus einem Prompt. align_with_brand (standardmäßig aktiviert) wendet das Erscheinungsbild der Marke an. Liefert eine image_url.

Body (JSON)

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

bulle_id — Erforderlich mit einem Sphäre-Schlüssel, wenn align_with_brand den Wert true hat (der Standort, dessen Charta abgeglichen wird).

Response:

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

Berechtigungen

Konfigurierbare Berechtigungen:

read

Lesen

schedule

Planen

publish

Veröffentlichen

delete

Löschen

Rate Limiting

Konfigurierbare Anfragelimits:

LimitStandard
Pro Minute60
Pro Tag1000

Fehlercodes

CodeDescription
200Erfolg
201Erstellt
202Lange Operationen: Antwort 202
400Ungültige Anfrage
401Ungültiger Schlüssel
403Unzureichende Berechtigung
404Nicht gefunden
409Zustandskonflikt (z. B. Artikel bereits veröffentlicht)
410Ressource beim Anbieter verschwunden (z. B. Bewertung von Google entfernt)
422Ungültige Daten
429Rate-Limit
500Serverfehler
502Externer Dienst fehlgeschlagen (Google, DataForSEO)
503Dienst nicht konfiguriert oder nicht verfügbar

Code-Beispiele

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

✅

Make.com- & n8n-Module

Die offiziellen Make.com- und n8n-Module (n8n-nodes-gmb-club) decken die wichtigsten Operationen sofort einsatzbereit ab. Für Endpunkte, die noch nicht über ein Modul verfügbar sind, rufen Sie die API direkt auf: Modul „Make an API Call“ in Make oder Node „HTTP Request“ mit dem GMB Club Credential in n8n.
💡

dry_run

Tipp: Aktivieren Sie in Ihren Make- oder n8n-Szenarien dry_run: true bei kostenintensiven Operationen, um den Aufruf zu prüfen, bevor Sie ihn tatsächlich ausführen.

Make.com

HTTP > Make a request verwenden.

🚫

Kritisch

Body type: Raw > JSON. Nicht multipart/form-data.

Zapier

Webhooks by Zapier > Custom Request.

Sicherheit

MaßnahmeDescription
Gehashte SchlüsselSHA256-Hash
HTTPSPflicht
IsolationPro Blase
AblaufzeitOptional
WiderrufJederzeit
Rate LimitingRedis-Schutz