Last updated: September 2026

Does the LinkedIn API support scheduling posts?

No. The LinkedIn posting API has no scheduled-publish field: a post sent to POST /rest/posts is published when the call is made. Every tool that schedules LinkedIn posts stores the post itself and makes that call at the chosen time. Doing it yourself means building the storage, a job runner and handling for tokens that expire after 60 days with no refresh token.

Below is what that build involves, why the token rule matters most for scheduled posts, and the one-call alternative with scheduled_date.

What you would build

LinkedIn gives you an endpoint that posts now. Everything that turns it into a schedule is yours.

Part
What it has to do
Storage
The text, the author URN, the due time in UTC, and the member access token with its expiry, stored encrypted.
Job runner
A process that wakes every minute, picks the posts that are due, calls POST /rest/posts, and records the post URN from the x-restli-id response header.
Retries
Try again on 429 and 5xx. Never retry once LinkedIn has accepted the post, even if the id header is missing, or it publishes twice.
Token expiry
Self-serve tokens last 60 days with no refresh token. Check the expiry before a post is due, hold posts whose token has run out, and ask the member to sign in again.
Version header
Every call carries a LinkedIn-Version like 202608. Each version lasts about a year, then returns 426 until you bump it.
Text escaping
Escape the reserved characters in commentary, or a parenthesis or bracket can cut the post off.

The last two rows have their own pages: the 426 NONEXISTENT_VERSION error and posts cut off at a parenthesis.

The job runner makes the call LinkedIn will not

At the due minute, the runner sends the same request you would send to post right away. There is nothing in it about time.

run-due-posts.js
for (const post of await duePosts()) {
  if (post.tokenExpiresAt <= Date.now()) {
    await holdAndAskToReconnect(post);
    continue;
  }

  const res = await fetch('https://api.linkedin.com/rest/posts', {
    method: 'POST',
    headers: {
      Authorization: 'Bearer ' + post.token,
      'LinkedIn-Version': '202608',
      'X-Restli-Protocol-Version': '2.0.0',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      author: post.authorUrn,
      commentary: escapeLittleText(post.text),
      visibility: 'PUBLIC',
      distribution: {
        feedDistribution: 'MAIN_FEED',
        targetEntities: [],
        thirdPartyDistributionChannels: [],
      },
      lifecycleState: 'PUBLISHED',
      isReshareDisabledByAuthor: false,
    }),
  });

  if (res.ok) {
    await markPublished(post, res.headers.get('x-restli-id'));
  } else {
    await recordFailure(post, res.status);
  }
}

duePosts, holdAndAskToReconnect and the rest are the parts you write and run: the database, the process that calls this every minute, and the email or notification that brings the member back.

The 60-day token is the hard part

Self-serve LinkedIn apps get 60-day access tokens and no refresh token, so nothing can renew a token in the background. A post scheduled more than 60 days after the member signed in cannot go out until they sign in again. Your scheduler has to notice before the post is due, not when the call fails. More in why the LinkedIn token expires after 60 days.

Or schedule it in one call

OpenTweet runs the queue, so scheduling a LinkedIn post is one request with a scheduled_date in ISO 8601.

bash
curl -X POST https://opentweet.io/api/v1/posts \
  -H "Authorization: Bearer ot_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Three things we changed after our first 100 customers.",
    "platforms": ["linkedin"],
    "scheduled_date": "2026-10-01T09:00:00Z"
  }'

The response returns the post with its id and scheduled_date. Once it has published, reading the post back from the API returns results[] with one entry per network, and the LinkedIn post_id is the post URN, such as urn:li:share:7300000000000000000.

  • Several networks at once. "platforms": ["x", "bluesky", "linkedin"] schedules the same post on all three.
  • A specific LinkedIn account. Pass linkedin_account_id when you have more than one connected. Pro connects 1 LinkedIn account, Advanced 3 and Agency 10.
  • From an AI agent. The hosted MCP server at https://mcp.opentweet.io/mcp does the same from Claude or any MCP client. See LinkedIn over MCP.

OpenTweet sets the version header, escapes the text and publishes at the scheduled time. When the 60-day LinkedIn sign-in runs out, scheduled LinkedIn posts are held and you get an email to reconnect, which is one click in Settings.

What to know before relying on it: LinkedIn posts go to your personal profile only, not Company Pages. Text is up to 3,000 characters counted in UTF-16 code units, so an emoji counts as 2. A thread goes out as one post. Video is not supported on LinkedIn yet, and there are no LinkedIn analytics. Hashtags and @mentions publish as plain text.

7-day free trial. Cancel anytime.

Frequently asked questions

Does the LinkedIn API support scheduling posts?

No. The LinkedIn posting API has no scheduled-publish field. A post sent to /rest/posts is published when the call is made, so scheduling means storing the post yourself and making that call at the chosen time.

Can I send LinkedIn a post with a future publish time?

No. There is no field for a publish time. Whatever time you want the post to appear is the time your own system has to call the API.

How do LinkedIn scheduling tools work, then?

Every one of them runs its own queue. The tool stores your post, and a job runner calls the LinkedIn posting endpoint at the scheduled minute with your access token.

What happens to a scheduled LinkedIn post when the access token expires?

It cannot be published until the member signs in again. Self-serve apps get 60-day access tokens and no refresh token, so nothing can renew the token in the background. In OpenTweet, scheduled LinkedIn posts are held and you get an email to reconnect, which is one click.

How do I schedule a LinkedIn post through the OpenTweet API?

Send POST https://opentweet.io/api/v1/posts with your ot_ key, "platforms": ["linkedin"] and an ISO 8601 "scheduled_date". OpenTweet stores it and publishes it to your LinkedIn profile at that time. Add "x" or "bluesky" to the platforms array to schedule the same post there too.

Schedule LinkedIn posts without running a queue

One API call with a scheduled_date. No LinkedIn app, no job runner. LinkedIn is on every plan from $11.99 a month.

7-day free trial. Cancel anytime.