Job Postings Scraper — Greenhouse, Lever, Ashby, Workable
Pricing
Pay per usage
Job Postings Scraper — Greenhouse, Lever, Ashby, Workable
Scrape live job postings straight from company career boards (Greenhouse, Lever, Ashby, Workable, Recruitee) using their stable public JSON APIs — not fragile HTML. One unified schema across all five ATS providers: title, location, remote flag, department, compensation (where published), apply UR...
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Sturdy Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Job Postings Scraper — Greenhouse, Lever, Ashby, Workable, Recruitee
Scrape live job postings straight from company career boards — via each ATS provider's stable, public JSON API. Not LinkedIn HTML that breaks every month. One unified schema across all five providers.
Built for: recruiting intelligence, hiring-signal lead generation ("who is hiring SDRs right now?"), job aggregators, market/comp research.
Why this scraper
LinkedIn and Indeed scrapers are the lowest-rated job actors on the store — they fight anti-bot walls and silently miss records, apply URLs, and fields. This actor goes to the source: the ATS boards companies actually publish to. Those JSON endpoints are versioned public APIs that have been stable for years.
- Five ATS providers, one schema. Greenhouse, Lever, Ashby, Workable, Recruitee.
- Apply URL always included — it's the canonical posting URL from the ATS itself.
- Compensation captured where published (Lever salary ranges, Ashby compensation tiers).
- No proxies needed, no anti-bot roulette — near-100% success rate by construction.
- Per-board run summary (
RUN_SUMMARYin the key-value store) tells you exactly which boards succeeded, how many jobs each returned, and any errors. No silent failures. - robots.txt respected. SmartRecruiters is intentionally not supported — its robots.txt blocks all crawlers except LinkedInBot, so we leave it alone.
Input
| Field | Type | Default | Notes |
|---|---|---|---|
boardUrls | array | — | Career board URLs, one per company (see formats below). Shorthand provider:company also works. |
includeDescription | boolean | true | Full plain-text description per posting. |
maxJobsPerBoard | integer | 500 | Safety cap per company. |
Supported URL formats:
https://boards.greenhouse.io/<company> or greenhouse:<company>https://jobs.lever.co/<company> or lever:<company>https://jobs.ashbyhq.com/<company> or ashby:<company>https://apply.workable.com/<company> or workable:<company>https://<company>.recruitee.com or recruitee:<company>
{"boardUrls": ["https://boards.greenhouse.io/gitlab", "lever:spotify", "ashby:openai"],"includeDescription": true}
Output schema
One dataset item per job posting:
{"source": "lever","company": "spotify","companyName": null,"id": "5c2a4bb4-cb46-4c39-...","title": "Backend Engineer, Podcast Platform","url": "https://jobs.lever.co/spotify/5c2a4bb4-...","location": "Stockholm, Sweden","secondaryLocations": ["London, UK"],"remote": false,"department": "Engineering","team": "Podcast Mission","employmentType": "Full-time","compensation": "90000-120000 EUR per-year-salary","publishedAt": "2026-06-12T09:31:00.000Z","updatedAt": null,"description": "Spotify is looking for ... (plain text)","scrapedAt": "2026-07-04T10:00:00.000Z"}
Fields that a provider does not publish are null — never guessed. remote is true/false when the ATS states it, null when unknown.
Pricing
Pay per result. 1 result = 1 job posting.
| Jobs | Cost at $1.00 / 1,000 |
|---|---|
| 1,000 | $1.00 |
| 25,000 | $25.00 |
| 100,000 | $100.00 |
Compare: LinkedIn job actors run $29.99/month rental plus usage — and miss apply URLs.
Finding boards to scrape
Any company careers page that redirects to boards.greenhouse.io/..., jobs.lever.co/..., jobs.ashbyhq.com/..., apply.workable.com/... or *.recruitee.com works. Paste the URL as-is.
Compliance & fair use
These are public, unauthenticated JSON APIs that the providers publish precisely so postings can be syndicated. No login walls, no rate-limit evasion — requests are throttled to one per domain per second and retried politely on transient failures.
Why no SmartRecruiters or LinkedIn/Indeed. SmartRecruiters' robots.txt disallows every crawler except LinkedInBot from the entire site — so we don't scrape it. LinkedIn and Indeed are excluded by design; see the FAQ.
Using from API / MCP / AI agents
curl -X POST "https://api.apify.com/v2/acts/<ACTOR_ID>/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{ "boardUrls": ["greenhouse:gitlab"], "includeDescription": false }'
Works out of the box with the Apify MCP server — the input schema is fully described, so AI agents can call it as a tool ("get all open jobs at company X").
FAQ
A board returned zero jobs — why? Check RUN_SUMMARY in the run's key-value store: either the company slug is wrong (typo, renamed board) or the board is empty. The error string is recorded per board.
Can you add Indeed/LinkedIn? No — by design. This actor only uses stable ATS APIs; that is why it doesn't break.
Another ATS you need? Open an issue — adding a provider with a public board API typically ships within a week (as long as its robots.txt allows it).
What about SmartRecruiters? Not supported. Its robots.txt disallows every crawler except LinkedInBot. We won't spoof a user agent to get around that.
Changelog
- 0.1.0 (2026-07) — Initial release: Greenhouse, Lever, Ashby (incl. compensation), Workable, Recruitee. Unified schema, per-board run summary, per-domain crawl delay.
Maintained by Sturdy Data — boring, reliable scrapers. Report issues in the Issues tab; we respond within 24 hours.