Career Site Jobs Scraper: Greenhouse, Lever, Workday + 7 ATS avatar

Career Site Jobs Scraper: Greenhouse, Lever, Workday + 7 ATS

Pricing

from $0.50 / 1,000 jobs

Go to Apify Store
Career Site Jobs Scraper: Greenhouse, Lever, Workday + 7 ATS

Career Site Jobs Scraper: Greenhouse, Lever, Workday + 7 ATS

Live jobs from company career sites on Greenhouse, Lever, Ashby, Workable, Workday, Recruitee, Personio, Teamtailor, BambooHR and Breezy. Paste URLs, domains or names; ATS auto-detected. One clean schema, salaries, filters that work, new/closed job alerts. No proxy, no login.

Pricing

from $0.50 / 1,000 jobs

Rating

0.0

(0)

Developer

Nat | Data Tools

Nat | Data Tools

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Get every open job from the companies you choose, live from their own career sites, as clean JSON, CSV or Excel. Works with Greenhouse, Lever, Ashby, Workable, Workday, Recruitee, Personio, Teamtailor, BambooHR and Breezy HR. Paste job-board links, websites or just company names: the job board is detected for you.

One schema for all of them: title, company, city / region / country, remote or hybrid, department, employment type, salary range when published, posted date, description, apply link. Filters run before billing, and a scheduled run can return only new, changed and closed jobs.

$0.80 per 1,000 jobs. No start fee, no proxy cost, no compute bill on top. Not-found companies, failed boards and closed-job alerts are free.

Why this career-site jobs scraper

This ActorJob-database actors (e.g. fantastic-jobs career-site API)Other live ATS scrapers
DataLive from the company's ATS at run timePre-indexed database, 1–3 h delay, only companies they crawlLive
CompaniesAny company on 10 ATS: URL, ats:slug, website or nameSearch by keyword across their indexUsually URL or slug only
Price$0.80 / 1,000 jobs, no start fee$12 / 1,000 + $0.01 start (FREE tier)$1.15–4 / 1,000, often + start fee
FiltersTitle, keywords, location (country / state / city / remote / EMEA), workplace, employment type, department, posted-since, has-salary — applied before billing, unit-testedOpen issues: "Filters are no longer working", "identical static results regardless of input"Title and location text at most
LocationParsed into city, region, ISO country for every location of a jobDerived by AIRaw text
SalaryATS salary field (Ashby, Greenhouse, Lever, Recruitee) plus pay ranges written in the description, with salary.sourceAI-extractedRarely
New / closed jobsBuilt in, closed alerts freeExpired jobs are a separate $20/month actorSome
Hiring signalsOne row per company: open jobs, posted in 7 / 30 days, remote share, top departments and countriesLinkedIn enrichmentRarely
DuplicatesDeduplicated in-run before billing; optional collapse of re-posts"Duplicates" complaintsVaries
FailuresPer-company status row (not-found, not-supported, robots-disallowed, error); the run fails loudly if every board errored—Silent empties

What you can do

  • Recruiters and sourcers: watch a list of target companies and get only the new roles each morning.
  • Sales and RevOps: use hiring as a buying signal. The company row tells you who is hiring engineers, how fast, and where.
  • Job boards and newsletters: pull fresh jobs from employers' own boards with apply links, and expire the ones that close.
  • Market research: salaries, remote share and team growth across a peer group.
  • AI agents: call it from Claude, ChatGPT or Cursor through Apify's AI integrations; inputs like "remote", "Germany", "7d", "full time" just work.
  • Your own stack: run it from the Apify API, the Python or JavaScript client, Make, Zapier, n8n, Google Sheets, Slack, webhooks or a schedule; export JSON, CSV or Excel.

Quick start

1. All jobs from a few companies

{ "companies": ["https://boards.greenhouse.io/stripe", "lever:palantir", "jobs.ashbyhq.com/ashby"] }

2. Mix of URLs, websites and names, with filters

{
"companies": ["notion.so", "Hugging Face", "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite", "bunq.recruitee.com"],
"titleKeywords": ["engineer", "developer"],
"titleExcludes": ["intern"],
"locations": ["Germany", "Netherlands", "remote"],
"postedWithin": "30d"
}

3. Remote jobs with a published salary

{ "companies": ["ashby:ashby", "greenhouse:gitlab"], "workplaceTypes": ["remote"], "hasSalary": true, "descriptionFormat": "none" }

4. Daily monitoring: only new, changed and closed jobs

{
"companies": ["greenhouse:stripe", "lever:palantir", "ashby:openai"],
"titleKeywords": ["engineer"],
"onlyNew": true,
"monitorName": "eng-watch",
"baselineMode": "silent"
}

Save it as a task, schedule it daily and connect Slack, email, Google Sheets or a webhook. Each run returns new jobs (changeType: "new"), jobs whose title, location, type or salary changed ("changed"), and a free "closed" row for every job that disappeared. baselineMode: "silent" makes the first run only remember what is open now instead of delivering it.

Company input formats

You pasteWhat happens
https://boards.greenhouse.io/stripe, job-boards.greenhouse.io/embed/job_board?for=stripeGreenhouse board stripe
jobs.lever.co/palantir, jobs.eu.lever.co/acmeLever (US or EU instance)
jobs.ashbyhq.com/openaiAshby
apply.workable.com/huggingfaceWorkable
https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite (any job link works too)Workday tenant + site
bunq.recruitee.com, acme.jobs.personio.de, acme.teamtailor.com, acme.bamboohr.com, acme.breezy.hrthat ATS
greenhouse:stripe, lever:palantir, ashby:openai, gh:airbnbthat ATS and slug, no detection needed
notion.so, https://acme.com/careersThe page (and /careers, /jobs, careers. / jobs. subdomains) is scanned for a job-board link
Hugging FaceSlug guesses (huggingface, hugging-face) are tried on every list-based ATS; the board with the most jobs wins and the others are listed in alternatives

A name guess can hit a different company with the same slug; the company row shows detectedBy: "name-guess" so you can check, and a URL is always exact.

Output

Job row

{
"type": "job",
"id": "ashby:ashby:390e266b-4b6c-4490-ad74-05ff5e0bb36a",
"jobId": "390e266b-4b6c-4490-ad74-05ff5e0bb36a",
"title": "Product Manager, Onboarding and Growth",
"company": "Ashby",
"companySlug": "ashby",
"ats": "ashby",
"url": "https://jobs.ashbyhq.com/ashby/390e266b-4b6c-4490-ad74-05ff5e0bb36a",
"applyUrl": "https://jobs.ashbyhq.com/ashby/390e266b-4b6c-4490-ad74-05ff5e0bb36a/application",
"location": "Remote - US; Remote - Canada",
"city": null, "region": null, "regionCode": null,
"country": "United States", "countryCode": "US", "countryCodes": ["US", "CA"],
"locations": [
{ "raw": "Remote - US", "city": null, "region": null, "regionCode": null, "country": "United States", "countryCode": "US", "macroRegion": null, "isRemote": true },
{ "raw": "Remote - Canada", "city": null, "region": null, "regionCode": null, "country": "Canada", "countryCode": "CA", "macroRegion": null, "isRemote": true }
],
"workplaceType": "remote",
"isRemote": true,
"department": "Product",
"team": "Product",
"employmentType": "full-time",
"employmentTypeRaw": "FullTime",
"seniority": null,
"salary": { "min": 180000, "max": 260000, "currency": "USD", "period": "year", "text": "$180K - $260K", "source": "ats" },
"postedAt": "2026-10-16T00:42:17.137Z",
"postedAtApproximate": false,
"updatedAt": null,
"closesAt": null,
"requisitionId": null,
"descriptionText": "…",
"boardUrl": "https://jobs.ashbyhq.com/ashby",
"input": "jobs.ashbyhq.com/ashby",
"scrapedAt": "2026-10-17T12:00:00.000Z"
}

employmentType is one of full-time, part-time, contract, internship, temporary, apprenticeship, volunteer, other (the ATS's own wording stays in employmentTypeRaw). workplaceType is remote, hybrid, onsite or null when the board does not say. salary.source is ats (the ATS salary field) or description (a pay range written in the text, e.g. US pay-transparency ranges). In monitoring mode rows also carry changeType (new / changed) and firstSeenAt.

Closed-job row (monitoring, free)

{ "type": "job", "changeType": "closed", "id": "greenhouse:stripe:8172487", "title": "Abuse Investigator", "url": "https://stripe.com/jobs/search?gh_jid=8172487", "company": "Stripe", "ats": "greenhouse", "firstSeenAt": "2026-10-10T06:00:00.000Z", "closedDetectedAt": "2026-10-17T06:00:00.000Z" }

Company row (free)

{
"type": "company",
"input": "Hugging Face",
"company": "Hugging Face",
"ats": "workable",
"slug": "huggingface",
"boardUrl": "https://apply.workable.com/huggingface/",
"detectedBy": "name-guess",
"alternatives": [{ "ats": "workable", "slug": "hugging-face", "jobs": 0 }],
"status": "ok",
"totalJobs": 6, "matchedJobs": 5, "deliveredJobs": 5, "newJobs": 0, "changedJobs": 0, "closedJobs": 0,
"listingComplete": true,
"signals": {
"openJobs": 6, "postedLast7Days": 0, "postedLast30Days": 2, "remoteJobs": 6, "hybridJobs": 0, "jobsWithSalary": 0,
"topDepartments": [{ "name": "Open Source", "count": 2 }, { "name": "Product", "count": 2 }],
"topCountries": [{ "name": "FR", "count": 3 }, { "name": "US", "count": 3 }]
}
}

status: ok, empty (board exists, no open jobs), not-found, no-board (nothing detected for a name or website), not-supported, robots-disallowed, invalid-input, or an error code. Use the Jobs and Companies views in the Output tab.

Pricing

Pay per event. Platform usage is included: no start fee, no proxy or compute bill on top.

EventWhat it isPrice
JobOne job row delivered (after filters and dedup)$0.80 / 1,000 ($0.0008)
Monitor checkMonitoring mode only: a company checked that had nothing new or changed$1.00 / 1,000 ($0.001)

Lower job rates apply automatically on higher Apify plans (down to $0.50 / 1,000); the monitor check is $0.001 on every plan. Never charged: company status rows, closed-job rows, companies that are not found, unsupported or failed, jobs removed by your filters, and duplicates.

Examples: all 731 Stripe jobs = $0.58. 200 companies × 25 matching jobs = 5,000 jobs = $4.00. Daily monitoring of 50 companies with ~5 new jobs a day in total ≈ 5 × $0.0008 + 45 × $0.001 ≈ $0.05 a day, about $1.50 a month.

The Actor checks your run's maximum cost before each company and stops cleanly when it is reached.

Free Apify plan: up to 300 jobs from up to 25 companies per run (a limit set by the developer, not by Apify). Any paid plan removes it.

Good to know

  • You bring the companies. This is not a search engine over all employers; it reads the boards you name. For a list of employers on an ATS, start from their career pages.
  • Supported ATS: Greenhouse, Lever, Ashby, Workable, Workday, Recruitee, Personio, Teamtailor, BambooHR, Breezy HR. Not supported: SmartRecruiters (its API's robots.txt disallows all crawlers except LinkedIn's), iCIMS, Taleo, Jobvite, SuccessFactors, JazzHR. These inputs get a free not-supported row.
  • Workday: one search returns at most 2,000 jobs, so very large tenants are capped there; title keywords are sent as the site search, which narrows big boards. Each delivered Workday job needs one extra request for its description and exact date, so Workday is slower (about 1 s per 20 listed jobs). In monitoring mode, already-known Workday jobs are not re-fetched, so their changes are not detected (new and closed jobs are).
  • Breezy HR gives no descriptions in its public feed; descriptionText stays empty for Breezy.
  • Dates: Workday list pages only say "Posted 3 Days Ago"; the exact date comes from the detail call. Jobs whose board gives no date are dropped when you set a posted-since filter.
  • Closed jobs are only reported when the whole board was listed (not a keyword-narrowed Workday search), so a filter never fakes a closure.
  • Two-letter codes in Locations are countries (CA = Canada, IN = India). Write California / US-CA for US states.
  • Proxies are not needed and not used by default. robots.txt is read for every host and honoured, including Crawl-delay.

This Actor reads public job postings through the public job-board endpoints that the ATS vendors provide so employers can embed and syndicate their jobs (Greenhouse Job Board API, Lever Postings API, Ashby posting API, Workable widget, Recruitee careers API, Personio XML feed, Teamtailor RSS, BambooHR and Breezy career-site JSON, Workday career-site JSON). It does not log in, uses no accounts or API keys, respects each host's robots.txt (which is why SmartRecruiters is excluded), paces requests per host and does not collect personal data: it never extracts emails or phone numbers, and drops the application mailbox address Recruitee includes. Job descriptions are the employers' copyrighted text; use them for search, analysis and linking back, and check with a lawyer before republishing them in full.

FAQ

How is this different from the Career Site Job Listing API? That actor queries a pre-built database by keyword. This one reads the employers you name live, so new jobs appear immediately, any company on a supported ATS works, and the price is about 15× lower. If you need to discover employers by keyword, use a database; if you know your target companies, use this.

Can I paste my old input? The main filters of fantastic-jobs/career-site-job-listing-api work under their own names: titleSearch, titleExclusionSearch, locationSearch, locationExclusionSearch, descriptionSearch, descriptionExclusionSearch, organizationSearch and domainFilter (used as the companies to read), aiWorkArrangementFilter, aiEmploymentTypeFilter, hasSalary, datePostedAfter, descriptionType and limit.

Their fieldOur field
title, organization, urltitle, company, url
date_posted, date_modified, date_valid_throughpostedAt, updatedAt, closesAt
locations_derived, cities_derived, countries_derivedlocations[], city, countryCodes
employment_type, ai_work_arrangementemploymentType, workplaceType
ai_salary_min_value / max / currency / unit_textsalary.min / max / currency / period
description_text, description_html, sourcedescriptionText, descriptionHtml, ats

Can I use it from Claude, ChatGPT or Cursor? Yes, through Apify's AI integrations.

A company I need is missing or returned no-board. Paste the career-page URL instead of the name. If its ATS is not supported, open an issue with the URL; new ATS are added based on requests.

What happens when an ATS changes something? Every company gets a status row and the run fails loudly when every board errored, so breakages are visible and fixed fast. Issues are answered within 24 hours.