Skip to main content
LinkedIn Jobs

LinkedIn Jobs Scraper API
searches and full postings

Send a LinkedIn job search and get every job card as a row: title, company, location and the date it was posted. Send a job link and get the whole posting, with seniority, employment type, applicant count and the description in markdown.

You sendwww.linkedin.com/jobs/search/?keywords=data%20analyst&location=United%20States
60 jobs1 credit
You get back (real run, trimmed)
{
"type": "jobSearch",
"totalResults": "11,000+",
"jobCount": 60,
"jobs": [
{
"position": 1,
"title": "Sr. Data Analyst",
"company": "Accenture Federal Services",
"location": "Washington, DC",
"postedAt": "2026-10-12"
},
"… 59 more"
]
}
60

jobs on the first page of a search, 10 on each page after

1,000

jobs per search, the most LinkedIn shows visitors

200/200

unique jobs across 20 pages in a test run, no duplicates

1 credit

per search page or job posting, $0 if it fails

Job links Spidra understands

Build the search on LinkedIn's jobs page while signed out, then copy the link from the address bar.

Search, first page

Up to 60 job cards in LinkedIn's order, plus the total result count LinkedIn shows.

linkedin.com/jobs/search/?keywords=data%20analyst&location=United%20States

Search, next pages

Add start=60, then 70, 80 and so on. Each page has 10 jobs, and nextStart tells you the value to send next.

...&location=United%20States&start=60

Job postings

The full posting: description, seniority, employment type, function, industries, applicants and pay when listed.

linkedin.com/jobs/view/4478595713/

A search with a job open

A search link with currentJobId reads the selected job, the same as its own job link.

...jobs/search/?currentJobId=4478595713

Filters in the link

Keywords, location and LinkedIn's own filters carry through, such as f_TPR=r86400 for the past 24 hours.

...&f_TPR=r86400

A company's jobs tab

The jobs tab of a company page comes back as the full page in markdown.

linkedin.com/company/stripe/jobs/

One call, every field

Point the scrape call at a LinkedIn link. With JSON output and no prompt, the data comes back as it is, for 1 credit and no AI cost.

Ask for markdown instead and you get the readable page as text. The structured data still comes back, in its own structuredData field next to the markdown.

import { SpidraClient } from "spidra";
 
const spidra = new SpidraClient({
apiKey: process.env.SPIDRA_API_KEY,
});
 
const result = await spidra.scrape({
urls: [{ url: "https://www.linkedin.com/jobs/search/?keywords=data%20analyst&location=United%20States" }],
output: "json",
});
 
const data = result.content;
for (const j of data.jobs) console.log(j.title, j.company, j.postedAt);
console.log("next page: start =", data.nextStart);
What you get for each job
Search page
The start offset, the total LinkedIn reports (such as 11,000+), how many jobs came back, and nextStart for the following page
Job card
Position on the page, job ID, title, company and its LinkedIn link, location and the job's link
Dates
postedAt as a calendar date, plus the text LinkedIn shows, such as "6 days ago"
Badges and pay
The badge on the card (Actively Hiring, or a benefits count) and the salary when the card shows one
Role
From the job link: seniority level, employment type, job function, industries and the applicant count
Description
The full description as plain text and as markdown, with its headings and bullet lists kept

What comes back

Real responses from Spidra, trimmed for length. Nothing here is mocked up.

Request
https://www.linkedin.com/jobs/search/?keywords=data%20analyst&location=United%20States

Page 1 of a search: up to 60 jobs. Then add start=60, 70, 80 and so on: each later page holds 10.

Response (real run, October 18, 2026, trimmed)
{
"type": "jobSearch",
"totalResults": "11,000+",
"jobCount": 60,
"nextStart": 60,
"jobs": [
{
"position": 1,
"jobId": "4478595713",
"title": "Sr. Data Analyst",
"company": "Accenture Federal Services",
"companyUrl": "https://www.linkedin.com/company/accenturefederalservices",
"location": "Washington, DC",
"postedAt": "2026-10-12",
"postedText": "6 days ago",
"benefits": "Actively Hiring",
"url": "https://www.linkedin.com/jobs/view/4478595713/"
},
{
"position": 2,
"jobId": "4472640743",
"title": "Data Analyst",
"company": "Zelis",
"companyUrl": "https://www.linkedin.com/company/zelis",
"location": "Cottonwood Heights, UT",
"postedAt": "2026-10-01",
"postedText": "2 weeks ago",
"benefits": "Actively Hiring",
"url": "https://www.linkedin.com/jobs/view/4472640743/"
},
{
"position": 3,
"jobId": "4444390846",
"title": "Enterprise Data Analyst",
"company": "Husch Blackwell",
"companyUrl": "https://www.linkedin.com/company/husch-blackwell",
"location": "Washington, DC",
"postedAt": "2026-10-18",
"postedText": "12 hours ago",
"benefits": "Actively Hiring",
"url": "https://www.linkedin.com/jobs/view/4444390846/"
},
"… 57 more"
]
}

Paging without gaps or repeats

The first page of a search carries 60 jobs. After that LinkedIn serves 10 at a time, and a common bug in job scrapers is stepping by the wrong amount and silently skipping jobs. Every Spidra response includes nextStart, the exact value to send for the next page.

LinkedIn stops at 1,000 results per search for visitors who aren't signed in. A start above 990 fails straight away and costs nothing. To cover more, split the search by location, keyword or posting date.

Data analyst jobs in the United States (real run, trimmed)
"type": "jobSearch",
"start": 0,
"totalResults": "11,000+",
"jobCount": 60,
"jobs": [ ... ],
"nextStart": 60

The whole posting, ready to read

A job link adds what the search card leaves out: the applicant count, seniority, employment type, industries and the full description. The description comes as plain text for search and analysis, and as markdown that keeps the employer's headings and lists.

Fields LinkedIn doesn't show for a job come back as null. In this posting the employer wrote the pay range into the description rather than LinkedIn's pay field, so salary is null and the range is in the text.

linkedin.com/jobs/view/4478595713 (real run, trimmed)
"jobId": "4478595713",
"title": "Sr. Data Analyst",
"company": "Accenture Federal Services",
"location": "Washington, DC",
"postedText": "6 days ago",
"applicants": "103 applicants",
"salary": null,
"seniorityLevel": "Mid-Senior level",
"employmentType": "Full-time",
"jobFunction": null,
"industries": "IT Services and IT Consulting"

Dates you can filter on

Each card has postedAt as a plain date next to LinkedIn's relative text, so "12 hours ago" and "2 months ago" become values you can sort and compare.

For daily collection, add f_TPR=r86400 to the search link. In a test run every job it returned was between 3 and 22 hours old.

One job card from the same search (real run, trimmed)
{
"position": 3,
"jobId": "4444390846",
"title": "Enterprise Data Analyst",
"company": "Husch Blackwell",
"location": "Washington, DC",
"postedAt": "2026-10-18",
"postedText": "12 hours ago",
"salary": null,
"benefits": "Actively Hiring",
"url": "https://www.linkedin.com/jobs/view/4444390846/"
}

Ask for the columns you want

Describe the answer as a prompt, a JSON schema or both, and it comes back in that shape. The AI reads a compact copy of the data Spidra already read, not the whole page.

Request
const result = await spidra.scrape({
urls: [{ url: "https://www.linkedin.com/jobs/search/?keywords=product%20manager&location=Remote" }],
prompt: "List each job with title, company, location and posted date.",
schema: {
type: "object",
properties: {
jobs: {
type: "array",
items: {
type: "object",
properties: {
title: {
type: "string"
},
company: {
type: "string"
},
location: {
type: "string"
},
posted: {
type: "string"
}
}
}
}
}
},
});
What came back (real run)
{
"jobs": [
{
"title": "Sr. Product Mgr, Tech, AWS Messaging Services",
"company": "Amazon Web Services (AWS)",
"location": "Vancouver, British Columbia, Canada",
"posted": "2026-10-01"
},
{
"title": "Senior Product Manager - On-chain",
"company": "CoinMarketCap",
"location": "Dubai, Dubai, United Arab Emirates",
"posted": "2026-09-03"
},
{
"title": "Senior Product Manager, Exchange",
"company": "Cint",
"location": "London, England, United Kingdom",
"posted": "2026-09-29"
},
"… 57 more"
]
}

This request cost 8 credits on October 18, 2026: 1 for the page plus the AI tokens. For the data as it is, use JSON output with no prompt for 1 credit.

What teams build with it

Job postings are one of the clearest public signals of what a company is doing next.

How Spidra compares

LinkedIn job data is one of the most common scraping jobs, and some tools are cheaper per job. Here is how they differ.

Bright DataApify job actorsSpidra
Price$1.50 per 1,000 records, $1.30 on the Scale plan$1.00 to $2.00 (curious_coder), $1.00 to $1.50 (bebity), $0.28 to $0.40 (valig) per 1,000Search cards: 95 credits for a full 1,000-job search ($0.36 down to $0.19). Full postings: 1 credit each
InputKeyword, location, time range, job type and more, or URLsA LinkedIn search URL (curious_coder)Any LinkedIn search or job link, with LinkedIn's own filters
Per-job fieldsSalary range, applicants, seniority, apply link, Easy Apply flag, job posterUp to 42 fields with parsed salary and company details (bebity)Title, company, location, date, applicants, seniority, type, function, industries, pay when shown, description
Search capNot stated1,000 per search, stated in the actors' READMEs1,000 per search; a start past 990 fails free
Beyond LinkedInOther scrapers, datasets and proxiesThousands of other actorsIndeed, any website, crawl, search, PDFs, MCP

Choose an Apify job actor if

You want the lowest price per job with descriptions included, plus parsed salary, apply links and the job poster, and LinkedIn is the only site you need.

Choose Spidra if

You want search pages that are cheap per job, full postings when you need them, the same call for Indeed and other job sites, and nothing charged for a page that fails.

Competitor prices are as published on their own pages on October 17, 2026 and may have changed. Spidra prices use 1 credit per page on each plan. Sources: Bright Data, curious_coder, bebity, Apify Store.

What to know before you build

We would rather you hear the limits from us than find them in production.

  • LinkedIn shows visitors at most 1,000 jobs per search (start 0 to 990). Split larger searches by location, keyword or posting date.
  • Search cards don't include the description. Send each job link for the full posting, at 1 credit per posting.
  • Pay appears only when the employer fills in LinkedIn's pay field: about 1 in 5 postings in a 20-posting test run. Ranges written into the description stay in the description.
  • The remote filter (f_WT=2) passes through, but cards don't carry a remote label, so check the location and description if remote matters to you.
  • Spidra reads jobs as a visitor who isn't signed in. Apply links and anything LinkedIn shows only to members aren't included.

What it costs

1 credit per page. Pages that can't be delivered are free. Work out your monthly volume below.

Monthly credits
8,550
Fits the Builder plan ($79/mo)

Example: a full 1,000-job search is 95 pages (60 jobs on the first, then 10 per page). Three of those a day is 8,550 credits a month. Plain JSON output uses no AI tokens.

PlanPriceLinkedIn pages a month
Free$0up to 300 (one time)
Starter$19/moup to 5,000
BuilderPopular$79/moup to 25,000
Pro$249/moup to 125,000

Credits are shared across everything Spidra does, so the same plan covers LinkedIn and any other site.

Related scrapers

Same API key, same credits. See every scraper.

FAQ

Questions, answered

LinkedIn

LinkedIn's official APIs run through partner programs for marketing, talent and sales. They need LinkedIn's approval, have no public price list, and aren't an open feed of job search results. Spidra reads the public job search and job pages that anyone can open without signing in.

Send a LinkedIn job search and see what comes back.

Get 300 free credits, no card, and pull your first 60 jobs from the dashboard or the API.

Spidra is not affiliated with, endorsed by, or sponsored by LinkedIn. LinkedIn is a trademark of LinkedIn Corporation. Check LinkedIn's User Agreement and the laws that apply to you before you collect data, and use the data responsibly.