Career Site Jobs: Greenhouse, Lever, Ashby, Workable, Workday
Pricing
from $1.00 / 1,000 jobs
Career Site Jobs: Greenhouse, Lever, Ashby, Workable, Workday
Every open job from any company's Greenhouse, Lever, Ashby, Workable or Workday careers page as clean, normalized JSON: salary ranges where published, new/existing/removed tracking between runs. Reads only the public job-board JSON the careers pages load themselves.
Pricing
from $1.00 / 1,000 jobs
Rating
0.0
(0)
Developer
DataForge
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
13 days ago
Last modified
Categories
Share
Career Site Jobs: Greenhouse, Lever, Ashby, Workday & more, with daily change tracking
Name the companies you care about and get every open job on their careers page as clean, consistent JSON. Each run also tells you what changed since the last run: new jobs, jobs still open, and jobs that were removed.
- 5 applicant-tracking systems (ATSs): Greenhouse, Lever, Ashby, Workable and Workday (
myworkdayjobs.com, used by many large employers). Paste a careers-page URL and the Actor detects the ATS for you. - Data comes straight from the source, in real time: the Actor reads the employer's official public job-board API during your run. There is no stale index and no lag of several hours.
- One schema for every ATS: locations as an array, remote/hybrid/onsite, employment type, ISO dates, and a short plain-text description excerpt with a link to the full posting.
- Salary ranges as structured numbers (
min,max,currency,interval) wherever the employer publishes them. These come from the ATS's own pay-transparency fields, not AI guesses. Workday has no pay field, so there the range is read from the posting text when the employer states one ("The base salary range is 272,000 USD - 431,250 USD"). - Change tracking built in: every record has
changeStatus(neworexisting) andfirstSeenAt. Turn on Only new jobs to get just the new jobs on a daily schedule. The run summary lists jobs that were removed. - Reliable and polite: timeouts, retries with backoff, per-host rate limits, and each API host's robots.txt (including any Crawl-delay) is checked and obeyed during the run. A wrong company name is reported in the summary and the run carries on with the rest.
Use cases
- Job aggregators and job boards: feed hundreds of employer boards into your site every day. Ingest only new postings and expire the removed ones.
- Recruiters and sourcers: watch target companies and get alerted when they open roles that match your keywords and locations.
- Market and competitive research: follow hiring velocity by department, location and seniority, see where competitors are expanding, and benchmark published pay ranges.
- Sales intelligence: hiring is a buying signal. Find companies opening "Data Engineer" or "Security" roles this week.
- Job seekers and communities: a personal daily digest of new remote roles at the companies you love.
How to use it
- Add companies to Companies, one per line. Any of these forms works:
https://boards.greenhouse.io/figmaorhttps://job-boards.greenhouse.io/figmaorgreenhouse:figmahttps://jobs.lever.co/zooxorlever:zoox(EU tenants:https://jobs.eu.lever.co/<name>)https://jobs.ashbyhq.com/ramporashby:ramphttps://apply.workable.com/huggingfaceorworkable:huggingfacehttps://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSiteorworkday:nvidia.wd5/NVIDIAExternalCareerSite(Workday needs the full URL: tenant,wdnumber and career-site name; a company can have several career sites, each is one entry)
- Add filters if you want them: title keywords, locations, remote only, posted within N days, max jobs per company.
- For daily monitoring, schedule the Actor (for example every morning) with Only new jobs turned on.
Company on a custom domain (for example
careers.acme.com)? Click any job link on their site. It usually points to one of the hosts above, and that gives you theats:slug.
Input example
{"companies": ["https://boards.greenhouse.io/figma","https://jobs.lever.co/zoox","https://jobs.ashbyhq.com/ramp","https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite","workable:huggingface"],"keywords": ["engineer", "product manager"],"locations": ["New York", "Remote"],"remoteOnly": false,"postedWithinDays": 30,"onlyNew": true,"includeDescription": true,"maxJobsPerCompany": 200}
| Field | Default | What it does |
|---|---|---|
companies | 4 sample companies | Careers-page URLs or ats:slug entries. |
keywords | none | Keeps jobs whose title contains any of the keywords (case-insensitive). |
locations | none | Keeps jobs where any location contains any of these texts (case-insensitive). |
remoteOnly | false | Keeps only remote jobs. |
postedWithinDays | any | Keeps jobs published in the last N days. Jobs with no date are dropped when this is set. |
onlyNew | false | Outputs only jobs that earlier runs with the same companies and filters have not seen. |
includeDescription | true | Adds descriptionExcerpt: the first 400 characters of the description as plain text. Full descriptions and HTML are never output; follow url for the complete posting. |
maxJobsPerCompany | 20 | Keeps the newest N matching jobs per company. The default keeps a first run (and an API call that omits the field) to cents; set a larger number, up to 100,000, for everything. |
Output
Every dataset item has the same shape, whichever ATS it came from:
{"id": "greenhouse:figma:6211910004","ats": "greenhouse","company": "Figma","companySlug": "figma","jobId": "6211910004","title": "Technical Program Manager, AI Tooling","department": "Business Operations","team": null,"locations": ["San Francisco, CA", "New York, NY", "United States"],"isRemote": false,"workplaceType": null,"employmentType": null,"compensation": {"min": 169000,"max": 245000,"currency": "USD","interval": "year","raw": "Annual Base Salary Range: USD 169,000 - 245,000"},"postedAt": "2026-10-02T14:59:12.000Z","updatedAt": "2026-10-02T14:59:12.000Z","url": "https://boards.greenhouse.io/figma/jobs/6211910004?gh_jid=6211910004","applyUrl": "https://boards.greenhouse.io/figma/jobs/6211910004?gh_jid=6211910004","descriptionExcerpt": "Figma is growing our team of passionate creatives and builders on a mission to make design accessible to all. Born on the Web, Figma helps entire product teams brainstorm, design and build better products — from start to finish. Whether it’s consolidating tools, simplifying workflows, or collaborating across teams and time zones, Figma makes the design process faster, more efficient, and fun while keeping everyone on the…","firstSeenAt": "2026-10-04T05:32:43.000Z","changeStatus": "new","scrapedAt": "2026-10-04T05:32:43.797Z"}
Field notes:
idis stable across runs (ats:company:jobId), so you can use it as a primary key.employmentTypeis one offull-time,part-time,contract,internshiportemporary, or the employer's own wording, ornullwhen the ATS doesn't say.workplaceTypeisremote,hybrid,onsiteornull.isRemoteis true when the employer marks the job remote or a listed location says "Remote".compensationisnullwhen the employer publishes no range.intervalisyear,month,week,dayorhour. When an employer publishes several pay zones,minandmaxhold the first zone andrawlists all of them.companyis the employer name when the API provides one (Greenhouse, Workable). Lever, Ashby and Workday give none, so it is the board name in title case (Zoox,Ramp,Nvidia);companySlugkeeps the exact board name.- Workday records:
jobIdis the requisition id from the posting URL (for exampleJR2019127; the title slug in front of it is not part of the id, so a renamed posting keeps itsid),department/teamare not published by the endpoint and arenull,postedAtis the posting date (no time of day),applyUrlis the posting URL plus/apply.
The dataset's Overview view shows the key columns as a table, and the With salary view focuses on pay data. Export to JSON, CSV, Excel, or use the API or integrations.
Run summary (OUTPUT record)
Each run writes a summary to the default key-value store under the key OUTPUT:
{"totals": { "companiesRequested": 8, "companiesSucceeded": 6, "companiesFailed": 2, "jobsFetched": 1276,"jobsMatched": 460, "jobsOutput": 104, "newJobs": 104, "existingJobs": 0, "removedSinceLastRun": 0, "withCompensation": 67 },"companies": [ { "input": "greenhouse:figma", "status": "ok", "jobsFetched": 162, "jobsOutput": 25, "newJobs": 25,"existingJobs": 0, "removedSinceLastRun": 0, "removedJobIds": [], "truncated": true, "durationMs": 674 } ],"errors": [ { "input": "greenhouse:this-company-does-not-exist-xyz", "message": "Greenhouse board \"this-company-does-not-exist-xyz\" not found (HTTP 404). Check the board token in the careers URL." } ],"chargeLimitReached": false}
removedJobIds lists jobs that were open at the last run and are gone now. They were probably filled or closed.
Change tracking: how it works
- History is kept in a named key-value store,
career-site-jobs-state, in your account. It is keyed by a hash of your companies + filters. ChangingonlyNew,includeDescriptionormaxJobsPerCompanykeeps the history. Changing companies or filters starts a new one. - The first run treats every job as
new. Later runs mark a jobnewonly if it wasn't seen before. - A job that disappears and comes back within 90 days is not counted as new again.
- If a run stops early because it hit your maximum cost per run, jobs you didn't receive stay
newfor the next run. Nothing is lost. - If a company fails to load, its history is left untouched.
Pricing
Pay-per-event: you pay only for the jobs you receive (event job, one per dataset item).
Suggested price: $1.00 per 1,000 jobs. The sample run (4 companies, at most 20 jobs each) costs under $0.10; the same companies without a limit (about 2,500 jobs) about $2.50. With Only new jobs on, a daily run over the same companies usually costs cents, because you pay only for new postings. Set a maximum cost per run in Apify and the Actor stops cleanly when it reaches it.
FAQ
Which companies are supported? Any company whose careers page runs on Greenhouse, Lever, Ashby, Workable or Workday. That covers many thousands of companies, from startups to the largest enterprises. iCIMS, SuccessFactors, Taleo and other ATSs are not supported yet. SmartRecruiters is deliberately not supported: its robots.txt disallows automated access and its job API requires a key, so a SmartRecruiters URL is reported as unsupported in OUTPUT.errors. Recruitee is not supported either: from 10 February 2027 its job API needs a token only the employer can issue, so Recruitee URLs are reported as unsupported too.
How fresh is the data? Live. Every run reads the employer's job board directly.
How fast is it? Seconds per company for Greenhouse, Lever, Ashby and Workable (one request per board). Workday lists 20 jobs per request and needs one more request per job you receive, so a large Workday site without a limit takes a few minutes on the first run and only seconds afterwards with Only new jobs on. The sample input finishes in about 5 seconds.
Anything special about Workday? Give the full careers URL (https://<tenant>.<wdN>.myworkdayjobs.com/<CareerSite>); the Actor cannot guess the wd number. A company with several career sites (for example Salesforce has External_Career_Site and Slack) needs one entry per site. Title keywords are applied to the list, so they cost no extra requests; location, remote and "posted within more than 30 days" filters need the job details first and cost one request per listed job.
What happens with a wrong company name? You get a warning, an entry in OUTPUT.errors, and the run continues with the other companies. The run is marked failed only if no company could be fetched.
Why is compensation empty for some jobs? The employer didn't publish a pay range in their ATS (or, for Workday, in the posting text). The Actor never guesses salaries.
Can I get only remote jobs, or only jobs from the last week? Yes: remoteOnly: true and postedWithinDays: 7.
Does it work with proxies or need login? Neither. Only public, unauthenticated job-board APIs are used.
Legal
This Actor uses only the employers' public job-board APIs, which ATS vendors provide so that job postings can be displayed and distributed, and for Workday the public JSON that the employer's careers page itself loads. It does not log in, bypass access controls, solve CAPTCHAs or scrape HTML pages, and it obeys each host's robots.txt. It collects only what employers publish in their job posts, and it republishes job descriptions only as a short excerpt (400 characters) with a link to the employer's own posting, so the full text stays with its owner. You are responsible for using the data in line with applicable laws and the terms of the sources. For example, if a job description contains a recruiter's name or email, treat it as personal data. See ./LEGAL.md for the sources and their terms.