ATS Jobs Feed: Greenhouse, Lever, Ashby, Recruitee, Personio
Pricing
from $0.60 / 1,000 job returneds
ATS Jobs Feed: Greenhouse, Lever, Ashby, Recruitee, Personio
Live job postings straight from company career boards on Greenhouse, Lever, Ashby, Recruitee and Personio, in one normalized schema, with a changes-since-last-run mode for scheduled monitoring.
Pricing
from $0.60 / 1,000 job returneds
Rating
0.0
(0)
Developer
Todd Handler
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
ATS Jobs Feed: Greenhouse, Lever, Ashby, Recruitee and Personio jobs in one schema
Give it a list of companies and get every open job straight from their own career boards, live, in one clean schema. Schedule it in changes mode and each run returns only the jobs that are new, updated or removed since the last run.
- Live, not a stale database. Every run reads the company's board at that moment.
- One schema across five ATS. Title, department, locations, remote type, employment type, seniority, salary (where published), dates, apply link and the full description.
- Change detection built in. Get daily new and closed roles for a company list without diffing anything yourself.
- Hiring signals per company. One row per company with new and closed roles and a hiring velocity, priced per company, for GTM teams and Clay tables.
- Bring domains, not just board URLs. Auto-discover finds which ATS a company uses from its website.
- Cheap and predictable. You pay per job returned, from $1.00 per 1,000 jobs.
Who uses it
- Recruiters and staffing firms tracking hiring at target accounts
- Niche job boards backfilling and refreshing listings from employer boards
- Sales and GTM teams using new roles as buying signals
- Researchers tracking hiring by company, function and location
- AI agents that need fresh, structured job data (see "For AI agents" below)
Supported ATS and input formats
| ATS | Board URL example | Shorthand |
|---|---|---|
| Greenhouse | https://boards.greenhouse.io/airbnb or https://job-boards.greenhouse.io/airbnb | greenhouse:airbnb |
| Lever | https://jobs.lever.co/palantir (EU boards: jobs.eu.lever.co) | lever:palantir |
| Ashby | https://jobs.ashbyhq.com/ramp | ashby:ramp |
| Recruitee | https://bunq.recruitee.com | recruitee:bunq |
| Personio | https://personio.jobs.personio.de (or .com) | personio:personio |
You can also enter a company domain (stripe.com), a careers page URL, or a company name (Palantir). With auto-discover on, the Actor checks the website for a board link. If that finds nothing, it tries the domain or name as a board token on each ATS and checks that the board's company name matches.
Workday, SmartRecruiters and other ATS are not supported yet. Open an issue if you need one.
Quick start
- Paste your companies into Companies, one per line.
- Leave Mode on Full snapshot for a one-off pull.
- Click Start. Results appear in the Jobs table and can be exported as JSON, CSV or Excel.
Monitor companies on a schedule (recommended)
- Set Mode to Changes since last run.
- Create a schedule (daily is typical) under Schedules in Apify Console.
- Connect the run to Google Sheets, Slack, Airtable, a webhook, Make or n8n with Apify integrations.
The first run returns every current job as new and saves a baseline. After that you get only:
new: posted since the last runupdated: title, location, department, salary, description or apply link changedremoved: no longer on the board, usually filled or closed (removed rows carry the job ID, title, locations and URL from the last time it was seen)
The baseline is keyed to your companies and filters, so changing either starts a fresh baseline. Set State key to give it a fixed name.
Hiring signals mode (for GTM teams and Clay)
Set Mode to Hiring signals and give it a list of company domains. You get one row per company instead of one row per job:
open_roles: open roles right now (after your filters)new_roles_countandclosed_roles_count: roles opened and closed since the last run, plusnet_changehiring_velocity_30dandposted_last_7d: open roles first posted in the last 30 and 7 daystop_departments: where the new roles are (or the open roles on a first run)new_rolesandclosed_roles: the roles themselves, with title, department, locations and link (up to Roles listed per company, 25 by default)
The first run for a company is a baseline (is_baseline: true): it shows open roles and velocity, and the new and closed counts start from the second run. Schedule it weekly or daily. Every company you add gets its own baseline, so growing your list does not reset the others.
Every input gets a row. If a company isn't on a supported ATS, its row says status: no_supported_board and is not charged. Domains are resolved once and remembered for 30 days, so repeat runs don't pay to look them up again.
Use title keywords or departments to track a function, for example engineer or Sales, so the counts only cover those roles.
Filters
| Filter | What it does |
|---|---|
| Title keywords (any) | Keep jobs whose title contains any keyword. Optionally also search the description |
| Exclude title keywords | Drop jobs whose title contains any of these |
| Locations (any) | Keep jobs where a location contains any value, for example London, Germany, Remote |
| Remote only | Keep fully remote jobs only |
| Departments or teams (any) | Match on department or team |
| Posted within days | Keep recently posted jobs |
| Max jobs per company | Snapshot mode only, keeps the newest |
Output
One row per job. Example (description shortened):
{"company": "ramp","ats": "ashby","board_token": "ramp","job_id": "0d52b853-4088-45dd-8c4b-0702da1bf5ed","title": "Lead Recruiter | Executive","department": "People & Talent","team": "People & Talent","locations": ["New York, NY (HQ)", "San Francisco, CA", "Remote (US)"],"remote_type": "hybrid","employment_type": "full_time","seniority": "lead","posted_at": "2026-10-19T17:06:15.365000Z","updated_at": null,"job_url": "https://jobs.ashbyhq.com/ramp/0d52b853-4088-45dd-8c4b-0702da1bf5ed","apply_url": "https://jobs.ashbyhq.com/ramp/0d52b853-4088-45dd-8c4b-0702da1bf5ed/application","salary_min": 180000,"salary_max": 250000,"salary_currency": "USD","salary_period": "year","description_text": "ABOUT RAMP\n\nRamp is building the smart infrastructure for finance teams...","description_html": null,"change_type": null,"source_input": "https://jobs.ashbyhq.com/ramp","fetched_at": "2026-10-19T18:28:12Z"}
Field notes
remote_type:remote,hybrid,onsiteorunknown.employment_type:full_time,part_time,contract,temporary,internorother.seniority:intern,entry,senior,lead,manager,directororexecutive. It is derived from the title or the ATS's own level field, and is null when there is no signal.- Salary fields are filled only when the company publishes pay.
salary_periodis null for Greenhouse because Greenhouse does not state one. change_typeis null in snapshot mode.source_inputis the line from your input that produced the row, so you can join results back to your list.- Each run also writes a
SUMMARYrecord to the key-value store. It lists every board with its match count, how each input was resolved (input,page_linkorslug_guess), and any inputs that failed or could not be resolved.
Pricing
Pay per event. You only pay for what the run delivers.
| Event | Price (Free and Starter plans) |
|---|---|
| Job returned (new, updated, removed or snapshot row) | $0.001 ($1.00 per 1,000) |
| Company checked (one per board per run) | $0.0003 |
| Company resolved by auto-discover (first time only, then remembered for 30 days) | $0.002 |
| Hiring signal (one company row in hiring signals mode; no per-job or company-checked charge in that mode) | $0.002 |
Higher Apify plans get lower per-job prices. A daily changes-mode run over 100 companies costs about $0.03 for the checks plus $0.001 per changed job. Set a maximum cost per run in the run options and the Actor stops cleanly at that limit. In changes mode a board cut off by the limit is not marked as seen, so the next run delivers it.
For AI agents
- Input:
companies(array of board URLs,ats:token, domains or names),mode(snapshot,changesorsignals), and the optional filters above. - Output: one row per job in
snapshotandchanges; one row per company insignals. The runSUMMARYkey-value record lists errors and unresolved inputs. - Cost: about $0.001 per job plus $0.0003 per company, or $0.002 per company in
signals. UsemaxJobsPerCompanyand title or location filters to keep runs small. - Hiring signals for a list of domains: use
mode: signals. It's the cheapest way to answer "which of these companies are hiring, and for what" on a schedule.
Limits and good practice
- The Actor reads public job board endpoints that each ATS provides for publishing jobs. It does not log in, bypass access controls or collect applicant data.
- Requests are rate-limited per host and retried on temporary errors.
- Auto-discover is best effort. Inputs resolved by
slug_guessare usually right, but check them inSUMMARYbefore relying on them. - Personio and Recruitee boards are usually smaller European companies. Coverage depends on which ATS your target companies use.
Support
Open an issue on the Actor page. Issues are answered within one business day. If the Actor saves you time, a rating helps other people find it.