Career Site Jobs Scraper - Greenhouse, Lever, Ashby, Workday
Pricing
from $2.21 / 1,000 jobs
Career Site Jobs Scraper - Greenhouse, Lever, Ashby, Workday
Scrape job postings straight from company career sites on Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Recruitee, Workable and Personio. One clean format with salaries, locations, remote flag and full descriptions. Monitor new jobs on a schedule.
Pricing
from $2.21 / 1,000 jobs
Rating
0.0
(0)
Developer
Artificially
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Career Site Jobs Scraper – Greenhouse, Lever, Ashby, Workday & more
Scrape job postings straight from company career sites – the same public job-board feeds that power "Careers" pages – and get one clean, normalized dataset across eight applicant tracking systems (ATS). Paste career-page URLs, pick your filters, and get titles, locations, remote flags, salaries, dates, apply links and full descriptions in seconds.
Built by Artificially | Follow us on X @artificially_io
Use with AI agents (MCP)
This actor works as a tool for Claude, ChatGPT, Cursor and other AI agents through Apify's MCP server. Ask something like "list open engineering jobs at Stripe and Ramp" and the agent calls it for you. Set compactOutput: true and a small maxJobsPerCompany or maxResults (e.g. 10) so results fit easily in the agent's context.
Quick setup (sign in with your Apify account when asked):
- Claude (claude.ai or Claude Desktop): Settings → Connectors → Add custom connector, and paste
https://mcp.apify.com?tools=artificially/career-site-jobs-scraper - Claude Code or Cursor via the Apify CLI (latest version,
apify upgrade):apify mcp install claude-code --tools artificially/career-site-jobs-scraper(usecursorinstead ofclaude-codefor Cursor) - Any MCP client (Cursor, VS Code, Windsurf):
{"mcpServers": {"apify": { "url": "https://mcp.apify.com?tools=artificially/career-site-jobs-scraper" }}}
Try asking:
- "Get all open engineering jobs at Airbnb, Stripe and Notion from their career sites, with salaries."
- "Monitor these 10 company career pages and tell me which remote jobs were posted this week."
Why this actor
- Straight from the source – jobs come from the company's own ATS, not from a job board that re-posts them late or loses them. Every job has a direct apply link.
- One schema for 8 ATS platforms – Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Recruitee, Workable and Personio all come out in the same shape.
- Salary data where it exists – structured pay ranges from the ATS (Ashby, Lever, Recruitee), plus pay ranges pulled out of the description text (US pay-transparency ranges like
$150,000 - $210,000/yror148,000 USD - 235,750 USD) withsalary.sourcetelling you which. - Real filters – keywords, exclude keywords, locations, remote only, departments, employment types, posted within N days, limits per company and in total.
- Monitoring mode – turn on
onlyNewSinceLastRun, schedule the actor, and each run returns only the jobs you have not seen yet. - Paste anything – job-board URLs,
platform:slugshorthand, a company's own careers page (the embedded ATS is detected automatically), or just a slug. - Fast and cheap to run – public JSON feeds, no browser, no proxy needed. Hundreds of jobs per minute.
- You only pay for results – only valid jobs (with ID, title and URL) are saved and charged. Companies that fail are listed for free in
FAILED_COMPANIES.
Supported ATS platforms
| Platform | Example input | Shorthand | Salary | Notes |
|---|---|---|---|---|
| Greenhouse | https://job-boards.greenhouse.io/stripe or https://boards.greenhouse.io/airbnb | greenhouse:stripe | From description | Departments, workplace type from board metadata |
| Lever | https://jobs.lever.co/palantir | lever:palantir | ATS range + description | Team, department, commitment, workplace type (EU boards supported) |
| Ashby | https://jobs.ashbyhq.com/ramp | ashby:ramp | Structured compensation | Best salary coverage, structured addresses, remote flag |
| Workday | https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite | workday:nvidia.wd5/NVIDIAExternalCareerSite | From description | Full pagination; keywords use Workday's own search |
| SmartRecruiters | https://careers.smartrecruiters.com/ServiceNow | smartrecruiters:ServiceNow | From description | Department, function, remote/hybrid flags |
| Recruitee | https://bunq.recruitee.com | recruitee:bunq | Structured (when published) | Multiple locations, remote/hybrid/on-site |
| Workable | https://apply.workable.com/huggingface | workable:huggingface | – | Remote flag, employment type |
| Personio | https://1komma5grad.jobs.personio.de | personio:1komma5grad | – | Offices, department, schedule |
Also accepted: a company's careers page such as https://www.notion.com/careers (the actor finds the embedded Greenhouse/Lever/Ashby/… board), or a bare slug such as stripe (probed on Greenhouse, Lever, Ashby, SmartRecruiters, Workable and Recruitee).
Use cases
- Job aggregators and job boards – fill your board with fresh, first-party postings from hundreds of companies, deduplicated and normalized.
- Recruiters and talent teams – track openings at target companies, see which teams are hiring, and spot roles before they hit LinkedIn.
- Sales "hiring signal" leads – a company hiring 5 data engineers or its first RevOps manager is a buying signal. Feed new postings into your CRM daily.
- Market and salary research – compare pay ranges, remote policies and hiring velocity across companies, departments and countries.
- Job seekers and communities – build alerts for "remote + engineer + posted in the last 3 days" across your dream companies.
Input
| Field | Type | Description | Default |
|---|---|---|---|
companies | array | Career-site URLs, platform:slug, careers pages or slugs | Required |
keywords | array | Keep jobs matching ANY keyword (title, and description if enabled) | – |
keywordsInDescription | boolean | Also match keywords in the description | true |
excludeKeywords | array | Drop jobs whose title contains ANY of these | – |
locations | array | Keep jobs whose location contains ANY of these (city, region, country, "remote") | – |
remoteOnly | boolean | Only remote jobs | false |
departments | array | Keep jobs whose department/team contains ANY of these | – |
employmentTypes | array | full-time, part-time, contract, temporary, internship, other | – |
postedWithinDays | integer | Only jobs published in the last N days | – |
maxJobsPerCompany | integer | Cap per company | – |
maxResults | integer | Cap for the whole run | – |
includeDescription | boolean | Return descriptionHtml and descriptionText | true |
onlyNewSinceLastRun | boolean | Return only jobs not returned by earlier runs with the same input | false |
compactOutput | boolean | Slim items with only the key fields (ID, platform, company, title, department, location, remote, workplace, type, salary, date, URL). Best for AI agents | false |
maxConcurrency | integer | Companies fetched in parallel (1–10) | 5 |
proxyConfiguration | object | Optional proxy; not needed for public ATS feeds | none |
Example input
{"companies": ["https://job-boards.greenhouse.io/stripe","lever:palantir","https://jobs.ashbyhq.com/ramp","https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite","https://www.notion.com/careers"],"keywords": ["engineer", "developer"],"keywordsInDescription": false,"remoteOnly": true,"postedWithinDays": 14,"maxJobsPerCompany": 100}
Output
Every job has the same structure, whatever ATS it came from:
{"jobId": "ashby:notion:1fc309c8-da20-4ff2-84c7-8b863ece2b0a","platform": "ashby","company": {"name": "Notion","slug": "notion","careersUrl": "https://jobs.ashbyhq.com/notion"},"title": "Software Engineer, Developer Platform","department": "Engineering","team": "Engineering","location": "San Francisco, California; New York, New York","locations": [{ "city": "San Francisco", "region": "California", "country": "United States" },{ "city": "New York", "region": "New York", "country": "United States" }],"isRemote": true,"workplaceType": "hybrid","employmentType": "full-time","employmentTypeRaw": "FullTime","salary": {"min": 213000,"max": 320000,"currency": "USD","interval": "year","raw": "$213,000 - $320,000 per year","source": "description"},"postedAt": "2026-08-24T14:44:49.699Z","updatedAt": null,"applyUrl": "https://jobs.ashbyhq.com/notion/1fc309c8-da20-4ff2-84c7-8b863ece2b0a/application","jobUrl": "https://jobs.ashbyhq.com/notion/1fc309c8-da20-4ff2-84c7-8b863ece2b0a","descriptionText": "WHO WE ARE\n\nNotion is the collaborative AI workspace where teams and agents think together...","descriptionHtml": "<p><strong>WHO WE ARE</strong></p>...","scrapedAt": "2026-09-23T09:06:07.386Z"}
| Field | Description |
|---|---|
jobId | Stable unique ID platform:company:id – use it to deduplicate across runs |
platform | ATS the job came from |
company | name, slug and careersUrl |
title, department, team | As published by the company |
location | Raw location text from the ATS |
locations | Parsed list of { city, region, country } |
isRemote | true if the ATS marks the job remote or the location says remote |
workplaceType | remote, hybrid, onsite or null when unknown |
employmentType | Normalized: full-time, part-time, contract, temporary, internship, other (employmentTypeRaw keeps the original) |
salary | { min, max, currency, interval, raw, source } or null; source is ats (structured) or description (parsed from the text) |
postedAt, updatedAt | ISO 8601 dates |
applyUrl, jobUrl | Direct links to the posting and the application form |
descriptionText, descriptionHtml | Full description (when includeDescription is on) |
scrapedAt | When the job was collected |
The key-value store also contains:
SUMMARY– per-company and per-platform counts, limits reached.FAILED_COMPANIES– inputs that could not be resolved or fetched, with a reason (not_found,invalid_input,detection_failed,no_open_jobs,http_error). These are never charged.
Pricing
This actor uses pay-per-event pricing: a small fee per run plus a fee per job saved to the dataset. You only pay for results – invalid jobs are never saved, duplicates are removed, and failed companies cost nothing. Set a maximum cost per run in Apify Console and the actor stops cleanly when it is reached. See the Pricing tab for current prices.
FAQ
How do I monitor companies for new jobs?
Turn on onlyNewSinceLastRun and create an Apify Schedule (for example every morning). The actor remembers every job ID it has returned for that exact input (same companies and filters) and the next runs return only new postings, so you pay only for jobs you have not seen. Connect the run to Slack, email, Google Sheets, Make, Zapier or a webhook to get alerts. Changing the companies or filters starts a fresh history.
How do I find the right URL for a company?
Open the company's careers page and click any job. The address bar usually shows the ATS: job-boards.greenhouse.io/…, jobs.lever.co/…, jobs.ashbyhq.com/…, ….myworkdayjobs.com/…, and so on. You can also paste the careers page itself and let the actor detect it.
Why did a company fail?
Check FAILED_COMPANIES. The most common reasons are a wrong slug (not_found), a board with no open roles (no_open_jobs), or a careers page that uses an ATS we do not support yet (detection_failed). Failed companies are not charged.
Why is salary missing for some jobs? Many companies do not publish pay. Where the ATS has structured pay (Ashby, Lever, Recruitee) you get it directly; otherwise we extract ranges from the description text. We never guess.
How does the employment type filter treat jobs without a type?
Some ATS (for example Greenhouse) rarely publish an employment type. Titles like "Intern" or "Contractor" are recognized automatically; other jobs without a type are kept only when you select full-time.
Is this legal? The actor reads the public job-board feeds that companies publish so that their jobs can be embedded and shared. It does not log in, bypass protection, or collect personal data about candidates. You are responsible for using the data in line with applicable laws and the sites' terms.
Do I need a proxy? No. The feeds are public APIs. A proxy input is available if your network requires one.
Large Workday companies are slow – why?
Workday lists jobs 20 at a time and needs one extra request per job for the description. Turn off includeDescription (and keyword matching in descriptions) to skip the detail requests, or use maxJobsPerCompany.
Support
Found a company that does not work, or want another ATS supported? Open an issue on the actor's Issues tab – we usually respond within a day.
Related actors
- LinkedIn Jobs Scraper: job postings from LinkedIn search, across all companies.
- LinkedIn Company Scraper: company profiles with size, industry, headquarters and more.
- LinkedIn Company Employees Scraper: people working at a company, to find the hiring manager or recruiter.