ATS Jobs Scraper avatar

ATS Jobs Scraper

Pricing

from $1.10 / 1,000 job postings

Go to Apify Store
ATS Jobs Scraper

ATS Jobs Scraper

Open roles pulled from company career pages while your run executes, not from a copied index. Name the companies, get 27 fields per role across Greenhouse, Lever, Ashby, Workday.

Pricing

from $1.10 / 1,000 job postings

Rating

0.0

(0)

Developer

Stable

Stable

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 hours ago

Last modified

Share

Name the companies you care about. Every open role on their career pages comes back as one table, fetched at the moment you press run — not served from an index built hours ago.

{ "companyName": "Ramp", "platform": "ashby",
"title": "Security Engineer, Cloud",
"locationRaw": "New York, NY (HQ)", "isRemote": true,
"postedAt": "2026-04-07T17:12:35+00:00",
"applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d…/application" }

27 fields per role, identical columns across Greenhouse, Lever, Ashby and Workday, so a thousand companies sort in one spreadsheet. Nothing is inferred: a field the employer did not publish comes back empty rather than guessed.

You do not need to know which system a company uses

Type the company name. It is looked up on each system until a board answers.

stripe
monzo
https://jobs.ashbyhq.com/ramp
https://jobs.lever.co/veeva
https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite

Company names and board URLs go in; open roles come out as one table

Names and URLs can be mixed freely. The run summary tells you which system each company turned out to be on — often the most useful thing in the output.

One exception, stated plainly: a Workday board is a host plus a tenant plus a site rather than a single name, so Workday needs the career-site URL. A bare name is looked up on the other three.

What one row looks like

{
"platform": "ashby",
"companyToken": "ramp",
"companyBoardUrl": "https://jobs.ashbyhq.com/ramp",
"jobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
"title": "Security Engineer, Cloud",
"jobUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245",
"applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application",
"locationRaw": "New York, NY (HQ)",
"additionalLocations": "Remote (Canada), Remote (US), Miami, FL",
"country": "USA",
"isRemote": true,
"workplaceType": "Hybrid",
"employmentType": "FullTime",
"departments": "Engineering",
"team": "Backend",
"postedAt": "2026-04-07T17:12:35.753+00:00",
"descriptionText": "ABOUT RAMP\n\nRamp is building the smart infrastructure for finance teams…",
"scrapedAt": "2026-08-10T18:20:06+00:00"
}

Five real rows: job title, company, system, location, department and publication date

Rows are flat — no nested objects — so CSV and Excel exports open correctly with no post-processing.

Fields

All 27, and every one of them comes from the employer's own board.

All 27 fields grouped by employer, role, location, filing, dates and posting

FieldWhat it is
platformWhich system the row came from
companyToken, companyName, companyBoardUrlThe employer and their board
title, jobUrl, applyUrlThe role, its page, and where the form is
jobId, internalJobId, requisitionIdIdentifiers, for de-duplicating across runs
locationRaw, additionalLocations, countryLocation as posted, plus any secondary ones
isRemote, workplaceTypeRemote status, and the employer's own term for it
employmentTypeFull time, contract, and so on, in the employer's wording
departments, team, officesHow the employer files the role internally
postedAt, updatedAt, applicationDeadlineDates as published
descriptionHtml, descriptionTextFull posting, as markup and as readable prose
customFieldsFields this employer invented — pay band, travel, clearance. JSON
language, scrapedAtPosting language, and when the row was collected

Not every system publishes every field. Greenhouse gives offices and an edit date; Ashby gives employment type and a real remote flag; Lever gives team and commitment; Workday gives country and a posting date. A field the system does not publish is left empty rather than filled in with a guess.

On isRemote: it is set when the posting says so — from the system's own flag where there is one, otherwise from what the posting states. A job that never mentions it comes back with the field missing rather than false. Guessing would quietly mislabel a large part of any dataset.

Filters

Leave them all empty and you get everything. Set several and a job has to satisfy all of them.

  • Job title contains / does not contain — keep engineer, drop intern
  • Location contains — matched against the posting's location and the offices
  • Department contains — Greenhouse, Lever and Ashby publish departments
  • Remote only — keeps jobs that say they are remote
  • First published after / Last updated after — for scheduled runs that collect only what changed
  • Workday keyword — searches at the source, which is far quicker than pulling a two-thousand-role site and filtering afterwards

Plus maximum jobs in total and maximum jobs per company, so one large employer cannot fill the entire result.

Use cases

Track a list of target employers. Paste your companies, set Last updated after to yesterday, schedule it daily.

Find out which system a competitor recruits on. Run one company and read the platform column in the run summary.

Build a hiring dataset for a market. A few hundred companies, filtered by location keyword, exported to CSV.

Watch one team. One company, Department contains Engineering, Job title contains backend.

What to expect from a run

One board returns anywhere from a handful of roles to several hundred — on real companies we have measured 77 open roles at one employer and 556 at another. A run over a list of companies is the sum of their boards, so set maximum jobs in total while you are exploring rather than harvesting.

Three of the four systems hand over a whole board in a single request. Workday is the exception: its search results carry no descriptions and no real dates, so each role costs one extra request. A Workday-heavy list with descriptions switched on is the slow case, and the only one worth planning around.

Every run writes a summary to the key-value store: jobs found per system, which companies came back empty, and which lookups failed. So a partial result stays legible — you can always tell "this employer has no open roles" apart from "this employer could not be found".

How much does it cost?

You pay per job returned, at one flat rate — whatever the row turned out to contain and whichever system it came from.

A company whose board returns nothing costs nothing — including the lookups that had to fail before the right system was found — and the run stops the moment it reaches whatever spending cap you set on it.

The first run defaults to 100 jobs, which is deliberately small: enough to see whether the fields suit you before committing to a long company list.

Apify's free plan includes $5 of platform credit each month, so you can evaluate this without entering a card.

Every run writes a summary listing how many rows were billed.

Limits

  • Only public boards are readable. Internal or unlisted postings are not — on Ashby, roles the company took off its own board are skipped.
  • Workday is the slow one: its search results carry only a title, a location and relative text like "Posted Today", so descriptions and real dates need one extra request per role. With descriptions off, Workday rows have no posting date, and the field is left empty rather than invented.
  • A company that has moved systems, or never used one of these four, is reported as a failed lookup in the run summary rather than silently returning nothing.
  • companyName is only present where the system publishes it — Greenhouse and Workday do, Lever and Ashby do not.

Output

The Output tab has three views: Overview (title, company, system, location, dates, link), Descriptions (with the full text), and All fields. Export any of them to CSV, Excel, JSON or XML, or read them from the API.

The run summary in the key-value store lists jobs found per system, which companies were empty and which failed — so a partial result is always legible.

FAQ

How do I find a company's board? Open their careers page and paste the URL. If it is Greenhouse, Lever or Ashby you can also just type the company name.

What if a company is not on any of the four? It is listed as a failed lookup in the run summary and the rest of the run continues. Nothing is charged for a lookup that returned nothing.

Why is Workday slower than the rest? Its search results do not include descriptions or real dates, so each role needs a second request. The other three hand over a whole board at once.

Can I get salary data? Only what the employer published. It appears in descriptionText when the company wrote it there, and in customFields when they made it a field.

How do I avoid duplicates across scheduled runs? De-duplicate on jobId, which is stable for the life of a posting.

How fresh is the data? It is fetched while your run is executing. There is no cached index in between, so a role published minutes ago appears in the next run, and one that was taken down stops appearing. That is the whole reason this reads boards directly.

Is it legal to collect job postings this way? These are public career pages that employers publish deliberately and want distributed as widely as possible — no login, no paywall and no personal data is involved. Only publicly visible postings are read, at a polite request rate. Check your own jurisdiction and the employer's terms if you plan to republish the descriptions, which remain the employer's copyright.

Does it work on the free plan? Yes. Apify's free plan includes $5 of monthly platform credit, and the default 100-job cap is sized so a first run fits inside it comfortably. Nothing degrades silently: when a spending cap is reached the run stops and says so in the summary.

Other scrapers we maintain

Same engine, same pricing model, same promise: flat rows, stated limits, and no charge for a row that came back empty.

Google Maps Contact ScraperLocal businesses by category and city — phone, website, split address and opening hours.
Local Business Phone ScraperThe same job from directory sources, with Better Business Bureau accreditation on the row.
YouTube Influencer ScraperCreators by niche, with the website and socials they publish and a subscriber filter.
Telegram Channel Messages ScraperPosts from public channels — text, views, reactions and media links, no account needed.
Threads Hashtag ScraperThreads posts by hashtag or keyword, with author, engagement and links.
RedNote Xiaohongshu Profile ScraperPublic RedNote creator profiles in bulk — followers, bio, IP location and their notes.