Developer API · v1

Your LinkedIn, via API, now programmable.

A clean REST interface across the whole content pipeline: create, schedule and publish posts, read analytics, receive webhooks. JSON in, JSON out.

Base https://app.tidefall.de/api/v1

API & MCP access is included in every plan.

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.

REST · JSON · versioned

Predictable resources under /api/v1, cursor pagination, a uniform error envelope and idempotency keys.

Async, honestly

Long-running steps (image, publish) answer with 202 — you poll the status or receive a signed webhook.

Quickstart

Your first call in two minutes.

  1. 1
    Create a key

    In the dashboard under Settings → Integrations, create an API key. It is shown only once — store it safely.

  2. 2
    Authenticate

    Send every request with the header Authorization: Bearer lps_…

  3. 3
    Get going

    Use GET /me to check which profile your key is connected to — then posts, ideas, analytics.

request
curl https://app.tidefall.de/api/v1/me \
  -H "Authorization: Bearer lps_your_key"
200 · response
{
  "member": {
    "id": "371707cb-…",
    "display_name": "Jane Doe",
    "linkedin_connected": true
  }
}
Reference

All endpoints at a glance.

Grouped by resource. For schemas, examples and “Try it”, head to the interactive reference.

Posts

12 endpoints

The complete lifecycle — from draft to publication on LinkedIn.

  • POST /posts
  • GET /posts
  • GET /posts/{id}
  • PATCH /posts/{id}
  • DELETE /posts/{id}
  • POST /posts/{id}/regenerate
  • POST /posts/{id}/images
  • POST /posts/{id}/images/upload
  • POST /posts/{id}/select-image
  • POST /posts/{id}/schedule
  • POST /posts/{id}/publish
  • GET /posts/{id}/analytics

Ideas

7 endpoints

Find content ideas, research them and turn them into drafts.

  • GET /ideas
  • POST /ideas/generate
  • POST /ideas/research
  • POST /ideas/{id}/create-post
  • PATCH /ideas/{id}
  • POST /ideas/{id}/dismiss
  • POST /ideas/{id}/restore

Analytics & account

3 endpoints

Measure performance and check which profile your key is connected to.

  • GET /analytics
  • GET /me
  • GET /health

Webhooks

5 endpoints

Get notified instead of polling — signed and with retries.

  • GET /webhooks
  • POST /webhooks
  • GET /webhooks/{id}
  • DELETE /webhooks/{id}
  • GET /webhooks/{id}/deliveries
MCP

Or just talk to Claude.

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.

  1. 1
    Create a key

    In the dashboard under Account → Developer, create a key.

  2. 2
    Configure the client

    Add it as an MCP server in Claude Desktop / Cursor (see the config on the right).

  3. 3
    Restart

    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.

claude_desktop_config.json
{
  "mcpServers": {
    "linkedin-posting-system": {
      "url": "https://app.tidefall.de/api/mcp",
      "headers": { "Authorization": "Bearer lps_your_key" }
    }
  }
}
Async & webhooks

First the job, then the signal.

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:

POST → your endpoint · headers
X-LPS-Event: post.published
X-LPS-Delivery-Id: 9f2c…
X-LPS-Signature: sha256=<hmac(secret, rawBody)>
Verification · Node
const sig = "sha256=" + crypto
  .createHmac("sha256", secret)
  .update(rawBody)
  .digest("hex");
// compare timing-safe with X-LPS-Signature
Errors

One error, one format.

Every error arrives in the same envelope — the code is the contract, the message is a hint.

422 · response
{
  "error": {
    "code": "validation_error",
    "message": "Invalid request body",
    "details": { "idea": "required" }
  }
}
Rate limits

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.

Ready to build?

Open the interactive reference and try every endpoint right in the browser — or grab the machine-readable spec as OpenAPI 3.1.