LinkedIn Job Scraper API
Our LinkedIn job scraper turns a single job posting, by numeric job ID or a /jobs/view/ URL, into structured JSON: title, company, location, applicant count, salary when shown, seniority, employment type, job function, industries, and the full description in both text and HTML.
Quickstart
curl "https://api.linkedinscraperapi.com/api/v1/linkedin/job?job_id=4406118990&api_key=$API_KEY" import requests
BASE = "https://api.linkedinscraperapi.com"
API_KEY = "YOUR_API_KEY"
# Pass a numeric job_id, or a full /jobs/view/{id} URL instead.
data = requests.get(
f"{BASE}/api/v1/linkedin/job",
params={"job_id": "4406118990", "api_key": API_KEY},
timeout=30,
).json()
print(data["title"], "@", data["company"], "-", data["location"])
print(data["seniority"], "|", data["employment_type"], "|", data["salary"])
print(data["applicants"], "-", data["posted_label"])
print(data["description"][:280]) Params
| Parameter | Required | Default | Notes |
|---|---|---|---|
job_id | optional | - | The numeric job ID from urn:li:jobPosting:{id}, e.g. 4406118990. One of job_id or url is required. |
url | optional | - | A full /jobs/view/{id} URL instead of the ID. One of job_id or url is required. |
api_key | required | - | Your API key, passed as a query parameter. Get one free at signup. |
Response
{
"id": "4406118990",
"job_id": "4406118990",
"title": "Software Engineer, New Grad",
"url": "https://www.linkedin.com/jobs/view/4406118990",
"company": "Notion",
"company_url": "https://www.linkedin.com/company/notionhq",
"location": "San Francisco, CA",
"applicants": "Over 200 applicants",
"posted_label": "3 days ago",
"salary": "$102,000.00 - $138,000.00",
"seniority": "Entry level",
"employment_type": "Full-time",
"job_function": "Engineering and Information Technology",
"industries": "Software Development",
"description": "Who We Are Notion is the collaborative AI workspace where teams and agents think together. We're building one place where your knowledge, projects, meetings, and AI tools live side by side...",
"description_html": "<p>Who We Are<br><br>Notion is the collaborative AI workspace where teams and agents think together...</p>",
"company_logo": "https://media.licdn.com/dms/image/v2/D4E0BAQGwvcv_1tHZ4w/company-logo_100_100/B4EZW25gE2GgAQ-/0/1742530282185/notionhq_logo?e=2147483647&v=beta&t=h_sgZm5R2TgP9Fpbo95m2wmxnSDoEz06eupofZwpSXs"
} | Field | Type | Description |
|---|---|---|
job_id | string | The numeric job ID, the stable identifier for the posting. |
title | string | The job title from the top card, e.g. "Software Engineer, New Grad". |
url | string | The canonical /jobs/view/{id} URL. |
company | string | The hiring company name. |
company_url | string | The hiring company's /company/ page URL. |
location | string | The job location, e.g. "San Francisco, CA". |
applicants | string | The applicant-count label when shown, e.g. "Over 200 applicants", otherwise null. |
posted_label | string | Relative posting time, e.g. "3 days ago". |
Use it for
Job board aggregation
Hiring and market intelligence
Compensation benchmarking
Applicant-demand signals
How it compares
| Our API | DIY (requests / headless) | Official LinkedIn API | |
|---|---|---|---|
| Input by ID or URL | Yes, job_id or /jobs/view/ URL | Manual fetch and parse | No public job-by-ID endpoint |
| Structured job fields | Title, company, criteria, salary | JSON-LD is empty, parse the card | Jobs API is partner-gated |
| Setup | API key only | Residential proxies, headless browser, parsers | Talent Solutions partnership |
| Salary and applicants | Returned when LinkedIn shows them | Extra selectors, often missed | Not exposed to general apps |
| Anti-bot and proxies | Residential-first, built in | You build and maintain it | Not applicable |
| Removed postings | Clean item-not-found result | Parser crash on a 404 shell | 404 from the API |
| Full description | Text and HTML in one call | You strip and clean the markup | Only for authorized partners |
Pricing
| Plan | Price | Best for |
|---|---|---|
| Free | 1,000 requests | Testing and small jobs |
| Pro | $0.60 / 1k | Production workloads |
| Pay-as-you-go | $0.90 / 1k | Spiky or one-off volume |
Median response 2.6s. You only pay for successful requests.
FAQ
What is a LinkedIn job scraper?
A LinkedIn job scraper is a tool that reads a public job posting and returns it in a structured format. Our LinkedIn job scraper API takes a numeric job ID or a /jobs/view/ URL and returns the title, company, location, applicant count, salary when shown, seniority, employment type, job function, industries, and the full description as JSON from a single request.
How do I scrape a LinkedIn job posting?
Send one GET request to our linkedin/job endpoint with a job_id or a url and your API key. We route through residential proxies, handle anti-bot checks, and parse the rendered job card and criteria list, so you get clean JSON back without maintaining selectors against LinkedIn's guest job markup.
Can I pass a job URL instead of an ID?
Yes. Pass the numeric ID in job_id, for example 4406118990, or a full /jobs/view/{id} URL in url. One of the two is required, and the endpoint resolves the canonical posting URL either way.
Why is the salary field sometimes null?
LinkedIn only renders the salary range on postings where the employer chose to publish it, so most cards omit it. When it is present we return it as a string like "$102,000.00 - $138,000.00", and when it is not we return null. We never estimate or fabricate a pay range.
What happens if the job has been removed?
A stale or removed job ID returns a clean LinkedIn 404 shell with no top card. Our endpoint surfaces that as an item-not-found result rather than a hard parse error, so your pipeline can skip the posting and keep processing the rest of the batch.
Do I get the full job description?
Yes. The description comes back as plain text in the description field and with its original markup preserved in description_html, so you can index the clean text and render the formatted version. The criteria (seniority, employment type, job function, industries) come back as their own named fields alongside it.