ATS Jobs Scraper — Greenhouse, Lever, Ashby, SmartRecruiters avatar

ATS Jobs Scraper — Greenhouse, Lever, Ashby, SmartRecruiters

Pricing

from $4.00 / 1,000 job scrapeds

Go to Apify Store
ATS Jobs Scraper — Greenhouse, Lever, Ashby, SmartRecruiters

ATS Jobs Scraper — Greenhouse, Lever, Ashby, SmartRecruiters

Pull every open role from a company's real applicant tracking system in one unified schema. No proxies, no blocks, no HTML parsing.

Pricing

from $4.00 / 1,000 job scrapeds

Rating

0.0

(0)

Developer

Quarry

Quarry

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

a day ago

Last modified

Share

ATS Jobs Scraper — Greenhouse, Lever, Ashby & SmartRecruiters in one schema

Pull every open role straight from a company's real applicant tracking system — the same system its careers page runs on. One input, one output schema, four ATS platforms.

No proxies. No blocks. No HTML parsing. These are public product APIs, so the data is complete and the actor doesn't break when a website gets redesigned.

Sample output

{
"id": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
"provider": "ashby",
"board": "ramp",
"company": "Ramp",
"title": "Security Engineer, Cloud",
"location": "New York, NY (HQ)",
"remote": true,
"department": "Engineering",
"employmentType": "FullTime",
"postedAt": "2026-04-07T17:12:35.753+00:00",
"updatedAt": null,
"applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application",
"descriptionText": "ABOUT RAMP\n\nRamp is building the smart infrastructure for finance teams…"
}

Every row has the same 13 fields regardless of which ATS it came from. Write your pipeline once.

What you can do with it

  • Hiring-intent leads — companies opening roles in a function are companies with budget. Filter by keyword and department to find them the week they start hiring.
  • Job boards and aggregators — build a niche board from the source, with full descriptions and apply links, instead of re-scraping someone else's board.
  • Competitive and market research — track headcount plans, new office locations, and which teams a competitor is growing.
  • Recruiting — monitor target companies for openings that match your candidates.

Input

FieldWhat it does
boardsRequired. "greenhouse:stripe", "lever:leverdemo", "ashby:ramp", "smartrecruiters:SGS". Pass a bare slug like "stripe" and every provider is tried.
keywordsKeep only roles matching any term, in title, department or description.
locationsKeep only roles whose location contains any of these.
remoteOnlyKeep only roles the ATS flags as remote.
postedAfterISO date. Keep only roles posted or updated since.
includeDescriptionFull description as clean plain text. On by default. Free on Greenhouse, Lever and Ashby; on SmartRecruiters it costs one extra request per role, because SmartRecruiters' listing endpoint carries no description at all — a 4,000-role board takes a couple of extra minutes. Turn it off if you only want the metadata.
maxJobsStop after N rows. 0 = no limit.
concurrencyBoards fetched in parallel, 1–10. Default 5.

Minimal run:

{ "boards": ["greenhouse:stripe"] }

Hiring-intent lead run:

{
"boards": ["greenhouse:stripe", "ashby:ramp", "lever:leverdemo"],
"keywords": ["sales", "account executive"],
"postedAfter": "2026-07-01"
}

Finding a company's board slug

Open the company's careers page and look at the URL:

Careers URLUse
boards.greenhouse.io/stripegreenhouse:stripe
jobs.lever.co/leverdemolever:leverdemo
jobs.ashbyhq.com/rampashby:ramp
jobs.smartrecruiters.com/SGSsmartrecruiters:SGS

Don't know which one they use? Pass the bare slug — every provider is tried and only the one that answers returns rows.

Scale

One large board returns hundreds of roles in under a second: Stripe 548, Lever demo 388, Ramp 126, SGS 4,219. Pass a list of companies and a single run returns tens of thousands of rows.

Reliability

Every run reports what happened per board, in a RUN_STATS record:

  • ok — board returned rows
  • empty — board is healthy but has no open roles right now
  • drift — the payload had records but the parser produced none
  • not_found — that provider has no such board (expected when you pass a bare slug)
  • transport / rate_limited — the provider did not answer

That third one matters. Most scrapers return an empty dataset whether the site changed or the company simply isn't hiring, and you can't tell which. This one tells you.

No board answered means the run fails. A typo'd slug used to finish green with zero rows forever; now it raises with the reason. One bad board among several still succeeds — that is resilience, not breakage — and a real company with no open roles is still a successful, empty run.

When a run legitimately matches nothing, the dataset gets one unbilled receipt row rather than being left empty:

{ "type": "no_changes", "boardsChecked": 1, "boardsAttempted": 1, "jobsSeen": 4257, "checkedAt": "2026-08-05T12:16:28.133Z" }

Job rows never carry a type field, so your pipeline can branch on it.

Pricing

Pay per job returned. You're charged for rows you actually receive — empty boards and failed lookups cost nothing.

Limits

  • Public job postings only. No salary data unless the ATS publishes it, and no applicant or private data.
  • remote is only set when the provider exposes it. Roughly a third of rows carry it; the rest are null rather than a guess.
  • updatedAt is only published by Greenhouse. Every other provider returns null; postedAt is populated everywhere.
  • SmartRecruiters descriptions come from the per-posting detail record. Where a company left those sections blank in its ATS — some do — the field is null because there is nothing to return.
  • Workable is not currently supported — its public listing endpoint stopped returning jobs (verified 2026-08-02).