I wanted live, structured job listings from a handful of big companies — no LinkedIn middleman, no Indeed anti-bot wall, no headless browser. So I just asked each company's own applicant tracking system (ATS) directly.
Here's what one keyless call returned, live today:
- OpenAI — 755 open roles (Ashby)
- Bosch — 4,773 (SmartRecruiters)
- Stripe — 535 (Greenhouse)
- Palantir — 287 (Lever)
- Airbnb — 196 (Greenhouse)
- Spotify — 108 (Lever)
No sign-up. No API key. No token. No proxy. Every number above came from a plain curl against the company's public board API — the same JSON their own careers page renders from.
Why the ATS, not LinkedIn or Indeed
LinkedIn and Indeed scrapers fight aggressive anti-bot systems. They break, they rate-limit, they silently return half the results, and you spend more time babysitting proxies than using the data.
A company's ATS has no reason to fight you: it's the endpoint its own careers page calls. It's the source of truth, it's fast, and for the big four ATS platforms below it's a clean public JSON API. You just have to know the shape of the call.
The four calls
Greenhouse
The board token is the slug in boards.greenhouse.io/<token>.
curl "https://boards-api.greenhouse.io/v1/boards/stripe/jobs?content=true"
Returns every posting with title, location, department and (with content=true) the full HTML description. Stripe returned 535 live roles; Airbnb, 196.
Lever
curl "https://api.lever.co/v0/postings/palantir?mode=json"
A flat JSON array — Palantir returned 287 postings, each with categories, workplace type and apply URL. Spotify: 108.
Ashby
curl "https://api.ashbyhq.com/posting-api/job-board/openai?includeCompensation=true"
OpenAI's entire board — 755 roles — comes back in one response, compensation bands included where published.
SmartRecruiters
curl "https://api.smartrecruiters.com/v1/companies/BoschGroup/postings?limit=100"
Paginated with limit/offset. Bosch (BoschGroup) exposes 4,773 postings this way — a genuinely large, structured hiring dataset for free.
It's not just the big four
Those are the platforms with the marquee names, but the same "your ATS is already an API" trick works on more:
-
Workday —
POSTto the/wday/cxs/.../jobsCXS endpoint (pass the full board URL) -
BambooHR —
{company}.bamboohr.com/careers/list -
Personio —
{company}.jobs.personio.com/xml -
Recruitee —
{company}.recruitee.com/api/offers/ -
Breezy HR —
{company}.breezy.hr/json
That's nine ATS platforms, each with a public listing endpoint. The exact URL patterns, response fields and gotchas for all nine are in this cheatsheet:
One honest caveat
Companies migrate. While checking this I hit api.lever.co/v0/postings/brex and got back {"ok":false,"error":"Document not found"} — Brex had moved off Lever. So in practice you want to detect which ATS a company is on before you call it, and fall through the list until one answers.
That detection-plus-fetch across all nine ATS is exactly what I wrapped into an actor, if you'd rather pass a company name and get clean rows out than wire up nine endpoints yourself:
👉 Multi-ATS Job Scraper — give it a company or a careers-board URL, it auto-detects the ATS and returns structured, real-time jobs, with a monitor mode for new postings.
But you don't need it to get started. Pick a company, guess their ATS from the careers-page URL, and run the matching curl above. The odds it just works are better than you'd think.
All counts verified live on 2026-07-25 from an EU IP with no API key. Live numbers will drift as companies open and close roles.


Top comments (0)