VOOZH about

URL: https://apify.com/dami_studio/multi-ats-jobs-scraper

⇱ Multi-ATS Jobs Scraper - Greenhouse, Lever, Ashby Β· Apify


πŸ‘ Multi-ATS Jobs Scraper (Greenhouse, Lever, Ashby) avatar

Multi-ATS Jobs Scraper (Greenhouse, Lever, Ashby)

Pricing

$3.00 / 1,000 job returneds

Go to Apify Store

Multi-ATS Jobs Scraper (Greenhouse, Lever, Ashby)

Scrape open job listings from the three big ATS job boards β€” Greenhouse, Lever and Ashby β€” straight from their public JSON APIs. No key, no login. Pass companies as "ats:token" (e.g. greenhouse:stripe) and get every posting normalized to one clean schema.

Pricing

$3.00 / 1,000 job returneds

Rating

5.0

(1)

Developer

πŸ‘ Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

1

Monthly active users

3 days ago

Last modified

Share

Multi-ATS Jobs Scraper (Greenhouse Β· Lever Β· Ashby)

Scrape open job listings straight from the public JSON APIs of the three most common applicant-tracking systems β€” Greenhouse, Lever and Ashby. No API key, no login, no anti-bot to fight. Point it at a list of company boards and get every posting back in one normalized schema.

Thousands of companies post their jobs through exactly these three boards. Instead of writing a scraper per company, give this actor a list like ["greenhouse:stripe","lever:spotify","ashby:ramp"] and it figures out the right endpoint for each and merges the results.

Input

FieldNotes
companiesArray of "ats:token" strings. ats is greenhouse, lever, or ashby; token is the company's board slug. e.g. greenhouse:stripe, lever:spotify, ashby:openai.
ats + companyConvenience pair for a single board (e.g. ats: "greenhouse", company: "stripe"). Ignored when companies is set.
maxItemsMax postings per company. 0 (default) = all open postings.
proxyConfigurationOptional, off by default. These public APIs have no anti-bot, so no proxy is needed. Only enable one if you hit IP-based rate limits across many boards.

Where do I find the token?

It's the slug in the public careers URL:

  • Greenhouse β†’ boards.greenhouse.io/<token> (also <token>.greenhouse.io)
  • Lever β†’ jobs.lever.co/<company>
  • Ashby β†’ jobs.ashbyhq.com/<name>

Output

One dataset row per job posting, deduped by url:

{
"ok":true,
"ats":"greenhouse",
"company":"stripe",
"title":"Account Executive, AI Sales",
"location":"San Francisco, CA",
"department":"1650 AI GTM Strategy & Solutions",
"employmentType":"FullTime",
"url":"https://stripe.com/jobs/search?gh_jid=7964697",
"postedAt":"2026-06-05T15:44:04-04:00",
"description":"Who we are… (plain text, HTML stripped)",
"salary":"$211.4K – $290.6K β€’ Offers Equity"
}

Field availability differs by ATS, so several fields can be null even on a successful row:

FieldGreenhouseLeverAshby
employmentTypenull (not exposed)βœ“ (commitment)βœ“
salarynull (not exposed)best-effort (often null)βœ“ (structured, may be null)
departmentβœ“βœ“ (dept / team)βœ“ (dept / team)
location / postedAt / urlβœ“ when present, else nullβœ“ when present, else nullβœ“ when present, else null

title and company are always present on a success row. Every other field above is null when the board doesn't supply it β€” this is honest data, not a failed scrape.

Greenhouse job descriptions come HTML-entity-encoded; the actor decodes and strips them to clean plain text.

Diagnostic rows (ok:false)

When a board has no open postings, uses a wrong/retired slug, or hits a network/blocked error, the actor pushes a single ok:false diagnostic row instead of job rows, for example:

{"ok":false,"errorCode":"NO_RESULTS","error":"The request succeeded but returned no results for this input.","ats":"greenhouse","company":"acme","note":"No open postings for greenhouse:acme."}

An ok:false row means that one board had nothing to return β€” not that the run failed. These rows are never charged. Filter on ok:true to get only billable job postings. Empty input produces an ok:false row with errorCode: "BAD_INPUT" instead of crashing the run.

Billing & empty boards

Billed per job posting returned (job), and only for genuine ok:true rows. A board with no open postings (or a wrong/retired slug) produces a single ok:false diagnostic row explaining why β€” and is not charged. Network/blocked errors and empty/invalid input likewise return a coded ok:false diagnostic row instead of failing the whole run, and are never charged.

Example

{
"companies":["greenhouse:stripe","greenhouse:airbnb","lever:spotify","ashby:ramp","ashby:openai"],
"maxItems":0
}

You might also like

ATS Jobs Scraper β€” Greenhouse, Lever & Ashby

mukeshrana90/ats-jobs-scraper

Pull open job postings straight from companies' public ATS boards (Greenhouse, Lever, Ashby). Full descriptions, skills, normalized salary, cross-run dedupe and webhook delivery. No browser, no proxy.

Multi-ATS Jobs Scraper (Greenhouse, Lever, Ashby)

alwaysprimedev/multi-ats-jobs-scraper

Scrape job postings from Greenhouse, Lever, and Ashby into one unified, structured dataset. No login. Salary, location, department, employment type β€” normalized across all three ATS. Per-company change-detection between runs.

23

Multi-ATS Jobs Scraper (Greenhouse, Lever, Ashby)

devilscrapes/multi-ats-jobs-scraper

Scrape job postings from Greenhouse, Lever, and Ashby in one run. Pass a list of company slugs and get a normalised dataset β€” title, location, department, URL, and description β€” across all three ATS platforms.

Multi-ATS Job Scraper β€” Greenhouse, Lever, Ashby, Workday

scrapesage/multi-ats-job-scraper

Scrape jobs from the 5 biggest ATS platforms in one dataset β€” Greenhouse, Lever, Ashby, SmartRecruiters & Workday. Full descriptions, salaries, locations, departments & apply links. Auto-detects the ATS from a careers URL or company name. Monitor mode emits only new jobs.