www.linkedin.com · Social media · for: AI agent publishes posts on behalf of a member and, where approved, a company page.
Have your Company Page super admin ready, create the developer app, and add 'Sign In with LinkedIn using OpenID Connect' and 'Share on LinkedIn' to ship member posting now. In parallel, create a second, empty app and submit the Community Management API Development tier request so the company-page review clock starts.
Your path at a glance
Watch out for
- BlockerCompany-page posting isn't self-servewhy & fix →
- WarningSelf-serve apps get no refresh tokens, so the agent goes dark after 60 dayswhy & fix →
- WarningOne app, one shotwhy & fix →
- WarningChanging scopes logs everyone outwhy & fix →
- WarningUnversioned or stale calls failwhy & fix →
- WarningStrict data-retention rules constrain agent memorywhy & fix →
- InfoTight per-member capswhy & fix →
- InfoOIDC issuer differs from the docswhy & fix →
Before you start
Steps
Register the app
Configure OAuth
Review & verification
Customer-side setup
- 11Customer connects and has the right Page roleCustomer admindetails →
Copy & paste
openid profilew_member_socialw_organization_socialr_organization_socialrw_organization_admin- Developer console
- https://www.linkedin.com/developers/apps
- OAuth docs
- https://learn.microsoft.com/en-us/linkedin/shared/authentication/authorization-code-flow
- Authorize URL
- https://www.linkedin.com/oauth/v2/authorization
- Token URL
- https://www.linkedin.com/oauth/v2/accessToken
- Discovery
- https://www.linkedin.com/oauth/.well-known/openid-configuration
Show prompt
Add LinkedIn posting to this codebase so an AI agent can publish posts for a connected member and, when our app is approved for the Community Management API, for a company Page.
Requirements (as of Oct 2026):
- OAuth 2.0 authorization-code flow (web, confidential client). Authorize: https://www.linkedin.com/oauth/v2/authorization. Token: POST https://www.linkedin.com/oauth/v2/accessToken (application/x-www-form-urlencoded, include client_secret). Use a random 'state' and verify it.
- Scopes from env LINKEDIN_SCOPES. Member mode is 'openid profile w_member_social'; Page mode adds 'w_organization_social r_organization_social'. Changing scopes invalidates a member's old tokens, so store the granted scope string per connection.
- After token exchange, GET https://api.linkedin.com/v2/userinfo and store sub. Member author URN = urn:li:person:{sub}.
- Store access_token, expires_at (now + expires_in; normally 60 days), and refresh_token plus refresh_token_expires_at ONLY if present (most apps don't get them). Encrypt at rest; allow 1000+ char tokens.
- If refresh_token exists, refresh via grant_type=refresh_token before expiry. Never assume refresh extends the 365-day refresh TTL. Otherwise, mark the connection 'expiring' 7 days before expires_at and email a reconnect link.
- Posting: POST https://api.linkedin.com/rest/posts with headers Authorization: Bearer, Linkedin-Version: ${LINKEDIN_API_VERSION} (YYYYMM), X-Restli-Protocol-Version: 2.0.0, Content-Type: application/json. Body: {author, commentary, visibility:'PUBLIC', distribution:{feedDistribution:'MAIN_FEED', targetEntities:[], thirdPartyDistributionChannels:[]}, lifecycleState:'PUBLISHED', isReshareDisabledByAuthor:false}. Read the post URN from the x-restli-id response header.
- Errors: 401 means reconnect; 403 ACCESS_DENIED means a missing scope or Page role (ADMINISTRATOR/CONTENT_ADMIN/DIRECT_SPONSORED_CONTENT_POSTER) and should be shown clearly; 429 means exponential backoff plus a per-member daily counter (assume 150/day for Share on LinkedIn, 100/day per member and 500/day per app in Community Management Development tier).
- Compliance: don't persist LinkedIn member data (commenter profiles, comments) longer than 24-48 h, and never write it to long-term agent memory or embeddings.
Deliverables: connect/callback routes, a token store, a LinkedInClient.createPost/deletePost, an expiry-reminder job, and unit tests with mocked HTTP. Read all config from the .env template and don't hardcode secrets.Show bash
LINKEDIN_CLIENT_ID=your-client-id LINKEDIN_CLIENT_SECRET=your-client-secret LINKEDIN_REDIRECT_URI=https://app.example.com/api/linkedin/callback # Member mode (self-serve). Add 'w_organization_social r_organization_social' only on the Community Management-approved app. LINKEDIN_SCOPES="openid profile w_member_social" # YYYYMM; supported for ~1 year; bump regularly LINKEDIN_API_VERSION=202610 TOKEN_ENCRYPTION_KEY=generate-a-32-byte-random-key
Show bash
curl -i -X POST 'https://api.linkedin.com/rest/posts' \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Linkedin-Version: $LINKEDIN_API_VERSION" \
-H 'X-Restli-Protocol-Version: 2.0.0' \
-H 'Content-Type: application/json' \
--data '{
"author": "urn:li:person:REPLACE_WITH_SUB",
"commentary": "Test post from our agent (will be deleted)",
"visibility": "CONNECTIONS",
"distribution": {"feedDistribution": "MAIN_FEED", "targetEntities": [], "thirdPartyDistributionChannels": []},
"lifecycleState": "PUBLISHED",
"isReshareDisabledByAuthor": false
}'
# 201 Created; post URN is in the x-restli-id response headerShow typescript
export async function exchangeLinkedInCode(code: string) {
const res = await fetch("https://www.linkedin.com/oauth/v2/accessToken", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
grant_type: "authorization_code",
code,
client_id: process.env.LINKEDIN_CLIENT_ID!,
client_secret: process.env.LINKEDIN_CLIENT_SECRET!,
redirect_uri: process.env.LINKEDIN_REDIRECT_URI!,
}),
});
const t = await res.json();
if (!res.ok) throw new Error(`${t.error}: ${t.error_description}`);
const now = Date.now();
return {
accessToken: t.access_token as string,
expiresAt: new Date(now + t.expires_in * 1000),
scope: t.scope as string,
// Present only if LinkedIn enabled programmatic refresh tokens for this app
refreshToken: (t.refresh_token as string | undefined) ?? null,
refreshExpiresAt: t.refresh_token_expires_in ? new Date(now + t.refresh_token_expires_in * 1000) : null,
};
}Why & details
The reasoning, evidence and sources behind everything above. Hover a badge to see its sources.
The full picture
Partner / program gated
Posting as a member is self-serve and works within the hour (Share on LinkedIn grants w_member_social). Posting as a company page requires the vetted Community Management API: a legal-entity check, a Page-verified app, a capped Development tier, then a screencast review for Standard tier with no published timeline. Self-serve tokens last 60 days with no programmatic refresh, so an always-on agent needs a plan for re-consent or for getting refresh-token access.
Basic sign-in and member posting are open products anyone can add. The permission that makes a company-page agent useful (w_organization_social) only comes with the Community Management API. That API is a 'Vetted Product' that LinkedIn approves at its discretion ('a partner might not be upgraded even if they meet these minimum requirements'), with a rate-capped Development tier and a separately reviewed Standard tier. There's no per-customer install, so it isn't tenant-scoped.
Rating: Audits, partner approval or multi-week reviews that you can't speed up.
You have a LinkedIn account and a Company Page you (or a reachable super admin) control. You create an app and add the self-serve 'Sign In with LinkedIn using OpenID Connect' and 'Share on LinkedIn' products. That's enough to post as yourself.
Member posting is production-ready as soon as Share on LinkedIn is added, limited by rate caps (150 requests per member per day). Company-page posting without caps needs Community Management API Development tier approval, a full integration, then Standard tier approval after a screencast review.
What affects your setup
- Partner application
Community Management API access starts with an access request form that LinkedIn vets (approved use case, verified business email, verified organization, website and domain). Standard tier is a second application. A rejected app can't re-apply, so you create a new app and start over. Request it on a new app with no other API products.
- Business verification
The Community Management API is limited to 'registered legal organizations for commercial use cases only'. You give your legal name, registered address, website and privacy policy, and verify a business email (personal email addresses fail). A super admin of your organization's LinkedIn Page must verify the app; they have 30 days to use the verification URL.
- Manual app review
LinkedIn staff review both the Development tier request and the Standard tier upgrade. Standard tier checks your use case, privacy policy, compliance with the data-storage and restriction terms, and test credentials you provide for the reviewers. Changing app functionality after approval may trigger re-review.
- Demo video
Standard tier requires a high-resolution, downloadable screencast (narration recommended) showing each use case you declared. For page management that means the full OAuth flow, posting to the Page, how a member's comment is displayed, and which commenter profile fields you show.
- User cap until approved
The Community Management Development tier allows 500 API calls per app per 24 h and 100 per member per 24 h, with no BATCH_GET calls and push notifications (webhooks) disabled. You must finish the integration within 12 months of provisioning.
- Policy URLs required
A valid privacy policy is a Standard tier review criterion, and the access form asks for your website and privacy policy.
- Token lifecycle gotchas
Access tokens last 60 days. Programmatic refresh tokens are available only to 'a limited set of partners' (approved Marketing Developer Platform partners). Even then they're fixed at 365 days from first consent and refreshing doesn't extend them, so every member must re-consent at least yearly. Requesting a different scope set invalidates all of that member's previous access tokens.
- Redirect URI rules
Redirect URLs must be absolute, are registered on the app's Auth tab, can't contain '#', and have their query parameters ignored when matched. PKCE without a client secret exists only for native apps, uses http://127.0.0.1 or [::1] loopback redirects, and LinkedIn must enable it for your app.
Before you start — why each matters
- LinkedIn Company Page with a reachable super admin — The developer app is associated with your organization's Page. A Page super admin must verify the app, which is required before Community Management API vetting.
- Registered legal entity and business email — Community Management API access is for registered legal organizations with commercial use cases. You must verify a business email (personal email addresses fail) and provide your legal name, registered address and website.
- Public privacy policy — Required in the access form and checked at Standard tier review.
- App name and logo without LinkedIn marks — The app must not include any part of the LinkedIn or Microsoft names or logos (e.g. 'Linked' or 'In').
- Page roles for customer users — To post as a Page, the connecting member must be ADMINISTRATOR, CONTENT_ADMIN or DIRECT_SPONSORED_CONTENT_POSTER on it.
How well this guide is backed
Step details
Confirm who is super admin of your company's LinkedIn Page and get a business email and a public privacy policy URL ready. Decide early whether you need company-page posting, because that commits you to the Community Management API review track.
👤 Why you: A product/business judgement only you can make
🤖 What an agent can do: Draft the privacy-policy section on LinkedIn data use (24 h/48 h retention, no export) and a one-paragraph use-case description for the access forms.
https://www.linkedin.com/help/linkedin/answer/a548360/associate-an-app-with-a-linkedin-page?lang=en ↗In the Developer Portal, create an app: name (no LinkedIn marks), associated LinkedIn Page, privacy policy URL and logo. On the Auth tab, add absolute redirect URLs (no '#'), for example https://app.example.com/api/linkedin/callback, and copy the Client ID and Secret.
👤 Why you: Needs your logged-in console session (2FA/CAPTCHA)
🤖 What an agent can do: Prepare the exact field values and the redirect URL list, then put the client ID and secret into the .env template once a person pastes them.
https://www.linkedin.com/developers/apps/new ↗Go to Settings > Verify > Generate URL and send the URL to the Page super admin. They have 30 days to approve. Community Management vetting checks this.
👤 Why you: Needs your logged-in console session (2FA/CAPTCHA)
https://www.linkedin.com/help/learning/answer/a1665329 ↗On the Products tab, add 'Sign In with LinkedIn using OpenID Connect' (openid, profile, email) and 'Share on LinkedIn' (w_member_social). They're open permissions with no review.
👤 Why you: Needs your logged-in console session (2FA/CAPTCHA)
🤖 What an agent can do: None in the portal. Afterwards, check that the Auth tab lists the expected scopes.
https://www.linkedin.com/developers/apps ↗Use the authorization-code flow with state, the scope 'openid profile w_member_social', and a token exchange that includes client_secret. Store access_token and expires_at (60 days). Get 'sub' from /v2/userinfo. Create posts with POST https://api.linkedin.com/rest/posts, author urn:li:person:{sub} for members or urn:li:organization:{id} for Pages, sending the Linkedin-Version and X-Restli-Protocol-Version: 2.0.0 headers.
🤖 What an agent can do: Write the connect/callback routes, an encrypted token store with expiry tracking, and a postToLinkedIn(author, text, media?) helper. Uploads go through the Images and Videos APIs first; article posts need an explicit thumbnail, title and description because LinkedIn doesn't scrape URLs.
https://learn.microsoft.com/en-us/linkedin/marketing/community-management/shares/posts-api ↗Connect your own LinkedIn account and publish a CONNECTIONS-visibility test post, then delete it. Check the Analytics tab for your actual rate limits.
👤 Why you: Needs your logged-in console session (2FA/CAPTCHA)
🤖 What an agent can do: Write an end-to-end script that creates and then deletes (DELETE /rest/posts/{urn}) a test post, and logs the response headers and x-restli-id.
https://www.linkedin.com/developers/apps ↗Request it on a new developer app that has no other API products; the option is greyed out otherwise. Fill in legal name, address, website, privacy policy and use case, and verify the business email. If you're rejected, you must create another new app to re-apply.
👤 Why you: Waiting on the provider's reviewers
🤖 What an agent can do: Draft the form answers, and check them against the restricted-use-cases page (no social-feed display, no CRM enrichment, no sales or recruiting use of member data).
https://learn.microsoft.com/en-us/linkedin/marketing/community-management-app-review ↗Implement the Page picker, w_organization_social posting, and display of comments on the Page's posts, all within 500 calls per app and 100 per member per day with no BATCH_GET. You have 12 months from provisioning.
🤖 What an agent can do: Implement org posting, comment display and a client-side rate budget (500 per app per day). Avoid BATCH_GET.
https://learn.microsoft.com/en-us/linkedin/marketing/increasing-access ↗Record a high-resolution, downloadable, narrated screencast showing the OAuth flow, posting to a Page, how comments are displayed, and which commenter profile fields are shown. Submit it with a company/product overview and reviewer test credentials, via My Apps > Products.
👤 Why you: Record a demo video
🤖 What an agent can do: Write the screencast script and shot list mapped one-to-one to the review checklist, and seed a demo account with test data.
https://learn.microsoft.com/en-us/linkedin/marketing/community-management-app-review ↗Track each member's 60-day expiry and ask them to reconnect before it lapses, or use refresh tokens if LinkedIn enabled them. Bump Linkedin-Version at least yearly; the 202511 version sunsets November 16, 2026. Add a business email to the app so deprecation notices reach you.
🤖 What an agent can do: Add a daily job that emails members whose tokens expire within 7 days, plus a CI check that fails when LINKEDIN_API_VERSION is more than 10 months old.
https://learn.microsoft.com/en-us/linkedin/marketing/versioning ↗Each customer member signs in and approves the scopes. To post as their company Page, a Page admin must first grant them ADMINISTRATOR, CONTENT_ADMIN or DIRECT_SPONSORED_CONTENT_POSTER, otherwise posting returns 403 ACCESS_DENIED.
👤 Why you: Your customer's admin must act
🤖 What an agent can do: Show a clear message on 403 explaining which Page role is missing, and only list Pages the member can actually post to.
Gotchas explained
- BlockerCompany-page posting isn't self-serve
w_organization_social comes only with the Community Management API (or Advertising API). The Development tier caps you at 500 calls per app per day, which is a handful of customers.
Fix: Launch with member posting first and apply for Community Management Development tier on a fresh app immediately. Budget for the Standard tier screencast review.
- WarningSelf-serve apps get no refresh tokens, so the agent goes dark after 60 days
Programmatic refresh tokens are limited to approved partners. With Share on LinkedIn alone, every member token dies at 60 days. Re-running the authorize flow is silent only if the member is logged in to linkedin.com in that browser and the old token hasn't expired yet, which doesn't help a backend agent.
Fix: Track expires_at and send members a one-click reconnect before day 60. Ask whether refresh tokens are enabled once you're Community Management-approved, and if they are, still plan for yearly re-consent.
- WarningOne app, one shot
Community Management must be requested on a new app with no other products. If either tier is rejected, you can't re-apply with that app and must create a new one and start at Development tier again.
Fix: Read the review requirements and restricted use cases before submitting. Keep your Sign-in/Share app separate from the Community Management app until approved.
- WarningChanging scopes logs everyone out
If you request a different scope set than a member previously granted, all of that member's previous access tokens are invalidated.
Fix: Fix the scope set per app before launch. When you add Page scopes later, migrate members deliberately with a reconnect prompt.
- WarningUnversioned or stale calls fail
/rest APIs require Linkedin-Version. Versions are supported for about a year, and missing or deprecated headers return errors. 202511 sunsets November 16, 2026, and older versions are already gone.
Fix: Pin the version in config, upgrade on a schedule, and watch the recent-changes page.
- WarningStrict data-retention rules constrain agent memory
Member social activity can be stored for at most 48 h and most profile data for 24 h. Member data can't be combined with other data, exported to customers, or used for sales, recruiting or CRM enrichment.
Fix: Don't put LinkedIn comments or profiles into long-term agent memory or vector stores. Store only your own post IDs and content, and set TTLs on cached member data.
- InfoTight per-member caps
Share on LinkedIn allows 150 requests per member per day. Other limits are unpublished and visible only in the app's Analytics tab after you've called the endpoint. Over-limit calls get 429, and alerts arrive 1–2 h late.
Fix: Count calls per member, back off on 429, and make one test call to each endpoint so its limit shows up in Analytics.
- InfoOIDC issuer differs from the docs
The live discovery document's issuer is https://www.linkedin.com/oauth, while the OIDC doc sample shows https://www.linkedin.com. ID-token validation hardcoded from the docs can reject valid tokens.
Fix: Configure your OIDC client from the discovery URL, and validate 'iss' against the value of an actual ID token.
Why each scope
| Scope | Why you need it | Tier | Evidence |
|---|---|---|---|
openid profile | Identify the member and get their 'sub', which becomes the author urn:li:person:{sub} on posts. | basic | |
w_member_social | Create posts (and comments or likes) as the authenticated member. Self-serve through the 'Share on LinkedIn' product, and also bundled with the Community Management API. | sensitive | |
w_organization_social | Post as a company page. The member must hold ADMINISTRATOR, CONTENT_ADMIN or DIRECT_SPONSORED_CONTENT_POSTER on that Page. Available only via the Community Management API (or the Advertising API). | restricted | |
r_organization_social | Optional. Read the Page's posts and engagement, for example to confirm a post published or to avoid duplicates. Same role restrictions as w_organization_social. | restricted | |
rw_organization_admin | Optional. Look up which Pages the member administers so the agent can offer a Page picker. Restricted to Pages where the member is ADMINISTRATOR. | restricted |
Reference facts
- Access token lifetime60 days (expires_in about 5,184,000 s). Tokens are about 500 characters; LinkedIn says to plan storage for at least 1,000.
- Refresh tokensOnly for apps LinkedIn has enabled (approved MDP partners). They have a fixed 365-day TTL that refreshing doesn't extend. Self-serve apps must re-run the authorize flow; it's silent only while the member is logged in to linkedin.com and their token hasn't expired.
- Discovery and issuerLive discovery reports issuer 'https://www.linkedin.com/oauth', but the OIDC doc's sample shows 'https://www.linkedin.com'. Scopes are openid, profile and email only, with pairwise subjects, RS256, and response_type code only.
- Authorization codeValid for 30 minutes. Members can't pick a subset of scopes; they approve all or nothing.
- Required API headersUse Linkedin-Version: YYYYMM (latest is 202610) and X-Restli-Protocol-Version: 2.0.0 on /rest/* calls. Versions are supported for at least 1 year; 202511 sunsets November 16, 2026. Missing or deprecated versions return errors.
- Rate limitsShare on LinkedIn: 150 requests per member and 100,000 per app per day. Community Management Development tier: 500 per app and 100 per member per 24 h. Limits reset at midnight UTC and return 429 when exceeded. Other limits are unpublished; check the app's Analytics tab after one call.
- Error shape for a bad clientAn invalid client_id returns HTTP 200 with an HTML error page ('The passed in client_id is invalid'), not a redirect to your redirect_uri. A bogus code at the token endpoint returns 401 invalid_request.
- Data retention limitsUnder the Marketing API terms you may store member social activity for at most 48 h and most profile data for 24 h. No combining it with other data, no CRM enrichment, and no exporting it to customers.
- PKCE (from discovery document)Not advertised in the discovery document (it may only describe OpenID sign-in; check the docs)
- Scopes advertised in discoveryopenid, profile, email
- Endpoints observed liveAuthorize: HTTP 200; serves an HTML login/consent page; → endpoint is live (client validation may happen after login) · Token: HTTP 401; error "invalid_request: Unable to retrieve access token: authorization code not found"; → token endpoint is live and rejects a bogus code
What we verified — and what we couldn't
Live probes (no credentials)
- ✓discovery
https://www.linkedin.com/oauth/.well-known/openid-configurationHTTP 200; issuer https://www.linkedin.com/oauth; authorize https://www.linkedin.com/oauth/v2/authorization; PKCE methods: not advertised[P1] - ✓authorize
https://www.linkedin.com/oauth/v2/authorizationHTTP 200; serves an HTML login/consent page; → endpoint is live (client validation may happen after login)[P2] - ✓token
https://www.linkedin.com/oauth/v2/accessTokenHTTP 401; error "invalid_request: Unable to retrieve access token: authorization code not found"; → token endpoint is live and rejects a bogus code[P3] - ✓page
https://www.linkedin.com/developers/appsHTTP 200; title "Developers | LinkedIn"[P4] - ✓page
https://learn.microsoft.com/en-us/linkedin/shared/authentication/authorization-code-flowHTTP 200; title "LinkedIn 3-Legged OAuth Flow - LinkedIn | Microsoft Learn"[P5]
Open questions
- Does POST /rest/posts accept a token from a self-serve Share on LinkedIn app, or must self-serve apps use the legacy /v2/ugcPosts?The Share on LinkedIn doc (last updated 2023) still shows /v2/ugcPosts, while the Posts API doc says it 'replaces the ugcPosts API' and lists w_member_social. Only a vendor blog reports a successful self-serve /rest/posts call (September 2026).To resolve: With your own token, create and then delete a CONNECTIONS-visibility post via /rest/posts using Linkedin-Version 202610.
- Do Community Management API–approved apps receive programmatic refresh tokens?The refresh-token doc says they're for 'all approved Marketing Developer Platform (MDP) partners' and elsewhere 'a limited set of partners'. It doesn't say whether Community Management Development or Standard tier counts.To resolve: After approval, check whether the token response includes refresh_token and refresh_token_expires_in. Otherwise ask Developer Support.
- How long do the Development and Standard tier reviews take?No timelines are published, approval is discretionary, and a May 2026 changelog note mentions access requests 'expired (after 21 days)'.To resolve: Apply as early as possible and follow up through the Developer Support portal. Record actual turnaround to update this guide.
- After Community Management approval, can the same app also carry Sign In with LinkedIn (OpenID Connect)?The FAQ only says to request Community Management on apps with no other API products. It doesn't say whether products can be added after approval.To resolve: Ask Developer Support before you design a single-app architecture. Default to two apps (sign-in/member posting vs Page management).
- Is a Company Page required just to create any developer app?LinkedIn's help says a Page association is required 'for certain functionality and products'. Community guides say the create-app form requires a Page. We didn't log in to check.To resolve: Open https://www.linkedin.com/developers/apps/new while logged in and check whether the LinkedIn Page field is mandatory.
Ask the provider
A ready-to-send message built from the open questions above.
- Send to
- No contact channel found — check https://learn.microsoft.com/en-us/linkedin/shared/authentication/authorization-code-flow for developer support
- Subject
- OAuth integration questions — LinkedIn
Hi LinkedIn developer support team, We're building an integration where AI agent publishes posts on behalf of a member and, where approved, a company page. Before we register an OAuth app and launch to customers, we couldn't find answers to the following in your documentation: 1. Does POST /rest/posts accept a token from a self-serve Share on LinkedIn app, or must self-serve apps use the legacy /v2/ugcPosts? (What we found: The Share on LinkedIn doc (last updated 2023) still shows /v2/ugcPosts, while the Posts API doc says it 'replaces the ugcPosts API' and lists w_member_social. Only a vendor blog reports a successful self-serve /rest/posts call (September 2026).) 2. Do Community Management API–approved apps receive programmatic refresh tokens? (What we found: The refresh-token doc says they're for 'all approved Marketing Developer Platform (MDP) partners' and elsewhere 'a limited set of partners'. It doesn't say whether Community Management Development or Standard tier counts.) 3. How long do the Development and Standard tier reviews take? (What we found: No timelines are published, approval is discretionary, and a May 2026 changelog note mentions access requests 'expired (after 21 days)'.) 4. After Community Management approval, can the same app also carry Sign In with LinkedIn (OpenID Connect)? (What we found: The FAQ only says to request Community Management on apps with no other API products. It doesn't say whether products can be added after approval.) 5. Is a Company Page required just to create any developer app? (What we found: LinkedIn's help says a Page association is required 'for certain functionality and products'. Community guides say the create-app form requires a Page. We didn't log in to check.) Could you point us to the right documentation or process — including whether any review or approval is needed before customers outside our own account can connect, and the typical timeline? Thanks, [Your name] [Company · website]
Sources
- S1LinkedIn 3-Legged OAuth Flow (Microsoft Learn, updated 2026-05-15)official
- S2Refresh Tokens with OAuth 2.0 (Microsoft Learn)official
- S3Getting Access to LinkedIn APIs (Microsoft Learn, updated 2026-06-03)official
- S4Share on LinkedIn (Microsoft Learn)official
- S5Sign In with LinkedIn using OpenID Connect (Microsoft Learn)official
- S6Community Management - Overview (Microsoft Learn, li-lms-2026-10)official
- S7Increasing Access — Marketing API tiers and permissions (Microsoft Learn, updated 2026-10-19)official
- S8Community Management App Review (Microsoft Learn)official
- S9LMS API Documentation Versioning (Microsoft Learn, updated 2026-10-14)official
- S10LinkedIn API Rate Limiting (Microsoft Learn)official
- S11Posts API (Microsoft Learn, li-lms-2026-10)official
- S12Restricted Uses of LinkedIn Marketing APIs and Data (Microsoft Learn)official
- S13Recent Marketing API Changes (Microsoft Learn, updated 2026-10-19)official
- S14Authenticating with OAuth 2.0 for Native Clients (PKCE) (Microsoft Learn)official
- S15Associate an app with a LinkedIn Page (LinkedIn Help)official
- S16Send an app verification request for a LinkedIn Page (LinkedIn Help)official
- S17OpenTweet: LinkedIn API 403 on /rest/posts (reports self-serve app accepted at /rest/posts, Sept 2026)community
- T1Probe: GET https://www.linkedin.com/oauth/.well-known/openid-configuration → 200, issuer https://www.linkedin.com/oauth, scopes openid/profile/email, pairwise subjectsprobe
- T2Probe: GET authorize with client_id=probe-invalid → HTTP 200 HTML 'The passed in client_id is invalid "probe-invalid"' (no redirect)probe
- T3Probe: POST token endpoint with code=bogus → HTTP 401 invalid_request 'authorization code not found'probe
- T4Probe: POST token endpoint grant_type=refresh_token with bogus token → HTTP 400 invalid_grant 'The provided authorization grant or refresh token is invalid, expired or revoked.'probe
- T5Probe: GET https://api.linkedin.com/rest/posts without token → 401 EMPTY_ACCESS_TOKEN; with bogus Bearer and any/missing Linkedin-Version → 401 INVALID_ACCESS_TOKENprobe
- P1Our probe: discovery check on www.linkedin.comprobe
- P2Our probe: authorize check on www.linkedin.comprobe
- P3Our probe: token check on www.linkedin.comprobe
- P4Our probe: page check on www.linkedin.comprobe
- P5Our probe: page check on learn.microsoft.comprobe