ATS Job Scraper: Greenhouse, Ashby & Lever + Hiring Intel avatar

ATS Job Scraper: Greenhouse, Ashby & Lever + Hiring Intel

Pricing

from $10.00 / 1,000 job scrapeds

Go to Apify Store
ATS Job Scraper: Greenhouse, Ashby & Lever + Hiring Intel

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

Ace

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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

ProviderBoard specWhere the slug comes from
Greenhousegreenhouse:slugboards.greenhouse.io/<slug>
Ashbyashby:slugjobs.ashbyhq.com/<slug>
Leverlever:slugjobs.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
}
FieldTypeNotes
boards (required)string[]"provider:slug" entries
keywordsstring[]Title must contain at least one (case-insensitive)
departmentstringDepartment contains (case-insensitive)
locationstringLocation contains (case-insensitive)
remoteOnlybooleanOnly remote-flagged roles
postedWithinDaysintegerOnly roles published within N days (0 = off)
maxJobsPerCompanyintegerCap on emitted job rows per board
includeIntelligencebooleanEmit the per-company summary row (default true)
modestringsnapshot (default) or watchlist — see below
watchlistNamestringNames 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:

  1. First run on a given watchlistName + board just saves a baseline (a free baseline row — nothing is charged).
  2. Every run after diffs the live board against that baseline and emits recordType: "change" rows:
changeTypeMeaningBilled?
new_roleA role that wasn't there last run✅ as job-scraped
removed_roleA role that's been filled or pulledFree
company_shiftPosture digest: velocity change, new buying signals, new/removed counts✅ as company-intelligence
no_changeNothing changed for that board this runFree
baselineFirst-run seedFree
  1. 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 omit updatedAt. Missing fields are null, never guessed.
  • Lever's createdAt is 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 isListed Ashby roles are returned.