Multi-ATS Jobs API: Greenhouse, Lever, Ashby and more
Pricing
from $1.00 / 1,000 results
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
Maintained by CommunityActor 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 Actor | Typical single-ATS scrapers | |
|---|---|---|
| ATSs per run | 6 in one run, mixed freely | 1 per Actor |
| Output schema | One normalized schema for all ATSs | Different fields per ATS |
| Price | $0.001 per job | $0.002 to $0.004 per job, sometimes plus extras |
| Proxy or browser | None needed | Often a browser or proxy |
| Unknown slugs | Warn and continue, listed in the run summary | Often fail the whole run |
| Retries | Automatic backoff on 429, 5xx and timeouts | Varies |
| Speed | About 9,300 jobs from 25 companies in about 2.5 minutes at 256 MB | Varies |
Supported ATSs and input formats
Put one company per line in Companies. Mix any of these forms in one run:
| ATS | ats:slug form | Board URL forms that are auto-detected |
|---|---|---|
| Greenhouse | greenhouse:stripe (or gh:stripe) | boards.greenhouse.io/stripe, job-boards.greenhouse.io/stripe, embed URLs with ?for=stripe |
| Lever | lever:palantir, lever-eu:lever for EU-hosted boards | jobs.lever.co/palantir, jobs.eu.lever.co/... |
| Ashby | ashby:ramp | jobs.ashbyhq.com/ramp |
| Workable | workable:huggingface | apply.workable.com/huggingface, huggingface.workable.com |
| SmartRecruiters | smartrecruiters:BoschGroup (or sr:BoschGroup) | jobs.smartrecruiters.com/BoschGroup, careers.smartrecruiters.com/BoschGroup |
| Recruitee | recruitee:bunq | bunq.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
| Option | What it does |
|---|---|
| Title keywords | Keep jobs whose title contains any keyword. Short keywords like AI or QA match whole words only. |
| Exclude title keywords | Drop jobs whose title contains any of these words. |
| Location contains | Keep jobs whose location (any of them) or country contains one of these strings. |
| Remote jobs only | Keep jobs marked remote by the ATS or with "remote" in the location. |
| Department or team contains | Match against both department and team. |
| Posted within the last N days | Uses the publish date, or the last update date when the ATS has no publish date. |
| Max jobs per company / Max jobs in total | Hard caps. 0 means no limit. |
| Include job descriptions | Turn 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
| Field | Notes |
|---|---|
id | Stable unique ID ats:companySlug:sourceId. Use it to dedupe across runs. |
ats, company, companySlug | Source system, company name (or slug when the ATS has no name), and the slug used. |
title, department, team | As published. team holds the sub-team or job function when the ATS has one. |
location, locations, country | Primary location, all published locations, and country when given. |
remote, workplaceType | remote is always true or false. workplaceType is remote, hybrid, onsite or null. |
employmentType | One of FULL_TIME, PART_TIME, CONTRACT, TEMPORARY, INTERNSHIP, VOLUNTEER, OTHER, or null. The original value is in employmentTypeRaw. |
salaryMin, salaryMax, salaryCurrency, salaryInterval | Only when the employer publishes structured pay. Interval is YEAR, MONTH, WEEK, DAY or HOUR. Nothing is guessed. |
postedAt, updatedAt | ISO 8601 in UTC. |
applyUrl, jobUrl | Direct apply link and public posting page. |
descriptionText, descriptionHtml | Present when descriptions are on, in the format you choose. |
sourceId, sourceUrl, scrapedAt | Original 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:
| Run | Jobs | Price |
|---|---|---|
| 10 startups, engineering roles only | about 150 | about $0.15 |
| 50 companies, all jobs | about 5,000 | about $5 |
| Daily alert, 200 companies, posted within 1 day | about 300 per day | about $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_foundornot_detectedin 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.
Legal note
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