POST/api/v4/bulk-posts

Beitrag für mehrere Standorte erstellen

Erstellt einen Social-Media-Beitrag und veröffentlicht ihn mit einer einzigen Anfrage an vielen Standorten.

Erfordert einen API-Schlüssel. Format des Headers und Schlüsselrotation finden Sie unter Authentifizierung.

Parameter

Body

Ein als erforderlich markiertes verschachteltes Feld gilt nur, wenn Sie das übergeordnete Feld senden. Ist das übergeordnete Feld optional und lassen Sie es weg, gelten seine erforderlichen Unterfelder nicht.

NameTypErforderlichBeschreibung
inputobjecterforderlichWrapper object. Every field below is a property of `input`, the entire body must be nested under it.
input.postNamestringerforderlichInternal name for the campaign (not shown publicly).
input.locationIdsarray of stringserforderlichBase64-encoded location Relay IDs to publish to.
input.postTypestringerforderlichOne of `EVENT`, `OFFER`, `ANNOUNCEMENT`, `COVID19`, `PRODUCT`.
input.postSitesarray of stringserforderlichTarget publishers: `GOOGLE` and/or `FACEBOOK`.
input.postMessagearray of objectsoptionalPer-site post body. Each entry: `site` and `message`.
input.postMessage[].sitestringerforderlichPublisher for this message: `GOOGLE` or `FACEBOOK`.
input.postMessage[].messagestringerforderlichPost body text for that site.
input.postMediaUrlarray of objectsoptionalPer-site media. Each entry: `site`, `url`, and `type` (`IMAGE` or `VIDEO`).
input.postMediaUrl[].sitestringerforderlichPublisher for this media asset.
input.postMediaUrl[].urlstringerforderlichPublicly accessible media URL.
input.postMediaUrl[].typestringoptional`IMAGE` or `VIDEO`.
input.postCtaarray of objectsoptionalPer-site call-to-action button. Each entry: `site`, `type`, `url`.
input.postScheduledDatesobjectoptionalScheduling window: `startDatetime`, `endDatetime`, and optional `removalSites`. When provided, the post is created with status `SCHEDULED`.
input.postScheduledDates.startDatetimestringerforderlichISO-8601 datetime the post goes live.
input.postScheduledDates.endDatetimestringerforderlichISO-8601 datetime the post is removed.
input.postContextInfoobjectoptionalType-specific details (offer coupon/redeem/terms, or event title/times). Required by `OFFER`, `EVENT`, and `PRODUCT` posts.
input.productsarray of objectsoptionalProduct entries for `PRODUCT` posts (name, price, photo, cta).
input.componentIdentifierstringoptionalOptional client component reference for tracking.
input.componentTypestringoptionalOptional client component type for tracking.

Beispielanfrage

Body zum direkten Einfügen. Ersetzen Sie Platzhalter-IDs und -Werte durch Ihre eigenen.

Request body
{  "input": {    "postName": "July Reopening Announcement",    "locationIds": [      "TG9jYXRpb246MTgwMDI4OQ==",      "TG9jYXRpb246MTgwMDI5MA=="    ],    "postType": "ANNOUNCEMENT",    "postSites": ["GOOGLE", "FACEBOOK"],    "postMessage": [      { "site": "GOOGLE", "message": "We're back! Visit us this week for our summer menu." },      { "site": "FACEBOOK", "message": "We're back! Swing by for the new summer menu." }    ],    "postMediaUrl": [      { "site": "GOOGLE", "url": "https://cdn.example.com/summer.jpg", "type": "IMAGE" }    ],    "postScheduledDates": {      "startDatetime": "2026-07-10T09:00:00Z",      "endDatetime": "2026-07-24T23:59:00Z"    }  }}

Antworten

200Bulk post accepted. `success` is true and the created campaign is returned. Note the response is keyed under `createSocialPost`: the bulk endpoint returns the same response shape as `POST /posts`.
Response
{  "data": {    "createSocialPost": {      "clientMutationId": null,      "success": true,      "errors": null,      "socialPost": {        "id": "U29jaWFsUG9zdDo5OTIwMQ==",        "name": "July Reopening Announcement",        "status": "SCHEDULED",        "type": "ANNOUNCEMENT",        "createdAt": "2026-07-08",        "scheduledStartDate": "2026-07-10",        "scheduledEndDate": "2026-07-24",        "sites": ["GOOGLE", "FACEBOOK"],        "locationIds": [1800289, 1800290]      }    }  }}
400Bad request, the body was not wrapped in `input` (error message: `Variable "$input" of required type ... was not provided`).
401Unauthenticated, missing or invalid API key.

Erstellt eine einzelne Beitragskampagne und verteilt sie an jeden Standort in locationIds, wobei sie auf den ausgewählten postSites veröffentlicht wird. Anders als bei der Erstellung pro Standort richtet sich ein Aufruf an alle Ihre Standorte, was eine effiziente Möglichkeit ist, eine unternehmensweite Ankündigung, ein Angebot oder eine Veranstaltung zu veröffentlichen.

Anfragestruktur. Der gesamte Body muss in ein input-Objekt eingebettet sein; jedes Feld (postName, locationIds, postType, …) ist eine Eigenschaft von input. Ein flacher, nicht eingebetteter Body wird mit HTTP 400 (Variable "$input" of required type ... was not provided) abgelehnt. Es gelten dieselben Vorgaben wie bei POST /posts, und eine erfolgreiche Antwort verwendet den Schlüssel createSocialPost anstelle eines Schlüssels speziell für die Massenverarbeitung.

Anwendungsfall: unternehmensweite Ankündigung (oben gezeigt). Legen Sie postType: "ANNOUNCEMENT" fest, listen Sie die Standort-IDs auf und geben Sie für jeden Standort einen Wert für postMessage an. Fügen Sie postScheduledDates hinzu, um den Beitrag über einen festen Zeitraum laufen zu lassen (der Beitrag wird dann mit dem Status SCHEDULED erstellt); lassen Sie es weg, um ihn sofort zu veröffentlichen.

Anwendungsfall: ein zeitlich begrenztes Angebot in allen Filialen. Ändern Sie postType in OFFER und geben Sie den Gutschein in postContextInfo an (weiterhin in input eingebettet):

JSON
{  "input": {    "postName": "Summer 20% Off",    "locationIds": ["TG9jYXRpb246MTgwMDI4OQ=="],    "postType": "OFFER",    "postSites": ["GOOGLE"],    "postMessage": [{ "site": "GOOGLE", "message": "20% off through July!" }],    "postContextInfo": {      "title": "Summer Sale",      "couponCode": "SUMMER20",      "redeemUrl": "https://example.com/offer",      "termsConditions": "Valid through July 31",      "startDay": "2026-07-10",      "startTime": "09:00",      "endDay": "2026-07-31",      "endTime": "23:59"    }  }}

Stolperfallen.

  • Der Body muss in input eingebettet sein; werden die Felder auf der obersten Ebene gesendet, wird HTTP 400 zurückgegeben.
  • postType, postSites, postName und locationIds sind erforderlich; die Typen EVENT, OFFER und PRODUCT erfordern zusätzlich die passenden postContextInfo-Felder (oder products-Felder).
  • postSites akzeptiert nur GOOGLE und FACEBOOK; an den Zielstandorten muss der entsprechende Kanal verbunden sein, andernfalls wird der jeweilige Standort übersprungen.
  • Bei einem teilweisen oder vollständigen Fehlschlagen der Validierung wird HTTP 200 mit success: false und einem gefüllten errors-Array zurückgegeben; prüfen Sie success und verfolgen Sie anschließend die tatsächliche Veröffentlichung pro Standort über den Endpunkt zum Abrufen des Beitrags für mehrere Standorte.
Request
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're back! Visit us this week for our summer menu."        },        {          "site": "FACEBOOK",          "message": "We're back! Swing by for the new summer menu."        }      ],      "postMediaUrl": [        {          "site": "GOOGLE",          "url": "https://cdn.example.com/summer.jpg",          "type": "IMAGE"        }      ],      "postScheduledDates": {        "startDatetime": "2026-07-10T09:00:00Z",        "endDatetime": "2026-07-24T23:59:00Z"      }    }  }'