A LinkedIn scraper you call over HTTP: send a public LinkedIn profile, company or job URL to /data and get it back as structured JSON: experience and education, company size and locations, job criteria and salary. No cookies, session or LinkedIn account. Flat 15 credits per page.
2,000 free API credits · No credit card required
Send the page's normal URL to /data. The page type is detected from the URL, and the response tells you which one it was in request_parameters.type.
type: "profile"
Name, headline, about, location, followers, connections, current company, experience, education, skills, certifications, languages, awards, publications, volunteering, recommendations and similar profiles — whatever the public profile shows.
linkedin.com/in/public-id
type: "company"
Name, about, tagline, industry, size band and employee count, followers, website, headquarters, founding year, company type, specialties, locations, and similar and affiliated pages. Showcase pages too.
linkedin.com/company/slug
linkedin.com/showcase/slug
type: "job"
Title, company, location, posting date, applicants, salary and parsed salary range, seniority, employment type, function, industries, full description, Easy Apply flag and whether it's still open.
linkedin.com/jobs/view/JOB_ID
linkedin.com/jobs/search/?currentJobId=JOB_ID
linkedin.com/school/…), single posts (linkedin.com/posts/…) and the feed (/feed/…), job search result lists without a currentJobId, and groups and events. Sub-pages of a company or profile, like /company/slug/posts/ or /in/public-id/recent-activity/, return that company or profile, not its posts. /data still takes these URLs: as on any site without a dedicated parser, an AI model learns the page's structure (the first request for a new kind of page can take up to about 45 seconds) and returns its key values, priced per site rather than at the flat 15 credits (see the API reference). If no structured data can be found, you get a 422 that isn't charged.
No selectors, proxies, or headless browser to run. The page-scraping options (js, proxy, headers…) don't apply; country picks the proxy country (default us).
curl -G "https://api.webscraping.ai/data" \
--data-urlencode "api_key=YOUR_API_KEY" \
--data-urlencode "url=https://www.linkedin.com/company/microsoft"
# Response (excerpt):
# {
# "request_parameters": {"url": "https://www.linkedin.com/company/microsoft",
# "provider": "linkedin", "type": "company"},
# "parse_status": "ok",
# "data": {
# "id": "microsoft",
# "company_id": "1035",
# "name": "Microsoft",
# "industry": "Software Development",
# "company_size": "10,001+ employees",
# "followers": 26000000,
# "headquarters": "Redmond, Washington",
# "country_code": "US",
# "founded": 1975,
# "company_type": "Public Company",
# "specialties": ["Business Software", "Developer Tools", ...],
# "locations": [{"address": "...", "city": "Redmond", "country": "US",
# "is_headquarters": true}, ...],
# "similar": [{"name": "...", "url": "...", "industry": "...", ...}, ...],
# ...
# }
# }
# pip install webscraping_ai
# https://pypi.org/project/webscraping-ai/
from webscraping_ai import Client
client = Client(api_key="YOUR_API_KEY")
result = client.data("https://www.linkedin.com/company/microsoft")
print(result["request_parameters"]["provider"], result["parse_status"])
print(result["data"])
# Response (excerpt):
# {
# "request_parameters": {"url": "https://www.linkedin.com/company/microsoft",
# "provider": "linkedin", "type": "company"},
# "parse_status": "ok",
# "data": {
# "id": "microsoft",
# "company_id": "1035",
# "name": "Microsoft",
# "industry": "Software Development",
# "company_size": "10,001+ employees",
# "followers": 26000000,
# "headquarters": "Redmond, Washington",
# "country_code": "US",
# "founded": 1975,
# "company_type": "Public Company",
# "specialties": ["Business Software", "Developer Tools", ...],
# "locations": [{"address": "...", "city": "Redmond", "country": "US",
# "is_headquarters": true}, ...],
# "similar": [{"name": "...", "url": "...", "industry": "...", ...}, ...],
# ...
# }
# }
// npm install webscraping-ai
// https://www.npmjs.com/package/webscraping-ai
import { WebScrapingAI } from 'webscraping-ai';
const client = new WebScrapingAI({ apiKey: 'YOUR_API_KEY' });
const result = await client.data({ url: 'https://www.linkedin.com/company/microsoft' });
console.log(result.request_parameters.provider, result.parse_status);
console.log(result.data);
// Response (excerpt):
// {
// "request_parameters": {"url": "https://www.linkedin.com/company/microsoft",
// "provider": "linkedin", "type": "company"},
// "parse_status": "ok",
// "data": {
// "id": "microsoft",
// "company_id": "1035",
// "name": "Microsoft",
// "industry": "Software Development",
// "company_size": "10,001+ employees",
// "followers": 26000000,
// "headquarters": "Redmond, Washington",
// "country_code": "US",
// "founded": 1975,
// "company_type": "Public Company",
// "specialties": ["Business Software", "Developer Tools", ...],
// "locations": [{"address": "...", "city": "Redmond", "country": "US",
// "is_headquarters": true}, ...],
// "similar": [{"name": "...", "url": "...", "industry": "...", ...}, ...],
// ...
// }
// }
<?php
// composer require webscraping-ai/webscraping-ai-php
// https://packagist.org/packages/webscraping-ai/webscraping-ai-php
require 'vendor/autoload.php';
use WebScrapingAI\Client;
$client = new Client('YOUR_API_KEY');
$result = $client->data(url: 'https://www.linkedin.com/company/microsoft');
echo $result['request_parameters']['provider'], ' ', $result['parse_status'], "\n";
print_r($result['data']);
// Response (excerpt):
// {
// "request_parameters": {"url": "https://www.linkedin.com/company/microsoft",
// "provider": "linkedin", "type": "company"},
// "parse_status": "ok",
// "data": {
// "id": "microsoft",
// "company_id": "1035",
// "name": "Microsoft",
// "industry": "Software Development",
// "company_size": "10,001+ employees",
// "followers": 26000000,
// "headquarters": "Redmond, Washington",
// "country_code": "US",
// "founded": 1975,
// "company_type": "Public Company",
// "specialties": ["Business Software", "Developer Tools", ...],
// "locations": [{"address": "...", "city": "Redmond", "country": "US",
// "is_headquarters": true}, ...],
// "similar": [{"name": "...", "url": "...", "industry": "...", ...}, ...],
// ...
// }
// }
# gem install webscraping_ai
# https://rubygems.org/gems/webscraping_ai
require 'webscraping_ai'
client = WebScrapingAI::Client.new(api_key: 'YOUR_API_KEY')
result = client.data('https://www.linkedin.com/company/microsoft')
puts "#{result['request_parameters']['provider']} #{result['parse_status']}"
puts result['data'].inspect
# Response (excerpt):
# {
# "request_parameters": {"url": "https://www.linkedin.com/company/microsoft",
# "provider": "linkedin", "type": "company"},
# "parse_status": "ok",
# "data": {
# "id": "microsoft",
# "company_id": "1035",
# "name": "Microsoft",
# "industry": "Software Development",
# "company_size": "10,001+ employees",
# "followers": 26000000,
# "headquarters": "Redmond, Washington",
# "country_code": "US",
# "founded": 1975,
# "company_type": "Public Company",
# "specialties": ["Business Software", "Developer Tools", ...],
# "locations": [{"address": "...", "city": "Redmond", "country": "US",
# "is_headquarters": true}, ...],
# "similar": [{"name": "...", "url": "...", "industry": "...", ...}, ...],
# ...
# }
# }
// go get github.com/webscraping-ai/webscraping-ai-go/v4
// https://pkg.go.dev/github.com/webscraping-ai/webscraping-ai-go/v4
package main
import (
"context"
"fmt"
webscrapingai "github.com/webscraping-ai/webscraping-ai-go/v4"
)
func main() {
client, _ := webscrapingai.NewClient(&webscrapingai.Config{APIKey: "YOUR_API_KEY"})
res, _ := client.Data(context.Background(), &webscrapingai.DataOptions{
URL: "https://www.linkedin.com/company/microsoft",
})
fmt.Println(res.RequestParameters.Provider, res.ParseStatus)
fmt.Println(string(res.Data)) // raw JSON; its shape depends on the provider and page type
}
// Response (excerpt):
// {
// "request_parameters": {"url": "https://www.linkedin.com/company/microsoft",
// "provider": "linkedin", "type": "company"},
// "parse_status": "ok",
// "data": {
// "id": "microsoft",
// "company_id": "1035",
// "name": "Microsoft",
// "industry": "Software Development",
// "company_size": "10,001+ employees",
// "followers": 26000000,
// "headquarters": "Redmond, Washington",
// "country_code": "US",
// "founded": 1975,
// "company_type": "Public Company",
// "specialties": ["Business Software", "Developer Tools", ...],
// "locations": [{"address": "...", "city": "Redmond", "country": "US",
// "is_headquarters": true}, ...],
// "similar": [{"name": "...", "url": "...", "industry": "...", ...}, ...],
// ...
// }
// }
// Maven: ai.webscraping:webscraping-ai:4.3.1
// https://central.sonatype.com/artifact/ai.webscraping/webscraping-ai
import ai.webscraping.Client;
import ai.webscraping.Config;
import ai.webscraping.option.DataOptions;
import ai.webscraping.result.DataResult;
Client client = new Client(Config.builder().apiKey("YOUR_API_KEY").build());
DataResult result = client.data(DataOptions.builder()
.url("https://www.linkedin.com/company/microsoft")
.build());
System.out.println(result.getRequestParameters().getProvider() + " " + result.getParseStatus());
System.out.println(result.getData());
// Response (excerpt):
// {
// "request_parameters": {"url": "https://www.linkedin.com/company/microsoft",
// "provider": "linkedin", "type": "company"},
// "parse_status": "ok",
// "data": {
// "id": "microsoft",
// "company_id": "1035",
// "name": "Microsoft",
// "industry": "Software Development",
// "company_size": "10,001+ employees",
// "followers": 26000000,
// "headquarters": "Redmond, Washington",
// "country_code": "US",
// "founded": 1975,
// "company_type": "Public Company",
// "specialties": ["Business Software", "Developer Tools", ...],
// "locations": [{"address": "...", "city": "Redmond", "country": "US",
// "is_headquarters": true}, ...],
// "similar": [{"name": "...", "url": "...", "industry": "...", ...}, ...],
// ...
// }
// }
// dotnet add package WebScrapingAI
// https://www.nuget.org/packages/WebScrapingAI
using WebScrapingAI;
var client = new WebScrapingAIClient(new WebScrapingAIClientOptions { ApiKey = "YOUR_API_KEY" });
var result = await client.DataAsync(new DataRequest {
Url = "https://www.linkedin.com/company/microsoft",
});
Console.WriteLine($"{result.RequestParameters.Provider} {result.ParseStatus}");
Console.WriteLine(result.Data);
// Response (excerpt):
// {
// "request_parameters": {"url": "https://www.linkedin.com/company/microsoft",
// "provider": "linkedin", "type": "company"},
// "parse_status": "ok",
// "data": {
// "id": "microsoft",
// "company_id": "1035",
// "name": "Microsoft",
// "industry": "Software Development",
// "company_size": "10,001+ employees",
// "followers": 26000000,
// "headquarters": "Redmond, Washington",
// "country_code": "US",
// "founded": 1975,
// "company_type": "Public Company",
// "specialties": ["Business Software", "Developer Tools", ...],
// "locations": [{"address": "...", "city": "Redmond", "country": "US",
// "is_headquarters": true}, ...],
// "similar": [{"name": "...", "url": "...", "industry": "...", ...}, ...],
// ...
// }
// }
Trimmed, and the counts are illustrative — they change constantly. Fields a page doesn't expose come back as null, though some flags come back false and lists come back empty. data can be null when parse_status is parse_failed or not_found, so check it before reading fields.
The key fields per page type. Names are snake_case across every site; the full contract is in the API reference.
type: "profile"| Field | What it holds |
|---|---|
public_identifier, linkedin_num_id, url | The /in/ id, the numeric member id and the profile URL. |
name, first_name, last_name, headline, about | Identity and summary. |
location, country_code, avatar_url, background_url | Location and images. |
followers, connections | Follower count; connections is the band LinkedIn shows (500 means 500+). |
current_company | name and url. |
experience | title, company_name, company_url, location, start_date, end_date, is_current, duration, description. |
education | school, degree, field_of_study, start_date, end_date. |
skills, certifications, languages, honors_and_awards | Lists as shown on the public profile. |
publications, volunteer_experience, recommendations, similar_profiles | The remaining public sections, plus recommendations_count and influencer. |
type: "company"| Field | What it holds |
|---|---|
id, company_id, name, url | The URL slug, the numeric company id, name and canonical URL. |
about, tagline, industry, company_type, founded, specialties | The About section. |
company_size, employee_count, followers | The size band, the member count LinkedIn reports, and followers. |
website, headquarters, country_code | Contact and location basics. |
locations | Each office as address, city, country, is_headquarters. |
similar, affiliated | Related pages with name, url, industry, location, logo_url. |
logo_url, cover_image_url | Images. |
type: "job"| Field | What it holds |
|---|---|
job_id, title, url, company | The posting and its company (name, url, logo_url). |
location, posted_date, posted_at | Location; LinkedIn's relative date ("2 weeks ago") and the approximate ISO date computed from it. |
applicants, applicants_text | The exact applicant count when LinkedIn shows one, and its raw text ("Over 200 applicants"). |
salary, salary_range | The salary text and {min, max, currency, period} parsed from it, when the posting has one. |
seniority_level, employment_type, job_function, industries | The job criteria. |
description, description_html | The full description as text and HTML. |
easy_apply, apply_link, is_closed | Whether it uses Easy Apply and whether it's still accepting applications. apply_link is usually null: the public job page doesn't carry external apply URLs. |
Everything comes from what LinkedIn shows a logged-out visitor. That sets these limits.
/ai/fields extracts the fields you describe in plain language from any public page, and /html returns the rendered HTML for your own parser.
Every supported LinkedIn page type costs the same, with no extra charge for proxies or retries. That's about $1.74 per 1,000 pages on the $29 plan.
| Plan | Price | Credits | Pages |
|---|---|---|---|
| Free | $0 | 2,000 | up to 133 |
| Personal | $29/mo | 250,000 | up to 16,666 |
| Plus | $99/mo | 1,000,000 | up to 66,666 |
| Startup | $249/mo | 3,000,000 | up to 200,000 |
The free plan's 2,000 credits renew monthly. All plans, including pay-as-you-go credits.
422, not charged.500, not charged.parse_status parse_failed (the page was fetched but couldn't be parsed) and not_found (the page doesn't exist) are successful requests and cost 15 credits, like ok.webscraping-ai has a data command; pass - to read URLs from stdin, one per line.
webscraping-ai data 'https://www.linkedin.com/company/microsoft'Claude, Cursor and other MCP clients get a webscraping_ai_data tool from the hosted MCP server (OAuth login, no API key to paste). Ask for a LinkedIn page's data in plain language and the agent calls it.
The WebScraping.AI n8n node has a Get Structured Data operation: feed it URLs from a sheet or a trigger and route the JSON onward, no code.
Can you scrape LinkedIn profiles?
Public ones, yes. Send linkedin.com/in/public-id and get the name, headline, about, location, followers, current company, and the experience, education, skills and other sections the public profile shows. Profiles hidden from logged-out visitors can't be fetched, and those requests aren't charged.
Can I use AI to scrape LinkedIn profiles?
Yes. The hosted WebScraping.AI MCP server gives Claude, Cursor and other MCP clients a webscraping_ai_data tool, so an agent can fetch a LinkedIn profile, company or job URL as JSON when you ask it to. Code can call the same /data endpoint directly.
Do I need a LinkedIn account or cookies?
No. /data reads the pages LinkedIn serves to logged-out visitors, so there's no account, session cookie or li_at token on your side.
Why is a profile's experience empty?
LinkedIn lets members limit what logged-out visitors see. /data returns what the public profile shows, so for some members experience, education or other sections are partial or empty. Profiles that are hidden from logged-out visitors entirely return an error and aren't charged.
Can I scrape LinkedIn job listings?
Yes, one posting per request: send linkedin.com/jobs/view/JOB_ID (or a jobs search URL with currentJobId) and get the title, company, criteria, salary when posted, applicants and the full description. Search result lists aren't supported yet.
Is there a free LinkedIn scraper API?
Yes, for trying it out: the free plan includes 2,000 API credits every month, which covers 133 LinkedIn pages at 15 credits each. No credit card is needed. Paid plans start at $29/mo for 250,000 credits, or buy pay-as-you-go credits with no subscription from a $20 top-up (100,000 credits, about 6,666 pages).
How much does the LinkedIn Scraper API cost?
A flat 15 credits per page, for every supported LinkedIn page type. On the $29/mo plan (250,000 credits) that is up to 16,666 pages, or about $1.74 per 1,000. Fetch failures return a 500 and aren't charged. Pages outside the supported LinkedIn page types go to the AI-learned path and are priced per site. parse_failed and not_found results are successful requests and are charged.
What happens if I send a URL the LinkedIn parser doesn't cover?
/data still answers it: an AI model learns the page's structure (the first request for a new kind of page can take up to about 45 seconds) and returns its key values, priced per site like any site without a dedicated parser. If no structured data can be found, you get a 422 that isn't charged; /ai/fields then extracts the fields you name, and /html returns the rendered page for your own parser.
One API key, one request format, the same response envelope.
Get started with 2,000 free API credits. No credit card required.