ATS Jobs Search API: Greenhouse, Lever & Ashby Career Site Jobs avatar

ATS Jobs Search API: Greenhouse, Lever & Ashby Career Site Jobs

Pricing

$2.00 / 1,000 jobs

Go to Apify Store
ATS Jobs Search API: Greenhouse, Lever & Ashby Career Site Jobs

ATS Jobs Search API: Greenhouse, Lever & Ashby Career Site Jobs

Greenhouse jobs API, Lever jobs API and Ashby jobs search in one: ATS job search over 10,330 bundled career site boards (about 315k open jobs, checked 2026-10-21), plus Workday and 4 more. New jobs in the last hour, 24 h or week. $0.002 per job.

Pricing

$2.00 / 1,000 jobs

Rating

0.0

(0)

Developer

Data Gleaner

Data Gleaner

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

2 minutes ago

Last modified

Categories

Share

A Greenhouse jobs API, Lever jobs API and Ashby jobs API in one: ATS job search across career site jobs and job postings, read live on every run. Search 10,330 bundled career boards by job title, or paste any career-page URL. Filter to new jobs in the last hour, 24 hours or week with timeRange, and to one ATS with ats. Each job comes in one format: title, department, location, remote flag, salary range when published, posted date and apply link. Also reads Workday, SmartRecruiters, Workable, Recruitee and Personio pages. No login, no browser, no proxy.

Coverage, measured: 10,330 bundled boards (5,494 Greenhouse, 1,566 Lever, 3,270 Ashby). The 8,177 boards bundled on 2026-10-08 were still about 97% live in a 400-board sample on 2026-10-20; 2,153 more were added on 2026-10-21, each one answering with at least one open job that day. A full scan on 2026-10-21 reached 10,288 of the 10,330 boards (42 no longer exist). That is roughly 315,000 open jobs (estimate, plus or minus 25%).

Price: $0.002 per job ($2 per 1,000), no start fee. See Pricing below.

Why use this one

  • One format for 8 ATSes. The same fields whether the job is on Greenhouse or Workday, with ats telling you which.
  • Salary as numbers (salaryMin, salaryMax, currency, period) where the company publishes pay: Ashby, Lever, Recruitee and Greenhouse.
  • Live, not a stale index. Any company you name is fetched when you run, and a guessed company board is dropped if its name does not match, so you do not get another company's jobs.
  • Only new jobs on a schedule. onlyNewSinceLastRun returns and bills only jobs not seen in earlier runs.
  • Press Start and see results. The form is prefilled with a search of all bundled boards for engineer jobs posted in the last 7 days (100 jobs, about $0.20).
  • New jobs in the last hour, 24 hours or week. Set timeRange to 1h, 24h or 7d.
  • Honest limit: only public, open jobs; plain-name lookup tries Greenhouse, Lever and Ashby only (paste the URL for the others); Workday, SmartRecruiters, Workable and Personio do not publish structured pay.

Minimal input

{"companies": ["https://boards.greenhouse.io/stripe", "https://jobs.ashbyhq.com/openai"], "titleKeywords": ["engineer"], "maxItems": 50}

Sample output row (real platform run, description left out)

{
"company": "OpenAI",
"ats": "ashby",
"title": "Research Engineer",
"department": "Research",
"locations": [
"San Francisco"
],
"city": "San Francisco",
"country": "US",
"employmentType": "full_time",
"salary": {
"min": 250000,
"max": 445000,
"currency": "USD",
"period": "year"
},
"salaryText": "USD 250,000-445,000 / year",
"postedAt": "2025-04-05T00:03:20+00:00",
"applyUrl": "https://jobs.ashbyhq.com/openai/240d459b-696d-43eb-8497-fab3e56ecd9b/application",
"jobUrl": "https://jobs.ashbyhq.com/openai/240d459b-696d-43eb-8497-fab3e56ecd9b",
"boardUrl": "https://jobs.ashbyhq.com/openai",
"source": "https://jobs.ashbyhq.com/openai",
"scrapedAt": "2026-10-11T07:11:28+00:00"
}

What you get

One item per job, with the same fields whatever the ATS:

FieldMeaning
company, companySlugThe company's display name and its board name on the ATS
atsgreenhouse, lever, ashby, workday, smartrecruiters, workable, recruitee or personio
jobIdThe ATS's own job ID. Jobs are de-duplicated on ats + jobId
boardUrlThe company's career page on the ATS
title, department, teamAs the company lists them (team is only filled by ATSes that have one)
locationsList of location strings
workArrangementremote, hybrid or onsite, from the ATS's workplace type or the location text; null when not stated
remotetrue for fully remote, false for hybrid or on-site, null when unknown
employmentTypefull_time, part_time, contract, internship, temporary or other
seniorityintern, junior, senior, lead, manager, principal, director or executive, read from the title; null when the title says nothing
salary{min, max, currency, period} when the job lists pay, otherwise null
salaryMin, salaryMax, salaryCurrency, salaryPeriod, salaryTextThe same pay as flat columns (salaryText is a readable string); all null when no pay is listed
postedAt, updatedAtISO 8601 UTC. updatedAt is null where the ATS has no such date
applyUrl, jobUrlLink to apply, and link to the job page
descriptionText, descriptionHtmlFull description (when "Include job descriptions" is on)
source, scrapedAtThe entry you gave (or bundled-list), and when the item was fetched

Not every ATS publishes every field. Salary comes through on Ashby, Lever (when the company fills it in), Recruitee, and Greenhouse (from the pay range the company publishes on the job; this needs "Include job descriptions" on, because Greenhouse pay comes with the job detail). The other ATSes do not expose pay in structured form, so salary is null for them.

Input examples

Jobs at a few companies (paste any career-page URLs):

{
"companies": [
"https://boards.greenhouse.io/stripe",
"https://jobs.lever.co/spotify",
"https://jobs.ashbyhq.com/openai",
"https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
"https://jobs.smartrecruiters.com/ServiceNow",
"https://apply.workable.com/huggingface",
"https://bunq.recruitee.com"
],
"titleKeywords": ["data engineer", "analytics"],
"locations": ["London", "Remote"],
"postedWithinDays": 30,
"maxJobsPerCompany": 50
}

A company name or website instead of a URL (the Actor probes Greenhouse, Lever and Ashby):

{ "companies": ["Anthropic", "datadog.com", "greenhouse:airbnb"] }

Search the bundled list for a job title:

{
"searchAllCompanies": true,
"titleKeywords": ["machine learning engineer"],
"timeRange": "24h",
"ats": ["lever", "greenhouse"],
"remoteOnly": true,
"maxJobsPerCompany": 5,
"maxItems": 500
}

Input fields

  • companies: career-page URLs, ats:slug shortcuts (for example lever:spotify), company names or websites.
  • titleKeywords: keep a job if its title contains any of these words.
  • excludeTitleKeywords: drop jobs whose title contains any of these words (for example intern, sales). Applied after titleKeywords.
  • departments: keep a job if its department or team contains any of these texts. Jobs from companies that publish no department are left out when this is set.
  • locations: keep a job if any of its locations contains any of these texts.
  • remoteOnly: keep only jobs the ATS marks as remote.
  • postedWithinDays: keep jobs posted or updated in the last N days. Jobs with no date are kept.
  • timeRange: 1h, 24h, 7d or 30d. Keeps jobs posted or updated in that window, with hour precision where the ATS publishes a timestamp (Greenhouse, Lever and Ashby do). Jobs with no date are kept. The later cut-off wins if postedWithinDays or postedAfter is also set.
  • ats: only return jobs from these ATSes (greenhouse, lever, ashby, workday, smartrecruiters, workable, recruitee, personio). Empty means all.
  • postedAfter: keep jobs posted or updated on or after this date (YYYY-MM-DD). Jobs with no date are kept. If postedWithinDays is also set, the later cut-off wins.
  • maxJobsPerCompany (default 20), maxItems (default 200; the form prefills 100): limits per company and for the whole run.
  • includeDescription (default on): turn off for a faster run.
  • searchAllCompanies: search the bundled boards. concurrency (default 10, max 20) sets how many companies are fetched in parallel.
  • requestDelaySeconds (default 0.2), proxyConfiguration: pacing between page requests, and an optional proxy.
  • onlyNewSinceLastRun (default off), stateKey (default default): monitor mode, see below.

Personio boards work the same way: paste https://<company>.jobs.personio.de. A run with no companies and the search switched off returns a 5-job example from OpenAI's Ashby board.

Scheduled monitoring

Set onlyNewSinceLastRun to true on a scheduled run and the Actor returns, and charges for, only jobs that earlier runs with the same stateKey have not already returned. Use a different stateKey for each schedule or search so they do not share memory. The list of seen jobs is kept in the named key-value store career-jobs-state on your account. It is ignored in the built-in example run.

{ "companies": ["lever:spotify"], "titleKeywords": ["engineer"], "onlyNewSinceLastRun": true, "stateKey": "spotify-engineering" }

Output example

{
"company": "OpenAI",
"companySlug": "openai",
"ats": "ashby",
"jobId": "8fb1615c-34bf-47c4-a1d1-b7b2f836bbd3",
"title": "Technical Program Manager, Compute Infrastructure",
"department": "Technical Program Management",
"team": "Technical Program Management",
"locations": ["San Francisco"],
"workArrangement": null,
"remote": null,
"employmentType": "full_time",
"seniority": null,
"salary": { "min": 257000, "max": 335000, "currency": "USD", "period": "year" },
"salaryMin": 257000,
"salaryMax": 335000,
"salaryCurrency": "USD",
"salaryPeriod": "year",
"salaryText": "USD 257,000-335,000 / year",
"postedAt": "2026-03-12T16:38:15+00:00",
"updatedAt": null,
"applyUrl": "https://jobs.ashbyhq.com/openai/8fb1615c-34bf-47c4-a1d1-b7b2f836bbd3/application",
"jobUrl": "https://jobs.ashbyhq.com/openai/8fb1615c-34bf-47c4-a1d1-b7b2f836bbd3",
"boardUrl": "https://jobs.ashbyhq.com/openai",
"descriptionText": "ABOUT THE TEAM ...",
"descriptionHtml": "<h3><strong>About the Team</strong></h3> ...",
"source": "https://jobs.ashbyhq.com/openai",
"scrapedAt": "2026-10-08T15:32:10+00:00"
}

Pricing

Price: $0.002 per job ($2 per 1,000 jobs, pay per event, event name job), in force from 21 October 2026. You pay only for jobs that are returned. Set a maximum total charge on the run and the Actor stops when it is reached.

Worked example: you track 40 companies and each run returns about 250 matching jobs. One run costs 250 x $0.002 = $0.50. Running it daily for a month costs about $15.

Use with Python

# pip install apify-client
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("datagleaner/career-jobs-scraper").call(run_input={
"companies": ["https://boards.greenhouse.io/stripe", "https://jobs.ashbyhq.com/openai"],
"titleKeywords": ["engineer"],
"maxItems": 10,
"includeDescription": False,
})
for job in client.dataset(run.default_dataset_id).iterate_items():
print(job["company"], "|", job["title"], "|", job["locations"], "|", job["jobUrl"])

This run returns at most 10 jobs.

Use with JavaScript / Node.js

// npm install apify-client
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('datagleaner/career-jobs-scraper').call({
companies: ['https://jobs.lever.co/spotify', 'https://jobs.ashbyhq.com/openai'],
titleKeywords: ['data'],
maxItems: 10,
includeDescription: false,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const job of items) console.log(job.company, '|', job.title, '|', job.locations, '|', job.jobUrl);

Use it from n8n, Make, Zapier or an AI agent

Actor ID: datagleaner/career-jobs-scraper

Minimal input:

{"companies": ["https://boards.greenhouse.io/stripe"], "maxItems": 10}

Each tool below runs this Actor with your own Apify API token.

  • n8n: add the Apify node (@apify/n8n-nodes-apify). On n8n Cloud you install it from the community node registry. Choose Run an Actor and get dataset, set Actor to datagleaner/career-jobs-scraper and paste the input above.

  • Make: use the Apify app's Run an Actor module, then Get Dataset Items to read the results. Watch Actor Runs can trigger a scenario when a run finishes.

  • Zapier: use the Apify action Run Actor, then the search Fetch dataset items. The trigger Finished Actor run starts a Zap when a run ends.

  • AI agents (MCP): connect to https://mcp.apify.com?tools=datagleaner/career-jobs-scraper. In Claude Code:

      claude mcp add --transport http apify "https://mcp.apify.com?tools=datagleaner/career-jobs-scraper"
    

    Then run /mcp to sign in to Apify in your browser. Then ask in plain language, for example: "Find remote machine learning engineer jobs posted in the last 14 days at Stripe, OpenAI and Spotify, and give me a table with company, title, location, salary and apply link." The agent calls the Actor with companies, titleKeywords, remoteOnly and postedWithinDays, then reads the jobs from the run's dataset. Without the tools parameter the server can still find this Actor with its search-actors tool.

  • LangChain (Python):

# pip install langchain-apify, then set APIFY_TOKEN in your environment
import json
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("datagleaner/career-jobs-scraper")
result = tool.invoke({"run_input": json.loads('{"companies": ["https://boards.greenhouse.io/stripe"], "maxItems": 10}')})

Use cases

  • Job boards and aggregators that need fresh listings from many employers.
  • Recruiters and sales teams watching which companies are hiring for a role (a hiring signal for sales outreach).
  • Salary research from jobs that publish pay ranges.
  • Labour-market analysis: job counts by company, department, location or ATS.

Limits

  • Only open, public jobs are returned. Closed jobs and anything behind a login are not visible.
  • Plain-name lookup only tries Greenhouse, Lever and Ashby. For the other ATSes, paste the career-page URL.
  • The bundled list covers Greenhouse, Lever and Ashby boards. It was built on 2026-10-08 and extended on 2026-10-21, and boards that have since closed are skipped without error. Boards added after that date are not in it; add them in companies.
  • Lever boards hosted in the EU region are found when you paste their URL; the bundled list holds global boards.
  • Workday returns at most 2,000 jobs per company, and its descriptions need one extra request per job.

FAQ

How do I scrape Greenhouse, Lever, Ashby or Workday jobs? Paste the company's board URL into companies (for example https://boards.greenhouse.io/stripe or https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite). The Actor detects the ATS and returns every open job in the same format.

Can I search jobs across many companies at once? Yes. Switch on searchAllCompanies, set titleKeywords, and the Actor searches 10,330 bundled Greenhouse, Lever and Ashby boards, stopping at maxItems.

Does it return salary? When the company publishes pay: on Ashby, Lever, Recruitee and Greenhouse. Workday, SmartRecruiters, Workable and Personio do not expose pay in structured form, so salary is null there.

Does it need a proxy? No. The endpoints are public and work from Apify's datacenter IPs. A proxy field is there if you want one.

How do I find the right URL for a company? Open the company's careers page and click a job. If the address contains greenhouse.io, lever.co, ashbyhq.com, myworkdayjobs.com, smartrecruiters.com, workable.com, recruitee.com or personio.de, paste the board part of it (for example https://jobs.lever.co/spotify).

Why is remote sometimes null? Some ATSes do not say whether a job is remote. null means unknown, not on-site. With remoteOnly on, unknown jobs are left out.

Why is a company missing from a search? It may not be on Greenhouse, Lever or Ashby, or not in the bundled list. Add its URL to companies.

How fresh is the data? It is fetched live on every run.

How long does a search across all companies take? Scanning every bundled board (about 15,700 requests, since Greenhouse boards need a second call for departments) took about 6 minutes at the default concurrency in our 2026-10-21 test, with a rare keyword that matched almost nothing. A run stops as soon as maxItems is reached, so a common title returns much sooner.

Responsible use

This Actor reads public job postings that companies publish for anyone to see. Job postings can name a recruiter or hiring manager; if you store or contact people from this data, you are responsible for following the data-protection and anti-spam rules that apply to you. Respect each company's terms, and keep the request rate modest.