
LinkedIn charges nothing per API call, but posting to a company page takes its approval. Posting to your own profile is self-serve. Company pages need the Community Management API, which LinkedIn grants only to registered companies after a review, and which starts with a cap of 500 calls a day for the whole app.
How much does the LinkedIn API cost?
Nothing per call. LinkedIn's developer documentation describes access tiers and reviews, with no price list and no paid plan that buys more. What you do pay is a review before you can post to a company page, a daily cap while you are in the first tier, and upkeep: the API version you send expires, and so does every connection, once a year.
There are three ways in:
| Product | Where it posts | How you get it | Daily limit |
|---|---|---|---|
| Share on LinkedIn | Your own profile (w_member_social) |
Self-serve: add the product to your app in the Developer Portal | 150 requests per member, 100,000 per app |
| Community Management API, Development tier | Company pages and profiles | An access form that LinkedIn reviews | 500 calls per app and 100 per member, every 24 hours |
| Community Management API, Standard tier | The same, in production | A second form, with a screencast of your app | No restrictions |
Figures from LinkedIn's Increasing Access and Share on LinkedIn pages, read on October 6, 2026.
Can you use the LinkedIn API for personal use?
Only to post as yourself. Share on LinkedIn gives any app the w_member_social permission without a review, and that is enough to publish to the profile of whoever authorizes it. For a script that posts your own updates, that is the route.
Company pages are another matter. LinkedIn's review page says "our Community Management APIs are only available to registered legal organizations for commercial use cases only", and personal email addresses won't pass the vetting, so a side project has no way to post to a company page.
Share on LinkedIn's documentation still shows the old /v2/ugcPosts endpoint, while the current Posts API at /rest/posts "replaces the ugcPosts API", in LinkedIn's own words. Write against /rest/posts from the first day and there is nothing to migrate when you move up a tier.
How do you get access to post on a LinkedIn company page?
You apply for the Community Management API from your app in the Developer Portal. For the Development tier, LinkedIn checks five things: an approved use case, a verified business email, a verified organization, a verified website and domain, and that the LinkedIn Page of that same organization has verified the app, which takes one of the Page's super admins.
Three of its rules change how you plan:
- A rejection is final for that app. In LinkedIn's words: "You won't be able to re-apply for Development tier access with your existing app." You create a new app and start over.
- The Development tier has a deadline: you have twelve months to apply for Standard, and after that LinkedIn removes your access for inactivity.
- The 500 calls a day are for the whole app, shared by all your customers. In our SDK, a post with one image takes four requests: start the upload, send the bytes, read the image back and create the post. Statistics and comments come on top. Batch reads (
BATCH_GET) are blocked, and webhooks for social actions stay off until Standard.
The Standard tier asks for more: test credentials, a high-resolution screencast that shows a user going through the full OAuth flow and each use case you declared (for page management, a post and how a comment on it shows up in your app), a valid privacy policy, and compliance with LinkedIn's data storage rules.
Why does the LinkedIn API return 426?
Because the Linkedin-Version header asks for a version that LinkedIn has retired. The response is documented like this:
{
"status": 426,
"code": "NONEXISTENT_VERSION",
"message": "Requested version yyyymmdd is not active"
}
LinkedIn publishes a version every month, in YYYYMM format, and supports each one for at least a year. Leaving the header out does not get you the latest one: LinkedIn documents a 400 with the code VERSION_MISSING. The oldest version still in the documentation, 202510, is sunset on October 15, 2026, and a header pinned to 202501, from January 2025, already gets the 426.
The fix is to send a live version. In our SDK it lives in one constant:
// src/orm/social_apis/linkedin/constant/index.ts
LINKEDIN_API_VERSION: "202606",
// and every request carries the same three headers
{ Authorization: "Bearer " + access_token, "Linkedin-Version": LINKEDIN_API_VERSION, "X-Restli-Protocol-Version": "2.0.0" }
Keep the version in a single constant, note the date it expires in a shared calendar, and run at least one test against the real API: a test with mocked responses keeps passing after the version is retired.
Why is your LinkedIn post cut off with no error?
Because the body of the post is not plain text. The commentary field of /rest/posts is written in little text, a small format for mentions and hashtags with fifteen reserved characters, and the documentation is explicit: "All reserved characters need to be escaped with a backslash, even if those characters are not used in one of the supported elements or templates."
If you don't escape them, LinkedIn still answers 201 with the post id, and the post shows up cut off at the first unescaped character. A price in brackets, "(30€ + VAT)", is enough to take the rest of the post with it, links included. Nothing in the response or in your logs shows it; you only see it on LinkedIn.
// src/orm/social_apis/linkedin/Text.ts
const RESERVED_PATTERN = /[\\|{}@\[\]()<>#*_~]/g;
The escaping has to be a single pass, because the backslash is reserved too: escape it in a second step and the \( you just added gets published as \\(. And a # that opens a real hashtag must stay as it is, or the hashtag is published as dead text. A #1 that is just a number gets escaped like everything else.
The post has two size limits as well. The body takes up to 3,000 characters. The title of an attached image or video, content.media.title, takes 400, and past that LinkedIn answers 422 with length of "..." is out of range 0...400. That title is not little text, so it is not escaped: escaping it would publish the backslashes.
How long does a LinkedIn access token last?
60 days. Apps approved for LinkedIn's marketing programs also get a refresh token that lasts 365 days, and the documentation is clear that using it does not extend it. Renew on day 59 and the refresh token has 306 days left; when it reaches zero, "the member must reauthorize your application". So every LinkedIn connection ends after a year, however well your renewal works. Apps without that approval get no refresh token at all, and the user has to go through the authorization screen every 60 days.
The token belongs to the person who authorized the app, and it covers their profile and every page they administer. If you store one row per page, renew per person and write the new token to every page that came from that authorization.
When a connection ends, handle it as the Meta token article describes: show the account as disconnected and ask the user to connect it again.
Do you need your own LinkedIn app if you integrate through PlanVortex?
No. Your customers connect their LinkedIn pages, and their personal profiles too, through PlanVortex's app, which has the Community Management API at the Standard tier, so the Development tier's cap of 500 calls a day does not apply to them. The access form, the screencast and the version header are our job. Two things stay on your side: the person authorizes again when LinkedIn asks for it, and your product finds out through the signed change_state_account webhook as soon as a renewal fails.
The developers page shows the API, the Node and Python libraries and the MCP server that sit on top of that app. With the MCP server, Claude or Cursor can post to LinkedIn for you, to your profile and your pages.
If you only want to post to your own company pages or your own profile, you don't need to write code at all: the panel does it, and the first three accounts are free. On paid plans, its AI planner also writes the week's posts, with images or from your own photos.
It isn't the right tool if what you need is LinkedIn advertising. Campaigns and ad accounts live in the Advertising API, a separate product with its own review.
Where do you go from here?
- Publishing from Node.js and from Python: connect a customer's LinkedIn page and publish to it, webhook verification included.
- Character limits across social APIs: which unit each network counts in, LinkedIn included.
- A LinkedIn MCP server on the official API: post to your profile and pages from Claude, Cursor or VS Code.
Top comments (0)