ATS Jobs Feed: Greenhouse, Lever, Ashby, Recruitee, Personio avatar

ATS Jobs Feed: Greenhouse, Lever, Ashby, Recruitee, Personio

Pricing

from $0.60 / 1,000 job returneds

Go to Apify Store
ATS Jobs Feed: Greenhouse, Lever, Ashby, Recruitee, Personio

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

Todd Handler

Maintained by Community

Actor 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

ATSBoard URL exampleShorthand
Greenhousehttps://boards.greenhouse.io/airbnb or https://job-boards.greenhouse.io/airbnbgreenhouse:airbnb
Leverhttps://jobs.lever.co/palantir (EU boards: jobs.eu.lever.co)lever:palantir
Ashbyhttps://jobs.ashbyhq.com/rampashby:ramp
Recruiteehttps://bunq.recruitee.comrecruitee:bunq
Personiohttps://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

  1. Paste your companies into Companies, one per line.
  2. Leave Mode on Full snapshot for a one-off pull.
  3. Click Start. Results appear in the Jobs table and can be exported as JSON, CSV or Excel.
  1. Set Mode to Changes since last run.
  2. Create a schedule (daily is typical) under Schedules in Apify Console.
  3. 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 run
  • updated: title, location, department, salary, description or apply link changed
  • removed: 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_count and closed_roles_count: roles opened and closed since the last run, plus net_change
  • hiring_velocity_30d and posted_last_7d: open roles first posted in the last 30 and 7 days
  • top_departments: where the new roles are (or the open roles on a first run)
  • new_roles and closed_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

FilterWhat it does
Title keywords (any)Keep jobs whose title contains any keyword. Optionally also search the description
Exclude title keywordsDrop jobs whose title contains any of these
Locations (any)Keep jobs where a location contains any value, for example London, Germany, Remote
Remote onlyKeep fully remote jobs only
Departments or teams (any)Match on department or team
Posted within daysKeep recently posted jobs
Max jobs per companySnapshot 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, onsite or unknown.
  • employment_type: full_time, part_time, contract, temporary, intern or other.
  • seniority: intern, entry, senior, lead, manager, director or executive. 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_period is null for Greenhouse because Greenhouse does not state one.
  • change_type is null in snapshot mode.
  • source_input is the line from your input that produced the row, so you can join results back to your list.
  • Each run also writes a SUMMARY record to the key-value store. It lists every board with its match count, how each input was resolved (input, page_link or slug_guess), and any inputs that failed or could not be resolved.

Pricing

Pay per event. You only pay for what the run delivers.

EventPrice (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, changes or signals), and the optional filters above.
  • Output: one row per job in snapshot and changes; one row per company in signals. The run SUMMARY key-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. Use maxJobsPerCompany and 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_guess are usually right, but check them in SUMMARY before 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.