Job Postings Scraper - Greenhouse, Lever, Ashby
Pricing
from $2.00 / 1,000 job postings
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
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:
| Country | Postings |
|---|---|
| United Kingdom | 212 |
| United States | 185 |
| Singapore | 141 |
| Australia | 140 |
| Malaysia | 116 |
| Indonesia | 87 |
| Ireland | 65 |
| Vietnam | 58 |
| India | 56 |
| Germany | 43 |
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.
| Field | Coverage |
|---|---|
company, title, jobId, location, city | 100% |
function, seniority, daysOpen, publishedAt | 100% |
jobUrl, applyUrl | 100% |
country | 90.5% |
requisitionId | 76.5% |
department | 62.6% |
description | 61.9% |
employmentType | 60.6% |
countryCode | 37.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.
countryandcityacross 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 —
stripeinboards.greenhouse.io/stripe. Pasting the full URL works. A company name that is not the slug will not resolve. daysOpenis 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
countryempty 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 ApifyClientclient = 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
- npm Downloads Scraper: Package Trends & Growth
- WordPress Plugin Scraper: Installs & Ratings
- crt.sh Subdomain Finder: Certificate Search
FAQ
Is it legal to use this data?
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.