Isolated per profile
An API key belongs to exactly one LinkedIn profile. It sees and changes that profile’s data only — never anyone else’s.
A clean REST interface across the whole content pipeline: create, schedule and publish posts, read analytics, receive webhooks. JSON in, JSON out.
API & MCP access is included in every plan.
An API key belongs to exactly one LinkedIn profile. It sees and changes that profile’s data only — never anyone else’s.
Predictable resources under /api/v1, cursor pagination, a uniform error envelope and idempotency keys.
Long-running steps (image, publish) answer with 202 — you poll the status or receive a signed webhook.
In the dashboard under Settings → Integrations, create an API key. It is shown only once — store it safely.
Send every request with the header Authorization: Bearer lps_…
Use GET /me to check which profile your key is connected to — then posts, ideas, analytics.
curl https://app.tidefall.de/api/v1/me \
-H "Authorization: Bearer lps_your_key" {
"member": {
"id": "371707cb-…",
"display_name": "Jane Doe",
"linkedin_connected": true
}
} Grouped by resource. For schemas, examples and “Try it”, head to the interactive reference.
The complete lifecycle — from draft to publication on 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 Find content ideas, research them and turn them into drafts.
/ideas /ideas/generate /ideas/research 202 /ideas/{id}/create-post /ideas/{id} /ideas/{id}/dismiss /ideas/{id}/restore Measure performance and check which profile your key is connected to.
/analytics /me /health Get notified instead of polling — signed and with retries.
/webhooks /webhooks /webhooks/{id} /webhooks/{id} /webhooks/{id}/deliveries The same key also works as an MCP server for Claude Desktop, Cursor & co. — research, write a post, create an image/video/carousel, schedule or publish, right from the chat.
In the dashboard under Account → Developer, create a key.
Add it as an MCP server in Claude Desktop / Cursor (see the config on the right).
All tools appear in the client’s tool menu — the list there is always up to date.
Content ideas · research · post drafts · images/video/carousels · scheduling & publishing · analytics — the full, always up-to-date tool list is in the MCP reference.
{
"mcpServers": {
"linkedin-posting-system": {
"url": "https://app.tidefall.de/api/mcp",
"headers": { "Authorization": "Bearer lps_your_key" }
}
}
} Image generation and publishing run in the background. The call replies immediately with 202 Accepted.
You then poll GET /posts/{id} — or have a webhook notify you.
post.published A post was published on LinkedIn. post.publish_failed A publication failed for good. post.images_ready Image candidates have finished generating. idea.created New ideas were created. Every delivery carries an HMAC signature over the raw body — that’s how you verify it really comes from us:
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");
// compare timing-safe with X-LPS-Signature Every error arrives in the same envelope — the code is the contract, the message is a hint.
{
"error": {
"code": "validation_error",
"message": "Invalid request body",
"details": { "idea": "required" }
}
} Per key, per endpoint bucket. Every response carries X-RateLimit-Limit,
-Remaining and -Reset.
When exceeded: 429.
| Code | HTTP | When |
|---|---|---|
unauthorized | 401 | Key is missing, invalid or revoked. |
not_found | 404 | Object does not exist — or does not belong to your profile. |
validation_error | 422 | Body/query invalid (details per field). |
conflict | 409 | State does not allow it (e.g. already published). |
rate_limited | 429 | Key limit reached — try again later. |
internal_error | 500 | Unexpected server error. |
Open the interactive reference and try every endpoint right in the browser — or grab the machine-readable spec as OpenAPI 3.1.