A reference guide for building AI agents: every method, how to authenticate, and the permissions each one needs.
The LinkedIn API is how an app or AI agent works with LinkedIn: signing a member in, publishing a post for a person or a company page, reading and writing comments and reactions, and managing advertising accounts and campaigns. Access runs through OAuth 2.0, where a member consents and the app receives a token, and the permissions that token can carry depend on which Products and partner programs LinkedIn has approved for the app. Most of the API is gated behind that approval, and the Marketing and Community Management areas are versioned by month.
How an app or AI agent connects to LinkedIn determines what it can reach. Access runs through OAuth 2.0, and the permissions a token carries depend on which Products and partner programs LinkedIn has approved for the app.
The versioned Marketing and Community Management APIs answer under https://api.linkedin.com/rest/ and require a Linkedin-Version header in YYYYMM format on every call, plus the X-Restli-Protocol-Version: 2.0.0 header. Identifiers are URNs, such as urn:li:organization:123, and many list endpoints use Rest.li finders.
Sign In with LinkedIn using OpenID Connect and the userinfo endpoint answer under https://api.linkedin.com/v2 and do not take a version header. This is the self-serve route for authenticating a member and reading their lite profile.
Within the Community Management API, approved partners can receive push notifications for social actions instead of polling. There is no general-purpose webhook system across the LinkedIn API, and push notifications are disabled at the Community Management Development access tier.
The member grants consent through LinkedIn's authorization page, and the app exchanges the resulting code for an access token that acts on that member's behalf. Access tokens currently last 60 days, and refresh tokens last longer but are available only to a limited set of partners. Almost every LinkedIn permission is a member permission.
Some endpoints, mostly in the Sales Navigator and other partner programs, use the client credentials flow, where the app authenticates as itself rather than a member. This route is limited to specific approved programs.
An identity layer on top of OAuth 2.0. The openid scope returns an RS256-signed ID token (a JWT) alongside the access token, so the app learns who the member is without an extra call. The profile and email scopes add lite profile and email claims. This Product is open and self-serve.
The LinkedIn API is split into areas an agent can act on, such as member sign-in, posts, comments and reactions, organization pages, media, and advertising. Each area has its own methods and its own permissions, and most are gated behind an approved Product or partner program.
Authenticate a member with OpenID Connect and retrieve their lite profile, including name, picture, and email.
Create, retrieve, update, and delete posts for a member or an organization page, including text, images, video, documents, articles, and reshares.
Read posts created through the older ugcPosts API, which the Posts API replaces.
Read and write comments on posts, and add or remove reactions such as Like, Celebrate, and Love.
Register and retrieve image and video assets for use in posts and ads.
Look up company pages by id or vanity name and read an organization's follower count.
Create, read, update, and search advertising accounts, campaign groups, and campaigns.
Filter by method, access, or permission, or search any path. Select a row for version detail, rate limits, the related webhook event, and the source.
| Method | Endpoint | What it does | Access | Permission | Version | |
|---|---|---|---|---|---|---|
Sign In & profileAuthenticate a member with OpenID Connect and retrieve their lite profile, including name, picture, and email.2 | ||||||
| GET | /v2/userinfo | Retrieve the authenticated member's profile claims (sub, name, given_name, family_name, picture, locale, and optionally email and email_verified) after Sign In with LinkedIn using OpenID Connect. | read | profile | Current | |
Part of the open Sign In with LinkedIn using OpenID Connect Product, which is self-serve. Needs the openid and profile scopes; the email and email_verified fields need the email scope. The member's email address is returned only when email is granted. Acts onmember Permission (capability) profileVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /oauth/.well-known/openid-configuration | Retrieve the OpenID Connect discovery document, listing the authorization, token, userinfo, and JWKS endpoints and the supported scopes and claims. | read | — | Current | |
Public metadata, served from www.linkedin.com, no token required. The jwks_uri at /oauth/openid/jwks holds the public keys used to verify the RS256-signed ID token. Acts ondiscovery document Permission (capability)None required VersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
PostsCreate, retrieve, update, and delete posts for a member or an organization page, including text, images, video, documents, articles, and reshares.5 | ||||||
| POST | /rest/posts | Create a post for a member or organization, with text, image, video, document, article, poll, multi-image, or reshare content. | write | w_member_social | Current | |
Posting as a member needs w_member_social; posting as an organization needs w_organization_social, and the member must hold an ADMINISTRATOR, DIRECT_SPONSORED_CONTENT_POSTER, or CONTENT_ADMIN page role. Returns 201 with the post URN in the x-restli-id header. Needs the Share on LinkedIn, Community Management, or Advertising Product. Acts onpost Permission (capability) w_member_socialVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /rest/posts/{postUrn} | Retrieve a single post by its share or ugcPost URN, optionally with viewContext set to AUTHOR to see unpublished states. | read | r_organization_social | Current | |
Reading organization posts needs r_organization_social with an admin page role; reading a member's own posts needs the restricted r_member_social, granted to approved partners only. The URN must be URL encoded. Acts onpost Permission (capability) r_organization_socialVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /rest/posts?q=author&author={authorUrn} | Find all posts authored by a member or organization, paginated and sorted by last modified or created time. | read | r_organization_social | Current | |
Finding an organization's posts needs r_organization_social; finding a person's posts needs the restricted r_member_social. Returns both organic and sponsored posts; the isDsc filter is deprecated. Max count is 100. Acts onpost Permission (capability) r_organization_socialVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /rest/posts/{postUrn} | Partially update a post, changing fields such as commentary, the call-to-action label and landing page, or the sponsored-content name and status. | write | w_organization_social | Current | |
Sent as a partial update with the X-RestLi-Method: PARTIAL_UPDATE header. Needs w_organization_social or w_member_social depending on the author. A successful update returns 204. Acts onpost Permission (capability) w_organization_socialVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| DELETE | /rest/posts/{postUrn} | Delete a single post by its share or ugcPost URN. | write | w_organization_social | Current | |
Deletion is idempotent and returns 204, even for an already-deleted post. Batch delete is not supported. Needs w_organization_social or w_member_social depending on the author. Acts onpost Permission (capability) w_organization_socialVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
Shares (legacy ugcPosts)Read posts created through the older ugcPosts API, which the Posts API replaces.1 | ||||||
| GET | /v2/ugcPosts/{ugcPostUrn} | Retrieve a post created through the legacy ugcPosts API, which the Posts API now replaces. | read | r_organization_social | Current | |
ugcPosts is the older content API; new integrations should use the Posts API. Reading an organization's posts needs r_organization_social. Acts onugcPost Permission (capability) r_organization_socialVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
Comments & reactionsRead and write comments on posts, and add or remove reactions such as Like, Celebrate, and Love.6 | ||||||
| POST | /rest/socialActions/{entityUrn}/comments | Create a comment on a share, ugcPost, or another comment, as a member or organization, optionally with a mention or image. | write | w_member_social_feed | Current | |
Commenting as a member needs w_member_social_feed; as an organization, w_organization_social_feed with an admin page role. The new comment's id is returned in the x-restli-id header. Part of the Community Management Product. Acts oncomment Permission (capability) w_member_social_feedVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /rest/socialActions/{entityUrn}/comments | Retrieve the comments on a share, ugcPost, or comment, including nested replies. | read | r_organization_social_feed | Current | |
Reading an organization's comments needs r_organization_social_feed with an admin page role; reading a member's own needs the restricted r_member_social_feed. A single comment is fetched at /comments/{commentId}. Acts oncomment Permission (capability) r_organization_social_feedVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| DELETE | /rest/socialActions/{entityUrn}/comments/{commentId} | Delete a comment, passing the acting organization URN as the actor query parameter when deleting as an organization. | write | w_member_social_feed | Current | |
Needs w_member_social_feed, or w_organization_social_feed when deleting as an organization. The actor query parameter is required only for organization deletes. Acts oncomment Permission (capability) w_member_social_feedVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /rest/reactions?actor={actorUrn} | Create a reaction on a share or comment, with reactionType such as LIKE, PRAISE (Celebrate), EMPATHY (Love), INTEREST (Insightful), APPRECIATION (Support), or ENTERTAINMENT (Funny). | write | w_member_social_feed | Current | |
Reacting as a member needs w_member_social_feed; as an organization, w_organization_social_feed with an admin page role. The MAYBE reactionType is deprecated and returns 400. Returns 201 on success. Acts onreaction Permission (capability) w_member_social_feedVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /rest/reactions/(entity:{entityUrn})?q=entity | Retrieve the reactions on a share or comment, sorted chronologically, reverse-chronologically, or by relevance. | read | r_organization_social_feed | Current | |
Reading an organization's reactions needs r_organization_social_feed with an admin page role; reading a member's own needs the restricted r_member_social_feed. A single reaction is fetched by its actor-and-entity composite key. Acts onreaction Permission (capability) r_organization_social_feedVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| DELETE | /rest/reactions/(actor:{actorUrn},entity:{entityUrn}) | Delete a reaction, identified by the composite key of the acting member or organization and the target share or comment. | write | w_member_social_feed | Current | |
Needs w_member_social_feed, or w_organization_social_feed when removing an organization's reaction. Returns 204 on success. Acts onreaction Permission (capability) w_member_social_feedVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
Media uploadRegister and retrieve image and video assets for use in posts and ads.3 | ||||||
| POST | /rest/images?action=initializeUpload | Register an image upload for a member, organization, or sponsored account, returning a temporary upload URL and an image URN to use in a post. | write | w_organization_social | Current | |
Accepts rw_ads, w_member_social, or w_organization_social. For a company owner the caller needs an ADMIN or DSC page role; for a member owner the caller must match the owner. Image is then PUT to the returned upload URL. Acts onimage Permission (capability) w_organization_socialVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /rest/images/{imageUrn} | Retrieve an image asset, including its processing status and a temporary download URL. | read | w_organization_social | Current | |
On versioned calls, a token holding only w_member_social cannot GET an image, since that scope is write-only here; w_organization_social or rw_ads is needed to read. For a company-owned image the caller needs an admin or DSC page role. Acts onimage Permission (capability) w_organization_socialVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /rest/videos?action=initializeUpload | Register a video upload for a member or organization, returning the upload instructions and a video URN to use in a post. | write | w_organization_social | Current | |
Mirrors the Images API permission model: rw_ads, w_member_social, or w_organization_social, with an admin or DSC page role for an organization owner. The video is uploaded in parts to the returned URLs and finalized. Acts onvideo Permission (capability) w_organization_socialVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
OrganizationsLook up company pages by id or vanity name and read an organization's follower count.3 | ||||||
| GET | /rest/organizations/{organizationId} | Retrieve a company page the authenticated member administers, returning the full set of organization fields. | read | rw_organization_admin | Current | |
Full fields require the member to hold the ADMINISTRATOR role on the organization; a non-admin lookup returns 403 or only public fields. Needs the Community Management or Advertising Product. Acts onorganization Permission (capability) rw_organization_adminVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /rest/organizations?q=vanityName&vanityName={name} | Find an organization by its vanity name, returning public fields such as id, name, vanity name, logo, and locations. | read | rw_organization_admin | Current | |
Returns non-admin (public) fields and so works without administering the page. Wildcards and boolean logic are not supported in the search string. Acts onorganization Permission (capability) rw_organization_adminVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /rest/networkSizes/{organizationUrn}?edgeType=COMPANY_FOLLOWED_BY_MEMBER | Retrieve the number of members following an organization (its first-degree network size). | read | r_organization_social | Current | |
The edgeType value changed from CompanyFollowedByMember to COMPANY_FOLLOWED_BY_MEMBER in v202305, and the two are not interchangeable across versions. Acts onorganization Permission (capability) r_organization_socialVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
Marketing (ads)Create, read, update, and search advertising accounts, campaign groups, and campaigns.8 | ||||||
| GET | /rest/adAccounts?q=search | Search advertising accounts the caller can access, filtering by id, name, reference, type, and status. | read | r_ads | Current | |
Needs r_ads or rw_ads, plus an ad account role on each account. From v202401 this finder uses cursor pagination via pageToken and pageSize (max 1,000). Part of the Advertising API Product. Acts onad account Permission (capability) r_adsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /rest/adAccounts/{adAccountId} | Retrieve a single advertising account by id, including its currency, status, and serving statuses. | read | r_ads | Current | |
Needs r_ads or rw_ads. The VIEWER ad account role is read-only even with the rw_ads scope. Acts onad account Permission (capability) r_adsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /rest/adAccounts | Create a BUSINESS advertising account, optionally tied to an organization and optionally flagged as a test account. | write | rw_ads | Current | |
Needs rw_ads with an ACCOUNT_BILLING_ADMIN, ACCOUNT_MANAGER, CAMPAIGN_MANAGER, or CREATIVE_MANAGER role. Only BUSINESS accounts can be created through the API. At the Development access tier each app can create only one test account. Acts onad account Permission (capability) rw_adsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /rest/adAccounts/{adAccountId} | Partially update an advertising account, such as renaming it or setting its status to PENDING_DELETION. | write | rw_ads | Current | |
Sent as a partial update with the X-RestLi-Method: PARTIAL_UPDATE header; returns 204. A non-draft account is removed by setting status to PENDING_DELETION; only the billing admin can delete. Acts onad account Permission (capability) rw_adsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /rest/adAccounts/{adAccountId}/adCampaignGroups?q=search | Search the campaign groups under an advertising account, filtering by status and other fields. | read | r_ads | Current | |
Needs r_ads or rw_ads with an ad account role. Campaign groups are nested under their ad account in the path. Acts oncampaign group Permission (capability) r_adsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /rest/adAccounts/{adAccountId}/adCampaigns?q=search | Search the campaigns under an advertising account, filtering by status and other fields. | read | r_ads | Current | |
Needs r_ads or rw_ads with an ad account role. Campaigns are nested under their ad account in the path. Acts oncampaign Permission (capability) r_adsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| POST | /rest/adAccounts/{adAccountId}/adCampaigns | Create a campaign under an advertising account, with its type, budget, cost type, status, and targeting criteria. | write | rw_ads | Current | |
Needs rw_ads with an editing ad account role. An account holds at most 5,000 campaigns. At the Development access tier, edits are limited to up to five ad accounts. Acts oncampaign Permission (capability) rw_adsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
| GET | /rest/adAccounts/{adAccountId}/adCampaigns/{adCampaignId} | Retrieve a single campaign by id under its advertising account. | read | r_ads | Current | |
Needs r_ads or rw_ads with an ad account role. Acts oncampaign Permission (capability) r_adsVersionAvailable since the API’s base version Webhook eventNone Rate limitStandard limits apply SourceOfficial documentation ↗ | ||||||
LinkedIn has no general-purpose webhook system for most APIs. Social-action push notifications exist only within the Community Management API for approved partners, and are disabled at the Development access tier, so most integrations learn about activity by calling the API.
| Event | What it signals | Triggered by |
|---|
LinkedIn limits how much an app or AI agent can call through two daily quotas that reset at midnight UTC: one for the whole application and one for each member's token. The exact ceiling depends on the endpoint and is shown in the Developer Portal rather than published in the docs.
LinkedIn rate-limits by daily call counts that reset at midnight UTC, not by a per-second rate. Two quotas apply at once: an application limit on the total calls the app makes in a day, and a member limit on the calls a single member's token can make in a day through the app. The ceiling depends on the endpoint and is not published in the docs; an app sees the limit for any endpoint it has called that day on the Analytics tab of the Developer Portal. As a concrete example, the Community Management Development access tier caps an app at 500 calls per 24 hours and 100 calls per member per 24 hours, with batch-get calls disabled, while the Standard tier removes those restrictions. Exceeding a limit returns a 429 response, and developer admins get an email alert once an application-level quota passes 75 percent, roughly one to two hours after the fact.
Most list endpoints use Rest.li paging with start and count parameters, where count tops out at 100 on the Posts finder and up to 1,000 on some others such as images and ad accounts, and a links array with a next href carries the cursor to the following page. From version 202401, the advertising search finders moved to cursor-based pagination using pageSize and pageToken, with nextPageToken returned in the response metadata.
Requests and responses are JSON over HTTPS, with identifiers expressed as URNs that must be URL-encoded in paths and query strings. Access tokens are around 500 characters today, and LinkedIn advises planning for at least 1,000. Images must be under 36,152,320 pixels in JPG, GIF, or PNG, with GIFs up to 250 frames. An ad account holds at most 5,000 campaigns and 15,000 creatives.
The status codes an agent should handle, and what to do about each.
| Status | Code | Meaning | What to do |
|---|---|---|---|
| 400 | INVALID_URN_TYPE / MISSING_FIELD | The request was malformed: a URN is the wrong type or invalid, a required field is missing, an enum value is invalid, or a Rest.li 2.0 query parameter is not encoded correctly. | Fix the named field or URN, ensure required fields are present, and URL-encode URNs and query parameters for Rest.li 2.0. |
| 401 | EMPTY_ACCESS_TOKEN / invalid_request | The OAuth access token is missing, invalid, or expired, or an OAuth flow parameter such as redirect_uri or client_id does not match. | Send a valid Bearer token, refresh it before its 60-day expiry, and confirm the redirect URI and client credentials match the app. |
| 403 | ACCESS_DENIED | The token lacks the required scope, the app lacks the Product that grants it, or the member lacks the needed company page or ad account role for the target. | Grant the missing scope, apply for the Product or partner program that provides it, and confirm the member holds the right page or account role. |
| 404 | NOT_FOUND | The requested entity does not exist, was deleted, or is an inactive organization. | Confirm the URN or id is correct and that the entity is still active. |
| 426 | Version header missing or deprecated | A versioned call was sent without a Linkedin-Version header, or with a version that has been sunset, such as 202506. | Send a Linkedin-Version header in YYYYMM format set to a supported version, and migrate off any sunset version. |
| 429 | TOO_MANY_REQUESTS | A daily rate limit was exceeded, either the application-level or the per-member quota for that endpoint, both of which reset at midnight UTC. LinkedIn may also return 429 briefly as infrastructure protection. | Slow down and retry after the daily reset, and check the endpoint's limit on the app's Analytics tab in the Developer Portal. |
| 500 | INTERNAL_SERVER_ERROR | An unexpected error on LinkedIn's side. A 503 SERVICE_UNAVAILABLE means the service is temporarily unavailable. | Retry after a short delay, and contact LinkedIn Developer Support if it persists. |
LinkedIn versions its Marketing and Community Management APIs by month through the Linkedin-Version header, in YYYYMM format. The newest version is 202606, a new version ships every month, and each is supported for at least one year before it is sunset.
LinkedIn's Marketing and Community Management APIs are versioned by month through the Linkedin-Version header in YYYYMM format. 202606 is the latest version, served from the base path https://api.linkedin.com/rest/. A new version ships each month and is supported for at least one year, and every versioned call must name a version since the latest is not applied by default.
The r_member_profileAnalytics permission, which returns a member's profile viewers, followers, and search appearances, became available in versions from 202504 onward under the Community Management API.
The r_member_postAnalytics permission, returning impressions, reactions, comments, and shares for a member's posts, became available from version 202506. The 202506 version itself (Marketing June 2025) has since been sunset, and integrations are advised to migrate to a supported version.
From version 202401, the advertising search finders moved from index-based pagination to cursor-based pagination, using pageSize and pageToken, with nextPageToken returned in the response metadata.
LinkedIn's first versioned Marketing API release was June 2022, under the new base path https://api.linkedin.com/rest/. The Posts API was introduced to replace the older ugcPosts content API, and the Images API replaced the Assets (Vector) API.
Every versioned call must name a version; the latest is not applied by default.
LinkedIn Marketing API changelog ↗Bollard AI sits between a team's AI agents and LinkedIn. Grant each agent exactly the access it needs, read or write, area by area, and every call is checked and logged.