Job Postings Scraper - Greenhouse, Lever, Ashby avatar

Job Postings Scraper - Greenhouse, Lever, Ashby

Pricing

from $2.00 / 1,000 job postings

Go to Apify Store
Job Postings Scraper - Greenhouse, Lever, Ashby

Job Postings Scraper - Greenhouse, Lever, Ashby

Scrape job postings from company career sites on Greenhouse, Ashby, Lever, SmartRecruiters and Workable in one schema, with normalized function and seniority, country resolved from the city, and days each role has been open. Hiring signals for sales and recruiting.

Pricing

from $2.00 / 1,000 job postings

Rating

0.0

(0)

Developer

Tom Awake

Tom Awake

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Share

What does Job Postings Scraper do?

Every open role at any company — across the five applicant tracking systems that publish their job boards openly, in one schema.

A company publishes its openings on Greenhouse, Ashby, Lever, SmartRecruiters or Workable. Each exposes a public board, and each does it in a completely different shape: the title is title in one and text in another, the date is an ISO string here and a millisecond timestamp there, the location is a plain string in one and a six-field object in the next.

And nobody knows off-hand which system a given company uses.

No API key. No account.


Genuinely international, by construction

This is not a US dataset with a few foreign rows. Measured on a single run across 8 companies — 1,805 postings, 103 countries, 183 cities:

CountryPostings
United Kingdom212
United States185
Singapore141
Australia140
Malaysia116
Indonesia87
Ireland65
Vietnam58
India56
Germany43

A company in Tokyo, Berlin, São Paulo or Kuala Lumpur publishes in the same five places as one in San Francisco. One Actor reaches all of them — which covers more of the world than a separate scraper per country ever would.


The five things this does that the sources do not

1. It works out which system a company uses.

You supply a company identifier; the Actor tries all five boards and keeps whichever answers. Measured on 36 well-known companies: 75% detected, 7,550 postings. The rest run Workday, SuccessFactors or their own site, and are reported as not found rather than silently skipped.

2. One schema for five incompatible structures.

Same columns whichever board a role came from, with ats recording the origin so nothing is hidden.

3. Days each role has been open.

The hiring signal. A role open for six months is one the company cannot fill — a real, persistent need. No source gives this; they give a date. Measured: median 36 days, but 19% have been open more than 90 days, and the longest in the sample was 1,059 days.

4. Normalised function and seniority.

Greenhouse returns 8611 Security Analytics, internal cost-centre codes included. SmartRecruiters already returns Engineering. All five are mapped onto one vocabulary, and department codes are stripped.

Seniority is read from the title when the source does not give it. Manager is kept separate from Staff — they are two different career tracks, and merging them put 28% of a sample into "Staff".

5. Country resolved from the city.

Greenhouse often returns Bengaluru with no country at all, which left country empty on a quarter of rows and made country filtering useless. Cities are resolved against a table covering every continent, and country names are normalised so US and United States stop counting as two countries. Coverage: 74.3% → 90.5%.


Field coverage

Measured on 1,805 postings from 8 companies across all five systems.

FieldCoverage
company, title, jobId, location, city100%
function, seniority, daysOpen, publishedAt100%
jobUrl, applyUrl100%
country90.5%
requisitionId76.5%
department62.6%
description61.9%
employmentType60.6%
countryCode37.4%

description and countryCode are only carried by some of the five systems; they are left empty rather than filled with a guess.


What it is for

  • B2B prospecting. A company hiring twelve backend engineers is buying infrastructure. Hiring sales reps means it is expanding. The postings say so before any announcement does.
  • Market entry timing. country and city across a competitor's whole board show where they are opening, quarter by quarter.
  • Recruitment. Roles open past 90 days are the ones agencies get called about.
  • Competitive intelligence. Team names and departments reveal an org chart the company never published.
  • Compensation and talent research. Function and seniority are comparable across companies and countries.

Three dataset views ship with the Actor: Postings, Hard-to-fill roles and Global footprint.


Limits

Stated plainly, because they affect what you can conclude.

  • Roughly a quarter of companies are not reachable. Workday, SuccessFactors, Taleo and bespoke career sites are not covered. The status message names the companies that were not found, so an empty result is never mistaken for "not hiring".
  • You supply the identifier, not the company name. It is the slug in the careers URL — stripe in boards.greenhouse.io/stripe. Pasting the full URL works. A company name that is not the slug will not resolve.
  • daysOpen is time since first published, not time unfilled. Some boards re-publish a role rather than update it, which resets the clock; others leave evergreen listings open permanently. Treat a very old date as "long-running requisition", not as a precise vacancy duration.
  • Function and seniority are inferred. They are good enough to segment thousands of rows, not to adjudicate a single one. A title like "Risk Operations Associate" under a "User Policy Operations" department is a genuine judgement call.
  • The city table covers where qualified hiring concentrates, not every town. An unlisted city leaves country empty rather than guessed.
  • A posting is not a hire. Boards carry cancelled, evergreen and pipeline roles. Volume is a signal of intent, not of headcount.
  • Public boards only. Confidential and internal-only roles never appear, by design.

How much does it cost?

You pay per job posting returned: $0.003 each, that is $3.00 per 1,000. There is no start fee, and subscription plans pay less per job posting.

The example input below asks for up to 1,000 job postings, so it costs $3.00 at most.

If a run reaches the spending limit you set, the output stops at that limit and never goes past it. You are never charged for rows that were not delivered.

Use Job Postings Scraper as an API

Call it from your own code with the Apify client, here in Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("DataIO/greenhouse-lever-job-postings").call(run_input={
'companies': ['stripe', 'notion', 'grab'],
'maxItems': 1000,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

It also works from JavaScript, Make, Zapier, n8n, and from AI agents through the Apify MCP server.

Other actors you might like

FAQ

The actor reads public data from its official source, without logging in and without bypassing any access control. What you do with the data, for example contacting people listed in it, is your responsibility under the laws that apply to you, such as GDPR in Europe.

Can I run it on a schedule?

Yes. Create a schedule in Apify Console, daily or weekly for example, and each run delivers a fresh dataset, which you can send by email, webhook or integration.

Can AI agents use it?

Yes. It is available through the Apify MCP server, and every input field is described in its input schema, so an agent can call it directly.

Sources

Public job board APIs of Greenhouse, Ashby, Lever, SmartRecruiters and Workable — the same endpoints that power the careers pages companies publish deliberately. No authentication. This Actor is not affiliated with any of them.