Configure LinkedIn

View .md

Complete BYOK setup for LinkedIn member publishing: create the app, enable OIDC and Share on LinkedIn, register Dravo's callback and connect a member.


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

SettingValue
Dravo platformlinkedin
Required productsSign In with LinkedIn using OpenID Connect; Share on LinkedIn; Community Management for organization publishing/analytics
Callbackhttps://api.dravo.dev/v1/oauth/linkedin/callback
Publish scopesopenid, profile, w_member_social, rw_organization_admin, w_organization_social
Analytics scopesrw_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
CredentialsClient ID and Primary Client Secret
Publishing authorLinkedIn member (urn:li:person:...) or organization (urn:li:organization:...)
Current Dravo publishingText, 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.

  1. Choose the Page representing the organization that owns the integration.
  2. Confirm its public name and URL are correct.
  3. Avoid using a temporary or customer-owned Page.

1.2 Confirm administrator access

Navigation: open the LinkedIn Page → Admin viewSettings → Manage admins.

  1. Confirm the person creating the developer app is a Page super admin.
  2. If not, ask an existing super admin to grant the role.
  3. 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 AppsCreate app.

  1. Enter the application name.
  2. Select the LinkedIn Page prepared in Step 1.
  3. Add the Privacy Policy URL.
  4. Upload the application logo.
  5. 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.

  1. Find the Associated LinkedIn Page or verification status.
  2. Choose Verify or send the verification request when offered.
  3. As Page super admin, approve the request from the Page/admin notification.
  4. Return to the Developer Portal and confirm the association is verified.

2.3 Complete app settings

Navigation: Developer Portal → app → Settings.

  1. Confirm the app logo and organization details.
  2. Add legal/support contact information when requested.
  3. 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.

  1. Find Sign In with LinkedIn using OpenID Connect.
  2. Choose Request access or Add product.
  3. Accept the product terms.
  4. 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.

  1. Find Share on LinkedIn.
  2. Choose Request access or Add product.
  3. Accept the product terms.
  4. 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:

  1. Request the LinkedIn product that grants Community Management / Marketing API organization permissions.
  2. Confirm the app receives rw_organization_admin and w_organization_social.
  3. 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.

  1. Choose the edit/pencil control next to Authorized redirect URLs.

  2. Add this exact value:

    TEXT
    https://api.dravo.dev/v1/oauth/linkedin/callback
  3. Choose Update or Save.

  4. 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:

ScopeProductWhy Dravo needs it
openidOIDC Sign InEstablish the authenticated member identity.
profileOIDC Sign InRead member id, name and profile image.
w_member_socialShare on LinkedInCreate member posts.
rw_organization_adminMarketing / Community ManagementList the Company Pages the member administers.
w_organization_socialMarketing / Community ManagementPost on behalf of an administered Company Page.
  1. Confirm each scope appears in the Auth tab.
  2. Return to Products if one is missing.
  3. Do not use the legacy r_liteprofile permission; Dravo uses OIDC.
  4. 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.

  1. Copy Client ID — this is Dravo's client_id.
  2. Locate Primary Client Secret.
  3. Choose the visibility/copy control and complete any security confirmation.
  4. Copy the secret — this is Dravo's client_secret.
  5. 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.

  1. Select LinkedIn.
  2. Enter a recognizable name such as Production LinkedIn App.
  3. Paste the LinkedIn Client ID and Primary Client Secret.
  4. Confirm Dravo shows the fixed callback and all selected scopes.
  5. Save the OAuth app.

5.3 Save them through the API

Endpoint: POST /v1/oauth-apps.

Shell
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.

  1. Select LinkedIn.
  2. Choose the OAuth app saved in Step 5.
  3. Choose Connect with OAuth.
  4. Sign in as the member who should publish.
  5. Grant the requested member and organization permissions.
  6. Allow LinkedIn to return the browser to Dravo.

6.2 Connect from your backend

Endpoint: GET /v1/oauth/linkedin/start.

Shell
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.

  1. Confirm the member name and profile image are correct.
  2. Confirm connection_type is oauth.
  3. Confirm oauth_app_id identifies the intended LinkedIn app.
  4. Confirm openid, profile and w_member_social are present for member publishing.
  5. If organization publishing or analytics should work, confirm rw_organization_admin and w_organization_social are also present.
  6. Confirm token health is active.

7.2 Publish a text post

Navigation: Dravo Dashboard → Playground.

  1. Select only the new LinkedIn member account.
  2. Publish a short public text post.
  3. Confirm it appears on the intended member profile.

7.3 Publish an image post

  1. Use a small public image or upload/import it through Dravo media.
  2. Publish the image with a short caption.
  3. 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.

  1. Do not assume the token response contains refresh_token.
  2. Dravo refreshes automatically only when LinkedIn returns one.
  3. A user can revoke either token at any time.

8.2 Test the reconnect path

Navigation: Dravo Dashboard → Connections → connected LinkedIn account.

  1. Confirm your product can display expired or requires_reconnect health.
  2. Start OAuth again with the same LinkedIn app.
  3. Confirm the existing account is restored with a fresh token.
  4. Keep this reconnect action visible to production users.

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

ContentCurrent supportNotes
Text postYesCreated with POST /rest/posts.
One imageYesUploaded via the Images API, referenced by URN.
Multi-imageYes2 to 20 images grouped in content.multiImage.
VideoYesMP4 via the Videos API (initialize, multipart upload, finalize).
ArticleYesLink with preview via content.article (source/title/description).
Organization authorYesOne connected account per administered Company Page.
Organization analyticsYesRequires rw_organization_admin; returns organization page, follower and share statistics when LinkedIn exposes them.
Member analyticsLimitedRestricted LinkedIn member/social-feed permissions are not requested by default.
Automatic refreshConditionalOnly 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)

JSON
{  "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"]    }  }}
OptionTypeMeaning
visibilitystringPUBLIC (default) or CONNECTIONS.
disable_resharebooleanSets isReshareDisabledByAuthor.
alt_textsstring[]Alt text per image (by index) for multi-image posts.
articleobjectShare a link: { source, title, description, thumbnail? } with no media.
authorstringOverride the author URN (advanced; normally set by the connected account).
first_commentstringAuto-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

  1. Open the app's Products tab.
  2. Confirm OIDC Sign In and Share on LinkedIn are both added.
  3. Open Auth → OAuth 2.0 scopes and confirm all selected scopes.
  4. 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

  1. Confirm the connected account is an organization account, not only a member profile.
  2. Confirm the app has rw_organization_admin and the member is an administrator of the Page.
  3. Confirm the app has the LinkedIn Community Management / Marketing access tier required for the statistics endpoint.
  4. 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

Next, read Configure OAuth and connect accounts for the shared browser flow and Posts for the unified post payload.