Job Board Scraper & API — LinkedIn, Indeed, Glassdoor + 29 More
Pricing
from $0.35 / 1,000 jobs
Job Board Scraper & API — LinkedIn, Indeed, Glassdoor + 29 More
Full job descriptions and USD salaries on every row, from LinkedIn, Indeed, Glassdoor and 29 more sources, including 2,335 employers' own career sites on 17 ATS platforms, in one deduplicated dataset. Monitor mode for daily feeds of new postings, MCP-ready for AI agents.
Pricing
from $0.35 / 1,000 jobs
Rating
5.0
(1)
Developer
Spool
Maintained by CommunityActor stats
1
Bookmarked
31
Total users
8
Monthly active users
5 days ago
Last modified
Categories
Security
Limited permissionsShare
Job Board Scraper & API — LinkedIn, Indeed, Glassdoor and 29 more sources in one run
One search. Every major job board, ten free job feeds and 2,335 employers' own career sites. One clean dataset.
- 📝 Full descriptions on every row, including the LinkedIn and Glassdoor rows other scrapers leave empty, read from the employer's own posting.
- 💵 Salaries you can compare: as stated, annualised, and in USD, with pay ranges pulled from the posting text when the board has no field.
- 🔁 One row per posting: the same job on three boards is merged, the richest copy kept, every board it appeared on listed.
- 🏢 The employer attached: direct apply link, real posting date, department, and an optional hiring profile per company.
- ⚡ Rows in seconds: the first rows land while the slower boards are still answering; a default run finishes in about a minute.
Software Development Engineer II Amazon $143,700–$213,800 Engineering · mid indeed +linkedinEmbedded Software Engineer General Dyn. $115,252–$121,554 Engineering · mid indeedStaff Platform Engineer Stripe $190,000–$260,000 Engineering · lead linkedin → greenhouse
You pay per job row delivered, at the price on the Pricing tab. Duplicates, rows a filter removed, empty boards and companies without a public board cost nothing.
🚀 Try it in one minute
Press Try for free, keep the prefilled input or paste one of these, and press Start. Rows appear in the Output tab within seconds.
A title and a place
{ "searchTerms": ["software engineer"], "location": "New York, NY" }
Remote, posted this week, with a salary
{ "searchTerms": ["data engineer"], "location": "Remote", "remoteOnly": true, "postedWithinHours": 168, "requireSalary": true }
A company's whole board, straight from the employer
{ "companies": ["stripe.com", "Datadog"] }
A daily feed of only new postings, delivered to Slack
{ "searchTerms": ["product manager"], "location": "Austin, TX", "onlyNew": true, "webhookUrl": "https://hooks.slack.com/services/…" }
A default run returns 120 jobs, about 25 each from Indeed, LinkedIn, Glassdoor and The Muse plus the employers' own boards, in under a minute. Set results to 500 or 1,000 for the whole market of a search; a 1,000-row run takes two to four minutes. Ten ready-made searches, from Workday career sites to Naukri, are in the Examples tab at the top of this page.
👥 Who uses it
- Recruiters and sourcers who want one live feed of open roles across every board, deduplicated, with the employer's apply link.
- Sales and lead-generation teams who read a new posting as a buying signal: the company rows give open roles, department mix, tech stack and pay band per company.
- Job seekers running a daily search across every board, with a keyword-fit score against their own skills and only new postings each morning.
- Salary and market researchers comparing pay, remote share and demand for skills across cities and countries on one USD scale.
- Job aggregators and niche boards that need a steady supply of fresh, merged listings without maintaining thirty scrapers.
- AI agents and LLM pipelines that need clean job data on demand through MCP or the API.
📦 What every row carries
The posting — title, company, location, jobUrl, jobUrlDirect, applyUrl (the employer's own page when found), description with descriptionSource (board, employer's board, job page), datePosted and postedDaysAgo, jobType, isRemote.
The pay — salaryMin and salaryMax as stated with salaryCurrency and salaryInterval; salaryMinAnnual and salaryMaxAnnual; salaryMinUsd and salaryMaxUsd; salarySource (the board, the employer's board, the job page, or the posting text).
The company — companyIndustry, companyNumEmployees, companyRevenue, companyRating, companyReviewsCount, companyLogo, companyUrl, and when its own board was found atsProvider, atsBoardUrl, atsDepartment, atsPostedAt.
Where it is — city, region, country (ISO code), locationType (onsite, hybrid, remote), inSearchedCity (true for the city you searched, false for its metro area), otherLocations when one posting covers several cities.
What we read from the text — department, seniority, jobCategory (30 categories), employmentType, yearsExperienceMin and yearsExperienceMax, visaSponsorship, educationLevel, tech (190 technologies) and techCategories, skills, emails.
Bookkeeping — site and alsoOn (every board the posting appeared on), searchTerm, matchesTitle (the title carries the term that found it, or it is one of the boards' looser matches), matchedKeywords and keywordMatchPercent, dedupeKey, firstSeenAt in monitor mode. LinkedIn rows add applicants, isClosed, jobPosterName and jobPosterTitle.
Views on the Output tab: Jobs, Salaries, Technologies, Companies, Employer postings, Experience, visa, education, Leads and Notices. Export JSON, CSV or Excel, or read the dataset from the API.
🌍 Where it reads: LinkedIn, Indeed, Glassdoor and 29 more
Job boards — Indeed (salary and description on every row), LinkedIn (global), Glassdoor (salaries, company ratings), The Muse (named employers, full descriptions), Naukri (India), Bayt (Middle East), BDJobs (Bangladesh).
Free job feeds — Remotive, RemoteOK, Arbeitnow (Europe), Jobicy, Himalayas, Working Nomads, We Work Remotely, the monthly Ask HN: Who is hiring? thread, Welcome to the Jungle (Europe, with salary fields), and the daily list of software-engineering internships and new-grad roles. The remote feeds join a remote search on their own.
Employers' own boards, 17 platforms — Greenhouse, Ashby, Lever, SmartRecruiters, Rippling, Breezy, Personio, Teamtailor and Pinpoint by company name; Workday, Oracle Cloud HCM, SAP SuccessFactors, Phenom, Eightfold, BambooHR and Recruitee from a careers URL; Amazon's careers site by name.
A verified employer list — 2,335 well-known employers' boards, from Greenhouse and Ashby start-ups to the Workday, Oracle, SuccessFactors, Phenom and Eightfold sites of Lockheed Martin, Capital One, JPMorgan Chase and Nvidia, with some 350,000 open roles. Every search asks the 600 largest for your terms directly; searchEmployerBoards goes up to 2,000.
✨ Why this one
The employer's posting on the board's row. LinkedIn and Glassdoor return a title, a company and a location, and no description. For every company a search turns up, this Actor finds the company's own board and attaches the employer's posting: full description, direct apply URL, the department as the employer labels it, the real posting date. Rows still without text get the board's own job detail. descriptionSource tells you which case you have.
Salaries on one scale. Boards report "$45/hour", "₹12L/year" and "€4,200/month" as bare numbers. Every salary is reported as stated, annualised in its currency, and annualised in USD, so a London role and an Austin role are judged together. Pay ranges printed in the description are read back out conservatively: a figure counts only when it carries a currency, sits in a plausible band and forms a range or stands next to a pay word. Every run writes SALARY_TEXT_SAMPLE so you can check the extractor's work.
One row per posting. Rows are matched on normalised title, company and city; title variants, requisition IDs, company suffixes and city spellings collapse to one key; the richest copy is kept and missing fields are filled from the others. MERGE_SAMPLE in the run's store shows the first sixty merges.
A hiring profile per company. A company posting five SDR roles needs sales tooling. With companyRollup on, each company gets one row: open roles found, boards posted on, the ATS and its whole open count, department and seniority mix, top technologies, USD pay range, remote share.
{"recordType": "company", "company": "Stripe", "openRolesFound": 7,"atsProvider": "greenhouse", "atsOpenRoles": 716, "boards": ["linkedin", "indeed", "greenhouse"],"departments": { "Engineering": 5, "Product": 2 }, "seniorityMix": { "senior": 4, "lead": 2, "mid": 1 },"topTech": ["Kubernetes", "Go", "Kafka", "Snowflake"], "salaryMinUsd": 165000, "salaryMaxUsd": 290000, "remoteShare": 0.43}
Only what is new. Turn on onlyNew and the search remembers every posting it has delivered, in a key-value store in your own account. On a schedule, each run returns only postings that were not there before: nothing delivered twice, nothing charged twice. Add webhookUrl and each run that finds something posts a digest to Slack, Discord or any URL.
Filters that never bill. Salary floor, technologies, title words, companies, agencies, posting age, experience level, job type and remote all run after scraping and before delivery, so a removed row is never charged; RUN_SUMMARY.filterRemoved counts each one.
🧪 Recipes
Remote senior data roles posted this week, paying over $150k
{ "searchTerms": ["senior data engineer", "staff data engineer"], "location": "Remote", "remoteOnly": true, "postedWithinHours": 168, "requireSalary": true, "minSalaryUsd": 150000 }
Who is hiring for Snowflake in London
{ "searchTerms": ["data engineer", "analytics engineer"], "location": "London", "country": "uk", "requireTech": ["Snowflake"] }
A named company's whole board, straight from the employer
{ "companies": ["stripe.com", "https://jobs.ashbyhq.com/ramp", "Datadog"] }
An enterprise on Workday, about 250 Nvidia roles with full text in under a minute
{ "companies": ["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"], "searchTerms": ["software engineer"], "boards": [] }
Three cities in one run, deduplicated together
{ "searchTerms": ["software engineer"], "location": "San Francisco, CA\nAustin, TX\nSeattle, WA", "results": 500 }
A daily feed of new product manager jobs in Austin
{ "searchTerms": ["product manager"], "location": "Austin, TX", "postedWithinHours": 24, "onlyNew": true, "webhookUrl": "https://hooks.slack.com/services/…" }
A search you already have open: paste the LinkedIn, Indeed or Glassdoor URL and its filters come with it
{ "searchUrls": ["https://www.indeed.com/jobs?q=python+developer&l=Austin%2C+TX&fromage=14"] }
The whole verified list, no aggregator in between
{ "searchTerms": ["machine learning engineer"], "boards": [], "searchEmployerBoards": 2000 }
⚙️ Input
The form shows 20 fields in four sections.
| Option | Default | What it does |
|---|---|---|
| Search | ||
searchTerms | — | Up to 5 titles or keywords, merged; each row says which one found it. Related titles are added only when your own words leave the run short |
location | — | City, region, country or Remote; several places one per line, each searched and merged |
remoteOnly | false | The boards' own remote filter, then every row judged again on its location and text |
country | usa | National Indeed and Glassdoor site: usa, uk, canada, australia, germany, france, india, singapore, uae and most others |
results | 120 | Jobs the run delivers, 20 to 10,000; the boards are asked for enough to reach it after merging. 120 is about 20 per source; 500 or 1,000 for the whole market |
| Employers' own boards | ||
companies | — | Employers to read directly from their own board: names, domains or board URLs |
searchUrls | — | LinkedIn, Indeed or Glassdoor search pages; each replaces the form for its board, filters included |
searchEmployerBoards | 600 | Ask the N largest boards in the verified list of 2,335 employers for your terms (0 to 2,000; 0 turns it off) |
| Filters | ||
boards | indeed, linkedin, glassdoor, muse | Also naukri, bayt, bdjobs, wttj, the free remote feeds, hackernews and collegejobs |
postedWithinHours | — | 24 = last day, 168 = last week |
jobType | — | fulltime, parttime, contract, internship, temporary |
experienceLevel | — | junior, mid, senior, manager, director, executive |
requireSalary | false | Only rows with a stated salary, from the board, the employer or the text |
minSalaryUsd | — | Annualised USD floor |
requireTech | — | Only rows naming any of these technologies |
excludeTitleKeywords | — | Drop titles containing these words |
excludeCompanies | — | Drop these employers; Wipro also covers Wipro Limited |
excludeAgencies | false | Drop staffing and recruiting agencies by name |
| Monitor and alerts | ||
onlyNew | false | Deliver and charge only postings this search has not delivered before |
webhookUrl | — | Slack, Discord or any URL: a digest of each run that delivered rows |
The API accepts more: companyRollup for the hiring profiles, resumeKeywords for a fit score against your own skills, targetCompanies, requireTitleKeywords, excludeCities, excludeClosed, maxAgeDays, strictKeywordMatch, sortBy, preset, monitorName, resultsPerBoard, maxDescriptionsPerBoard, linkedinCompanyIds, linkedinEasyApply, descriptionFormat, radiusMiles, offset and proxyConfiguration. Every one keeps a sensible default when left out.
🤖 AI agents, API and integrations
MCP. Add the Apify MCP server to Claude, Cursor, ChatGPT or any MCP client and the agent calls this Actor as a tool:
https://mcp.apify.com/?tools=spool/job-board-api
Prompts that work: "Find remote staff engineer roles posted this week that mention Kubernetes and tell me which companies are hiring the most." "Which companies in Austin are hiring data engineers, with their salary ranges?" "Read Stripe's job board and list the senior roles."
API. One call returns the rows:
POST https://api.apify.com/v2/acts/spool~job-board-api/run-sync-get-dataset-items?token=YOUR_TOKEN
Python: pip install apify-client, then client.actor("spool/job-board-api").call(run_input={...}) and client.dataset(run["defaultDatasetId"]).list_items(). JavaScript: npm i apify-client, then await client.actor("spool/job-board-api").call(input).
Zapier, Make, n8n, Google Sheets, Airtable, Slack, HubSpot. Run it on a schedule with onlyNew from the Integrations tab and route new rows wherever they belong; filter on recordType to send jobs and company profiles separately.
📋 What it covers, honestly
- Boards fail, the run does not. Each source runs on its own timeout; one that errors or returns nothing is reported in
RUN_SUMMARY.boardHealthwhile the others deliver. A board that answers with far fewer rows than asked is tried again through another proxy exit. - Nothing you did not get is charged. A run that hits its time limit stops itself, delivers what it has and ends as a normal run. An unexpected error does the same, with a notice row that says what happened. Filters remove rows before delivery.
- Filtered searches take longer. A filter on the posting text means a candidate's text is read before the filter can judge it. Expect one to three minutes for a heavily filtered run, about a minute without.
- Board quirks. LinkedIn cannot combine
postedWithinHourswith Easy Apply; Indeed cannot combine it withjobTypeorremoteOnly. The board silently drops one; the run tells you in the log. - Descriptions depend on the source. Indeed and the employer boards carry them; LinkedIn and Glassdoor rows get the employer's posting or the board's own job detail; Bayt, Naukri and BDJobs publish none.
- Salary coverage is the board's. Indeed and Glassdoor state salaries on most US rows; LinkedIn rarely; employer boards when the law makes them.
- The free feeds are remote-first and English-first. Excellent for remote and tech roles, thin for on-site roles in Lyon.
- Indeed, LinkedIn and Glassdoor need Apify's residential proxy, which the Actor uses on its own; without it those three return nothing, and the log says so.
⚖️ Is this legal?
The job boards collect public job postings only: the same search results any visitor sees, no login, no candidate or recruiter profiles, no paywall bypass. The employer boards publish public JSON meant for exactly this use. Job listings are business information published to be found; handle any personal data a description happens to contain according to the law that applies to you.
❓ FAQ
Is there a LinkedIn jobs API, an Indeed API or a Glassdoor API? Not a public one. This is a job board API over their public listings plus the employers' own public ATS APIs.
Why do I see titles I did not type? The boards match loosely, and related titles are searched when your words leave the run short. matchesTitle is true on rows whose title carries your term; keep those for the role itself.
Why fewer rows than I asked for? Fewer matches exist, duplicates were merged, or a board rejected a filter combination. The log shows per-board counts and RUN_SUMMARY.duplicatesRemoved the merges.
How fast is it? The first rows land in seconds; a default run finishes in about a minute; 1,000 rows in two to four minutes.
How many jobs can one run return? Up to 10,000, across up to ten places, plus whole employer boards.
Which countries? LinkedIn is global. Indeed and Glassdoor follow country. Naukri covers India, Bayt the Middle East, BDJobs Bangladesh, Welcome to the Jungle Europe. The employer boards are wherever the employer is.
Can I use it for lead generation? Yes. Turn on companyRollup for one row per company with its open roles, tech stack and pay band, and onlyNew on a schedule for a daily feed of companies that just started hiring.
Can it alert me? Set webhookUrl to a Slack or Discord incoming webhook, or any URL. With onlyNew on a schedule, you hear only about new postings.
What happens if my run times out? It stops itself before the limit, delivers the rows it had, writes the summary and ends as succeeded.
💬 Support
Open an issue on the Issues tab and you will get a reply, usually the same day. If a board changes and breaks, say so there; the per-board health in your run's RUN_SUMMARY is the fastest way to show it. If the Actor saved you time, a review on this page helps other people find it.
More from spool
- Job Search Scraper — Live Jobs Direct from Company Career Pages — the verified employer list searched on its own, no proxy, no aggregator
- Career Page Scraper & ATS Jobs API — 17 ATS Platforms — every open role straight from employers' own boards, by company name, domain or careers URL
- Indeed Jobs Scraper — Salaries, Benefits & Company Data — Indeed alone, in depth: benefits, schedule, skills and the company dossier on every row
- Wellfound Jobs Scraper (AngelList) — Salary & Equity Data — startup roles with salary and equity
- Company Tech Stack API — Detected from Job Postings — a company's technologies read from its own job board