# Career Site Job Search: 4,000+ Company Job Boards (`precious_bathmat/career-site-job-search`) Actor

Search jobs straight from 4,000+ company career sites on Greenhouse, Lever, Ashby, Workable, SmartRecruiters and Workday with one keyword. Salary, remote, posted date, apply link, plus a hiring report per keyword. No login, no API key.

- **URL**: https://apify.com/precious_bathmat/career-site-job-search.md
- **Developed by:** [Mariam Ahmed](https://apify.com/precious_bathmat) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 jobs

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

## Career Site Job Search: 4,000+ Company Job Boards

Search **jobs straight from company career sites** with one keyword. The scraper reads **4,410 company job boards** on **Greenhouse, Lever, Ashby, Workable, SmartRecruiters and Workday**, from Stripe, Anthropic, Capital One and NVIDIA to hospitals, banks and startups. For every matching job you get the **company, location, remote flag, department, employment type, salary when the company publishes it, posted date, job link and apply link**, plus a **hiring report per keyword**.

- **One search, 4,410 career sites**: no job board middleman, no reposts, no expired ads; every job comes from the employer's own applicant tracking system
- **About 830,000 open jobs** in the directory when it was last checked (10 October 2026)
- **Salary** from Greenhouse pay ranges, Lever salary ranges and Ashby compensation: about 1 in 6 tech jobs publishes one
- **Hiring report per keyword**: top hiring companies, top locations, remote share, salary medians by currency, newest jobs
- **Filters**: locations, remote only, posted in the last N days, words to leave out, minimum yearly salary, only certain companies or systems
- **Add any board**: paste a Greenhouse, Lever, Ashby, Workable, SmartRecruiters or Workday address to search it too
- **No login, no API key, no proxy**: every system here publishes an open job feed

### What does this career site job search do?

```
"product manager"  → 6,316 jobs at 1,577 companies · 21% remote · USD median $166K–$225K
"data engineer"    → 3,591 jobs at 1,109 companies · 16% remote · 546 publish a salary
"registered nurse" → 2,583 jobs at 122 employers · Geisinger 258, Northwestern 220
```

1. Type **job title keywords**, one per line.
2. The scraper reads every board in the directory. Greenhouse, Lever, Ashby and Workable hand over a whole board at once; Workday and SmartRecruiters are searched on their side, so a 25,000-job board costs a handful of requests.
3. A job matches when **every word of the keyword is in its title**.
4. You get the **newest matching jobs** (up to your maximum), one **hiring report per keyword** covering **every** match, and a CSV.

```mermaid
flowchart LR
    A[Keywords +<br/>filters] --> B[4,410 career sites<br/>6 systems]
    B --> C[Title match ·<br/>location · remote · date]
    C --> D[Newest jobs<br/>one row each]
    C --> E[Hiring report<br/>per keyword]
```

### Who is it for?

- **Job seekers** who want every opening for their title in one list, straight from the employer, newest first
- **Recruiters and staffing agencies** finding which companies are hiring for a role right now, and where
- **Sales and lead generation teams** using fresh openings as buying signals (a company hiring data engineers is buying data tools)
- **Job boards and aggregators** filling their listings from the source
- **Analysts and HR teams** benchmarking demand, remote share and published salaries for a role

### What data do you get?

**Jobs** (dataset, one row per job)

| Field | What it tells you |
|---|---|
| `title`, `company`, `department`, `team` | The role and who is hiring |
| `location`, `allLocations`, `country` | Where; all locations when a job lists several |
| `isRemote`, `workplaceType` | Remote, hybrid or on-site, as the board says, or read from the location |
| `employmentType`, `experienceLevel` | Full-time, part-time, contract, intern; level where the system gives it |
| `salaryText`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | Published pay (yearly or hourly) |
| `postedAt`, `postedAgo` | When it was posted (Workday says "Posted 3 Days Ago"; both are kept) |
| `jobUrl`, `applyUrl`, `jobId` | The job page and the apply page |
| `ats`, `boardUrl` | Which system and which board it came from |
| `matchedKeywords` | Which of your keywords found it |
| `description` | Full description as plain text, when **Job descriptions** is on |

**`REPORTS`** holds one report per keyword, built from **every** matching job, not only the saved ones: `jobsFound`, `jobsSaved`, `companies`, `remoteShare`, `postedLast7Days`, `postedLast30Days`, `jobsWithSalary`, `salaryPerYear` (median from–to per currency, and the highest-paying job), `topCompanies`, `topLocations`, `topDepartments`, `employmentTypes`, `systems` and the 10 `newest` jobs.

**`JOBS_CSV`** has every saved job as flat columns. **`RUN_SUMMARY`** shows how many boards of each system answered.

### Example: 11 October 2026

Three keywords, every board in the directory, maximum 1,000 jobs per keyword: **12,490 matching jobs found, 3,000 newest saved, in 8 minutes**.

| Keyword | Jobs found | Companies | Remote | Published salary | Top hiring companies |
|---|---|---|---|---|---|
| product manager | 6,316 | 1,577 | 21.2% | 1,235 jobs, USD median $166K–$225K | Capital One 225, Veeva 100, Palo Alto Networks 68 |
| data engineer | 3,591 | 1,109 | 16% | 546 jobs, USD median $150K–$220K | Blend360 70, PwC 64, Sopra Steria 62 |
| registered nurse | 2,583 | 122 | 2.8% | mostly hourly | Geisinger 258, Northwestern Memorial 220, Boston Medical Center 181 |

- Top cities for product managers: **San Francisco 379, New York 361, remote 357, London 194**.
- The highest published data engineering salary was **$850,000** (Anthropic, pre-training data infrastructure).
- 937 of the product manager jobs were posted in the last 7 days.

### Pricing

**$0.001 per job** saved, plus **$0.02 per hiring report** (one per keyword that found jobs).

- 1,000 jobs and their report: **$1.02**
- The run above: 3,000 jobs and 3 reports, **$3.06**
- A daily run with **Posted in the last 1 day** usually saves a few hundred jobs per keyword

Nothing is charged when no job matches.

### Good to know

- **How a keyword matches**: every word must be in the title as a whole word. "data engineer" finds "Senior Data Platform Engineer" but not "Database Engineer". Use **Leave out titles with** to drop "senior", "intern" or "manager".
- **Newest first**: when more jobs match than your maximum, the newest are saved. The report always covers every match.
- **The directory** lists boards that answered with open jobs on 10 October 2026, found in public hiring threads and job lists and checked one by one. Companies that never appeared there are not in it: paste their board under **Extra boards**.
- **Posted dates**: Workday gives "Posted 30+ Days Ago" for older jobs; those have no exact date and are left out when **Posted in the last** is set, unless the job page gives one.
- **Locations** match as text, with common aliases: "United States" also finds "USA" and "US", "UK" finds "England" and "London, United Kingdom". "Remote" finds remote jobs.
- **Salary** appears when the company publishes it. Workday and SmartRecruiters have no pay field.
- **The same job on two boards** (some companies run a second board for one country) is saved and charged once.
- **Personal data**: none. Only job ads; no recruiter or employee names.

### Input

| Field | Meaning |
|---|---|
| **Job title keywords** | One search per line |
| **Locations** | Cities, countries or "Remote"; empty for everywhere |
| **Remote jobs only** | Off by default |
| **Posted in the last (days)** | 0 = any date |
| **Leave out titles with** | Words that drop a job |
| **Minimum yearly salary** | Keeps only jobs publishing at least this much a year |
| **Maximum jobs per keyword** | 1 to 100,000 (default 500) |
| **Applicant tracking systems** | Search only some of the six |
| **Only these companies** | Company names; with no keywords, lists all their jobs |
| **Extra boards** | Board addresses outside the directory |
| **Search the built-in directory** | Turn off to search only your extra boards |
| **Job descriptions** | Full text of each job, off by default |

### Integrations

Export to JSON, CSV, Excel or Google Sheets, or connect through the Apify API, webhooks, Make, Zapier and n8n. Schedule it every morning with **Posted in the last 1 day** to get each day's new openings for your roles.

# Actor input Schema

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

One search per line. A job matches when every word is in its title: "data engineer" finds "Senior Data Platform Engineer" but not "Database Engineer". Each keyword gets its own hiring report.

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

Optional. Keep jobs in any of these places, one per line: a city ("London", "New York"), a country ("United States", "Germany") or "Remote". Leave empty for everywhere.

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

Only jobs the board marks as remote, or whose location says remote or anywhere.

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

0 = any date. Jobs without a posting date are left out when this is set.

## `excludeWords` (type: `array`):

Optional. Skip jobs whose title has any of these words, e.g. "senior", "intern", "manager".

## `minYearlySalary` (type: `integer`):

Optional. Keep only jobs that publish a yearly salary whose top is at least this much (in the job's own currency). Leaves out jobs without a published salary. 0 = no salary filter.

## `maxJobsPerKeyword` (type: `integer`):

Stops each keyword after this many matching jobs.

## `systems` (type: `array`):

Optional. Search only boards on these systems. Leave empty for all six.

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

Optional. Search only directory companies whose name contains one of these, e.g. "Stripe", "Morgan Stanley". With no keywords, every open job of these companies is listed.

## `extraBoards` (type: `array`):

Optional. Career sites that are not in the directory: paste the board address, e.g. https://jobs.lever.co/acme, https://job-boards.greenhouse.io/acme, https://acme.wd5.myworkdayjobs.com/External.

## `includeDirectory` (type: `boolean`):

Turn off to search only your extra boards.

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

Also return each job's full description as plain text. Slower on Workday and SmartRecruiters, where every job page is read.

## Actor input object example

```json
{
  "keywords": [
    "data engineer"
  ],
  "remoteOnly": false,
  "postedWithinDays": 0,
  "minYearlySalary": 0,
  "maxJobsPerKeyword": 500,
  "includeDirectory": true,
  "includeDescriptions": false
}
```

# Actor output Schema

## `jobs` (type: `string`):

One row per job: company, location, remote, salary, posted date and links.

## `reports` (type: `string`):

Top hiring companies and locations, remote share, salary medians and the newest jobs.

## `csv` (type: `string`):

All jobs in one spreadsheet.

## `summary` (type: `string`):

Boards read per system, counts and notes.

# 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 = {
    "keywords": [
        "data engineer"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("precious_bathmat/career-site-job-search").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 = { "keywords": ["data engineer"] }

# Run the Actor and wait for it to finish
run = client.actor("precious_bathmat/career-site-job-search").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 '{
  "keywords": [
    "data engineer"
  ]
}' |
apify call precious_bathmat/career-site-job-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,precious_bathmat/career-site-job-search"
        }
    }
}
```

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/XdkJgQchyeorJ6Dzg/builds/tAI2D4RId6d1R8tWk/openapi.json
