Dravo connects a LinkedIn member through OpenID Connect, plus every Company Page they administer (one connected account per page). It publishes text, image, multi-image, video and article posts, as the member or as an organization.
Platform configuration verified against LinkedIn's official documentation on June 25, 2026.
Configuration summary
| Setting | Value |
|---|---|
| Dravo platform | linkedin |
| Required products | Sign In with LinkedIn using OpenID Connect; Share on LinkedIn; Community Management for organization publishing/analytics |
| Callback | https://api.dravo.dev/v1/oauth/linkedin/callback |
| Publish scopes | openid, profile, w_member_social, rw_organization_admin, w_organization_social |
| Analytics scopes | rw_organization_admin for current organization analytics; restricted LinkedIn scopes such as r_organization_social_feed and r_member_social_feed are not requested by default |
| Credentials | Client ID and Primary Client Secret |
| Publishing author | LinkedIn member (urn:li:person:...) or organization (urn:li:organization:...) |
| Current Dravo publishing | Text, image, multi-image (2 to 20), video and article |
The callback is fixed for every Dravo customer. Do not replace api.dravo.dev
with your product domain.
Step 1: Prepare a LinkedIn Page and admin
LinkedIn requires every developer app to be associated with a LinkedIn Page, even though Dravo publishes as a member.
1.1 Choose the owner Page
Navigation: LinkedIn → For Business → Create a Company Page, if your
organization does not already have one.
- Choose the Page representing the organization that owns the integration.
- Confirm its public name and URL are correct.
- Avoid using a temporary or customer-owned Page.
1.2 Confirm administrator access
Navigation: open the LinkedIn Page → Admin view → Settings → Manage admins.
- Confirm the person creating the developer app is a Page super admin.
- If not, ask an existing super admin to grant the role.
- Confirm the role is active before creating the developer app.
LinkedIn sends the Page association/verification request to a Page administrator. Without approval, the application cannot complete ownership verification.
Step 2: Create and verify the LinkedIn app
2.1 Create the app
Navigation: LinkedIn Developer Portal — My Apps → Create app.
- Enter the application name.
- Select the LinkedIn Page prepared in Step 1.
- Add the Privacy Policy URL.
- Upload the application logo.
- Accept LinkedIn's API Terms and choose Create app.
2.2 Verify the Page association
Navigation: Developer Portal → app → Settings and the LinkedIn Page's
admin notifications.
- Find the Associated LinkedIn Page or verification status.
- Choose Verify or send the verification request when offered.
- As Page super admin, approve the request from the Page/admin notification.
- Return to the Developer Portal and confirm the association is verified.
2.3 Complete app settings
Navigation: Developer Portal → app → Settings.
- Confirm the app logo and organization details.
- Add legal/support contact information when requested.
- Add trusted team members under the app's team/admin controls.
Step 3: Enable the LinkedIn products
3.1 Add OpenID Connect sign-in
Navigation: Developer Portal → app → Products.
- Find Sign In with LinkedIn using OpenID Connect.
- Choose Request access or Add product.
- Accept the product terms.
- Wait until the product is listed as added/available.
This product grants openid and profile. The optional email scope is not
needed or requested by Dravo.
3.2 Add member publishing
Navigation: Developer Portal → app → Products.
- Find Share on LinkedIn.
- Choose Request access or Add product.
- Accept the product terms.
- Confirm the product grants
w_member_social.
Do not add Advertising, Sales Navigator, Talent or Learning products for this flow. They are separate partner programs and do not replace Share on LinkedIn.
3.3 Add Community Management for organization publishing and analytics
Navigation: Developer Portal → app → Products.
If your Dravo integration should connect Company Pages, publish as organizations or read organization analytics:
- Request the LinkedIn product that grants Community Management / Marketing API organization permissions.
- Confirm the app receives
rw_organization_adminandw_organization_social. - Keep LinkedIn's access tier and review requirements in mind; adding the scope name manually to an OAuth URL does not grant it.
Current Dravo organization analytics use LinkedIn's organization page, follower and share statistics endpoints. Deeper member-feed or social-feed analytics may require restricted LinkedIn permissions that Dravo does not request by default.
3.4 Confirm product status
The products that grant your selected scopes must show as available before continuing. If a product is pending, adding its scope name to an OAuth URL cannot bypass the decision.
Step 4: Register the callback and check scopes
4.1 Add Dravo's redirect URL
Navigation: Developer Portal → app → Auth → OAuth 2.0 settings → Authorized redirect URLs for your app.
-
Choose the edit/pencil control next to Authorized redirect URLs.
-
Add this exact value:
TEXThttps://api.dravo.dev/v1/oauth/linkedin/callback -
Choose Update or Save.
-
Reopen the editor and confirm the value remains present.
LinkedIn requires an exact HTTPS match. Do not add a wildcard, query string,
fragment or your frontend return_url.
4.2 Confirm all OAuth scopes
Navigation: Developer Portal → app → Auth → OAuth 2.0 scopes.
The Auth tab must list:
| Scope | Product | Why Dravo needs it |
|---|---|---|
openid | OIDC Sign In | Establish the authenticated member identity. |
profile | OIDC Sign In | Read member id, name and profile image. |
w_member_social | Share on LinkedIn | Create member posts. |
rw_organization_admin | Marketing / Community Management | List the Company Pages the member administers. |
w_organization_social | Marketing / Community Management | Post on behalf of an administered Company Page. |
- Confirm each scope appears in the Auth tab.
- Return to Products if one is missing.
- Do not use the legacy
r_liteprofilepermission; Dravo uses OIDC. - Reconnect members after any scope/product change.
Step 5: Copy the client credentials into Dravo
5.1 Reveal the LinkedIn credentials
Navigation: Developer Portal → app → Auth → Application credentials.
- Copy Client ID — this is Dravo's
client_id. - Locate Primary Client Secret.
- Choose the visibility/copy control and complete any security confirmation.
- Copy the secret — this is Dravo's
client_secret. - Confirm both values belong to the app configured in Steps 2–4.
5.2 Save them from the Dravo dashboard
Navigation: Dravo Dashboard → Connections → OAuth apps → Add OAuth app.
- Select LinkedIn.
- Enter a recognizable name such as
Production LinkedIn App. - Paste the LinkedIn Client ID and Primary Client Secret.
- Confirm Dravo shows the fixed callback and all selected scopes.
- Save the OAuth app.
5.3 Save them through the API
Endpoint: POST /v1/oauth-apps.
curl -X POST https://api.dravo.dev/v1/oauth-apps \
-H "Authorization: Bearer $DRAVO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"platform": "linkedin",
"name": "Production LinkedIn App",
"client_id": "LINKEDIN_CLIENT_ID",
"client_secret": "LINKEDIN_PRIMARY_CLIENT_SECRET",
"allowed_return_urls": [
"https://app.acme.com/settings/connections"
]
}'Dravo encrypts the secret and never returns it.
Step 6: Connect a LinkedIn member
6.1 Connect from the dashboard
Navigation: Dravo Dashboard → Connections → Connected accounts → Connect account.
- Select LinkedIn.
- Choose the OAuth app saved in Step 5.
- Choose Connect with OAuth.
- Sign in as the member who should publish.
- Grant the requested member and organization permissions.
- Allow LinkedIn to return the browser to Dravo.
6.2 Connect from your backend
Endpoint: GET /v1/oauth/linkedin/start.
curl --get "https://api.dravo.dev/v1/oauth/linkedin/start" \
-H "Authorization: Bearer $DRAVO_API_KEY" \
--data-urlencode "oauth_app_id=YOUR_OAUTH_APP_ID" \
--data-urlencode "return_url=https://app.acme.com/settings/connections"Redirect the browser to authorize_url. After consent, Dravo calls LinkedIn
userinfo and stores urn:li:person:<sub> as the default author.
Step 7: Verify and publish test posts
7.1 Verify member identity and scopes
Dashboard: Dravo Dashboard → Connections → Connected accounts.
API: GET /v1/accounts?platform=linkedin.
- Confirm the member name and profile image are correct.
- Confirm
connection_typeisoauth. - Confirm
oauth_app_ididentifies the intended LinkedIn app. - Confirm
openid,profileandw_member_socialare present for member publishing. - If organization publishing or analytics should work, confirm
rw_organization_adminandw_organization_socialare also present. - Confirm token health is active.
7.2 Publish a text post
Navigation: Dravo Dashboard → Playground.
- Select only the new LinkedIn member account.
- Publish a short public text post.
- Confirm it appears on the intended member profile.
7.3 Publish an image post
- Use a small public image or upload/import it through Dravo media.
- Publish the image with a short caption.
- Confirm LinkedIn processed the image and created the post.
Text and image posts exercise different LinkedIn endpoints. Test both before production use.
Step 8: Prepare for token expiry
LinkedIn self-service member publishing does not guarantee a refresh token. Plan the reconnect experience before onboarding users.
8.1 Understand the token lifetime
LinkedIn documents a typical access-token lifetime of 60 days. Programmatic refresh tokens are documented for approved Marketing Developer Platform partners, commonly with a one-year refresh-token lifetime.
- Do not assume the token response contains
refresh_token. - Dravo refreshes automatically only when LinkedIn returns one.
- A user can revoke either token at any time.
8.2 Test the reconnect path
Navigation: Dravo Dashboard → Connections → connected LinkedIn account.
- Confirm your product can display
expiredorrequires_reconnecthealth. - Start OAuth again with the same LinkedIn app.
- Confirm the existing account is restored with a fresh token.
- Keep this reconnect action visible to production users.
8.3 Treat scope changes as new consent
If either product or scope changes, existing tokens keep the previous grant. Reconnect every affected member; editing the LinkedIn app does not upgrade an existing token.
Supported features
| Content | Current support | Notes |
|---|---|---|
| Text post | Yes | Created with POST /rest/posts. |
| One image | Yes | Uploaded via the Images API, referenced by URN. |
| Multi-image | Yes | 2 to 20 images grouped in content.multiImage. |
| Video | Yes | MP4 via the Videos API (initialize, multipart upload, finalize). |
| Article | Yes | Link with preview via content.article (source/title/description). |
| Organization author | Yes | One connected account per administered Company Page. |
| Organization analytics | Yes | Requires rw_organization_admin; returns organization page, follower and share statistics when LinkedIn exposes them. |
| Member analytics | Limited | Restricted LinkedIn member/social-feed permissions are not requested by default. |
| Automatic refresh | Conditional | Only when LinkedIn issues a refresh token. |
Dravo sends the required LinkedIn-Version and X-Restli-Protocol-Version
headers. LinkedIn sunsets monthly API versions; an HTTP 426 normally means the
adapter version must be updated, not that the member should reconnect.
Post options (platform_options.linkedin)
{ "account_ids": ["YOUR_LINKEDIN_ACCOUNT_ID"], "text": "Check out our launch", "media_urls": ["https://cdn.acme.com/a.jpg", "https://cdn.acme.com/b.jpg"], "platform_options": { "linkedin": { "visibility": "PUBLIC", "disable_reshare": false, "alt_texts": ["First image", "Second image"] } }}| Option | Type | Meaning |
|---|---|---|
visibility | string | PUBLIC (default) or CONNECTIONS. |
disable_reshare | boolean | Sets isReshareDisabledByAuthor. |
alt_texts | string[] | Alt text per image (by index) for multi-image posts. |
article | object | Share a link: { source, title, description, thumbnail? } with no media. |
author | string | Override the author URN (advanced; normally set by the connected account). |
first_comment | string | Auto-post a first comment on the new post (best effort; commented as the post author). |
Send one video, one image, 2 to 20 images, or an article (no media). Choose the
target author by selecting the personal or organization account when publishing.
Troubleshooting
Redirect URL mismatch
Open Developer Portal → app → Auth → Authorized redirect URLs and compare the
value character by character with Dravo's fixed callback.
unauthorized_scope_error
- Open the app's Products tab.
- Confirm OIDC Sign In and Share on LinkedIn are both added.
- Open Auth → OAuth 2.0 scopes and confirm all selected scopes.
- Reconnect after the missing product becomes available.
Login works but publishing returns 403
OIDC is enabled but w_member_social is missing or was not granted. Add Share
on LinkedIn, confirm the scope on Auth and reconnect the member.
The account expires instead of refreshing
LinkedIn did not issue a refresh token to this app. Send the member through OAuth again; this is expected for self-service apps without programmatic refresh.
Organization accounts do not appear after connecting
Dravo only lists Company Pages where the member is an ADMINISTRATOR and the
app was granted rw_organization_admin. Confirm the role on the Page and that
both organization scopes are added to the app, then reconnect. If the scopes are
missing, Dravo still connects the member (organizations are best-effort).
An organization post returns 403
The app lacks w_organization_social, or the member is not an admin of that
Page. Add the scope, confirm the Page role and reconnect the organization account.
LinkedIn analytics are empty or return 403
- Confirm the connected account is an organization account, not only a member profile.
- Confirm the app has
rw_organization_adminand the member is an administrator of the Page. - Confirm the app has the LinkedIn Community Management / Marketing access tier required for the statistics endpoint.
- Reconnect after any product or scope change.
LinkedIn returns HTTP 426
The pinned LinkedIn-Version has sunset. Update the Dravo adapter to a supported
monthly version; reconnecting the member does not fix an API-version sunset.
Official documentation
- Getting access to LinkedIn APIs
- LinkedIn OAuth 2.0 authorization code flow
- Sign In with LinkedIn using OpenID Connect
- Share on LinkedIn
- LinkedIn Community Management overview
- LinkedIn organization share statistics
- LinkedIn Posts API
- LinkedIn Images API
- LinkedIn programmatic refresh tokens
Next, read Configure OAuth and connect accounts for the shared browser flow and Posts for the unified post payload.