Career Site Jobs: Workday, Greenhouse, Lever & Ashby
Pricing
from $1.00 / 1,000 jobs
Career Site Jobs: Workday, Greenhouse, Lever & Ashby
Workday, Greenhouse, Lever & Ashby jobs in one flat feed with new-job monitoring. Reads full Workday portals beyond the 2,000-job cap. $1 per 1,000 jobs. Works via API and MCP. Unreadable portals are free.
Pricing
from $1.00 / 1,000 jobs
Rating
0.0
(0)
Developer
pfistyle.digital
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
14 days ago
Last modified
Categories
Share
Read public company career sites in one actor:
- Full Workday portals beyond the 2,000-job cap: Workday returns at most 2,000 results per search; the actor splits large portals automatically and merges them without duplicates (measured: NVIDIA 2,671 of 2,674 jobs).
- Four job platforms: Workday, Greenhouse, Lever and Ashby, via their public job board endpoints.
- One flat row per job: title, company, location, remote, posted date, link, source.
- New-job monitoring: with
onlyNew, each run returns jobs absent from the selected previous dataset.
Pay per event, no subscription: $1 per 1,000 emitted jobs. Unreadable portals and known jobs skipped with onlyNew are free. No browser, no proxy. Works via API and MCP.
Speed, measured on Apify (2026-10-08): about 9 jobs per second on Workday (1,000 jobs in under 2 minutes); Greenhouse and Ashby boards return all jobs in a single request. Large Workday portals beyond Workday's 2,000-result limit are read completely (e.g. all ~2,670 NVIDIA jobs).
Use cases
- Track new openings at target companies
- Monitor hiring trends and competitor expansion
- Build job feeds for spreadsheets, analytics and AI agents
- Identify companies hiring for a particular role or location
Input
Paste career page URLs, one per line. That is all you need:
{"portals": ["https://boards.greenhouse.io/airbnb"],"maxJobsPerPortal": 5}
Accepted forms (all tested):
| Source | Careers page / job board | Also works |
|---|---|---|
| Greenhouse | https://boards.greenhouse.io/airbnb, https://job-boards.greenhouse.io/airbnb, EU boards | single job links, embed links (?for=airbnb), API links, greenhouse:airbnb |
| Lever | https://jobs.lever.co/palantir, https://jobs.eu.lever.co/... | single job links, API links, lever:palantir |
| Ashby | https://jobs.ashbyhq.com/ramp | single job links, API links, ashby:ramp |
| Workday | https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite | with language (/en-US/), single job links, myworkdaysite.com links, workday:nvidia.wd5/NVIDIAExternalCareerSite |
| Any of the first three | company name (Airbnb) or domain (airbnb.com) | detected automatically (Greenhouse, then Lever, then Ashby) |
Upper/lower case, extra spaces, empty lines, https:// missing and several entries in one line (separated by new lines, commas or semicolons) are all accepted. Duplicates are removed. Via the API, portals must be a list (Apify checks this before the run starts).
Entries that cannot be used never fail the run: they are skipped free of charge and listed in SUMMARY with a reason (invalid_portal, not_detected, workday_needs_url, ...) and a hint with a correct example. A run fails only if no portal is given at all.
Options:
maxJobsPerPortal: leave empty to read all jobs; counts retrieved jobs, including known jobs.onlyNew(defaultfalse): return and charge jobs absent frompreviousDatasetId; deduplicate within the current run if it is omitted.previousDatasetId(optional): read-only dataset used to identify previously emitted jobs.
Output
One row per job (real rows, 2026-10-08):
{"title": "Account Manager","company": "Airbnb","location": "London, United Kingdom","remote": false,"postedAt": "2026-09-09","url": "https://careers.airbnb.com/positions/8184174?gh_jid=8184174","source": "greenhouse","jobId": "8184174","portal": "greenhouse:airbnb"}
{"title": "Senior Systems Architect - Datacenter","company": "nvidia","location": "US, CA, Santa Clara","remote": false,"postedAt": "2026-10-08","url": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite/job/US-CA-Santa-Clara/Senior-Systems-Architect---Datacenter_JR2019127","source": "workday","jobId": "/job/US-CA-Santa-Clara/Senior-Systems-Architect---Datacenter_JR2019127","portal": "workday:nvidia.wd5/NVIDIAExternalCareerSite"}
postedAt is an ISO date or null. Company is Greenhouse's company_name when present, otherwise the organization shortcut; Workday uses the tenant. Company names are never inferred. Workday uses externalPath as its stable job ID. No descriptions or recruiter names are collected.
Pricing
| Event | Price |
|---|---|
job (one emitted row) | $0.001 |
| Actor start (per run, per GB of memory) | $0.00005 |
Known jobs skipped by onlyNew and unreadable portals have no job charge. Startup and platform usage are additional. The run checks the cost limit before every charge and stops cleanly if a charge is refused. Unpriced local builds emit without charging.
Scheduled monitoring
Create an Apify Schedule, for example daily at 06:00 in your chosen timezone. Omit the job limit to read all openings:
{"portals": ["ashby:ramp", "greenhouse:airbnb"],"onlyNew": true,"previousDatasetId": "PREVIOUS_DATASET_ID"}
Set previousDatasetId to the last run's dataset ID (select it with the dataset picker). The selected dataset is only read and is never modified. Missing, invalid or inaccessible datasets produce a log warning and a comparisonNotice in SUMMARY; the run continues with duplicate suppression within the current run. Without a previous dataset, every distinct current row is eligible for output. No persistent history is maintained. A dataset containing only new/changed rows, a filtered result or a cost-interrupted result is an incomplete baseline: rows absent from it can be emitted again. For reliable repeated monitoring, compare with a complete snapshot dataset and update the input through your scheduler or integration; a static schedule does not automatically select the last run.
Jobs are matched by source:portal:jobId. Changes to existing job IDs are not emitted; no removal rows are produced.
Use with AI agents / MCP
MCP server URL:
https://mcp.apify.com?tools=pfistyle.digital/ats-jobs
Example prompt: "Use pfistyle.digital/ats-jobs to find new openings at greenhouse:airbnb and lever:palantir. Return titles, locations and job links."
Direct API call:
curl -X POST "https://api.apify.com/v2/acts/pfistyle.digital~ats-jobs/run-sync-get-dataset-items" \-H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \-d '{"portals":["greenhouse:airbnb","lever:palantir"],"maxJobsPerPortal":20}'
How it works
The actor reads public JSON endpoints: Greenhouse boards API, Lever postings API (skip/limit=100), Ashby job-board API, and Workday CXS (limit=20, offsets through total). Requests are limited to one per second per host, with a 30-second timeout and up to three retries with backoff for 429/5xx and connection errors. Repeated pages without new IDs stop pagination. Ashby jobs with isListed: false are excluded.
Known limitations
Which portals work
Any company whose career site runs on the hosted job boards of Workday, Greenhouse, Lever or Ashby. Tested on Apify on 2026-10-08 without blocks or rate limits: nvidia and salesforce (Workday), airbnb (Greenhouse), palantir (Lever), ramp (Ashby). Portals that cannot be read are skipped and free; the reason is in SUMMARY.
Limitations
- Only Greenhouse, Lever, Ashby and Workday are supported. A company's own careers domain is detected only if it uses Greenhouse, Lever or Ashby with a board named after the company; Workday always needs the careers page URL (Workday cannot be found by company name). Other ATS platforms and private boards are skipped free.
- Workday returns at most 2,000 results per search. Larger portals are split automatically by Workday's own filters (e.g. job family) and merged without duplicates. If a portal cannot be split below 2,000, it is read up to 2,000 jobs and reported in
SUMMARYwithtruncated: true,reason: portal_capand the portal'stotalAtPortal. - Workday dates are derived from English relative labels (Today, Yesterday, N Days Ago).
30+ Days Agohas no exact date and returnsnull. - Greenhouse and Workday remote detection only checks for “remote” in location text. Lever and Ashby use their remote fields; hybrid jobs are not automatically remote.
- Missing or invalid dates return
null. Job descriptions, filters and job-detail requests are not supported. - A job limit may mark a portal
stoppedeven if it happens to equal the actual job count; cleanup requires proven complete retrieval. - Dataset job IDs drive monitoring; changes to an existing job are not emitted with
onlyNew.
Each run writes a per-portal SUMMARY record in its default key-value store:
[{"portal":"workday:nvidia.wd5/NVIDIAExternalCareerSite","source":"workday","status":"ok","jobs":2671,"newJobs":2671,"truncated":false,"totalAtPortal":2674,"invalidRecords":1,"reason":null,"detail":null},{"portal":"lever:missing","source":"lever","status":"skipped","jobs":0,"newJobs":0,"truncated":false,"totalAtPortal":null,"invalidRecords":0,"reason":"not_found","detail":"Public ATS endpoint unavailable (HTTP 404)"}]
status: ok, skipped, partial (failed after output or Workday limit), stopped (cost or job limit), not_processed. reason: not_found, blocked, invalid_portal, unreachable, cost_limit, job_limit, portal_cap, or null. jobs counts emitted rows; newJobs counts emitted previously unknown rows. totalAtPortal is the job count reported by the portal (Workday). invalidRecords counts broken records from the portal that were skipped (not charged). The status line shows, for example, 2 jobs from 1 portals; skipped, not charged: lever:missing (not_found).
Unreadable portals are free
Unreadable portals are skipped and processing continues. Partial reads charge only delivered rows; delivered jobs can be excluded on a later run by selecting this run's dataset with previousDatasetId. Invalid inputs, blocked or missing endpoints, and connection failures produce no job charge for an unreadable portal.