Most tech companies don't host their own careers page. It's run by an applicant tracking system, usually Greenhouse, Lever or Ashby. You can tell by the address: boards.greenhouse.io/airbnb, jobs.lever.co/palantir, jobs.ashbyhq.com/ramp.
The useful part: all three publish a free, public job-board API so companies can show their jobs on their own sites. No login, no scraping HTML, no blocking. If you want a company's open roles in a spreadsheet, a job alert, or a sales prospect list, this is the cleanest source there is.
This post shows the three APIs, the differences between them, and a hosted tool that merges them into one format. Disclosure: I built the tool at the end.
The three APIs
Greenhouse
curl "https://boards-api.greenhouse.io/v1/boards/airbnb/jobs?content=true" Returns { "jobs": [...] } with title, location, departments, offices, first_published, updated_at and the job page URL. Two gotchas:
-
content(the description) is HTML that is itself HTML-escaped, so you have to decode it before stripping tags. - Salary isn't in the list. Greenhouse only returns pay ranges on each job's own endpoint, with
?pay_transparency=true:
curl "https://boards-api.greenhouse.io/v1/boards/airbnb/jobs/<job id>?pay_transparency=true" That gives pay_input_ranges in cents, for example min_cents: 17900000, max_cents: 21000000, currency_type: "USD".
Lever
curl "https://api.lever.co/v0/postings/palantir?mode=json" Returns a plain array. The title is in text, location, team and commitment are under categories, and createdAt is in milliseconds. European companies use api.eu.lever.co. Salary is in salaryRange when the company sets it, which many don't.
Ashby
curl "https://api.ashbyhq.com/posting-api/job-board/ramp?includeCompensation=true" Returns { "jobs": [...] } with department, team, employmentType (FullTime, PartTime, …), workplaceType, secondary locations and, with includeCompensation=true, a ready-made summary like "$189K – $330K • Offers Equity". Watch for titles with a leading space.
The annoying parts
If you're collecting from many companies, you end up writing the same glue:
- Three different shapes to map into one.
- Finding the system. A company name like
airbnbcould be on any of the three, so you try each. - Same slug, different company.
rampon Ashby is the fintech with 171 jobs.rampon Greenhouse is a different company with one job. Guess wrong and your data is wrong. - Greenhouse salaries need one extra request per job.
- Filtering by title, location, department, remote and date, consistently across all three.
A hosted version that merges all three
I wrapped this up as the Company Career Pages Jobs Scraper on Apify. You give it careers-page URLs or just company names:
{ "companies": ["airbnb", "ramp", "https://jobs.lever.co/palantir"], "keywords": ["data engineer", "data scientist"], "locations": ["United States", "Remote"], "postedSince": "2026-09-01" } A plain name is checked on all three systems. If it exists on more than one, it uses the board with the most open jobs and says so in the log; a URL always picks the exact board.
Every job comes back in the same shape. A real row from that run:
{ "company": "Airbnb", "system": "greenhouse", "title": "Senior Staff Data Engineer, Foundational Data", "location": "United States", "workplaceType": "Remote", "isRemote": true, "salary": "USD 248,000–310,000 (Pay Range)", "postedAt": "2026-09-22T18:58:28.000Z", "jobUrl": "https://careers.airbnb.com/positions/8224032?gh_jid=8224032", "applyUrl": "https://careers.airbnb.com/positions/8224032?gh_jid=8224032" } Other fields: department, team, allLocations, employmentType, updatedAt, and the full description as plain text if you turn it on.
From code, one HTTP call runs it and returns the jobs (keep your Apify token in an environment variable):
curl -X POST "https://api.apify.com/v2/acts/rsiddiq95~career-pages-jobs-scraper/run-sync-get-dataset-items" \ -H "Authorization: Bearer $APIFY_TOKEN" \ -H "Content-Type: application/json" \ -d '{"companies": ["airbnb", "ramp"], "keywords": ["engineer"], "remoteOnly": true}' It costs $5 per 1,000 jobs. Companies that aren't found, or have nothing matching your filters, are free. A 200-job company takes a few seconds.
What people use this for
- Job alerts for a shortlist of companies. Schedule it daily with
postedSinceset to yesterday. - Sales prospecting. Companies hiring "RevOps", "data engineer" or "security engineer" are telling you what they're investing in.
- Recruiting and market research. Which teams a company is growing, where, and at what pay.
- From an AI assistant. It also runs as a tool in Claude, ChatGPT or Cursor through Apify's MCP server: add
https://mcp.apify.com?tools=rsiddiq95/career-pages-jobs-scraperand ask "which engineering jobs is Airbnb hiring for in the US, and what do they pay?"
Limits
Only companies on Greenhouse, Lever or Ashby. Workday, iCIMS, SmartRecruiters and others aren't covered. If a company's careers page is on its own domain, click any job: the apply link usually reveals which system it uses.
Questions or a system you'd like added? Open an issue on the Actor page.
