Greenhouse, Lever, Ashby, and SmartRecruiters all expose their job postings through a plain public JSON endpoint. No login, no key, nothing gating it. Ask any of them for a list of jobs and you get one back. What you don't get is any agreement on how that list arrives — three of the four wrap it in an object first, and no two of those three wrap it the same way.
Three platforms wrap the list. None of them wrap it identically.
Greenhouse — GET https://boards-api.greenhouse.io/v1/boards/{board_token}/jobs. Checked live against Stripe (board_token=stripe): 569 real open postings, sitting under a jobs key next to a meta object that's just a total count.
{
"meta": { "total": 569 },
"jobs": [
{
"id": 8130725,
"title": "Account Executive, AI Startups (Hunter)",
"absolute_url": "https://stripe.com/jobs/search?gh_jid=8130725",
"location": { "name": "San Francisco" },
"company_name": "Stripe",
"updated_at": "2026-08-19T14:02:07-04:00"
}
]
}
Ashby — GET https://api.ashbyhq.com/posting-api/job-board/{jobBoardName}. Checked live against Ramp (jobBoardName=ramp): 136 real postings, under a jobs key next to apiVersion — a version number, not a count.
{
"apiVersion": 1,
"jobs": [
{
"id": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
"title": "Security Engineer, Cloud",
"department": "Engineering",
"isRemote": true,
"address": { "postalAddress": { "addressLocality": "New York City", "addressRegion": "NY", "addressCountry": "USA" } },
"jobUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245"
}
]
}
SmartRecruiters — GET https://api.smartrecruiters.com/v1/companies/{companyId}/postings. Checked live against Visa (companyId=visa): a real, actual pagination envelope, not a decorative wrapper — offset and limit you have to use to page past the first 100 results.
{
"offset": 0,
"limit": 100,
"totalFound": 1,
"content": [
{
"id": "743000012345678",
"name": "Data Engineer II",
"company": { "identifier": "visa", "name": "Visa" },
"location": { "city": "Austin", "region": "Texas", "country": "us" }
}
]
}
Same idea, three times, three different shapes: a count you can ignore, a version number you can ignore, and a pagination cursor you genuinely cannot ignore if the company has more than 100 open roles.
The one platform that just gives you the list
Lever — GET https://api.lever.co/v0/postings/{company}?mode=json. Checked live against Spotify (company=spotify): 94 real postings, a bare array, no wrapper at all.
[
{
"id": "890b2c0f-f46f-4a4b-bb73-3a6af6e0edd5",
"text": "Advertiser Solutions Vendor Lead - Programmatic and Direct Support",
"categories": {
"department": "Advertising",
"team": "Advertising Sales - Emerging and Scaled Sales",
"location": "London",
"commitment": "Permanent",
"allLocations": ["London"]
},
"country": "GB",
"workplaceType": "hybrid",
"hostedUrl": "https://jobs.lever.co/spotify/890b2c0f-f46f-4a4b-bb73-3a6af6e0edd5"
}
]
The record itself is the most nested of the four — team, department, location, and commitment all live under a categories object instead of sitting flat — but the response is the plainest: parse the JSON, you have your list, done.
What that actually costs you
Write a parser for any one of these and it's a non-event — five minutes with the docs, maybe less. Write one function that's supposed to handle all four, and every shortcut you'd normally take breaks: response.jobs works for two of them and throws on the other two. response.length works for exactly one. Iterate response.content and you've just hardcoded SmartRecruiters into code that's supposed to be generic. None of these platforms did anything wrong — they each built a sensible API in isolation. The cost only shows up the moment you're trying to treat "a job posting" as one consistent shape across all four, which is usually the actual goal, since most people watching hiring trends don't care which ATS a given company happened to pick.
If you'd rather not build that reconciliation layer yourself: Greenhouse, Lever, Ashby, and SmartRecruiters on Apify each take a list of company slugs and hand back the same normalized shape, regardless of which of the four APIs above it actually came from.
Endpoints and shapes verified live on 2026-08-21 against Stripe (Greenhouse, 569 postings), Spotify (Lever, 94 postings), Ramp (Ashby, 136 postings), and Visa (SmartRecruiters). All four are real, independent companies — none are demo data or the platform's own board.