Career Site Job Listing Scraper avatar

Career Site Job Listing Scraper

Pricing

from $4.00 / 1,000 job scrapeds

Go to Apify Store
Career Site Job Listing Scraper

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

Khadin Akbar

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

2 days ago

Last modified

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:

  • Greenhouseboards.greenhouse.io/<company>, job-boards.greenhouse.io/<company>, or a custom domain embedding Greenhouse
  • Leverjobs.lever.co/<company>
  • Ashbyjobs.ashbyhq.com/<company>
  • Workday<tenant>.<dc>.myworkdayjobs.com/<site> (e.g. acme.wd5.myworkdayjobs.com/en-US/careers)
  • SmartRecruitersjobs.smartrecruiters.com/<Company>
  • Recruitee<company>.recruitee.com
  • Workableapply.workable.com/<company>
  • Any other site — falls back to parsing schema.org/JobPosting structured 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:

FieldDescription
jobTitleJob title
companyEmployer name (when the ATS exposes it)
departmentDepartment / team category
teamSub-team, where available
locationPrimary location string
additionalLocationsOther eligible locations (array)
isRemotetrue / false / null when unknown
employmentTypeFull-time, Part-time, Contract, etc.
salaryTextPublished salary/compensation, when present
descriptionJob description (plain text by default; see descriptionFormat)
descriptionHtmlRaw HTML description (only when descriptionFormat is html or both)
applyUrlDirect application URL
jobUrlCanonical job posting URL
jobIdATS job identifier
postedAtFirst published date (ISO 8601)
updatedAtLast updated date (ISO 8601), when available
atsDetected platform (greenhouse, lever, ashby, …)
atsTokenThe company slug/token used against the ATS
sourceUrlThe career URL you submitted
scrapedAtRun 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)

EventPriceWhen
Actor start$0.00005Once per run
Job scraped$0.004Per job returned
Description enriched$0.002Only 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

FieldTypeDefaultNotes
startUrlsstring[]— (required)One career-page URL per line
maxResultsPerSiteinteger200Cap per URL
enrichDescriptionsbooleantrueExtra fetch for SmartRecruiters / Workable / Workday / Ashby-GraphQL descriptions
descriptionFormatenumtexttext · html · both · none
proxyConfigurationproxydirectATS 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

  1. 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.
  2. Otherwise the actor fetches the page once and sniffs embedded ATS markers (e.g. a Greenhouse embed for= token, a Lever board link).
  3. If no known ATS is found, it parses schema.org/JobPosting structured 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.

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.