# Career Site Job Search: 700k+ Jobs, Workday, Greenhouse & Ashby (`dataforgehq/career-site-job-search`) Actor

Search 700k+ open jobs across 11,000+ company career sites (Workday, Greenhouse, Ashby, Lever) at once by title, location, remote and posting date. Daily index of official public career-site endpoints; optional full descriptions and salary ranges. $1.50 per 1,000 jobs.

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

## Pricing

from $1.50 / 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: 700k+ jobs from 11,000+ companies (Workday, Greenhouse, Ashby, Lever)

Search **open jobs across 11,000+ company career sites at once**, without knowing which companies to look at. Type a job title (for example `data engineer`), add a location or **remote only**, pick how recent the posting must be, and get a clean, de-duplicated list of matching jobs, newest first, with direct apply links.

The jobs come from company career sites hosted on **Workday** (Capital One, NVIDIA, Salesforce, Adobe and other enterprises: 4,700+ sites, ~520k jobs), **Greenhouse** (Airbnb, Coinbase, Reddit and thousands of scale-ups: 4,300+ boards, ~160k jobs), **Ashby** (2,100+ startups, ~44k jobs, many with published salary ranges), and **Lever** (300+ boards and ~15k jobs live, growing daily toward 1,800+ boards). They are read from each platform's **official public job-board endpoints and career-site sitemaps**: no login, no scraping of job boards like LinkedIn or Indeed, no personal data. The index is **refreshed daily**, and you can switch on **live detail fetch** for full descriptions and **structured salary ranges** (US pay-transparency fields). Use `sources` to search only some platforms.

**Price: $1.50 per 1,000 jobs** ($0.0015 per job saved) + a tiny $0.00005 start fee. Filters run before charging: you pay only for the jobs written to your dataset. Set `maxJobs` or a maximum cost per run and the Actor stops there.

### What you can do with it

- **Job alerts and job boards**: schedule a daily run for "posted within 1 day" and push new roles to Slack, email, Airtable or your niche job board.
- **Recruiting and sales intelligence**: find every company hiring for a role (e.g. "SOC analyst", "Head of Growth") as a buying or hiring signal.
- **Labour-market research**: count openings by title, location, remote share and salary range across thousands of employers.
- **Job seekers and career coaches**: one search instead of opening hundreds of career pages.
- **AI agents and RAG**: a single tool call returns structured, typed job records (see the dataset schema) with stable `jobId`s.

### Input

| Field | What it does |
|---|---|
| `keywords` | Title contains ANY of these words/phrases (`"data engineer"`, `"sdr"`, `"product designer"`). Empty = all titles. |
| `excludeKeywords` | Drop titles containing these (`"intern"`, `"senior"`). |
| `locations` | Location text contains ANY of these (`"London"`, `"Germany"`, `"Remote"`). |
| `remoteOnly` | Only jobs marked Remote by the employer or with Remote/Anywhere in the location (hybrid excluded). |
| `postedWithinDays` | Only jobs first published in the last N days. |
| `companies` | Optional: limit to companies whose name or board slug contains these. |
| `employmentTypes` | Optional: `"full"`, `"part"`, `"contract"` (only where the employer publishes it). |
| `includeDescription` | Fetch each job live for the full description, departments, offices and pay ranges. Same price per job. |
| `redactContacts` | Redact recruiter emails/phones in descriptions (default on). |
| `maxJobs` | Stop after this many jobs (default 1,000). |

Example input:

```json
{ "keywords": ["data engineer", "analytics engineer"], "locations": ["Remote", "London"], "postedWithinDays": 7, "maxJobs": 200 }
```

### Output

One row per job, newest first:

| company | title | location | postedAt | salaryMin | salaryMax | url |
|---|---|---|---|---|---|---|
| Anthropic | Staff+ Software Engineer, STEM | San Francisco, CA | New York City, NY | Seattle, WA | 2026-11-06 | 405,000 | 485,000 | job-boards.greenhouse.io/anthropic/jobs/5468901008 |
| Mercury | Senior Software Engineer - Design Systems | San Francisco, CA, New York, NY, Portland, OR, or Remote within Canada or United States | 2026-11-06 | 200,700 | 250,900 | job-boards.greenhouse.io/mercury/jobs/6252006004 |
| Figma | Software Engineer - Application Platform | San Francisco, CA • New York, NY • United States | 2026-11-06 | 235,000 | 376,000 | boards.greenhouse.io/figma/jobs/6242561004 |

(Real rows from a test run on 9 Nov 2026 with `keywords: ["software engineer"]`, `locations: ["New York", "San Francisco"]`, `includeDescription: true`. Salaries are the employers' published pay-transparency ranges in USD.)

Full fields: `title, company, companySlug, ats, jobId, location, isRemote, workplaceType, employmentType, postedAt, updatedAt, url, applyUrl, boardUrl, requisitionId, indexBuiltAt, scrapedAt`, plus `descriptionText, departments, offices, payRanges, salaryMin, salaryMax, salaryCurrency, salaryPeriod` with `includeDescription`. A `SUMMARY` record shows how many jobs matched in total and when the index was refreshed.

### How fresh is it?

The index of all boards is rebuilt every day from the official API (`indexBuiltAt` is on every row). With `includeDescription` on, every job is re-checked live; jobs closed since the last refresh are skipped and **not charged**.

### FAQ

**Which ATSs are covered?** Workday (4,800+ career sites), Greenhouse (4,300+ boards), Ashby (2,100+ boards) and Lever (300+ boards, growing daily toward 1,800+), about 745,000 open jobs in total. If you already know your target companies and need Workable, SmartRecruiters and more, use the per-company Actors below.

**Is this legal?** The data is job postings that employers publish for the public through Greenhouse's documented Job Board API. No login, no personal profiles. Respect each employer's terms when you republish.

**How do I get only new jobs every day?** Schedule the Actor with `postedWithinDays: 1` and de-duplicate on `jobId`.

### Related Actors

Jobs suite:

- [Company Jobs API: Greenhouse, Lever, Ashby & 7 more ATS](https://apify.com/dataforgehq/ats-jobs-api): all jobs for a list of companies, any ATS
- [Greenhouse Jobs API](https://apify.com/dataforgehq/greenhouse-jobs-api), [Lever Jobs API](https://apify.com/dataforgehq/lever-jobs-api), [Ashby Jobs API](https://apify.com/dataforgehq/ashby-jobs-api)
- [Workday Jobs API](https://apify.com/dataforgehq/workday-jobs-api): any myworkdayjobs.com career site
- [Remote Jobs Aggregator](https://apify.com/dataforgehq/remote-jobs-aggregator): Remote OK, We Work Remotely and more

Company research: [Tech Stack Detector](https://apify.com/dataforgehq/tech-stack-detector), [Website Contact Details Scraper](https://apify.com/dataforgehq/website-contact-details-scraper).

Found a problem or want another ATS added? Open an issue on the Issues tab; I usually reply within a day.

# Actor input Schema

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

Return jobs whose title contains ANY of these words or phrases (case-insensitive), e.g. "data engineer", "product manager", "sdr". Leave empty to match every title.

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

Skip jobs whose title contains any of these, e.g. "intern", "senior", "manager".

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

Keep jobs whose location text contains ANY of these, e.g. "London", "Germany", "New York", "Remote". Matches the location as the employer wrote it.

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

Keep only jobs marked Remote by the employer (workplace type) or with Remote/Anywhere in the location. Hybrid roles are excluded.

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

Keep only jobs first published (or, where the platform does not publish a date, first seen by our daily index) in the last N days. Jobs with no known date are excluded when this is set. 0 or empty = any date. Results are always sorted newest first.

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

Limit the search to companies whose name or board slug contains any of these, e.g. "stripe", "airbnb", "nvidia". Leave empty to search every company in the index.

## `employmentTypes` (type: `array`):

Keep jobs whose employment type contains any of these, e.g. "full", "part", "contract". Only some employers publish this field, so this filter drops jobs without it.

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

Keep jobs whose department or team contains any of these, e.g. "engineering", "sales". Available for Lever and Ashby jobs (and Greenhouse boards that publish it); jobs without a department are dropped when this is set.

## `minSalary` (type: `integer`):

Keep only jobs whose published salary maximum is at least this number (in the job's own currency and period, e.g. 120000). Uses the pay ranges employers publish on Ashby; jobs without a published salary are dropped when this is set.

## `sources` (type: `array`):

Which applicant-tracking systems to search. Leave empty to search all four.

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

Fetch each matching job live from the employer's career site for the full description text, departments, offices and (where published) salary ranges. Slower, same price per job. Jobs closed since the last index refresh are skipped and not charged.

## `redactContacts` (type: `boolean`):

Replace recruiter emails and phone numbers in description text with placeholders.

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

Stop after this many jobs (newest first). You pay only for jobs saved.

## Actor input object example

```json
{
  "keywords": [
    "data engineer"
  ],
  "remoteOnly": false,
  "postedWithinDays": 7,
  "includeDescription": false,
  "redactContacts": true,
  "maxJobs": 20
}
```

# Actor output Schema

## `overview` (type: `string`):

Matching jobs, overview table.

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

Matching job count, jobs saved, index refresh time.

# 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"
    ],
    "postedWithinDays": 7,
    "maxJobs": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("dataforgehq/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"],
    "postedWithinDays": 7,
    "maxJobs": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("dataforgehq/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"
  ],
  "postedWithinDays": 7,
  "maxJobs": 20
}' |
apify call dataforgehq/career-site-job-search --silent --output-dataset

```

## MCP server setup

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