ATS Job Feed - Greenhouse, Lever, Ashby, Workable & more
Pricing
Pay per usage
ATS Job Feed - Greenhouse, Lever, Ashby, Workable & more
Collect public jobs from Greenhouse, Lever, Ashby, Workable, SmartRecruiters and Recruitee. Resolve supported boards from URLs, domains or names. Normalized fields, available salaries and descriptions, filters and new-jobs-only mode.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
ClearPipe Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
ATS Job Feed: Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee
Collect open jobs from companies using the six supported applicant tracking systems (ATS) listed below. Paste board URLs, careers pages, websites or plain company names. When the actor resolves a supported board, it reads the public feed and returns normalized jobs with available descriptions and published salaries, subject to your filters and limits.
One actor instead of six. Use the same output fields across the supported platforms. Companies that can't be resolved get an error row with a reason and no job-result event fee. Platform usage charges can still apply. Spending limits, interrupted runs and source or storage failures can leave output incomplete; check the run status and error rows.
What you can do with it
- Job boards and aggregators. Keep a niche board filled with fresh jobs from a list of target companies.
- Job alerts. Schedule it daily with Only jobs not seen in earlier runs and use an Apify integration or the API to send the new postings to Slack, email or a sheet.
- Recruiting and sales signals. Hiring is a buying signal. Track which companies are hiring for which teams, where, and how fast.
- Market and salary research. Compare roles, locations, remote share and posted pay ranges across companies.
- Your own job search. Watch the 50 companies you would love to work at and get only what is new.
Supported ATS platforms
| ATS | Example input | Notes |
|---|---|---|
| Greenhouse | https://boards.greenhouse.io/airbnb, embedded boards | departments, offices, workplace type |
| Lever | jobs.lever.co/spotify | team, commitment, all locations, salary range when posted (US and EU instances) |
| Ashby | https://jobs.ashbyhq.com/openai | salary ranges and remote flag when posted |
| Workable | apply.workable.com/huggingface | function, remote flag |
| SmartRecruiters | https://jobs.smartrecruiters.com/ServiceNow | experience level; descriptions fetched per job |
| Recruitee | bunq.recruitee.com | remote / hybrid / on-site, salary when posted |
Input
Companies, one per line, any mix of:
| You paste | What happens |
|---|---|
| A job board URL | used directly (most reliable) |
A careers page URL, e.g. https://example.com/careers | the page is scanned for a supported board link or embed |
A website, e.g. notion.so | the site and its /careers and /jobs pages are scanned, then common board names are tried |
A company name, e.g. Stripe | common board names are tried on every supported ATS; the board with the most jobs is selected; similar names can resolve to the wrong company, so check company and boardSlug, or supply the exact board URL |
Filters (all optional): Title contains any of, Title excludes, Location contains any of, Remote jobs only, Posted within (days), Max jobs per company.
Example input:
{"companies": ["https://boards.greenhouse.io/airbnb", "jobs.lever.co/spotify", "notion.so", "Ramp"],"titleKeywords": ["engineer"],"locations": ["United States", "remote"],"postedWithinDays": 30,"onlyNewJobs": false}
Output
One row per saved job. Illustrative example with shortened values:
{"status": "ok","company": "Ramp","ats": "ashby","boardSlug": "ramp","jobId": "4a1c...","title": "Security Engineer, Cloud","department": "Engineering","team": "Security","location": "New York, NY (HQ)","locations": ["New York, NY (HQ)"],"country": "United States","isRemote": true,"workplaceType": "remote","employmentType": "FullTime","postedAt": "2026-04-07T17:12:35.753000+00:00","url": "https://jobs.ashbyhq.com/ramp/...","applyUrl": "https://jobs.ashbyhq.com/ramp/.../application","salaryMin": 211400,"salaryMax": 290600,"salaryCurrency": "USD","salaryInterval": "1 YEAR","salarySummary": "$211.4K – $290.6K • Offers Equity","descriptionText": "About Ramp ...","scrapedAt": "2026-10-10T23:40:00+00:00"}
Fields an ATS does not publish can be null or absent. Salary fields are filled only when the company posts pay on its board (common on Ashby and Lever, required by law in several US states).
A company that can't be resolved returns one error row without a job-result event fee:
{ "input": "Some Company", "status": "error", "errorCode": "ATS_NOT_DETECTED", "error": "No Greenhouse, Lever, Ashby, ... board found. Paste the careers page or job board URL for best results." }
| errorCode | Meaning |
|---|---|
ATS_NOT_DETECTED | No supported board found from that input. Paste the careers page or board URL instead. |
NOT_FOUND | The board URL points to a board that doesn't exist (wrong slug, or the company left that ATS). |
UPSTREAM_ERROR / NETWORK | The ATS returned an error or timed out on all 3 attempts. Try again later. |
Scheduled feeds (only new jobs)
Turn on Only jobs not seen in earlier runs and schedule the actor (Apify Console, Schedules). Successful sequential runs skip job IDs already delivered for the same input company list. Changing the input company list starts a fresh history. A run with no new matching jobs can succeed with an empty dataset. Skipped jobs incur no job-result event fee; platform usage can still apply.
Avoid overlapping runs of the same feed: concurrent runs do not share a lock. Storage failures or interruptions can also affect history persistence. This is not an exactly-once delivery guarantee.
History identifies each job by ATS platform + board slug + job ID. Editing a previously delivered job's title or location does not make it new. A repost with a new ID, or the same role on another board, can be delivered again. Closed jobs disappear from the upstream feed; this actor does not emit closure records. To reconcile closures, compare full snapshots with onlyNewJobs disabled, and account for incomplete runs before removing jobs.
Dates: postedAt comes from the ATS publication or creation date, not the actor's first-seen time. A missing date remains null. The Posted within (days) filter keeps jobs with missing or unparseable dates; check postedAt if you require confirmed recent postings.
Spending limits: reaching the event spending limit stops further job delivery. The run can still succeed; its final status warns that output may be incomplete. A successful run status alone does not establish that every company or job was collected.
Pricing
Free during launch. Apify platform usage still applies. The implemented paid event is one saved successful job row; error rows and skipped jobs do not trigger that event. Published pricing determines whether event fees apply. Check the Actor's current pricing before running it.
How it works
The actor reads public job feeds from supported ATS providers without rendering pages in a browser. Direct board URLs reduce dependence on careers-page layouts; automatic discovery and upstream feeds can still change or fail. Only publicly posted jobs are returned.
FAQ
A company I need isn't found by name. Paste its careers page URL. If its jobs are on Workday, iCIMS, Taleo or another ATS not in the table above, they aren't supported yet. Tell us in the Issues tab which one you need.
How fresh is the data? It is read live from the ATS at run time.
What happens when an ATS rate-limits requests? Feed requests retry HTTP 429, server errors and network failures up to three attempts with fixed increasing delays. There is no unlimited retry or Retry-After handling. An exhausted request returns an error row containing the final error, not a per-attempt history. A failed SmartRecruiters description request is logged and can leave the saved job without its description.
Can I use a large company list? Companies are processed in parallel within the concurrency setting. Large lists may need longer runs; check the run status and output because spending limits, source failures and interruptions can leave a list incomplete.
Support
Open an issue in the Issues tab with the input you used and the run link.