Company Careers Page Scraper - Jobs from Any Career Site avatar

Company Careers Page Scraper - Jobs from Any Career Site

Pricing

from $0.90 / 1,000 job listings

Go to Apify Store
Company Careers Page Scraper - Jobs from Any Career Site

Company Careers Page Scraper - Jobs from Any Career Site

Company careers page scraper: paste company websites or job-board links, get every open job with full description, salary, skills and apply link. Detects the ATS behind each site: 39 systems (Greenhouse, Lever, Ashby, Workday, Oracle, Recruitee...). $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

Khandji Omar

Maintained by Community

Actor stats

0

Bookmarked

13

Total users

8

Monthly active users

6 days ago

Last modified

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.

Measured, on real companies

You pasteIt findsYou get
stripe.comGreenhouse545 roles
anthropic.comGreenhouse399 roles
figma.comGreenhouse177 roles
ramp.comAshby123 roles
notion.soAshby110 roles
vercel.comGreenhouse81 roles
monzo.comGreenhouse75 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.

Why not scrape a job board

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 scraperThis Actor
What breaks itanti-bot, layout changes, expired cookiesnothing — these are the companies' own public endpoints
Freshnessan aggregator's copythe role as the employer published it
Duplicatesthe same role three timesone row per role
Proxy billyesnone

Filter before you pay

Filters run before billing, so you are never charged for a job you excluded.

InputEffect
keywordsKeep jobs whose title, department, company or location contains one of these
excludeKeywordsDrop jobs matching any of these — intern, senior, sales
descriptionKeywordsKeep jobs whose title or description contains one of these — Kubernetes, visa sponsorship
locationsKeep jobs whose location contains one of these
remoteOnlyKeep only roles whose location says remote, anywhere or distributed
postedAfterKeep jobs posted on or after YYYY-MM-DD
includeDescriptionOn 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

{
"domain": "stripe.com",
"source_url": "https://boards.greenhouse.io/stripe/jobs/6789",
"title": "Account Executive, AI Sales",
"company": "stripe",
"location": "New York",
"department": "Sales",
"posted_at": "2026-07-20T09:12:00Z",
"source": "greenhouse",
"function": "Sales",
"seniority": "Mid",
"is_remote": false,
"job_id": "6789",
"description": "Who we are
Stripe is a financial infrastructure platform for businesses...",
"employment_type": "Full-time",
"salary": "$211.4K – $290.6K • Offers Equity",
"workplace_type": "remote",
"apply_url": "https://boards.greenhouse.io/stripe/jobs/6789"
}

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.

FieldWhat it holds
experience_yearsThe lowest number of years of experience the text asks for
skillsTools and skills named in the text, from a list of about 90 (Python, Kubernetes, Salesforce, Figma...)
visa_sponsorshipyes or no when the text says so next to a visa or work-permit word; otherwise empty
educationBachelor, Master or PhD when a degree is asked
salary_min, salary_max, salary_currencyThe pay band as numbers, from the salary field or from a range written in the text

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%. 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 runJobs returnedYou payPer job
135$0.05$0.0014
10350$0.52$0.0015
501,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.

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 39 applicant tracking systems each one uses. Max 100 per run.

How to use it in 3 steps

  1. Click Try for free and list company websites in companyDomains — just the domain, e.g. stripe.com.
  2. Optional: keep only the roles you want with keywords, locations, remote only or posted after.
  3. 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 ApifyClient
client = 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.

More Actors from the same author

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.