Entwickler
Dokumentation API
Die GMB Club API ermöglicht es, Posts über Zapier, Make oder eigene Skripte zu veröffentlichen und zu planen.
Kernkonzepte
Die v2 API nutzt die hierarchische Sphäre/Blase-Architektur.
| Concept | Description | Beispiel |
|---|---|---|
| Sphäre | Marke / Unternehmen | "Auto Sud" |
| Blase | Standort / Verkaufsstelle | "Auto Sud Marseille" |
| Ressourcen | Verbundene Konten | Facebook, Instagram, GMB |
Important
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:
- 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.
- Jede Route, die auf ein Ziel wirkt, akzeptiert einen Zielparameter:
bulle_idfür einen Standort,fiche_idfür eine Google-Fiche. Immer an derselben Stelle: URL-Parameter beim Lesen, Feld im Body beim Schreiben. - 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. - Listen-Routen ohne Parameter geben die gesamte Marke zurück, und jedes Element trägt seine
bulle_id. - Ein Ziel außerhalb des Geltungsbereichs des Schlüssels gibt
403zurück; ein nicht existierendes Ziel404.
Mögliche Antworten (Meldungen des Backends, auf Französisch):
| Code | Antwort (detail) |
|---|---|
403 | Cet établissement n'appartient pas à votre périmètre. |
403 | Cette fiche GMB n'appartient pas à votre périmètre. |
404 | Établissement introuvable : <identifiant> |
404 | Aucune fiche GMB associée à cette clé API. |
400 | Cette clé API couvre plusieurs établissements. Précisez `bulle_id` (liste : GET /api/v2/bulles). |
400 | Cette clé API couvre plusieurs fiches Google. Précisez `fiche_id` (liste : GET /api/v2/me). |
API-Schlüssel erhalten
- Bei GMB Club anmelden
- Wählen Sie Ihre Blase in der Kopfzeile aus
- Einstellungen → API-Schlüssel → Neuer Schlüssel
- Wählen Sie den Geltungsbereich: „Dieser Standort“ oder „Gesamte Marke“
- 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
Format
gmb_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxVerwendung
curl -H "X-API-Key: gmb_live_xxxx..." \
-H "Content-Type: application/json" \
https://app.gmb-club.com/api/v2/meNur JSON
Base URL
https://app.gmb-club.com/api/v2Endpoints
/api/v2/healthPrüft die API-Verfügbarkeit. Keine Auth nötig.
{
"status": "ok",
"api_version": "2.0",
"timestamp": "2026-07-27T18:00:00.000000Z"
}Schlüssel-Identitat
/api/v2/meAuthreadGibt Infos über Schlüssel, Blase, Sphäre und Ressourcen zurück.
{
"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
bulle null und das Array gmb_fiches listet alle Einträge der Marke auf.Soziale Verbindungen
/api/v2/connectionsAuthreadDetails der verbundenen Netzwerke.
[
{ "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 }
]| Parameter | Type | Standard |
|---|---|---|
bulle_id | string | Auf 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
/api/v2/platforms/limitsAuthreadZeichen- und Medienlimits pro Plattform.
{
"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
Post erstellen
/api/v2/postsAuthscheduleErstellt einen geplanten Post oder veröffentlicht sofort.
Häufige Fehler
Sphäre-Schlüssel: bulle_id erforderlich
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)
{
"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
| Feld | Type | Erforderlich | Description |
|---|---|---|---|
content | string | Ja, außer Storys | Post-Text (1-5000 Zeichen) |
platforms | array | Ja | Array: facebook, instagram, gmb, linkedin, pinterest, tiktok, snapchat, youtube. Die Plattform muss auf dem Standort verbunden sein, andernfalls HTTP 400 « Plateforme non connectée ». |
image_url | string | Nein | Einzelbild-URL |
image_urls | array | Nein | URL-Array für Karussell (2-10) |
video_url | string | Nein | Video-URL |
platform_formats | object | Nein | Format pro Plattform. Instagram und Facebook: post oder story. Snapchat: story, saved_story oder spotlight. Fehlt es: Standardformat. Ein unbekanntes Format wird abgelehnt. |
scheduled_at | string | Nein | ISO 8601 (Standard: +1h) |
gmb_fiche_id | string | Nein | GMB-Profil-ID |
publish_now | boolean | Nein | Sofort veröffentlichen |
bulle_id | string | Sphäre-Schlüssel | Erforderlich mit einem Sphäre-Schlüssel: der angesteuerte Standort. Wird mit einem Blase-Schlüssel automatisch abgeleitet. |
content or text
Instagram- und Facebook-Storys
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
{
"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:
{
"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
/api/v2/postsAuthreadPosts 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.
| Parameter | Type | Standard | Description |
|---|---|---|---|
status | string | - | pending, published, error |
limit | integer | 50 | 1-100 |
offset | integer | 0 | Offset |
bulle_id | string | - | Auf einen Standort einschränken. Standard: der des Schlüssels oder alle Standorte der Marke. |
Bare array
[
{
"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
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./api/v2/posts/{post_id}AuthreadRuft einen Post anhand seiner ID ab. Liefert dasselbe Objekt wie ein Element von GET /api/v2/posts.
/api/v2/posts/{post_id}AuthscheduleAktualisiert einen ausstehenden Post (nur status: pending): Inhalt, Zeitplan oder Format pro Plattform.
Partial update
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)
{
"content": "Updated text!",
"scheduled_at": "2025-12-02T14:00:00+01:00",
"platform_formats": { "instagram": "story" }
}/api/v2/posts/{post_id}AuthdeleteAusstehenden Post löschen.
/api/v2/posts/{post_id}/publishAuthpublishSofortige 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“).
Artikel auflisten
/api/v2/articlesAuthreadGenerierte Artikel abrufen.
Site ohne Ihre Website (gängige CMS unterstützt)
{
"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
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
Parameter
| Parameter | Type | Standard |
|---|---|---|
status | string | published · draft · all |
updated_since | string | ISO 8601 – seit diesem Datum geänderte Artikel (Filter auf updated_at, sortiert vom ältesten zum neuesten). |
bulle_id | string | Auf 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.
/api/v2/articles/{article_id}AuthreadArtikelinhalt per ID.
{
"id": 12,
"title": "5 conseils pour entretenir sa voiture",
"excerpt": "Nos conseils d'expert.",
"content_html": "<h2>Introduction</h2><p>...</p>",
"featured_image_url": "https://storage.example.com/images/article-12.jpg",
"meta_title": "5 conseils entretien | Auto Sud",
"meta_description": "Nos experts partagent leurs conseils.",
"target_keyword": "entretien voiture marseille",
"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
/api/v2/articles/{article_id}/confirmAuthreadPingback, 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
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.
// 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
$ch = curl_init("https://app.gmb-club.com/api/v2/articles/{$id}/confirm");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
"rendered_url" => "https://monsite.fr/blog/article-{$id}"
]));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"X-API-Key: gmb_live_xxxx...",
"Content-Type: application/json"
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);await fetch(`https://app.gmb-club.com/api/v2/articles/${id}/confirm`, {
method: "POST",
headers: {
"X-API-Key": process.env.GMB_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({ rendered_url: `https://monsite.fr/blog/article-${id}` }),
});import requests
requests.post(
f"https://app.gmb-club.com/api/v2/articles/{id}/confirm",
headers={"X-API-Key": "gmb_live_xxxx...", "Content-Type": "application/json"},
json={"rendered_url": f"https://monsite.fr/blog/article-{id}"},
)curl -X POST \
-H "X-API-Key: gmb_live_xxxx..." \
-H "Content-Type: application/json" \
-d '{"rendered_url": "https://monsite.fr/blog/123"}' \
https://app.gmb-club.com/api/v2/articles/42/confirmAntwort 200 bei erfolgreicher Bestätigung:
{
"article_id": 42,
"confirmed_at": "2026-05-25T14:30:00Z",
"confirmation_source": "pingback"
}Interne Verlinkung Ihrer Artikel
Übergreifende Konventionen
Drei Mechanismen tauchen bei den meisten v2-Endpunkten auf. Wer sie einmal verstanden hat, vermeidet viele Fehler.
Risikofreie Vorschau: dry_run
Standard-Eintrag: fiche_id optional
Lange Operationen: Antwort 202
Arbeitsbereich
Sphäre des Schlüssels
/api/v2/spheresAuthreadLiefert die mit dem API-Schlüssel verknüpfte Sphäre (Marke): Name, Slug, Standardton und Standardsprache.
[
{
"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
/api/v2/bullesAuthreadListet die Bubbles (Standorte) der Sphäre auf, mit ihrer Stadt und der Anzahl der verknüpften Google-Einträge.
[
{ "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
/api/v2/bulles/{bulle_id}AuthreadLiefert die Details einer Bubble: effektiver Ton und effektive Sprache (von der Sphäre geerbt, falls nicht gesetzt), Anzahl der Google-Einträge, verbundene Netzwerke.
{
"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
/api/v2/reviewsAuthreadLiefert die Google-Bewertungen des Eintrags, paginiert und filterbar (Note, Antwortstatus, Keyword, Daten), sortierbar nach Datum oder Note.
Parameter
| Parameter | Type | Standard |
|---|---|---|
min_stars | integer | 1-5 · 1 |
max_stars | integer | 1-5 · 5 |
status | string | responded · drafts · unresponded |
keyword | string | - |
date_from | string | ISO 8601 |
date_to | string | ISO 8601 |
sort_by | string | date_desc |
fiche_id | string | Standard-Eintrag: fiche_id optional |
limit | integer | 1-100 · 25 |
page | integer | 1 |
{
"fiche": { "id": "gmb-fiche-123", "name": "Auto Sud - Marseille Centre", "address": "12 rue de la Paix, Marseille", "place_id": "ChIJ...", "average_rating": 4.6, "total_reviews": 128 },
"reviews": [{
"review_id": "rev-abc",
"customer_name": "Julie A.",
"rating": 5,
"text": "Service impeccable, je recommande !",
"review_timestamp": "2026-07-01T09:12:00Z",
"response_text": null,
"reply_date": null,
"responded": false,
"author_photo": "https://lh3.googleusercontent.com/..."
}],
"average_rating": 4.6,
"total_reviews": 128,
"filtered_count": 1,
"status_counts": { "all": 128, "responded": 90, "drafts": 12, "unresponded": 26 },
"page": 1,
"total_pages": 3
}Zusammenfassung der Bewertungen
/api/v2/reviews/summaryAuthreadLiefert die Durchschnittsnote, die Gesamtzahl der Bewertungen und ihre Verteilung nach Status (beantwortet, Entwürfe, unbeantwortet).
{
"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 }
}Bewertungsakquise
Akquise-Statistiken
/api/v2/acquisition/statsAuthreadLiefert die Statistiken der Bewertungsanfragen über 30 Tage: Anzahl gesendet, nach Kanal (SMS, E-Mail) und nach Status.
{
"fiche_id": "gmb-fiche-123",
"total_requests": 84,
"by_channel": { "sms": 50, "email": 34 },
"by_status": {},
"last_30_days": 84
}Bewertungsanfragen senden
/api/v2/acquisition/review-requestsAuthpublishSendet 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)
{
"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[]
Response:
{
"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
/api/v2/gmb/metricsAuthreadLiefert die KPIs des Google-Eintrags über einen Zeitraum: Aufrufe, Suchanfragen, Anrufe, Klicks zur Website, Routenanfragen.
| Parameter | Type | Standard |
|---|---|---|
period_days | integer | 1-90 · 30 |
fiche_id | string | Standard-Eintrag: fiche_id optional |
{
"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
/api/v2/gmb/optimizerAuthreadLiefert den letzten Optimierungsscore des Eintrags (0 bis 100), aus dem Cache. Schnelle Abfrage, ohne neues Audit.
{
"kind": "gmb",
"fiche_id": "gmb-fiche-123",
"fiche_name": "Auto Sud - Marseille Centre",
"display_name": "Auto Sud - Marseille Centre",
"score": 82,
"breakdown": {},
"scored_at": "2026-07-05T08:00:00Z"
}Vollständiges Audit starten
/api/v2/gmb/optimizer/auditAuthpublishStartet ein vollständiges Audit des Eintrags (Google-Daten + KI-Analyse) und liefert einen detaillierten Score mit Verbesserungsvorschlägen. Kostenintensive Operation: unterstützt dry_run.
{
"kind": "gmb",
"fiche_id": "gmb-fiche-123",
"fiche_name": "Auto Sud - Marseille Centre",
"score": 82,
"breakdown": {},
"suggestions": [
{ "field": "description", "reason": "Trop courte", "suggested_value": "..." },
{ "field": "hours", "reason": "Horaires du dimanche manquants" }
],
"review_count": 128,
"avg_rating": 4.6,
"analyzed_at": "2026-07-05T08:00:00Z"
}Änderungen anwenden
/api/v2/gmb/optimizer/applyAuthpublishWendet eine Liste von Änderungen {field, value} auf den Google-Eintrag an (echter Schreibvorgang bei Google). Kostenintensive Operation: unterstützt dry_run.
Body (JSON)
{
"changes": [
{ "field": "description", "value": "Garage automobile à Marseille..." }
],
"dry_run": true
}Response (dry_run):
{
"dry_run": true,
"fiche_id": "gmb-fiche-123",
"fiche_name": "Auto Sud - Marseille Centre",
"changes": [ { "field": "description", "value": "Garage automobile à Marseille..." } ],
"fields": ["description"]
}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
/api/v2/visibility/scanAuthreadLiefert den letzten Sichtbarkeitsscan des Eintrags im Google Local Pack: Score und durchschnittliche Position rund um den Standort.
{
"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:
{ "fiche_id": "gmb-fiche-123", "snapshot": null }SEO & Keywords
SEO-Daten
/api/v2/seo/dataAuthreadLiefert den letzten vollständigen SEO-Snapshot des Eintrags. Der Parameter kind bestimmt den Inhalt: snapshot (Positionen, Traffic, Zustand) oder competitors (identifizierte Konkurrenten).
| Parameter | Type | Standard |
|---|---|---|
kind | string | snapshot · competitors · (défaut : snapshot) |
bulle_id | string | Erforderlich mit einem Sphäre-Schlüssel (der angesteuerte Standort). Optional mit einem Blase-Schlüssel. |
Response:
Mit Daten (Normalfall) ist die Antwort flach strukturiert:
{
"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
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:
{ "kind": "snapshot", "snapshot": null, "bulle_id": "abc-123" }Mit kind=competitors:
{
"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
/api/v2/seo/tracked-keywordsAuthreadListet 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.
[
{
"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
/api/v2/seo/tracked-keywordsAuthpublishFügt ein Keyword zur Ranking-Verfolgung des Eintrags hinzu.
Body (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:
{
"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
/api/v2/seo/search-consoleAuthreadLiefert die Google-Search-Console-Daten live (Impressionen, Klicks, Position) nach den angeforderten Dimensionen, Filtern und Daten.
| Parameter | Type | Standard |
|---|---|---|
dimensions | array | query · page · date · country · device |
days | integer | 1-365 |
start_date | string | ISO 8601 |
end_date | string | ISO 8601 |
row_limit | integer | - |
query_contains | string | - |
query_equals | string | - |
page_contains | string | - |
page_equals | string | - |
country | string | - |
device | string | - |
search_type | string | - |
bulle_id | string | Erforderlich mit einem Sphäre-Schlüssel (der angesteuerte Standort). Optional mit einem Blase-Schlüssel. |
Response:
{
"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
/api/v2/seo/scanAuthpublishStartet einen vollständigen SEO-Scan des Eintrags. Unterliegt einem monatlichen Kontingent (429 bei Überschreitung). Kostenintensive Operation: unterstützt dry_run.
Body (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
Response:
{
"ran": true,
"kind": "full",
"status": "running",
"job_id": "scan-3f9c2a71",
"bulle_id": "abc-123",
"quota_used": 3,
"quota_limit": 10
}GET /seo/scan-status
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
/api/v2/seo/scan-statusAuthStatus 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.
| Parameter | Type | Erforderlich |
|---|---|---|
job_id | string (8-64) | Ja |
bulle_id | string | Sphäre-Schlüssel |
{
"status": "done",
"result": { "snapshot": {}, "quota": {} },
"error": null
}Keyword analysieren
/api/v2/seo/keyword-lookupAuthpublishAnalysiert ein Keyword auf Abruf: Suchvolumen, Schwierigkeit, verwandte Keywords. Kostenintensive Operation: unterstützt dry_run.
Body (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:
{
"kind": "keyword-lookup",
"keyword": "vidange voiture marseille",
"result": {}
}SEO/GEO-Artikel (Erstellung & Veröffentlichung)
Artikel erstellen
/api/v2/articlesAuthpublishErstellt 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)
{
"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
| Feld | Type | Erforderlich |
|---|---|---|
title | string (min 3) | Ja |
target_keyword | string (min 2) | Ja |
site_id · site_ids | integer · integer[] | Nein |
wix_site_id · wix_site_ids | integer · integer[] | Nein |
shopify_site_id · shopify_site_ids | integer · integer[] | Nein |
prestashop_site_id · prestashop_site_ids | integer · integer[] | Nein |
ai_word_count_target | integer · 1500 | Nein |
generate_content | boolean · true | Nein |
generate_image | boolean · false | Nein |
tone | string · professional | Nein |
language | string · fr | Nein |
featured_image_url · meta_title · meta_description · excerpt | string | Nein |
category | string (max 80) · null | Nein |
bulle_id | string | Sphäre-Schlüssel |
201 Created
Response:
{
"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)
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.{
"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:
{
"created": [ { "id": 43, "kind": "api", "site_id": null } ],
"count": 1,
"generating": true
}Artikel ändern
/api/v2/articles/{article_id}AuthpublishAktualisiert einen Artikel teilweise (nur die übergebenen Felder werden geändert). Liefert 409, wenn der Artikel bereits online veröffentlicht ist.
Body (JSON)
{
"title": "Nouveau titre",
"content_html": "<h2>...</h2>",
"excerpt": "...",
"meta_title": "...",
"meta_description": "...",
"target_keyword": "...",
"featured_image_url": "https://...",
"category": "Guide"
}Partial update
Response:
{ "article_id": 42, "updated_fields": ["title", "meta_description"], "status": "draft" }Artikel veröffentlichen oder planen
/api/v2/articles/{article_id}/publishAuthpublishVeröffentlicht einen Artikel sofort oder plant ihn, wenn scheduled_at (zukünftiges ISO-Datum) angegeben ist. Kostenintensive Operation: unterstützt dry_run.
Body (JSON)
{
"scheduled_at": "2026-07-15T09:00:00+02:00",
"dry_run": false
}Response:
{
"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
/api/v2/qr-codesAuthreadLiefert die getrackten QR-Codes der Bubble, mit Anzahl der Scans und Weiterleitungstyp (gate).
[
{
"id": 1,
"bulle_id": "abc-123",
"name": "Avis Auto Sud",
"target": "Page Google Reviews",
"scan_count": 342,
"last_scanned_at": "2026-07-18T15:00:00Z",
"is_active": true,
"gate_enabled": true,
"gate_threshold": 4,
"created_at": "2026-04-01T10:00:00Z"
}
]bulle_id — Auf einen Standort einschränken. Standard: der des Schlüssels oder alle Standorte der Marke.
QR-Code erstellen
/api/v2/qr-codesAuthpublishErstellt einen getrackten QR-Code, der auf eine Ziel-URL verweist, mit optionaler Farbe und optionalem Logo.
Body (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:
{
"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
/api/v2/sitesAuthreadListet die mit der Bubble verbundenen Websites auf. Filterbar nach Plattform (wordpress, wix, shopify, prestashop).
| Parameter | Type | Standard |
|---|---|---|
platform | string | wordpress · wix · shopify · prestashop |
bulle_id | string | Auf einen Standort einschränken. Standard: der des Schlüssels oder alle Standorte der Marke. |
[
{
"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
/api/v2/reportsAuthreadLiefert die bereits erstellten Berichte, mit den Download-URLs für PDF und CSV.
| Parameter | Type | Standard |
|---|---|---|
type | string | fiche · (défaut : fiche) |
limit | integer | 1-100 · 20 |
bulle_id | string | Auf einen Standort einschränken. Standard: der des Schlüssels oder alle Standorte der Marke. |
[
{
"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
/api/v2/reportsAuthpublishErstellt 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)
{
"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
202 Accepted
Response:
{ "generated": true, "type": "combine", "report_id": "rep-1", "fiches_count": 2 }Bilder
Bild hochladen
/api/v2/images/uploadAuthpublishSendet 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)
{ "url": "https://example.com/photo.jpg" }
// ou : { "image_base64": "data:image/png;base64,iVBORw0..." }Response:
{
"uploaded": true,
"image_url": "https://app.gmb-club.com/static/uploads/mcp/xxxx.webp",
"size_bytes": 84213,
"format": "webp"
}Bild per KI generieren
/api/v2/images/generateAuthpublishGeneriert 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)
{
"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:
{
"generated": true,
"image_url": "https://app.gmb-club.com/static/uploads/mcp/xxxx.webp",
"brand_aligned": true
}Berechtigungen
Konfigurierbare Berechtigungen:
readLesen
schedulePlanen
publishVeröffentlichen
deleteLöschen
Rate Limiting
Konfigurierbare Anfragelimits:
| Limit | Standard |
|---|---|
| Pro Minute | 60 |
| Pro Tag | 1000 |
Fehlercodes
| Code | Description |
|---|---|
200 | Erfolg |
201 | Erstellt |
202 | Lange Operationen: Antwort 202 |
400 | Ungültige Anfrage |
401 | Ungültiger Schlüssel |
403 | Unzureichende Berechtigung |
404 | Nicht gefunden |
409 | Zustandskonflikt (z. B. Artikel bereits veröffentlicht) |
410 | Ressource beim Anbieter verschwunden (z. B. Bewertung von Google entfernt) |
422 | Ungültige Daten |
429 | Rate-Limit |
500 | Serverfehler |
502 | Externer Dienst fehlgeschlagen (Google, DataForSEO) |
503 | Dienst nicht konfiguriert oder nicht verfügbar |
Code-Beispiele
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
dry_run
Make.com
HTTP > Make a request verwenden.
Kritisch
Zapier
Webhooks by Zapier > Custom Request.
Sicherheit
| Maßnahme | Description |
|---|---|
| Gehashte Schlüssel | SHA256-Hash |
| HTTPS | Pflicht |
| Isolation | Pro Blase |
| Ablaufzeit | Optional |
| Widerruf | Jederzeit |
| Rate Limiting | Redis-Schutz |

/api/v2/social/publishAuthpublishVeröffentlicht oder plant einen Post auf einer oder mehreren Plattformen.
Body (JSON)
platformstextimage_urlimage_urlsvideo_urlscheduled_atplatform_formatsbulle_idplatforms: facebook, instagram, linkedin, pinterest, tiktok, snapchat, youtube, gmb.text: bis zu 63206 Zeichen, optional, wenn keine Plattform ihn anzeigt (Storys).image_urlfür ein einzelnes Bild,image_urlsfür ein Karussell.platform_formats: Format pro Plattform, dieselben Werte wie bei POST /posts.scheduled_at(ISO 8601) fehlt = sofortige Veröffentlichung.Response:
statusistpublishing(sofortige Veröffentlichung) oderscheduled(geplant).