Platforms / LinkedIn

LivePlatform integration

Ship Your Integration
In Minutes, Not Weeks.

LinkedIn sunset five API versions in six months from 2024–25, breaking n8n, Zapier, Make, and every Postiz install. letmepost pins the version header, tracks deprecations, upgrades internally — your code keeps working when LinkedIn ships a breaking change at 2 a.m.

Live · personal posting · read the docs →

POST /v1/posts
{
  "targets": [{ "platform": "linkedin" }],
  "accountId": "acc_li_xyz",
  "text": "Shipped via letmepost. Version-pinned.",
  "options": { "visibility": "PUBLIC" }
}

Why letmepost vs LinkedIn REST direct?

LinkedIn Direct

  • You track version sunsets weekly (5 in 6 months in 2024–25)
  • You implement URN encoding for every share (urn:li:share:...)
  • You apply for Marketing Developer Platform (12-week review)
  • You hand-roll the audit-state error parser
  • You manage org-vs-personal posting branches
  • You handle MDP-gated permissions on every endpoint

letmepost API

  • Version header pinned in one config value; we own deprecations
  • version.deprecated webhook fires before sunset
  • URN encoding handled, error envelope normalized
  • Personal posting live through our reviewed app; nothing to file
  • Personal posts live now; org posting is the next slice
  • Audit-state errors mapped to stable preflight rules

⚠ Five API versions sunset in six months

LinkedIn shipped breaking version changes 5 times in 6 months from late 2024 through mid 2025. Every existing integration (Postiz, n8n, Zapier, Make, Pabbly) broke. letmepost users got version.deprecated webhooks days ahead and zero downtime.

Playground

Connect, configure, post.

▸ Connect▸ Configure▸ Execute

OAuth on linkedin.com. Personal posts publish today through our reviewed app. Company-Page posting needs w_organization_social and is not supported yet — preflight rejects org URNs with a named rule rather than a vague 403.

CONNECT LINKEDIN →
✓Live.PERSONAL POSTING · LIVE

Content types

Every LinkedIn surface, one shape.

Share post· 3,000 graphemes
Image
Video· MP4
Personal vs Org
Scheduled

How it works

Three steps, under two minutes.

Get your API key

Sign up at dashboard.letmepost.dev.

Connect a LinkedIn account

OAuth on linkedin.com. We request the minimum scope set. Token + refresh stored encrypted.

Publish a share

One POST /v1/posts with platform: "linkedin". Personal commentary publishes immediately.

Features

What we built so you don't.

Version pin + sunset tracking

We pin the version header in a single config. The version.deprecated webhook fires when LinkedIn announces a sunset, days before it lands.

URN encoding handled

urn:li:share:... formatting is one of LinkedIn's silent failure modes. We percent-encode correctly, fail loudly on malformed URNs.

MDP-aware error surface

If a token is missing an MDP permission, the error envelope says so — not a generic 403. Remediation hint points at the exact scope.

Personal now, org next

Personal commentary publishes today. Org posts hit the same endpoint but need w_organization_social; until that ships, preflight rejects an org URN with linkedin.author.org_not_supported instead of letting LinkedIn 403 you.

Code example

publish a share · typescript

publish-linkedin.ts
import { Letmepost } from '@letmepost/sdk';
const lmp = new Letmepost({ apiKey: process.env.LMP_API_KEY });

const result = await lmp.posts.create({
  targets: [{ platform: 'linkedin', accountId: 'acc_li_xyz' }],
  text: 'Just published a 3,000-grapheme deep-dive on API versioning.',
  options: {
    linkedin: {
      visibility: 'PUBLIC',
      // For org posts, add: organizationUrn: 'urn:li:organization:12345'
    },
  },
});

Common questions

about linkedin posting

Is LinkedIn live?

Yes, for personal posting — connect an account and publish today through our reviewed app. Company-Page posting needs the w_organization_social grant and is not supported yet.

What about the version churn?

We pin the version header in one config value. GET /v1/platform-versions shows the current pin. The version.deprecated webhook fires before sunset, with the next pin in the payload.

Can I post to a Company Page?

Not yet. organizationUrn is reserved in the schema, but preflight rejects org URNs with linkedin.author.org_not_supported today — on self-hosted instances too, since the gate is in our code rather than in the credentials.

What's URN encoding?

LinkedIn IDs look like urn:li:share:7234567890. The colons need percent-encoding in URLs (urn%3Ali%3Ashare%3A...). We handle this; the docs page has a counter tool.

Does my company need its own MDP grant?

Not for personal posting — that runs on our reviewed app and works today. Org-level publishing will need one.

One API · 8 platforms

LinkedIn is just one of them.

Learn more

Good to know

Notes from the integration.

Status

Live for personal posting through our reviewed app. Company-Page posting needs w_organization_social and is not supported yet.

Version pin

Single config value. Sunset notifications via version.deprecated webhook before deprecation lands.

Limits

3,000-grapheme commentary. Image + video share posts. Org-level reactions/comments out of v1.

URN encoding

LinkedIn IDs require percent-encoded URNs. We handle this; handled server-side.

Self-host

Self-host users register their own MDP entry. Note that Company-Page posting is gated in our code, not just by credentials — preflight rejects org URNs either way until the org slice ships.

READY FOR LINKEDIN PUBLISHING?

Personal commentary publishes today, version-pinned, through our reviewed app. One POST, and we own the sunsets.