ATS Jobs Scraper avatar

ATS Jobs Scraper

Pricing

from $0.70 / 1,000 job-details

Go to Apify Store
ATS Jobs Scraper

ATS Jobs Scraper

Scrape jobs from any company careers page. It recognises Greenhouse, Lever, Ashby, Workday, Oracle HCM, SuccessFactors, Taleo, Mercury xRM and SmartRecruiters from the URL. Get title, location, department, dates and the full advert. Export to CSV, JSON or Excel.

Pricing

from $0.70 / 1,000 job-details

Rating

0.0

(0)

Developer

BonCross API

BonCross API

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 days ago

Last modified

Share

What is ATS Jobs Scraper?

You have a list of companies and you want their open jobs. Some run Greenhouse, some Workday, one has a careers site with its own branding and no clue what's underneath. ATS Jobs Scraper takes the careers page URL for each, works out which of nine recruitment platforms is behind it, and returns the jobs in one shape whichever platform they came from.

So you paste the page you'd send a candidate to, and you never have to know which system an employer uses.

Why it earns its place:

  • Nine platforms, one row shape. Greenhouse, Lever, Ashby, Workday, Oracle HCM, SAP SuccessFactors, Oracle Taleo, Mercury xRM and SmartRecruiters. A pipeline written for one reads them all.
  • It reads whole boards. 16 careers pages across all nine platforms, taken in full with every advert, returned 6,110 rows in about 9 minutes with none missing.
  • It handles long lists. 110 careers pages at 20 jobs each returned 1,875 rows in 116 seconds, about 970 rows a minute.
  • The advert text has been checked at the source. In our release run, 18 of 18 checkable adverts matched the employers' own pages.
  • A page it can't read doesn't sink the run. You get a row saying the page wasn't recognised, and the other companies carry on.

BonCross Verified means we tested this actor against the live site before release and kept the record:

  • 42 of 42 live checks on its inputs and filters passed on 7 October 2026
  • 16 boards run the same day across nine hiring platforms: 167 jobs, 1 error row
  • 18 of 18 checkable adverts matched their own pages
  • Charges matched the rows: 1 start, 16 boards, 167 jobs

Which careers pages work?

Paste the careers page as you find it. These are recognised from the URL:

PlatformA careers page looks like
Greenhousejob-boards.greenhouse.io/company
Leverjobs.lever.co/company
Ashbyjobs.ashbyhq.com/company
Workdaycompany.wd3.myworkdayjobs.com/en-US/Careers
Oracle HCMcompany.fa.em5.oraclecloud.com/hcmUI/CandidateExperience/en/sites/CX_1001/jobs
SAP SuccessFactorscompany.jobs2web.com/search/
Oracle Taleocompany.taleo.net/careersection/external/jobsearch.ftl
Mercury xRMcareers.company.com/jobs/vacancy/find/results/ or careers.company.com/jobs/rss
SmartRecruiterscareers.smartrecruiters.com/Company or jobs.smartrecruiters.com/Company

An employer's own branded careers site (for example jobs.tfl.gov.uk/search/) is recognised from the page itself where it runs on SAP SuccessFactors, or where it links its adverts to SmartRecruiters, Greenhouse, Ashby or Lever.

If all your companies are on one platform, the single-platform actors have a simpler form: Greenhouse, Lever, Ashby and Workday.

What data can you extract from a careers page?

FieldField
💼 Job title🏢 Employer
📍 LocationDepartment or team
📄 Full advert textAdvert HTML, optional
Contract typeRemote flag
📅 Posted date🔗 Advert link
💷 Salary from and toSalary currency and period
Job idWhich platform it came from
Employer board nameThe careers page it came from
When the row was collectedLast edited date, where published
Posting date as the site wrote itEvery location a job is open in
🏠 On-site, hybrid or remote, where published

How to scrape a careers page

  1. Create a free Apify account and open ATS Jobs Scraper.
  2. Paste one careers page URL per company.
  3. Narrow by title, location or work type if you don't want the whole board.
  4. Press Start.
  5. Download the jobs as Excel, CSV or JSON, with an ats column telling you which platform each came from.

⬇️ Input

All you have to supply is the URLs. For a long list, use Start URLs to load them from a file or a Google Sheet.

"Max jobs per careers page" caps each employer and "Max jobs for the whole run" caps the run. Both default to 0, which reads each board in full.

One company

{
"careersUrls": ["https://job-boards.greenhouse.io/stripe"],
"maxItemsPerBoard": 200
}

Several companies, engineering roles only

{
"careersUrls": [
"https://job-boards.greenhouse.io/stripe",
"https://jobs.lever.co/palantir",
"https://jobs.ashbyhq.com/ramp"
],
"titleIncludes": ["engineer", "developer"],
"maxItems": 500
}

Hybrid or remote jobs only

{
"careersUrls": ["https://jobs.lever.co/palantir"],
"workplaceTypes": ["Hybrid", "Remote"],
"includeUnknownWorkplace": false
}

Remote jobs from the last seven days, adverts included

{
"careersUrls": ["https://jobs.ashbyhq.com/ramp"],
"onlyRemote": true,
"maxDaysOld": 7,
"fetchDetails": true
}

A scheduled run that reports only jobs it hasn't reported before

{
"careersUrls": ["https://salesforce.wd12.myworkdayjobs.com/External_Career_Site"],
"onlyNew": true,
"dedupStoreName": "ats-seen",
"locationIncludes": ["London"]
}

How the filters behave on different platforms

Platforms don't all offer the same things, so three inputs need a word.

Keyword uses the platform's own job search on Workday, Oracle HCM, Taleo and SuccessFactors search pages. On Greenhouse it matches the title and advert the way the board's search does. On Lever, Ashby, Mercury xRM and SmartRecruiters it matches job titles. If the link you paste already has a search word in it, that word is kept and your keyword then matches titles only.

Work type keeps jobs whose workplaceType is On-site, Hybrid or Remote. It's applied before any advert is fetched, except on Workday, which states the arrangement on the advert: there each advert is fetched, and billed as a fetched advert, before its job is kept or dropped. A job with no stated arrangement is kept unless you turn off "Keep jobs with no stated work type". If its location or title says remote, it counts as Remote.

A pre-filtered link keeps its filters. Filter a Workday, Greenhouse, Lever or Ashby board on its own page (department, office, location, team, category and so on), copy the link, and those filters apply here the way the board applies them.

The others are simpler:

  • "Title must contain" and "Title must not contain" keep or drop a job by words in its title, ignoring case.
  • "Location must contain" keeps a job only if its location has one of your words, such as "London". Jobs on a platform that publishes no location are dropped by it.
  • "Remote jobs only" keeps jobs the employer marked as remote. A job that says nothing about remote working is dropped, not assumed.
  • "Posted within (days)" keeps jobs posted in the last N days. 0 keeps everything.
  • "Fetch full job adverts" is on by default. Greenhouse, Lever and Ashby return the advert with the listing. On the other six platforms each job is opened to get it.
  • "Include advert text" (on) and "Include advert HTML" (off) choose the advert as plain text, as original HTML, or both. HTML makes rows a lot larger.

For developers

  • Keys: careersUrls, startUrls, maxItemsPerBoard, maxItems, keyword, titleIncludes, titleExcludes, locationIncludes, onlyRemote, workplaceTypes, includeUnknownWorkplace, maxDaysOld, fetchDetails, includeDescription, includeDescriptionHtml, oracleLocationId, onlyNew, dedupStoreName, maxConcurrency, delayMs.
  • onlyNew with a dedupStoreName skips jobs an earlier run with the same store name returned. Leave the store name empty and nothing is remembered. The store is updated every minute while the run delivers jobs.
  • oracleLocationId restricts an Oracle HCM board to one place by Oracle's own location id (London is 300000007171591). Empty means the whole board.
  • maxConcurrency (default 8) is how many requests run at once across the run. The default is the fastest level we measured clean. Lower it only if a run reports refusals or errors. delayMs (default 0) is an optional pause before each request.
  • Several careers pages are read at once and adverts on a page are fetched side by side. Very large Workday boards are read at a steady pace the site accepts. Greenhouse boards are read one at a time, about 2 seconds each on average and up to 18 seconds for the largest.
  • Workday boards with more than 2,000 jobs are read group by group (by job family or country, whichever the board offers).
  • Rows are saved as they're collected. A run that hits its timeout keeps what it delivered, and a run the platform restarts carries on without delivering or charging any job twice.

⬆️ Output

One row per job, in the same shape for all nine platforms. The Overview view shows title, employer, location, department, posting date, platform and advert link.

{
"id": "8172510",
"url": "https://stripe.com/jobs/search?gh_jid=8172510",
"title": "Abuse Investigator",
"company": "Stripe",
"location": "Seattle, San Francisco, New York City",
"department": "8611 Security Analytics",
"employmentType": null,
"isRemote": null,
"postedAt": "2026-09-09T14:50:29.000Z",
"updatedAt": "2026-09-25T20:45:00.000Z",
"postedText": null,
"closingAt": null,
"salaryMin": null,
"salaryMax": null,
"salaryCurrency": null,
"salaryPeriod": null,
"description": "Who we are\n\nAbout Stripe\n\nStripe is a financial infrastructure platform…",
"ats": "greenhouse",
"tenant": "stripe",
"scrapedAt": "2026-09-26T17:08:44.892Z",
"careersUrl": "https://job-boards.greenhouse.io/stripe"
}

What the less obvious columns mean:

  • description is the advert as plain text. descriptionHtml is the board's original HTML and is present only when you ask for it.
  • workplaceType is On-site, Hybrid or Remote where the platform publishes it (Ashby, Lever, SmartRecruiters, Workday adverts and Greenhouse boards that publish it) and absent otherwise.
  • isRemote is true or false only where the platform says so, and null otherwise. A hybrid job isn't remote unless one of its locations is.
  • postedAt is when the advert was first published, and it's what "Posted within (days)" filters on. updatedAt is when the employer last edited it, where the platform reports that. The two are often months apart: a job edited this week can be one first posted in February.
  • postedText keeps the original wording where a platform gives the date in words ("Posted 3 Days Ago"). postedAt is null where the platform gives no date, or only a floor such as "Posted 30+ Days Ago".
  • locations appears where a platform names more than one location for a job, primary first. "Location must contain" matches against all of them.
  • closingAt is kept in the shape for all platforms and is empty on all nine today.
  • detailNote appears on the rare row whose advert page held no advert, and says so.

How many boards and jobs fit in a run?

It reads a whole careers page unless you cap it. In one run that took five jobs from each of eight careers pages (37 jobs, 23 seconds), the boards behind them held 654 jobs at Stripe, 313 at Palantir, 173 at Freshfields, 147 at Ramp, 64 at Oracle, 57 at Reed Smith and 31 at TfL.

Speed on Apify at default settings, 1 and 2 October 2026:

RunResult
One careers page, 20 jobs20 rows in 1 to 5 seconds (once 13, a slow start)
10 careers pages on all nine platforms, 25 jobs each with adverts226 rows in 8 to 11 seconds. Twice 30 to 65 seconds, when one employer's site was that slow to answer a single advert
A 1,526-job Workday board, listing only1,503 rows in 9 seconds
A 1,526-job Workday board with every advert1,510 rows in about 6 minutes
16 careers pages in full on all nine platforms, every advert6,110 rows in about 9 minutes, none missing
110 careers pages on nine platforms, 20 jobs each with adverts1,875 rows in 116 seconds (about 970 rows a minute)
Two 2,000+ job Workday boards, 600 adverts each1,200 rows in 81 seconds, none refused

Adding employers adds little time. At the bulk rate, one run inside the default one-hour timeout handles roughly 3,000 careers pages at 20 jobs each. An input of only Greenhouse boards fits about 1,700 boards an hour.

The job id, link, title, employer, posting date, advert text and platform were on every row of the eight-page run. Location and department depend on the platform, and salary appears only where the employer chose to publish it.

How much does it cost to scrape careers pages?

EventFree planStarterScaleBusiness
actor-start, per run$0.001$0.001$0.001$0.001
board-scanned, per careers board read$0.0002$0.0002$0.0002$0.0002
job-detail, per job with the full advert$0.001$0.0009$0.0008$0.0007
job-listed, per job without the full advert$0.0005$0.00045$0.0004$0.00035
url-checked, per page that answered with no supported job board$0.0005$0.0005$0.0005$0.0005

Enterprise plans pay the Business price.

$1.00 per 1,000 jobs with the full advert on the Free plan and $0.70 on Business, whichever of the nine platforms they come from. Jobs without the advert are $0.50 per 1,000 on the Free plan, $0.35 on Business. None of these platforms needs a proxy, so there are no proxy charges, and platform usage is included.

  • 500 jobs with full adverts from one careers page: $0.001 + $0.0002 + 500 × $0.001 = $0.5012 ($0.3512 on Business).
  • Those 500 jobs without the advert: $0.001 + $0.0002 + 500 × $0.0005 = $0.2512 ($0.1762 on Business).

How a job is billed, once each:

  • job-detail when the row has the full advert. On Greenhouse, Lever and Ashby that's whenever advert text or HTML is included (text is on by default). On the other six it's when the job's advert was opened. An opened advert is billed even if "Posted within (days)" then drops the row.
  • job-listed for a job delivered without its full advert.
  • board-scanned once per careers board read, and url-checked for a page that answered but has no supported job board. A URL that never answers is free.

The $5 of credits Apify's Free plan gives you each month covers about 4,900 jobs with full adverts, at 100 jobs a careers page.

Limitations

  • Nine platforms, no more. A careers page built by hand, or on a platform not in the table above, returns a row saying it wasn't recognised.
  • SmartRecruiters boards are per company id. Some large employers post under several, one per legal entity. Paste the SmartRecruiters page for each one you want. An employer's own branded site is read as the first of its boards that it links to.
  • Location and department are only as good as the employer's listing. Mercury xRM and Taleo boards often publish no location beside the job list. The advert's text often names one.
  • Some platforms show an advert only in the visitor's browser. Where the advert isn't available, the row keeps its listing fields and has a detailNote.
  • Salary is a minority. It appears only where the employer published one.
  • Relative dates. Some platforms give "Posted 3 Days Ago", so the date is derived and the wording kept beside it. "Posted 30+ Days Ago" is a floor, not a date, and leaves postedAt empty. A few boards publish no posting date at all.
  • Keyword reach varies. It matches title and advert text on Workday, Oracle HCM, Taleo, Greenhouse and SuccessFactors (on a board's search page), and job titles on Lever, Ashby, Mercury xRM and SmartRecruiters. SmartRecruiters' own search isn't used: in a check it missed jobs with the word in their title and returned jobs with the word nowhere in title or advert.
  • Work type is known only where it's stated: Lever, Ashby, SmartRecruiters, Workday adverts that have it, Oracle HCM where set, and Greenhouse boards with a work-type field.
  • Very large Workday boards. Above 2,000 jobs a board is read group by group, and a job the board files under no group could be missed.
  • No applications. You can't submit one through this actor.

FAQ

How do I know which platform a company uses?

You don't have to. Paste the careers page and the actor works it out. The ats column in the results tells you afterwards.

What happens if one of my URLs isn't a supported careers page?

That URL gets a row saying it wasn't recognised and is billed url-checked ($0.0005). Your other URLs are unaffected.

How do I track new jobs across a list of companies?

Turn on "Only jobs not seen before", give the store a name, and schedule the run in Apify Console. Each run returns what has appeared since the last.

Why do most rows have no salary?

Most employers don't publish one. In practice it's Ashby and Lever boards, and Greenhouse boards with a pay-transparency block, that do. Where a salary is advertised you get numbers with currency and period.

Why do some jobs have no location?

Some boards, mostly on Mercury xRM and Taleo, leave the location out of their job list.

Can I get listings without the adverts to save money?

Turn "Fetch full job adverts" off, and on Greenhouse, Lever and Ashby also turn "Include advert text" off. Rows then bill at the job-listed rate, half the price.

Do I need a proxy or an account anywhere?

No proxy is needed for any of the nine platforms and no account is used. You configure nothing.

Employers publish these adverts so people will find them, and the actor reads them without logging in to anything. Gathering published job adverts is generally lawful in the UK and EU. How you use the data is your responsibility.

Connecting it to a board, a CRM or an agent

A company watchlist is the usual build: your list of careers pages in a Google Sheet loaded through Start URLs, a daily schedule with only-new on, and a webhook or the Slack integration announcing the day's openings. Zapier, Make and Airbyte connect the same dataset to a CRM or a warehouse.

For code, Apify's run-sync-get-dataset-items endpoint runs the actor and returns the rows in one call. apify-client is published for Python and JavaScript, and the actor's API tab has the reference with your token filled in.

An AI agent can use it through the Apify MCP server (https://mcp.apify.com): hand it a company's careers URL and it reads the open roles as structured data, whatever the platform.

More from BonCross

Your feedback

If a careers page you expected to work came back unrecognised, send us the URL on the Issues tab in Apify Console. Those reports tell us which platforms and branded sites to look at next, and we read every one.