📁 last Posts

n8n LinkedIn: Fix "Version Not Active" Error + Workflow Template

n8n LinkedIn integration guide — OAuth setup, the version error, and the HTTP Request fix
Figure 1: Connecting n8n to LinkedIn involves more moving parts than most integrations — here's every one of them.

💡 If your n8n LinkedIn workflow suddenly stopped working with "Requested version ... is not active," you're not alone — and it's not something you broke. As of this writing, this is a confirmed bug in n8n's built-in LinkedIn node, tracked in multiple GitHub issues, and it will very likely come back again in about a year even after it's patched. This guide explains exactly why, and gives you a workflow that's immune to it.

🔥 I dug through the actual n8n GitHub issues and community threads to get this right — not just the OAuth setup steps everyone covers, but the LinkedIn-specific "Products" approval system that trips up almost everyone coming from Google or Slack integrations, the exact root cause of the version error (with the pull request that fixes it), and a downloadable HTTP Request-based workflow that won't silently break the next time LinkedIn retires an API version.

The Direct Answer

n8n connects to LinkedIn via OAuth 2.0, using either the LinkedIn OAuth2 API credential (personal posting) or the LinkedIn Community Management OAuth2 API credential (organization/company page posting). You also need to request specific "Products" in the LinkedIn Developer Portal before your app can use those scopes at all.

Two things trip up almost everyone:

  1. Wrong credential type — mixing up personal vs. organization scopes causes an unauthorized_scope_error.
  2. The version bug — the native node's request fails with HTTP 426 because it sends an outdated, hardcoded API version header.

This guide fixes both, and gives you a version-proof way to post going forward.

1. Setup & OAuth — Why LinkedIn Is Harder Than Google

If you've connected Google Sheets or Slack to n8n before, LinkedIn will surprise you. Google enables an API with one click. LinkedIn makes you request access to named "Products," each of which unlocks a different bundle of scopes — and picking the wrong combination is the single biggest reason people get stuck before they ever touch a workflow.

1.1 Prerequisites

  • n8n instance — Cloud or self-hosted, with a publicly reachable HTTPS URL (required for the OAuth redirect).
  • A LinkedIn account that will own the app — for company page posting, this account must be an admin of that page.
  • A LinkedIn Company Page only if you intend to post as an organization, not just as yourself.

1.2 Create a LinkedIn Developer App

1

Go to the LinkedIn Developer Portal

Visit linkedin.com/developers/apps and click Create App. You'll need an associated LinkedIn Page — you can use your own company page even for personal-posting-only use cases.

2

Request the right Products

Open the Products tab and request access to the ones matching what you want to do:

ProductUnlocksUse it for
Sign In with LinkedIn using OpenID Connectopenid, profile, emailIdentifying the authenticated member, getting the member ID
Share on LinkedInw_member_socialPosting as a person
Community Management APIw_organization_social and relatedPosting as a company page, managing comments

Most personal-posting automations only need the first two. Requesting Community Management API when you don't actually manage a company page is the most common reason approval gets stuck or scopes end up mismatched.

3

Set the OAuth 2.0 redirect URL

In the Auth tab, add your n8n instance's OAuth callback under Authorized redirect URLs: https://your-n8n-instance.com/rest/oauth2-credential/callback. Copy this exactly from n8n's credential screen — don't retype it, since a trailing slash or protocol mismatch is enough to cause a redirect failure.

4

Choose the right n8n credential type

This is where most people go wrong. n8n offers two separate LinkedIn credential types:

  • LinkedIn OAuth2 API — for personal posting (w_member_social).
  • LinkedIn Community Management OAuth2 API — for organization/company page management (w_organization_social).

Pick the one that matches the Products you requested in step 2. Mixing them is exactly what causes the unauthorized_scope_error covered in section 4.

5

Connect and test

In n8n, add the credential, paste your Client ID and Secret, and click Connect my account. If you land back in n8n without an error screen, the OAuth handshake worked — whether posting actually works yet depends on section 3.

LinkedIn Developer Portal Products tab showing Share on LinkedIn and Community Management API
Figure 2: Request only the Products you actually need — over-requesting is the top cause of scope confusion.
⚠️
Approval isn't always instant. Some Products are auto-approved; others (especially Community Management API for company pages) can take review time. Don't assume your credential setup is broken if a Product shows "Requested" instead of "Added" — check the Products tab status before troubleshooting further.

2. Node Operations — What the LinkedIn Node Can Do

The built-in LinkedIn node in n8n is intentionally narrow — it covers the core posting action, not the full LinkedIn API surface.

Create Post

  • Post as: Person or Organization.
  • Person Name or ID / Organization URN: per n8n's own documentation, for an organization you enter just the numeric ID (e.g. 03262013), not the full urn:li:company:03262013 — the node builds the URN for you.
  • Text: the post content.
  • Media Category: use this for images or shared article links.
📌
If the native node doesn't support an operation you need (comments, reactions, richer media handling), n8n's own docs point you to the same solution used in this guide: call the API directly with the HTTP Request node using the LinkedIn credential as a Predefined Credential Type — no separate token handling needed.

One practical tip before you build anything real on top of this: test with a throwaway post first. LinkedIn posts created via the API are visible to your full network immediately, and there's no "draft" state in the standard posting flow — unlike Google Sheets, where a bad write is just a cell you can fix. Confirm your workflow's output looks right using a private test account or a low-visibility audience setting before wiring it into anything that runs unattended.


3. The "Version Not Active" Bug, Explained Properly

This is the error that brought most readers to this guide, so let's be precise about it instead of just telling you to "update n8n."

What's actually happening

LinkedIn's REST API requires every request to include a LinkedIn-Version header, formatted as a year and month (for example 202604). LinkedIn keeps each monthly version active for roughly 12 months, then retires it. When that happens, requests using the retired version fail with:

LinkedIn API error response
{
  "status": 426,
  "code": "NONEXISTENT_VERSION",
  "message": "Requested version 20250401 is not active"
}

The root cause, confirmed directly in n8n's GitHub repository: the version value is hardcoded in the LinkedIn node's source file (GenericFunctions.ts), not fetched dynamically. When LinkedIn retires that version, every workflow using the native node breaks at once — for everyone, simultaneously, with no change on your end.

✅
The fix, and its limits: a pull request updating the hardcoded version was merged into n8n's codebase, restoring compatibility. But because the fix still hardcodes a fixed version rather than pulling the current one dynamically, the same failure will very likely happen again roughly a year later, when that next version is retired in turn. If you're reading this after that point and hitting the same 426 error, this is why.

How to check if you're affected right now

  1. Run your LinkedIn "Create Post" node once, manually.
  2. If it fails with NONEXISTENT_VERSION, update n8n to the latest version first — this alone resolves it if you're on an older release.
  3. If it still fails after updating, or you'd rather not depend on n8n's release cycle to catch the next retirement, use the HTTP Request-based approach below.

Finding the current valid API version yourself

If you're building the HTTP Request workaround, you need a currently active LinkedIn-Version value. LinkedIn's official API documentation lists which monthly versions are currently supported at any given time — check it directly rather than trusting a hardcoded value from any tutorial (including this one), since the correct value changes every month by definition. A quick way to sanity-check your chosen version: if a request fails specifically with NONEXISTENT_VERSION rather than a permissions or authentication error, the version header — not your credentials — is what needs updating.

Why HTTP Request is the durable fix

With the native node, you're at the mercy of n8n's next release whenever LinkedIn retires a version. With an HTTP Request node, you control the LinkedIn-Version header value — when LinkedIn bumps it, you update one field yourself in seconds, instead of waiting on an upstream patch. This is exactly the pattern used in the downloadable workflow in section 8.


4. 8 Common LinkedIn Errors & How to Fix Them

❌ Error 1: "redirect_uri_mismatch" / "Bummer, something went wrong"
Cause: The redirect URL registered in the LinkedIn Developer Portal doesn't exactly match what n8n sends — a different domain, protocol, or trailing slash is enough.
✅ Fix: Copy the exact redirect URI shown on n8n's credential screen into the LinkedIn app's Auth tab. Don't retype it by hand.
❌ Error 2: "unauthorized_scope_error" — scope not authorized for your application
Cause: You're using a credential type (or requesting a scope) your app's approved Products don't cover — most often trying to use w_organization_social without Community Management API approved, or picking the wrong n8n credential type from section 1.4.
✅ Fix: Check the Products tab in the LinkedIn Developer Portal, confirm the matching Product is "Added" (not just "Requested"), and make sure the n8n credential type matches it.
❌ Error 3: "Requested version ... is not active" (426 NONEXISTENT_VERSION)
Cause: Covered in full in section 3 — the native node's hardcoded API version was retired by LinkedIn.
✅ Fix: Update n8n to the latest version, or switch to the HTTP Request workflow in section 8, where you control the version header yourself.
❌ Error 4: "It was working yesterday" with no changes on your end
Cause: LinkedIn silently retired an API version, revoked a Product, or changed a policy. Since your workflow didn't change, the cause is on LinkedIn's side.
✅ Fix: Check the exact error code first (compare it against sections 3 and this list) before assuming your credentials broke — reconnecting won't fix a version or Product-level change.
❌ Error 5: "Insufficient permission" / token expired
Cause: LinkedIn access tokens expire (typically after 60 days for standard tokens). A workflow that ran fine for weeks suddenly fails once the token lapses.
✅ Fix: Go to the credential in n8n and reconnect. For unattended production workflows, plan for periodic reconnection rather than assuming a "set and forget" OAuth token.
❌ Error 6: Images fail to attach to a post
Cause: LinkedIn's API doesn't accept raw image binaries inside a post request. Images must go through a separate asset registration/upload step first, and the resulting asset URN is then referenced in the post.
✅ Fix: If using the native node, use its Media Category option, which handles this internally. If using HTTP Request directly, you'll need to implement the two-step upload-then-reference flow — don't try to send image bytes directly in the post body.
❌ Error 7: Post text gets rejected or truncated unexpectedly
Cause: LinkedIn enforces a character limit on post content (in the low thousands of characters, and it has changed over time). Content generated dynamically — especially by an AI model — can occasionally exceed it.
✅ Fix: Trim or validate the generated text length before sending it to the API, and check LinkedIn's current developer documentation for the exact limit at the time you're building, since these limits are adjusted by LinkedIn periodically.
❌ Error 8: Rate limiting on frequent posting or polling
Cause: LinkedIn enforces per-app and per-member request limits. Automations that post very frequently, or that poll for engagement data on a tight schedule, can hit these limits.
✅ Fix: Space out posts with a Wait node and avoid tight polling loops. If you're running high-volume automation, check your app's usage under the Developer Portal's "API usage" panel before scaling up further.

5. AI-Powered Posting — From Content Pipeline to LinkedIn

Once the connection is solid, LinkedIn becomes a natural final step in a content pipeline: draft with AI, review, publish. This connects directly to the pattern used in the AI Content Factory guide — the same generation step, with LinkedIn as the distribution target instead of (or alongside) a blog post.

Example: Blog Post → LinkedIn Summary

  1. Trigger — a new row in a content-tracking Google Sheet (see the Google Sheets Trigger covered in that guide), or an RSS-style check of your own blog feed.
  2. AI node — summarize the full article into a LinkedIn-appropriate post: a hook, 2-3 key points, and a link.
  3. Code node — enforce a safe character limit on the generated text before it ever reaches the API (see Error 7).
  4. HTTP Request → LinkedIn Posts API — publish, using the version-controlled approach from section 8.
⚠️
Keep a human in the loop for anything posted as your company page. AI-generated summaries occasionally misrepresent a source article's nuance. For personal thought-leadership posts this is usually low-stakes; for an organization's public voice, add an approval step (a Slack message with an approve/reject button, for example) before the HTTP Request node fires.

A Note on URN Formats

LinkedIn's API identifies entities using URNs (Uniform Resource Names) rather than plain IDs — urn:li:person:{id} for an individual, urn:li:organization:{id} for a company page. The /v2/userinfo endpoint's sub field gives you the raw numeric ID; you build the full URN yourself by prefixing it. This sounds trivial, but it's a common source of silent failures: a post request with a malformed URN often doesn't throw an obvious "wrong format" error — it fails with a generic permissions or validation error instead, which sends people down the wrong troubleshooting path entirely.

🔍
If posting fails with a vague permissions error after your OAuth connection clearly succeeded, check the URN format before anything else. It's a five-second check that resolves a surprising share of "everything looks right but it still won't post" cases.

6. Native LinkedIn Node vs HTTP Request: Which Should You Use?

SituationUse this
Quick personal posting, low volume, n8n is on a current versionNative LinkedIn node — simpler to configure
Production automation you can't afford to have silently break in a yearHTTP Request node — you control the API version
Posting as an organization / company page at scaleHTTP Request node — more control over payload and error handling
Operations the native node doesn't support (comments, reactions, richer media)HTTP Request node — required, per n8n's own docs

My honest recommendation: start with the native node while you're testing a workflow's logic — it's faster to wire up. Before putting anything into unattended production, switch to the HTTP Request pattern in section 8. The migration is a single node swap, not a rebuild.


7. Practical Use Cases for Small Businesses

1. Content Repurposing Pipeline

Publish a blog post once, and have n8n automatically draft and post a LinkedIn summary — turning a single piece of content into consistent presence on both channels without manual copy-pasting.

2. Job Posting Distribution

When a new row appears in a hiring spreadsheet (see the Google Sheets guide for the Trigger setup), automatically format and post it to your company page, keeping recruiting content current without someone remembering to do it manually.

3. Weekly Digest for a Company Page

Aggregate the week's key updates (from a Sheet, a project tracker, or an internal log) into a single scheduled post every Friday — a lightweight way to keep a company page active without a dedicated social media manager.

4. Cross-Posting from a Single Content Source

If you already write once and distribute everywhere — the exact pattern from the Google Sheets guide's content tracker — LinkedIn slots in as one more distribution branch alongside email or your blog. The Sheet stays the single source of truth for "what's been published where," and the HTTP Request node handles the LinkedIn leg without needing a separate content calendar tool.

n8n workflow diagram showing content pipeline distributing to LinkedIn via HTTP Request node
Figure 3: One content source, multiple distribution branches — LinkedIn is just one more HTTP Request away.

Every one of these follows the same shape: generate or gather content → format for LinkedIn → post via the HTTP Request node. Once that pattern is working reliably, the specific content source is easy to swap.


8. Complete Workflow JSON — Version-Proof LinkedIn Poster

This workflow posts to LinkedIn using the HTTP Request node with your LinkedIn OAuth2 credential applied as a Predefined Credential Type — meaning n8n handles the token for you, while you keep full control over the request itself, including the LinkedIn-Version header that caused the bug in section 3.

⚠️
Before using this in production: LinkedIn's REST API field names and endpoint paths do evolve. Verify the current /rest/posts request schema against LinkedIn's official API documentation at the time you deploy this, and update the LinkedIn-Version value to the current active version. Treat the JSON below as a correct, working starting structure — not a guarantee that LinkedIn hasn't adjusted a field name since this was written.

Version-Proof LinkedIn Poster — HTTP Request

Get member ID → Post text via HTTP Request · Import in 60 seconds

n8n-linkedin-http-request-poster.json
{
  "name": "Version-Proof LinkedIn Poster (HTTP Request)",
  "nodes": [
    {
      "parameters": {},
      "id": "manual-trigger",
      "name": "When clicking Execute Workflow",
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [240, 300]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "post-text",
              "name": "postText",
              "type": "string",
              "value": "Write or generate your LinkedIn post text here."
            },
            {
              "id": "api-version",
              "name": "linkedinApiVersion",
              "type": "string",
              "value": "202604"
            }
          ]
        }
      },
      "id": "set-post",
      "name": "Post Content",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3,
      "position": [440, 300]
    },
    {
      "parameters": {
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "linkedInOAuth2Api",
        "url": "https://api.linkedin.com/v2/userinfo",
        "method": "GET",
        "options": {}
      },
      "id": "get-member-id",
      "name": "Get Member ID",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [640, 300],
      "credentials": { "linkedInOAuth2Api": { "id": "YOUR_LINKEDIN_CREDENTIAL_ID" } }
    },
    {
      "parameters": {
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "linkedInOAuth2Api",
        "url": "https://api.linkedin.com/rest/posts",
        "method": "POST",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            { "name": "LinkedIn-Version", "value": "={{ $('Post Content').item.json.linkedinApiVersion }}" },
            { "name": "X-Restli-Protocol-Version", "value": "2.0.0" },
            { "name": "Content-Type", "value": "application/json" }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({\n  author: \"urn:li:person:\" + $json.sub,\n  commentary: $('Post Content').item.json.postText,\n  visibility: \"PUBLIC\",\n  distribution: {\n    feedDistribution: \"MAIN_FEED\",\n    targetEntities: [],\n    thirdPartyDistributionChannels: []\n  },\n  lifecycleState: \"PUBLISHED\",\n  isReshareDisabledByAuthor: false\n}) }}",
        "options": {}
      },
      "id": "post-to-linkedin",
      "name": "Post to LinkedIn",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [840, 300],
      "credentials": { "linkedInOAuth2Api": { "id": "YOUR_LINKEDIN_CREDENTIAL_ID" } }
    }
  ],
  "connections": {
    "When clicking Execute Workflow": { "main": [[{ "node": "Post Content", "type": "main", "index": 0 }]] },
    "Post Content": { "main": [[{ "node": "Get Member ID", "type": "main", "index": 0 }]] },
    "Get Member ID": { "main": [[{ "node": "Post to LinkedIn", "type": "main", "index": 0 }]] }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1",
    "saveManualExecutions": true,
    "executionTimeout": 120
  }
}
✅
What makes this version-proof: the linkedinApiVersion value lives in one place — the "Post Content" node — instead of being buried in a node's internal source code. When LinkedIn retires the current version, you update one field and you're done, instead of waiting for an n8n release.
⚠️

Replace YOUR_LINKEDIN_CREDENTIAL_ID with your own LinkedIn OAuth2 credential ID from n8n. Confirm your credential includes the openid scope (required for the member ID lookup) and w_member_social (required for posting).


9. Frequently Asked Questions

Why does my n8n LinkedIn node say "Requested version ... is not active"?

The built-in LinkedIn node sends a hardcoded LinkedIn-Version header in its source code. When LinkedIn retires that version — it keeps each monthly version active for about 12 months — every request fails with HTTP 426 NONEXISTENT_VERSION until n8n ships a patch updating the hardcoded value.

Is the LinkedIn version error fixed in the latest n8n?

A fix was merged updating the hardcoded version. But because the value is still hardcoded rather than dynamic, the same class of error will very likely resurface roughly a year later, when that version is retired too. Building your posting workflow on the HTTP Request node (section 8) avoids this recurring problem entirely.

What's the difference between LinkedIn OAuth2 API and LinkedIn Community Management OAuth2 API?

LinkedIn OAuth2 API covers personal posting scopes like w_member_social. LinkedIn Community Management OAuth2 API covers organization/company page management scopes like w_organization_social. Using the wrong one is the most common cause of the unauthorized_scope_error.

Do I need to request LinkedIn Products before using the API?

Yes. Unlike Google, LinkedIn requires you to explicitly request access to Products such as "Share on LinkedIn" or "Sign In with LinkedIn using OpenID Connect" inside the Developer Portal before your app is granted the matching scopes.

How do I get my numeric LinkedIn member ID for the API?

Call GET https://api.linkedin.com/v2/userinfo with your access token (requires the openid scope). The response's "sub" field is your member ID, used to build the author URN for posting.

Can I still use the native n8n LinkedIn node?

Yes, for simple personal posting once your n8n version includes the current fix. For production workflows, organization posting, or anything that must not break silently when LinkedIn retires an API version, the HTTP Request approach in this guide is more resilient.

Why do LinkedIn automations sometimes stop working overnight with no code changes?

LinkedIn periodically retires API versions and can revoke or restrict Product access. Since nothing changed on your end, the cause is almost always a version retirement or a scope/Product change on LinkedIn's side, not your workflow.

What image requirements does LinkedIn enforce for posts via the API?

Images must be uploaded through LinkedIn's separate asset upload process before being referenced in a post, not sent as raw binary in the post request itself. Skipping the upload step is a common cause of failed image posts.


Continue Your n8n Journey

Ahmed Ayari — TriggerWorkflow I traced this guide's LinkedIn version bug directly through n8n's public GitHub issues and the merged pull request that fixes it, rather than guessing from symptoms. The HTTP Request workflow above is built to survive the next time LinkedIn retires an API version — because it will, again. Read more guides by Mr.Ayari

Stop Fighting LinkedIn's API

Download the version-proof HTTP Request workflow above, import it into n8n, and post to LinkedIn without waiting on the next n8n patch.

Comments