# Company Jobs Feed: Greenhouse, Lever, Ashby, Workday & more (`mytho-labs/ats-jobs-feed`) Actor

Get every open job from any company's careers page in one clean format. Auto-detects Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable and Recruitee from a company name, website or job board link. Salaries, remote flag, filters, and a new-jobs-only mode for daily monitoring.

- **URL**: https://apify.com/mytho-labs/ats-jobs-feed.md
- **Developed by:** [Josh Ungheanu](https://apify.com/mytho-labs) (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

$2.00 / 1,000 job returneds

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

## Company Jobs Feed: Greenhouse, Lever, Ashby, Workday & more

Get every open job from any company's careers page in one clean, consistent format. Paste in company names, websites or job board links. The Actor works out which hiring system each company uses and returns all of its open roles, with salaries, locations, remote status and full descriptions.

**Supported job boards:** Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Recruitee.

### Why use it

- **Just give it a company.** `stripe.com`, `Ramp`, or `https://jobs.lever.co/palantir` all work. The Actor checks the company's careers page for its job board, and falls back to looking the name up on each supported system.
- **One schema for seven job boards.** Every job has the same fields no matter where it came from, so you can drop the results straight into a spreadsheet, CRM or database.
- **Salaries included.** Structured pay ranges come from Ashby, Lever and Recruitee. For other boards, the range is pulled from the job description when it's listed there (e.g. "$120,000 – $150,000 per year" or "168,000 USD – 270,250 USD").
- **Daily new-jobs feed.** Turn on *Only new jobs since the last run* and schedule the Actor. Each run returns only jobs that have appeared since the previous one.
- **Fast and reliable.** It reads each company's official public job board feed instead of scraping web pages, so most runs finish in seconds and don't break when a careers page is redesigned.

### Use cases

- **Sales prospecting:** companies hiring for a role you sell to (e.g. "data engineer" means they may need data tooling) are in-market.
- **Job boards and newsletters:** build a niche job board from a curated list of companies.
- **Recruiting and market research:** track hiring at competitors, map salary bands by role and location.
- **Job seekers:** watch a list of dream companies and get only the new postings each morning.

### Input

| Field | What it does |
|---|---|
| **Companies** | One per line: a name, website, careers page URL, or job board link. Force a specific board with `ats:slug`, e.g. `greenhouse:stripe`. Workday companies need their `myworkdayjobs.com` link, or a website that links to it. |
| **Title keywords** | Keep only jobs whose title, department or team contains one of these words. |
| **Exclude title keywords** | Drop jobs whose title contains any of these words. |
| **Locations** | Keep only jobs whose location contains one of these (e.g. `New York`, `United States`, `Remote`). |
| **Remote jobs only** | Keep only remote roles. |
| **Posted within the last N days** | Keep only recent postings. |
| **Only new jobs since the last run** | Return only jobs not seen in earlier runs with the same company list. |
| **Include job descriptions** | Full description as plain text (on by default). Turning it off makes Workday and SmartRecruiters runs faster. |
| **Max jobs per company** | Default 1,000. |

#### Example input

```json
{
  "companies": ["stripe.com", "Ramp", "https://jobs.lever.co/palantir", "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],
  "keywords": ["engineer", "data"],
  "locations": ["United States", "Remote"],
  "onlyNewJobs": true
}
```

### Output

```json
{
  "id": "ashby:openai:240d459b-696d-43eb-8497-fab3e56ecd9b",
  "ats": "ashby",
  "company": "OpenAI",
  "title": "Research Engineer",
  "department": "Research",
  "team": "Research",
  "location": "San Francisco",
  "locations": ["San Francisco"],
  "country": "United States",
  "workplaceType": "hybrid",
  "isRemote": false,
  "employmentType": "Full-time",
  "salaryMin": 250000,
  "salaryMax": 445000,
  "salaryCurrency": "USD",
  "salaryPeriod": "year",
  "salaryText": "$250K - $445K",
  "postedAt": "2025-04-05T00:03:20.653Z",
  "url": "https://jobs.ashbyhq.com/openai/240d459b-696d-43eb-8497-fab3e56ecd9b",
  "applyUrl": "https://jobs.ashbyhq.com/openai/240d459b-696d-43eb-8497-fab3e56ecd9b/application",
  "descriptionText": "…",
  "matchedBy": "url",
  "scrapedAt": "2026-11-03T09:24:42.000Z"
}
```

`matchedBy` tells you how the job board was found: `url` / `explicit` (you gave it), `careers-page` (found on the company website), or `slug-guess` (looked up by name). If a name lookup picks the wrong company, pass the job board link instead.

A `SUMMARY` record in the run's key-value store lists every company with the job board it resolved to, how many jobs were found and kept, and any errors.

### Pricing

You pay per job returned. Filtered-out jobs, and jobs skipped by *Only new jobs*, are free. Set a maximum cost per run in the run options and the Actor stops cleanly when it is reached.

### FAQ

**A company wasn't found.** Some companies host jobs on systems this Actor doesn't support yet, or on their own site. Try the careers page URL; if it embeds a supported board, the Actor will find it.

**Why are some salaries empty?** Not every company publishes pay. Salaries are only returned when the job board or the job description includes them.

**Is this allowed?** The Actor reads the public job board feeds that these systems provide so companies can publish their jobs on their own websites. It doesn't log in or collect any personal data.

# Actor input Schema

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

One per line. Use a company name (Stripe), website (stripe.com), careers page URL, or job board link (https://jobs.lever.co/palantir, https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite). You can also force a board with ats:slug, e.g. greenhouse:stripe. Workday companies need their myworkdayjobs.com link or website.

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

Only keep jobs whose title, department or team contains at least one of these words (e.g. engineer, sales, product manager). Leave empty for all jobs.

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

Drop jobs whose title contains any of these words (e.g. intern, senior).

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

Only keep jobs whose location contains one of these (e.g. New York, United States, London, Remote).

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

Only keep jobs marked remote, or whose location says remote.

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

Only keep jobs posted in the last N days. Leave empty for any date.

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

Remembers jobs from previous runs with the same company list and returns only ones it has not seen before. Schedule the Actor daily to get a feed of newly posted jobs. The first run returns everything.

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

Adds the full description as plain text. Turning this off makes Workday and SmartRecruiters runs much faster.

## `includeDescriptionHtml` (type: `boolean`):

Also return the original description HTML, in addition to plain text.

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

Stop after this many jobs per company job board.

## `discoverFromCareersPage` (type: `boolean`):

When you enter a website, look for job board links on its careers page before guessing.

## Actor input object example

```json
{
  "companies": [
    "stripe.com",
    "https://jobs.lever.co/palantir",
    "https://jobs.ashbyhq.com/openai"
  ],
  "remoteOnly": false,
  "onlyNewJobs": false,
  "includeDescription": true,
  "includeDescriptionHtml": false,
  "maxJobsPerCompany": 1000,
  "discoverFromCareersPage": true
}
```

# Actor output Schema

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

All jobs saved by this run, in the Jobs table view.

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

Each company, the job board it resolved to, job counts and any errors.

# 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 = {
    "companies": [
        "stripe.com",
        "https://jobs.lever.co/palantir",
        "https://jobs.ashbyhq.com/openai"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mytho-labs/ats-jobs-feed").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 = { "companies": [
        "stripe.com",
        "https://jobs.lever.co/palantir",
        "https://jobs.ashbyhq.com/openai",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("mytho-labs/ats-jobs-feed").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 '{
  "companies": [
    "stripe.com",
    "https://jobs.lever.co/palantir",
    "https://jobs.ashbyhq.com/openai"
  ]
}' |
apify call mytho-labs/ats-jobs-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mytho-labs/ats-jobs-feed"
        }
    }
}
```

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/H5js4qQDt30g6hRRB/builds/2LwbtweA633taMWBD/openapi.json
