# Career Page Jobs Scraper: Greenhouse, Lever, Ashby, Workable (`delgadolegacy/career-page-jobs-scraper`) Actor

Scrape every open job from company career pages on Greenhouse, Lever, Ashby & Workable into one clean dataset. Paste careers URLs or company names; the ATS is auto-detected. Salary, remote, location, department, description and filters. No login, no proxies. From $0.80 per 1,000 jobs.

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

## Pricing

from $0.80 / 1,000 job results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Career Page Jobs Scraper: Greenhouse, Lever, Ashby & Workable jobs API

**Career Page Jobs Scraper** pulls **every open job from company career pages** hosted on **Greenhouse, Lever, Ashby and Workable** into **one clean, normalized dataset**: title, department, team, location, remote flag, workplace type, **structured salary**, posted date, apply link and full description. Paste careers page URLs (`boards.greenhouse.io/airbnb`, `jobs.lever.co/palantir`) or just company names (`ramp`, `notion`) and the ATS is detected automatically. No login, no cookies, no proxies, no API key. **Pay per result from $0.80 per 1,000 jobs, no start fee.**

It reads each ATS's official public job-board feed, so runs are fast and rarely break: a cloud run on 5 companies finished in about 5.5 seconds.

### Why use this career page scraper

- **4 ATSs, 1 schema.** Greenhouse jobs, Lever jobs, Ashby jobs and Workable jobs all come out with the same fields, ready for spreadsheets, Airtable, a CRM or your own job board.
- **Auto-detect.** Type `ramp`, `notion` or `huggingface` and it finds the board. URLs and `ats:slug` (`lever:spotify`) work too.
- **Salary included.** Structured `salaryMin`, `salaryMax`, `salaryCurrency` and `salaryInterval` from Ashby and Lever, and parsed from pay-transparency text on Greenhouse. `salarySource` tells you which.
- **Filters.** Keywords, excluded title words, locations, departments, remote-only, and "posted in the last N days". Only jobs that pass the filters are saved.
- **Fair limits.** `maxJobs` is split evenly across companies, so one big employer can't fill the whole run.
- **One-click test.** The prefilled input (Airbnb, Palantir, Ramp, Hugging Face, capped at 100 jobs) returns results immediately.

### Use cases

- **Job seekers and recruiters:** watch target companies for new roles. Schedule it daily with `postedWithinDays: 1`.
- **Niche job boards and newsletters:** remote, AI, climate, fintech or crypto job feeds built from company career pages.
- **Hiring signals and sales intelligence:** see which companies are hiring, for what, and where.
- **Labor-market and salary research:** compare pay ranges by role, team and location.
- **AI agents and automations:** clean JSON that drops straight into n8n, Make, Zapier or an LLM pipeline.

### How to scrape company career pages

1. Paste careers page URLs or company names into **Companies**.
2. Optionally add keyword, location, department, remote or date filters.
3. Click **Start**, then download the results as JSON, CSV or Excel, or pull them through the Apify API.

### Input

| Field | Type | Description |
|---|---|---|
| `companies` | list (required) | Careers URLs (`boards.greenhouse.io/airbnb`, `job-boards.greenhouse.io/stripe`, `jobs.lever.co/palantir`, `jobs.ashbyhq.com/ramp`, `apply.workable.com/huggingface`), `ats:slug` (`lever:spotify`), or a bare slug (`notion`) |
| `keywords` | list | Keep jobs whose title, department or team contains any of these words (whole word) |
| `excludeKeywords` | list | Drop jobs whose title contains any of these words |
| `searchDescription` | bool | Also match keywords in the full description |
| `locations` | list | Keep jobs whose location contains any of these strings (`"remote"` also matches remote-flagged jobs) |
| `departments` | list | Keep jobs whose department or team contains any of these strings |
| `remoteOnly` | bool | Remote jobs only |
| `postedWithinDays` | int | Only jobs first published within the last N days (0 = any date) |
| `includeDescription` / `includeDescriptionHtml` | bool | Plain-text (default on) and HTML (default off) description |
| `maxJobsPerCompany` / `maxJobs` | int | Limits (0 = none) |

Example:

```json
{
  "companies": ["https://jobs.ashbyhq.com/ramp", "https://boards.greenhouse.io/airbnb", "lever:palantir", "notion"],
  "keywords": ["engineer"],
  "excludeKeywords": ["intern", "manager"],
  "locations": ["New York", "remote"],
  "postedWithinDays": 30
}
```

### Sample results (real rows from our test run, Oct 24, 2026)

| ATS | Company | Title | Location | Salary |
|---|---|---|---|---|
| ashby | Ramp | Security Engineer, Cloud | New York, NY (HQ) | USD 211,400–290,600 / year |
| ashby | Notion | Product Designer | San Francisco, California | USD 285,000–330,000 / year |
| greenhouse | Airbnb | Business Development Manager | Berlin, Germany | EUR 71,000–84,000 / year |
| lever | Palantir | Administrative Business Partner - ShipOS | New York, NY | USD 60,000–97,000 / year |
| workable | Hugging Face | Open-Source Machine Learning Engineer - US Remote | New York, New York, United States | (not published) |

### Output (one item per job)

```json
{
  "ats": "ashby",
  "companySlug": "ramp",
  "company": "Ramp",
  "jobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
  "title": "Security Engineer, Cloud",
  "department": "Engineering",
  "team": "Backend",
  "location": "New York, NY (HQ)",
  "locations": ["New York, NY (HQ)", "Remote (Canada)", "Remote (US)", "Miami, FL"],
  "workplaceType": "Hybrid",
  "employmentType": "FullTime",
  "isRemote": true,
  "country": "USA",
  "salaryMin": 211400,
  "salaryMax": 290600,
  "salaryCurrency": "USD",
  "salaryInterval": "year",
  "salaryText": "$211.4K – $290.6K • Offers Equity",
  "salarySource": "ats",
  "postedAt": "2026-04-07T17:12:35.753000+00:00",
  "jobUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-...",
  "applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-.../application",
  "descriptionText": "About Ramp\nRamp is building ...",
  "scrapedAt": "2026-10-24T02:55:11+00:00"
}
```

`salarySource` is `ats` when the ATS supplies structured pay and `description` when the pay is parsed from text. A per-company summary (found, saved, errors) is saved to the key-value store as `RUN_SUMMARY`.

### Pricing

**Pay per result**, live since Oct 24, 2026: you pay only for jobs saved to the dataset. No start fee, no monthly rental. Filtered-out jobs are never charged.

| Apify plan | Price per 1,000 jobs |
|---|---|
| Free | $1.20 |
| Bronze | $1.00 |
| Silver | $0.90 |
| Gold, Platinum, Diamond | $0.80 |

Apify platform usage is included. Set *Maximum cost per run* in the run options to cap spend; the run stops charging at your limit.

### Notes and limits

- Only **public job postings** are collected. No candidate or employee personal data.
- Companies on other ATSs (Workday, iCIMS, SmartRecruiters, custom sites) aren't supported yet. They show up in `RUN_SUMMARY` as not found.
- Bare-slug auto-detect tries Greenhouse, then Lever, Ashby and Workable. If two ATSs share a slug, use `ats:slug`.
- When `maxJobs` is set, the cap is split fairly across companies (e.g. 40 jobs over 6 companies = about 7 each); companies with fewer matching jobs keep all of theirs and the rest is shared out.
- `isRemote` is true when the ATS flags the job remote or any of its locations or workplace type says remote. A hybrid HQ role that also lists "Remote (US)" counts as remote. Use `workplaceType` for the primary arrangement.
- Fields depend on what each company publishes. For example, Greenhouse boards rarely set employment type.

### FAQ

**Do I need proxies, cookies or an account on these sites?** No. The Actor reads the official public job-board endpoints of Greenhouse, Lever, Ashby and Workable.

**Which companies are supported?** Any company whose careers page runs on Greenhouse, Lever, Ashby or Workable. If a company isn't found, it's listed in `RUN_SUMMARY` with the reason.

**How do I monitor new jobs?** Schedule the Actor daily with `postedWithinDays: 1` and connect a webhook, Google Sheets or Slack integration.

**Is this legal?** It collects only public job postings that companies publish so that anyone can see them. There is no candidate or employee personal data. You're responsible for how you use the data.

**Found a bug or need an ATS added?** Open an issue on the Issues tab.

### More free tools from the same developer

- [Remote Jobs Aggregator](https://apify.com/delgadolegacy/remote-jobs-aggregator): remote jobs from We Work Remotely and Remote OK in one deduplicated dataset, using the same field names as this Actor, so you can merge them.
- [SAM.gov Contract Opportunities Scraper](https://apify.com/delgadolegacy/samgov-opportunities): US federal contract opportunities (RFPs, solicitations, sources sought, awards) with no API key.
- [PDF Text Extractor](https://apify.com/delgadolegacy/pdf-text-extractor): text, per-page text, keyword hits and metadata from PDF URLs in bulk, no start fee.
- [Sitemap URL Extractor](https://apify.com/delgadolegacy/sitemap-url-extractor): every URL from a website's sitemap.xml with lastmod, hreflang and regex/date filters.

*Not affiliated with Greenhouse, Lever, Ashby or Workable.*

# Actor input Schema

## `companies` (type: `array`):

One per line. Accepts careers page URLs (boards.greenhouse.io/airbnb, job-boards.greenhouse.io/x, jobs.lever.co/palantir, jobs.ashbyhq.com/ramp, apply.workable.com/huggingface), explicit 'ats:slug' (e.g. 'lever:palantir'), or a bare company slug (e.g. 'ramp') which is auto-detected across all 4 ATSs. If left empty, a small demo list (Airbnb, Palantir, Ramp, Hugging Face) is used so the run still returns sample jobs.

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

Keep jobs whose title, department or team contains ANY of these words (whole-word, case-insensitive). Leave empty to get all jobs.

## `excludeKeywords` (type: `array`):

Drop jobs whose title contains any of these words, e.g. 'senior', 'intern', 'manager'.

## `searchDescription` (type: `boolean`):

Search the full job description for keywords, not only title/department/team.

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

Keep jobs whose location text contains any of these strings, e.g. 'New York', 'United States', 'London', 'remote'.

## `departments` (type: `array`):

Keep jobs whose department or team contains any of these strings, e.g. 'Engineering', 'Sales'.

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

Keep only jobs flagged remote by the ATS or with 'remote' in location/workplace type.

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

Only jobs first published within the last N days (0 = any date). Great for daily/weekly monitoring runs.

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

Add the full job description as clean plain text.

## `includeDescriptionHtml` (type: `boolean`):

Also add the raw HTML description.

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

0 = no limit.

## `maxJobs` (type: `integer`):

Stop after this many jobs in total (0 = no limit). The cap is split fairly across companies.

## Actor input object example

```json
{
  "companies": [
    "https://boards.greenhouse.io/airbnb",
    "https://jobs.lever.co/palantir",
    "https://jobs.ashbyhq.com/ramp",
    "huggingface"
  ],
  "keywords": [],
  "searchDescription": false,
  "remoteOnly": false,
  "postedWithinDays": 0,
  "includeDescription": true,
  "includeDescriptionHtml": false,
  "maxJobsPerCompany": 0,
  "maxJobs": 100
}
```

# Actor output Schema

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

One item per open job posting (company, title, department, location, remote flag, salary, posted date, URLs, description).

## `runSummary` (type: `string`):

Per-company summary: detected ATS, jobs found, jobs saved, and errors (e.g. board not found).

# 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 = {
    "companies": [
        "https://boards.greenhouse.io/airbnb",
        "https://jobs.lever.co/palantir",
        "https://jobs.ashbyhq.com/ramp",
        "huggingface"
    ],
    "keywords": [],
    "maxJobs": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("delgadolegacy/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 = {
    "companies": [
        "https://boards.greenhouse.io/airbnb",
        "https://jobs.lever.co/palantir",
        "https://jobs.ashbyhq.com/ramp",
        "huggingface",
    ],
    "keywords": [],
    "maxJobs": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("delgadolegacy/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 '{
  "companies": [
    "https://boards.greenhouse.io/airbnb",
    "https://jobs.lever.co/palantir",
    "https://jobs.ashbyhq.com/ramp",
    "huggingface"
  ],
  "keywords": [],
  "maxJobs": 100
}' |
apify call delgadolegacy/career-page-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,delgadolegacy/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/OJxlvwuS46TDiAuqz/builds/DHcUGhBfyrfFFcatU/openapi.json
