ATS Job Scraper: Greenhouse, Ashby & Lever + Hiring Intel
Pricing
from $10.00 / 1,000 job scrapeds
ATS Job Scraper: Greenhouse, Ashby & Lever + Hiring Intel
Scrape fresh jobs from company ATS boards (Greenhouse, Ashby, Lever) before they hit Indeed, plus hiring intelligence: velocity, teams & buying signals.
Pricing
from $10.00 / 1,000 job scrapeds
Rating
0.0
(0)
Developer
Ace
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
ATS Jobs Intelligence
Fresh jobs straight from company career boards — before they hit Indeed — plus a hiring-intelligence summary for every company.
Most job scrapers fight Indeed's and LinkedIn's anti-bot defenses and hand you stale, deduplicated rows. This actor goes to the source: the public JSON APIs behind companies' own Applicant Tracking Systems (Greenhouse, Ashby, Lever). The data is fresh, structured, and un-scraped — and on top of it you get a per-company intelligence layer that answers the question raw rows can't: is this company scaling, and where?
Built for recruiters (fresh roles first), sales/BD teams (hiring is a buying signal), and competitive intel (watch a rival's org grow in real time).
Supported ATS providers
| Provider | Board spec | Where the slug comes from |
|---|---|---|
| Greenhouse | greenhouse:slug | boards.greenhouse.io/<slug> |
| Ashby | ashby:slug | jobs.ashbyhq.com/<slug> |
| Lever | lever:slug | jobs.lever.co/<slug> |
All three are public, unauthenticated endpoints (verified live). No API keys required.
Input
{"boards": ["greenhouse:airbnb", "ashby:ramp", "lever:veeva"],"keywords": ["engineer", "product"],"department": "Engineering","location": "Remote","remoteOnly": false,"postedWithinDays": 30,"maxJobsPerCompany": 1000,"includeIntelligence": true}
| Field | Type | Notes |
|---|---|---|
boards (required) | string[] | "provider:slug" entries |
keywords | string[] | Title must contain at least one (case-insensitive) |
department | string | Department contains (case-insensitive) |
location | string | Location contains (case-insensitive) |
remoteOnly | boolean | Only remote-flagged roles |
postedWithinDays | integer | Only roles published within N days (0 = off) |
maxJobsPerCompany | integer | Cap on emitted job rows per board |
includeIntelligence | boolean | Emit the per-company summary row (default true) |
mode | string | snapshot (default) or watchlist — see below |
watchlistName | string | Names the baseline in watchlist mode (default default) |
Output
The dataset contains two record types, distinguished by recordType (with matching dataset views):
recordType: "job" — one per matched role:
provider, company, id, title, department, team, location,remote, employmentType, publishedAt, updatedAt, url, applyUrl
recordType: "company_intelligence" — one per board (unless disabled):
totalOpenRoles, newRoles7d, newRoles30d, hiringVelocity,pctOpenedLast30d, remotePct, topDepartments, topLocations,fastestGrowingDepartment, seniorityMix, buyingSignals, summary
hiringVelocity is one of Aggressive (≥25% of roles opened in 30d), Active (≥10%), Steady (<10%), Frozen (0 new), or Unknown (no dated roles). Intelligence is computed on the company's full role set, so it reflects real hiring posture regardless of your keyword/location filter.
Example summary:
Ramp: 125 open roles, hiring aggressive · 41 opened in the last 30d · fastest-growing team: Sales · 38% remote. Signals: Scaling Sales — 6 new roles in 30d; Building leadership — 2 new director/exec role(s) in 30d.
Watchlist mode — track changes over time
Set mode: "watchlist" to turn the actor from a one-time snapshot into a change feed. Instead of returning every current job each run, it remembers the last run and reports only what changed since — ideal for a scheduled run (daily/weekly) that alerts you when target companies start (or stop) hiring.
How it works:
- First run on a given
watchlistName+ board just saves a baseline (a freebaselinerow — nothing is charged). - Every run after diffs the live board against that baseline and emits
recordType: "change"rows:
changeType | Meaning | Billed? |
|---|---|---|
new_role | A role that wasn't there last run | ✅ as job-scraped |
removed_role | A role that's been filled or pulled | Free |
company_shift | Posture digest: velocity change, new buying signals, new/removed counts | ✅ as company-intelligence |
no_change | Nothing changed for that board this run | Free |
baseline | First-run seed | Free |
- The baseline advances to the current state after each run, so you only ever see genuinely new changes.
Use watchlistName to keep separate histories (e.g. competitors, target-accounts). Set includeIntelligence: false to get only role-level changes without the posture digest. See the Changes dataset view for a clean table.
Who it's for: sales/BD teams treating hiring as a buying signal, recruiters watching competitors open roles, and investors/analysts tracking a company's org growth week over week.
Tip: schedule watchlist runs in Apify (Schedules) and wire the dataset to a webhook/Slack for automatic hiring alerts.
Pricing
Pay per event — you are charged only for the results you receive:
job-scraped— one charge per job row returned.company-intelligence— one charge per company hiring-intelligence summary.
Boards that error (wrong slug, company migrated off that ATS) are never charged — error rows are free. The intelligence summary is priced separately from job rows because it's the differentiator versus commodity single-board scrapers: set includeIntelligence: false to skip it and pay for job rows only.
Notes & limits
- Provider field coverage differs (from each ATS's public API): Greenhouse omits
team/employmentType; Ashby and Lever omitupdatedAt. Missing fields arenull, never guessed. - Lever's
createdAtis epoch-ms and is normalized to ISO-8601 like the others. - A board that errors (wrong slug, company migrated off that ATS) emits a
recordType: "error"row and does not stop the run. - Only
isListedAshby roles are returned.