# Careers Page Scraper: Open Jobs from Any Company Website (`sandy_yclept/careers-page-scraper`) Actor

Open jobs from any company's website: finds the careers page and reads every opening from Greenhouse, Lever, Ashby, Workable, Personio, Recruitee, Teamtailor, Workday and more, or from the careers page itself when there is no job board. One row per job. Pay only per job found.

- **URL**: https://apify.com/sandy_yclept/careers-page-scraper.md
- **Developed by:** [Rafal Sav](https://apify.com/sandy_yclept) (community)
- **Categories:** Jobs, Lead generation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 job postings

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

### What does Careers Page Scraper do?

**Careers Page Scraper** takes a list of company websites and returns **every open job** each company publishes: it finds the **careers page** on the website, recognises the **job board (ATS)** behind it and reads the jobs from that board's public feed — **Greenhouse, Lever, Ashby, Workable, Personio, Recruitee, Teamtailor, BambooHR, Breezy, Rippling, Gem, Workday** and Y Combinator's Work at a Startup. A company with no job board is read from **its own careers page**: the jobs in its structured data, the German ads with their "(m/w/d)", the links to single job pages.

One row per job: **title, location, department, employment type, remote / hybrid / on-site, date posted, salary** where the board gives it, the link to the job, and the company's careers page and job board. You **pay only per job found**: a company with no open job costs nothing.

Run it from the Apify Console, through the API, on a schedule, or from an AI agent through Apify's MCP server.

### Why use it?

- **Hiring signals for sales**: which of your target accounts are hiring, how many people, in which teams and where — a company hiring five salespeople is buying sales tools.
- **Recruiting and staffing agencies**: the open roles of the companies you place people with, including the small firms that post jobs only on their own website.
- **Job boards and market research**: fresh openings straight from the source, normalised into one table.

### How to use it

1. Open the **Input** tab and paste the company websites (domains or URLs) — or links to their job boards, `jobs.lever.co/acme`. You can also upload a text or CSV file, or link a Google Sheet.
2. Click **Start**.
3. Download the jobs as JSON, CSV, Excel or HTML from the **Output** tab.

### Input

| Field | What it does |
|---|---|
| Company websites | Websites or job-board links, one company each. A URL listed twice is read once. |
| Max jobs per company | At most this many jobs per company (default 100, up to 1,000): each job is a row and a charge, and a large employer lists thousands. |

### Output

One row per open job. AssemblyAI, read on October 30, 2026 (one of its 15 jobs on Greenhouse):

```json
{
  "domain": "https://www.assemblyai.com",
  "careers_page": "https://www.assemblyai.com/careers",
  "ats": "greenhouse",
  "ats_board": "https://job-boards.greenhouse.io/assemblyai",
  "company_jobs_count": 15,
  "title": "Senior GTM AI Engineer",
  "location": "San Francisco, California",
  "department": "Business Operations",
  "posted_at": "2026-08-28",
  "job_url": "https://job-boards.greenhouse.io/assemblyai/jobs/4728788005",
  "source": "greenhouse",
  "status": "open_job",
  "billed": true
}
```

A German bakery with no job board, read from its careers page the same day:

```json
{
  "domain": "https://hammermuehle-shop.de/",
  "careers_page": "https://www.hammermuehle-shop.de/karriere/",
  "ats": null,
  "company_jobs_count": 5,
  "title": "Bäcker (m/w/d)",
  "source": "careers-page",
  "status": "open_job",
  "billed": true
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

| Field | Meaning |
|---|---|
| `title` | The job's title as the company publishes it. |
| `location`, `department` | As the job board gives them. |
| `employment_type` | `full_time`, `part_time`, `contract`, `internship` or `apprenticeship`, when stated. |
| `workplace_type` | `remote`, `hybrid` or `onsite`, when stated. |
| `posted_at` | The date the job was published (YYYY-MM-DD), when the board gives it. |
| `salary` | The salary range, when the board publishes one (Lever, Ashby, Y Combinator). |
| `job_url` | The job's own page, to read or apply. |
| `source` | Where the job was read: the board (`greenhouse`, `lever`, `ashby`, `workable`, `personio`, `recruitee`, `teamtailor`, `bamboohr`, `breezy`, `rippling`, `gem`, `workday`, `yc`), `json-ld` (the page's structured data) or `careers-page`. |
| `careers_page`, `ats`, `ats_board` | The company's careers page, its job board and the board's address. |
| `company_jobs_count` | How many open jobs the company has in all. |
| `status` | `open_job` on a job's row. A company without one gets a single row: `no_open_jobs` (its board is empty, or its careers page says there are none), `jobs_not_read` (a careers page whose jobs only a browser draws, or a board this Actor does not read), `no_careers_page` or `unreachable`. |
| `billed` | Whether this row was charged. |

### How many companies it finds jobs for

Measured on October 30, 2026, on samples picked before anything was run on them.

**Companies that are hiring** — 100 Y Combinator companies picked at random from those YC lists as hiring, with teams of 10 or more:

| | Companies |
|---|---|
| Open jobs read | **55** (665 jobs, 9 a company in the middle) |
| A careers page, but its jobs drawn by a browser or kept on a board not read yet | 17 |
| The board says there is no opening | 4 |
| No careers page linked from the homepage | 23 |
| Website did not answer | 1 |

The boards: Ashby 29, Work at a Startup 10, Lever 5, Greenhouse 5, Workable 1, Gem 1; 4 companies from their own careers page.

**Small businesses**, where job boards are rare: of 150 random German websites, open jobs were read for **18** — 17 of them from the careers page itself; of 128 local businesses from Google Maps (lawyers, dentists, tax advisers, estate agents and plumbers in Chicago, Manchester, Köln and Kraków), for **20**, all from the careers page. Read from job boards alone, the same lists give 1 and 0.

**Accuracy.** A job from a board is the company's own: a board is read whole only when it is named like the company, and a board of another name only for the jobs the website links on it — a startup that links three of its jobs on its venture fund's board, which lists 107 jobs of the fund's portfolio, gets its three. We read all 305 jobs taken from careers pages by hand: **294 are distinct open jobs** as the page lists them; 11 are an ad counted twice (its heading and its link worded differently) or a section of the page read as a job.

### How much does it cost?

**$0.001 per job** (~$1 per 1,000 jobs) on Apify's paid plans - $0.0009 on Scale, $0.0008 on Business and up - and $0.002 on the Free plan, charged once for each job returned. A company with no open job, a careers page whose jobs could not be read, and a website that did not answer are returned and never charged. A talent pool or an open application ("Join our talent community", "Don't see your role?") is not a job and is left out.

A company with 9 open jobs costs $0.009 on the Starter plan. The **Max jobs per company** field caps what one company can cost.

### Tips

- **Give the company's main website**: the careers link is usually in its menu or footer. A link to the job board itself (`jobs.ashbyhq.com/acme`) works too and skips the search.
- **Large employers on Workday** list thousands of jobs: raise **Max jobs per company** only if you need them all.
- **`jobs_not_read`** means the careers page exists but builds its list with scripts, or uses a board this Actor does not read yet (SmartRecruiters, iCIMS, Dover): the careers page is in the row for you to open.

### FAQ

#### Does it search jobs by keyword across companies?

No: you bring the companies, it brings their open jobs. Filter the dataset by title, department or location afterwards.

#### How fresh are the jobs?

They are read live from each company's board or careers page at the moment of the run, so a job closed yesterday is not there.

#### Is scraping job postings legal?

The jobs are published by the companies for anyone to read, and the job boards serve them in open feeds. This Actor respects `robots.txt` and rate-limits its requests. What you do with the data is your responsibility.

### Related Actors

- [Website Contact & Email Scraper](https://apify.com/sandy_yclept/website-contact-email-scraper) — emails, phone numbers and social profiles from any list of websites, priced per contact.
- [Decision Maker Email Finder](https://apify.com/sandy_yclept/decision-maker-email-finder) — the owners, CEOs and founders a company names on its own website, each with a work email it published or its mail server confirmed.
- [Email Finder by Name & Domain](https://apify.com/sandy_yclept/work-email-finder) — a person's work email from their name and company domain.
- [Company Email Format Finder](https://apify.com/sandy_yclept/email-pattern-finder) — a company's email pattern from its domain, with the addresses that prove it.
- [Contact Page & Form Finder](https://apify.com/sandy_yclept/contact-page-finder) — each company's contact page and whether it has a contact form.

### Support

Found a job that was missed, or a row that is not a job? Open an issue on the **Issues** tab with the website — every report becomes a test named after it.

If this Actor saved you time, a short review on its Store page helps others find it.

# Actor input Schema

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

Company websites (domains or URLs), or links to their job boards (jobs.lever.co/acme, jobs.ashbyhq.com/acme). One row per open job; a website with none gets one row that says why. Paste them, upload or link a text or CSV file of them, or link a Google Sheet shared with "anyone with the link". A URL listed twice is read once.

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

At most this many of a company's open jobs are returned, each a row and a charge: a large employer lists thousands on Workday. Raise it to read more of them, up to 1,000 a company.

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

Optional proxy for fetching pages. Apify Proxy's datacenter IPs are included in every Apify plan, the Free plan too; residential proxies are billed separately. Left disabled, the Actor connects directly, and retries sites that refuse it through Apify Proxy (see below).

## `proxyFallback` (type: `boolean`):

Every cloud run has a datacenter IP address, and some sites turn those away. A site that refuses or drops the direct connection is retried once through Apify Proxy's datacenter IPs (included in every Apify plan, the Free plan too), then once more directly. Sites that answer directly never go through the proxy, and robots.txt is respected either way. Has no effect when a proxy is configured above.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.assemblyai.com/"
    },
    {
      "url": "https://www.clark.de/"
    },
    {
      "url": "https://www.hammermuehle-shop.de/"
    }
  ],
  "maxJobsPerCompany": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "proxyFallback": true
}
```

# Actor output Schema

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

No description

# 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://www.assemblyai.com/"
        },
        {
            "url": "https://www.clark.de/"
        },
        {
            "url": "https://www.hammermuehle-shop.de/"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sandy_yclept/careers-page-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://www.assemblyai.com/" },
        { "url": "https://www.clark.de/" },
        { "url": "https://www.hammermuehle-shop.de/" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("sandy_yclept/careers-page-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://www.assemblyai.com/"
    },
    {
      "url": "https://www.clark.de/"
    },
    {
      "url": "https://www.hammermuehle-shop.de/"
    }
  ]
}' |
apify call sandy_yclept/careers-page-scraper --silent --output-dataset

```

## MCP server setup

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