Overview
Provider id linkedin. The provider publishes one member post to POST https://api.linkedin.com/rest/posts with the required LinkedIn-Version header. Organization posts are not implemented: only member is accepted as the author selection.
Requirements
- A LinkedIn developer app with a client id and client secret.
- A registered redirect URI for the authorization step.
- Member authorization for posting. The documented scope for posting on behalf of a member is
w_member_social.
Credentials
| Field | Meaning | Secret |
|---|---|---|
client_id | The app's client id. | No |
client_secret | The app's client secret. | Yes |
The posting author is urn:li:person:{id}, and the member id is resolved through GET /v2/me, which LinkedIn documents as deprecated. GET /v2/userinfo is deliberately not used for the author: its sub is unique per app, not a stable global member id. When the member id cannot be read, the connection fails closed instead of guessing.
Connect
redirectUri is required; the client id, client secret and scope list can be supplied as connect options by a machine caller.
{
"type": "start",
"provider": "linkedin",
"options": {
"redirectUri": "https://example.com/oauth/callback/linkedin",
"scopes": ["w_member_social", "openid", "profile"]
}
}syndroo connect --input connect.json --jsonUNRESOLVED. PKCE is not documented on the token endpoint that was read, and the provider never adds a code_challenge for that reason. The start step returns an authorization action that the local CLI completes itself, with --redirect-uri and a controlling terminal or with --callback-url -, as the credential reference describes. That local callback path is fixture-tested against local servers only; no live LinkedIn account was connected.
First publish
{
"type": "prepare",
"content": {},
"targets": [
{
"provider": "linkedin",
"options": { "commentary": "Hello from Syndroo.", "visibility": "PUBLIC" }
}
]
}syndroo publish --input post.json --jsonSuccess is an HTTP 201 whose response header carries the created post URN. That header only arrives with the response, so a timeout after the post was created leaves the outcome unknown and non-retryable.
Capabilities
The manifest declares text, published as a member post with lifecycleState: PUBLISHED. UNRESOLVED. The maximum commentary length is not documented on the retrieved page, so no character limit is printed here or enforced by the provider.
Options
| Where | Accepted keys |
|---|---|
| Connect options | redirectUri (required), clientId, clientSecret, scopes. |
| Publish options | commentary and visibility (both required), author (member only), distribution, linkedinVersion. |
| Content | None required; LinkedIn sends the target options. |
UNRESOLVED. linkedinVersion is pinned to 202601 in the provider's manifest and is the only accepted value. LinkedIn versions this header by month, so treat that constant as awaiting re-verification against the current API version rather than as a recommendation.
Troubleshooting
The provider never retries and reports a failure only when the failure is known not to have been applied. A rejected or already-used authorization code is reported as a callback rejection rather than retried. UNRESOLVED. LinkedIn's error response format was not confirmed on a primary page, so this guide does not describe one.
Revoke and security
UNRESOLVED. No official permission-removal or token-revocation procedure was retrieved, so this guide does not print a revoke URL. Remove the app's access from your LinkedIn settings, then disconnect the local connection:
syndroo connect --disconnect <connectionId>