Hiring is one of the clearest public buying signals: a company opening "Data Engineer" roles is about to spend on data tooling. The catch is that every company uses a different applicant tracking system (ATS), and each has its own API shape.
This tutorial uses the ATS Jobs Scraper Actor, which reads the public job-board feeds of Greenhouse, Lever, Ashby, SmartRecruiters and Recruitee and returns one schema. It costs $1 per 1,000 jobs returned after your filters; companies without a supported board and filtered-out jobs are free.
The script
import csv, os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("siftwright/ats-jobs-scraper").call(
run_input={
"companies": ["greenhouse:airbnb", "lever:palantir", "ramp.com"],
"titleKeywords": ["data engineer", "analytics"],
"excludeTitleKeywords": ["senior", "staff", "manager", "director"],
"includeDescription": False,
"maxJobsPerCompany": 20,
},
max_total_charge_usd=0.05, # hard spend cap for the run
)
jobs = list(client.dataset(run.default_dataset_id).iterate_items())
with open("jobs.csv", "w", newline="") as f:
w = csv.writer(f)
w.writerow(["company", "ats", "title", "location", "url"])
for j in jobs:
w.writerow([j["company"], j["ats"], j["title"], j["location"], j["url"]])
summary = client.key_value_store(run.default_key_value_store_id).get_record("SUMMARY")
for c in summary["value"]["companies"]:
print(f'{c["input"]:20} {c["status"]:10} {c["ats"] or "-":12} open={c["jobsOnBoard"]} matched={c["jobsMatched"]} returned={c["jobsReturned"]}')
print(len(jobs), "jobs written to jobs.csv")
Install and run:
pip install apify-client
export APIFY_TOKEN=your_token
python hiring.py
max_total_charge_usd caps what the run can spend, so a typo in a filter cannot surprise you.
What I got
I ran this on 2026-10-26 against three companies. The output:
greenhouse:airbnb ok Greenhouse open=187 matched=7 returned=7
lever:palantir ok Lever open=307 matched=1 returned=1
ramp.com ok Ashby open=173 matched=0 returned=0
8 jobs written to jobs.csv
Eight jobs, for example "Data Engineer - Talent Acquisition Operations" (Palantir, New York) and "Software Engineer, Analytics Infrastructure" (Airbnb, Brazil). Ramp had 173 open roles and none matched these filters, so it returned nothing and cost nothing. Notice ramp.com was just a website: the Actor found the Ashby board from the careers page link. The SUMMARY record reports how each board was detected (detectedVia), so you can check it.
Limits worth knowing
- Only five ATS platforms. Workday, iCIMS, Taleo and custom career sites come back as "not found" (free).
- If you give a name instead of a board URL, the board slug is guessed; pass
ats:boardsuch asgreenhouse:airbnbwhen you need certainty. - Salary is only present when the company publishes it. None of the jobs above had one.
- Filters are substring matches on the title, so "analytics" also matched finance roles. Tighten
titleKeywordsfor cleaner output.
Use it from an AI agent
The same Actor works through Apify's MCP server, so an agent can ask "which of these companies are hiring data engineers?" and pay per result.
Store page: https://apify.com/siftwright/ats-jobs-scraper. More tools: https://siftwright.com
Top comments (0)