Greenhouse, Lever & Ashby Jobs Scraper - New Postings Mode
Pricing
Pay per event
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
17 hours ago
Last modified
Categories
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
remoteboolean andworkplaceTypeacross all three platforms. - Compensation, when published — Ashby's salary/equity ranges come through in
compensationSummary. - New-postings mode — every row is flagged
isNew; turn ononlyNewJobsto 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 & robust —
maxItemscaps output; a bad board never crashes the run.
🚀 Quick start
- Add company boards in Company job boards (e.g.
greenhouse:gitlab,lever:palantir,ashby:ashby). - (Optional) Add title keywords or a location filter, or raise Max jobs.
- 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 }}
| Field | Type | Default | Description |
|---|---|---|---|
boards | array | (required) | Boards as greenhouse:token, lever:token, ashby:token, or full board URLs. |
maxItems | integer | 100 | Max jobs across all boards. 0 = no limit. |
titleKeywords | array | [] | Keep only jobs whose title contains one of these (case-insensitive). Empty = all. |
locationQuery | string | "" | Keep only jobs whose location contains this text. Empty = all. |
includeDescriptionHtml | boolean | false | Add a raw-HTML descriptionHtml field. |
onlyNewJobs | boolean | false | Monitor mode — only output jobs not seen in a previous run. |
includeClosedJobs | boolean | false | Also emit a row for jobs seen before but no longer listed on a board checked this run. |
proxyConfiguration | object | Apify Proxy (auto) | Proxy settings. |
🔎 Finding a company's board token
- Greenhouse: the board URL looks like
https://boards.greenhouse.io/gitlab→ token isgitlab. - Lever: the board URL looks like
https://jobs.lever.co/palantir→ token ispalantir. - Ashby: the board URL looks like
https://jobs.ashbyhq.com/ashby→ token isashby.
📦 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;countryfrom Lever and Ashby;requisitionIdfrom Greenhouse;compensationSummaryfrom Ashby (when the company has published a range). Missing values arenullso the schema stays consistent.
Output fields
| Field | Type | Description |
|---|---|---|
source | string | greenhouse, lever, or ashby. |
company | string | The board token you supplied. |
companyName | string | Company display name. |
jobId | string | Platform-specific job ID. |
title | string | null | Job title. |
department | string | null | Department. |
team | string | null | Team, when distinct from department. |
location | string | null | Primary listed location. |
allLocations | string | All locations, comma-separated. |
commitment | string | null | Full-time/Part-time/etc. (Lever, Ashby). |
workplaceType | string | null | remote / hybrid / onsite. |
remote | boolean | Normalized remote flag. |
country | string | null | Country (Lever, Ashby). |
jobUrl | string | null | Public job posting URL. |
applyUrl | string | null | Application URL. |
publishedAt | string | null | ISO publish date. |
updatedAt | string | null | ISO last-updated date. |
requisitionId | string | null | Internal requisition ID (Greenhouse). |
compensationSummary | string | null | Salary/equity range, when published (Ashby). |
isNew | boolean | Not seen in a previous run (see below). |
isClosed | boolean | This is a closed-posting row (see below). |
descriptionText | string | Plain-text job description. |
descriptionHtml | string | (optional) Raw HTML description, only when includeDescriptionHtml is on. |
🆕 New-postings mode
Every row includes isNew — true 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
onlyNewJobsto catch freshly posted roles as they go live.
💳 Pricing (pay-per-event)
| Event | Price |
|---|---|
| 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.
⚖️ Legal
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.