ATS Jobs Search API: 604,000 Job Listings, No Company List avatar

ATS Jobs Search API: 604,000 Job Listings, No Company List

Pricing

from $6.60 / 1,000 job postings

Go to Apify Store
ATS Jobs Search API: 604,000 Job Listings, No Company List

ATS Jobs Search API: 604,000 Job Listings, No Company List

Search every open role across 23,000 company career sites and job boards on 10 ATS platforms at once, without knowing a company name. From the employer's own board: no login, no cookies.

Pricing

from $6.60 / 1,000 job postings

Rating

0.0

(0)

Developer

Daniel Meshulam

Daniel Meshulam

Maintained by Community

Actor stats

0

Bookmarked

8

Total users

4

Monthly active users

10 hours ago

Last modified

Share

Job Search API: 604,787 Roles Across 10 ATS Platforms, No Cookies

Search 604,787 open roles across 23,476 company job boards on Greenhouse, Ashby, Workable, Recruitee, Personio, Rippling, BambooHR, Breezy, Teamtailor and Workday at once. You do not need to know a single company name.

Every row comes from the employer's own careers API, the one they publish so job aggregators can syndicate it. That is the whole difference from a scraper that reads a job site: there is no login, no cookies to hand over, and no account of yours in the loop.

Three modes, because three very different people need this data.

Jobs returns one row per open role. Closed returns roles that DISAPPEARED, which no job board publishes. Companies returns one row per company ranked by how hard they are hiring right now, with the departments and locations they have just entered called out:

company open 30d 7d pace just started hiring for
Bjak 1378 1174 361 surging A1 CEO Office, A1 Engineering, A1 HR
Renuity 437 364 152 surging Corporate, Field
Mindrift 275 262 246 surging Creator (Writer)

A company opening its first security, sales or finance roles has just changed strategy, and that is the strongest buying signal in the dataset. Staffing agencies are excluded from Companies mode by default, because they post on behalf of others and otherwise dominate every ranking.

Most tools that scrape job postings ask you for a list of companies first. That only works if you already have the list, which is the hard part. This one holds the index, so you ask a question instead:

senior backend engineers in Berlin, remote, posted since July, not internships

No API key. No cookies. No proxy. No company list. No rate limits to work around.

Duplicates are already merged. A role posted to several offices, or listed twice by the same board, arrives once with its locations kept together: 29,653 rows, 11.1% of the raw corpus, collapsed at build time rather than left for you to deduplicate.

What you get back

One row per job, as clean JSON:

fieldnotes
titlethe role, as the employer wrote it
companythe employer's real name, on 69% of rows. Workday publishes no company name at all, so its 30% of the index carries the tenant's own identifier (astrazeneca, kiongroup) instead; a search matches it either way. The remaining 1% is the board token, where the ATS published nothing
locationas published; locations too when a job is open in several places
countryresolved from that string, on 85.3% of roles; countries when a role spans several
region, citythe state or province and the city, where the string gave one
urlthe real application link, on the employer's own site
departmentpresent on 35% of jobs
postedAtISO-8601, as the employer published it. BambooHR and Rippling publish no date at all, so their roles carry none
seniorityintern, junior, senior, staff, principal, lead, director, executive
employmentTypefull-time, part-time, contract, temporary, internship
workArrangementremote, hybrid, onsite; 67,173 roles are remote
salarya pay band on 11.9% of jobs: published by Ashby, Personio and Breezy, and recovered from the job description on Greenhouse
platform, boardToken, jobIdwhere it came from, so you can go back to the source

Which job board APIs this covers

Each of these is a public job board API the employer's own applicant tracking system publishes so aggregators can syndicate the postings. No key, no login, no cookies. This Actor reads every one of them nightly and answers one query across them:

platformwhat its job board API publishes
Greenhouse job board APIthe Greenhouse jobs API in full: postings, departments, offices. The largest source here
Workable job board APIpostings, a remote flag and an employment type
Ashby job board APIpostings plus the salary band the employer wrote
BambooHR job board APIsmall employers almost nobody else indexes; no date field
Recruitee job board APIpostings and the company's own display name
Rippling job board APIpostings and work location; no date field
Personio job board APIXML, with a structured salary minimum and maximum
Breezy job board APIpostings, a remote flag and a structured salary range
Teamtailor job board APIpostings from a heavily Nordic and European base
Workday career site APIenterprise employers, the largest single source of roles here

Per-platform counts are deliberately not listed: the index rebuilds nightly and a number in prose goes stale silently. The totals at the top are checked against the shipped database on every build.

If you only want to scrape job postings from ONE company you already know, the per-board scrapers listed at the bottom are cheaper and read that board live. This one exists for the other question: which companies are hiring at all, which no per-company job board API can answer, because you would need the list of companies first.

Filters

Text filters accept several lines, OR-ed together, and a trailing * for prefix matching (engineer* also matches engineering). A multi-word line is a phrase, so product manager will not match "Product Marketing Manager".

  • title, company, location, department match a field
  • countries match a resolved country, so German roles arrive whether the board wrote Berlin, Germany, Berlin, Munich, DE or DE - Berlin
  • keywords match any of those fields at once
  • titleExclude, companyExclude, locationExclude drop matches
  • workArrangements remote / hybrid / onsite
  • seniority intern through executive
  • employmentTypes full-time through internship
  • platforms greenhouse / ashby / workable / recruitee / personio / rippling / bamboohr / breezy / teamtailor / workday
  • postedAfter an ISO date, from the date the EMPLOYER wrote
  • changedSince an ISO date, from the day WE first saw the posting. This is the one to poll on
  • maxResults ceiling on rows returned and charged (1,000 default, 10,000 max)

Polling it: what is new since your last run

Point changedSince at the day you last synced and you get only postings this index first SAW on or after it. Consecutive runs tile with no gap and no overlap, which is what you need when you are loading this into your own database on a schedule.

Use it instead of postedAfter, which cannot answer this. postedAfter reads the date the employer typed, and that fails two ways: BambooHR and Rippling publish no date at all, so a postedAfter poll silently drops two entire platforms every run, and everywhere else the employer's date moves when they edit or repost. firstSeen is the day the posting appeared to us, on every platform equally.

Every row carries firstSeen, and it is absent on jobs that were already open the first time we read their board. We did not watch those appear, so we will not claim a date for them, and changedSince leaves them out rather than guessing. That share shrinks every night as the index watches more boards for longer.

Closed mode: what disappeared

mode: closed returns roles this index watched go away, with the day they went and, where both ends are known, how long they were open.

No job board publishes this. A board serves what is open, so which postings vanished only exists if something looked yesterday as well. It is also the honest form of the "no ghost jobs" line elsewhere in this niche: rather than asserting our open roles are fresh, this shows you the ones that stopped being open, and when.

daysOpen is absent, not zero, where the role was already open when we first read its board. We know when it closed and not when it opened, and an understated duration is worse than a missing one.

Companies mode adds:

  • hiringLabels surging (top 1%), growing (top 10%), steady, slow, quiet
  • minOpenedLast30, minOpenedLast7, minOpenRoles
  • enteringNewDepartments only companies moving into a new function
  • includeStaffingAgencies off by default

Excluded and filtered jobs are never returned and never charged.

Honest limits

These matter more than the feature list, so they are here rather than buried.

How the labels are made. workArrangement and employmentType come from what the board itself publishes wherever it publishes one: Ashby states a workplace type, and Workable, BambooHR and Breezy state a remote flag. Where the board says nothing, the label is read from the title and location text. A job that could not be classified is left unlabelled rather than guessed into a bucket, so filtering on a label narrows to jobs that actually carry it:

workArrangement 99.4% labelled
employmentType 40% labelled
seniority 28% labelled

seniority is derived from the title on every platform, because no ATS publishes a seniority field. Two thirds of titles say nothing recognisable.

How "recently opened" is known. Two sources, and every company row says which one answered in signalSource. postedAt is the employer's own stamp, on 77.4% of jobs. firstSeen is the day this index first saw the posting, which is better because it moves when a company quietly reposts a role, and it is the only thing that can ever tell you a job closed. A job that was already open when this index started watching has no meaningful firstSeen, so those fall back to postedAt rather than pretending we saw them appear. closed30 and net30 are absent, not zero, until enough history exists to know: "closed nothing" and "we do not know yet" must never look the same.

Freshness, with the actual distribution. The index is rebuilt nightly from the live boards, not scraped per run, which is what makes a query cost a fraction of a cent instead of eight thousand HTTP requests. Every role here is one the employer still has up, but "still up" is not the same as "just posted", so here is the spread by the employer's own postedAt:

under 1 week 9%
under 1 month 33%
under 3 months 63%
over a year 11%

The long tail is real: some boards keep evergreen pipeline reqs open for years. Filter with postedAfter if you only want fresh ones, and follow url to the employer's own page, which is always authoritative.

Country is resolved, not searched as text. Employers publish a location however they like, and the 90,696 distinct place strings in this corpus come in three shapes at roughly a third each: no comma (Remote, London), one (

San Francisco, CA
), two (Bengaluru, Karnataka, India). country resolves 85.3% of roles to a single name so you can ask for Germany once instead of guessing four spellings.

What it refuses to answer is the point. EMEA, Europe and Worldwide are not countries and get none. A bare Cambridge gets none either: on the rows that do carry a disambiguator, this corpus resolves Cambridge to the United States 439 times and the United Kingdom 143, so a bare one is a coin flip and is left empty rather than filled in confidently. The same applies to Birmingham, Vienna, Valencia and a bare Georgia, which is a US state and a country. A name is only answered where one country takes at least 80% of the disambiguated evidence, which is why London (99%) and San Jose (96%) still resolve.

Coverage. Greenhouse, Ashby, Workable, Recruitee, Personio, Rippling, BambooHR, Breezy, Teamtailor and Workday. Workday alone carries more roles than any other single source here, and it is where the large enterprises are. The others widen the map well beyond US tech: Recruitee and Personio carry the European mid-market, Personio especially the German-speaking one, Rippling carries young US companies, and BambooHR carries small employers almost nobody else indexes, thousands of them with a handful of roles each. Breezy carries small and mid-size employers worldwide, and Teamtailor is heavily Nordic and European. Lever is not included: their robots.txt blocks the crawler this index is seeded from, so there is no complete list of Lever boards to build from and a partial one would be worse than none. If you need one specific Lever company, use our Lever Jobs Scraper. SmartRecruiters is not included either, for the mirror-image reason: their API's robots.txt permits it to one named crawler and disallows everyone else, and an index built against a source's stated wishes is not one you should pay for.

No descriptions. A search returns the job; fetching its full description is one more call against that one board. Carrying descriptions would make this index eighteen times larger to serve a query almost nobody makes.

Salary is present on 11.9% of jobs, 71,712 of them, and it comes from two different places that the row tells you apart.

Three platforms publish a band outright: Ashby as a formatted string on 39.3% of its rows, Breezy as a structured min/max on 43.7%, Personio on 7.3%. That is the employer stating their own number and it is never overridden.

Greenhouse publishes no salary field at all, but US pay-transparency law makes many of its employers write the band into the job description, so it is read from there: 21,449 rows, 13.0% of Greenhouse. It is an inference from the employer's own prose rather than a structured field, and it only ever fills a row that had nothing.

Workable, Recruitee, Rippling, BambooHR and Teamtailor expose no salary anywhere and no description band worth reading, so their rows carry none. Guessing a salary is worse than omitting one.

Every one of those bands also ships as numbers, so you can ask for roles over $150k instead of reading strings:

fieldwhat it is
salaryexactly what the employer wrote, e.g. $250K - $300K
salaryMin / salaryMaxthe band as numbers, in its own currency and period
salaryCurrencyUSD, EUR, GBP, CAD, …
salaryPeriodyear, month, week, day, hour
salaryAnnualMin / salaryAnnualMaxnormalised to a year: hourly × 2,080, monthly × 12

Filter with minAnnualSalary, maxAnnualSalary and salaryCurrency.

99.9% of published bands parse into numbers and 99.1% carry an annual figure. Where it is not sure, it says nothing rather than guessing. Nine in ten bands state no period at all, so a figure under 2,000 with nothing said about it is left un-annualised instead of being called either a salary or an hourly rate; a band written $0 - $100K is treated as an unfilled field; and an hourly figure that would annualise past $10M is refused outright. You get fewer rows than the maximum possible, and no wrong ones.

Nothing is converted between currencies. 91% of published bands are US dollars, and baking today's exchange rate into an index that rebuilds every night would be stale by morning, so salaryCurrency ships beside the numbers and the conversion is yours to make if you need it.

Pricing

Pay per job returned. Nothing else is charged: not the run, not filtered rows, not a search that matches nothing.

If you already know the company, these per-board ATS job scrapers are cheaper and always current, because each reads that one board live at the moment you ask:

  • Greenhouse Jobs Scraper
  • Ashby Jobs Scraper
  • Lever Jobs Scraper
  • Workday Jobs Scraper