Job postings are among the most honest public data a company produces. A company hiring three data engineers is
building a data platform. A company hiring a "Head of Demand Gen" is about to buy marketing tools. A competitor posting
Kubernetes roles in Berlin is expanding to Europe.
Most of these jobs live on applicant tracking systems (ATS) such as Greenhouse, Lever, Ashby, Workable,
SmartRecruiters, Recruitee, Personio and Workday. Each has its own URL scheme, JSON format, pagination and quirks.
Workday is notoriously painful. LinkedIn and Indeed copies are delayed, deduplicated badly and hard to scrape.
This guide pulls jobs straight from the source with one call and one schema.
The tool
Career Site Jobs Scraper on Apify:
- input: company domains (
stripe.com), ATS board URLs (boards.greenhouse.io/stripe,jobs.lever.co/palantir,jobs.ashbyhq.com/ramp), or Workday URLs. It auto-detects the ATS from the company website; - output: one normalized row per job, with title, department, team, location(s),
isRemote,workplaceType,employmentType,seniority, salary range when published,postedAt, apply URL and an optional clean-text description; - filters: title keywords (include/exclude), locations, remote only, posted within N days;
- price: $6 per 1,000 jobs, with filtered-out jobs free.
Python: who is hiring data people this month?
import collections, os
from apify_client import ApifyClient
companies = ["stripe.com", "huggingface.co", "notion.so", "ramp.com", "https://jobs.lever.co/palantir"]
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("murch1k/career-site-jobs-scraper").call(run_input={
"companies": companies,
"keywords": ["data", "machine learning", "analytics"],
"excludeKeywords": ["intern"],
"postedWithinDays": 30,
"includeDescription": False,
"maxResults": 500, # hard cost cap
})
jobs = list(client.dataset(run["defaultDatasetId"]).iterate_items())
by_company = collections.Counter(j["companyName"] for j in jobs)
for company, n in by_company.most_common():
print(f"{company:25} {n} open data roles")
A row (shortened, values illustrative):
{
"companyName": "Hugging Face",
"ats": "workable",
"title": "Machine Learning Engineer - Open Source",
"location": "Remote, Europe",
"isRemote": true,
"workplaceType": "remote",
"employmentType": "full-time",
"salaryMin": null,
"postedAt": "2026-10-02T00:00:00.000Z",
"url": "https://apply.workable.com/huggingface/j/…"
}
Three things you can build in an afternoon
1. Sales trigger list. Run weekly over your target-account list with keywords that match your product
("data engineer" for a data tool, "SDR" for a sales tool). New rows mean a new buying signal. Push them to Slack or your
CRM with an Apify webhook.
2. Niche job board / newsletter. Pick 200 companies in a niche (climate tech, Rust, AI safety), schedule a daily run
with postedWithinDays: 1, and publish the feed. Every posting links back to the original apply URL.
3. Market research for LLMs. Turn on includeDescription and let a model extract the tech stack, seniority mix and
salary bands across a whole industry. Descriptions arrive as clean text, so they are cheap to embed.
Give it to an AI agent (MCP)
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com/?tools=murch1k/career-site-jobs-scraper",
"headers": { "Authorization": "Bearer <APIFY_TOKEN>" }
}
}
}
Ask Claude or Cursor: "Which of these 20 companies are hiring ML engineers in Europe right now? Group by company."
Gotchas
- Unknown ATS: if a company uses an in-house careers page, auto-detection returns nothing and you are not charged.
- Salary: only present when the employer publishes it (common in US states with pay-transparency laws).
-
Dates: some ATSs don't expose a posting date. Those jobs are kept even with a
postedWithinDaysfilter.
Full Python and Node.js examples are in the Apify Scrapers Pack repo, alongside scrapers for LinkedIn
Jobs, StepStone, Dice and a remote-jobs aggregator.
The toolkit used in this series
All five are pay-per-result Actors on Apify (no subscription; the Apify free plan's monthly credits cover a test run):
- YouTube Transcript Scraper: transcripts with timestamps from videos, channels and playlists.
- Career Site Jobs Scraper: open roles from Greenhouse, Lever, Ashby, Workday and 4 more ATSs.
- Google Trends Scraper: interest over time, related queries and topics.
- Substack Scraper: posts and newsletter metadata as clean text for LLMs.
- Website Contact Details Extractor: emails, phones and socials, one row per domain.
Python, Node.js, LangChain and MCP examples for each one are in apify-scrapers-pack on GitHub.
A star there helps other people find it.
Top comments (0)