Most job boards fill up with reposts, agency ads and stale listings. The cleanest source is the companies' own career sites. Thousands of startups and scale-ups publish every opening through an applicant tracking system (ATS) like Greenhouse, Lever, Ashby, SmartRecruiters, Recruitee, Personio or Workable, and each of these offers a public job board API.
The catch is that every ATS has its own format, and you first need to know which companies use which ATS. This post shows a shortcut: one API call that searches the open jobs of thousands of companies at once.
The data
I index the public job boards of 12,000+ companies every day (about 470,000 open jobs right now) through the official job board APIs. Every job comes in one schema:
{ "ats": "ashby", "company": "Ramp", "title": "Security Engineer, Cloud", "location": "New York, NY (HQ)", "locations": ["New York, NY (HQ)", "Remote (US)"], "workplaceType": "hybrid", "remote": true, "salaryMin": 211400, "salaryMax": 290600, "salaryCurrency": "USD", "postedAt": "2026-10-07T17:12:35.753Z", "url": "https://jobs.ashbyhq.com/ramp/...", "descriptionText": "About Ramp ..." } Salary ranges are surprisingly common, because Ashby, Lever and Recruitee expose them when the company publishes them (and pay-transparency laws keep pushing that up).
Search across all companies (Python)
The search runs as an Apify Actor, Career Site Jobs API. With a free Apify account token:
from apify_client import ApifyClient client = ApifyClient("<APIFY_TOKEN>") run = client.actor("digitalni.produkty.pro.zivot/ats-jobs").call(run_input={ "titleKeywords": ["data engineer", "analytics engineer"], "locations": ["remote", "germany"], "postedWithinDays": 7, "maxJobs": 300, }) for job in client.dataset(run["defaultDatasetId"]).iterate_items(): print(job["postedAt"][:10], job["company"], "|", job["title"], "|", job["location"]) A search like this takes a few seconds, because it reads the daily index instead of calling 12,000 APIs. Descriptions are loaded live only for the jobs you get back.
A daily feed for your job board
For a niche board (remote, AI, climate, fintech, one country or city), schedule the same input once a day with Only new jobs turned on. Each run then returns only postings it hasn't returned before, so you can append them to your database or CMS without deduplication logic.
run = client.actor("digitalni.produkty.pro.zivot/ats-jobs").call(run_input={ "titleKeywords": ["machine learning", "ml engineer", "ai engineer"], "remoteOnly": True, "onlyNewJobs": True, "monitorName": "ai-remote-board", "maxJobs": 500, # caps the first run, which returns everything currently open }) No-code works too: Apify has native Make, Zapier and n8n integrations, so new jobs can go straight to Airtable, Google Sheets, Webflow or Slack.
Tracking specific companies
If you care about a list of employers (sales prospecting, hiring signals, a "jobs at our portfolio companies" page), pass them directly. The ATS is detected automatically:
run = client.actor("digitalni.produkty.pro.zivot/ats-jobs").call(run_input={ "companies": ["ramp", "notion", "https://boards.greenhouse.io/airbnb", "lever:palantir"], }) Cost
$1.50 per 1,000 jobs returned, nothing per company or per run. A daily feed of 100 new jobs costs about $4.50 a month. Comparable career-site job APIs on the Apify Store charge about $2.50–12 per 1,000, depending on your plan (checked October 2026).
Limits, to be fair
- Coverage is companies on these seven ATS platforms, mostly tech, startups and scale-ups. Big enterprises on Workday, SuccessFactors or iCIMS aren't included yet.
- The index refreshes once a day. For minute-level freshness, track specific companies (company mode calls the APIs live).
- Job descriptions are the employers' content: link back to the original posting, which is also where candidates apply.
Disclosure: I built and maintain this Actor. Questions, missing companies or ATS requests: open an issue on the Actor page. This post was written with AI assistance and the code was tested against the live Actor.



