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
400 that isn't charged, with a message listing what is supported: school pages (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. More page types and sites are added over time, so don't validate URLs on your side — send the URL and handle the 400.
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.2.0
// 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.
400, 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. Unsupported URLs return a 400 and fetch failures a 500; neither is charged. parse_failed and not_found results are successful requests and are charged.
What happens if I send a URL you don't support?
You get a 400 that isn't charged, and its message lists what is supported. For pages /data doesn't cover, /ai/fields extracts the fields you describe from any public URL, 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.