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:
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:
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.
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,) -> APIObjectresult = 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 stringIn 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.
client.social.brands.list( *, statuses: list[str] | None = None, profile_name: str | None = None, page: int | None = None, size: int | None = None,) -> APIObjectresult = 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.
client.social.brands.retrieve(brand_id: str) -> APIObjectbrand = 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.
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,) -> APIObjectcategories, brand_hashtags und competitor_hashtags ersetzen beim Senden die gespeicherte Liste; die Übergabe von [] leert sie.
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.
client.social.brands.archive(social_profile_id: str) -> APIObjectresult = client.social.brands.archive("6f2c9a41-7b0e-4d55-9a2f-3c8e1d47b902")print(result.status) # ARCHIVED or TENURE_NOT_METBei 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.
social.connections.link
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.
client.social.connections.link( brand_id: str, *, channel: str, redirect_url: str, error_url: str | None = None, state: str | None = None,) -> APIObjectlink = 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.
client.social.connections.list(brand_id: str) -> APIObjectresult = 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.
client.social.connections.disconnect(social_profile_connected_channel_id: str) -> APIObjectclient.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.
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,) -> APIObjectaction="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.
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.
client.social.posts.retrieve(post_id: str) -> APIObjectpost = 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.
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,) -> APIObjectfilters akzeptiert name, platforms, status, start_date, end_date, social_connected_channel_id, approval_state, view_mode und filter_by_user.
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.
client.social.posts.cancel(social_post_id: str) -> APIObjectclient.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.
client.social.posts.insights( post_id: str, *, social_connected_channel_id: str,) -> APIObjectimport 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.
client.social.bulk.create( posts: list[dict], *, name: str | None = None,) -> APIObjectJede 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.
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.idsocial.bulk.retrieve
Fragen Sie einen Sammelauftrag wiederholt ab, bis er einen Endstatus erreicht.
client.social.bulk.retrieve(bulk_job_id: str) -> APIObjectjob = 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.
client.social.limits() -> APIObjectlimits = client.social.limits()print(limits.maxConnections, limits.usage.connections) # pool vs usedprint(limits.brands) # None — brands are unlimitedprint(limits.usage.brands) # brands that exist, uncappedVerbindungen 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
- Tarife und Zusatzoptionen: Tarifstufen, Preise für Zusatzoptionen, der Verbindungspool und die 90-Tage-Laufzeitregel
- Social-REST-Referenz: die zugrunde liegenden Endpunkte, die diese Methoden kapseln
- Beiträge: das Produkt auf Standortebene mit einem separaten Abonnement
- Fehlerbehandlung: typisierte Ausnahmen und das Flag
success