Multi Job Board Scraper β LinkedIn, Indeed, Glassdoor & More
Pricing
from $5.00 / 1,000 job scrapeds
Multi Job Board Scraper β LinkedIn, Indeed, Glassdoor & More
Scrape job listings from LinkedIn, Indeed, Glassdoor, Google Jobs & ZipRecruiter simultaneously. Extract job title, company, salary, location, job type, description, company info & more. No API keys needed β pay per result.
Pricing
from $5.00 / 1,000 job scrapeds
Rating
5.0
(3)
Developer
Pika Choo
Maintained by CommunityActor stats
24
Bookmarked
2.6K
Total users
396
Monthly active users
6 days ago
Last modified
Categories
Share
π Job Board Scraper β LinkedIn, Indeed, Glassdoor, ZipRecruiter, Naukri & Bayt
Scrape job listings from LinkedIn, Indeed, Glassdoor, ZipRecruiter, Bayt and Naukri in a single run for $0.005 per job (1,000 jobs for about $5). No API key, no login, no browser extension: enter a search term, pick your boards, and get structured, deduplicated job data with salary, company details and full descriptions as JSON, CSV or Excel.
This is the multi job board scraper behind 27,000+ runs on Apify. It works as a LinkedIn job scraper, Indeed scraper, Glassdoor job scraper and ZipRecruiter scraper at the same time, so you never have to stitch results from separate tools together again.
β¨ Features
- π’ 8 job boards in one run: LinkedIn, Indeed, Glassdoor, ZipRecruiter, Bayt, Naukri, plus Google Jobs and BDJobs (selectable, see notes below)
- π° Rich salary data: min, max, currency, pay interval, optional annual normalization
- π Deep company info: size, revenue, rating, industry, logo, description
- π― Advanced filters: remote only, job type, hours posted, distance, easy apply, LinkedIn company targeting
- π Multi-term OR search: up to 5 queries per run, each row tagged with the term that found it
- π Flexible output: Markdown or HTML descriptions
- π Auto-deduplication: the same job posted on several boards appears only once
- β‘ Streaming results: fast boards land in the dataset within 5 to 20 seconds
- π‘οΈ Proxy support: residential proxies recommended for LinkedIn
- π€ Custom User-Agent and π CA cert support for enterprise proxies
π₯ Who uses this job scraper?
- Recruiters and staffing agencies building a live feed of open roles to source candidates and spot hiring companies.
- Sales and lead generation teams who treat a new job posting as a buying signal: a company hiring five SDRs probably needs your sales tooling.
- Job aggregators and niche job boards that need a steady supply of fresh listings from LinkedIn, Indeed and Glassdoor without maintaining eight separate scrapers.
- Market and salary researchers comparing compensation, remote availability and demand for skills across cities and countries.
- Job seekers and career coaches running a daily search across every major board and pushing new matches to a spreadsheet or Slack.
- AI agents and LLM pipelines that need clean job data on demand through MCP or the Apify API.
π₯ Input
π΄ Required
| Field | Type | Description |
|---|---|---|
searchTerm π | string | Job title or keyword (e.g. "software engineer", "data analyst"). Alternatively pass searchTerms (array, max 5) to run several queries in one go. |
π Search & Location
| Field | Type | Default | Description |
|---|---|---|---|
searchTerms π | array | none | Up to 5 queries run in sequence and merged (OR search). Each row gets a matched_search_term. Cost scales with the number of terms. |
location π | string | none | City, state, or country (e.g. "New York", "London", "Remote") |
distance π | integer | 50 | Search radius in miles from location |
sites π’ | array | 6 working boards | Job boards: linkedin, indeed, glassdoor, zip_recruiter, bayt, naukri by default; google and bdjobs selectable but currently return no results |
countryIndeed π | string | usa | Country for Indeed/Glassdoor (usa, uk, canada, australia, germany, france, india, etc.) |
googleSearchTerm π | string | none | Custom search term for Google Jobs only (copy from Google Jobs UI for best results) |
ποΈ Filters
| Field | Type | Default | Description |
|---|---|---|---|
maxResults π | integer | 20 | Max results per site (1 to 100). Total jobs = maxResults x number of sites x number of search terms |
isRemote π | boolean | false | Remote jobs only |
jobType πΌ | string | none | fulltime, parttime, contract, internship, temporary |
hoursOld β° | integer | none | Jobs posted within N hours (e.g. 24 = last day, 168 = last week) |
easyApply β‘ | boolean | false | Quick-apply jobs only (hosted on the job board) |
offset βοΈ | integer | none | Skip first N results (pagination) |
π LinkedIn-Specific
| Field | Type | Default | Description |
|---|---|---|---|
linkedinFetchDescription π | boolean | false | Fetch full descriptions + direct URLs (more requests, slower) |
linkedinCompanyIds π | array | none | Restrict to specific LinkedIn company IDs (e.g. ["1441", "2382910"]) |
βοΈ Output & Advanced Options
| Field | Type | Default | Description |
|---|---|---|---|
descriptionFormat π | string | markdown | Job description format: markdown or html |
enforceAnnualSalary π° | boolean | false | Convert all wages to yearly equivalents |
userAgent π€ | string | none | Override default User-Agent header |
caCert π | string | none | CA certificate path for proxy auth |
proxyConfiguration π‘οΈ | object | RESIDENTIAL | Proxy settings (residential recommended for LinkedIn) |
π€ What you get
Each job is one dataset item with these fields (availability varies by board):
| Field | Description |
|---|---|
id | Unique job ID from the source board |
title | Job title |
company | Company name |
location | Job location |
job_url | Link to job listing |
job_url_direct | Direct apply URL (when available) |
site | Source job board |
date_posted | Date the job was posted |
job_type | Employment type |
is_remote | Remote flag |
job_level | Seniority level (LinkedIn) |
job_function | Role category |
listing_type | Listing type, e.g. sponsored |
company_industry | Industry |
company_url / company_url_direct | Company profile on the board / company website |
company_num_employees | Employee count |
company_employees_label | Human-readable employee range (e.g. "1001-5000") |
company_revenue | Company revenue |
company_revenue_label | Human-readable revenue (e.g. "$1B+") |
company_country | Company country (Indeed) |
company_rating | Company rating |
company_reviews_count | Number of reviews |
company_logo | Logo URL |
company_description | Company description |
salary_source | direct_data (board-provided) or description (parsed from text) |
salary_min | Minimum salary |
salary_max | Maximum salary |
salary_currency | Currency |
salary_interval | Pay period (yearly, monthly, hourly) |
description | Full job description (Markdown or HTML) |
emails | Emails extracted from description |
skills | Skills extracted from description (Naukri) |
experience_range | Required experience (Naukri) |
vacancy_count | Open positions (Naukri) |
work_from_home_type | WFH type (Naukri) |
search_term / matched_search_term | The query used for the run / the query that surfaced this row |
scraped_at | ISO timestamp of the scrape |
Sample JSON output
{"id": "in-7f3a2c9e1b","title": "Senior Software Engineer","company": "JPMorganChase","location": "New York, NY, US","site": "indeed","job_type": "fulltime","is_remote": false,"date_posted": "2026-04-01","salary_source": "direct_data","salary_min": 120000,"salary_max": 185000,"salary_currency": "USD","salary_interval": "yearly","job_level": null,"company_industry": "Banking & Financial Services","company_num_employees": "10,000+","company_revenue": "more than $10B (USD)","company_rating": 3.9,"company_reviews_count": 21432,"company_logo": "https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/example.png","job_url": "https://www.indeed.com/viewjob?jk=7f3a2c9e1b","job_url_direct": "https://careers.jpmorgan.com/us/en/jobs/12345","description": "## About the role\n\nWe are looking for a Senior Software Engineer ...","search_term": "software engineer","matched_search_term": "software engineer","scraped_at": "2026-08-29T10:15:32.412Z"}
Download the dataset as JSON, CSV, Excel, XML or RSS from the Output tab, or fetch it through the API.
π΅ Pricing: how much does it cost to scrape 1,000 jobs?
$0.005 per job scraped, pay-per-event. You are only charged for job rows actually delivered to your dataset. Runs that return zero jobs cost nothing beyond the Apify platform's tiny start fee.
| Scenario | Jobs | Cost |
|---|---|---|
| Quick check, 1 board x 20 results | 20 | $0.10 |
| Default run, 6 boards x 20 results | up to 120 | up to $0.60 |
| 1,000 jobs | 1,000 | $5.00 |
| 10,000 jobs | 10,000 | $50.00 |
Worked example: searchTerm: "data engineer", sites: ["linkedin", "indeed", "glassdoor"], maxResults: 100, searchTerms with 4 queries. Maximum theoretical rows = 100 x 3 x 4 = 1,200, so the ceiling is $6.00. After deduplication most runs return fewer rows than the ceiling, and you pay only for what lands in the dataset.
Cost control tips: keep maxResults small while testing, set a max total charge on the run in Console, and use hoursOld so repeat runs only pull fresh postings. Apify's free plan includes $5 of monthly credit, enough for roughly 1,000 jobs.
π€ Use with AI agents and MCP
The scraper is available as a tool for Claude, ChatGPT, Cursor and any MCP-compatible agent through the Apify MCP server. Add this URL to your MCP client and the agent can search jobs and read the results directly:
https://mcp.apify.com/?tools=fetch-actor-details,openclawai/job-board-scraper
Typical agent prompts: "Find remote senior React jobs posted in the last 24 hours on LinkedIn and Indeed and list the companies with salary ranges", or "Which companies in Austin are hiring data engineers this week?". The agent calls the scraper, waits for the dataset and reasons over the structured rows.
A step-by-step setup guide, including Claude Desktop and Cursor configuration, is at datapika.com/actors/job-board-scraper.
π Integrations
- API: start a run with
POST https://api.apify.com/v2/acts/openclawai~job-board-scraper/runs?token=YOUR_TOKENand read items from the default dataset. Userun-sync-get-dataset-itemsfor a single synchronous call. - Python:
pip install apify-client, thenclient.actor("openclawai/job-board-scraper").call(run_input={...})andclient.dataset(run["defaultDatasetId"]).list_items(). - JavaScript / Node:
npm i apify-client, thenawait client.actor("openclawai/job-board-scraper").call(input). - Zapier, Make, n8n: use the Apify app to run the scraper on a schedule and push new jobs to Google Sheets, Airtable, Slack, HubSpot or any CRM.
- Scheduling and webhooks: set a daily schedule in Console and attach a webhook to trigger downstream processing when a run finishes.
β FAQ
Does LinkedIn, Indeed or Glassdoor have an official jobs API I could use instead?
Not for general job search. LinkedIn's Jobs API is limited to approved partners, Indeed retired its public Publisher API, and Glassdoor's API was closed to new applicants. ZipRecruiter offers a partner feed only. This scraper reads the public search pages instead, so there is no API key, partner agreement or waitlist, and you get the same fields you see in the browser.
How much does it cost to scrape 1,000 jobs?
$5.00 at $0.005 per job. Charges apply only to rows delivered, so a search that finds 340 jobs costs $1.70. See the pricing table above for more examples.
How fast is it?
Indeed and LinkedIn results usually appear in the dataset 5 to 20 seconds after the run starts. Glassdoor, ZipRecruiter, Bayt and Naukri are fetched through a real browser and typically take 1 to 3 minutes. Results stream in as each board finishes, so you can start reading the dataset before the run completes.
Are there limits on how many jobs I can scrape?
maxResults is capped at 100 per board per search term, and searchTerms at 5, so a single run tops out at 4,000 rows across 8 boards. For more, paginate with offset or split by location and job type. LinkedIn also rate-limits around 100 results per IP, which is why residential proxies are the default.
Which countries and boards are supported?
Indeed and Glassdoor accept a countryIndeed code (usa, uk, canada, australia, germany, france, india, singapore, uae and most others). LinkedIn is global. ZipRecruiter covers the US and Canada, Bayt the Middle East, Naukri India and BDJobs Bangladesh. Google Jobs and BDJobs are currently returning no results because of changes on those platforms; they stay selectable and will resume when the platforms stabilize.
Why do I get fewer jobs than maxResults?
Three common reasons: the board simply has fewer matches for your filters, duplicates were removed across boards, or a filter combination is unsupported (LinkedIn cannot combine hoursOld with easyApply; Indeed cannot combine hoursOld with jobType, isRemote or easyApply). Loosen the filters or drop hoursOld to widen the net.
What output formats are available?
Every run produces an Apify dataset you can download as JSON, CSV, Excel, XML, HTML table or RSS, or stream through the API. Job descriptions come as Markdown by default or HTML if you set descriptionFormat.
Is it legal to scrape job listings?
The scraper only collects publicly visible job postings and does not log in, bypass paywalls or collect private profile data. Job listings are business information published to be found. You are responsible for using the data in line with the terms of the source boards and with laws that apply to you, such as GDPR when a listing contains personal contact details.
β οΈ Important Notes
Filter combinations that boards do not support
- LinkedIn β οΈ: cannot combine
hoursOldwitheasyApplyin the same search - Indeed β οΈ: cannot combine
hoursOldwithjobType,isRemote, oreasyApplyin the same search
Site-Specific Notes
| Board | Notes |
|---|---|
| π΅ LinkedIn | Rate-limited ~100 results per IP. Use residential proxies for large runs. Enable linkedinFetchDescription for full descriptions. |
| π’ Indeed | Most reliable, no rate limiting. Best for large scrapes. |
| π‘ Glassdoor | Requires countryIndeed for country targeting. |
| π΄ Google Jobs | Best with a custom googleSearchTerm copied from the browser UI. Currently returns no results (platform-side changes). |
| π ZipRecruiter | US & Canada only. |
| π Bayt | Middle East job market. Only searchTerm filter supported. |
| π’ Naukri | India job market. Returns skills, experience_range, company_rating. |
| π΅ BDJobs | Bangladesh job market. Currently returns no results (platform-side changes). |
π§ͺ Examples
Basic Search
{"searchTerm": "software engineer","location": "New York"}
π Remote Full-time Jobs in the Last 24 Hours
{"searchTerm": "data analyst","isRemote": true,"jobType": "fulltime","hoursOld": 24,"sites": ["indeed", "google", "zip_recruiter"]}
π Multi-Term OR Search
{"searchTerms": ["AI consultant", "AI help", "GenAI advisor"],"location": "Remote","sites": ["linkedin", "indeed"]}
π LinkedIn Company-Specific Search
{"searchTerm": "product manager","location": "San Francisco","sites": ["linkedin"],"linkedinCompanyIds": ["1441", "2382910"],"linkedinFetchDescription": true}
π Global Multi-Board Search with Salary Normalization
{"searchTerm": "machine learning engineer","location": "London","sites": ["linkedin", "indeed", "glassdoor"],"countryIndeed": "uk","maxResults": 50,"enforceAnnualSalary": true,"descriptionFormat": "markdown"}
π Middle East + India Search
{"searchTerm": "DevOps engineer","sites": ["bayt", "naukri"],"maxResults": 30}
βοΈ Legal and ethical use
This scraper collects only public job postings. It does not log in to any account, does not access private candidate or recruiter data, and does not circumvent authentication. Use the data responsibly: respect the terms of the source boards, avoid republishing full descriptions without attribution, and handle any personal data (such as recruiter emails found in descriptions) according to applicable privacy law. Contact us through the Issues tab if a source asks for its listings to be excluded.
π Changelog
v1.0.49 (2026-08-03)
β‘ Results now stream in seconds, no more waiting for the slowest board.
Based on feedback from real user testing sessions: the most common complaint was a long silent wait before any results appeared.
- β‘ Incremental results: each job board's rows are pushed to the dataset the moment that board finishes. Fast boards (Indeed, LinkedIn) typically land within 5 to 20 seconds of the run starting; previously nothing appeared until every board completed (up to several minutes).
- π£οΈ Live progress logs: the run log now announces when the stealth browser is launching, each anti-bot warm-up attempt, and that results stream as boards complete.
- π― Smarter defaults:
googleandbdjobsare removed from the default board list (both currently return no results due to platform-side changes); they remain selectable explicitly. Default runs are faster and never waste time on boards that can't succeed. - β±οΈ Faster worst case: ZipRecruiter's anti-bot warm-up retry budget was halved, cutting several minutes off unlucky runs.
- π§ More memory by default: runs now default to 4 GB, giving the browser-based boards comfortable headroom.
Verified on Apify: default-style run produced first dataset rows 3 seconds after container start and 95 jobs across 5 boards in 54 seconds total.
v1.0.20 (2026-04-23)
Quality & reliability: resolved "under maintenance" flag.
Apify's automated quality tests run the actor with only the prefilled input
values. When v1.0.18 added multi-term search, the hard requirement on
searchTerm was relaxed, which meant the QA runs submitted empty input
and hit a ValueError crash, which triggered the maintenance flag.
- π©Ή Prefilled inputs for automated testing:
searchTermis prefilled withand"software engineer"locationwith"New York, NY". New users opening the actor for the first time also see these working defaults instead of a blank form. - π©Ή Graceful empty-input fallback: if neither
searchTermnorsearchTermsis provided, the actor now pushes a single usage-hint row and exits cleanly (exit 0) instead of raising aValueError(exit 91). No user is ever charged for a pointless failed run. - π¦ All 8 job boards still selectable by default. Google & ZipRecruiter remain available even though those platforms are currently rate-limiting automated traffic and may intermittently return no results.
Verified on Apify: empty-input run now succeeds in <1s instead of crashing; prefilled input returns 60 jobs across LinkedIn/Indeed/Glassdoor.
v1.0.18 (2026-04-21)
Multi-term OR search (based on store-review feedback).
- New optional
searchTermsarray (max 5). Runs each query in turn, merges the results, and tags every row withmatched_search_termso you can see which query surfaced each job. - Existing single
searchTermfield unchanged and fully backwards compatible.
v1.0.17 (2026-04-20)
Glassdoor: fixed, now returns real results again. Three fixes for changes Glassdoor made to its site that had been causing every Glassdoor search to return 0 results:
- π©Ή CSRF token URL: the old bootstrap URL (
/Job/computer-science-jobs.htm) began returning HTTP 403 after Glassdoor's Next.js migration, so the session was initialized without a valid token and every Glassdoor search silently returned 0 results. Switched to/Job/index.htm, which returns 200 and the token parses cleanly. - π©Ή Location URL-encoding: location strings with commas or spaces (e.g.
"Nashville, TN","New York, NY") were interpolated raw into the location lookup URL, triggering HTTP 400"location not parsed". Now wrapped withurllib.parse.quote. - π©Ή Non-fatal GraphQL errors: Glassdoor's API often returns peripheral
errors on SEO-only fields (
jobsPageSeoData) alongside fully populated job listings. These were previously treated as fatal, dropping all the good data. Now we only fail when the core job-listings data is actually missing.
Verified locally before deploy: Nashville, TN + "software engineer" returned 10 real jobs (Deloitte, KPMG, PwC, Amazon, etc.). Full regression on Indeed / LinkedIn / combined runs passed.
v1.0.x (pre-fix)
- BDJobs
user_agentkwarg compatibility shim (still active). - Multi-site concurrent scraping across 8 boards.
- Rich salary, company, and filter support.