How to Connect n8n with LinkedIn
This guide walks you through how to connect the LinkedIn API with n8n to automatically publish posts, including authentication, image upload, and content publishing.
{"type":"doc","content":[{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"1. Overview"}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Goal:"},{"type":"hardBreak"},{"type":"text","text":"Automatically post content to LinkedIn using n8n."}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Approach:"},{"type":"hardBreak"},{"type":"text","text":"Use the LinkedIn API via the HTTP Request node in n8n."}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Important note:"},{"type":"hardBreak"},{"type":"text","text":"In some cases, n8n Cloud does not allow direct use of LinkedIn OAuth credentials inside the HTTP Request node."},{"type":"hardBreak"},{"type":"text","text":"→ Workaround: manually retrieve an access token using Postman."}]},{"type":"horizontalRule"},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"2. Create a LinkedIn App"}]},{"type":"orderedList","attrs":{"start":1,"type":null},"content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Go to: "},{"type":"text","marks":[{"type":"link","attrs":{"href":"https://developer.linkedin.com/apps","target":"_blank","rel":"noopener noreferrer nofollow","class":null}}],"text":"https://developer.linkedin.com/apps"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Create a new app"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"type":"text","text":"Configure the app:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Products tab:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Add "},{"type":"text","marks":[{"type":"bold"}],"text":"\"Share on LinkedIn\""},{"type":"text","text":" (required for "},{"type":"text","marks":[{"type":"code"}],"text":"w_member_social"},{"type":"text","text":" scope)"}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Auth tab:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Copy:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Client ID"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Client Secret"}]}]}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Authorized Redirect URLs:"}]},{"type":"codeBlock","attrs":{"language":null},"content":[{"type":"text","text":"https://oauth.pstmn.io/v1/callback (for Postman)\nhttps://oauth.n8n.cloud/oauth2/callback (for n8n Cloud)\n"}]},{"type":"image","attrs":{"src":"https://cropycnghyhgkxgxdfkh.supabase.co/storage/v1/object/public/media_portfolio/media/bff65f42-f6f7-4b95-9bd7-bf888d243f31.jpeg","alt":null,"title":null,"width":null,"height":null}}]}]},{"type":"heading","attrs":{"level":3},"content":[{"type":"text","text":"Required scopes:"}]},{"type":"codeBlock","attrs":{"language":null},"content":[{"type":"text","text":"openid\nprofile\nemail\nw_member_social"}]},{"type":"image","attrs":{"src":"https://cropycnghyhgkxgxdfkh.supabase.co/storage/v1/object/public/media_portfolio/media/680c3bfe-864a-4afe-ba39-d0ae92542071.jpeg","alt":null,"title":null,"width":639,"height":470.929}},{"type":"horizontalRule"},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"3. Get Access Token Using Postman"}]},{"type":"heading","attrs":{"level":3},"content":[{"type":"text","text":"Why Postman?"}]},{"type":"paragraph","content":[{"type":"text","text":"n8n may block OAuth credentials in HTTP Request nodes, so we retrieve the token manually."}]},{"type":"heading","attrs":{"level":3},"content":[{"type":"text","text":"OAuth2 Setup in Postman:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Grant Type: Authorization Code"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Callback URL:"}]},{"type":"codeBlock","attrs":{"language":null},"content":[{"type":"text","text":"https://oauth.pstmn.io/v1/callback\n"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Auth URL:"}]},{"type":"codeBlock","attrs":{"language":null},"content":[{"type":"text","text":"https://www.linkedin.com/oauth/v2/authorization\n"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Access Token URL:"}]},{"type":"codeBlock","attrs":{"language":null},"content":[{"type":"text","text":"https://www.linkedin.com/oauth/v2/accessToken\n"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Scope:"}]},{"type":"codeBlock","attrs":{"language":null},"content":[{"type":"text","text":"openid profile email w_member_social\n"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Client Authentication:"}]},{"type":"codeBlock","attrs":{"language":null},"content":[{"type":"text","text":"Send client credentials in body\n"}]}]}]},{"type":"paragraph","content":[{"type":"text","text":"⚠️ Important:"},{"type":"hardBreak"},{"type":"text","text":"If you don’t choose "},{"type":"text","marks":[{"type":"italic"}],"text":"“Send client credentials in body”"},{"type":"text","text":", you may get:"}]},{"type":"codeBlock","attrs":{"language":null},"content":[{"type":"text","text":"client_secret is missing\n"}]},{"type":"heading","attrs":{"level":3},"content":[{"type":"text","text":"Steps:"}]},{"type":"orderedList","attrs":{"start":1,"type":null},"content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Click "},{"type":"text","marks":[{"type":"bold"}],"text":"Get New Access Token"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Log in to LinkedIn and authorize the app"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Copy the "},{"type":"text","marks":[{"type":"code"}],"text":"access_token"}]}]}]},{"type":"paragraph","content":[{"type":"text","text":"👉 Token validity: ~2 months"}]},{"type":"horizontalRule"},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"4. Get Your Person URN"}]},{"type":"orderedList","attrs":{"start":1,"type":null},"content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Decode "},{"type":"text","marks":[{"type":"code"}],"text":"id_token"},{"type":"text","text":" using "},{"type":"text","marks":[{"type":"link","attrs":{"href":"https://jwt.io","target":"_blank","rel":"noopener noreferrer nofollow","class":null}}],"text":"https://jwt.io"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Extract the "},{"type":"text","marks":[{"type":"code"}],"text":"sub"},{"type":"text","text":" field"}]}]}]},{"type":"paragraph","content":[{"type":"text","text":"Format:"}]},{"type":"codeBlock","attrs":{"language":null},"content":[{"type":"text","text":"urn:li:person:<sub_value>\n"}]},{"type":"paragraph","content":[{"type":"text","text":"This will be used as the "},{"type":"text","marks":[{"type":"bold"}],"text":"author"},{"type":"text","text":" in API requests."}]},{"type":"horizontalRule"},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"5. Suggested n8n Workflow"}]},{"type":"paragraph","content":[{"type":"text","text":"Typical flow:"}]},{"type":"orderedList","attrs":{"start":1,"type":null},"content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Webhook / Trigger → receive input"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Validate + Normalize → clean data"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Message a model → generate post content"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Generate an image → optional AI image"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Register Upload LinkedIn"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Code node → extract "},{"type":"text","marks":[{"type":"code"}],"text":"uploadUrl"},{"type":"text","text":" + "},{"type":"text","marks":[{"type":"code"}],"text":"asset"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Upload Binary → upload image"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Code node → build JSON body"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Post LinkedIn → publish post"}]}]}]},{"type":"horizontalRule"},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"6. Required Headers"}]},{"type":"paragraph","content":[{"type":"text","text":"Use these headers for all LinkedIn API requests:"}]},{"type":"codeBlock","attrs":{"language":null},"content":[{"type":"text","text":"Authorization: Bearer <access_token>\nLinkedIn-Version: 202504\nX-Restli-Protocol-Version: 2.0.0\nContent-Type: application/json\n"}]},{"type":"horizontalRule"},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"7. Register Image Upload"}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Endpoint:"}]},{"type":"codeBlock","attrs":{"language":null},"content":[{"type":"text","text":"POST https://api.linkedin.com/v2/assets?action=registerUpload\n"}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Body:"}]},{"type":"codeBlock","attrs":{"language":"json"},"content":[{"type":"text","text":"{\n \"registerUploadRequest\": {\n \"recipes\": [\"urn:li:digitalmediaRecipe:feedshare-image\"],\n \"owner\": \"urn:li:person:<PERSON_ID>\",\n \"serviceRelationships\": [\n {\n \"relationshipType\": \"OWNER\",\n \"identifier\": \"urn:li:userGeneratedContent\"\n }\n ]\n }\n}\n"}]},{"type":"horizontalRule"},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"8. Extract Upload URL (Code Node)"}]},{"type":"codeBlock","attrs":{"language":"javascript"},"content":[{"type":"text","text":"const uploadMechanism = $input.item.json.value.uploadMechanism;\nconst key = 'com.linkedin.digitalmedia.uploading.MediaUploadHttpRequest';\nconst uploadUrl = uploadMechanism[key].uploadUrl;\nconst asset = $input.item.json.value.asset;\n\nreturn {\n json: { uploadUrl, asset },\n binary: $('Generate an image1').item.binary\n};\n"}]},{"type":"paragraph","content":[{"type":"text","text":"⚠️ Important:"},{"type":"hardBreak"},{"type":"text","text":"You must pass the binary data, or you’ll get:"}]},{"type":"codeBlock","attrs":{"language":null},"content":[{"type":"text","text":"node input data does not contain a binary file\n"}]},{"type":"horizontalRule"},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"9. Upload Image (Binary)"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Method: "},{"type":"text","marks":[{"type":"code"}],"text":"PUT"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"URL:"}]},{"type":"codeBlock","attrs":{"language":null},"content":[{"type":"text","text":"{{ $json.uploadUrl }}\n"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"type":"text","text":"Settings:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Body Content Type: "},{"type":"text","marks":[{"type":"code"}],"text":"n8n Binary File"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Input Data Field Name: "},{"type":"text","marks":[{"type":"code"}],"text":"data"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Content-Type: "},{"type":"text","marks":[{"type":"code"}],"text":"image/png"}]}]}]},{"type":"horizontalRule"},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"10. Build Post Body (Code Node)"}]},{"type":"paragraph","content":[{"type":"text","text":"To avoid JSON errors, construct the object in a Code node:"}]},{"type":"codeBlock","attrs":{"language":"javascript"},"content":[{"type":"text","text":"const title = $('Validate + Normalize').item.json.title;\nconst aiText = $('Message a model').item.json.content[0].text;\nconst asset = $('Register Upload LinkedIn').item.json.value.asset;\n\nreturn {\n json: {\n author: 'urn:li:person:<ID>',\n lifecycleState: 'PUBLISHED',\n specificContent: {\n 'com.linkedin.ugc.ShareContent': {\n shareCommentary: {\n text: title + '\\\\n\\\\n' + aiText\n },\n shareMediaCategory: 'IMAGE',\n media: [{\n status: 'READY',\n media: asset\n }]\n }\n },\n visibility: {\n 'com.linkedin.ugc.MemberNetworkVisibility': 'PUBLIC'\n }\n }\n};\n"}]},{"type":"horizontalRule"},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"11. Publish Post to LinkedIn"}]},{"type":"paragraph","content":[{"type":"text","marks":[{"type":"bold"}],"text":"Endpoint:"}]},{"type":"codeBlock","attrs":{"language":null},"content":[{"type":"text","text":"POST https://api.linkedin.com/v2/ugcPosts\n"}]},{"type":"heading","attrs":{"level":3},"content":[{"type":"text","text":"Settings:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Content-Type: "},{"type":"text","marks":[{"type":"code"}],"text":"application/json"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Body:"}]}]}]},{"type":"codeBlock","attrs":{"language":null},"content":[{"type":"text","text":"={{ JSON.stringify($json) }}\n"}]},{"type":"horizontalRule"},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"12. Common Errors & Fixes"}]},{"type":"paragraph","content":[{"type":"text","text":"ErrorCauseFixcredential not accessibleNot shared properlyMove to GlobalOAuth blocked in HTTP noden8n restrictionUse manual tokenEMPTY_ACCESS_TOKEN (401)Missing AuthorizationAdd Bearer tokenInvalid URLExpression issueExtract via Code nodeBad control characterJSON formattingUse JSON.stringifybinary file not foundMissing binary dataPass binary correctlyclient_secret is missingWrong Postman configFix client authredirect_uri mismatchNot registeredAdd to LinkedIn app"}]},{"type":"horizontalRule"},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"13. Important Notes"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Access tokens expire → must refresh manually"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","marks":[{"type":"code"}],"text":"uploadUrl"},{"type":"text","text":" expires quickly → upload immediately"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Keep credentials secure"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"For company pages:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Use:"}]},{"type":"codeBlock","attrs":{"language":null},"content":[{"type":"text","text":"urn:li:organization:<ID>\n"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Requires admin permissions"}]}]}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Ensure "},{"type":"text","marks":[{"type":"code"}],"text":"LinkedIn-Version"},{"type":"text","text":" matches API version"}]}]}]},{"type":"horizontalRule"},{"type":"heading","attrs":{"level":2},"content":[{"type":"text","text":"14. Conclusion"}]},{"type":"paragraph","content":[{"type":"text","text":"The most stable approach:"}]},{"type":"orderedList","attrs":{"start":1,"type":null},"content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Create a LinkedIn App"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Get access token via Postman"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Use n8n HTTP Request nodes to:"}]},{"type":"bulletList","content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Register upload"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Upload image"}]}]},{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"Publish post via "},{"type":"text","marks":[{"type":"code"}],"text":"ugcPosts"},{"type":"text","text":" API"}]}]}]}]}]},{"type":"paragraph"},{"type":"image","attrs":{"src":"https://cropycnghyhgkxgxdfkh.supabase.co/storage/v1/object/public/media_portfolio/media/6ecf3edf-0564-431a-b3e1-880a95b3dea6.jpeg","alt":null,"title":null,"width":null,"height":null}}]}