Quick reference
| Limit / capability | Value |
|---|---|
| Character limit | 3,000 graphemes (emoji-aware) |
| Author URN format | urn:li:person:{id} (org URNs gated behind MDP) |
| Visibility | PUBLIC or CONNECTIONS |
| Post types supported | text |
| Images / video / document | Not supported in v1 (media slice TBD) |
| Scheduling | Yes (via scheduledAt) |
| Reply / thread support | Not supported in v1 |
| First comment | Not supported in v1 |
| Inbox / DM | Not supported in v1 |
| Analytics | Not supported in v1 |
Connect an account
POST /v1/accounts/connect/linkedin. OAuth 2.0, three-legged. After the callback the provider calls /v2/userinfo to mint a stable urn:li:person:{id} author URN, stored on tokenMetadata.authorUrn. That URN is what posts.author carries on every publish.
Scopes
| scope | requested |
|---|---|
w_member_social | always — required to post on a personal account. |
openid, profile | always — needed to mint the URN via /v2/userinfo. |
email | extended only. |
r_organization_social, w_organization_social | extended only — gated behind MDP approval. |
extended org scopes are off by default and any attempt to post against an org URN fails preflight.
Version pinning
LinkedIn sunset five API versions in six months from 2024 – 2025. letmepost pins a single version on theLinkedin-Version header and upgrades internally; the public version tracker (GET /v1/platform-versions) shows the current pin and any in-flight migration. When LinkedIn announces a sunset, version.deprecated fires on the affected accounts.
Token lifecycle
LinkedIn tokens last 60 days with no refresh — re-auth is mandatory at expiry. letmepost firestoken.expiring seven days ahead so you can prompt the user.
Post types
Text post
text.json
Wisdom (platform-specific things that bite)
Common errors
| Error rule | What it means | How to fix |
|---|---|---|
linkedin.text.non_empty | Empty post body | Provide non-whitespace text. |
linkedin.text.max_graphemes | Body > 3,000 graphemes | Trim under 3,000. |
linkedin.author.urn_format | Author URN doesn’t match urn:li:person:* or urn:li:organization:* | Use the URN persisted at connect (the publisher does this for you). |
linkedin.author.org_not_supported | Tried to publish under an urn:li:organization:* URN | Use a person URN. Org posting requires MDP approval and lands in a follow-up slice. |
linkedin.author.unresolved | Account row missing the cached author URN | Disconnect and reconnect — the URN is minted at connect from /v2/userinfo. |
linkedin.visibility.enum | Visibility wasn’t PUBLIC or CONNECTIONS | Pass one of those two values, or omit (defaults to PUBLIC). |
What you can’t do (yet)
- Organization / Company Page posts (requires MDP).
- Image, video, multi-image, or document posts (media slice deferred).
- Polls.
- First comment / threaded replies as the author.
- Mentions of other LinkedIn members (requires the v2 entity resolution surface).
- Reading post engagement, comments, or impressions.
- Scheduling via LinkedIn’s own scheduled-post API —
scheduledAtruns in letmepost’s queue instead.
API reference
POST /v1/posts— primary publish.POST /v1/accounts/connect/linkedin— start a LinkedIn OAuth flow.GET /v1/platform-versions— current pinned LinkedIn API version + migration state.

