Pro Profil isoliert
Ein API-Key gehört zu genau einem LinkedIn-Profil. Er sieht und ändert ausschließlich dessen Daten — niemals die eines anderen.
Eine saubere REST-Schnittstelle über die gesamte Content-Pipeline: Posts erzeugen, planen, veröffentlichen, Analytics lesen, Webhooks empfangen. JSON rein, JSON raus.
Ein API-Key gehört zu genau einem LinkedIn-Profil. Er sieht und ändert ausschließlich dessen Daten — niemals die eines anderen.
Vorhersehbare Ressourcen unter /api/v1, Cursor-Pagination, einheitliches Fehler-Envelope und Idempotency-Keys.
Lang laufende Schritte (Bild, Publish) antworten mit 202 — du pollst den Status oder bekommst einen signierten Webhook.
Im Dashboard unter Settings → Integrations einen API-Key erzeugen. Er wird einmalig angezeigt — sicher ablegen.
Jeden Request mit dem Header Authorization: Bearer lps_… senden.
Mit GET /me prüfen, mit welchem Profil dein Key verbunden ist — dann Posts, Ideen, Analytics.
curl https://app.tidefall.de/api/v1/me \
-H "Authorization: Bearer lps_dein_key" {
"member": {
"id": "371707cb-…",
"display_name": "Luca Ceglie",
"linkedin_connected": true
}
} Gruppiert nach Ressource. Für Schemas, Beispiele und „Try it" geht es in die interaktive Referenz.
Der komplette Lebenszyklus — vom Entwurf bis zur Veröffentlichung auf LinkedIn.
/posts /posts /posts/{id} /posts/{id} /posts/{id} /posts/{id}/regenerate /posts/{id}/images 202 /posts/{id}/images/upload /posts/{id}/select-image /posts/{id}/schedule /posts/{id}/publish 202 /posts/{id}/analytics Content-Ideen finden, recherchieren und in Entwürfe verwandeln.
/ideas /ideas/generate /ideas/research 202 /ideas/{id}/create-post /ideas/{id} /ideas/{id}/dismiss /ideas/{id}/restore Leistung messen und prüfen, mit welchem Profil dein Key verbunden ist.
/analytics /me /health Lass dich benachrichtigen, statt zu pollen — signiert und mit Retries.
/webhooks /webhooks /webhooks/{id} /webhooks/{id} /webhooks/{id}/deliveries
Bild-Generierung und Veröffentlichung laufen im Hintergrund. Der Call antwortet
sofort mit 202 Accepted.
Du pollst danach GET /posts/{id}
— oder lässt dich per Webhook benachrichtigen.
post.published Ein Post wurde auf LinkedIn veröffentlicht. post.publish_failed Eine Veröffentlichung ist endgültig fehlgeschlagen. post.images_ready Bild-Kandidaten sind fertig generiert. idea.created Neue Ideen wurden erzeugt. Jede Zustellung trägt eine HMAC-Signatur über den Rohbody — so verifizierst du, dass sie wirklich von uns stammt:
X-LPS-Event: post.published
X-LPS-Delivery-Id: 9f2c…
X-LPS-Signature: sha256=<hmac(secret, rawBody)> const sig = "sha256=" + crypto
.createHmac("sha256", secret)
.update(rawBody)
.digest("hex");
// timing-safe vergleichen mit X-LPS-Signature
Jeder Fehler kommt im selben Envelope — der code
ist der Vertrag, die message ein Hinweis.
{
"error": {
"code": "validation_error",
"message": "Invalid request body",
"details": { "idea": "required" }
}
}
Pro Key, pro Endpoint-Bucket. Jede Antwort trägt
X-RateLimit-Limit,
-Remaining und
-Reset.
Bei Überschreitung: 429.
| Code | HTTP | Wann |
|---|---|---|
unauthorized | 401 | Key fehlt, ist ungültig oder widerrufen. |
not_found | 404 | Objekt existiert nicht — oder gehört nicht zu deinem Profil. |
validation_error | 422 | Body/Query ungültig (Details pro Feld). |
conflict | 409 | Zustand passt nicht (z. B. bereits veröffentlicht). |
rate_limited | 429 | Limit des Keys erreicht — später erneut. |
internal_error | 500 | Unerwarteter Serverfehler. |
Öffne die interaktive Referenz, probiere jeden Endpoint direkt im Browser — oder hol dir die Maschinen-Spec als OpenAPI 3.1.