# Greenhouse, Lever, Ashby & Workable Job Search (`maniginam/career-site-job-search`) Actor

Jobs scraper and job search API for Greenhouse, Lever, Ashby, and Workable career sites.  Search 343 company boards or your own list by keyword, location, remote, and posting date, with salary when posted.  Monitor mode returns only new jobs, so a daily schedule pays only for fresh roles.

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

## Pricing

from $4.00 / 1,000 job records

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 is a jobs scraper and job postings API for company career sites on Greenhouse, Lever, Ashby, and Workable.  It reads the public job boards that companies host on those sites, keeps the jobs that match your keywords, locations, remote preference, and posting date, and returns one clean record per job with the company, department, location, employment type, posting date, salary when the board publishes it, and the link to apply.

Leave the company list empty to search the built-in index of 343 company boards (about 31,000 open jobs when the index was built on 2026-11-02, at companies such as SpaceX, Databricks, OpenAI, Stripe, and Anthropic), or paste your own list of career site links.  Turn on monitor mode and add a schedule to get only jobs that are new since the last run.

### What does it do?

- Searches every board in the built-in index, your own company list, or both, with Greenhouse, Lever, Ashby, and Workable boards read side by side.
- Matches keywords and phrases as whole words in the job title or department, so `intern` does not match "Internal Audit".
- Filters by location, remote, and how many days ago the job was posted, and drops titles with words you exclude.
- Normalizes every job to the same fields, including salary minimum, maximum, currency, and interval when the board publishes a pay range.
- Stops as soon as it has delivered `maxResults` jobs, so a narrow search finishes in seconds.
- In monitor mode, remembers the jobs it delivered for this search and outputs only new ones on later runs.

### Who is it for?

- **Job seekers and career coaches** who want one daily list of fresh roles from the companies they care about, without the reposts and ads of job aggregators.
- **Recruiters and staffing agencies** looking for companies that are hiring for a role right now, with the hiring company's own posting.
- **Sales and growth teams** using new job posts as buying signals, for example a company hiring its first data engineer.
- **Analysts and job board builders** who need structured, deduplicated postings straight from the source.

### Greenhouse, Lever, Ashby, and Workable jobs in one search

Greenhouse, Lever, and Ashby each publish a free job board API, and Workable careers pages run on public JSON, but every one of them works one company at a time and returns its own field names.  Searching Greenhouse jobs and Lever jobs side by side usually means a script per site, a list of board slugs, and code to line up the locations, dates, and pay ranges.  This Actor does that part for you.  One search covers all four sites, every job comes back in the same shape, and you can export the results or call the Actor like any other job board API.

A few searches you can run with it:

- Remote jobs for one role across every board, for example `product designer` with **Remote jobs only** on.
- Ashby jobs at early-stage startups posted in the last 7 days.
- New Greenhouse jobs at a list of target accounts, delivered once a day in monitor mode.

### How to use

1. Open the Actor and type the job titles or skills you want in **Keywords**, for example `data engineer`.
2. Optionally add **Locations** such as `New York` or `Remote`, switch on **Remote jobs only**, or set **Posted within the last N days**.
3. To search particular companies, paste their careers links or board slugs into **Companies**.  Turn off **Search the built-in board index** to search only those.
4. Set **Maximum job records** to cap the run and its cost.
5. Click **Start** and open the **Output** tab to see the jobs, or download them as CSV, Excel, or JSON.
6. For a daily feed, switch on **Only new jobs (monitor mode)** and add a schedule on the **Schedules** page.

### Input

| Field | Type | Description |
| --- | --- | --- |
| `keywords` | list | Whole words or phrases to look for in the job title or department.  Empty means every job. |
| `locations` | list | Whole words to look for in the job location, for example `London` or `Remote`. |
| `remoteOnly` | true/false | Keep only remote jobs. |
| `postedWithinDays` | number | Keep only jobs first published in the last this many days (1 to 365). |
| `excludeKeywords` | list | Skip jobs whose title contains any of these words. |
| `companies` | list | Career site links or board slugs to search, first.  Up to 500. |
| `searchBuiltInIndex` | true/false | Also search the built-in index of company boards.  On by default. |
| `atsSystems` | list | Which sites of the index to search: `greenhouse`, `lever`, `ashby`, `workable`.  Empty means all four. |
| `onlyNewJobs` | true/false | Monitor mode: output only jobs not delivered by an earlier run of the same search. |
| `maxResults` | number | The most job records to output and charge in one run (default 1,000). |

Example input for remote data engineering jobs posted in the last week:

```json
{
  "keywords": ["data engineer", "analytics engineer"],
  "excludeKeywords": ["intern"],
  "remoteOnly": true,
  "postedWithinDays": 7,
  "companies": ["https://jobs.lever.co/spotify", "ashby:ramp"],
  "maxResults": 200
}
```

A company entry can be a link to a Greenhouse, Lever, Ashby, Workable, or Workday careers page, or a bare slug such as `airbnb`, which is looked up on Greenhouse, Lever, Ashby, and Workable.  Prefix a slug with `greenhouse:`, `lever:`, `ashby:`, or `workable:` to pick the site yourself.  Workday boards need the full careers link and are only searched when you list them.  Links to any other host are refused.

### Output

Each dataset item is one job.  Example:

```json
{
  "jobId": "2a55d6c9-c564-443a-be3e-a3851db5a93b",
  "title": "Senior Data Engineer",
  "company": "Spotify",
  "department": "Data Platform",
  "location": "New York, NY; Remote - US",
  "remote": true,
  "workplaceType": "remote",
  "employmentType": "Full-time",
  "postedAt": "2026-10-28T14:20:40Z",
  "updatedAt": null,
  "salaryText": "150,000 - 190,000 USD per year",
  "salaryMin": 150000,
  "salaryMax": 190000,
  "salaryCurrency": "USD",
  "salaryInterval": "year",
  "url": "https://jobs.lever.co/spotify/2a55d6c9-c564-443a-be3e-a3851db5a93b",
  "ats": "lever",
  "companyKey": "lever:spotify",
  "boardUrl": "https://jobs.lever.co/spotify",
  "foundAt": "2026-11-02T15:00:00Z"
}
```

The run's key-value store also holds `SEARCH_SUMMARY`, free of charge: how many boards were searched, which boards no longer exist or could not be read, how many jobs matched, how many were already delivered by earlier monitor runs, and why the run ended.  Text that a spreadsheet would run as a formula is prefixed with an apostrophe in the export.

Which fields are filled depends on the board.  Greenhouse gives the department, posting and update times, and the pay range when the company shows one.  Lever and Ashby give the department, workplace type, commitment, and salary range when published.  Workable gives the department, remote flag, and posting day but no salary.

### Monitor mode

With **Only new jobs** on, the Actor keeps a history for each search in the named key-value store `career-site-job-search-monitor`.  The same keywords, locations, sites, companies, and day window share one history whatever their order or case.  The first run delivers every matching job.  Later runs deliver only jobs not delivered before, so you pay only for new roles.  Jobs past `maxResults` are not remembered, so they come on the next run.  Changing the search starts a new history.  The history keeps the 50,000 most recently delivered jobs per search.

### Pricing

This Actor uses pay-per-event pricing.

- **Job record:** $4.00 per 1,000 jobs delivered to your dataset ($0.004 each).
- **Actor start:** Apify's standard start event ($0.00005).
- The search summary is free, and boards that are searched but have no matching jobs cost nothing.

A search for 50 matching jobs costs $0.20.  A daily monitor that finds 30 new jobs a day costs about $3.60 a month.  You can cap any run with Apify's maximum charge setting.  The Actor stops cleanly at your limit, and you are only charged for jobs that actually reach your dataset.

#### Estimated compute cost

Default memory is 512 MB.  A narrow search usually stops within a minute once it has `maxResults` jobs.  A search of the whole index with few matches reads every board, about 10 to 15 minutes, because each site is read politely one request at a time (Lever asks for one request a second).  Compute stays at a few cents per full-index run, so the job records are most of the cost.  If you list hundreds of large Workday boards, raise the run timeout above the default hour.

### Data sources and freshness

- [Greenhouse job board API](https://developers.greenhouse.io/job-board.html): `boards-api.greenhouse.io`.
- [Lever postings API](https://github.com/lever/postings-api): `api.lever.co` and `api.eu.lever.co`.
- [Ashby job board API](https://developers.ashbyhq.com/docs/public-job-posting-api): `api.ashbyhq.com`.
- Workable careers widget API: `apply.workable.com`, the public JSON behind Workable careers pages.
- Workday careers sites: the public job search JSON that every `myworkdayjobs.com` careers page itself uses.

Every job is read live from the company's own board at run time, so the data is as fresh as the board.  The built-in index lists boards that had open jobs when this version was built.  A board that has since closed is counted in `SEARCH_SUMMARY` as missing and skipped.  If the platform moves a run to another server, it resumes without delivering or charging a job twice.

SmartRecruiters is not included, because its API host asks automated clients other than LinkedIn not to crawl it.

### Is it legal to use this data?

The Actor reads job postings that companies publish on public job boards for anyone to view, through the same public endpoints their careers pages use, without logging in.  Job postings are business information, not personal data.  The data is provided as is, without any guarantee that it is complete, current, or accurate.  This Actor is an independent tool and is not affiliated with or endorsed by Greenhouse, Lever, Ashby, Workable, Workday, or any company whose jobs it reads.  You are responsible for how you use the results and for following each site's terms that apply to you.

### API and integrations

You can start this Actor and read its results with the [Apify API](https://docs.apify.com/api/v2), the Apify Python and JavaScript clients, or the Apify CLI.  The API returns each run's dataset in the same formats as the Console.

From Python, with the [Apify client](https://docs.apify.com/api/client/python):

```python
from apify_client import ApifyClient

client = ApifyClient('<YOUR_APIFY_TOKEN>')
run = client.actor('maniginam/career-site-job-search').call(
    run_input={
        'keywords': ['data engineer'],
        'remoteOnly': True,
        'postedWithinDays': 30,
        'maxResults': 100,
    }
)
for job in client.dataset(run['defaultDatasetId']).iterate_items():
    print(job['company'], job['title'], job['url'])
```

Apify integrations can pass results on when a run finishes, for example to Google Sheets, Slack, Zapier, Make, or your own webhook.  Set them up on the Actor's **Integrations** tab, and pair them with a schedule for a hands-off feed of new jobs.

### FAQ

**Which companies are in the built-in index?**  343 company boards on Greenhouse (187), Ashby (118), Lever (27), and Workable (11), mostly technology and growth companies, from SpaceX and Stripe to early-stage startups.  The list ships with the Actor in `my_actor/data/board_index.json`.  If a company you need is missing, list it in **Companies** or ask for it on the Issues tab.

**Why did a company return no jobs?**  Either none of its open jobs matched your filters, or its board moved.  `SEARCH_SUMMARY` lists boards that no longer exist and boards that could not be read.

**Does a keyword match part of a word?**  No.  Keywords match whole words, and a trailing s for plurals, so `engineer` matches "Data Engineers" but not "Engineering Manager".  Add `engineering` as a second keyword to get both.

**How is this different from the Career Site Jobs and Hiring Tracker?**  The tracker follows a fixed list of companies and reports jobs that opened and closed.  This Actor is a search across many boards by keyword, location, and date.

**Is there a free Greenhouse jobs API or Lever jobs API I could use instead?**  Yes.  Greenhouse, Lever, and Ashby all publish free public job board APIs (linked under Data sources), and if you only need one company and are happy to write code, calling them directly costs nothing.  This Actor is for when you want many boards, one schema, keyword and date filters, and only new jobs on a schedule without maintaining the scripts yourself.

**How do I find remote jobs on Greenhouse, Lever, and Ashby?**  Switch on **Remote jobs only**.  A job counts as remote when its board marks it remote or its location says remote.  For remote jobs in one region, also put the country under **Locations**, for example `US` or `Germany`, which keeps remote jobs whose location names it.

**Can I search LinkedIn or Indeed?**  No.  This Actor reads only the companies' own career sites, which is where those postings come from in the first place.

### Related Actors

- [Career Site Jobs and Hiring Tracker](https://apify.com/maniginam/career-site-jobs-hiring-tracker): every open job from a company list, with new and closed roles over time.
- [Website Contact Enrichment](https://apify.com/maniginam/website-contact-enrichment): emails, phones, and social links from company websites.
- [News Brand Mention Monitor](https://apify.com/maniginam/news-brand-mention-monitor): news articles that mention a company or brand.
- [AI Brand Visibility Tracker](https://apify.com/maniginam/ai-brand-visibility-tracker): how AI assistants describe and recommend a brand.

For a comparison of job posting and hiring tracker tools, see [Best job posting and hiring trackers in 2026](https://tools.aileapers.com/articles/best-job-posting-hiring-trackers-2026.html) on AI Leapers.

### Feedback and custom requests

Found a bug or a board the Actor cannot read?  Open an issue on the Actor's Issues tab and it will be looked at quickly.  For a custom request, such as another job board site or a tailored export, describe it on the Issues tab as well.

# Changelog

This Actor's version history is a separate document: https://apify.com/maniginam/career-site-job-search/changelog.md

# Actor input Schema

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

Keep jobs whose title or department contains any of these words or phrases as whole words, for example data engineer, account executive, or designer.  Case does not matter and a plural matches too.  Leave empty for every job.

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

Keep jobs whose location contains any of these as whole words, for example New York, London, Germany, or Remote.  Leave empty for every location.

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

Keep only jobs the board marks as remote, or whose location says remote.

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

Keep only jobs first published in the last this many days, for example 7.  Jobs whose board gives no posting date are left out when this is set.  Leave empty for any date.

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

Skip jobs whose title contains any of these words, for example intern, senior, or manager.

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

Optional.  One company per line: a careers link such as https://job-boards.greenhouse.io/airbnb, https://jobs.lever.co/spotify, https://jobs.ashbyhq.com/ramp, https://apply.workable.com/huggingface/, or https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite, or a board slug such as airbnb.  A bare slug is looked up on Greenhouse, Lever, Ashby, and Workable.  Prefix a slug with greenhouse:, lever:, ashby:, or workable: to pick the site.  Listed companies are searched first.

## `searchBuiltInIndex` (type: `boolean`):

When on, the Actor also searches its built-in index of company job boards (listed in the README).  Turn it off to search only the companies above.

## `atsSystems` (type: `array`):

Which sites of the built-in index to search.  Leave empty for all four.  Companies you list are always searched.

## `onlyNewJobs` (type: `boolean`):

When on, the Actor remembers the jobs it delivered for this search and outputs only jobs not delivered by an earlier run.  Jobs already delivered are skipped and not charged.  The first run delivers every matching job.  Use it with a daily schedule.

## `maxResults` (type: `integer`):

The most job records to output (and charge) in one run.  The search stops once this many are delivered.

## Actor input object example

```json
{
  "keywords": [
    "data engineer"
  ],
  "remoteOnly": false,
  "searchBuiltInIndex": true,
  "onlyNewJobs": false,
  "maxResults": 50
}
```

# Actor output Schema

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

No description

## `searchSummary` (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 = {
    "keywords": [
        "data engineer"
    ],
    "maxResults": 50
};

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

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

```

## MCP server setup

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