Jobs Search API: 236,000 Roles, No Cookies, No Company List avatar

Jobs Search API: 236,000 Roles, No Cookies, No Company List

Pricing

from $1.10 / 1,000 job postings

Go to Apify Store
Jobs Search API: 236,000 Roles, No Cookies, No Company List

Jobs Search API: 236,000 Roles, No Cookies, No Company List

Search every open role across 7,368 Greenhouse, Ashby and Workable boards at once, without knowing a company name. The data comes from each employer's own board, so there is no login and no cookies. Or switch to Companies mode for who is hiring hardest and the departments they just entered.

Pricing

from $1.10 / 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

8 hours ago

Last modified

Share

Search 230,508 open roles across 7,131 company job boards on Greenhouse, Ashby and Workable 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.

Two modes, because two very different people need this data.

Jobs returns one row per open role. 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 job scrapers ask you for a list of companies. 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 99% of rows; the board token where the ATS publishes no name
locationas published; locations too when a job is open in several places
countryresolved from that string, on 87.8% 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 44% of jobs
postedAtISO-8601, present on 99.8%
seniorityintern, junior, senior, staff, principal, lead, director, executive
employmentTypefull-time, part-time, contract, temporary, internship
workArrangementremote, hybrid, onsite; 42,894 roles are remote
salarythe band the employer published, on 7.7% of jobs, Ashby only
platform, boardToken, jobIdwhere it came from, so you can go back to the source

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
  • postedAfter — an ISO date
  • maxResults — ceiling on rows returned and charged (1,000 default, 10,000 max)

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, Workable states a remote flag and an employment type. 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 100% labelled
employmentType 42% labelled
seniority 33% 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 99.8% 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 288,814 place strings across 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 87.8% 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 and Workable. 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.

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 7.7% of jobs, 17,767 of them, from Ashby only, as the band the employer published rather than a number parsed out of prose. Greenhouse and Workable expose no salary field at all, so the honest options were to ship what exists or to guess, and 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 98.9% 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. 84% 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, the per-board scrapers are cheaper and always current, because they read that board live at the moment you ask:

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