~ / endpoints / Job API

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.

Get a free API keyBrowse the endpoints
1,000
free requests / mo
2.6s
median response
JSON
structured output
1
flat charge per posting
why it is walled

Why LinkedIn Job data is login-walled

LinkedIn's guest job page leaves the JSON-LD JobPosting block empty and server-renders the real content into classed card markup instead, so scraping the structured data returns nothing useful. Salary shows only when LinkedIn chooses to display it, and a stale job ID returns a clean 404 shell, which a naive parser reports as a crash rather than a missing posting.

one request

Call the LinkedIn Job Scraper API in one request

cURL
curl "https://api.linkedinscraperapi.com/api/v1/linkedin/job?job_id=4406118990&api_key=$API_KEY"
Python
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])
inputs

Parameters

ParameterRequiredDefaultNotes
job_idoptional-The numeric job ID from urn:li:jobPosting:{id}, e.g. 4406118990. One of job_id or url is required.
urloptional-A full /jobs/view/{id} URL instead of the ID. One of job_id or url is required.
api_keyrequired-Your API key, passed as a query parameter. Get one free at signup.
the JSON

The JSON the LinkedIn Job Scraper API returns

200 OK
{
  "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"
}
FieldTypeDescription
job_idstringThe numeric job ID, the stable identifier for the posting.
titlestringThe job title from the top card, e.g. "Software Engineer, New Grad".
urlstringThe canonical /jobs/view/{id} URL.
companystringThe hiring company name.
company_urlstringThe hiring company's /company/ page URL.
locationstringThe job location, e.g. "San Francisco, CA".
applicantsstringThe applicant-count label when shown, e.g. "Over 200 applicants", otherwise null.
posted_labelstringRelative posting time, e.g. "3 days ago".
salarystringThe salary range, present only when LinkedIn displays it, e.g. "$102,000.00 - $138,000.00", otherwise null.
senioritystringSeniority level from the job criteria, e.g. "Entry level".
employment_typestringEmployment type from the job criteria, e.g. "Full-time".
job_functionstringJob function from the job criteria, e.g. "Engineering and Information Technology".
industriesstringIndustries from the job criteria, e.g. "Software Development".
descriptionstringThe full job description as plain text.
description_htmlstringThe same description with its original HTML markup preserved.
company_logostringURL of the hiring company's logo.
who uses it

Who pulls LinkedIn data, and for what

>

Job board aggregation

Resolve a list of job IDs into title, company, location, and description to populate a niche job board or internal listings feed.
>

Hiring and market intelligence

Pull seniority, employment_type, job_function, and salary across postings to track what roles a company or sector is hiring for and at what pay.
>

Compensation benchmarking

Collect the salary field where LinkedIn shows it to build a pay-range dataset for a role, location, or seniority band.
>

Applicant-demand signals

Read the applicants label to gauge how competitive a posting is and rank openings by interest for candidates or clients.
>

Recruiting research

Capture company_url and the criteria fields for each posting to map who is hiring and route leads to the right hiring team.
>

Talent-market dashboards

Store posting metadata and posted_label over time to chart hiring velocity and role mix inside your own dashboard.
why this endpoint

Why teams build on our LinkedIn Job Scraper API

Pass a job ID or a /jobs/view/ URL and we parse the rendered top card, the criteria list, and the description into one clean object, since the guest page leaves the JSON-LD empty. Every request runs through residential proxies with anti-bot handling and retries, returning validated JSON in about 2.6 seconds, and a removed posting comes back as a clean item-not-found rather than a parse error.

*

Job ID or URL input

One endpoint takes a numeric job_id or a full /jobs/view/ URL and resolves the canonical posting server side.
*

Criteria parsed to fields

Seniority, employment type, job function, and industries are mapped from the rendered criteria list into named JSON keys.
*

Text and HTML description

The description returns as clean text and, in description_html, with its original markup, so you can store or render whichever you need.
*

Salary when shown

We surface the salary range when LinkedIn displays it and return null otherwise, so you never see a fabricated pay figure.
*

Clean 404 handling

A stale or removed job ID returns an item-not-found result instead of a crash, so your pipeline can skip it gracefully.
*

Residential-first routing

We lead with residential proxies and fall back through datacenter and free tiers, because LinkedIn walls datacenter egress on job pages more often.
measured against

LinkedIn Job Scraper API measured against the alternatives

Our APIDIY (requests / headless)Official LinkedIn API
Input by ID or URLYes, job_id or /jobs/view/ URLManual fetch and parseNo public job-by-ID endpoint
Structured job fieldsTitle, company, criteria, salaryJSON-LD is empty, parse the cardJobs API is partner-gated
SetupAPI key onlyResidential proxies, headless browser, parsersTalent Solutions partnership
Salary and applicantsReturned when LinkedIn shows themExtra selectors, often missedNot exposed to general apps
Anti-bot and proxiesResidential-first, built inYou build and maintain itNot applicable
Removed postingsClean item-not-found resultParser crash on a 404 shell404 from the API
Full descriptionText and HTML in one callYou strip and clean the markupOnly for authorized partners
what it costs

Usage-based pricing, no seats

PlanPriceBest for
Free1,000 requestsTesting and small jobs
Pro$0.60 / 1kProduction workloads
Pay-as-you-go$0.90 / 1kSpiky 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.

How do I search for jobs, not just fetch one?

This endpoint fetches a single posting by ID or URL. To find postings by keyword and location, use our LinkedIn search endpoint, which reads LinkedIn's public guest jobs surface and returns a list of job cards you can then expand with this job endpoint.

Ship job api data as JSON today
Start with 1,000 free requests. No credit card, no LinkedIn login.
Get a free API key Browse the endpoints