Get every open job from any company's career site as clean, normalized JSON — one schema across six applicant tracking systems, with a delta mode that tells you exactly what is new, changed, or closed since your last run.
Give it a list of companies (board URLs, careers-page URLs, domains or just slugs). The Actor detects which ATS each company uses, reads the employer's official public job-board API, and returns one consistent record per job: title, department, location split into city/region/country, remote flag, employment type, salary range, description, apply URL and dates. No browser, no login, no proxies needed — so runs are fast and cheap.
Built and maintained by Steadyline Data.
Use cases
- Job boards and aggregators: a clean feed of first-party jobs from thousands of employers, refreshed daily with delta mode.
- Recruiting and sales intelligence: spot which target accounts are hiring (e.g. a first RevOps or security hire) and trigger outreach.
- Salary benchmarking: structured pay ranges from Greenhouse pay transparency, Ashby and Lever, plus ranges parsed from text.
- Market and competitor research: track a competitor's hiring by team and location over time.
- Job alerts for yourself or your community: scheduled runs + Slack, email or Google Sheets integration.
Why use it
- One schema for six ATSs. Stop writing six parsers. Greenhouse, Lever, Ashby, SmartRecruiters, Workable and Workday all come out in the same shape.
- Delta mode for scheduled runs. Run it daily; get only new and updated jobs plus closure notices. Unchanged jobs are billed at a quarter of the price and not repeated in your dataset.
- Salary where it exists. Structured pay ranges from Greenhouse pay transparency, Ashby compensation and Lever salary ranges; optional extraction from description text for the rest (
salarySourcetells you which). - Auto-detection. Paste
figma.comorhttps://www.notion.so/careersand the Actor finds the board for you. - Up to ~6× cheaper than per-job alternatives at $0.012/job: here it is $0.002 per job, $0.0005 per unchanged job.
Supported ATSs
| ATS | Input examples | Source endpoint (public) | Tested with |
|---|---|---|---|
| Greenhouse | https://boards.greenhouse.io/figma, greenhouse:discord |
Job Board API (boards-api.greenhouse.io) |
Figma, Discord, Stripe, Airbnb |
| Lever | https://jobs.lever.co/spotify, lever:palantir |
Postings API (api.lever.co, EU fallback) |
Spotify, Palantir |
| Ashby | https://jobs.ashbyhq.com/ramp, ashby:notion |
Posting API (api.ashbyhq.com) |
Ramp, Notion |
| SmartRecruiters | https://jobs.smartrecruiters.com/Canva, smartrecruiters:BoschGroup |
Posting API (api.smartrecruiters.com) |
Canva, Bosch |
| Workable | https://apply.workable.com/huggingface, workable:skroutz |
Public widget API (apply.workable.com) |
Hugging Face, Skroutz |
| Workday | https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite |
Career-site JSON (/wday/cxs/…) |
NVIDIA, Salesforce, Workday |
Each entry can be a board URL, a single job URL, a company careers page, a bare domain, ats:slug, or a plain slug (probed across the slug-based ATSs). Prefix a label with | to set the company name: Acme Inc | lever:acme. Workday short form: workday:tenant.wdN/SiteName.
Input example
{
"companies": [
"https://boards.greenhouse.io/figma",
"lever:spotify",
"ramp.com",
"https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
],
"keywords": ["engineer", "data scientist"],
"locations": ["US", "Remote"],
"postedWithinDays": 30,
"maxJobs": 1000,
"deltaMode": true
}
Filters: keywords (title/department/team, whole word, plurals allowed), excludeKeywords, locations (text or 2-letter country code, or Remote), remoteOnly, postedWithinDays, employmentTypes. Limits: maxJobs (whole run) and maxJobsPerCompany. Output toggles: includeDescriptionText, includeDescriptionHtml, extractSalaryFromText, fetchDetails.
Use it from AI agents, the API or no-code tools
Add Apify's hosted MCP server with just this tool:
{
"mcpServers": {
"ats-jobs-feed": { "url": "https://mcp.apify.com?tools=steadyline/ats-jobs-feed" }
}
}
Sign in with Apify (OAuth) on first connect, or send an Authorization: Bearer <APIFY_TOKEN> header. Then ask your agent, for example:
Use steadyline/ats-jobs-feed to list every remote data-engineering job currently open at figma.com, ramp.com and notion.so, with salary ranges.
See MCP setup for Claude, Cursor and VS Code or add all tools at once.
REST API
Run it and get results in one call:
curl -X POST "https://api.apify.com/v2/acts/steadyline~ats-jobs-feed/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"companies": ["https://boards.greenhouse.io/figma", "https://jobs.lever.co/spotify", "https://jobs.ashbyhq.com/ramp"], "maxJobs": 60, "maxJobsPerCompany": 20}'No-code
Use the official Apify app in Zapier ("Run Actor"), Make ("Run an Actor") or n8n (Apify node), choose steadyline/ats-jobs-feed, then send the dataset items to Google Sheets, Slack, a CRM or a database.
Pricing
Pay per event on Apify, no subscription. Prices are read from the public Apify Store listing; the Store page is authoritative.
| Event | Price | Per 1,000 |
|---|---|---|
| Job result Charged per job record returned (new or changed). | $0.002 | $2.00 |
| Unchanged job Charged per job skipped as unchanged in delta mode. | $0.0005 | $0.50 |
| Actor start (Apify standard) Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). | $0.00005 | – |
Works well with
- Hiring-signal prospecting: run this Actor daily in delta mode with keywords like
revopsorsalesforce, then enrich hiring companies with Tech Stack Detector and Website Contact Extractor. - Competitor monitoring: pair it with Site Discovery (
lastmodSince) to see new pages and new roles from the same competitor each week. - Related: Tech Stack Detector, Website Contact Scraper, Site Discovery (sitemaps, robots.txt, llms.txt).
FAQ
Do I need proxies or an account with the ATS?
No. Every source is the employer's public job-board endpoint, the same data the careers page shows anonymously. Proxy settings are available but optional.
Why is a salary missing?
Many employers don't publish pay. Structured fields are used first; with extractSalaryFromText (on by default) the Actor also reads pay ranges written in the description.
Can I get the HTML description?
Yes, set includeDescriptionHtml: true.
How do I run it on a schedule?
Create an Apify Schedule with delta mode on and connect a webhook or integration (Slack, Google Sheets, Make, Zapier) to the dataset.
Acceptable use
This Actor collects only publicly posted job advertisements from employers' official public job-board endpoints — information companies publish so that candidates can find and apply to their jobs. It does not log in, bypass access controls, or collect personal data: recruiter or hiring-manager names and contact details are never extracted, and e-mail addresses found in job descriptions are redacted. You are responsible for using the data in line with applicable laws and the terms of the respective sites. Job content remains the property of the posting employer.