Multi-ATS Jobs Scraper & New Jobs Monitor
Pricing
from $1.50 / 1,000 job returneds
Multi-ATS Jobs Scraper & New Jobs Monitor
Scrape every open job from company career pages on Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Recruitee, Personio and Workday - from a URL, domain or just a company name. Normalized output with salary, remote flag and seniority, plus new-jobs-only monitoring.
Pricing
from $1.50 / 1,000 job returneds
Rating
0.0
(0)
Developer
Mathews Motta
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
12 hours ago
Last modified
Categories
Share
Multi-ATS Jobs Scraper: Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Recruitee & Personio
Scrape every open job from company career pages on Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Recruitee, Personio and Workday. Pass a careers URL, an ATS board URL, a domain or a company name and get one normalized record per job.
What does it do
Give the actor a list of companies. It finds the public job board behind each careers site, reads every open posting and writes them to a dataset in one consistent schema. It uses plain HTTP requests, so there is no browser and no proxy, and runs are fast and cheap.
- Eight ATS platforms in one actor, with the same output for all of them.
- Flexible input: ATS URL, careers page, domain or company name. Pages are scanned for embedded boards.
- Normalized fields:
remote,seniority(inferred from the title),department, published salary andpostedAt. - Only new jobs: remembers seen postings per monitor name, so scheduled runs return just the fresh ones.
- Filters: keywords, exclusions, locations, remote only, departments, posted within N days, per-company cap.
Who is it for
- Job boards and niche job sites that need a steady feed from specific employers.
- Recruiters and agencies tracking openings at target companies.
- Job-alert bots that post new matches to Slack, Telegram or email.
- Market and salary research across titles, levels and published pay.
- Lead generation: a company that is hiring has budget and a reason to buy.
- AI agents and RAG: structured job data with descriptions.
How much does it cost
You pay per job returned: $1.50 per 1,000 jobs, plus a small actor-start fee set by Apify. Filtered-out jobs and already-seen jobs are free, and so are failed companies. The max-cost-per-run limit you set is respected: when it is reached, the run stops cleanly. The first run of a monitor charges for every matching job, since it records them as the baseline.
Input
| Field | Type | Description |
|---|---|---|
companies | string[] | Required. ATS URLs, careers URLs, domains or company names (max 1,000). |
keywords | string[] | Keep jobs whose title or description contains any of these. |
excludeKeywords | string[] | Drop jobs whose title, department or team contains any of these. |
locations | string[] | Keep jobs whose location contains any of these (substring). |
remoteOnly | boolean | Keep only jobs explicitly remote. Default false. |
postedWithinDays | integer | Keep jobs published in the last N days. 0 disables it. |
departments | string[] | Keep jobs whose department or team matches. |
onlyNewJobs | boolean | Output only jobs not seen under the same monitor name. |
monitorName | string | Name of the seen-jobs memory. Default default. |
includeDescription | boolean | Add plain-text descriptionText. Default true. |
includeDescriptionHtml | boolean | Also add descriptionHtml. Default false. |
maxJobsPerCompany | integer | Cap per company after filters. 0 means unlimited. |
Example input:
{"companies": ["https://boards.greenhouse.io/stripe","https://jobs.ashbyhq.com/notion","https://jobs.lever.co/spotify"],"maxJobsPerCompany": 10}
Output
One dataset item per job:
| Field | Type | Description |
|---|---|---|
id | string | Stable: ${source}:${sourceJobId}. |
source, sourceJobId | string | ATS name (greenhouse, lever, ...) and the ATS job ID. |
title, company, companySlug | string | As published; companySlug is the board token. |
url, applyUrl | string | Public posting link and application link. |
locations | string[] | Locations as listed. |
remote | boolean or null | null when unknown. |
department, team, employmentType | string | When the ATS provides them. |
seniority | string | Inferred: intern, junior, mid, senior, lead, manager, director, executive. |
salaryMin, salaryMax, salaryCurrency, salaryPeriod | number, string | Pay range when published (Greenhouse, Lever, Ashby, Recruitee). |
tags | string[] | Labels from the ATS, when any. |
descriptionText, descriptionHtml | string | Plain text (HTML stripped) and optional original HTML. |
postedAt, updatedAt, scrapedAt | string | ISO 8601 timestamps. |
Sample item (one real record, description shortened):
{"id": "ashby:1fc309c8-da20-4ff2-84c7-8b863ece2b0a","source": "ashby","sourceJobId": "1fc309c8-da20-4ff2-84c7-8b863ece2b0a","title": "Software Engineer, AI Connections (Developer Platform)","company": "Notion","companySlug": "notion","url": "https://jobs.ashbyhq.com/notion/1fc309c8-da20-4ff2-84c7-8b863ece2b0a","applyUrl": "https://jobs.ashbyhq.com/notion/1fc309c8-da20-4ff2-84c7-8b863ece2b0a/application","locations": ["San Francisco, California", "New York, New York"],"remote": false,"department": "Engineering","team": "Engineering","employmentType": "Full-time","seniority": null,"salaryMin": null,"salaryMax": null,"salaryCurrency": null,"salaryPeriod": null,"tags": [],"descriptionText": "Who We Are\nNotion is the collaborative AI workspace where teams and agents think together. We're building one place where your knowledge, projects, me...","descriptionHtml": null,"postedAt": "2026-08-24T14:44:49.699Z","updatedAt": null,"scrapedAt": "2026-10-23T00:23:54.713Z"}
Monitoring new jobs
- Enable Only new jobs and set a Monitor name such as
fintech-engineering. - The first run outputs every matching job and stores their IDs as the baseline.
- Add a schedule in Apify Schedules (for example, daily) with the same input. Later runs output only postings that were not seen before. Already-seen jobs are neither output nor charged.
Use one monitor name per company list or filter, so their state stays independent.
Integrations
- API: start runs and read results through the Apify API, for example the
run-sync-get-dataset-itemsendpoint. - Webhooks: trigger a workflow when a run succeeds.
- Zapier, Make, n8n: connect the Apify app to send new jobs to your tools.
- Google Sheets and exports: push runs to a sheet with the Apify integrations, or download JSON, CSV or Excel from the Console.
FAQ
Is it legal to scrape these job boards? The actor reads only public postings through the public job-board endpoints each ATS provides for its career pages. It does not log in or collect candidate data. You remain responsible for how you use the data, so check the rules that apply to you.
Which companies are supported, and how do I find the ATS URL?
Any company that posts on one of the eight platforms. Open the careers page and check where the "Apply" links go, for example boards.greenhouse.io or jobs.lever.co. Paste that URL. If you are unsure, paste the careers page or domain and the actor will look for an embedded board.
What are the limits?
Up to 1,000 companies per run. Use maxJobsPerCompany for very large employers. For Workday, descriptions are fetched for the first 500 matching jobs per company.
What if a company is not found?
The run continues. The company is listed in the SUMMARY record with the reason, and nothing is charged for it. Name lookups are best effort, so a URL is always more reliable.
How fresh is the data?
Each run reads the live board, so freshness equals your schedule. Workday only shows relative dates in lists, so its postedAt is approximate.
Related actors
- Company Hiring Signals: hiring activity by company, useful as a lead-generation signal.