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

ATS Jobs Scraper for Greenhouse, Lever, Ashby, SmartRecruiters

Pricing

Pay per event

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

ATS Jobs Scraper for Greenhouse, Lever, Ashby, SmartRecruiters

Open roles straight from company career boards on Greenhouse, Lever, Ashby and SmartRecruiters, in one format. Start from a ready made company list, or name your own. Change detection returns only what opened and closed since your last run. No login, and you pay only for adverts you get.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Gregory Bolshakov

Gregory Bolshakov

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Company Jobs Scraper

Give it a list of companies. Get back their open roles in one clean table, whichever hiring system each company happens to use.

The problem it solves

Companies post jobs through an applicant tracking system, and there are dozens of them. Greenhouse, Lever, Ashby and SmartRecruiters each hand back a completely different shape for the same advert. One calls the role title, another calls it text, another calls it name. Locations, departments and dates all differ too.

This Actor reads all of them and gives you one format.

You do not need to know which system a company uses

Paste the career page link if you have it. If you only know the company, write the name on its own and the Actor checks each system until it finds live adverts.

https://boards.greenhouse.io/stripe a link works
lever:leverdemo force one system if you already know
ramp just the name, it will find it

You do not need a list of companies either

Pick a preset and press run. Four lists, 69 companies, and every one of them was fetched live on 2026-08-29 and returned adverts.

ai-labs 15 companies Anthropic, OpenAI, Cohere, ElevenLabs, Harvey ...
devtools 16 GitLab, Sentry, Vercel, Supabase, Datadog ...
fintech 19 Stripe, Ramp, Plaid, Wise, Monzo, Coinbase ...
top-tech 19 Figma, Notion, Databricks, Canva, Reddit ...

Mix a preset with your own companies. Duplicates are merged, so nothing is fetched or billed twice. If a company moves system or shuts its board, it shows up in the run summary as not found and the rest of the list still runs.

Watching for changes

Turn on Only new and closed since the last run and each run returns only what moved. New adverts arrive with isNew: true, and adverts that disappeared arrive with isClosed: true and the title they had.

Two rules it follows, because getting these wrong is worse than returning nothing:

  • The first run on a board is a baseline. Nothing is new the first time you look, so isNew is empty rather than true for every row.
  • An advert is only closed if the board actually answered. If a board errors or the run stops early, the previous list is kept and no closures are reported for it. A false closure ends up in your history table and there is no way to tell later that it was our fault rather than the company's.
  • Change detection reads the whole board and ignores the per company cap. Closure means "was here last run, is not here now", so a capped read would report everything past the cap as closed the first time you changed the cap.

Input

FieldWhat it does
Preset company listsReady made lists, so a first run needs nothing typed
CompaniesBoard links, or names on their own, or system:name
Only new and closed since the last runChange detection, see above
Include the full advert textAdds the whole description as plain text. Off by default because it makes the output much bigger
Remote roles onlyKeeps only adverts the board marks remote
Max adverts per companyDefaults to 100 so a first run over a preset stays cheap. Raise it to take whole boards

Output

One row per advert: role title, company, which system it came from, location, remote flag, department, employment type, pay, posting date and a direct apply link. Add the description if you asked for it.

A SUMMARY record shows what happened to each company you asked for, including anything the Actor could not read and why.

About the pay fields

salaryMin, salaryMax, salaryCurrency and salaryInterval carry the pay the company published as numbers. salaryRaw keeps the board's own summary string, which often also mentions equity or a bonus that the numeric fields leave out.

Three boards of the four publish pay, and on all three it is a setting each company chooses rather than something the platform does. Coverage swings from 96% to 0% between two boards on the same system, so sample before you chart it.

  • Ashby sends it with the board. Ramp fills it on 133 of 138 adverts, Linear on none.
  • Greenhouse sends it only if you ask for pay_transparency. Across 2,448 adverts it is on 47% of them. Anthropic 89%, Stripe 0%.
  • SmartRecruiters keeps it on the per advert endpoint, so the Actor makes one extra request per row on that board. Wise declares it on 38 of 40 sampled adverts, Bosch on none. It is also the only board that states the period as a field instead of free text.
  • Lever has salaryRange, and almost nobody fills it. 12 of 2,527 postings across eight boards, and 8 of those were Lever's own demo board.

An empty salary means the company did not publish one, never that it was missed.

One advert can declare several pay bands

On Greenhouse the pay field is a list, and 20% of the adverts that declare pay put more than one band in it. A company that pays differently by state sends one band per state. A company hiring at three levels at once sends one band per level. Reading only the first band gives you one state's pay as though it were the whole answer, and on 111 of the adverts we measured the bands that got dropped were the higher ones.

So salaryMin is the bottom of the lowest band and salaryMax is the top of the highest. salaryBands holds the bands themselves, with the label the company wrote on each one, and it is null when there is only one band.

Base pay and total on-target earnings are not added together. Sales adverts often carry both, and mixing them gives you a base salary that ends at the commission number. The two bounds come from base pay when both are there, and each band says which it is in basis.

The period can be wrong

salaryInterval is typed by the company on three of the four boards, and companies get it wrong in both directions. One live advert says Estimated Hourly Pay Range over 200,000 to 260,000. Another says Annual Base Salary over 35 to 58. A Lever advert labels a 22.4 to 26 hourly rate bi-week-salary.

The Actor keeps the label only when the numbers could belong to that period, and leaves salaryInterval null when they could not. It never rescales the amount to fit the label. A null interval means the period was not stated or was not believable. The bounds are the company's own numbers either way.

Currencies that are not dollar-scale skip this check, because 6,000,000 yen a year is an ordinary salary and the check would throw away a correct label.

A pay band the company switched on and left empty is treated as absent. Lever sends {min: 0, max: 0} for it and Greenhouse sends 1 to 1. That is a company with the field turned on, not a job that pays nothing.

salarySource is declared when the company published the number itself. Nothing here is guessed from advert text, so there is no second value today. The field exists so that if text extraction is ever added, you can tell the two apart in the same column instead of finding out later that you cannot.

How it behaves when things go wrong

A name that matches nothing is reported and skipped, and you are not charged for it. One bad entry never stops the rest of the list. On very long runs the Actor watches its own clock, stops before the platform cuts it off, saves everything gathered so far and tells you which companies it did not reach.

The start fee applies only once a board actually returns adverts, so a run that finds nothing costs you nothing.

Where the data comes from

Public job board endpoints that each company publishes so their own careers page can display the roles. Nothing is logged into and no account is needed.

Pricing

Pay per event, so you are charged for adverts you actually get. A run that finds nothing costs you nothing, because the start charge only happens once a board returns something.

The live price is on the Actor page. It changes on 13 September 2026: the per advert rate goes up and the per run charge comes down, which is the same shape the rest of this category uses and is much kinder to anyone running change detection on a schedule.