💡 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.
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:
- Wrong credential type — mixing up personal vs. organization scopes causes an
unauthorized_scope_error. - 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.
What you'll find in this guide
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
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.
Request the right Products
Open the Products tab and request access to the ones matching what you want to do:
| Product | Unlocks | Use it for |
|---|---|---|
| Sign In with LinkedIn using OpenID Connect | openid, profile, email | Identifying the authenticated member, getting the member ID |
| Share on LinkedIn | w_member_social | Posting as a person |
| Community Management API | w_organization_social and related | Posting 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.
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.
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.
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.
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 fullurn:li:company:03262013— the node builds the URN for you. - Text: the post content.
- Media Category: use this for images or shared article links.
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:
{
"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.
How to check if you're affected right now
- Run your LinkedIn "Create Post" node once, manually.
- If it fails with
NONEXISTENT_VERSION, update n8n to the latest version first — this alone resolves it if you're on an older release. - 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
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.
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.
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.
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.
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.
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.
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.
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
- 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.
- AI node — summarize the full article into a LinkedIn-appropriate post: a hook, 2-3 key points, and a link.
- Code node — enforce a safe character limit on the generated text before it ever reaches the API (see Error 7).
- HTTP Request → LinkedIn Posts API — publish, using the version-controlled approach from section 8.
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.
6. Native LinkedIn Node vs HTTP Request: Which Should You Use?
| Situation | Use this |
|---|---|
| Quick personal posting, low volume, n8n is on a current version | Native LinkedIn node — simpler to configure |
| Production automation you can't afford to have silently break in a year | HTTP Request node — you control the API version |
| Posting as an organization / company page at scale | HTTP 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.
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.
/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
{
"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
}
}
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
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.
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.
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.
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.
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.
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.
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.
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
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.