LinkedIn Public API: What You Can Get Without Logging In
LinkedIn's official APIs don't give you arbitrary profiles or company pages. Apart from a few open permissions that only cover the member who signs in to your app, access goes through partner programs that LinkedIn has to approve. What you can get without any of that is what LinkedIn shows a logged-out visitor: a profile's name, headline, location and bio, a company's About page, a company's most recent posts, single public posts, and the Ad Library.
This guide covers what each route returns, field by field, and where the logged-out version runs out.
What LinkedIn's official APIs require
LinkedIn's API uses OAuth 2.0, and its Getting Access page is direct about the gate: "Most permissions and partner programs require explicit approval from LinkedIn. Open Permissions are the only permissions that are available to all developers without special approval."
The open permissions are three:
profile: the authenticated member's name, headline and photo.email: the authenticated member's primary email address.w_member_social: post, comment and like on behalf of the authenticated member.
All three are about the member who signed in to your app. None of them looks up someone else's profile or a company page. Everything else sits behind a program:
- Advertising API (marketing): "must be approved"; you apply from the Developer Portal.
- Sales Navigator Application Platform (SNAP): requires approval as a SNAP partner.
- Talent integrations: by application.
- Compliance: closed, "may not be requested".
If your product fits one of those programs, apply. That is the route to data LinkedIn only shows to signed-in members.
What "logged out" means in practice
Open a LinkedIn profile in a private browser window. Some of it renders, and the rest is behind a "Sign in" prompt. Captapi reads only the part that renders. It doesn't sign in, doesn't use LinkedIn accounts or session cookies, and doesn't try to get past the sign-in wall. When LinkedIn serves its sign-in page instead of the public one, the call fails with 502, reason: login_wall, retryable: true, and costs 0 credits.
A profile, as a logged-out visitor sees it
curl "https://api.captapi.com/v1/linkedin/profile?url=https%3A%2F%2Fwww.linkedin.com%2Fin%2Fwilliamhgates" \
-H "Authorization: Bearer $CAPTAPI_KEY"
Real response from 14 Oct 2026, trimmed:
{
"success": true,
"data": {
"platform": "linkedin",
"type": "person",
"url": "https://www.linkedin.com/in/williamhgates",
"username": "williamhgates",
"name": "Bill Gates",
"headline": "Chair, Gates Foundation and Founder, Breakthrough Energy",
"location": "Seattle, Washington, United States",
"about": "Chair of the Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. Avid traveler. Active blogger.",
"followers": 40729466,
"connections": null,
"connectionsIsApproximate": null,
"currentCompany": "Gates Foundation",
"profileImage": "https://media.licdn.com/dms/image/v2/D5603AQF.../profile-displayphoto-shrink_200_200/...?e=2147483647&v=beta&t=...",
"mediaUrlsExpireAt": "2038-01-19T03:14:07.000Z",
"fetchedAt": "2026-10-14T13:17:22.061Z",
"cached": false
}
}
The same call in JavaScript and Python:
// JavaScript (Node 18+)
const url = "https://www.linkedin.com/in/williamhgates";
const res = await fetch(
`https://api.captapi.com/v1/linkedin/profile?url=${encodeURIComponent(url)}`,
{ headers: { Authorization: `Bearer ${process.env.CAPTAPI_KEY}` } }
);
const { data } = await res.json();
console.log(data.name, "|", data.headline, "|", data.currentCompany);
# Python
import os, requests
r = requests.get(
"https://api.captapi.com/v1/linkedin/profile",
params={"url": "https://www.linkedin.com/in/williamhgates"},
headers={"Authorization": f"Bearer {os.environ['CAPTAPI_KEY']}"},
timeout=60,
)
data = r.json()["data"]
print(data["name"], "|", data["headline"], "|", data["currentCompany"])
What is not in that response: experience, education and skills. LinkedIn shows those sections only to signed-in members, so a logged-out reader never gets them, and neither does this endpoint. There's no email or phone either. Two more details:
connectionsis exact below 500. LinkedIn's public display caps at "500+", which comes back as500withconnectionsIsApproximate: true. Here it was null because the page didn't show a count.headlineis the member's own free text, not a structured job title.
Full field list: LinkedIn Profile API.
Every LinkedIn endpoint, and its logged-out limit
| Endpoint | What you get | What you don't |
|---|---|---|
| Profile | name, headline, location, about, followers, connections, currentCompany, profileImage | experience, education, skills, contact details |
| Company | name, industry, description, website, followers, employeeCount, specialties, location, logo, coverImage; founded, organizationType, slogan, similarPages and funding when the page shows them | an employee roster (employeeCount is a number, not a list) |
| Company posts | the recent posts a company page shows logged-out visitors (about 10): text, publishedAt, author, likes, comments | older posts. LinkedIn shows those only to signed-in members |
| Post details | one public post: text, publishedAt, author, likes, comments | posts that aren't public |
| Post search | public posts that contain every keyword, found through public search-engine results and read one by one | LinkedIn's own full index. Its content search needs a login. The window stops at 50 results |
| Ad Library search and ad details | ad text, format, advertiser, paidForBy, media | run dates, impressions and targeting on most creatives (see below) |
A few results from the same day, so you can see real values:
- Company (
microsoft): industry "Software Development",employeeCount: 231136, 23 specialties, location Redmond, Washington, US.founded,organizationType,sloganandfundingcame back null andsimilarPagesempty, because that fetch didn't show them. Build your code to expect nulls. - Company posts: five posts with
nextCursor: "5"andhasMore: true. When you reach the last post the page shows,hasMoreturns false withtruncatedReason: "public_page_limit". There's no deeper history to page into. - Post search for
data engineering: five posts, the top one from August 2025. The defaultsort=relevancefollows search-engine rank, so dates can span years. Usesort=dateto order what was found by date. A niche query can return nothing: that's a 200 with an empty list,truncatedReason: "no_public_matches", and 0 credits.
The Ad Library is public by design
LinkedIn describes its Ad Library as "a publicly available database that gives you information about ads that have run on LinkedIn." It doesn't publish the same detail for every ad, though. LinkedIn's targeting and impressions page says targeting parameters are shown for ads targeted in the European Union. Most creatives elsewhere carry none. Captapi omits fields LinkedIn doesn't publish instead of filling them in. Our search for Microsoft reported 7,079 ads in the US. The detail call on one of them returned the ad text, adFormat: "Message Ad", the advertiser and paidForBy, but no run dates or impressions.
The gotcha: image URLs expire
LinkedIn image URLs are signed, and the e= parameter is a unix timestamp. Captapi copies it into mediaUrlsExpireAt. In the profile above, LinkedIn stamped the maximum 32-bit value (e=2147483647), which reads as 2038. Most LinkedIn image URLs we've measured carry a stamp about 19 days out. If you store profileImage or logo, download the file or schedule a re-fetch before that date. How to read the expiry on every platform's media URLs covers the same problem on TikTok, Instagram and the rest.
When logged-out data is enough
- You have profile URLs and want name, headline, location and current company for a CRM row.
- You want firmographics for a list of companies: industry, headcount, specialties, website.
- You watch what a set of companies posted recently and how it performed.
- You track likes and comments on specific posts over time.
- You want to find public posts on a topic, and good coverage is enough. You don't need complete coverage.
- You research competitors' ads in the Ad Library.
When it isn't
- You need work history, education or skills. Those sit behind the sign-in wall.
- You need to find people by title, company or school. There's no people-search endpoint.
- You need a company's full post history, or every post that mentions a keyword.
- You need to post, comment or message as a member. That's
w_member_socialon LinkedIn's own API.
If what you need is behind the login, Captapi is not the right tool. Apply for the LinkedIn program that covers it, because that's the supported route to signed-in data.
If logged-out data covers your case, start with the LinkedIn Profile API or the LinkedIn Company API. Each endpoint page lists its credit price and a real response.