Career Site Job Listing Scraper
Pricing
from $4.00 / 1,000 job scrapeds
Career Site Job Listing Scraper
Scrape live job listings straight from company career pages via their ATS public JSON APIs. Auto-detects Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Recruitee, with a JSON-LD fallback. MCP/API-ready.
Pricing
from $4.00 / 1,000 job scrapeds
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share
Scrape live job listings straight from a company's own career page — not from an aggregator. Paste any career URL and the actor auto-detects the Applicant Tracking System (ATS) behind it, calls that platform's public JSON API, and returns every open role with title, location, department, employment type, salary (when published), full description, apply URL, and posted date.
HTTP-only, no login, no cookies, no browser — so it is fast, cheap, and highly reliable.
What it does
Most company career pages are powered by a handful of ATS platforms. This actor recognises them from the URL (or by sniffing the page HTML) and reads their official public job feed:
- Greenhouse —
boards.greenhouse.io/<company>,job-boards.greenhouse.io/<company>, or a custom domain embedding Greenhouse - Lever —
jobs.lever.co/<company> - Ashby —
jobs.ashbyhq.com/<company> - Workday —
<tenant>.<dc>.myworkdayjobs.com/<site>(e.g.acme.wd5.myworkdayjobs.com/en-US/careers) - SmartRecruiters —
jobs.smartrecruiters.com/<Company> - Recruitee —
<company>.recruitee.com - Workable —
apply.workable.com/<company> - Any other site — falls back to parsing
schema.org/JobPostingstructured data (the same data Google for Jobs reads)
You give it URLs; it gives you a clean, flat, one-row-per-job dataset.
When to use it
- Recruiters and sourcers building a live pipeline of openings at target companies
- Sales / BD teams that sell to companies who are hiring (hiring = budget = intent signal)
- Job-board and aggregator builders who want first-party listings instead of stale re-posts
- Labor-market and competitive-intelligence research
- AI agents that need "what jobs is company X hiring for right now?" as a single tool call
When NOT to use it
- To search a job aggregator (Indeed, LinkedIn, Google Jobs) — use a dedicated aggregator scraper instead. This actor reads one company's own career page.
- To scrape candidate or recruiter profiles — this returns job postings only.
Output
One record per open job listing:
| Field | Description |
|---|---|
jobTitle | Job title |
company | Employer name (when the ATS exposes it) |
department | Department / team category |
team | Sub-team, where available |
location | Primary location string |
additionalLocations | Other eligible locations (array) |
isRemote | true / false / null when unknown |
employmentType | Full-time, Part-time, Contract, etc. |
salaryText | Published salary/compensation, when present |
description | Job description (plain text by default; see descriptionFormat) |
descriptionHtml | Raw HTML description (only when descriptionFormat is html or both) |
applyUrl | Direct application URL |
jobUrl | Canonical job posting URL |
jobId | ATS job identifier |
postedAt | First published date (ISO 8601) |
updatedAt | Last updated date (ISO 8601), when available |
ats | Detected platform (greenhouse, lever, ashby, …) |
atsToken | The company slug/token used against the ATS |
sourceUrl | The career URL you submitted |
scrapedAt | Run timestamp (ISO 8601) |
Example record
{"jobTitle": "Senior Backend Engineer","company": "Acme Corp","department": "Engineering","location": "Berlin, DE","additionalLocations": ["Remote (EU)"],"isRemote": true,"employmentType": "FullTime","salaryText": "€70K – €90K","description": "Build scalable APIs. Own services end to end…","applyUrl": "https://jobs.ashbyhq.com/acme/123/application","jobUrl": "https://jobs.ashbyhq.com/acme/123","jobId": "123","postedAt": "2026-05-01T00:00:00.000Z","ats": "ashby","atsToken": "acme","sourceUrl": "https://jobs.ashbyhq.com/acme","scrapedAt": "2026-07-01T10:40:42.543Z"}
Pricing (pay per event)
| Event | Price | When |
|---|---|---|
| Actor start | $0.00005 | Once per run |
| Job scraped | $0.004 | Per job returned |
| Description enriched | $0.002 | Only for SmartRecruiters / Workable / Workday jobs (and Ashby boards without the inline posting API) that need an extra per-job request for the full description |
Greenhouse, Lever, and Recruitee include full descriptions in the listing call — those are never charged the enrichment fee. Pay-per-usage (compute + proxy) billing is also available for very large jobs.
A typical run of 200 jobs from a single Greenhouse board costs about $0.80.
Input
| Field | Type | Default | Notes |
|---|---|---|---|
startUrls | string[] | — (required) | One career-page URL per line |
maxResultsPerSite | integer | 200 | Cap per URL |
enrichDescriptions | boolean | true | Extra fetch for SmartRecruiters / Workable / Workday / Ashby-GraphQL descriptions |
descriptionFormat | enum | text | text · html · both · none |
proxyConfiguration | proxy | direct | ATS APIs are open; enable Apify Proxy only if needed |
{"startUrls": ["https://boards.greenhouse.io/stripe","https://jobs.ashbyhq.com/ramp","https://jobs.lever.co/highspot"],"maxResultsPerSite": 200,"descriptionFormat": "text"}
How ATS detection works
- If the URL matches a known ATS host (Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Recruitee, Workable), the company token is parsed straight from the URL — zero extra requests.
- Otherwise the actor fetches the page once and sniffs embedded ATS markers (e.g. a Greenhouse embed
for=token, a Lever board link). - If no known ATS is found, it parses
schema.org/JobPostingstructured data from the page as a best-effort fallback.
Pages on unsupported/custom platforms with no structured data are reported as unsupported in the run summary — never a silent failure.
For AI agents (MCP)
Exposed as apify--career-site-job-scraper on the Apify MCP server. Narrow input (career URLs), flat structured output, sub-second-to-seconds runtime, predictable per-event cost. Ideal for "list current openings at company X" tool calls. A per-run summary is written to the key-value store OUTPUT key with per-site outcomes and billing counts.
Use via API (JavaScript)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('khadinakbar/career-site-job-scraper').call({startUrls: ['https://boards.greenhouse.io/stripe'],maxResultsPerSite: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
FAQ
Which companies are supported? Any company whose career page runs on Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Recruitee, or Workable — that is the large majority of tech, startup, enterprise, and mid-market employers — plus any page exposing JobPosting structured data.
Do I need proxies? No. The ATS APIs are public and open. A direct connection is the default. Enable Apify Proxy only if you hit rate limits.
Why did a page return zero jobs? Either the company genuinely has no open roles, or its career page runs on an unsupported platform (e.g. BambooHR, iCIMS, Jobvite) with no structured data. The run summary distinguishes the two.
Can I get full descriptions? Yes. They are included inline for most platforms. For SmartRecruiters and Workable, keep enrichDescriptions on.
Legal
This actor collects only publicly available job-posting data exposed by companies' own career pages and their ATS public APIs. It performs no login and bypasses no access controls. You are responsible for using the data in compliance with the source sites' terms and applicable law (including data-protection regulations). Not affiliated with or endorsed by Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Recruitee, or Workable.