Company Careers Page Scraper - Jobs from Any Career Site
Pricing
from $0.90 / 1,000 job listings
Company Careers Page Scraper - Jobs from Any Career Site
Company careers page scraper: paste company websites, get every open job with remote/hybrid/on-site, contract type, city and country, yearly salary, benefits, skills and apply link. Finds the ATS behind each site (77 systems). Only-new-jobs mode. $1.50 per 1,000 jobs, first 3 per run free.
Pricing
from $0.90 / 1,000 job listings
Rating
0.0
(0)
Developer
Khandji Omar
Maintained by CommunityActor stats
0
Bookmarked
16
Total users
3
Monthly active users
5 days ago
Last modified
Categories
Share
You paste
stripe.com. You get all 545 open roles. Paste 50 domains and one run answers for all 50.One input: company websites. The Actor works out which applicant tracking system sits behind each careers page and reads that system's own public endpoint. No tokens to look up, no provider to choose, no proxies. 3 job listings free on every run.
Search all companies, no company list needed (new, 2026-10-26)
Do not know which companies to ask for? Tick Search all companies and give a keyword and/or a location:
{"searchAllCompanies": true, "keywords": ["data engineer"], "locations": ["London"]}
The Actor searches an index of the open roles of 1,447 companies (89,333 jobs on 2026-10-26), read from their own
Greenhouse and Lever boards and rebuilt Tuesday to Saturday. The 25 companies with the most matches get their full
description fetched live, the others come with title, company, location, date and apply link. Same price per job, same
filters (excludeKeywords, remoteOnly, postedAfter), and it combines with a company list in the same run.
Measured on the first index: "data engineer" finds 390 roles, engineers in London 531, roles in Berlin 575.
The run summary (RUN_SUMMARY.json, key index) says when the index was built and how many jobs matched.
Measured, on real companies
| You paste | It finds | You get |
|---|---|---|
stripe.com | Greenhouse | 545 roles |
anthropic.com | Greenhouse | 399 roles |
figma.com | Greenhouse | 177 roles |
ramp.com | Ashby | 123 roles |
notion.so | Ashby | 110 roles |
vercel.com | Greenhouse | 81 roles |
monzo.com | Greenhouse | 75 roles |
(2026-08-03 — 1,550 live roles from eight bare domains, nothing else supplied.)
How it finds the ATS
Two passes. It reads the company's careers page and looks at where it links —
boards.greenhouse.io/stripe, jobs.lever.co/figma — and if nothing is linked
it derives the likely handle from the domain and asks the providers directly.
Thirty-nine systems are supported: Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Rippling, Breezy HR, Personio, BambooHR, Recruitee, Teamtailor, Pinpoint, Gem, Oracle Recruiting Cloud, Avature, Zoho Recruit, Manatal, Dover, Homerun, HireHive, JOIN, PageUp, Workable, Jobvite, Eightfold, JazzHR, Comeet, iCIMS, Trakstar Hire, UKG UltiPro, Paylocity, ApplicantPro, iSolved Hire, Hireology, HiBob, HiringThing, Cornerstone, softgarden, Factorial.
You can also paste the job board itself instead of the company website —
https://acme.recruitee.com, a Workday or Oracle careers link, https://jobs.lever.co/acme —
and the Actor reads it directly.
A company running its own careers page with no hosted ATS behind it comes back
with "ats": null and no rows — an answer, not an error.
More than the leaders, for less (checked on the Store on 2026-10-28)
| This Actor | fantastic-jobs Career Site Job Listing API | memo23 Career Site ATS Jobs API | |
|---|---|---|---|
| Price per job | $0.0015 | $0.012 | $0.004 + $0.03 per run |
| Free jobs on every run | Yes | No | No |
| Any company you name, read live from its own ATS | Yes | No (its own database only) | Yes |
| Search all companies by keyword, no list | Yes (daily index) | Yes (275k sites, hourly): it does better | No |
| Contract type, on-site / hybrid / remote, office days | Yes | Yes (AI) | Workplace type only |
| City, region and country as separate fields | Yes | Yes | No |
| Salary as numbers + pay period + yearly equivalent | Yes | Numbers + unit | No |
| Benefits list, skills, years of experience, visa, degree | Yes | Yes (AI) | No |
| Job language, contact emails written in the posting | Yes | Yes | Paid email add-on |
| Staffing-agency flag and filter | Yes | Yes | No |
| Open roles per company (hiring intensity) | Yes | No | Yes |
| Company website and logo | Yes | Yes | No |
| Only the jobs new since your last run | Yes | Yes (time window) | Yes |
| Company industry, employees, size band, headquarters, founding year | Yes (Wikidata, free; empty for companies it does not know) | Industry and size (LinkedIn): more small startups covered | No |
| Filters applied before you pay | Yes, 15 filters | Yes | Partly |
Every fact above is read by plain rules from the job system's own fields and the posting text: no AI cost passed on to you, and a field is left empty when the posting does not say it, never guessed.
Compared with glitchbound/ats-jobs-scraper
Read on the Store on 2026-10-23 (Company Career Page Jobs Scraper: Name or Domain, 24 Systems). Where it does better, this section says so.
- Built on the site's own data, not a resold scraper: no second Actor between you and the source.
- Free results on every run and a hard cost cap (
maxTotalChargeUsd). - Price: $1.5 per 1,000 here, $3 there.
Why use it instead of a job board scraper
Job aggregators mean cookies, proxies, rate limits, and roles that are stale or reposted by three agencies. This reads the employer's own feed.
| Aggregator scraper | This Actor | |
|---|---|---|
| What breaks it | anti-bot, layout changes, expired cookies | nothing — these are the companies' own public endpoints |
| Freshness | an aggregator's copy | the role as the employer published it |
| Duplicates | the same role three times | one row per role |
| Proxy bill | yes | none |
Filter before you pay
Filters run before billing, so you are never charged for a job you excluded.
| Input | Effect |
|---|---|
keywords | Keep jobs whose title, department, company or location contains one of these |
excludeKeywords | Drop jobs matching any of these — intern, senior, sales |
descriptionKeywords | Keep jobs whose title or description contains one of these — Kubernetes, visa sponsorship |
locations | Keep jobs whose location contains one of these |
remoteOnly | Keep only roles whose location says remote, anywhere or distributed |
postedAfter | Keep jobs posted on or after YYYY-MM-DD |
excludeTitleKeywords | Drop jobs whose title has one of these words (senior, intern) |
excludeCompanies / excludeLocations | Drop these companies / these places |
departments | Keep only these teams (Engineering, Sales) |
employmentTypes | Full-time, part-time, contract, temporary, internship, freelance, per diem, volunteer (tick "Not stated" to keep jobs that do not say) |
workArrangements | Remote, hybrid or on-site |
countries | Country names or codes (United States, DE) |
onlyWithSalary / minYearlySalary | Only jobs with a published salary / at least this much per year (hourly pay converted) |
excludeAgencies | Drop jobs posted by staffing agencies |
onlyNewJobs | Only jobs this same search has not delivered before; already delivered jobs are never charged again |
industries / companySizes | Only companies in these industries / of these sizes (1-10 ... 10,001+) |
includeDescription | On by default: adds the full job description, salary, contract type and apply link (see Output). Same price |
Keywords match whole words and do not stem. engineer returns "Backend
Engineer" but not "Engineering Intern" — pass both if you want both. A substring
filter for ai would match "maintainer", which on a real board kept 40% of
unrelated roles.
Output
A real row from this Actor's latest run on Apify (2026-10-23; long texts are cut and people's names hidden here, your dataset has them in full):
{"source_url": "https://stripe.com/jobs/search?gh_jid=8172510","title": "Abuse Investigator","company": "stripe","location": "Seattle, San Francisco, New York City","posted_at": "2026-09-09T10:50:29-04:00","source": "greenhouse","job_id": "8172510","description": "Who we are\nAbout Stripe\nStripe is a financial infrastructure platform for businesses. Millions of companies - from the world’s largest en...","department": "8611 Security Analytics","company_name": "Stripe","updated_at": "2026-10-22T09:17:09-04:00","apply_url": "https://stripe.com/jobs/search?gh_jid=8172510","domain": "stripe.com","ats_match": "guessed","function": "Other","seniority": "Mid","is_remote": false,"posted_within_days": 44,"is_recent": false,"experience_years": 10,"skills": ["Python","SQL"],"education": "Master"}
The full job description comes with every role on Greenhouse, Lever,
Ashby, Recruitee, Teamtailor, Pinpoint, Gem, Manatal, Zoho Recruit, Homerun,
HireHive and PageUp boards (a short description on Oracle) — plain text, ready for an LLM or a search index — together with
the apply link and the job id. salary, employment_type and workplace_type
are filled when the company publishes them (measured 2026-10-05 on five
companies, 804 roles: description 100%, salary 96% on Ashby, contract type 99%
on Lever and Ashby). Workday, SmartRecruiters, Rippling, Breezy, Personio, BambooHR,
Dover, JOIN, Workable, Jobvite, Eightfold and Avature return the core fields only. Eightfold sites are read up to their 2,000 newest roles. Oracle sites are read up to their
1,000 newest roles, Avature up to the roles its feed lists (about 20).
Facts read from the description, on every job
No AI and no extra cost: plain rules read what the description states.
| Field | What it holds |
|---|---|
experience_years | The lowest number of years of experience the text asks for |
skills | Tools and skills named in the text, from a list of about 90 (Python, Kubernetes, Salesforce, Figma...) |
visa_sponsorship | yes or no when the text says so next to a visa or work-permit word; otherwise empty |
education | Bachelor, Master or PhD when a degree is asked |
salary_min, salary_max, salary_currency | The pay band as numbers, from the salary field or from a range written in the text |
employment_type | FULL_TIME, PART_TIME, CONTRACT, TEMPORARY, INTERNSHIP, FREELANCE, PER_DIEM or VOLUNTEER: from the system's own field, the title, or a clear phrase |
work_arrangement, office_days_per_week | REMOTE, HYBRID or ON_SITE, and the office days when a hybrid posting states them |
city, region, country | The first location split into parts; country is a 2-letter code |
salary_period, salary_yearly_min, salary_yearly_max | HOUR, DAY, WEEK, MONTH or YEAR, and the pay converted to a yearly amount, so hourly and yearly jobs compare |
benefits | Health, dental, vision, retirement plan, equity, bonus, paid time off, parental leave, learning budget and 12 more |
job_language | The posting's language (en, fr, de, es, pt, it, nl) |
contact_emails | Emails written in the posting (recruiter or jobs inbox); privacy and no-reply boxes left out |
is_agency | true when a staffing agency posted it for a client |
company_website, company_logo, company_open_jobs | The company's site and logo, and how many open roles this run found for it |
company_industry, company_employees, company_size, company_headquarters, company_founded | From Wikidata by the company's website (on by default, includeCompanyProfile): e.g. Stripe = financial services, 8,000 employees, 5,001-10,000, San Francisco, 2010. Empty for companies Wikidata does not know |
Measured 2026-10-06 on 501 live roles of five companies: experience found on 51%, at least one skill on 78%, the pay band as numbers on 66%. Measured 2026-10-28 on 592 live roles (Stripe, Palantir, Notion, Airbnb): city on 84%, country on 75%, on-site/hybrid/remote on 67%, benefits on 74%, contract type on 51%. A field stays empty when the text does not say; nothing is guessed.
Use descriptionKeywords to keep only the jobs whose description mentions a word or phrase — a tool, a benefit, a visa policy — not only what the title says.
is_remote is set on every row (not only when you filter with Remote only), the same check that input runs, so you can see per-row which postings are remote without needing to turn the filter on.
Roles are deduplicated by URL, so two domains resolving to the same board never bill you twice. Seniority and job function are inferred and attached.
What a run costs
Standard price: $1.50 per 1,000 job listings (base FREE-tier price). You pay only for listings actually delivered to you, and a company with no open roles costs nothing. From 2026-10-29, each run also has a small start fee of $0.005 ($0.003–$0.004 on paid plans), so ask for many companies in one run. Paid Apify Store plans (Bronze through Diamond) receive a variable discount on this price — the exact current discount for your plan is shown on this Actor's Pricing tab in the Store, not repeated here since Apify's tier discounts change independently of this README.
Ask for many companies at once
Measured on this Actor at ~35 open roles per company:
| Companies in one run | Jobs returned | You pay | Per job |
|---|---|---|---|
| 1 | 35 | $0.05 | $0.0014 |
| 10 | 350 | $0.52 | $0.0015 |
| 50 | 1,750 | $2.62 | $0.0015 |
Batching does not change the price per job — it changes your wall clock. Fifty companies asked together take one run instead of fifty, and the free allowance below is the only thing that makes a small run cheaper per row.
Free tier — 3 job listings on every run
The first 3 job listings of every run are free, on every run you ever make, not just the first. Wire it into a pipeline and evaluate it on your own target companies before a cent is billed.
The free allowance never covers more than half of a run, so a run returning 20 listings gets 3 free rather than 10 — that is what stops it becoming an unlimited free plan for anyone willing to split one job into many tiny runs.
Pricing
Standard rate: $0.0015 per job listing — $1.50 per 1,000 (base FREE-tier price), after the free 3, plus a $0.005 start fee per run from 2026-10-29. Paid Apify Store plans (Bronze through Diamond) receive a variable discount on this price — see this Actor's Pricing tab in the Store for the exact current discount on your plan.
Same price as the ATS Jobs API - Greenhouse, Lever, Ashby, Workday Jobs, which reads the same endpoints and returns the same rows with more control over providers and deltas.
Limits
- 100 companies per run, 15 per request in HTTP mode, so a request finishes inside Apify's five-minute ceiling.
- Workday pages 20 roles at a time and is capped at 200 roles per tenant.
Use it from an AI agent (MCP and x402)
Connect Claude Desktop, Cursor, VS Code or any MCP client to Apify's MCP server
at https://mcp.apify.com and add this Actor, om_kh/careers-page-scraper, as a tool — the
agent passes the same JSON as the run input and gets the dataset back.
AI agents that pay with x402 can run it too, without an Apify account: the Actor charges only per result delivered, so an agent pays exactly for what it gets.
Related tools
- Want one call across multiple ATS providers instead of one company at a time? → ATS Jobs API - Greenhouse, Lever, Ashby, Workday Jobs
- Want to know when hiring activity changes, not just current listings? → Hiring Signals API - Companies Hiring Now by Role
All input fields
Every field the Start form accepts, so nothing in the schema is undocumented. Most runs only need the fields already covered above — these are the rest, including advanced/bring-your-own-data options.
descriptionKeywords(Words in the job description) — Keeps jobs whose title or description contains one of these words or phrases. Whole words, filtered before billing.includeDescription(Include job description) — Adds the full description, salary, contract type, workplace type and apply link when the ATS publishes them. On by default; same price.companyDomains(Company websites) — The company websites you want jobs from. Just the domain - stripe.com, figma.com - or the job board itself (https://acme.recruitee.com, a Workday or Oracle careers link). The Actor works out which of 77 applicant tracking systems each one uses. Max 100 per run.
How to use it in 3 steps
- Click Try for free and list company websites in companyDomains — just the domain, e.g.
stripe.com. - Optional: keep only the roles you want with keywords, locations, remote only or posted after.
- Click Start. The Actor finds each company's ATS, reads its board and returns every matching job.
Use cases
- Enrich a list of companies with every open job, without knowing which ATS they use.
- Account-based sales — spot which target accounts are hiring, and for what.
- Recruiting agencies — monitor client and prospect career pages daily.
- Job boards — ingest roles straight from employer career sites, not from aggregators.
Use it from code (API)
Every Apify Actor is an API. Start a run and read the results with one call.
Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("om_kh/careers-page-scraper").call(run_input={"companyDomains": ["stripe.com", "figma.com", "notion.so"], "keywords": ["engineer"], "remoteOnly": False})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('om_kh/careers-page-scraper').call({"companyDomains": ["stripe.com","figma.com","notion.so"],"keywords": ["engineer"],"remoteOnly": false});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
One HTTP call (cURL) — runs the Actor and returns the dataset in the same response:
curl -X POST "https://api.apify.com/v2/acts/om_kh~careers-page-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"companyDomains": ["stripe.com", "figma.com", "notion.so"], "keywords": ["engineer"], "remoteOnly": false}'
Integrations: n8n, Make, Zapier, Google Sheets
- n8n — the official Apify node, operation Run Actor and get dataset, Actor
om_kh/careers-page-scraper. - Make — Apify › Run an Actor, then Apify › Get Dataset Items.
- Zapier — Apify › Run Actor; map the dataset items into your next step.
- Google Sheets, webhooks, Slack — add an integration from the Integrations tab of this Actor.
- Schedules — run it every hour or day from Schedules in Apify Console.
FAQ
Which career sites does it support? Company career pages powered by Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Rippling, Breezy, Personio, BambooHR, Recruitee, Teamtailor, Pinpoint, Gem, Oracle Recruiting Cloud, Avature, Zoho Recruit, Manatal, Dover, Homerun, HireHive, JOIN, PageUp, Workable, Jobvite, Eightfold, JazzHR, Comeet, iCIMS, Trakstar Hire, UKG UltiPro, Paylocity, ApplicantPro, iSolved Hire, Hireology, HiBob, HiringThing, Cornerstone, softgarden, Factorial. It detects the provider from the domain, or from a job-board link you paste.
What if a company is not detected?
It is listed in RUN_SUMMARY.json with the reason and costs nothing. If you know its ATS handle, pass it to the ATS Jobs API directly.
Is it legal to scrape job listings? It reads the public job-board endpoints that each ATS provider publishes for exactly this purpose — the same data shown on the company's careers page. No login, no personal data. Check your local law for your use case.
How fresh is the data? Live. Every run reads the company's board at that moment; nothing comes from a cache or an aggregator.
Am I charged for duplicates or failed boards?
No. Each job is charged once per run, and a board that fails or does not exist is reported in RUN_SUMMARY.json and costs nothing.
Can I get only new jobs every day? Yes — schedule the Actor and keep the filters; compare runs, or use the ATS Jobs API's monitoring mode to receive only new and changed roles.
Can I export to CSV, Excel or Google Sheets? Yes: download any run as CSV, Excel, JSON or HTML, or add the Google Sheets integration from the Integrations tab.
Your feedback
Did this Actor save you time? A short review on the Reviews tab helps other people find it, and every review is read. Something missing or broken? Open an issue on the Issues tab: it is answered and fixed fast.
More Actors from the same author
- ATS Jobs API - Greenhouse, Lever, Ashby, Workday Jobs — one Actor for 9 ATS providers
- Greenhouse Job Scraper - Title, Location, Salary API
- Lever.co Jobs API - Title, Location, Department, Salary
- Ashby Jobs API - Title, Location, Department Data
- Workday Jobs API - Title, Location, Department Data
- Hiring Signals API - Companies Hiring Now by Role — hiring velocity per company, as a buying trigger
Support
Found a bug or have a feature request? Use the Issues tab on this Actor's Apify Store page, or message the author (om_kh) directly through Apify — every report gets a reply.