ATS Jobs Scraper: Company Job Boards by Domain avatar

ATS Jobs Scraper: Company Job Boards by Domain

Pricing

from $1.50 / 1,000 job postings

Go to Apify Store
ATS Jobs Scraper: Company Job Boards by Domain

ATS Jobs Scraper: Company Job Boards by Domain

Give it a company domain and it finds which hiring system that company runs, then reads the board: Greenhouse, Lever, Ashby, Workable, Recruitee, Rippling, Workday, Personio and SmartRecruiters. Titles, locations, departments, salary where published. No API key, no proxy, no board token to look up.

Pricing

from $1.50 / 1,000 job postings

Rating

0.0

(0)

Developer

Daniel Meshulam

Daniel Meshulam

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Give it a domain. That is all.

{ "companies": ["stripe.com", "figma.com", "openai.com"] }

No API key. No proxy. No board tokens to look up. No blocked requests.

Why this returns data when job scrapers return 403

Indeed, Glassdoor, ZipRecruiter and LinkedIn Jobs do not originate job data. They aggregate it from company career pages, and those pages run on a handful of applicant tracking systems that each publish a free, keyless, public JSON API, because companies want their openings indexed.

So the aggregators are behind Cloudflare while the actual source is wide open. Measured from a residential address on 2026-08-01:

AggregatorSource
indeed.com/jobs403, zero bytesgreenhouse / stripe → 548 jobs
glassdoor.com403, zero bytesashby / openai → 753 jobs
ziprecruiter.com403, zero byteslever / palantir → 302 jobs
upwork.com403, zero bytesrippling / rippling → 768 jobs

Going to the source is also fresher. An aggregator shows you its last crawl. This shows you the board.

You do not need to know the board token

Every other ATS Actor asks you for one. You cannot use the Greenhouse API without knowing that Figma is figma and Databricks is databricks, and there is no directory to look that up in.

This Actor derives candidates from the domain and verifies each one against the live API. That works because a board that does not exist answers 404 while a board with nothing open answers 200 with an empty list, so a 200 is proof rather than a maybe.

Measured on 30 companies:

MethodResolved
Reading the careers page for an ATS link50%
Deriving the token and verifying it90%

Reading the page fails on stripe.com because its careers page is a JavaScript app that names no board. Deriving and verifying finds Stripe's 548 open roles.

One shape, seven platforms

greenhouse, lever, ashby, workable, recruitee, rippling, smartrecruiters. Each names the same five things differently. Every row comes back the same:

Field
title, location, url
departments, offices
company, atsPlatform, boardToken, boardUrlwhich system, which board
postedAt, updatedAt
descriptionopt in, see below
employmentType, isRemote, compensationwhere the platform provides it

Filters that do not cost you anything

{
"companies": ["stripe.com"],
"titleKeywords": ["security"],
"remoteOnly": true
}

Filtered rows are not charged. Keywords are matched as plain text, so c++ and node.js mean exactly that rather than being read as regular expressions.

Two limits worth knowing before you run it

includeDescription is off by default, and that is not laziness. It is expensive at the source: Greenhouse returns 111 KB for a board without descriptions and 1.97 MB with them, an 18x difference for the same jobs. Turn it on when you want the text.

Rippling's board API returns no description at all, at any setting. Five fields per job and nothing more. That is the source's limit, and rows from it simply carry no description rather than an empty one.

Where a wrong answer would be easy, this says so instead

A wrong board token gets an explanation, not an empty dataset:

greenhouse has no board 'zzznotarealzzz'. The API answers 404 for a board that
does not exist and 200 for one that exists but has nothing open, so this is
genuinely the wrong token, not an empty board.

SmartRecruiters is the one place this is not possible, and it is labelled. It answers 200 {"totalFound":0,"content":[]} both for a company id that does not exist and for one with no open roles, and /v1/companies/<id> returns 404 even for Visa, whose postings endpoint returns real jobs. There is no way to tell the two apart, so an empty SmartRecruiters result says exactly that rather than reporting a confident zero. Token guessing is disabled for that platform for the same reason.

Who this is for

  • Recruiters and sourcers: watch a list of target companies without a seat in anyone's tool
  • Job seekers: the roles, from the company, before the aggregator crawls
  • Sales and BD: hiring is the clearest public signal of where budget went
  • Market research: headcount direction by team, by company, over time
  • LLM pipelines: clean JSON, no HTML parsing, no key to rotate

Notes

  • Sources are public APIs that companies publish deliberately so their openings get indexed. Nothing here is behind a login, a paywall or a bot wall.
  • An empty board is a real answer and is reported as one: the company is on that platform and is not hiring right now.
  • Three of the thirty companies tested run an ATS this Actor does not yet cover. Pass boards directly if you know the platform and token.
  • Errors are per company. One unresolvable domain does not end the run, and error rows are not charged.

The nine systems

SystemFound from a domain?Notable
Greenhouseyesthe biggest startup boards, databricks 803 roles
Leveryesanswers with a bare JSON array, unlike every other one
Ashbyyesthe only one with a salary band, behind a parameter
WorkableyesEuropean mid-market, many small boards
Recruiteeyesper-subdomain, so the domain usually is the token
Ripplingyesrippling alone is 768 roles, and publishes no descriptions
Workdaynothe biggest boards anywhere: NVIDIA 2,000, Salesforce 1,478. Takes its careers URL, because the address carries three unknowns a domain cannot supply
Personionostructured salary: min, max, currency and period as separate fields. A bogus subdomain answers 429, so a guess cannot be confirmed
SmartRecruitersnoanswers the same empty response for an unknown company and for one with nothing open

The three marked "no" are not missing features. On the other six a bogus board answers 404, which is what makes a derived token provable. On these three it does not, so they ask for an exact board rather than inventing an answer.

Watching, rather than reading

If you are running this on a schedule to see what is new, Job Change Monitor is the Actor for that. It reports only the roles that appeared and the roles that disappeared since its last run, so a daily check on Stripe returns the four new openings rather than the 548 that were already there.

A search of the Apify Store on 2026-08-01 found no other Actor that does this for jobs. Its first run records a baseline and is not charged.