Beiträge
Einen Beitrag veröffentlichen
Live-Apps veröffentlichen sofort, planen oder speichern einen Entwurf; Test-Apps simulieren nur. Mit ?dry_run=true wird alles geprüft und nichts geschrieben.
Ein Beitrag gehört zu einem Betrieb und geht an ein oder mehrere Netzwerke, seine Ziele. Jedes Ziel hat seinen eigenen Text, seine Medien, sein Format und seinen Zustand.
Beitragsart: sofort, geplant oder Entwurf
Zwei Felder des Bodys entscheiden, wann und ob der Beitrag rausgeht:
| Fall | Body | Verhalten |
|---|---|---|
| Sofort | ohne scheduledAt | Der Beitrag geht sofort raus. |
| Geplant | scheduledAt: ein zukünftiger ISO-8601-Zeitpunkt | Er geht zu scheduledAt raus. |
| Entwurf | "status": "draft", ohne scheduledAt | Er wird gespeichert und geht nicht raus. |
Der Body eines Beitrags
| Feld | Bedeutung |
|---|---|
establishmentId | Der Betrieb, der veröffentlicht (GET /v1/establishments) |
targets[] | Ein Eintrag pro Netzwerk: platform, text und optional media, format und accountId |
targets[].media[] | Ein Medium der Mediathek über seine id oder eine öffentliche https-url mit ihrem type (image oder video) |
targets[].accountId | Das zu verwendende Konto, wenn der Betrieb mehrere in diesem Netzwerk hat |
scheduledAt | Ein zukünftiger ISO-8601-Zeitpunkt; fehlt er, geht der Beitrag sofort raus |
status | draft, um einen Entwurf zu speichern, der nicht rausgeht (dann ohne scheduledAt) |
Medien eines Ziels
Jeder Eintrag von targets[].media bezeichnet ein Medium der Mediathek über seine id oder eine öffentliche https-url mit ihrem type (image oder video). Instagram und TikTok verlangen ein Foto oder ein Video. Um der Mediathek ein Medium hinzuzufügen, siehe Ein Medium importieren.
Einen Beitrag duplizieren
Es gibt keinen eigenen Endpoint zum Duplizieren eines Beitrags: Lies ihn mit `GET /v1/posts/{id}` und sende seinen Inhalt dann in einer neuen Anfrage POST /v1/posts zurück.
Entferne vor dem Zurücksenden die Felder, die Sofia selbst füllt. Mindestens:
idundcreatedAtdes Beitrags;statusdes gelesenen Beitrags (er fasst den Versandzustand zusammen): Setze den gewünschten oder lasse ihn weg;- in jedem Ziel:
state,publishedAt,permalinkunderror.
Behalte establishmentId und pro Ziel platform und accountId. Das Lesen liefert weder den Text der Ziele noch ihre Medien: Gib sie erneut an. Setze schließlich ein neues scheduledAt (oder lasse es weg, um sofort zu veröffentlichen, oder sende "status": "draft").
Dein erster Beitrag
1. Die verbundenen Netzwerke prüfen
Ein Beitrag geht über die mit dem Betrieb verbundenen Konten raus. Liste sie auf; fehlt eines, erstelle einen Verbindungslink. Siehe Verbundene Konten.
2. Ein Medium hinzufügen
Instagram und TikTok verlangen ein Foto oder ein Video. Importiere eines von einer öffentlichen https-URL; Sofia lädt es in die Mediathek und liefert seine id zurück. Siehe Ein Medium importieren.
3. Mit einer Simulation prüfen
Füge ?dry_run=true hinzu: Sofia beurteilt jedes Netzwerk nach seinen echten Regeln und dem verbundenen Konto und schreibt nichts.
curl -X POST 'https://api.sofia-post.com/api/v1/posts?dry_run=true' \
-H "Authorization: Bearer $SOFIA_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"establishmentId": "'$ESTABLISHMENT_ID'",
"targets": [
{ "platform": "instagram", "text": "Tarte tatin du jour", "media": [{ "id": "'$MEDIA_ID'" }] },
{ "platform": "facebook", "text": "Tarte tatin du jour", "media": [{ "id": "'$MEDIA_ID'" }] }
]
}'{
"status": "ready",
"dryRun": true,
"targets": [
{ "platform": "instagram", "accountId": "fecd0904-…", "handle": "sof_ia_officiel", "state": "ready" },
{ "platform": "facebook", "accountId": "a423b3a4-…", "handle": "Sofia post", "state": "ready" }
]
}4. Veröffentlichen
Sende denselben Body ohne dry_run, mit einem Idempotency-Key, damit ein erneuter Versuch nie doppelt veröffentlicht. Ohne scheduledAt geht der Beitrag sofort raus; mit einem zukünftigen scheduledAt wird er geplant.
curl -X POST https://api.sofia-post.com/api/v1/posts \
-H "Authorization: Bearer $SOFIA_API_KEY" \
-H 'Content-Type: application/json' \
-H "Idempotency-Key: $(uuidgen)" \
-d @post.json5. Ihn verfolgen
Der Beitrag antwortet publishing, dann wechselt jedes Netzwerk zu published mit seinem Permalink oder zu failed mit seinem Grund. Lies ihn mit `GET /v1/posts/{id}` oder registriere einen Webhook, um benachrichtigt zu werden.
Simulation (Dry Run)
POST /v1/posts?dry_run=true führt die Prüfungen eines echten Beitrags aus: die Regeln jedes Netzwerks, das verbundene Konto, die Medien, das Datum und deinen Tarif. Es speichert nichts und sendet nichts.
Bereit
Würde jedes Netzwerk den Beitrag akzeptieren, ist die Antwort 200 mit status: "ready" und für jedes Ziel dem Konto, das veröffentlichen würde.
Abgelehnt
Andernfalls ist die Antwort 422 post_refused, mit einem Detail pro Grund. Jedes Detail nennt sein Netzwerk, seinen code und sagt, was zu korrigieren ist.
{
"error": {
"code": "post_refused",
"message": "The post would not be published: x: the text is too long (300 characters, at most 280)",
"details": [
{
"platform": "x",
"code": "caption_too_long",
"max": 280,
"actual": 300,
"message": "x: the text is too long (300 characters, at most 280)"
}
],
"docUrl": "https://www.sofia-post.com/developers/errors#post_refused"
}
}Jeder Grund ist bei den Fehlern aufgelistet.
Zum Testmodus der Anwendungen siehe Testmodus und Simulation. Ein Idempotency-Key schützt auch POST /v1/posts: siehe Idempotenz.
Autorisierungen
AuthorizationstringheadererforderlichIhr persönlicher Schlüssel oder OAuth-Access-Token, gesendet als
Bearer <token>.
Abfrageparameter
dry_runstringtrue: führt jede Prüfung des Versands aus (Netzwerkregeln, Konten, Medien, Erstellung, Live-Abonnement) und schreibt nichts. Liefert 200readyoder 422post_refused.Zulässige Werte:
truefalse
Header
Idempotency-KeystringMit demselben Body wiederholt, liefert die Anfrage dieselbe Antwort, ohne einen zweiten Beitrag zu erstellen. Ein Probelauf verbraucht den Schlüssel nicht.
Body
establishmentIdstringerforderlichBetrieb, im Workspace der Autorisierung des Tokens (
GET /v1/establishments)targetsobject[]erforderlichEin Netzwerk pro Ziel
Untergeordnete Attribute anzeigen
platformstringerforderlichZiel-Netzwerk
Zulässige Werte:
instagramfacebookxlinkedintiktoktextstringerforderlichIn diesem Netzwerk veröffentlichte Bildunterschrift
mediaobject[]Angehängte Medien
Untergeordnete Attribute anzeigen
idstringKennung eines Mediums der Mediathek des Betriebs (sonst
urlundtype)urlstringÖffentliche Adresse des Mediums (live https); ohne Kennung
typestringArt des per Adresse angegebenen Mediums
Zulässige Werte:
imagevideo
formatstringFormat (
post,reel,story,carousel...); standardmäßig das, das das Netzwerk liefern würdeaccountIdstringLive: das verbundene Konto, das veröffentlicht, wenn der Betrieb mehrere in diesem Netzwerk hat (
GET /v1/establishments/:id/accounts)
scheduledAtstring<date-time>Planungsdatum (ISO 8601), in der Zukunft; fehlt es: sofort veröffentlichen. Nicht erlaubt mit
statusdraftstatusstringdraft: ein Entwurf (nur live), ohne Datum erstellt, nichts wird gesendet;PATCH /v1/posts/:idplant ihnZulässige Werte:
draft
Antwort
Probelauf: Alle Prüfungen bestanden.
statusstringerforderlichImmer
readyZulässige Werte:
readydryRunbooleanerforderlichImmer
trueZulässige Werte:
truetargetsobject[]erforderlichDie geprüften Ziele
Untergeordnete Attribute anzeigen
platformstringerforderlichNetzwerk des Ziels
statestringerforderlichImmer
readyZulässige Werte:
readyaccountIdstringLive: das Konto, das veröffentlichen würde
handlestringLive: sein angezeigtes Handle