STRUCTURED DATA API

LinkedIn Scraper API

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

Scrape LinkedIn profiles, companies and jobs

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.

Profile

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

Company

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

Job

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
These URLs return a 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.

How to scrape LinkedIn with one API call

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.

What the LinkedIn scraper returns

The key fields per page type. Names are snake_case across every site; the full contract is in the API reference.

type: "profile"

FieldWhat it holds
public_identifier, linkedin_num_id, urlThe /in/ id, the numeric member id and the profile URL.
name, first_name, last_name, headline, aboutIdentity and summary.
location, country_code, avatar_url, background_urlLocation and images.
followers, connectionsFollower count; connections is the band LinkedIn shows (500 means 500+).
current_companyname and url.
experiencetitle, company_name, company_url, location, start_date, end_date, is_current, duration, description.
educationschool, degree, field_of_study, start_date, end_date.
skills, certifications, languages, honors_and_awardsLists as shown on the public profile.
publications, volunteer_experience, recommendations, similar_profilesThe remaining public sections, plus recommendations_count and influencer.

type: "company"

FieldWhat it holds
id, company_id, name, urlThe URL slug, the numeric company id, name and canonical URL.
about, tagline, industry, company_type, founded, specialtiesThe About section.
company_size, employee_count, followersThe size band, the member count LinkedIn reports, and followers.
website, headquarters, country_codeContact and location basics.
locationsEach office as address, city, country, is_headquarters.
similar, affiliatedRelated pages with name, url, industry, location, logo_url.
logo_url, cover_image_urlImages.

type: "job"

FieldWhat it holds
job_id, title, url, companyThe posting and its company (name, url, logo_url).
location, posted_date, posted_atLocation; LinkedIn's relative date ("2 weeks ago") and the approximate ISO date computed from it.
applicants, applicants_textThe exact applicant count when LinkedIn shows one, and its raw text ("Over 200 applicants").
salary, salary_rangeThe salary text and {min, max, currency, period} parsed from it, when the posting has one.
seniority_level, employment_type, job_function, industriesThe job criteria.
description, description_htmlThe full description as text and HTML.
easy_apply, apply_link, is_closedWhether 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.

What's not included

Everything comes from what LinkedIn shows a logged-out visitor. That sets these limits.

Only what the public profile shows. Many members limit what logged-out visitors see, so experience, education and other sections can be partial or empty. Profiles hidden from logged-out visitors can't be fetched; those requests fail and aren't charged.
No contact details. Email addresses and phone numbers aren't on public pages and aren't returned.
No company funding or posts. Company pages don't include funding, investors, stock data or the company's post feed.
School pages aren't supported and return the free 400; job posters aren't returned.
Need a page type or site that isn't supported? /ai/fields extracts the fields you describe in plain language from any public page, and /html returns the rendered HTML for your own parser.

Flat pricing: 15 credits per page

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.

PlanPriceCreditsPages
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.

What's charged

Unsupported URL or page type: a 400, not charged.
Page couldn't be fetched: a 500, not charged.
Charged even without data: 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.

Also from the terminal, AI agents, and n8n

CLI

webscraping-ai has a data command; pass - to read URLs from stdin, one per line.

webscraping-ai data 'https://www.linkedin.com/company/microsoft'

MCP server

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.

n8n

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.

Frequently asked questions

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.

Other sites on the same endpoint

One API key, one request format, the same response envelope.

YouTube Scraper API TikTok Scraper API Twitter (X) Scraper API Instagram Scraper API Reddit Scraper API Google SERP API

Get LinkedIn data as JSON today

Get started with 2,000 free API credits. No credit card required.

Icon