ATS Job Scraper: Greenhouse, Lever, Ashby, Workable, Recruitee avatar

ATS Job Scraper: Greenhouse, Lever, Ashby, Workable, Recruitee

Pricing

from $1.00 / 1,000 job returneds

Go to Apify Store
ATS Job Scraper: Greenhouse, Lever, Ashby, Workable, Recruitee

ATS Job Scraper: Greenhouse, Lever, Ashby, Workable, Recruitee

Returns open jobs from career boards on Greenhouse, Lever, Ashby, Workable and Recruitee in one normalized JSON format: title, department, location, country, remote/hybrid/onsite, employment type, salary range, posted date, job and apply URLs, plain-text description. Filter by title keywords.

Pricing

from $1.00 / 1,000 job returneds

Rating

0.0

(0)

Developer

OpenQuarry

OpenQuarry

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

16 days ago

Last modified

Categories

Share

Returns the open jobs on companies' career boards hosted by Greenhouse, Lever, Ashby, Workable and Recruitee, all in one normalized JSON format. Each job comes with its title, department, location, country, remote/hybrid/onsite status, employment type, salary range, posted date, job and apply URLs, and the description as plain text. Give it a list of board URLs, optionally with title keywords. It reads each ATS's public job-board API, so you don't need a login, proxy or API key.

What you get

You get one dataset item per job. All 22 fields are present on every item, in the same order. A field is null (or []) when the ATS doesn't provide it.

FieldTypeDescription
atsstringgreenhouse, lever, ashby, workable or recruitee
companySlugstringCompany identifier from the board URL, e.g. stripe
companyNamestring or nullCompany name as the employer publishes it
jobIdstringThe ATS's own ID for the job
titlestringJob title as published
departmentstring or nullDepartment or team
locationstring or nullMain location as published, e.g. New York, NY or Remote (US)
allLocationsstring[]Every location listed for the job, main location first
countryCodestring or nullISO 3166-1 alpha-2 code of the main location, e.g. US
workplaceTypestring or nullremote, hybrid or onsite
employmentTypestring or nullfull_time, part_time, contract, internship or temporary
salaryMinnumber or nullLowest base pay in the published range
salaryMaxnumber or nullHighest base pay in the published range
salaryCurrencystring or nullCurrency of the pay range, e.g. USD
salaryPeriodstring or nullyear, month, week, day or hour
salaryTextstring or nullThe employer's own pay summary, e.g. $211.4K – $290.6K • Offers Equity
postedAtstring or nullWhen the job was published (ISO 8601, UTC)
updatedAtstring or nullWhen the job was last updated (ISO 8601, UTC)
jobUrlstringPublic job posting page
applyUrlstringApplication page (same as jobUrl when the ATS has no separate one)
descriptionTextstring or nullFull job description as plain text; null when includeDescription is off
sourceUrlstringThe input URL this job came from

workplaceType, employmentType and salaryPeriod take their values only from the ATS's own fields. They are never guessed from the description text, so you can filter on them reliably.

Which fields each ATS fills

Each ATS's public API publishes different fields. This table shows which fields can be filled for each one. Salary appears only when the employer publishes it.

FieldGreenhouseLeverAshbyWorkableRecruitee
companyName✓––✓✓
countryCode–✓✓✓✓
workplaceType–✓✓remote only✓
employmentType–✓✓✓✓
Salary range–✓✓–✓
salaryText–✓✓––
updatedAt✓–––✓

Input

{
"urls": [
"https://boards.greenhouse.io/stripe",
"https://jobs.lever.co/palantir",
"https://jobs.ashbyhq.com/ramp"
],
"titleKeywords": ["engineer", "data scientist"],
"maxJobsPerCompany": 100,
"includeDescription": true
}
  • urls (required): career board URLs. A job URL on the board works too, and so does the board's API URL. These formats are recognized:

    ATSURL formats
    Greenhouseboards.greenhouse.io/{company}, job-boards.greenhouse.io/{company}, boards.greenhouse.io/embed/job_board?for={company}
    Leverjobs.lever.co/{company}, jobs.eu.lever.co/{company} (EU accounts)
    Ashbyjobs.ashbyhq.com/{company}
    Workableapply.workable.com/{company}, {company}.workable.com
    Recruitee{company}.recruitee.com

    https:// is optional. If the same board appears twice, it's fetched once.

  • titleKeywords: return only jobs whose title contains at least one of these words or phrases. Matching ignores case and works at word starts, so engineer matches "Engineering Manager", but AI doesn't match "Retail". Leave it empty to get every job.

  • maxJobsPerCompany: the most jobs returned for each board, counted after the title filter (default 100; 0 means no limit).

  • includeDescription: include the full description in descriptionText (default true). Turn it off when you only need titles, locations and links. Results get much smaller.

Sample output

The descriptions are shortened here.

[
{
"ats": "ashby",
"companySlug": "ramp",
"companyName": null,
"jobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
"title": "Security Engineer, Cloud",
"department": "Engineering",
"location": "New York, NY (HQ)",
"allLocations": ["New York, NY (HQ)", "Remote (Canada)", "Remote (US)", "Miami, FL"],
"countryCode": "US",
"workplaceType": "hybrid",
"employmentType": "full_time",
"salaryMin": 211400,
"salaryMax": 290600,
"salaryCurrency": "USD",
"salaryPeriod": "year",
"salaryText": "$211.4K – $290.6K • Offers Equity",
"postedAt": "2026-04-07T17:12:35.753Z",
"updatedAt": null,
"jobUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245",
"applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application",
"descriptionText": "ABOUT RAMP\n\nRamp is building the smart infrastructure for finance teams...",
"sourceUrl": "https://jobs.ashbyhq.com/ramp"
},
{
"ats": "greenhouse",
"companySlug": "stripe",
"companyName": "Stripe",
"jobId": "8172503",
"title": "Abuse Research Engineer",
"department": "8611 Security Analytics",
"location": "Remote from the US",
"allLocations": ["Remote from the US"],
"countryCode": null,
"workplaceType": null,
"employmentType": null,
"salaryMin": null,
"salaryMax": null,
"salaryCurrency": null,
"salaryPeriod": null,
"salaryText": null,
"postedAt": "2026-09-09T14:52:09.000Z",
"updatedAt": "2026-09-25T20:45:00.000Z",
"jobUrl": "https://stripe.com/jobs/search?gh_jid=8172503",
"applyUrl": "https://stripe.com/jobs/search?gh_jid=8172503",
"descriptionText": "Who we are\n\nAbout Stripe\n\nStripe is a financial infrastructure platform for businesses...",
"sourceUrl": "https://boards.greenhouse.io/stripe"
}
]

Use cases

  • Job aggregators and niche job boards: pull fresh postings from a list of target employers in one format, whichever ATS each one uses.
  • Hiring signals for sales and investors: track which companies are hiring, for which teams and where, as a growth signal.
  • Salary research: collect published pay ranges by title, location and company.
  • Recruiting and job search: watch a shortlist of companies for new roles that match your keywords. Run it on a schedule and compare jobIds between runs.
  • AI agents: one call returns structured, filterable jobs from many companies, with no HTML to parse.

How it handles problems

The run never fails because one board is broken. Jobs from the other boards are still returned, and the run's status message lists every input that produced no jobs, with the reason:

  • board not found (HTTP 404), check the company name in the URL: the company slug is wrong, or the company has left that ATS.
  • not a Greenhouse, Lever, Ashby, Workable or Recruitee board URL: the input isn't in one of the formats above.
  • no open jobs on this board: the board exists but lists no jobs right now.
  • no job titles matched titleKeywords: the board has jobs, but none match your keywords.

Network errors, rate limits (HTTP 429) and server errors are retried twice with backoff, and each request times out after 30 seconds.

Limits

  • Custom career domains aren't supported. stripe.com/jobs won't work, but the company's ATS board (boards.greenhouse.io/stripe) will. To find it, open any job on the company's careers page and look for a greenhouse.io, lever.co, ashbyhq.com, workable.com or recruitee.com link.
  • The Actor doesn't look up companies by name. You need each company's board URL.
  • Greenhouse publishes less. Its public API has no pay, country, remote status or employment type, so those fields are null for Greenhouse jobs. The location text often says "Remote" anyway.
  • Only jobs the employer shows publicly are returned. Unlisted Ashby jobs are skipped, and pay is hidden when the employer hides it on its own board.
  • No personal data is added. The Actor never extracts or adds contact names or emails. Recruitee's per-job reply inbox and screening questions are dropped. Descriptions are passed through as published.
  • Other ATSs aren't supported: SmartRecruiters, Workday, BambooHR, Personio, Teamtailor and others.
  • Big boards: some employers list 1,000+ jobs. The default limit of 100 per company keeps runs to a few seconds. With no limit, a run over several large boards takes longer and costs more.

Pricing

Pay per result: $1.00 per 1,000 jobs returned (all 718 jobs on Stripe's board cost about $0.72). Apify adds a small start fee of $0.00005 per run. Boards that return no jobs cost you nothing beyond that start fee. To cap spending, use maxJobsPerCompany, titleKeywords or the run's maximum cost setting. The Actor stops cleanly when your limit is reached.

Changelog

  • 0.1 (2026-10): First release. Supports Greenhouse, Lever, Ashby, Workable and Recruitee.