Greenhouse, Lever & Ashby Job Scraper API - 6 ATS Boards avatar

Greenhouse, Lever & Ashby Job Scraper API - 6 ATS Boards

Pricing

from $1.20 / 1,000 job openings

Go to Apify Store
Greenhouse, Lever & Ashby Job Scraper API - 6 ATS Boards

Greenhouse, Lever & Ashby Job Scraper API - 6 ATS Boards

Monitor hiring across Greenhouse, Lever, Ashby, Workable, Recruitee and SmartRecruiters in one run. Paste company domains - the ATS is detected automatically. Run it weekly and get only what changed: new postings and closed roles flagged, in one flat schema.

Pricing

from $1.20 / 1,000 job openings

Rating

0.0

(0)

Developer

Scrappeer

Scrappeer

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

2 days ago

Last modified

Share

ATS Job Scraper — Greenhouse, Lever, Ashby, Workable, Recruitee, SmartRecruiters

You name the companies. It returns their live job openings.

Sample output: one normalised table across all six ATS platforms

Give it a list of companies you actually care about. It works out which applicant tracking system each one uses — Greenhouse, Lever, Ashby, Workable, Recruitee or SmartRecruiters — reads their official public board API, and returns every opening in one normalised schema.

No proxy. No browser. No API key. Nothing to get blocked.


This is not a job firehose

Most job APIs sell you everything — hundreds of thousands of companies — and leave you to filter down to the handful you care about. That is the right product if you are building a job board.

It is the wrong product if you already know which companies matter to you.

Whole-market job feedsThis Actor
You getEvery company they indexThe companies you listed
TargetingSearch keywords, hopeYou name them
NoiseFilter down from 175k+There is none to filter
Data sourceAggregatedThe company's own ATS API
FreshnessWhenever they re-crawledLive, at run time
BlockingAnti-bot, proxiesPublic APIs

If your list is "our 200 target accounts", "our 40 competitors", or "the 60 companies I would actually work for", this is built for you.


Supported platforms

PlatformBoard token is the slug in
Greenhouseboards.greenhouse.io/<token> · job-boards.greenhouse.io/<token>
Leverjobs.lever.co/<token>
Ashbyjobs.ashbyhq.com/<token>
Workableapply.workable.com/<token>
Recruitee<token>.recruitee.com
SmartRecruiterscareers.smartrecruiters.com/<token>

You do not have to know which one a company uses. Give the plain name and it tries each platform until it finds the board.


Input

{
"companies": [
"stripe.com",
"ashby:ramp",
"https://jobs.lever.co/shieldai",
"https://job-boards.greenhouse.io/anthropic"
],
"titleKeywords": ["engineer", "designer"],
"excludeKeywords": ["intern"],
"locations": ["New York", "Remote"],
"remoteOnly": false,
"postedWithinDays": 7
}

companies accepts anything sensible:

You writeIt understands
stripeauto-detects the platform
stripe.comthe domain — paste your account list as-is
www.stripe.com, https://stripe.com/careerssame company
greenhouse:stripeforces Greenhouse
https://jobs.ashbyhq.com/rampAshby, token ramp
https://apply.workable.com/acme/Workable, token acme

You do not need to look up board tokens. Most people keep a list of company domains, not ATS slugs — so paste the domains. The Actor pulls the company name out and finds the board itself.

FieldDefaultNotes
companiesRequired.
titleKeywordsKeep only titles containing any of these.
excludeKeywordsDrop titles or departments matching any of these.
locationsKeep only matching locations.
departmentsMatches department or team.
remoteOnlyfalseRemote positions only.
postedWithinDays00 = no limit. Set 1 for a daily new-jobs feed.
includeDescriptionfalseAdds full description text. Much larger results.
onlyNewSinceLastRunfalseReturn only what opened or closed since the last run.
maxJobsPerCompany00 = no limit. The console starts at 10 so a first trial run stays cheap.
concurrency5Companies fetched in parallel.

Output

One item per opening, identical shape no matter which platform it came from:

FieldDescription
companyName, boardToken, atsWho, and which platform it was read from
jobIdStable ID on the source platform
titleJob title
department, teamOrg placement, when the platform exposes it
employmentTypeFull-time, contract, intern…
location, isRemote, workplaceTypeWhere the work happens
salaryCompensation range, when the company publishes it
publishedAt, updatedAtISO 8601, normalised across all six platforms
jobUrl, applyUrlPublic posting and application links
globalId{ats}:{token}:{jobId} — stable key for joining and deduping
descriptionFull text, only when requested

Export as Excel, CSV, JSON or XML, or pull it through the API.

Companies whose board cannot be found return one row with an error and a hint, so a bad token never silently vanishes from your results.


What people use it for

  • Sales and lead-gen — a company that is hiring is a company that is spending. Watch your target accounts and catch them the week they start growing a team.
  • Competitive intelligence — see exactly which roles a rival opened, in which city, on which team, at what salary.
  • Recruiting and sourcing — track where talent demand is moving.
  • Job hunting — follow the 60 companies you would actually join, filtered to your title and location.

Monitoring: only what changed

Set onlyNewSinceLastRun: true and schedule it. The first run records a baseline and returns everything. Every run after that returns only:

  • roles that opened since your last run — isNew: true
  • roles that have since closedisClosed: true

A morning with no hiring activity returns nothing at all and costs only the start fee. You are never billed for re-reading a job you already saw. Wire it to Slack, Google Sheets or your CRM through Apify integrations and it stays quiet until an account actually moves.

Two things worth knowing:

  • Changing the companies or filters starts a fresh baseline. Otherwise every job you stopped asking about would be reported as newly closed, which is a wrong answer rather than a noisy one.
  • A closed row carries what was recorded when the job was last seen — company, title and link. Once a posting is gone there is nothing left to re-read, so the remaining fields are omitted rather than shown stale.

postedWithinDays: 1 also gives you a daily feed, based on each company's own posted date. It is simpler, but it cannot tell you when a role closed, and it depends on the company having set a date at all.


Why it stays cheap and does not break

It reads the official public board API each platform already publishes for their customers' own career sites. That means no proxy fees, no headless browser, no anti-bot arms race — and no silent data loss when a page layout changes.

Timestamps are normalised to ISO 8601 across all six platforms, so a date filter behaves the same everywhere. Departments are joined in for Greenhouse, which omits them from its jobs endpoint. Postings that cannot be read are skipped and reported in the log rather than quietly dropped — and you are not billed for them.


Limits

  • Only the six platforms above. Custom in-house career pages are not covered.
  • Boards set to private or password-protected are not accessible.
  • department and team are only as good as what the company fills in.
  • Salary appears only where the company publishes it.
  • SmartRecruiters boards are read up to 2,000 postings per company.

Pricing

Pay per event: a small start fee per run, plus a charge per job returned. Companies that return no jobs cost only the start fee. Platform usage is included — you are not billed for compute on top.


How this works, in full

The six endpoints this reads are public and documented. If you would rather build it yourself than pay for it, the whole method is written up here — every endpoint, and the four traps that cost the most time:

Six ATS platforms publish their job boards as open JSON. Here are the endpoints.

For one company you probably should build it yourself — it is a single HTTP request. This Actor earns its keep at the point where that stops being true.


Support

Missing a platform, or a company that will not resolve? Open an issue on the Issues tab with the careers URL. New adapters are quick to add.


Run it without writing any of this

Every platform above is also packaged as a hosted Actor on Apify. Same endpoints, same normalised schema, nothing to deploy. Each one exposes a REST API, so you can call it from your own code in a few lines.

PlatformHosted ActorCall it from
All six, auto-detectedActorPython · JavaScript
GreenhouseActorPython · JavaScript
LeverActorPython · JavaScript
AshbyActorPython · JavaScript
WorkableActorPython · JavaScript
RecruiteeActorPython · JavaScript
SmartRecruitersActorPython · JavaScript
WorkdayActorPython · JavaScript

Workday is a separate Actor because it is the one ATS whose address cannot be derived from a company name: the tenant, the wd shard and the site name are each set per customer, so you need a real link from the careers site.

Write-ups

The full method for each platform, including the traps that cost the most time: