# Company Jobs Scraper: Greenhouse, Lever, Ashby, Workday & more (`umbrella_data/company-jobs-any-ats`) Actor

Get every open job from any list of companies in one clean format, whatever ATS they use: Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Recruitee, Personio and Breezy. Type a company name, website or careers URL. Salary, remote, new-jobs-only.

- **URL**: https://apify.com/umbrella_data/company-jobs-any-ats.md
- **Developed by:** [Josuar Ochoa](https://apify.com/umbrella_data) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 job delivereds

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 Scraper: Greenhouse, Lever, Ashby, Workday & 6 more ATS in one format

Give it a list of companies and get **every open job they have, in one clean format**, no matter which hiring
system (ATS) each company uses. Type a company **name**, its **website** or its **careers link**, and the scraper
finds its ATS for you.

**Supported ATS:** Greenhouse · Lever · Ashby · Workday · SmartRecruiters · Workable · Recruitee · Personio · Breezy HR · BambooHR

### What you can do with it

- **Sales & lead generation:** find companies that are hiring for a role you sell to (e.g. "data engineer" means
  they are investing in data).
- **Recruiting & job boards:** pull fresh jobs straight from the company's own careers page, with no reposts and
  no expired listings.
- **Market & salary research:** compare departments, locations, remote policy and salary ranges across companies.
- **Job alerts:** schedule it daily with **Only new jobs** and get just what was posted since yesterday.

### Why this one

- **One format for every ATS.** The same fields whether the job comes from Greenhouse or Workday.
- **No ATS hunting.** `stripe.com`, `Hugging Face` or `https://www.figma.com/careers/` all work. It reads the
  company's careers page and follows its ATS link, or tries each ATS by name.
- **Salary, even when it is hidden in the text.** If the ATS has no salary field, it reads pay ranges from the
  description (`$150,000 - $200,000 per year`, `€60.000 a €80.000`, `USD 120k–150k`).
- **Only new jobs.** It remembers what it saw in your previous run (per company) and can return only the new ones.
  Every job also gets an `isNew` flag.
- **Pay only for jobs delivered.** Companies that aren't found, or jobs removed by your filters, cost nothing.
- **Official public job feeds.** It uses the job board feeds that each ATS publishes for companies' career pages.
  No logins and no personal data.

### Input

| Field | What it does |
|---|---|
| **Companies** | One per line: a name (`airbnb`), a website (`stripe.com`), a careers or ATS link, or `ats:slug` (`greenhouse:airbnb`). |
| Keywords | Keep jobs whose title, department or team contains any of these words. |
| Locations | Keep jobs in any of these cities, regions, countries or 2-letter codes (`London`, `Germany`, `US`, `Remote`). |
| Remote jobs only | Keep only remote jobs. |
| Posted within the last N days | For example, `7` for last week's jobs. |
| Only new jobs since my last run | Returns only jobs that weren't there the last time you ran that company. |
| Include job description | Full description as plain text. Turn it off for faster runs. |
| Max jobs per company | `0` means all. |

**Workday by name:** Workday addresses can't be guessed, so a built-in directory of Workday employers is used
(Walmart, Salesforce, NVIDIA, Disney…). If a company isn't in it, paste its Workday link (it looks like
`https://company.wd5.myworkdayjobs.com/SiteName`) or its website. Need Workday keyword search? Use our
[Workday Jobs Scraper](https://apify.com/umbrella_data/workday-jobs-scraper).

### Output (one row per job)

```json
{
  "company": "Notion",
  "companySlug": "notion",
  "ats": "ashby",
  "jobId": "1fc309c8-da20-4ff2-84c7-8b863ece2b0a",
  "title": "Software Engineer, AI Connections (Developer Platform)",
  "department": "Engineering",
  "team": "Engineering",
  "employmentType": "FullTime",
  "seniority": null,
  "locations": ["San Francisco, California", "New York, New York"],
  "city": "San Francisco",
  "region": "California",
  "country": "United States",
  "countryCode": null,
  "remote": true,
  "workplaceType": "hybrid",
  "postedAt": "2026-08-24T14:44:49.699000+00:00",
  "updatedAt": null,
  "url": "https://jobs.ashbyhq.com/notion/1fc309c8-...",
  "applyUrl": "https://jobs.ashbyhq.com/notion/1fc309c8-.../application",
  "salary": { "min": 150000, "max": 200000, "currency": "USD", "interval": "year", "text": "$150,000 - $200,000", "source": "description" },
  "description": "About the role ...",
  "isNew": true,
  "input": "notion",
  "scrapedAt": "2026-10-28T02:30:00+00:00"
}
```

Fields that an ATS doesn't provide are `null`. `salary.source` is `"description"` when the range was read from
the job text, and is missing when it came from the ATS itself.

A **SUMMARY** record in the run's key-value store lists every company: the ATS found, how many jobs it has, how
many were delivered, and which inputs weren't found.

### Pricing

Pay per job delivered. See the **Pricing** tab for the current price. Nothing is charged for companies that
aren't found or for jobs removed by your filters.

### FAQ

**A company wasn't found.** Try its website or the link to its careers page. If its ATS isn't in the list above,
it isn't supported yet. Open an issue with the company name and we'll look at adding it.

**How fresh is the data?** It's read live from the company's ATS at run time. There's no stored database.

**Can I schedule it?** Yes. Use Apify Schedules with **Only new jobs** turned on to get daily alerts.

**Is it legal?** It reads the public job board feeds that companies publish so that anyone can see their open jobs.
It uses no login and collects no personal data.

# Actor input Schema

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

One per line. Any of: a company name (Airbnb, Walmart), its website (stripe.com), its careers page or ATS link (https://jobs.lever.co/palantir, https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite), or ats:slug (greenhouse:airbnb). The ATS is detected automatically; Workday companies are found by name through a built-in directory.

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

Keep only jobs whose title, department or team contains any of these words (e.g. engineer, sales, data).

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

Keep only jobs in any of these places: city, region, country name or 2-letter code (e.g. London, Germany, US, Remote).

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

Keep only jobs marked as remote.

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

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

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

Perfect for daily schedules: returns (and charges) only jobs that were not there the previous time you ran this company. Every job also gets an isNew field.

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

Full description as plain text. Turn off for faster runs (Workday and SmartRecruiters need one extra request per job).

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

0 = all open jobs.

## Actor input object example

```json
{
  "companies": [
    "airbnb",
    "https://jobs.lever.co/palantir",
    "notion",
    "stripe.com"
  ],
  "remoteOnly": false,
  "postedWithinDays": 0,
  "onlyNewJobs": false,
  "includeDescription": true,
  "maxJobsPerCompany": 0
}
```

# Actor output Schema

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

One row per open job, same fields for every ATS.

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

ATS found, jobs found and delivered per company, and inputs that were not found.

# 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": [
        "airbnb",
        "https://jobs.lever.co/palantir",
        "notion",
        "stripe.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("umbrella_data/company-jobs-any-ats").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": [
        "airbnb",
        "https://jobs.lever.co/palantir",
        "notion",
        "stripe.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("umbrella_data/company-jobs-any-ats").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": [
    "airbnb",
    "https://jobs.lever.co/palantir",
    "notion",
    "stripe.com"
  ]
}' |
apify call umbrella_data/company-jobs-any-ats --silent --output-dataset

```

## MCP server setup

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

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/Vy1hTwOMBrH6uYQdh/builds/9qHC0XJo3cRKFYVWN/openapi.json
