Greenhouse, Lever, Ashby & Workday Jobs Scraper avatar

Greenhouse, Lever, Ashby & Workday Jobs Scraper

Pricing

from $2.00 / 1,000 job results

Go to Apify Store
Greenhouse, Lever, Ashby & Workday Jobs Scraper

Greenhouse, Lever, Ashby & Workday Jobs Scraper

Job postings scraper for 6 ATS: Greenhouse, Lever, Ashby, Workday, Workable and SmartRecruiters. One normalized table of open roles per company, with new/removed-job change detection for hiring signals. Official public job-board APIs, no login, no proxy.

Pricing

from $2.00 / 1,000 job results

Rating

0.0

(0)

Developer

MonRiah Studio

MonRiah Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 hours ago

Last modified

Share

A test run with the default input (up to 20 jobs each from Stripe, Ramp and Hugging Face) returns about 46 jobs and costs about $0.09 ($0.002 per job result, plus a $0.00005 start fee). Apify's free plan includes monthly platform credit.

Job postings scraper for Greenhouse, Lever, Ashby, Workday, Workable and SmartRecruiters. Give it a list of companies and get every open role in one normalized table, straight from each company's official public job-board API. Turn on change detection to get only the jobs that are new since your last run, plus how many roles each company added or removed. Those are hiring signals you can use for sales prospecting, investor research, competitive intelligence, recruiting and job alerts.

No login, no proxy, no browser, no personal data.

What it does

  • Scrapes job postings from 6 applicant tracking systems (ATS): Greenhouse, Lever, Ashby, Workday, Workable and SmartRecruiters.
  • Accepts ats:slug, workday:tenant/wdN/site, a careers-page URL, or a bare slug (auto-detected for Greenhouse, Lever, Ashby, Workable and SmartRecruiters).
  • Gives every ATS the same columns: title, department, location, remote flag, employment type, posted date, job URL, apply URL, description and salary where published.
  • Change detection (onlyNewSinceLastRun): schedule it daily and get only new postings. The SUMMARY record shows new and removed roles per company.
  • Filters: title keywords, location keywords, remote only, posted within N days. Jobs you filter out are never charged.

Use cases

  • Sales prospecting / lead generation: a company hiring 5 data engineers is a warm lead for data tooling. Watch target accounts and get alerted when they open relevant roles.
  • Investor and market research: track headcount growth by team across a portfolio or a competitor set.
  • Competitive intelligence: see which teams and locations competitors are building out.
  • Job alerts and job boards: feed a niche job board, Slack channel or newsletter with fresh roles from the companies you choose.
  • Recruiting: monitor where talent is being hired, and what roles sit open for a long time.

Supported ATS and input formats

ATSInput exampleCareers URL it understands
Greenhousegreenhouse:stripejob-boards.greenhouse.io/stripe, boards.greenhouse.io/stripe
Leverlever:palantirjobs.lever.co/palantir
Ashbyashby:rampjobs.ashbyhq.com/ramp
Workdayworkday:nvidia/wd5/NVIDIAExternalCareerSitenvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite (with or without /en-US/), wd5.myworkdaysite.com/recruiting/{tenant}/{site}
Workableworkable:huggingfaceapply.workable.com/huggingface
SmartRecruiterssmartrecruiters:BoschGroupjobs.smartrecruiters.com/BoschGroup

Finding a Workday site: open the company's careers page and click into the job search. The URL looks like https://{tenant}.wd{N}.myworkdayjobs.com/{site}. Paste that URL as-is, or write it as workday:{tenant}/wd{N}/{site}. For example, Salesforce is https://salesforce.wd12.myworkdayjobs.com/External_Career_Site.

Input example

{
"companies": [
"greenhouse:stripe",
"lever:palantir",
"ashby:ramp",
"workday:nvidia/wd5/NVIDIAExternalCareerSite",
"https://salesforce.wd12.myworkdayjobs.com/External_Career_Site",
"workable:huggingface",
"smartrecruiters:BoschGroup"
],
"titleKeywords": ["engineer"],
"remoteOnly": false,
"postedWithinDays": 30,
"onlyNewSinceLastRun": true,
"maxWorkdayPages": 50,
"workdayDetails": false
}

Output example

One row per job:

{
"company": "Stripe",
"ats": "greenhouse",
"boardSlug": "stripe",
"jobId": "8172508",
"title": "Abuse Investigator",
"companyName": "Stripe",
"department": "8611 Security Analytics",
"team": null,
"location": "Dublin",
"isRemote": false,
"employmentType": null,
"postedAt": "2026-09-03T17:32:53.000Z",
"updatedAt": "2026-10-07T23:02:27.000Z",
"url": "https://stripe.com/jobs/search?gh_jid=8172508",
"applyUrl": "https://stripe.com/jobs/search?gh_jid=8172508",
"description": "Who we are About Stripe Stripe is a financial infrastructure platform for businesses...",
"isNew": true,
"scrapedAt": "2026-10-19T18:30:36.072Z"
}

Fields: company, ats, boardSlug, jobId, title, companyName, department, team, location, isRemote, employmentType, postedAt, updatedAt, url, applyUrl, salary, description, isNew, scrapedAt. salary is filled only where the ATS publishes it (Ashby). Export to JSON, CSV or Excel, or send results by webhook to Google Sheets, Slack, Zapier, Make or n8n.

The key-value store record SUMMARY holds per-company results: open roles fetched, total reported by the site (Workday), jobs delivered, new and removed since the last run, and any errors.

Workday notes

  • Workday list pages return 20 jobs per page. maxWorkdayPages (default 50, so up to 1,000 jobs per site) caps very large sites. Use workdaySearchText (e.g. engineer) to let Workday filter before paging.
  • Workday lists don't include descriptions, departments or exact dates. postedAt is derived from Workday's "Posted Today / Yesterday / N Days Ago" label (day precision, null for "30+ Days Ago"). Turn on workdayDetails to fetch each delivered job's detail page for the full description, start date, time type and all locations. That's one extra request per job, so it's slower on big sites.
  • When a site has more jobs than the cap, change detection only sees the jobs that were fetched, so "removed" counts can be inflated. Raise maxWorkdayPages or narrow with workdaySearchText for exact tracking.
  • The Actor paces Workday requests and retries rate-limit responses (HTTP 429). Some Workday sites rate-limit deep paging hard (in our tests Salesforce did, NVIDIA didn't). If a site keeps returning 429 partway through, the Actor keeps the jobs it already fetched, adds a warning to SUMMARY, and keeps earlier change-detection IDs so nothing is falsely reported as removed or delivered twice. To go deeper on such sites, turn on proxyConfiguration (Apify Proxy, used for Workday requests only and billed to your Apify account) or narrow with workdaySearchText.

Pricing

Pay per result: $2.00 per 1,000 jobs delivered (job-result event, $0.002 per job). Apify also charges a tiny Actor-start event ($0.00005 per run per GB of memory). Jobs removed by filters or skipped by change detection are not charged.

Examples:

  • One-off export of 3 companies with 1,500 open roles in total: about $3.00.
  • Daily monitor of 20 companies with change detection, about 30 new jobs a day: about $0.06 a day (~$1.80 a month).

FAQ

Is it legal to scrape these job postings? The Actor reads only the public job-board endpoints that companies publish so their jobs can be shown on their own careers pages and job aggregators (boards-api.greenhouse.io, api.lever.co/v0/postings, api.ashbyhq.com/posting-api, {tenant}.wdN.myworkdayjobs.com/wday/cxs/..., apply.workable.com/api/v1/widget, api.smartrecruiters.com/v1/companies/{id}/postings). It collects no personal data such as recruiter names or emails. You're responsible for how you use the data.

How do I find a company's slug? It's the company part of the careers-page URL, for example jobs.lever.co/palantir. You can also paste the full URL.

Why does a bare slug say "No public board found"? The company may use a different ATS or a private board. Bare slugs are not tried against Workday, because a Workday site needs the tenant, the wdN number and the site name. Paste the Workday URL instead.

How does change detection work? Job IDs seen in each run are saved in a named key-value store (stateStoreName). The next run outputs only IDs that weren't seen before. The first run outputs everything and sets the baseline. Rename the store to start fresh.

How fast is it? It makes plain HTTP JSON calls, with no browser. The default input (3 companies) finishes in well under a minute.

Does SmartRecruiters include descriptions? No, its list endpoint has no descriptions. Large SmartRecruiters boards are capped by maxSmartRecruitersPages (100 jobs per page).

Can I use it from code or an AI agent? Yes. Call it through the Apify API, the JS or Python client, or the Apify MCP server, and read the dataset.

Not affiliated with Greenhouse, Lever, Ashby, Workday, Workable or SmartRecruiters. Product names are trademarks of their owners.

Use from an AI agent

You can give this Actor to an AI agent as a tool through the Apify MCP server (https://mcp.apify.com), from Claude, Cursor, VS Code and other MCP clients. Add the server with only this Actor loaded:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=monriah-studio/ats-hiring-signals"
}
}
}

On first connection your browser opens to sign in to Apify (OAuth). Or add "headers": { "Authorization": "Bearer <APIFY_TOKEN>" } to use your API token instead. Then ask your agent something like "Find open engineering roles at Stripe and Ramp".

You can also call it directly via the Apify API, for example to run it and get the results in one request:

curl -X POST "https://api.apify.com/v2/acts/monriah-studio~ats-hiring-signals/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"companies": ["greenhouse:stripe", "ashby:ramp"],
"maxJobsPerCompany": 20
}'

More actors from MonRiah Studio