Last updated: September 2026

Why does the LinkedIn API return 426 NONEXISTENT_VERSION?

Because the LinkedIn-Version header on your request names a monthly API version that LinkedIn does not serve: either it is retired, or it has not been released yet. Versions are written YYYYMM, a new one ships every month, and each is supported for about a year. Send a recent released month and the same request goes through.

Below is the error shape, how to pick a version that works, a fix in curl and in JavaScript, and why n8n, Composio and Activepieces users run into this on a day they changed nothing.

What the error looks like

This is the body from the public n8n reports, returned for a post request that sent a retired version.

response
HTTP/1.1 426 Upgrade Required

{
  "status": 426,
  "code": "NONEXISTENT_VERSION",
  "message": "Requested version 20240401 is not active"
}

In those reports the message prints the version with a day on the end, so 20240401 is the 202404 version. What the header is set to decides the outcome:

LinkedIn-Version sent
Result
A recent month LinkedIn has released, such as 202608
Accepted
A month older than about a year
426 NONEXISTENT_VERSION
A month LinkedIn has not released yet
426 NONEXISTENT_VERSION
No LinkedIn-Version header
400 VERSION_MISSING

How to pick a version that works

LinkedIn has no latest alias to point at, so you choose a month and pin it.

  • Use a recent month that is already out. As of September 2026, 202608 works. It is the version OpenTweet sends to /rest/posts and /rest/images, verified live on 2026-09-15.
  • Do not compute this month at runtime. A version from a month LinkedIn has not released yet returns the same 426 as a retired one, so generating the header from the clock can fail on its own.
  • Keep it in config, not in code. An environment variable with a pinned default means the next bump is a config change, not a release.
  • Put the bump on a calendar. With a support window of about 12 months, a version pinned today needs replacing within the year. Bumping it every six months keeps a wide margin.

Read the changes before you bump

A newer version can change request or response shapes, not just the header. Move to it in a test call first, then roll it out.

The fix, in curl and JavaScript

A post to your own profile on the versioned endpoint. Both headers below are required: without LinkedIn-Version you get 400 VERSION_MISSING.

bash
curl -i -X POST https://api.linkedin.com/rest/posts \
  -H "Authorization: Bearer $LINKEDIN_TOKEN" \
  -H "LinkedIn-Version: 202608" \
  -H "X-Restli-Protocol-Version: 2.0.0" \
  -H "Content-Type: application/json" \
  -d '{
    "author": "urn:li:person:YOUR_MEMBER_ID",
    "commentary": "Shipping notes for this week.",
    "visibility": "PUBLIC",
    "distribution": {
      "feedDistribution": "MAIN_FEED",
      "targetEntities": [],
      "thirdPartyDistributionChannels": []
    },
    "lifecycleState": "PUBLISHED",
    "isReshareDisabledByAuthor": false
  }'

The same call from Node or the browser, with the version read from config so the next bump does not touch code. A successful post returns its URN in the x-restli-id response header.

post.js
const LINKEDIN_VERSION = process.env.LINKEDIN_API_VERSION || '202608';

const res = await fetch('https://api.linkedin.com/rest/posts', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer ' + token,
    'LinkedIn-Version': LINKEDIN_VERSION,
    'X-Restli-Protocol-Version': '2.0.0',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    author: 'urn:li:person:' + memberId,
    commentary: 'Shipping notes for this week.',
    visibility: 'PUBLIC',
    distribution: {
      feedDistribution: 'MAIN_FEED',
      targetEntities: [],
      thirdPartyDistributionChannels: [],
    },
    lifecycleState: 'PUBLISHED',
    isReshareDisabledByAuthor: false,
  }),
});

if (res.status === 426) {
  throw new Error('LinkedIn-Version ' + LINKEDIN_VERSION + ' is retired or not released yet');
}

const postUrn = res.headers.get('x-restli-id');

If your text contains parentheses, brackets, # or @, escape it before it goes into commentary, or the post can be cut short. That is covered in why a LinkedIn API post gets cut off at a parenthesis.

If you use n8n, Composio or Activepieces

You did not write the header, so you cannot fix it in your workflow. These integrations send a LinkedIn-Version chosen by the integration, and when LinkedIn retires that version, every workflow using it breaks on the same day. The public reports follow the one-year window: version 202404 failed in April 2025, and 202504 failed in April 2026.

n8n

The LinkedIn node sets LinkedIn-Version as a fixed string in its source (202604 on master as of September 2026). Issues #14670 and #14737 (April 2025) report 426 with version 20240401, and #28660 (April 2026) reports it again with 20250401, closed as a duplicate of #28559.

Composio

Issues #3113 and #3468 on ComposioHQ/composio report the LinkedIn create-post tool returning 426 with version 20241101. Composio documents the fix as calling the LinkedIn toolkit at its latest version rather than an older pinned one.

Activepieces

The LinkedIn piece sets LinkedIn-Version as a fixed string in its source (202511 as of September 2026), and the Activepieces community forum has a known-issues thread for the 426 NONEXISTENT_VERSION error.

What to do. Update to a release of the integration that ships a newer version, or on Composio call the toolkit at its latest version. If you cannot wait for a release, send the request from a generic HTTP step where you set the LinkedIn-Version header yourself, using the fields shown above.

Expect it again. A fixed version in someone else’s code has the same one-year clock. The n8n node pinned 202604 in 2026, which by the usual window stops working around April 2027 unless it is bumped first.

Or let OpenTweet keep the header current

The OpenTweet API has no LinkedIn-Version header for you to maintain. You send the post with "linkedin" in the platforms array, and OpenTweet makes the LinkedIn call with a current version, escapes the text, and keeps the version up to date on its side.

bash
curl -X POST https://opentweet.io/api/v1/posts \
  -H "Authorization: Bearer ot_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Shipping notes for this week.",
    "platforms": ["linkedin"],
    "publish_now": true
  }'

The result comes back per network in results[], and a LinkedIn post_id is the post URN, such as urn:li:share:7300000000000000000. Swap publish_now for an ISO 8601 scheduled_date to schedule it, or add "x" and "bluesky" to send the same post there too.

You connect LinkedIn once in Settings > Accounts with one LinkedIn sign-in. No developer app, no LinkedIn Page and no version header. OpenTweet posts to your personal profile only, not Company Pages. The sign-in lasts 60 days and then needs a one-click reconnect, which is a LinkedIn rule explained in why the LinkedIn token expires after 60 days.

7-day free trial. Cancel anytime.

Frequently asked questions

Why does the LinkedIn API return 426 NONEXISTENT_VERSION?

Because the LinkedIn-Version header on the request names an API version LinkedIn does not serve. Either the version is retired, or it is a month LinkedIn has not released yet. Send a version from a recent month that is already out and the same request goes through.

What is the current LinkedIn API version?

LinkedIn ships a new version every month in YYYYMM form, so there is no single current one. As of September 2026, 202608 works: it is the version OpenTweet sends, verified live on 2026-09-15. Any recent month that LinkedIn has already released will do.

How long is a LinkedIn API version supported?

About a year. LinkedIn ships a version monthly and supports each for roughly 12 months, so a version you pin today needs a bump within the year or it starts returning 426.

What does 400 VERSION_MISSING mean?

The request had no LinkedIn-Version header at all. The versioned /rest/ endpoints require it on every call, alongside X-Restli-Protocol-Version: 2.0.0.

Why did my n8n LinkedIn node suddenly start returning 426?

The node sends a LinkedIn-Version that is written into its source, and when LinkedIn retires that version every workflow using the node fails at once. n8n issues #14670 and #14737 (April 2025, version 20240401) and #28660 (April 2026, version 20250401) are public reports of exactly this. Updating to an n8n release that ships a newer version fixes it.

Do I need to set a LinkedIn-Version header when posting through OpenTweet?

No. You call the OpenTweet API with "platforms": ["linkedin"] and OpenTweet sets the LinkedIn-Version header on its own call to LinkedIn and keeps it current.

Post to LinkedIn without tracking API versions

One API call, no LinkedIn app, no version header to bump. LinkedIn is on every plan from $11.99 a month.

7-day free trial. Cancel anytime.