Multi Job Board Scraper β€” LinkedIn, Indeed, Glassdoor & More avatar

Multi Job Board Scraper β€” LinkedIn, Indeed, Glassdoor & More

Pricing

from $5.00 / 1,000 job scrapeds

Go to Apify Store
Multi Job Board Scraper β€” LinkedIn, Indeed, Glassdoor & More

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

Pika Choo

Maintained by Community

Actor stats

24

Bookmarked

2.6K

Total users

396

Monthly active users

6 days ago

Last modified

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

FieldTypeDescription
searchTerm πŸ”stringJob title or keyword (e.g. "software engineer", "data analyst"). Alternatively pass searchTerms (array, max 5) to run several queries in one go.

πŸ“ Search & Location

FieldTypeDefaultDescription
searchTerms πŸ”ŽarraynoneUp 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 πŸ“stringnoneCity, state, or country (e.g. "New York", "London", "Remote")
distance πŸ“integer50Search radius in miles from location
sites 🏒array6 working boardsJob boards: linkedin, indeed, glassdoor, zip_recruiter, bayt, naukri by default; google and bdjobs selectable but currently return no results
countryIndeed 🌐stringusaCountry for Indeed/Glassdoor (usa, uk, canada, australia, germany, france, india, etc.)
googleSearchTerm πŸ”ŽstringnoneCustom search term for Google Jobs only (copy from Google Jobs UI for best results)

πŸŽ›οΈ Filters

FieldTypeDefaultDescription
maxResults πŸ“Šinteger20Max results per site (1 to 100). Total jobs = maxResults x number of sites x number of search terms
isRemote 🏠booleanfalseRemote jobs only
jobType πŸ’Όstringnonefulltime, parttime, contract, internship, temporary
hoursOld ⏰integernoneJobs posted within N hours (e.g. 24 = last day, 168 = last week)
easyApply ⚑booleanfalseQuick-apply jobs only (hosted on the job board)
offset ⏭️integernoneSkip first N results (pagination)

πŸ”— LinkedIn-Specific

FieldTypeDefaultDescription
linkedinFetchDescription πŸ”—booleanfalseFetch full descriptions + direct URLs (more requests, slower)
linkedinCompanyIds 🏭arraynoneRestrict to specific LinkedIn company IDs (e.g. ["1441", "2382910"])

βš™οΈ Output & Advanced Options

FieldTypeDefaultDescription
descriptionFormat πŸ“stringmarkdownJob description format: markdown or html
enforceAnnualSalary πŸ’°booleanfalseConvert all wages to yearly equivalents
userAgent πŸ€–stringnoneOverride default User-Agent header
caCert πŸ”stringnoneCA certificate path for proxy auth
proxyConfiguration πŸ›‘οΈobjectRESIDENTIALProxy settings (residential recommended for LinkedIn)

πŸ“€ What you get

Each job is one dataset item with these fields (availability varies by board):

FieldDescription
idUnique job ID from the source board
titleJob title
companyCompany name
locationJob location
job_urlLink to job listing
job_url_directDirect apply URL (when available)
siteSource job board
date_postedDate the job was posted
job_typeEmployment type
is_remoteRemote flag
job_levelSeniority level (LinkedIn)
job_functionRole category
listing_typeListing type, e.g. sponsored
company_industryIndustry
company_url / company_url_directCompany profile on the board / company website
company_num_employeesEmployee count
company_employees_labelHuman-readable employee range (e.g. "1001-5000")
company_revenueCompany revenue
company_revenue_labelHuman-readable revenue (e.g. "$1B+")
company_countryCompany country (Indeed)
company_ratingCompany rating
company_reviews_countNumber of reviews
company_logoLogo URL
company_descriptionCompany description
salary_sourcedirect_data (board-provided) or description (parsed from text)
salary_minMinimum salary
salary_maxMaximum salary
salary_currencyCurrency
salary_intervalPay period (yearly, monthly, hourly)
descriptionFull job description (Markdown or HTML)
emailsEmails extracted from description
skillsSkills extracted from description (Naukri)
experience_rangeRequired experience (Naukri)
vacancy_countOpen positions (Naukri)
work_from_home_typeWFH type (Naukri)
search_term / matched_search_termThe query used for the run / the query that surfaced this row
scraped_atISO 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.

ScenarioJobsCost
Quick check, 1 board x 20 results20$0.10
Default run, 6 boards x 20 resultsup to 120up to $0.60
1,000 jobs1,000$5.00
10,000 jobs10,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_TOKEN and read items from the default dataset. Use run-sync-get-dataset-items for a single synchronous call.
  • Python: pip install apify-client, then client.actor("openclawai/job-board-scraper").call(run_input={...}) and client.dataset(run["defaultDatasetId"]).list_items().
  • JavaScript / Node: npm i apify-client, then await 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.

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 hoursOld with easyApply in the same search
  • Indeed ⚠️: cannot combine hoursOld with jobType, isRemote, or easyApply in the same search

Site-Specific Notes

BoardNotes
πŸ”΅ LinkedInRate-limited ~100 results per IP. Use residential proxies for large runs. Enable linkedinFetchDescription for full descriptions.
🟒 IndeedMost reliable, no rate limiting. Best for large scrapes.
🟑 GlassdoorRequires countryIndeed for country targeting.
πŸ”΄ Google JobsBest with a custom googleSearchTerm copied from the browser UI. Currently returns no results (platform-side changes).
🟠 ZipRecruiterUS & Canada only.
πŸŒ™ BaytMiddle East job market. Only searchTerm filter supported.
🟒 NaukriIndia job market. Returns skills, experience_range, company_rating.
πŸ”΅ BDJobsBangladesh job market. Currently returns no results (platform-side changes).

πŸ§ͺ Examples

{
"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"]
}
{
"searchTerms": ["AI consultant", "AI help", "GenAI advisor"],
"location": "Remote",
"sites": ["linkedin", "indeed"]
}
{
"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"
}
{
"searchTerm": "DevOps engineer",
"sites": ["bayt", "naukri"],
"maxResults": 30
}

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: google and bdjobs are 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: searchTerm is prefilled with
    "software engineer"
    and location with "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 searchTerm nor searchTerms is provided, the actor now pushes a single usage-hint row and exits cleanly (exit 0) instead of raising a ValueError (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 searchTerms array (max 5). Runs each query in turn, merges the results, and tags every row with matched_search_term so you can see which query surfaced each job.
  • Existing single searchTerm field 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 with urllib.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_agent kwarg compatibility shim (still active).
  • Multi-site concurrent scraping across 8 boards.
  • Rich salary, company, and filter support.