Greenhouse Jobs Scraper: Lever & Ashby Job Boards API avatar

Greenhouse Jobs Scraper: Lever & Ashby Job Boards API

Pricing

from $1.40 / 1,000 jobs

Go to Apify Store
Greenhouse Jobs Scraper: Lever & Ashby Job Boards API

Greenhouse Jobs Scraper: Lever & Ashby Job Boards API

Get all open jobs from company boards on Greenhouse, Lever and Ashby (official public APIs). Use for a company's current openings. Input: greenhouseBoards, leverCompanies, ashbyBoards or careerUrls; filters keyword, remoteOnly, postedSince. Output per job: title, company, location, salary, URL.

Pricing

from $1.40 / 1,000 jobs

Rating

0.0

(0)

Developer

Phaux

Phaux

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

A Greenhouse jobs scraper that also reads Lever and Ashby job boards. Give it company board tokens or board URLs and get their open job listings as JSON, CSV or Excel, ready for job boards, hiring-signal tracking or recruiting research.

Scrape every open job from any company that hires through Greenhouse, Lever or Ashby. Jobs from all three applicant tracking systems (ATS) come back in one normalized schema with title, location, remote flag, department, employment type, salary range (when published), posting date, apply link and the full description. Filters for keyword, location, remote, department and posting date run before anything is saved, so you pay only for the jobs you keep.

Quick start for AI agents and API users

  • What it does: Get all open jobs from company boards on Greenhouse, Lever and Ashby (official public APIs).
  • When to use it: For a company's current openings.
  • Example input (the form's prefill; it finishes in under a minute):
{
"greenhouseBoards": [
"stripe",
"discord"
],
"leverCompanies": [
"spotify"
],
"ashbyBoards": [
"linear"
]
}
  • Example output: one real dataset row from run QUo9tp35NZqHGu1YN (2026-10-23), with long fields shortened and empty fields left out. Fields not shown are listed in the output table below.
{
"platform": "ashby",
"companyToken": "linear",
"company": "linear",
"jobId": "d3bc1ced-3ce4-4086-a050-555055dbb1ff",
"title": "Senior / Staff Fullstack Engineer",
"location": "Europe",
"allLocations": [
"Europe"
],
"isRemote": true,
"workplaceType": "remote",
"department": "Product",
"team": "Engineering",
"employmentType": "FullTime",
"postedAt": "2021-04-27T20:13:45.158000Z",
"jobUrl": "https://jobs.ashbyhq.com/linear/d3bc1ced-3ce4-4086-a050-555055dbb1ff",
"applyUrl": "https://jobs.ashbyhq.com/linear/d3bc1ced-3ce4-4086-a050-555055dbb1ff/application",
"employmentTypeNormalized": "FULL_TIME"
}
  • Cost (pay per event, Free-plan prices): job $0.002. Failed items are not charged.
  • From an AI agent: with the Apify MCP server, call call-actor with actor phaux/ats-jobs-greenhouse-lever-ashby, or load it as its own tool with https://mcp.apify.com?tools=phaux/ats-jobs-greenhouse-lever-ashby. Read results with get-dataset-items.

What does Greenhouse, Lever & Ashby Jobs Scraper do?

  • Reads the platforms' official public job-board APIs, the same feeds that power each company's careers page:
    • Greenhouse: boards-api.greenhouse.io
    • Lever: api.lever.co and api.eu.lever.co
    • Ashby: api.ashbyhq.com/posting-api
  • Accepts company tokens (stripe) or board URLs (https://jobs.lever.co/spotify), in any mix.
  • Normalizes the three formats into one record per job and de-duplicates across the run.
  • Removes recruiter and hiring-manager names, email addresses, mailto: links and phone numbers from descriptions.

No browser, no HTML scraping, no login and no proxy. Typical runs finish in seconds.

Why use it?

  • Reliable: documented JSON APIs don't break when a careers page is redesigned.
  • One bad board doesn't stop the run: unknown tokens are listed in BOARD_ERRORS, cost nothing, and the other boards still run.
  • Filters before charging: jobs removed by your filters are never saved or charged.
  • No start fee and no minimum.
  • One schema for three ATS platforms, with employment type mapped to FULL_TIME, PART_TIME, CONTRACT, INTERNSHIP or TEMPORARY.

Use cases: job aggregators and job boards, hiring-signal and sales-intelligence feeds, labor-market research, salary benchmarking, and alerts for new roles at target companies.

How to use it

  1. Find each company's board token in its careers link (see "Where's the token?" below), or paste the board URL.
  2. Put Greenhouse, Lever and Ashby boards in their fields, or any board URL in careerUrls.
  3. Optionally set filters (keyword, location, remoteOnly, department, postedSince) and a cost cap (maxItems).
  4. Run the Actor and download the dataset as JSON, CSV, Excel or HTML, or read it through the Apify API.

Where's the token?

  • Greenhouse: the part after boards.greenhouse.io/ or job-boards.greenhouse.io/. Embedded boards (boards.greenhouse.io/embed/job_board?for=<token>) work too.
  • Lever: the part after jobs.lever.co/.
  • Ashby: the part after jobs.ashbyhq.com/.
  • Company-hosted careers pages are not crawled. Give the Greenhouse, Lever or Ashby board URL they link to.

Input

{
"greenhouseBoards": ["stripe", "https://job-boards.greenhouse.io/discord"],
"leverCompanies": ["spotify"],
"ashbyBoards": ["https://jobs.ashbyhq.com/linear"],
"careerUrls": ["https://jobs.lever.co/zoox"],
"keyword": "engineer, data",
"location": "new york, london, remote",
"remoteOnly": false,
"department": "engineering",
"postedSince": "7 days",
"includeDescription": true,
"maxItemsPerBoard": 0,
"maxItems": 0
}

All text filters are case-insensitive and accept several comma-separated values (any match keeps the job). keyword matches the title; turn on keywordInDescription to search descriptions too. postedSince takes a date (2026-10-01) or a period (24 hours, 7 days, 2 weeks).

FieldTypeDefaultDescription
greenhouseBoardsarray—Board tokens (e.g. 'stripe') or URLs like https://boards.greenhouse.io/stripe or https://job-boards.greenhouse.io/stripe.
leverCompaniesarray—Lever site names (e.g. 'spotify') or URLs like https://jobs.lever.co/spotify. EU-hosted sites are found automatically.
ashbyBoardsarray—Ashby board names (e.g. 'linear') or URLs like https://jobs.ashbyhq.com/linear.
careerUrlsarray—Mixed Greenhouse / Lever / Ashby board URLs; the platform is detected from the URL. Company-domain career pages are not scraped.
keywordstring—Comma-separated; a job matches if its title contains any of them (case-insensitive).
keywordInDescriptionbooleanfalseOff: keywords match the job title only. On: also match the description text.
locationstring—Comma-separated; matches any location of the job (e.g. 'London, New York, remote').
remoteOnlybooleanfalseKeep only jobs the platform marks remote (Lever/Ashby) or whose location/office says remote (Greenhouse).
departmentstring—Comma-separated, e.g. 'engineering, data'.
postedSincestring—A date (2026-10-01) or a period ('24 hours', '7 days', '2 weeks'). Uses the posted date, or the updated date where the platform gives no posted date.
includeDescriptionbooleantrueTurn off for smaller, faster output without descriptionHtml/descriptionText.
maxItemsPerBoardinteger0Maximum number of jobs saved from each board, after filters. 0 = no limit.
maxItemsinteger00 = no limit. You are only charged for jobs actually saved.
maxConcurrencyinteger4How many boards to fetch at once (1-8).
minRequestIntervalSecsstring"0.5"Politeness delay between requests to the same API host.
proxyConfigurationobject{"useApifyProxy": false}Not needed: these are official public APIs. Leave off.

Output example

One dataset item per job:

{
"platform": "greenhouse",
"company": "Discord",
"companyToken": "discord",
"jobId": "8806482002",
"title": "Commercial Policy Lead",
"location": "San Francisco Bay Area",
"allLocations": ["San Francisco Bay Area", "Remote (US)"],
"isRemote": true,
"workplaceType": null,
"department": "Policy",
"team": null,
"employmentType": null,
"employmentTypeNormalized": null,
"postedAt": "2026-09-15T16:52:11Z",
"updatedAt": "2026-10-15T20:08:17Z",
"jobUrl": "https://job-boards.greenhouse.io/discord/jobs/8806482002",
"applyUrl": "https://job-boards.greenhouse.io/discord/jobs/8806482002",
"salary": null,
"descriptionHtml": "<div class=\"content-intro\">…",
"descriptionText": "Discord has a highly engaged community…",
"scrapedAt": "2026-10-20T10:50:00Z"
}

Output fields

FieldTypeDescription
platformstringSource ATS: greenhouse, lever or ashby.
companyTokenstring or nullThe company's job-board token on that platform.
companystring or nullCompany name.
jobIdstring/number or nullJob ID on the source platform.
titlestring or nullJob title.
locationstring or nullPrimary location.
allLocationsarray or nullAll listed locations.
isRemoteboolean or nullWhether the job is remote.
workplaceTypestring or nullremote, hybrid or onsite, when the platform says.
departmentstring or nullDepartment.
teamstring or nullTeam.
employmentTypestring or nullEmployment type as posted.
employmentTypeNormalizedstring or nullNormalized employment type.
postedAtstring or nullPosting date (ISO 8601).
updatedAtstring or nullLast update (ISO 8601).
jobUrlstring or nullPublic job page URL.
applyUrlstring or nullApplication URL.
salaryobject or nullPay range: min, max, currency, interval, summary.
countrystring or nullCountry (Lever only).
descriptionHtmlstring or nullJob description HTML.
descriptionTextstring or nullJob description as plain text, contact details removed.
scrapedAtstring or nullWhen the job was fetched (ISO 8601).

Notes:

  • Dates are UTC ISO 8601. postedAt comes from Greenhouse first_published, Lever createdAt and Ashby publishedAt. Only Greenhouse provides updatedAt.
  • isRemote uses the platform's own remote or workplace flag on Lever and Ashby. Greenhouse has no such flag, so it is detected from location and office names.
  • salary is filled only when the company publishes a pay range.
  • company is the display name on Greenhouse. On Lever and Ashby it is the board token, because their APIs don't return a display name.

The run also saves two key-value records: RUN_STATS (boards OK or failed, jobs seen, filtered, duplicates and saved) and BOARD_ERRORS (each bad or unsupported input, with the reason).

How much does it cost?

Pay per event: you pay only for each job saved to your dataset. There's no start fee and no minimum, and Apify platform usage is included.

Apify planPrice per jobPer 1,000 jobs
Free$0.0020$2.00
Bronze (Starter)$0.0018$1.80
Silver (Scale)$0.0016$1.60
Gold, Platinum, Diamond (Business+)$0.0014$1.40

Example: 500 jobs on the Free plan cost $1.00. Boards that fail or don't exist, jobs removed by your filters, and duplicates are free. Set maxItems to cap the cost of any run.

Use with AI agents, MCP and the API

  • MCP: add https://mcp.apify.com?tools=phaux/ats-jobs-greenhouse-lever-ashby to any MCP client (Claude, Cursor, VS Code and others) and call it as a tool.
  • API: POST https://api.apify.com/v2/acts/phaux~ats-jobs-greenhouse-lever-ashby/run-sync-get-dataset-items with the input JSON returns the jobs directly.
  • No field is required by the schema (give at least one board), and each field's type, default and meaning are documented in the input schema, so agents can build valid inputs without guessing.

Data source and compliance

  • Only public, unauthenticated, documented job-posting APIs are used. Companies publish these listings so that people can find and apply to them.
  • Requests go only to the three official API hosts. Any other host, including redirects, is refused.
  • Requests are paced: at least 0.5 s between requests to the same API host, and at most 4 boards at once. Errors are retried with backoff, and Retry-After is respected.
  • Recruiter and hiring-manager contact details are removed. No candidate or employee data is collected.
  • You are responsible for how you use the data, for example honoring each company's terms when you republish listings.

Limits

  • Greenhouse, Lever and Ashby only. Workday, SmartRecruiters, iCIMS and other ATS platforms aren't supported.
  • Company-hosted careers pages aren't crawled; give the ATS board token or URL instead.
  • The data is whatever each company publishes on its board, at the moment of the run.

FAQ

  • A company isn't found. Check the token in its careers URL. Ashby tokens can be case-sensitive. Lever EU boards are detected automatically.
  • Zero jobs from a valid board. The company currently has no open postings. Nothing is charged.
  • Can I schedule it? Yes. Use an Apify schedule with postedSince: "24 hours" to get only new jobs each day.
  • Something isn't working? Open an issue on the Issues tab with the run ID.