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
2
Total users
2
Monthly active users
4 days ago
Last modified
Categories
Share
Career Site Job Listing Scraper is an Apify Actor for recruiters, sourcers, market researchers, and AI agents that need live job listings from company career pages. It accepts one or more career page URLs, detects the ATS behind each page, and returns one record per open job listing with fields such as job title, company, department, team, location, remote status, employment type, salary text, description, apply URL, job URL, job ID, posted date, updated date, ATS name, source URL, and scrape timestamp.
The actor reads company-owned career pages and ATS public JSON APIs, with a JSON-LD fallback for pages that publish structured JobPosting data. It is usable through Apify API and through Apify MCP.
Best fit and connected workflows
This actor fits workflows that start with a company career page and end with structured hiring data.
Use it when you want to:
- Build a live list of openings from a target company or a watchlist of companies.
- Feed current job data into outbound sales, recruiting, or competitive-intelligence research.
- Power AI assistants that answer questions like "What roles is this company hiring for right now?"
- Collect first-party job postings for internal dashboards, research notes, or enrichment pipelines.
It connects naturally with downstream workflows such as:
- lead qualification around hiring signals,
- talent-market monitoring by company and department,
- AI prompts that compare openings across multiple company career pages,
- and follow-up processing of the returned dataset in your own code.
Related Actors:
- Use APEC Jobs Scraper - useful when the research brief focuses on that board, region, or audience.
- Use Ashby Jobs Scraper - useful when the target source is a specific Ashby jobs board.
- Use Bayt Jobs Data Scraper for MENA Listings - useful when the source is Bayt and the workflow centers on MENA job listings.
Practical scenario
Mira is building a hiring watchlist for a handful of software companies. She starts with a career page URL from a company she tracks and sets the maximum results per site to capture the full board. The actor returns records with jobTitle, department, location, isRemote, employmentType, salaryText, applyUrl, and postedAt. Mira filters the dataset for engineering roles in Europe, then shares the applyUrl list with her recruiting team and uses postedAt to focus on newly added openings.
Input
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | array of strings | required | One or more company career page URLs to scrape. The actor auto-detects Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Recruitee, Workable, or JSON-LD on the page. |
maxResultsPerSite | integer | 200 | Upper bound on jobs returned from each career page. Applied per URL. |
enrichDescriptions | boolean | true | Fetches full descriptions for ATS platforms that provide them through an extra detail request. |
descriptionFormat | string | text | Controls how the job description is returned: text, html, both, or none. |
proxyConfiguration | object | direct connection | Optional proxy routing for rate limits or geo-specific boards. |
Focused input example
{"startUrls": ["https://boards.greenhouse.io/stripe","https://jobs.lever.co/highspot"],"maxResultsPerSite": 100,"enrichDescriptions": true,"descriptionFormat": "text","proxyConfiguration": {"useApifyProxy": false}}
Output
One record is written per open job listing found across the submitted career pages.
| Field | Type | Description |
|---|---|---|
jobTitle | string | Job title. |
company | string or null | Employer name when provided by the source. |
department | string or null | Department or job family. |
team | string or null | Team or sub-team, when available. |
location | string or null | Primary location string. |
additionalLocations | array of strings | Other eligible locations. |
isRemote | boolean or null | Remote indicator when available. |
employmentType | string or null | Employment type such as full-time or contract. |
salaryText | string or null | Published compensation text, when present. |
description | string or null | Job description in the selected format. |
descriptionHtml | string or null | HTML description when requested. |
applyUrl | string or null | Direct application URL. |
jobUrl | string or null | Canonical job posting URL. |
jobId | string or null | ATS job identifier. |
postedAt | string or null | First published date. |
updatedAt | string or null | Last updated date. |
ats | string | Detected ATS platform. |
atsToken | string or null | Company token or slug used against the ATS. |
sourceUrl | string | Submitted career page URL. |
scrapedAt | string | Timestamp for when the record was scraped. |
Illustrative output record
{"jobTitle": "Senior Backend Engineer","company": "Acme Corp","department": "Engineering","team": "Platform","location": "Berlin, DE","additionalLocations": ["Remote (EU)"],"isRemote": true,"employmentType": "FullTime","salaryText": "€70K - €90K","description": "Build scalable APIs and 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","updatedAt": "2026-05-12T00:00:00.000Z","ats": "ashby","atsToken": "acme","sourceUrl": "https://jobs.ashbyhq.com/acme","scrapedAt": "2026-07-01T10:40:42.543Z"}
How it works
The actor starts from the URLs you provide and identifies the ATS behind each company career page. It works with public ATS JSON APIs for Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Recruitee, and Workable, and it also uses a JSON-LD fallback when a page publishes JobPosting structured data.
The implementation is HTTP-based, with no login, cookies, or browser automation. The input schema lets you set a per-site result cap, decide how descriptions are formatted, and optionally route traffic through Apify Proxy when a board benefits from it.
The output dataset contains one row per returned job listing. A run summary is written to the default key-value store under the OUTPUT key and includes per-site outcomes, detected ATS platforms, and billing counts.
Pricing
This actor uses Pay per event pricing plus Apify platform usage. Billing is event-based, so total cost depends on the number of actor starts, job listings returned, and any extra description enrichment requests.
Events in this actor:
- Actor start
- Job scraped
- Description enriched
For current pricing details, open the live Pricing tab on the actor page. If you want a simple way to estimate volume, think in terms of events: for example, a run that returns two hundred jobs will generate one start event and two hundred job-scraped events, plus any description-enrichment events for jobs that need an extra detail request.
Use with AI agents (MCP)
This actor is available as an Apify Actor usable through Apify MCP. It is designed for a precise tool call: provide career page URLs, receive structured job records, and read the summary for ATS detection and billing context.
Actor identity: khadinakbar/career-site-job-scraper
Tool description: Fetch live job listings from company-owned career pages and ATS public APIs, returning one structured record per open role.
Find the current engineering jobs on this company's career page. Return title, location, remote status, department, apply URL, and posted date. Use plain-text descriptions if they are available.
Output interpretation:
jobspoints to the dataset containing one record per listing.summaryexplains which ATS was detected per site and records billing counts for the run.sourceUrlpreserves the original career page that was submitted.applyUrlis the direct handoff point for next-step workflows.
Provenance and scope:
- Records come from company-owned career pages and ATS public APIs.
- The actor also supports a JSON-LD fallback for pages that publish structured JobPosting data.
- The dataset is organized as flat job listings, which works well for tool-driven retrieval.
Pagination and cost guidance:
- Use
maxResultsPerSiteto cap each career page independently. - Larger result caps increase the number of returned
job scrapedevents. - Keep
enrichDescriptionsenabled when your workflow needs full descriptions for platforms that fetch them in an extra step.
Use via Apify 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: 50,descriptionFormat: 'text',});const dataset = await client.dataset(run.defaultDatasetId).listItems();console.log(dataset.items);
Best results and outcome guidance
Start with the company career page that you would use manually in a browser. That keeps the input aligned with the actor's ATS detection logic and with the JSON-LD fallback.
A few useful patterns:
- Use one URL per company career page when you want a clean one-company result set.
- Increase
maxResultsPerSitewhen a board has many roles and you want the full listing. - Keep
descriptionFormatset totextwhen you plan to pass results into AI workflows. - Switch to
bothwhen you need plain text for analysis and HTML for rendering. - Leave proxy routing direct for ordinary public ATS endpoints, and use Apify Proxy when a board benefits from it.
Continue the workflow
- Then use Dice.com Jobs Scraper — US Tech Jobs, Salary & Skills to extend Career Site Job Listing Scraper with a neighboring job-market research source when the brief calls for Dice data.
- Then use Bundesagentur Job Scraper — German Vacancies to extend Career Site Job Listing Scraper with a neighboring job-market research source when the brief calls for Bundesagentur data.
Design note
I found that the output contract includes both jobUrl and applyUrl, which makes it practical to separate the canonical posting page from the direct application handoff.
FAQ
Which career pages work well with this actor?
Company-owned career pages powered by Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Recruitee, Workable, or pages that expose JobPosting structured data.
How is this different from a job-board scraper?
This actor starts from a single company's career page and reads that company's own ATS feed, which makes it useful for first-party hiring research.
Which field should I use for the hiring action link?
Use applyUrl when you want the direct application step. Use jobUrl when you want the canonical posting page.
How should I route AI workflows?
Use the dataset records directly, then read summary to see the detected ATS platform and run-level billing context.
Can I combine this with other job sources?
Yes. The verified related actors section includes other source-specific scrapers that can fit adjacent workflows when your research brief uses a different board or region.
Responsible use
This actor collects publicly available job-posting data from company career pages and ATS public APIs. Use the returned information in line with the source site's terms and applicable law, including data-protection rules where relevant.