# Careers Page Jobs Scraper (`osaki/careers-jobs-scraper`) Actor

Find open jobs and hiring signals from public company careers boards.

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

## Pricing

from $3.00 / 1,000 job listings

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/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

## Careers Page Jobs Scraper

Find open roles from company domains or direct careers board links. The scraper searches company websites for supported public job boards, collects available listings, and adds a hiring summary for each company.

Recruiters can build job lists, sales teams can track hiring signals, and market researchers can compare hiring activity across companies.

### Input

```json
{
  "domains": ["stripe.com", "notion.so", "linear.app"],
  "startUrls": [{"url": "https://jobs.ashbyhq.com/linear"}],
  "includeDescriptions": false,
  "fetchJobDetails": false,
  "maxJobsPerCompany": 500,
  "filterKeywords": ["engineer"],
  "filterLocations": ["remote"],
  "postedWithinDays": 30,
  "maxConcurrency": 5
}
```

Domains and direct board URLs can be used independently or together. Keywords match job titles; location terms match any listed location. Each list uses an “any” match, while different filters must all match. Jobs without a known posting date are excluded when the date filter is set. Descriptions and proxy use are optional.

### Output

Each matching job is a `job` row. Each input company or board also gets a `company_summary` row.

```json
{"dataType":"job","domain":"example.com","companyName":"Example","ats":"ashby","title":"Senior Engineer","location":"Remote","remote":true,"workplaceType":"remote","postedAt":"2026-01-01T00:00:00.000Z","jobUrl":"https://example.com/jobs/123"}
{"dataType":"company_summary","domain":"example.com","ats":"ashby","openRolesCount":1,"totalOpenRoles":1,"jobsReturned":1,"departmentsHiring":{"Engineering":1},"topLocations":[{"location":"Remote","count":1}],"remoteShare":1,"newestPostedAt":"2026-01-01T00:00:00.000Z","hiringSignal":"low"}
```

`totalOpenRoles` and `openRolesCount` report the total published by the board before filters or the per-company limit; `jobsReturned` counts matching jobs returned. The department, location, newest date and remote-share statistics describe returned jobs only. `remoteShare` is the share of returned jobs marked remote (null when fewer than 10 jobs are returned). Hybrid jobs are not remote. Hiring signal uses the board total: none (0), low (1–19), medium (20–99), high (100+); it is null if the total is unknown, except when a confirmed lower bound establishes the signal. When Workday appears to cap its total, `totalOpenRoles` and `openRolesCount` are null, while `atsReportedTotal` and `totalLowerBound` show the reported minimum. Missing information is returned as null. Dates from relative Workday labels are approximate UTC dates.

Workday listings may not include department. Set `fetchJobDetails` to true to request a detail page for each returned Workday job; this is slower, and some boards (including NVIDIA in a checked response) do not provide a department there either. The default is false. Seniority defaults to `mid` when a title has no explicit level; this is an estimate.

### Supported boards

Greenhouse, Lever, Ashby and Workday public job boards. Detection follows board links and embeds on common careers pages, then tries the company name as a board identifier. A direct board URL can help when a site does not link to its board in accessible page HTML.

### FAQ

**Why are some fields empty?** Boards publish different details. Salary, department, employment type and dates may be unavailable. Workday listing pages often provide fewer fields.

**Why is a company missing jobs?** Its board may be unsupported, hidden behind JavaScript or blocking requests. Try a direct board URL. Filters and the maximum job limit also affect counts.

**Are summaries full company totals?** The total and hiring signal describe the board before filters and limits. Department and location statistics describe only returned jobs. A warning is included when no supported board can be read.

**What data is collected?** Only publicly accessible job board and company website data is collected. Users are responsible for complying with applicable laws and site terms.

# Actor input Schema

## `domains` (type: `array`):

Company websites to search for supported careers boards.

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

Optional direct Greenhouse, Lever, Ashby or Workday board URLs.

## `includeDescriptions` (type: `boolean`):

Include the job description as plain text when available.

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

Maximum matching jobs to return per company.

## `filterKeywords` (type: `array`):

Return jobs whose title contains any of these terms.

## `filterLocations` (type: `array`):

Return jobs whose locations contain any of these terms.

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

Return jobs with a known posting date within this number of days.

## `maxConcurrency` (type: `integer`):

Maximum number of companies processed at once.

## `proxy` (type: `object`):

Optional proxy settings for requests; no proxy is used by default.

## `fetchJobDetails` (type: `boolean`):

Request each returned Workday job detail for a department when available; slower and may still be empty.

## Actor input object example

```json
{
  "domains": [
    "stripe.com",
    "notion.so",
    "linear.app"
  ],
  "startUrls": [],
  "includeDescriptions": false,
  "maxJobsPerCompany": 500,
  "maxConcurrency": 5,
  "fetchJobDetails": false
}
```

# Actor output Schema

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

All rows produced by the run (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 = {
    "domains": [
        "stripe.com",
        "notion.so",
        "linear.app"
    ],
    "startUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("osaki/careers-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 = {
    "domains": [
        "stripe.com",
        "notion.so",
        "linear.app",
    ],
    "startUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("osaki/careers-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 '{
  "domains": [
    "stripe.com",
    "notion.so",
    "linear.app"
  ],
  "startUrls": []
}' |
apify call osaki/careers-jobs-scraper --silent --output-dataset

```

## MCP server setup

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