# Career Page Jobs Scraper (Greenhouse, Lever, Ashby, Workday +8) (`pulsedata/career-page-jobs-scraper`) Actor

Scrape job postings from any company careers page. Auto-detects Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Workday, Teamtailor, BambooHR, Personio, Recruitee, Breezy & Pinpoint. Normalized jobs with location, remote, salary, description, apply URL.

- **URL**: https://apify.com/pulsedata/career-page-jobs-scraper.md
- **Developed by:** [PulseData](https://apify.com/pulsedata) (community)
- **Categories:** Jobs, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 job scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Career Page Jobs Scraper – Greenhouse, Lever, Ashby, Workday, Workable, SmartRecruiters & more

Turn any company careers page into clean job data. Paste career page or job board URLs and get every open position as **normalized JSON**: title, location(s), remote flag, department, employment type, salary, posted date, full description and apply link – no matter which applicant tracking system (ATS) the company uses.

**Supported ATS (auto-detected):** Greenhouse · Lever · Ashby · Workable · SmartRecruiters · Workday · Teamtailor · BambooHR · Personio · Recruitee · Breezy HR · Pinpoint

Uses the official public job-board endpoints of each ATS, so it is fast, reliable and does not need proxies. **$1 per 1,000 jobs**, descriptions included.

### Why this scraper

- **One tool for 12 ATS platforms** – stop maintaining a different scraper per company.
- **Normalized schema** – the same fields for every company, ready for job boards, talent intelligence, lead generation or market research.
- **Auto-detection** – give it `https://boards.greenhouse.io/stripe`, `https://jobs.lever.co/spotify`, `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`, `https://oatly.teamtailor.com`, or a company's own careers page with an embedded board.
- **Filters** – keywords in title, location, remote-only, posted within N days, max jobs per company.
- **Complete** – descriptions (HTML and plain text), salary ranges (ATS field or detected in the description), secondary locations, departments, seniority.

### Output example

```json
{
  "title": "Security Engineer, Cloud",
  "company": "ramp",
  "location": "New York, NY (HQ)",
  "locations": ["New York, NY (HQ)", "Remote (Canada)"],
  "country": "USA",
  "remote": true,
  "workplaceType": "Hybrid",
  "department": "Engineering",
  "team": "Backend",
  "employmentType": "FullTime",
  "salary": "$211.4K – $290.6K • Offers Equity",
  "postedAt": "2026-04-07T17:12:35.753Z",
  "url": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245",
  "applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application",
  "descriptionHtml": "<h1><strong>About Ramp</strong></h1><p>…</p>",
  "descriptionText": "ABOUT RAMP\n\nRamp is building the smart infrastructure for finance teams…",
  "ats": "ashby",
  "atsJobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
  "sourceUrl": "https://jobs.ashbyhq.com/ramp",
  "scrapedAt": "2026-08-19T12:41:29.000Z"
}
```

### Input

| Field | Description |
|---|---|
| `startUrls` | Career page / job board URLs (one per line). |
| `keywords` | Keep only jobs whose title contains one of these (e.g. `engineer`, `sales`). |
| `locations` | Keep only jobs whose location contains one of these (e.g. `Berlin`, `Remote`, `United States`). |
| `remoteOnly` | Keep only remote jobs. |
| `postedWithinDays` | Only jobs posted in the last N days (when the ATS exposes dates). |
| `includeDescription` | Include full descriptions. For Workday, SmartRecruiters, BambooHR, Workable and Breezy this costs one extra request per job. |
| `maxJobsPerCompany` | Cap per career page. |
| `proxyConfiguration` | Optional; ATS endpoints are public and normally do not need proxies. |

Supported URL shapes:

| ATS | Example |
|---|---|
| Greenhouse | `https://boards.greenhouse.io/stripe`, `https://job-boards.greenhouse.io/company` |
| Lever | `https://jobs.lever.co/spotify`, `https://jobs.eu.lever.co/company` |
| Ashby | `https://jobs.ashbyhq.com/ramp` |
| Workable | `https://apply.workable.com/company/` |
| SmartRecruiters | `https://careers.smartrecruiters.com/BoschGroup`, `https://jobs.smartrecruiters.com/BoschGroup` |
| Workday | `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite` |
| Teamtailor | `https://oatly.teamtailor.com` |
| BambooHR | `https://company.bamboohr.com/careers` |
| Personio | `https://company.jobs.personio.de` / `.com` |
| Recruitee | `https://company.recruitee.com` |
| Breezy HR | `https://company.breezy.hr` |
| Pinpoint | `https://company.pinpointhq.com` |
| Company site | `https://example.com/careers` – the page is scanned for embedded boards of the ATS above (works for server-rendered pages; for heavily JavaScript-rendered pages paste the board URL). |

### Use cases

- **Job boards & aggregators** – pull fresh postings from hundreds of companies on a schedule.
- **Sales & lead generation** – companies hiring for a role are buying tools for it; monitor `keywords` like "Salesforce", "SEO", "security".
- **Talent intelligence & research** – hiring trends, salaries, remote policies, locations.
- **Job alerts** – schedule daily runs with `postedWithinDays: 1` and push new jobs to Slack, email or a webhook.

### Pricing

Pay per event: **$0.001 per job** returned ($1 per 1,000). No charge for failed pages.

### Integrations

Schedule runs in Apify, export to JSON/CSV/Excel, push to Google Sheets, Airtable, Make, Zapier, n8n, or call the actor via API/SDK. Available as an MCP tool for AI agents.

# Actor input Schema

## `startUrls` (type: `array`):

Company career pages or ATS job boards, one per line. Examples: `https://boards.greenhouse.io/stripe`, `https://jobs.lever.co/spotify`, `https://jobs.ashbyhq.com/ramp`, `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`, `https://oatly.teamtailor.com`, `https://personio.jobs.personio.de`, `https://careers.smartrecruiters.com/BoschGroup`, or a company's own careers page (the ATS is auto-detected from embedded boards).

## `keywords` (type: `array`):

Only keep jobs whose title contains at least one of these words/phrases (case-insensitive). Leave empty for all jobs.

## `locations` (type: `array`):

Only keep jobs whose location contains one of these strings (e.g. `Berlin`, `Germany`, `Remote`, `United States`).

## `remoteOnly` (type: `boolean`):

Keep only jobs flagged as remote by the ATS or whose location mentions remote.

## `postedWithinDays` (type: `integer`):

Only jobs posted/updated within the last N days (when the ATS exposes a date). 0 = no limit.

## `includeDescription` (type: `boolean`):

Return the full description (HTML + plain text). For Workday, SmartRecruiters, BambooHR and Workable this requires one extra request per job.

## `maxJobsPerCompany` (type: `integer`):

Limit the number of jobs returned per career page (0 = no limit).

## `proxyConfiguration` (type: `object`):

Optional. ATS APIs are public and rarely block; enable Apify Proxy only if you hit rate limits.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://boards.greenhouse.io/stripe"
    },
    {
      "url": "https://jobs.lever.co/spotify"
    },
    {
      "url": "https://jobs.ashbyhq.com/ramp"
    }
  ],
  "keywords": [],
  "locations": [],
  "remoteOnly": false,
  "postedWithinDays": 0,
  "includeDescription": true,
  "maxJobsPerCompany": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Jobs stored in the default dataset (JSON/CSV/Excel via the dataset API).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://boards.greenhouse.io/stripe"
        },
        {
            "url": "https://jobs.lever.co/spotify"
        },
        {
            "url": "https://jobs.ashbyhq.com/ramp"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("pulsedata/career-page-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "startUrls": [
        { "url": "https://boards.greenhouse.io/stripe" },
        { "url": "https://jobs.lever.co/spotify" },
        { "url": "https://jobs.ashbyhq.com/ramp" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("pulsedata/career-page-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://boards.greenhouse.io/stripe"
    },
    {
      "url": "https://jobs.lever.co/spotify"
    },
    {
      "url": "https://jobs.ashbyhq.com/ramp"
    }
  ]
}' |
apify call pulsedata/career-page-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,pulsedata/career-page-jobs-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/aefL0fyKjN39mPQlX/builds/lS6bU3o5npPl4NHLL/openapi.json
