Job Boards Scraper & API - Greenhouse, Lever, Ashby, Workday
Pricing
from $1.00 / 1,000 results
Job Boards Scraper & API - Greenhouse, Lever, Ashby, Workday
Every open job at any company from its ATS: Greenhouse, Lever, Ashby, SmartRecruiters, Workday, Workable, Recruitee, Personio, Teamtailor, BambooHR. Input: board URLs, careers pages or company sites. One result = one job: title, company, location, remote, department, salary, date, description. $1/1k
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Giovanni Rich
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
15 days ago
Last modified
Categories
Share
Job Boards Scraper & API - Greenhouse, Lever, Ashby, Workday, Workable, SmartRecruiters and more
Job Boards Scraper is a company job postings scraper and unofficial jobs API for the applicant tracking systems most companies hire through: Greenhouse, Lever, Ashby, SmartRecruiters, Workday, Workable, Recruitee, Personio, Teamtailor and BambooHR. Give it a board URL, a careers page, a company website or just a company name, and get every open job as clean JSON, CSV or Excel: title, company, location, remote flag, department, employment type, salary range, posting date, full description and the apply link.
It reads each platform's official public job feed over plain HTTP: no browser, no login, no scraping of rendered pages, so a board with 700 jobs takes a couple of seconds and almost never fails. Use it for hiring-signal lead generation (which companies are hiring for what, right now), job aggregators, recruiting tools, labour-market research and competitor watching.
How to use
- Paste one or more entries in Job boards, careers pages or company websites. Any of these work:
- an ATS board:
https://boards.greenhouse.io/stripe,https://jobs.lever.co/palantir,https://jobs.ashbyhq.com/notion,https://apply.workable.com/workmotion,https://jobs.smartrecruiters.com/Ubisoft2,https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite,https://bunq.recruitee.com,https://acme.jobs.personio.de,https://polestar.teamtailor.com,https://acme.bamboohr.com/careers - a company careers page such as
https://www.notion.com/careers: the embedded board is detected from the page - a company website such as
https://stripe.com, or a bare name such asstripe: the name is tried on every platform and the board that has jobs wins
- an ATS board:
- Optionally filter: Title must contain (e.g.
engineer,sales), Title must NOT contain, Location must contain (e.g.remote,london), Remote jobs only, Posted after, and Max jobs per board. - Click Start. Download the results as JSON, CSV, Excel or HTML from the Output tab, or pull them through the Apify API, Make, Zapier, n8n or an MCP client.
What you get
One dataset item per job posting:
- Identity:
id(the platform's job id),title,company,ats(which platform),url(the job page),applyUrl,requisitionIdwhere the platform publishes one,boardUrl. - Where:
location(as the company wrote it),locations(all locations of the posting),city,region,country,workplaceType(remote/hybrid/onsite) andisRemote. - What:
department,team,employmentType(full-time,part-time,contract,internship...),senioritywhere the platform has it. - Pay:
salaryMin,salaryMax,salaryCurrency,salaryPeriodand the rawsalaryText, from the platform's structured salary field when it exists (Lever, Ashby, Recruitee, Teamtailor) or parsed from the description otherwise (US pay-transparency ranges such as "$213,000 - $320,000"). - When:
publishedAtand, where available,updatedAt(ISO 8601). - Description: the full job description as plain text (
description), optionally also as HTML (descriptionHtml). scrapedAttimestamp.
Use cases
- Lead generation from hiring signals: companies hiring SDRs need sales tools, companies hiring data engineers need data vendors. Run your target-account list daily and route new matching jobs to your CRM.
- Job boards and aggregators: pull hundreds of company boards into one normalised feed, with stable job ids for deduplication.
- Recruiting and talent intelligence: track open roles, departments and locations across competitors over time.
- Market research: salary ranges, remote share and hiring volume by company, team or country.
- AI agents: an agent can ask "what is Notion hiring for in engineering?" and get structured rows back through MCP.
Input example
| Field | Default | Description |
|---|---|---|
boards | Stripe's Greenhouse board | Board URLs, careers pages, company websites or bare slugs, one per line |
titleKeywords | - | Keep titles containing any of these (case-insensitive) |
excludeTitleKeywords | - | Drop titles containing any of these |
locationKeywords | - | Keep jobs whose location, city, country or workplace type contains any of these |
remoteOnly | false | Keep only jobs marked remote |
postedAfter | - | YYYY-MM-DD; jobs without a date are kept |
maxJobsPerBoard | 0 (all) | Cap per board after filtering |
includeDescription | true | Plain-text description. On SmartRecruiters, Workday, Workable and BambooHR this costs one extra request per job |
includeDescriptionHtml | false | Also keep the description HTML |
proxyConfiguration | Apify datacenter | No residential proxies needed |
Example: remote engineering jobs at three companies, posted this month:
{"boards": ["https://boards.greenhouse.io/stripe", "https://jobs.ashbyhq.com/notion", "https://jobs.lever.co/palantir"],"titleKeywords": ["engineer", "developer"],"locationKeywords": ["remote"],"postedAfter": "2026-10-01"}
Example: every open job at a list of companies you only know by website:
{"boards": ["https://stripe.com", "https://www.notion.com/careers", "blueground", "bunq.com"],"maxJobsPerBoard": 200,"includeDescription": false}
Output example
From a real run (Notion's Ashby board, description shortened):
{"id": "1fc309c8-da20-4ff2-84c7-8b863ece2b0a","title": "Software Engineer, Developer Platform","company": "Notion","ats": "ashby","url": "https://jobs.ashbyhq.com/notion/1fc309c8-da20-4ff2-84c7-8b863ece2b0a","applyUrl": "https://jobs.ashbyhq.com/notion/1fc309c8-da20-4ff2-84c7-8b863ece2b0a/application","location": "San Francisco, California","locations": ["San Francisco, California", "New York, New York"],"city": "San Francisco","region": "California","country": "United States","workplaceType": "hybrid","isRemote": true,"department": "Engineering","team": "Engineering","employmentType": "full-time","seniority": null,"salaryMin": 213000,"salaryMax": 320000,"salaryCurrency": "USD","salaryPeriod": null,"salaryText": "$213,000 - $320,000","publishedAt": "2026-08-24T14:44:49.699Z","updatedAt": null,"description": "WHO WE ARE\n\nNotion is the collaborative AI workspace where teams and agents think together ...","boardUrl": "https://jobs.ashbyhq.com/notion","scrapedAt": "2026-10-08T17:45:45.963Z"}
Fill rates on a 210-job test across all ten platforms: id, title, company, url, location, publishedAt and description 100%; country 85%; applyUrl 75%; employmentType 73%; workplaceType 61%; department 58%; city 52%; salary 21% (only postings that state a range). Fields a platform does not publish are null, never guessed.
Pricing
Pay per result: $1.00 per 1,000 jobs (one result = one job posting saved to the dataset).
- A company board with 300 open jobs = $0.30
- 500 company boards, 50,000 jobs = $50
Failed requests, boards that could not be found and duplicates are never charged. If you set a maximum cost per run, the scraper stops cleanly when it reaches it. Apify's free plan includes $5 of monthly platform credit, enough for thousands of jobs.
Integrations
- Make, Zapier and n8n: start runs and push new jobs to your CRM, Slack, Sheets or Airtable.
- Google Sheets: export the dataset straight into a spreadsheet, or refresh it on a schedule.
- Apify API: run the actor and fetch results over REST, or with the official JavaScript and Python clients.
- Webhooks: get notified when a run finishes and process the data right away.
- Schedules: run your company list daily and diff by
idto catch new postings. - MCP for AI agents: through the Apify MCP server (https://mcp.apify.com), Claude, ChatGPT, Cursor and other agents can call this jobs API directly and read the results.
Supported platforms
| Platform | What the input looks like | Description included | Notes |
|---|---|---|---|
| Greenhouse | boards.greenhouse.io/{company}, job-boards.greenhouse.io/{company} | yes | one request per board |
| Lever | jobs.lever.co/{company} | yes | structured salary when published |
| Ashby | jobs.ashbyhq.com/{company} | yes | structured salary when published |
| SmartRecruiters | jobs.smartrecruiters.com/{Company} | yes (1 extra request per job) | paged, 100 per page |
| Workday | {tenant}.wd{n}.myworkdayjobs.com/{site} | yes (1 extra request per job) | paged, 20 per page; relative dates ("Posted 3 Days Ago") converted, "30+ days" left null |
| Workable | apply.workable.com/{company} | yes (1 extra request per job) | one row per job, all locations merged |
| Recruitee | {company}.recruitee.com | yes | structured salary when published |
| Personio | {company}.jobs.personio.de or .com | yes | XML feed |
| Teamtailor | {company}.teamtailor.com | yes | paged; custom-domain career sites are detected from the page |
| BambooHR | {company}.bamboohr.com/careers | yes (1 extra request per job) |
Careers pages on company domains are supported when they embed or link to one of these boards (most do). When a page has no detectable board, the company name from the domain is tried on every platform.
Limits (read before large runs)
- Only these ten platforms. Companies using iCIMS, Taleo, SuccessFactors, Jobvite or a fully custom careers site are reported as unresolved in the run summary, not scraped.
- One board per input line. A company name that exists on several platforms (for instance an old, empty Lever board and a live Greenhouse one) resolves to the board that has open jobs.
- Workday boards can be large (thousands of jobs, 20 per page, plus one request per description). Use
maxJobsPerBoard, title filters, orincludeDescription: falsefor a quick count. - Company names come from the platform when it publishes them (Greenhouse, SmartRecruiters, Workable, Recruitee, Personio, Teamtailor); otherwise they are derived from the board slug (
notion-> "Notion"). - No applicant or personal data. Only public job postings.
FAQ
Is it legal to scrape job boards? This actor reads public job postings from the platforms' own public APIs and feeds, the same data shown on the companies' careers pages, and no personal data. You're responsible for using it in line with the platforms' terms and applicable law. This is not legal advice.
Why is it so reliable? No HTML parsing of rendered pages and no bot protection to fight: Greenhouse, Lever, Ashby, SmartRecruiters, Workday, Workable, Recruitee, Personio, Teamtailor and BambooHR all expose their boards as JSON or XML for exactly this purpose. Transient errors are retried with backoff on a fresh session.
How do I find a company's board URL? Open the company's careers page and look at the apply links, or just paste the careers page or the company website and let the actor detect it.
Can I get only new jobs?
Run on a schedule and compare id (stable per platform) with your previous dataset, or use postedAfter.
Does it need a browser, cookies or a login? No. Plain HTTPS requests to public endpoints only, which is why it's fast and cheap.
How it works (for developers)
Each input line is classified by URL shape into one of the ten platforms (or marked for sniffing). Careers pages are fetched once and scanned for embedded board links or scripts; company websites and bare names are probed on every platform in parallel, and the first board that lists jobs wins. Boards are then read through their public endpoints: Greenhouse boards-api, Lever api.lever.co/v0/postings, Ashby posting-api/job-board, SmartRecruiters api.smartrecruiters.com/v1/companies/{id}/postings, Workday wday/cxs/{tenant}/{site}/jobs, Workable's widget API, Recruitee api/offers, Personio's XML feed, Teamtailor's JSON Feed and BambooHR's careers list. Every platform's fields are mapped to one schema; HTML descriptions are converted to clean text; salary ranges come from structured fields or a conservative regex that ignores year ranges.
Run it locally:
npm installnpm test # parser tests on saved fixturesAPIFY_LOCAL_STORAGE_DIR=./storage node src/main.js # input in storage/key_value_stores/default/INPUT.json