POST/api/v4/social/bulk-posts

Beiträge in großen Mengen erstellen

Validiert bis zu 500 Social-Media-Beiträge pro Anfrage, stellt sie in die Warteschlange und liefert einen Job zum Abfragen der Ergebnisse pro Zeile.

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. The entire request body must be nested under `input`.
input.postsarray of objectserforderlichThe rows to create, 1 to 500 of them. Each row is the same object POST /social/posts takes as its `input`; the per-row fields are listed below.
input.namestringoptionalOptional label for the job itself, to identify it in your own logs. Not shown to any audience.
input.posts[].socialProfileIdstringerforderlichUUID of the brand publishing this row. Rows may target different brands in one request.
input.posts[].namestringerforderlichInternal name for the post.
input.posts[].platformsarray of stringserforderlichPlatforms for this row: `FACEBOOK`, `INSTAGRAM`, `TWITTER` (X), `LINKEDIN`, `PINTEREST`. Each must already have a connection on that row's brand.
input.posts[].contentstringerforderlichThe post body.
input.posts[].actionstringerforderlich`DRAFT`, `SCHEDULE` (requires a schedule) or `PUBLISH`.
input.posts[].mediaUrlsarray of stringsoptionalPublic https image URLs. Required when the row targets Instagram or Pinterest.
input.posts[].videoUrlsarray of stringsoptionalPublic https video URLs.
input.posts[].linkstringoptionalLink to attach where the platform supports one.
input.posts[].scheduledAtstringoptionalISO-8601 publish instant with an offset. Alternative to `scheduleDate` + `scheduleTime`, never both.
input.posts[].scheduleDatestringoptional`YYYY-MM-DD`, interpreted in that row's brand timezone. Send with `scheduleTime`.
input.posts[].scheduleTimestringoptional`HH:MM`, interpreted in that row's brand timezone. Send with `scheduleDate`.
input.posts[].connectedChannelIdsarray of stringsoptionalRestrict this row to specific connections by ID.
input.posts[].clientReferencestringoptionalYour own identifier for this row, echoed back on the matching job result. The most reliable way to reconcile a batch against your own records.

Beispielanfrage

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

Request body
{  "input": {    "name": "Autumn campaign load",    "posts": [      {        "socialProfileId": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902",        "name": "Autumn week 1",        "platforms": ["INSTAGRAM", "FACEBOOK"],        "content": "Week one of the autumn collection: the Fairfield oak sideboard, finished by hand in the workshop.",        "mediaUrls": ["https://cdn.example.com/social/autumn-w1.jpg"],        "action": "SCHEDULE",        "scheduleDate": "2026-10-02",        "scheduleTime": "09:30",        "clientReference": "campaign-4471-slot-01"      },      {        "socialProfileId": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902",        "name": "Autumn week 2",        "platforms": ["INSTAGRAM", "FACEBOOK", "LINKEDIN"],        "content": "Week two: the Halcyon armchair. Sixty hours of work, one chair.",        "mediaUrls": ["https://cdn.example.com/social/autumn-w2.jpg"],        "action": "SCHEDULE",        "scheduleDate": "2026-10-09",        "scheduleTime": "09:30",        "clientReference": "campaign-4471-slot-02"      },      {        "socialProfileId": "a90f7c22-5db1-4e83-9f40-2b7c6a1e5d33",        "name": "Eastside autumn teaser",        "platforms": ["INSTAGRAM"],        "content": "Something solid is arriving next week. Stay tuned.",        "mediaUrls": ["https://cdn.example.com/social/eastside-teaser.jpg"],        "action": "SCHEDULE",        "scheduledAt": "2026-10-01T08:00:00-04:00",        "clientReference": "campaign-4471-slot-03"      }    ]  }}

Antworten

200The whole batch validated. A job was queued, poll GET /social/bulk-posts/{bulkJobId} for per-row results.
Response
{  "data": {    "createBulkSocialMediaPosts": {      "success": true,      "error": [],      "job": {        "id": "9b3f18d0-7a26-4c51-8e94-1f0d5c6b7a82",        "status": "QUEUED",        "totalCount": 3,        "processedCount": 0,        "successCount": 0,        "failureCount": 0,        "createdAt": "2026-09-28T14:04:52Z",        "updatedAt": "2026-09-28T14:04:52Z",        "results": []      }    }  }}
200At least one row failed validation, so **nothing was created**. `success` is `false`, no job is returned, and each rejected row is reported with its 0-based `index`.
Response
{  "data": {    "createBulkSocialMediaPosts": {      "success": false,      "error": [        {          "message": "SY95050: Bulk validation failed, no posts were created",          "code": "SY95050",          "contextInfo": null        }      ],      "job": {        "id": null,        "status": "FAILED",        "totalCount": 3,        "processedCount": 0,        "successCount": 0,        "failureCount": 2,        "createdAt": "2026-09-28T14:04:52Z",        "updatedAt": "2026-09-28T14:04:52Z",        "results": [          {            "index": 1,            "clientReference": "campaign-4471-slot-02",            "socialProfileId": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902",            "platforms": ["INSTAGRAM", "FACEBOOK", "LINKEDIN"],            "status": "INVALID",            "socialPostId": null,            "postStatus": null,            "errors": [              {                "message": "SY95045: No connected channel for LINKEDIN on this brand",                "code": "SY95045",                "contextInfo": [{ "key": "platform", "value": "LINKEDIN" }]              }            ]          },          {            "index": 2,            "clientReference": "campaign-4471-slot-03",            "socialProfileId": "a90f7c22-5db1-4e83-9f40-2b7c6a1e5d33",            "platforms": ["INSTAGRAM"],            "status": "INVALID",            "socialPostId": null,            "postStatus": null,            "errors": [              {                "message": "SY95046: scheduledAt must carry a UTC offset",                "code": "SY95046",                "contextInfo": null              }            ]          }        ]      }    }  }}
401Unauthenticated, missing or invalid API key.

Erstellt viele Social-Media-Beiträge in einer Anfrage. Die Zeilen werden in der Anfrage-Payload übermittelt — es gibt keinen Datei-Upload und keine CSV-Datei, sondern nur ein Array derselben Objekte, die POST /social/posts einzeln entgegennimmt. Bis zu 500 Zeilen pro Anfrage.

Anwendungsfall: Inhalte für ein Quartal mit einem einzigen Aufruf laden. Ihr Planungstool enthält den gesamten Inhaltskalender des Kunden. Erstellen Sie eine Zeile pro geplantem Termin, kennzeichnen Sie jede mit Ihrem eigenen clientReference und senden Sie alle zusammen. Der Stapel ist entweder als Ganzes erfolgreich oder gibt genau an, welche Zeilen Sie korrigieren müssen. Speichern Sie die zurückgegebene job.id und fragen Sie GET /social/bulk-posts/{bulkJobId} wiederholt ab, bis status einen Endzustand erreicht hat, und ordnen Sie dann jedes Ergebnis anhand seiner clientReference zu.

Der gesamte Stapel wird vorab validiert

Die Validierung wird für jede Zeile durchgeführt, bevor etwas erstellt wird, und der Stapel wird in dieser Phase atomar verarbeitet:

  • Wenn auch nur eine Zeile ungültig ist, wird nichts erstellt. success ist false, SY95050 wird in error zurückgegeben, und jede fehlerhafte Zeile erscheint in job.results[] mit ihrem bei 0 beginnenden index, ihrer clientReference und dem Grund in errors[]. Korrigieren Sie diese Zeilen und senden Sie den gesamten Stapel erneut.
  • Wenn jede Zeile gültig ist, wird ein Job in die Warteschlange gestellt, success ist true, und Sie erhalten eine job.id. Einzelne Zeilen können dennoch später fehlschlagen, wenn die Plattform sie zum Zeitpunkt der Veröffentlichung ablehnt; dies wird im Job angezeigt, nicht hier.

Verwenden Sie für die Zuordnung nach Möglichkeit clientReference und andernfalls index — die Zeilen selbst werden nicht zurückgegeben, daher sind diese beiden Felder die einzige Verbindung zu Ihren eigenen Daten.

Hinweise.

  • Der Anfrage-Body muss in ein input-Objekt eingebettet sein, wobei sich die Zeilen in input.posts befinden.
  • Prüfen Sie success, nicht den HTTP-Status. Eine Ablehnung des gesamten Stapels ist ein HTTP 200 mit success: false und SY95050 in error.
  • Maximal 500 Zeilen pro Anfrage. Ein größeres Array wird mit SY95048 vollständig abgelehnt und es wird nichts erstellt; teilen Sie es auf und senden Sie mehrere Stapel.
  • Die Marke wird in jeder Zeile durch socialProfileId angegeben. brandId ist ausschließlich ein URL-Pfad-Token, und diese Route hat überhaupt kein Pfad-Token.
  • Zeilen können sich auf verschiedene Marken beziehen. Die platforms jeder Zeile werden anhand der Marke dieser Zeile geprüft. Wenn eine Plattform also mit einer Marke verbunden ist, mit einer anderen jedoch nicht, schlagen nur die Zeilen fehl, die diese Verbindung benötigen.
  • Für jede Zeile gelten dieselben Planungsregeln wie für einen einzelnen Beitrag: scheduledAt oder scheduleDate + scheduleTime, niemals beides, und scheduleDate / scheduleTime werden in der Zeitzone der Marke der jeweiligen Zeile interpretiert. Die beiden Formen können in verschiedenen Zeilen desselben Stapels verwendet werden.
  • Ratenlimits gelten für die Anfrage, nicht für die Zeilen: Ein Stapel mit 500 Zeilen verbraucht eine Anfrage Ihres Kontingents. Siehe Ratenlimits.

Schreiboperation: nicht im Live-Konto ausgeführt. Die gezeigte Anfrage und Antwort wurden aus dem API-Schema erstellt; bei der Ausführung wird in echten Social-Media-Konten veröffentlicht.

Request
curl -X POST 'https://listingsapi.com/api/v4/social/bulk-posts' \  -H "Authorization: API $LISTINGSAPI_KEY" \  -H 'Content-Type: application/json' \  -d '{    "input": {      "name": "Autumn campaign load",      "posts": [        {          "socialProfileId": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902",          "name": "Autumn week 1",          "platforms": [            "INSTAGRAM",            "FACEBOOK"          ],          "content": "Week one of the autumn collection: the Fairfield oak sideboard, finished by hand in the workshop.",          "mediaUrls": [            "https://cdn.example.com/social/autumn-w1.jpg"          ],          "action": "SCHEDULE",          "scheduleDate": "2026-10-02",          "scheduleTime": "09:30",          "clientReference": "campaign-4471-slot-01"        },        {          "socialProfileId": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902",          "name": "Autumn week 2",          "platforms": [            "INSTAGRAM",            "FACEBOOK",            "LINKEDIN"          ],          "content": "Week two: the Halcyon armchair. Sixty hours of work, one chair.",          "mediaUrls": [            "https://cdn.example.com/social/autumn-w2.jpg"          ],          "action": "SCHEDULE",          "scheduleDate": "2026-10-09",          "scheduleTime": "09:30",          "clientReference": "campaign-4471-slot-02"        },        {          "socialProfileId": "a90f7c22-5db1-4e83-9f40-2b7c6a1e5d33",          "name": "Eastside autumn teaser",          "platforms": [            "INSTAGRAM"          ],          "content": "Something solid is arriving next week. Stay tuned.",          "mediaUrls": [            "https://cdn.example.com/social/eastside-teaser.jpg"          ],          "action": "SCHEDULE",          "scheduledAt": "2026-10-01T08:00:00-04:00",          "clientReference": "campaign-4471-slot-03"        }      ]    }  }'