ATS Jobs Search API: 604,000 Job Listings, No Company List
Pricing
from $6.60 / 1,000 job postings
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
Maintained by CommunityActor stats
0
Bookmarked
8
Total users
4
Monthly active users
10 hours ago
Last modified
Categories
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 forBjak 1378 1174 361 surging A1 CEO Office, A1 Engineering, A1 HRRenuity 437 364 152 surging Corporate, FieldMindrift 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:
| field | notes |
|---|---|
title | the role, as the employer wrote it |
company | the 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 |
location | as published; locations too when a job is open in several places |
country | resolved from that string, on 85.3% of roles; countries when a role spans several |
region, city | the state or province and the city, where the string gave one |
url | the real application link, on the employer's own site |
department | present on 35% of jobs |
postedAt | ISO-8601, as the employer published it. BambooHR and Rippling publish no date at all, so their roles carry none |
seniority | intern, junior, senior, staff, principal, lead, director, executive |
employmentType | full-time, part-time, contract, temporary, internship |
workArrangement | remote, hybrid, onsite; 67,173 roles are remote |
salary | a pay band on 11.9% of jobs: published by Ashby, Personio and Breezy, and recovered from the job description on Greenhouse |
platform, boardToken, jobId | where 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:
| platform | what its job board API publishes |
|---|---|
| Greenhouse job board API | the Greenhouse jobs API in full: postings, departments, offices. The largest source here |
| Workable job board API | postings, a remote flag and an employment type |
| Ashby job board API | postings plus the salary band the employer wrote |
| BambooHR job board API | small employers almost nobody else indexes; no date field |
| Recruitee job board API | postings and the company's own display name |
| Rippling job board API | postings and work location; no date field |
| Personio job board API | XML, with a structured salary minimum and maximum |
| Breezy job board API | postings, a remote flag and a structured salary range |
| Teamtailor job board API | postings from a heavily Nordic and European base |
| Workday career site API | enterprise 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,departmentmatch a fieldcountriesmatch a resolved country, so German roles arrive whether the board wroteBerlin, Germany,Berlin,Munich, DEorDE - Berlinkeywordsmatch any of those fields at oncetitleExclude,companyExclude,locationExcludedrop matchesworkArrangementsremote / hybrid / onsiteseniorityintern through executiveemploymentTypesfull-time through internshipplatformsgreenhouse / ashby / workable / recruitee / personio / rippling / bamboohr / breezy / teamtailor / workdaypostedAfteran ISO date, from the date the EMPLOYER wrotechangedSincean ISO date, from the day WE first saw the posting. This is the one to poll onmaxResultsceiling 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:
hiringLabelssurging (top 1%), growing (top 10%), steady, slow, quietminOpenedLast30,minOpenedLast7,minOpenRolesenteringNewDepartmentsonly companies moving into a new functionincludeStaffingAgenciesoff 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% labelledemploymentType 40% labelledseniority 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, CABengaluru, 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:
| field | what it is |
|---|---|
salary | exactly what the employer wrote, e.g. $250K - $300K |
salaryMin / salaryMax | the band as numbers, in its own currency and period |
salaryCurrency | USD, EUR, GBP, CAD, … |
salaryPeriod | year, month, week, day, hour |
salaryAnnualMin / salaryAnnualMax | normalised 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.
Related Actors
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