Steadyline Data
Home / Tools / ATS Jobs Feed
Jobs & hiring

Greenhouse, Lever, Ashby & Workday Jobs Scraper

Scrape every open job from Greenhouse, Lever, Ashby, Workday, SmartRecruiters and Workable career boards into one normalized JSON schema: salary, remote flag, location parts, apply URL. Auto-detects the ATS from a domain. Delta mode flags new and closed jobs.

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 (salarySource tells you which).
  • Auto-detection. Paste figma.com or https://www.notion.so/careers and 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.

EventPricePer 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–

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.