Multi-ATS Jobs API: Greenhouse, Lever, Ashby and more avatar

Multi-ATS Jobs API: Greenhouse, Lever, Ashby and more

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Multi-ATS Jobs API: Greenhouse, Lever, Ashby and more

Multi-ATS Jobs API: Greenhouse, Lever, Ashby and more

Scrape job postings from 6 ATSs in one run: Greenhouse, Lever, Ashby, Workable, SmartRecruiters and Recruitee. One normalized schema, official public APIs, no proxy or browser. Salaries, locations, remote flags, apply links and descriptions. $0.001 per job.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Joe Simo

Joe Simo

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

11 hours ago

Last modified

Categories

Share

Multi-ATS Jobs API: Greenhouse, Lever, Ashby, Workable, SmartRecruiters and Recruitee jobs in one schema

Get every open job from company career boards hosted on Greenhouse, Lever, Ashby, Workable, SmartRecruiters and Recruitee, in one clean, normalized format. Paste company slugs or careers page URLs, and get titles, departments, locations, remote flags, employment types, salary ranges (when published), posting dates, apply links and full descriptions.

It reads the official public job board APIs that these ATS vendors publish for embedding job lists on career sites. There is no browser, no proxy and no login, so runs are fast, cheap and reliable.

$0.001 per job. No proxy costs or other extras added on top.

What you can use it for

  • Job boards and aggregators: keep listings fresh from hundreds of employers with one schema instead of six.
  • Recruiting and sales intelligence: see who is hiring, for which teams and where. Hiring is a strong buying signal.
  • Market and salary research: compare roles, locations and published pay ranges across companies.
  • Job alerts: schedule a daily run with "Posted within the last N days" and get only new jobs.
  • AI agents and RAG: clean plain-text descriptions plus stable IDs, ready for embeddings.

Why this Actor

This ActorTypical single-ATS scrapers
ATSs per run6 in one run, mixed freely1 per Actor
Output schemaOne normalized schema for all ATSsDifferent fields per ATS
Price$0.001 per job$0.002 to $0.004 per job, sometimes plus extras
Proxy or browserNone neededOften a browser or proxy
Unknown slugsWarn and continue, listed in the run summaryOften fail the whole run
RetriesAutomatic backoff on 429, 5xx and timeoutsVaries
SpeedAbout 9,300 jobs from 25 companies in about 2.5 minutes at 256 MBVaries

Supported ATSs and input formats

Put one company per line in Companies. Mix any of these forms in one run:

ATSats:slug formBoard URL forms that are auto-detected
Greenhousegreenhouse:stripe (or gh:stripe)boards.greenhouse.io/stripe, job-boards.greenhouse.io/stripe, embed URLs with ?for=stripe
Leverlever:palantir, lever-eu:lever for EU-hosted boardsjobs.lever.co/palantir, jobs.eu.lever.co/...
Ashbyashby:rampjobs.ashbyhq.com/ramp
Workableworkable:huggingfaceapply.workable.com/huggingface, huggingface.workable.com
SmartRecruiterssmartrecruiters:BoschGroup (or sr:BoschGroup)jobs.smartrecruiters.com/BoschGroup, careers.smartrecruiters.com/BoschGroup
Recruiteerecruitee:bunqbunq.recruitee.com

You can also paste:

  • A company's own careers page URL (for example https://www.example.com/careers). The Actor reads that page once and looks for an embedded Greenhouse, Lever, Ashby, Workable, SmartRecruiters or Recruitee board.
  • A bare slug such as notion. With Auto-detect on (default), the Actor tries each ATS in turn and uses the first board that has jobs.

How to find a slug: open the company's job board and copy the part after the domain. https://jobs.lever.co/palantir means lever:palantir. SmartRecruiters company IDs are case sensitive (BoschGroup, not boschgroup).

Input example

{
"companies": [
"greenhouse:discord",
"lever:zoox",
"https://jobs.ashbyhq.com/linear",
"workable:huggingface",
"smartrecruiters:Wix2",
"recruitee:bunq"
],
"titleKeywords": ["engineer", "developer"],
"locationContains": ["Remote", "United States"],
"postedWithinDays": 30,
"maxJobsPerCompany": 0,
"includeDescription": true,
"descriptionFormat": "text"
}

Filters

OptionWhat it does
Title keywordsKeep jobs whose title contains any keyword. Short keywords like AI or QA match whole words only.
Exclude title keywordsDrop jobs whose title contains any of these words.
Location containsKeep jobs whose location (any of them) or country contains one of these strings.
Remote jobs onlyKeep jobs marked remote by the ATS or with "remote" in the location.
Department or team containsMatch against both department and team.
Posted within the last N daysUses the publish date, or the last update date when the ATS has no publish date.
Max jobs per company / Max jobs in totalHard caps. 0 means no limit.
Include job descriptionsTurn off for a much smaller dataset and faster SmartRecruiters runs.

Filters are applied before anything is saved, so you only pay for jobs that match.

Output example

Each job is one dataset item:

{
"id": "ashby:linear:3f6f2b1e-0d2a-4f0e-9a43-1c1f7b8f9a10",
"ats": "ashby",
"company": "Linear",
"companySlug": "linear",
"title": "Senior Software Engineer, Product",
"department": "Engineering",
"team": "Product Engineering",
"location": "North America",
"locations": ["North America", "Europe"],
"country": null,
"remote": true,
"workplaceType": "remote",
"employmentType": "FULL_TIME",
"employmentTypeRaw": "FullTime",
"salaryMin": 180000,
"salaryMax": 230000,
"salaryCurrency": "USD",
"salaryInterval": "YEAR",
"salaryText": "$180K - $230K",
"postedAt": "2026-10-14T16:02:11.000Z",
"updatedAt": "2026-10-20T09:12:40.000Z",
"applyUrl": "https://jobs.ashbyhq.com/linear/3f6f2b1e-0d2a-4f0e-9a43-1c1f7b8f9a10/application",
"jobUrl": "https://jobs.ashbyhq.com/linear/3f6f2b1e-0d2a-4f0e-9a43-1c1f7b8f9a10",
"descriptionText": "About the role ...",
"sourceId": "3f6f2b1e-0d2a-4f0e-9a43-1c1f7b8f9a10",
"sourceUrl": "https://api.ashbyhq.com/posting-api/job-board/linear?includeCompensation=true",
"scrapedAt": "2026-10-28T12:00:00.000Z"
}

(Values above are illustrative.)

Field reference

FieldNotes
idStable unique ID ats:companySlug:sourceId. Use it to dedupe across runs.
ats, company, companySlugSource system, company name (or slug when the ATS has no name), and the slug used.
title, department, teamAs published. team holds the sub-team or job function when the ATS has one.
location, locations, countryPrimary location, all published locations, and country when given.
remote, workplaceTyperemote is always true or false. workplaceType is remote, hybrid, onsite or null.
employmentTypeOne of FULL_TIME, PART_TIME, CONTRACT, TEMPORARY, INTERNSHIP, VOLUNTEER, OTHER, or null. The original value is in employmentTypeRaw.
salaryMin, salaryMax, salaryCurrency, salaryIntervalOnly when the employer publishes structured pay. Interval is YEAR, MONTH, WEEK, DAY or HOUR. Nothing is guessed.
postedAt, updatedAtISO 8601 in UTC.
applyUrl, jobUrlDirect apply link and public posting page.
descriptionText, descriptionHtmlPresent when descriptions are on, in the format you choose.
sourceId, sourceUrl, scrapedAtOriginal job ID, the public API endpoint used, and the fetch time.

The dataset has ready-made Overview, Salaries and Details table views, and every item is validated against the dataset schema before it is saved.

Run summary (key-value store OUTPUT)

Every run also saves a summary record with one entry per company: status (ok, empty, not_found, invalid_input, not_detected, error or skipped), jobs found, matched and saved, the API URL used, the error message if any and the duration. Use it to spot companies that moved to another ATS.

Pricing

This Actor uses pay per event: $0.001 per job saved to the dataset ($1 per 1,000 jobs). You are not charged for jobs removed by your filters or for companies that are not found. The only other charge is the tiny platform run-start fee that every pay-per-event Actor has.

Examples:

RunJobsPrice
10 startups, engineering roles onlyabout 150about $0.15
50 companies, all jobsabout 5,000about $5
Daily alert, 200 companies, posted within 1 dayabout 300 per dayabout $0.30 per day

Set Maximum cost per run in the run options to cap spending. The Actor saves exactly as many jobs as the cap allows, stops cleanly and still writes the run summary.

Limits and good to know

  • Only public job boards are read. Companies that use another ATS, or that hide their board, return not_found or not_detected in the summary.
  • Greenhouse EU boards (hosted on job-boards.eu.greenhouse.io) are not supported yet because no public EU job board API host was reachable when this Actor was built (October 2026).
  • SmartRecruiters lists do not include descriptions, so each description needs one extra small request. These run 20 at a time by default, so a company with 5,000 jobs takes about 2.5 minutes with descriptions on and a few seconds with them off.
  • Salary appears only when the employer publishes structured pay. Ashby, Lever and Recruitee expose it for some companies. Greenhouse pay ranges usually sit inside the description text.
  • Workable and Recruitee boards can be empty even for big companies that use other tools for some regions. An empty board is reported as empty, not as an error.
  • Default memory is 256 MB. Jobs are streamed to the dataset as they arrive, so even boards with thousands of jobs and long descriptions stay well under that (peak about 175 MB in our tests). There is no reason to raise it.

FAQ

Do I need an API key or a proxy? No. These are the public endpoints that companies use to show jobs on their own websites.

How fresh is the data? Live. Each run reads the boards at that moment.

How do I get only new jobs every day? Schedule the Actor daily with Posted within the last N days set to 1 or 2, and dedupe on id.

A company returns not_found. Why? The slug is wrong, the company moved to another ATS, or its board is private. Try the careers page URL instead and let the Actor detect the board.

Can I pass thousands of companies? Yes. Requests run in parallel with a polite concurrency limit and automatic retries. Use Max jobs in total or the run cost cap while testing.

Does it collect personal data? No. It saves only job posting fields that employers publish. Recruiter names and internal mailbox addresses that some APIs include are dropped on purpose.

This Actor reads job postings that employers publish on purpose through public job board APIs. It does not log in, bypass access controls or break captchas, and it does not collect personal data. You are responsible for using the data in line with the terms of the job boards, the employers' rights and applicable law (for example GDPR and copyright in job descriptions). If you republish postings, link back to the original jobUrl. Greenhouse, Lever, Ashby, Workable, SmartRecruiters and Recruitee are trademarks of their owners. This Actor is not affiliated with or endorsed by them.

Support

Found a board that does not work, or want another ATS? Open an issue on the Actor's Issues tab with the company URL. Contact: joesimo@mail.grokbot.com