Beiträge auf Google und Facebook veröffentlichen
Sie posten Ankündigungen, Events und Angebote, planen für viele Standorte, prüfen den Live-Status je Plattform, verwalten Posts und reagieren auf Webhooks.
Ein Beitrag ist eine datierte Karte im Google Business Profile oder auf der Facebook-Seite eines Standorts: eine Ankündigung, eine Veranstaltung oder ein Angebot. Ein Aufruf erstellt ihn, die Veröffentlichung läuft im Hintergrund, und ein zweiter Aufruf zeigt Ihnen, ob jede Plattform ihn angenommen hat.
Alle drei Beitragstypen verwenden POST /posts, wobei der Body in input eingebettet ist. Ein flacher Body wird mit 400 abgelehnt. Die SDKs erstellen die umschließende Struktur und validieren die Payload vor dem Senden.
1. Eine Ankündigung veröffentlichen
Eine Ankündigung enthält einen Nachrichtentext, eine optionale Schaltfläche und ein optionales Bild.
curl -X POST https://listingsapi.com/api/v4/posts \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "input": { "postName": "Grand Opening Announcement", "locationIds": ["TG9jYXRpb246MTgwMDI4OQ=="], "postType": "ANNOUNCEMENT", "postSites": ["GOOGLE"], "postMessage": [ { "site": "GOOGLE", "message": "We are now open! Visit us this week for our grand opening." } ], "postCta": [ { "site": "GOOGLE", "type": "LEARN_MORE", "url": "https://acmekitchen.example.com/opening" } ], "postMediaUrl": [ { "site": "GOOGLE", "url": "https://cdn.example.com/opening.jpg", "type": "IMAGE" } ] }}'{ "data": { "createSocialPost": { "success": true, "errors": [], "socialPost": { "id": "U29jaWFsUG9zdDo0NDEyMg==", "name": "Grand Opening Announcement", "status": "INPROGRESS", "type": "ANNOUNCEMENT", "sites": ["GOOGLE"], "publishDetails": [ { "site": "GOOGLE", "status": "PUBLISHING", "createdDate": "2026-06-28", "submissionError": null } ], "postLinks": [], "locationIds": [1800289] } } }}Bewahren Sie socialPost.id auf. status beginnt mit INPROGRESS, und postLinks bleibt leer, bis eine Plattform den Beitrag annimmt; in Schritt 5 werden beide wieder abgerufen.
2. Eine Veranstaltung veröffentlichen
Eine Veranstaltung ergänzt postContextInfo mit title, startDay, endDay und optionalen Uhrzeiten zur Anzeige. Google lehnt eine Veranstaltung ohne Titel ab, und die SDKs lösen vor dem Senden ValidationError aus, wenn er fehlt.
curl -X POST https://listingsapi.com/api/v4/posts \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "input": { "postName": "Summer Sale Kickoff Event", "locationIds": ["TG9jYXRpb246MTgwMDI4OQ=="], "postType": "EVENT", "postSites": ["GOOGLE"], "postContextInfo": { "title": "Summer Sale Kickoff", "startDay": "2026-07-15", "startTime": "10:00am", "endDay": "2026-07-15", "endTime": "06:00pm" }, "postMessage": [ { "site": "GOOGLE", "message": "Join us for the Summer Sale kickoff: refreshments, giveaways, and up to 40% off in store." } ] }}'Die Antwort hat dieselbe Struktur wie in Schritt 1, mit type: "EVENT" und den unter socialPost.contextInfo zurückgegebenen Datumsangaben. postContextInfo enthält die Datumsangaben der Veranstaltung selbst; postScheduledDates (Schritt 4) steuert, wann der Beitrag selbst veröffentlicht und zurückgezogen wird.
3. Ein Angebot veröffentlichen
postContextInfo eines Angebots enthält title, couponCode, discount, redeemUrl, termsConditions sowie den Gültigkeitszeitraum mit startDay und endDay. Kombinieren Sie es mit einer GET_OFFER-Schaltfläche auf Facebook oder einer ORDER-Schaltfläche auf Google; es gibt keinen Typ REDEEM.
curl -X POST https://listingsapi.com/api/v4/posts \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "input": { "postName": "Summer 25% Off", "locationIds": ["TG9jYXRpb246MTgwMDI4OQ=="], "postType": "OFFER", "postSites": ["GOOGLE"], "postContextInfo": { "title": "25% off storewide", "couponCode": "SUMMER25", "discount": "25%", "redeemUrl": "https://acmekitchen.example.com/summer", "termsConditions": "Valid in store only through July 6. Cannot be combined with other offers.", "startDay": "2026-06-22", "endDay": "2026-07-06" }, "postMessage": [ { "site": "GOOGLE", "message": "Celebrate with us: 25% off everything in store this week." } ] }}'Die Antwort gibt die Angebotsfelder unter socialPost.contextInfo zurück und setzt scheduledStartDate und scheduledEndDate anhand des Gültigkeitszeitraums.
4. Einen Beitrag nach Zeitplan an viele Standorte senden
POST /bulk-posts akzeptiert dasselbe input und sendet eine Kampagne an jede ID in locationIds. Fügen Sie postScheduledDates mit startDatetime und endDatetime im ISO-8601-Format hinzu, um den Beitrag später zu veröffentlichen und automatisch zurückzuziehen; der Beitrag wird dann als SCHEDULED erstellt. Geben Sie jeder Plattform einen eigenen Nachrichtentext, wenn sich der Ton unterscheidet.
curl -X POST https://listingsapi.com/api/v4/bulk-posts \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "input": { "postName": "July Reopening Announcement", "locationIds": ["TG9jYXRpb246MTgwMDI4OQ==", "TG9jYXRpb246MTgwMDI5MA=="], "postType": "ANNOUNCEMENT", "postSites": ["GOOGLE", "FACEBOOK"], "postMessage": [ { "site": "GOOGLE", "message": "We are back! Visit us this week for our summer menu." }, { "site": "FACEBOOK", "message": "We are back! Swing by for the new summer menu." } ], "postScheduledDates": { "startDatetime": "2026-07-10T09:00:00Z", "endDatetime": "2026-07-24T23:59:00Z" } }}'Der Endpunkt für die Massenverarbeitung gibt dieselbe Struktur wie POST /posts zurück, daher verwendet auch diese Antwort den Schlüssel createSocialPost, mit status: "SCHEDULED" und beiden IDs in locationIds. Bei einem Validierungsproblem wird 200 mit success: false und einem gefüllten errors-Array zurückgegeben; die SDKs lösen dafür ValidationError aus. Rufen Sie eine Kampagne für mehrere Standorte mit GET /bulk-posts/{postId} wieder ab, wodurch der Status für jeden Standort ergänzt wird.
5. Veröffentlichungsstatus prüfen und Beitragslinks sammeln
GET /posts/{postId} gibt die Kampagne unter socialPostView zurück. Fragen Sie sie nach dem Erstellen wiederholt ab, bis socialPostInfo.status nicht mehr INPROGRESS ist, und lesen Sie dann publishDetails[] für das Ergebnis jeder Plattform sowie postLinks[] für die URLs der veröffentlichten Beiträge aus. Lassen Sie zwischen den Abfragen jeweils mehrere zehn Sekunden verstreichen; bei 429 wird Retry-After mitgeliefert.
curl https://listingsapi.com/api/v4/posts/U29jaWFsUG9zdDo0NDEyMg== \-H "Authorization: API $LISTINGSAPI_KEY"{ "data": { "socialPostView": { "socialPostInfo": { "id": "U29jaWFsUG9zdDo0NDEyMg==", "status": "SUCCESS", "views": 128, "clicks": 14, "publishDetails": [ { "site": "GOOGLE", "status": "PUBLISHED", "publishedDate": "2026-06-28", "submissionError": null } ], "postLinks": [ { "site": "GOOGLE", "link": "https://www.google.com/maps/place/?post=44122" } ] }, "socialPostAnalyticsBySite": [ { "site": "GOOGLE", "views": 128, "clicks": 14, "reactions": 3, "shares": 0, "comments": 1 } ] } }}views, clicks, reactions, shares und comments werden im selben Datensatz gesammelt und in socialPostAnalyticsBySite nach Plattform aufgeschlüsselt. Die SDKs geben socialPostInfo direkt zurück, weshalb die Beispiele post.status auslesen.
6. Beiträge eines Standorts auflisten und einen davon löschen
GET /locations/{locationId}/posts ist eine per Offset paginierte Seite (page, perPage bis zu 50) aller Kampagnen, die den Standort einschließen, unter postsByLocation mit records[] und pageInfo.totalRecords. Übergeben Sie die base64-id unverändert; kodieren Sie sie nicht für URLs. Es gibt keinen Typfilter. Wählen Sie daher Angebote oder Veranstaltungen aus type in Ihrem eigenen Code aus. Kampagnen für mehrere Standorte aus Schritt 4 werden separat von GET /locations/{locationId}/bulk-posts aufgelistet.
DELETE /posts/{postId} entfernt die Kampagne hier und entfernt sie auch von jeder Website, auf der sie veröffentlicht wurde. Dies lässt sich nicht rückgängig machen. Bestätigen Sie daher zuerst die id anhand der Liste.
curl "https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/posts?page=1&perPage=20" \-H "Authorization: API $LISTINGSAPI_KEY" curl -X DELETE https://listingsapi.com/api/v4/posts/U29jaWFsUG9zdDo0NDEyMg== \-H "Authorization: API $LISTINGSAPI_KEY"Ein Löschvorgang gibt data.deleteSocialPost mit success: true und dem entfernten socialPostId zurück. Wenn Sie eine bereits gelöschte id löschen, wird stattdessen eine errors-Antwort mit data: null zurückgegeben, sodass sich ein zweiter Löschvorgang leicht erkennen lässt.
7. Auf Webhooks für Beiträge reagieren
Wenn unter /dashboard/webhooks eine Webhook-URL festgelegt ist, decken vier Ereignisse den Lebenszyklus eines Beitrags ab, alle mit der Standard-Payload. Sie werden pro Standort ausgelöst, nicht pro Kampagne: Ein Sammelbeitrag für 20 Standorte erzeugt 20 post_item_id-Werte mit einem gemeinsamen post_id.
function handle(payload: { event: string; location_id: string; data: Record<string, unknown> }) {if (!payload.event.startsWith('local_post.')) return; const key = String(payload.data.post_item_id); // one row per locationswitch (payload.event) { case 'local_post.published': markLive(key, payload.location_id, payload.data.post_external_id); break; case 'local_post.rejected': markRejected(key, payload.location_id, payload.data.rejection_reason); break; case 'local_post.deleted': markDeleted(key); break;}}published_url fehlt in der Regel. Fragen Sie daher wie in Schritt 5 weiterhin regelmäßig postLinks ab, wenn Sie einen anklickbaren Link benötigen. Antworten Sie innerhalb von 5 Sekunden mit 200; es gibt keine erneuten Versuche. Den Empfänger und die Signaturprüfung finden Sie unter Mit Webhooks auf Ereignisse reagieren.
Nächste Schritte
- Google verbinden und Standorte importieren und Facebook-Seiten verbinden: die Voraussetzung für die jeweilige Website.
- Profilanalysen abrufen: Aufrufe und Aktionen auf Profilebene ergänzen die hier aufgeführten Zähler pro Beitrag.
- Mit Webhooks auf Ereignisse reagieren: der Empfänger, bei dem diese Ereignisse eingehen.
- Referenz: Ankündigungsbeitrag erstellen, Veranstaltungsbeitrag erstellen, Angebotsbeitrag erstellen, Sammelbeitrag erstellen, Beitrag abrufen, Beiträge für einen Standort abrufen, Beitrag löschen.