Greenhouse, Lever & Ashby Jobs Scraper - New Postings Mode avatar

Greenhouse, Lever & Ashby Jobs Scraper - New Postings Mode

Pricing

Pay per event

Go to Apify Store
Greenhouse, Lever & Ashby Jobs Scraper - New Postings Mode

Greenhouse, Lever & Ashby Jobs Scraper - New Postings Mode

Scrape every job posting from any company's Greenhouse, Lever, or Ashby careers board into one clean, unified schema. Modes report only freshly posted jobs, or jobs that closed since your last run. Includes title, department, location, compensation, and apply URL.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Halven Labs

Halven Labs

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

17 hours ago

Last modified

Share

Greenhouse, Lever & Ashby Jobs Scraper — New Postings Mode

Scrape every job posting from any company's Greenhouse, Lever, or Ashby careers board into one clean, unified schema — title, department, location, employment type, remote flag, description, and apply URL. Mix and match companies from all three platforms in a single run. Export to CSV, Excel, JSON, or Google Sheets.

Ideal for job aggregators, recruiters and sourcers, market/compensation research, and competitive hiring intelligence.


🎯 Why use this actor

  • Skip the manual career-page checking — get every open role from any company across three platforms in one run, instead of clicking through boards one by one.
  • Spot hiring signals early — a company ramping up hiring in a department is a strong buying/investment/competitive signal, before it's public news.
  • Never miss a change — new-postings and closed-postings mode tell you exactly what's new or gone since your last check, so you can run this on a schedule instead of re-checking by hand.

✨ Features

  • Three ATS platforms, one schema — Greenhouse, Lever, and Ashby jobs come back with identical fields, so you never write per-platform mapping code.
  • Whole board in one run — pulls the complete list of open roles per company.
  • Flexible board input — accept greenhouse:token, lever:token, ashby:token, or full board URLs (https://boards.greenhouse.io/…, https://jobs.lever.co/…, https://jobs.ashbyhq.com/…).
  • Built-in filtering — keep only jobs matching title keywords and/or a location.
  • Clean descriptions — plain-text description always included; raw HTML optional.
  • Remote detection — normalized remote boolean and workplaceType across all three platforms.
  • Compensation, when published — Ashby's salary/equity ranges come through in compensationSummary.
  • New-postings mode — every row is flagged isNew; turn on onlyNewJobs to get only postings that didn't exist last time you ran this actor. Perfect for scheduled runs.
  • Closed-postings detection — optionally emit a row (isClosed) for jobs that disappeared from a board since your last run — filled or taken down.
  • Fast & cheap — reads the official public JSON boards over plain HTTP; no browser needed.
  • Bounded & robustmaxItems caps output; a bad board never crashes the run.

🚀 Quick start

  1. Add company boards in Company job boards (e.g. greenhouse:gitlab, lever:palantir, ashby:ashby).
  2. (Optional) Add title keywords or a location filter, or raise Max jobs.
  3. Click Start. The default input runs successfully with zero edits.

Example input

{
"boards": ["greenhouse:gitlab", "https://jobs.lever.co/palantir", "ashby:ashby"],
"maxItems": 100,
"titleKeywords": ["engineer", "product"],
"locationQuery": "remote",
"includeDescriptionHtml": false,
"onlyNewJobs": false,
"includeClosedJobs": false,
"proxyConfiguration": { "useApifyProxy": true }
}
FieldTypeDefaultDescription
boardsarray(required)Boards as greenhouse:token, lever:token, ashby:token, or full board URLs.
maxItemsinteger100Max jobs across all boards. 0 = no limit.
titleKeywordsarray[]Keep only jobs whose title contains one of these (case-insensitive). Empty = all.
locationQuerystring""Keep only jobs whose location contains this text. Empty = all.
includeDescriptionHtmlbooleanfalseAdd a raw-HTML descriptionHtml field.
onlyNewJobsbooleanfalseMonitor mode — only output jobs not seen in a previous run.
includeClosedJobsbooleanfalseAlso emit a row for jobs seen before but no longer listed on a board checked this run.
proxyConfigurationobjectApify Proxy (auto)Proxy settings.

🔎 Finding a company's board token

  • Greenhouse: the board URL looks like https://boards.greenhouse.io/gitlab → token is gitlab.
  • Lever: the board URL looks like https://jobs.lever.co/palantir → token is palantir.
  • Ashby: the board URL looks like https://jobs.ashbyhq.com/ashby → token is ashby.

📦 Output

One flat row per job posting, unified across all three platforms:

{
"source": "greenhouse",
"company": "gitlab",
"companyName": "GitLab",
"jobId": "8503792002",
"title": "AI Engineer",
"department": "Enterprise Applications",
"team": "Enterprise Applications",
"location": "Remote, US",
"allLocations": "United States",
"commitment": null,
"workplaceType": "remote",
"remote": true,
"country": null,
"jobUrl": "https://job-boards.greenhouse.io/gitlab/jobs/8503792002",
"applyUrl": "https://job-boards.greenhouse.io/gitlab/jobs/8503792002",
"publishedAt": "2026-05-01T10:00:00-04:00",
"updatedAt": "2026-06-05T16:18:10-04:00",
"requisitionId": "REQ-123",
"compensationSummary": null,
"isNew": true,
"isClosed": false,
"descriptionText": "Join us & help build..."
}

Platform notes: commitment (Full-time/Part-time) comes from Lever and Ashby; country from Lever and Ashby; requisitionId from Greenhouse; compensationSummary from Ashby (when the company has published a range). Missing values are null so the schema stays consistent.

Output fields

FieldTypeDescription
sourcestringgreenhouse, lever, or ashby.
companystringThe board token you supplied.
companyNamestringCompany display name.
jobIdstringPlatform-specific job ID.
titlestring | nullJob title.
departmentstring | nullDepartment.
teamstring | nullTeam, when distinct from department.
locationstring | nullPrimary listed location.
allLocationsstringAll locations, comma-separated.
commitmentstring | nullFull-time/Part-time/etc. (Lever, Ashby).
workplaceTypestring | nullremote / hybrid / onsite.
remotebooleanNormalized remote flag.
countrystring | nullCountry (Lever, Ashby).
jobUrlstring | nullPublic job posting URL.
applyUrlstring | nullApplication URL.
publishedAtstring | nullISO publish date.
updatedAtstring | nullISO last-updated date.
requisitionIdstring | nullInternal requisition ID (Greenhouse).
compensationSummarystring | nullSalary/equity range, when published (Ashby).
isNewbooleanNot seen in a previous run (see below).
isClosedbooleanThis is a closed-posting row (see below).
descriptionTextstringPlain-text job description.
descriptionHtmlstring(optional) Raw HTML description, only when includeDescriptionHtml is on.

🆕 New-postings mode

Every row includes isNewtrue if that job wasn't present the last time you ran this actor (tracked per Apify account, across all boards, refreshed each run). On your very first run, everything is isNew: true since there's no history yet.

Turn on onlyNewJobs to have the actor output only newly-appeared postings — ideal for a scheduled run (e.g. daily) that should alert you to fresh openings instead of re-delivering the whole board each time. "Last seen" history is retained for 90 days of inactivity per job before it's dropped, so removing and later re-adding a board after a long gap resets its history.

🔒 Closed-postings detection

Turn on includeClosedJobs to also get a row (isClosed: true) for each job that was seen in a previous run but no longer appears on its board this run — a strong signal it was filled or taken down. These rows carry only what was recorded when last seen (title, department, location, jobUrl); fields the actor can't know after the fact (like publishedAt or descriptionText) are null/empty. Only boards actually included and successfully checked in this run are considered — dropping a board from your input, or a transient failure, never causes its old jobs to show up as falsely "closed." Closed rows count toward maxItems like any other row.


💡 Use cases

  • Job boards & aggregators — continuously ingest fresh roles from many companies.
  • Recruiting & sourcing — monitor competitors' open roles and hiring focus.
  • Talent-market research — analyze departments, locations, and remote trends at scale.
  • Sales intelligence — track which companies are hiring (a strong growth signal).
  • Scheduled alerts — run daily with onlyNewJobs to catch freshly posted roles as they go live.

💳 Pricing (pay-per-event)

EventPrice
Actor start$0.005 per run
Job scraped$0.001 per posting

Scraping 1,000 jobs costs about $1.01. Set maxItems to cap your spend exactly.


❓ FAQ

Which ATS platforms are supported? Greenhouse, Lever, and Ashby — three of the most widely used company career boards.

How do I find the token? It's the last path segment of the public board URL (see "Finding a company's board token" above). You can also paste the full URL.

Can I filter to just engineering or a city? Yes — use titleKeywords (e.g. ["engineer"]) and/or locationQuery (e.g. "London" or "remote").

Do these boards need a proxy? Usually no — the public JSON APIs are lightweight. A proxy is on by default and helps only on very large runs.

How does "new postings" tracking work across runs? Each run compares the current board contents against a per-account history of previously-seen job IDs and refreshes it — no setup needed. It's separate from titleKeywords/locationQuery, so a job is "new" based on whether it existed before, regardless of your filters.

How do closed jobs get detected? The same per-account history used for "new postings" also records each job's title/department/location/URL. If a board you actually ran this time no longer lists a job that was in that history, it's reported as closed.


This actor reads publicly available job-posting data from official Greenhouse, Lever, and Ashby board endpoints. You are responsible for using the data in compliance with applicable laws and each platform's terms.