Social

Marken verwalten, Social-Media-Konten verbinden, Posts auf Facebook, Instagram, X, LinkedIn und Pinterest über client.social veröffentlichen oder planen.

Alle Social-Methoden befinden sich unter client.social, aufgeteilt in vier Namensräume und einen Aufruf auf oberster Ebene:

NamensraumVerwaltet
client.social.brandsMarken: die Container, denen verbundene Konten und Beiträge zugeordnet sind
client.social.connectionsMit einer Marke verknüpfte Social-Media-Konten
client.social.postsEinzelne Beiträge: Entwurf, Planung, Veröffentlichung, Stornierung, Statistiken
client.social.bulkMehrere Beiträge in einer Anfrage als asynchroner Auftrag
client.social.limits()Verbindungslimit und aktuelle Nutzung

IDs, Plattformen und Statuswerte

Marken-, Beitrags- und Verbindungs-IDs sind einfache UUID-Zeichenfolgen. Anders als Standort-IDs sind sie niemals Base64-kodiert, und das SDK wandelt sie nicht um.

Plattformen werden durch die großgeschriebenen Enum-Werte FACEBOOK, INSTAGRAM, TWITTER (für X), LINKEDIN und PINTEREST angegeben. Die Statuswerte für Beiträge sind DRAFT, PENDING, SCHEDULED, PUBLISHED, FAILED, ARCHIVED und REJECTED; die Statuswerte pro Kanal sind SCHEDULED, SUCCESS, ERROR und ARCHIVED.

Jeder Schreibvorgang gibt ein success-Flag zurück

Social-Schreibvorgänge melden Validierungsfehler innerhalb einer 200-Antwort als success: false mit der Begründung in error. Das SDK löst bei Transportfehlern und erkannten Fehler-Payloads Ausnahmen aus, Sie sollten success jedoch grundsätzlich selbst prüfen:

Python
result = client.social.brands.create(profile_name="Jenny Home", timezone=tz)if not result.success:  raise RuntimeError(result.error.message)

Die Veröffentlichung erfolgt asynchron

action="PUBLISH" nimmt den Beitrag an und gibt seine id zurück. Fragen Sie social.posts.retrieve() wiederholt ab und lesen Sie connectedChannels[] aus, um status, liveLink und error pro Kanal zu erhalten; bei demselben Aufruf kann die Veröffentlichung eines Beitrags auf einer Plattform erfolgreich sein und auf einer anderen fehlschlagen.


social.brands.create

Erstellen Sie eine Marke. Nur profile_name und timezone sind erforderlich.

Python
client.social.brands.create(    *,    profile_name: str,    timezone: dict,    business_intent: str | None = None,    categories: list[str] | None = None,    site_url: str | None = None,    logo: str | None = None,    country_iso: str | None = None,    bio: str | None = None,    brand_hashtags: list[str] | None = None,    competitor_hashtags: list[str] | None = None,    content_preferred_language: str | None = None,) -> APIObject
ArgumentTypBeschreibung
profile_namestrAnzeigename der Marke. Erforderlich.
timezonedict{"label", "tzCode", "name", "utc"}. tzCode ist die IANA-Zeitzone, in der jeder Wert für schedule_date / schedule_time dieser Marke interpretiert wird. Erforderlich.
business_intentstrTätigkeit des Unternehmens, die für Inhaltsvorschläge verwendet wird. Der Standardwert ist general.
categorieslist[str]Unternehmenskategorien. Der Standardwert ist eine leere Liste.
site_urlstrDie Website der Marke. Wenn Sie diesen Wert setzen, wird das Auslesen der Website in die Warteschlange gestellt.
logostrÖffentliche https-URL des Markenlogos.
country_isostrZweistelliger ISO-Ländercode.
biostrKurze Beschreibung der Marke.
brand_hashtagslist[str]Hashtags, die im Beitragseditor als Vorschläge angeboten werden.
competitor_hashtagslist[str]Hashtags von Wettbewerbern, die beobachtet werden sollen.
content_preferred_languagestrSprache für generierte Inhalte, e.g. en.
Python
result = client.social.brands.create(  profile_name="Jenny Home",  timezone={      "label": "(GMT-05:00) Eastern Time",      "tzCode": "America/New_York",      "name": "Eastern Standard Time",      "utc": "-05:00",  },  business_intent="A family-run home furnishings store selling handmade furniture.",  categories=["Furniture Store"],  site_url="https://jennyhome.example",)brand_id = result.socialProfile.id  # a plain UUID string

In API-Tarifen ist die Anzahl der Marken unbegrenzt, daher schlägt dieser Vorgang niemals aufgrund eines Limits fehl. Begrenzt ist die Anzahl der Verbindungen – prüfen Sie social.limits(), bevor Sie einen Verbindungslink erstellen, nicht bevor Sie eine Marke erstellen.


social.brands.list

Listen Sie Marken mit Offset-Paginierung auf. Wenn Sie einen Filter senden, muss dieser statuses enthalten.

Python
client.social.brands.list(    *,    statuses: list[str] | None = None,    profile_name: str | None = None,    page: int | None = None,    size: int | None = None,) -> APIObject
Python
result = client.social.brands.list(page=1, size=25)for brand in result.profiles:  print(brand.id, brand.profileName, brand.connectedChannelCount)print(result.pageInfo.total, result.pageInfo.hasNextPage)

social.brands.retrieve

Rufen Sie eine einzelne Marke anhand ihrer UUID ab.

Python
client.social.brands.retrieve(brand_id: str) -> APIObject
Python
brand = client.social.brands.retrieve("6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902")print(brand.profileName, brand.timezone.tzCode)

social.brands.update

Aktualisieren Sie eine Marke. Nur profile_id ist erforderlich; senden Sie nur die Felder, die Sie ändern.

Python
client.social.brands.update(    profile_id: str,    *,    profile_name: str | None = None,    timezone: dict | None = None,    business_intent: str | None = None,    categories: list[str] | None = None,    site_url: str | None = None,    logo: str | None = None,    country_iso: str | None = None,    bio: str | None = None,    brand_hashtags: list[str] | None = None,    competitor_hashtags: list[str] | None = None,    content_preferred_language: str | None = None,) -> APIObject

categories, brand_hashtags und competitor_hashtags ersetzen beim Senden die gespeicherte Liste; die Übergabe von [] leert sie.

Python
client.social.brands.update(  "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902",  profile_name="Jenny Home & Co.",)

social.brands.archive

Archivieren Sie eine Marke und ihre Verbindungen. Die Marke muss mindestens 90 Tage alt sein.

Python
client.social.brands.archive(social_profile_id: str) -> APIObject
Python
result = client.social.brands.archive("6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902")print(result.status)  # ARCHIVED or TENURE_NOT_MET

Bei einer Marke, die jünger als 90 Tage ist, werden success: False und status: "TENURE_NOT_MET" zurückgegeben, und es wird nichts geändert. Sobald das Mindestalter erreicht ist, erfolgt die Archivierung sofort: Die Marke und alle mit ihr verknüpften Verbindungen werden im selben Aufruf archiviert und veröffentlichen ab diesem Zeitpunkt keine Beiträge mehr, ihre Verbindungsplätze bleiben jedoch bis zum Ende des Abrechnungszeitraums belegt, genau wie bei einer manuellen Trennung.


Erstellen Sie eine kurzzeitig gültige URL zu einer gehosteten Seite, die einen Endnutzer durch die Verbindung einer Plattform mit einer Marke führt. Leiten Sie ihn zu url weiter.

Python
client.social.connections.link(    brand_id: str,    *,    channel: str,    redirect_url: str,    error_url: str | None = None,    state: str | None = None,) -> APIObject
Python
link = client.social.connections.link(  "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902",  channel="INSTAGRAM",  redirect_url="https://app.example.com/social/connected",  error_url="https://app.example.com/social/connect-failed",  state="sess_9f2c1e64",)print(link.url, link.expiresIn)

Der Nutzer kehrt zu redirect_url zurück, wobei status, brandId, platform, Ihr state und bei Erfolg connectedAccountId angehängt werden. Die Verbindung wird erst einen Moment später angelegt. Fragen Sie daher social.connections.list() einige Sekunden lang wiederholt ab, statt das erste leere Abfrageergebnis als Fehler zu werten. Instagram erfordert ein Business- oder Creator-Konto, das mit einer Facebook-Seite verknüpft ist.


social.connections.list

Listen Sie die mit einer Marke verknüpften Social-Media-Konten auf.

Python
client.social.connections.list(brand_id: str) -> APIObject
Python
result = client.social.connections.list("6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902")for channel in result.socialConnected:  print(channel.id, channel.platform, channel.displayName)print(result.channelCount)

channel.id ist die Verbindungs-UUID, die alle anderen Aufrufe benötigen; referenceId ist die eigene Kontokennung der Plattform und wird niemals als Eingabe akzeptiert.


social.connections.disconnect

Entfernen Sie eine Verbindung. Dies lässt sich nicht rückgängig machen: Zur Wiederherstellung ist ein neuer Aufruf von social.connections.link() erforderlich.

Python
client.social.connections.disconnect(social_profile_connected_channel_id: str) -> APIObject
Python
client.social.connections.disconnect("b81d5b3c-4a90-4f6a-9c11-71e0dd2fa4a7")

Geplante Beiträge für den Kanal werden nicht storniert; ihre Veröffentlichung schlägt zum vorgesehenen Zeitpunkt mit SY95045 fehl. Stornieren Sie sie zuerst mit social.posts.cancel().


social.posts.create

Erstellen Sie einen Beitrag für eine Marke auf ihren verbundenen Kanälen.

Python
client.social.posts.create(    *,    social_profile_id: str,    name: str,    platforms: list[str],    content: str,    action: str,    media_urls: list[str] | None = None,    video_urls: list[str] | None = None,    link: str | None = None,    scheduled_at: str | None = None,    schedule_date: str | None = None,    schedule_time: str | None = None,    connected_channel_ids: list[str] | None = None,    client_reference: str | None = None,) -> APIObject
ArgumentTypBeschreibung
social_profile_idstrUUID der Marke. Erforderlich.
namestrInterner Name, der dem Publikum nicht angezeigt wird. Erforderlich.
platformslist[str]FACEBOOK, INSTAGRAM, TWITTER, LINKEDIN, PINTEREST. Für jede Plattform muss bereits eine Verbindung bei der Marke bestehen. Erforderlich.
contentstrDer Beitragstext. Erforderlich.
actionstrDRAFT, SCHEDULE oder PUBLISH. Erforderlich.
media_urlslist[str]Öffentliche https-URLs von Bildern. Für Instagram und Pinterest erforderlich.
video_urlslist[str]Öffentliche https-URLs von Videos.
linkstrAnzuhängender Link, sofern die Plattform dies unterstützt.
scheduled_atstrISO-8601 mit einem Zeitzonenoffset. Alternative zum Datum-Uhrzeit-Paar.
schedule_datestrYYYY-MM-DD, interpretiert in der Zeitzone der Marke. Zusammen mit schedule_time senden.
schedule_timestrHH:MM, interpretiert in der Zeitzone der Marke. Zusammen mit schedule_date senden.
connected_channel_idslist[str]Auf bestimmte Verbindungen beschränken.
client_referencestrIhre eigene Kennung, die in den Ergebnissen von Sammelaufträgen zurückgegeben wird.

action="SCHEDULE" benötigt genau eine Form der Zeitangabe: scheduled_at oder schedule_date + schedule_time. Wenn Sie beide senden, wird die Anfrage mit SY95046 abgelehnt.

Python
result = client.social.posts.create(  social_profile_id="6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902",  name="Autumn collection launch",  platforms=["INSTAGRAM", "FACEBOOK"],  content="Our autumn collection lands today. Solid oak, hand-finished.",  media_urls=["https://cdn.example.com/social/autumn.jpg"],  action="SCHEDULE",  schedule_date="2026-10-02",  schedule_time="09:30",)print(result.success, result.socialPostId)

social.posts.retrieve

Rufen Sie einen einzelnen Beitrag mit dem Veröffentlichungsstatus pro Kanal ab. Fragen Sie diesen nach dem Erstellen wiederholt ab.

Python
client.social.posts.retrieve(post_id: str) -> APIObject
Python
post = client.social.posts.retrieve("c47a1e58-2b93-4f10-a6d7-58e0c9b12345")print(post.status)for channel in post.connectedChannels:  print(channel.platform, channel.status, channel.liveLink, channel.error)

social.posts.list

Listen Sie die Beiträge einer Marke mit Offset-Paginierung und Filtern auf.

Python
client.social.posts.list(    brand_id: str,    *,    filters: dict | None = None,    page: int | None = None,    size: int | None = None,    fetch_post_content: bool | None = None,) -> APIObject

filters akzeptiert name, platforms, status, start_date, end_date, social_connected_channel_id, approval_state, view_mode und filter_by_user.

Python
result = client.social.posts.list(  "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902",  filters={"status": ["SCHEDULED"], "startDate": "2026-10-01", "endDate": "2026-10-31"},  page=1,  size=50,)for post in result.socialPosts:  print(post.socialPostId, post.name, post.status)print(result.pageInfo.total)

social.posts.cancel

Stornieren Sie einen geplanten Beitrag oder einen Entwurf, damit er niemals veröffentlicht wird.

Python
client.social.posts.cancel(social_post_id: str) -> APIObject
Python
client.social.posts.cancel("c47a1e58-2b93-4f10-a6d7-58e0c9b12345")

Bereits veröffentlichte Beiträge können nicht storniert werden und werden von keiner Plattform entfernt; der Aufruf gibt für sie success: False zurück.


social.posts.insights

Interaktionen und Kommentare zu einem veröffentlichten Beitrag auf einem Kanal. Beide Felder werden als JSON-Zeichenfolgen zurückgegeben, die die plattformeigene Payload enthalten.

Python
client.social.posts.insights(    post_id: str,    *,    social_connected_channel_id: str,) -> APIObject
Python
import json result = client.social.posts.insights(  "c47a1e58-2b93-4f10-a6d7-58e0c9b12345",  social_connected_channel_id="b81d5b3c-4a90-4f6a-9c11-71e0dd2fa4a7",)insights = json.loads(result.insights)comments = json.loads(result.comments)print(insights.get("impressions"), len(comments))

Die darin enthaltenen Schlüssel werden von der jeweiligen Plattform vorgegeben und unterscheiden sich je nach Plattform; berücksichtigen Sie beim Auslesen mögliche Abweichungen.


social.bulk.create

Validieren Sie bis zu 500 Beiträge in einer Anfrage und stellen Sie sie in die Warteschlange. Die Zeilen können sich auf unterschiedliche Marken beziehen.

Python
client.social.bulk.create(    posts: list[dict],    *,    name: str | None = None,) -> APIObject

Jede Zeile akzeptiert in camelCase dieselben Felder wie social.posts.create. Wenn auch nur eine Zeile ungültig ist, wird nichts erstellt: success ist False, SY95050 wird in error zurückgegeben, und job.results[] benennt jede fehlerhafte Zeile anhand ihres bei 0 beginnenden index und ihres clientReference.

Python
result = client.social.bulk.create([  {      "socialProfileId": "6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902",      "name": "Autumn week 1",      "platforms": ["INSTAGRAM", "FACEBOOK"],      "content": "Week one of the autumn collection.",      "mediaUrls": ["https://cdn.example.com/social/autumn-w1.jpg"],      "action": "SCHEDULE",      "scheduleDate": "2026-10-02",      "scheduleTime": "09:30",      "clientReference": "campaign-4471-slot-01",  },])if not result.success:  for row in result.job.results:      print(row.index, row.clientReference, row.errors)else:  job_id = result.job.id

social.bulk.retrieve

Fragen Sie einen Sammelauftrag wiederholt ab, bis er einen Endstatus erreicht.

Python
client.social.bulk.retrieve(bulk_job_id: str) -> APIObject
Python
job = client.social.bulk.retrieve("9b3f18d0-7a26-4c51-8e94-1f0d5c6b7a82")print(job.status, job.processedCount, "/", job.totalCount)for row in job.results:  print(row.clientReference, row.status, row.socialPostId)

status ist QUEUED, PROCESSING, COMPLETED, COMPLETED_WITH_ERRORS oder FAILED. Wenn eine Zeile CREATED erreicht, bedeutet dies, dass der Beitrag existiert, nicht dass er veröffentlicht wurde: Übergeben Sie socialPostId an social.posts.retrieve(), um das Ergebnis pro Kanal zu erhalten.


social.limits

Verbindungslimit und aktuelle Nutzung in einem Aufruf.

Python
client.social.limits() -> APIObject
Python
limits = client.social.limits()print(limits.maxConnections, limits.usage.connections)     # pool vs usedprint(limits.brands)                                       # None — brands are unlimitedprint(limits.usage.brands)                                 # brands that exist, uncapped

Verbindungen bilden ein kontoweit geteiltes Kontingent – 20 bei Social Launch, 125 bei Social Growth sowie 5 weitere für jedes Verbindungspaket zu 25 $/Monat – und kein Kontingent pro Marke. Prüfen Sie es, bevor Sie einen Verbindungslink erstellen, damit Sie eine Upgrade-Möglichkeit statt eines SY95042 anzeigen können. limits.brands ist in jedem API-Tarif None.


Siehe auch