ATS Job Scraper - Greenhouse, Lever & Ashby Job Monitor avatar

ATS Job Scraper - Greenhouse, Lever & Ashby Job Monitor

Pricing

from $3.00 / 1,000 job results

Go to Apify Store
ATS Job Scraper - Greenhouse, Lever & Ashby Job Monitor

ATS Job Scraper - Greenhouse, Lever & Ashby Job Monitor

Scrape Greenhouse, Lever & Ashby job boards for your companies and get only new job postings — a cross-ATS hiring-signal feed for sales, recruiting & intel.

Pricing

from $3.00 / 1,000 job results

Rating

0.0

(0)

Developer

FeedHarbor

FeedHarbor

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 hours ago

Last modified

Categories

Share

ATS Job Scraper — Greenhouse, Lever & Ashby New-Requisition Monitor

Scrape jobs from Greenhouse, Lever, and Ashby job boards for any list of companies, and detect newly-posted requisitions — the companies that just started hiring. Give it your target accounts, run it on a schedule, and get a clean, deduplicated, normalized feed of new, changed, and removed job openings across all three ATS platforms at once.

Unlike a one-off job dump, this actor remembers what it has seen before. Every run compares against the last one and tells you exactly what is new this week — the hiring signal that sales teams, recruiters, and market analysts actually pay for.

What this actor does

  • Scrape Greenhouse job boards by board token (e.g. greenhouse:gitlab)
  • Scrape Lever postings by company (e.g. lever:leverdemo)
  • Scrape Ashby job boards by org (e.g. ashby:openai)
  • Detect new job postings across a list of companies since your last run
  • Monitor when companies start hiring for specific roles (sales, engineering, marketing…)
  • Track removed / filled requisitions so you know when a role closes
  • Normalize job data from three different ATS platforms into one clean schema
  • Parse seniority from job titles (intern → C-level) for decision-maker targeting
  • Normalize salary / compensation into numeric min/max where the board exposes it
  • Deduplicate jobs across runs with a stable, cross-ATS job ID

Who it's for

Sales & RevOps teams running hiring-intent prospecting. A company posting a "Marketo Administrator" or "VP of Sales" role is a timed buying signal. Monitor your target account list and get alerted the moment a relevant requisition appears.

Recruiting & staffing agencies who need a live who's-hiring feed. Watch the companies you place into and know within a day when they open a new seat.

Market & competitive intelligence analysts tracking headcount growth by team as a proxy for company expansion, funding, and strategy.

Founders & investors monitoring a portfolio or a competitive set for hiring momentum.

How it works

  1. Provide a list of companies as greenhouse:token, lever:company, ashby:org, or full board URLs (the ATS is auto-detected).
  2. The actor fetches every board through its official public API — no login, no proxies required.
  3. Each posting is normalized into a single unified schema and assigned a stable job_uid.
  4. The run is compared against previous runs stored under a trackerName, computing change_type (new, updated, unchanged, removed) and first_seen_at.
  5. With Monitor mode on, you receive only the rows that changed — your new-requisition signal.

Run it on an Apify schedule (say, daily) with the same trackerName to build a continuous hiring-signal feed for your accounts.

Input

FieldWhat it does
companiesTarget boards: greenhouse:token, lever:company, ashby:org, or a board URL
presetListUse a curated set (AI labs, dev tools, fintech) instead of your own list
monitorModeEmit only new / updated / removed rows since the last run
trackerNameState bucket to diff against — one per monitored account set
titleKeywords / excludeKeywordsKeep or drop jobs by title
seniorityFilterKeep only e.g. director, vp, c_level
remoteOnly, locationKeywords, employmentTypes, postedSinceStandard filters
includeDescription, includeCompensationAdd full text / pay data
outputProfilefull, compact, or signals_only

Minimal example:

{
"companies": ["greenhouse:gitlab", "lever:leverdemo", "ashby:openai"],
"monitorMode": true,
"trackerName": "my-target-accounts",
"seniorityFilter": ["director", "vp", "c_level"]
}

Output

Each job is a normalized record. Key fields:

{
"job_uid": "b1c2…",
"ats": "greenhouse",
"company_name": "Gitlab",
"title": "Senior Backend Engineer",
"seniority": "senior",
"department": "Engineering",
"location_primary": "Remote, US",
"remote": true,
"workplace_type": "remote",
"salary_min": 120000,
"salary_max": 160000,
"currency": "USD",
"posted_at": "2026-07-30T09:00:00.000Z",
"first_seen_at": "2026-08-04T00:00:00.000Z",
"change_type": "new",
"is_new_requisition": true,
"days_open": 5,
"url": "https://boards.greenhouse.io/gitlab/jobs/12345"
}

The change_type, is_new_requisition, and first_seen_at fields are the hiring-signal core — they only exist because the actor accumulates state across runs.

Pricing

Pay-per-result. A full scrape is billed per job returned; new & changed rows (Monitor mode) are billed at the signal rate, because that is the output worth paying for. Start with a small free allowance so you can validate the data before committing. See the pricing tab for current rates.

FAQ

Do I need API keys or proxies? No. Greenhouse, Lever, and Ashby all expose public job-board JSON APIs. No login, no proxies.

How do I find a company's board token? It's the slug in their careers URL — boards.greenhouse.io/**gitlab**, jobs.lever.co/**company**, jobs.ashbyhq.com/**org**. Paste the full URL and the actor detects the ATS.

How does "new this week" work on the first run? The first run has no history, so everything is new. From the second run onward (same trackerName), only genuinely new/changed roles are flagged. For instant history, run it a few times before you rely on the signal, or keep a daily schedule.

Does it handle companies switching or renaming their ATS? Yes — failed or moved boards are reported in the run summary, and removed requisitions are surfaced as change_type: removed.

Is scraping these boards allowed? These are public job-board APIs designed to be indexed, and the actor only reads public company job data — not personal contact information.


For developers

The scraping, normalization, and change-detection logic lives in a platform-agnostic core (src/core) with the Apify actor as a thin adapter (src/adapters/apify.js). State (the first-seen ledger) is stored in your own Postgres when DATABASE_URL is set, or Apify's key-value store as a fallback. Run the same core locally with node cli.js greenhouse:gitlab --monitor. Tests: node --test test/smoke.test.js.