People searching for how to scrape LinkedIn usually want the profile: headline, location, about, experience, and a follower count. GET /v1/linkedin/profile returns it. It is not LinkedIn's official API.
Send your SocialScrape key in x-api-key. See authentication.
The request
The only data parameter is url, and it is required. The shape is linkedin.com/in/<slug>. There is no name search on this route. LinkedIn sometimes turns requests away, and a member who hides their profile looks the same, so both answer upstream_blocked (503, free).
Retry later; a member who keeps answering it may have hidden their profile. A URL this route does not accept is unsupported_url. A broken parameter is invalid_params. Do not retry those two.
The recorded request is a profile URL.
1curl -G "https://api.socialscrape.dev/v1/linkedin/profile" \2 -H "x-api-key: $SOCIALSCRAPE_API_KEY" \3 --data-urlencode "url=https://www.linkedin.com/in/williamhgates"1import os2import requests34params = {5 "url": "https://www.linkedin.com/in/williamhgates",6}7res = requests.get(8 "https://api.socialscrape.dev/v1/linkedin/profile",9 headers={"x-api-key": os.environ["SOCIALSCRAPE_API_KEY"]},10 params=params,11)12body = res.json()1314if body["ok"]:15 print(body["data"])16else:17 print(body["error"]["code"], body["error"]["message"])1const url = new URL("https://api.socialscrape.dev/v1/linkedin/profile");2url.search = new URLSearchParams({3 "url": "https://www.linkedin.com/in/williamhgates"4}).toString();5const res = await fetch(url, {6 headers: { "x-api-key": process.env.SOCIALSCRAPE_API_KEY! },7});8const body = await res.json();910if (body.ok) {11 console.log(body.data);12} else {13 console.error(body.error.code, body.error.message);14}trim, raw and max_age_days work as on other GETs. This endpoint is cacheable for 30 days. A cached hit costs 0 credits. See caching.
What you get
data is a profile. platform is linkedin. Shared fields: id, handle, name, headline, url, bio (the about text), avatar_url, banner_url, location, verified, is_private, external_url, links, created_at.
stats.followers is the follower count on the page. stats.following, stats.posts, stats.likes and stats.views are null when the page does not have them.
The LinkedIn-specific blocks are in extra:
experience:title,company,company_slug,company_url,start,duration,is_current.education:school,school_url,start_year,end_year.current_companies: strings.articles:title,url,summary,published_at,likes,comments,image_url.recent_posts:id,text,url,likes,published_at.similar_profiles:name,headline,location,url,followers.connectionsandconnections_count.connectionsis the text LinkedIn prints, not an array of members.badgesandsource.
The endpoint description also lists skills, courses and recommendations. The recorded sample is shortened and does not include those keys. If a live response omits them, they were not on the page. Do not backfill.
Sample. The recorded profile is shortened. Follower counts and experience rows in that file are the sample. Author-style placeholders are not an issue on this particular recording the way they are on anonymised comment samples, but the numbers are still a recording, not a live pull you should cite as today's total.
extra.recent_posts is a short list, not the member's archive. To read one of them in full, pass url to GET /v1/linkedin/post. That returns the full text, reactions, comment count and the top comments in extra.top_comments.
Company pages are a different route, GET /v1/linkedin/company, and their posts are GET /v1/linkedin/company/posts. A person URL will not work on the company route.
Cost
One successful profile is 1 credit. Opening a recent post is another credit. Failures are free, including upstream_blocked when LinkedIn turns a profile request away. Cached repeats are free with max_age_days.
New accounts get 100 credits once, no card. Pack credits never expire. Monthly credits reset. See pricing and credits.
Limits
You get the profile page. You do not get email, phone, a connection list, InMail, or anything a member has hidden. upstream_blocked is what a hidden profile and a refused request both look like, so it is not proof the member is missing.
Treat a profile that keeps answering it as hidden or unknown, not as an empty career history.
connections_count can disagree with a rounded connections string. Keep both. Experience start and duration are the strings LinkedIn showed. They are not a guaranteed ISO date range on every row.
Packs and plans have no rate limits; free accounts have a lower one. 429 rate_limited is retryable and costs 0. See rate limits and errors.
Fields can be added. Null stays null.
Next
The sample and the parameter table are on the LinkedIn profile API page, the tutorial and the reference. One post is the LinkedIn post API. Company posts are covered in Get LinkedIn posts. The hub is the LinkedIn API.
Company pages and person pages are different objects. Do not send a /company/ URL to this route.