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

Normalised jobs straight from company career sites on Greenhouse, Lever, Ashby, Workday, Workable, Recruitee, Personio and PageUp (AU). Salary, location, remote flag, descriptions. Monitor mode for new jobs. $0.80 per 1,000 jobs.

- **URL**: https://apify.com/clearscrape/ats-company-jobs-feed.md
- **Developed by:** [ClearScrape](https://apify.com/clearscrape) (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 $0.80 / 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

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

Get **every open job straight from company career sites**, normalised into one clean format. Supports **Greenhouse, Lever, Ashby, Workday, Workable, Recruitee, Personio and PageUp** (popular with Australian universities, councils and enterprises). Paste career-page URLs or slugs, get titles, locations, remote/hybrid flags, salary ranges, posting dates and full descriptions. **$0.80 per 1,000 jobs.** Failed or empty career sites cost nothing.

### What it does

Most companies publish their jobs through an applicant tracking system (ATS). Each ATS has its own public job-board feed, built so job boards and career widgets can list the jobs. This Actor reads those official feeds and maps them all to **one schema**, so you can mix 8 ATSs in one run.

- **8 ATSs in one Actor:** Greenhouse (incl. EU), Lever (incl. EU), Ashby, Workday (myworkdayjobs.com and myworkdaysite.com), Workable, Recruitee, Personio, PageUp.
- **Flexible input:** career URLs, `ats:slug` pairs, or bare slugs like `airbnb`, which are auto-detected across Greenhouse, Lever, Ashby, Workable and Recruitee.
- **Normalised fields:** company, title, department, team, employment type, workplace type (remote / hybrid / onsite), location(s), city, region, country, posted / updated / closing dates (ISO UTC), salary min / max / currency / period where the ATS publishes it (Ashby, Lever, Recruitee), job and apply URLs.
- **Descriptions:** clean plain text (LLM-ready), original HTML, or both.
- **Filters:** title keywords, excluded words, location, department, remote-only, posted within N days, per-company and total caps.
- **Monitor mode:** remembers job IDs between runs and outputs **only new jobs**. Schedule it daily for a "new jobs" feed and pay only for what's new.
- **Reliable:** retries with backoff, automatic proxy fallback, per-company error isolation (one broken career site never kills the run). Failures are listed in `RUN_STATS`.

### Use cases

- **Job boards and aggregators:** fill a niche board (e.g. AI startups, Australian universities, climate tech) directly from employers.
- **Sales intelligence / "who is hiring":** hiring signals for target accounts. A company hiring 5 data engineers is a lead.
- **Recruiters and talent teams:** track competitors' openings and salary ranges.
- **Market research:** hiring trends by role, location or remote share.
- **AI agents and RAG:** clean plain-text descriptions ready for embedding.

### How to find a company's career site

Open the company's careers page and click a job. The address bar tells you the ATS:

| ATS | URL looks like | Input example |
|---|---|---|
| Greenhouse | `boards.greenhouse.io/airbnb` or `job-boards.greenhouse.io/airbnb` | `greenhouse:airbnb` |
| Lever | `jobs.lever.co/palantir` | `lever:palantir` |
| Ashby | `jobs.ashbyhq.com/ramp` | `ashby:ramp` |
| Workday | `nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite` | paste the full URL |
| Workable | `apply.workable.com/huggingface` | `workable:huggingface` |
| Recruitee | `bunq.recruitee.com` | `recruitee:bunq` |
| Personio | `personio.jobs.personio.de` | `personio:personio` |
| PageUp | `careers.pageuppeople.com/513/cw/en/listing` | `pageup:513` |

If a company embeds the board on its own domain, view the page source or click "Apply"; the ATS URL usually shows up there.

### Input example

```json
{
  "companies": [
    "https://boards.greenhouse.io/airbnb",
    "lever:palantir",
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    "pageup:513"
  ],
  "titleKeywords": ["engineer", "data"],
  "locationKeywords": ["australia", "remote"],
  "postedWithinDays": 30,
  "descriptionFormat": "text"
}
```

### Output example

```json
{
  "jobKey": "ashby:ramp:34413f8d-26bf-4bbc-8ade-eb309a0e2245",
  "ats": "ashby",
  "company": "ramp",
  "companyName": "ramp",
  "title": "Security Engineer, Cloud",
  "department": "Engineering",
  "team": "Backend",
  "employmentType": "FullTime",
  "workplaceType": "hybrid",
  "location": "New York, NY (HQ)",
  "locations": ["New York, NY (HQ)"],
  "city": "New York City",
  "region": "NY",
  "country": "USA",
  "postedAt": "2026-04-07T17:12:35Z",
  "salaryMin": 211400,
  "salaryMax": 290600,
  "salaryCurrency": "USD",
  "salaryPeriod": "year",
  "salaryText": "$211.4K – $290.6K • Offers Equity",
  "url": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245",
  "applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application",
  "descriptionText": "About Ramp\nRamp is ...",
  "scrapedAt": "2026-10-18T04:40:00Z"
}
```

Fields an ATS doesn't publish are `null`, so every row has the same columns.

### Pricing (pay per event)

- **$0.80 per 1,000 jobs** saved (after your filters; in monitor mode only new jobs).
- Career sites that fail or have no jobs are free. There is no per-company or per-request fee.
- Use **Max jobs in total** or the run's max-charge setting to cap spend.

### FAQ

**Why no SmartRecruiters?** This Actor only reads feeds whose robots.txt allows automated access. SmartRecruiters' API robots.txt disallows crawlers, so SmartRecruiters inputs are rejected before any charge.

**Is this legal?** The Actor only reads public job postings from the feeds ATS vendors publish for job boards and career widgets. No logins, no personal data. Jobs are meant to be distributed. Still, respect each employer's terms if you republish.

**Which fields are always present?** Title, URL, company, ATS and job ID. Location, dates and descriptions are present for almost all jobs. Salary only where the employer publishes it.

**Workday is slower?** Workday lists 20 jobs per request and needs one extra request per job for the description. Turn off descriptions for a fast listing-only run.

**What about JobAdder, Employment Hero, iCIMS, Taleo, SuccessFactors?** They don't offer a public per-company feed without employer credentials, so they're not supported (yet). Ask in Issues if you need one.

**Do I need a proxy?** No. These are public APIs. If a site rate-limits, the Actor switches to Apify datacenter proxy automatically.

### Daily health check

The Actor ships with a self-test input (Greenhouse + Ashby) that Apify runs daily. Breaking feed changes are caught early.

### Legal and fair-use notes

Data comes from official public job-board endpoints. Use it in line with the employers' and ATS vendors' terms. Do not use job data to spam applicants or employers.

# Actor input Schema

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

One per line. Accepts career-site URLs (e.g. https://boards.greenhouse.io/airbnb, https://jobs.lever.co/palantir, https://jobs.ashbyhq.com/ramp, https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite, https://careers.pageuppeople.com/513/cw/en/listing), 'ats:slug' pairs (greenhouse:airbnb, lever:palantir, lever-eu:slug, ashby:ramp, workable:huggingface, recruitee:bunq, personio:slug, pageup:513) or bare slugs, which are auto-detected.

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

Adds the full job description. For Workday this needs one extra request per job (slower); for the other ATSs it is free.

## `descriptionFormat` (type: `string`):

Plain text (clean, LLM-ready), the original HTML, or both.

## `titleKeywords` (type: `array`):

Keep only jobs whose title contains at least one of these words (case-insensitive), e.g. engineer, sales.

## `excludeTitleKeywords` (type: `array`):

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

## `locationKeywords` (type: `array`):

Keep jobs whose location, city or country contains any of these (e.g. Sydney, Australia, AU, Remote).

## `departmentKeywords` (type: `array`):

Keep jobs whose department or team contains any of these words.

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

Keep only jobs marked remote by the ATS (or with 'remote' in the location).

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

Only jobs first published in the last N days. 0 = any age. Jobs without a date are kept.

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

Remember job IDs between runs and output only jobs not seen before. Schedule the Actor daily to get a feed of new postings. You only pay for new jobs.

## `monitorStoreName` (type: `string`):

Named key-value store that remembers seen jobs. Use different names for different feeds.

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

0 = all jobs.

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

Stop after this many jobs across all companies. 0 = no limit.

## `autoDetectAts` (type: `boolean`):

For inputs like 'airbnb', try Greenhouse, Lever, Ashby, Workable and Recruitee and use the first board that has jobs.

## `maxConcurrency` (type: `integer`):

Parallel requests.

## `maxRetries` (type: `integer`):

Retries per request on network errors, rate limits or server errors (with backoff).

## `proxyConfiguration` (type: `object`):

Not needed: these are public job-board APIs. If a career site rate-limits, the Actor switches to Apify datacenter proxy automatically.

## Actor input object example

```json
{
  "companies": [
    "https://boards.greenhouse.io/airbnb",
    "lever:palantir",
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "includeDescription": true,
  "descriptionFormat": "text",
  "remoteOnly": false,
  "postedWithinDays": 0,
  "onlyNewJobs": false,
  "monitorStoreName": "ats-jobs-feed-monitor",
  "maxJobsPerCompany": 0,
  "maxResults": 0,
  "autoDetectAts": true,
  "maxConcurrency": 8,
  "maxRetries": 4,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per job: company, title, location, workplace type, salary, dates, links.

## `fullRecords` (type: `string`):

Every normalised field including descriptions.

## `runStats` (type: `string`):

RUN_STATS record: requests, retries, jobs per company and any failed career sites.

# 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": [
        "greenhouse:airbnb",
        "https://jobs.ashbyhq.com/ramp"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("clearscrape/ats-company-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": [
        "greenhouse:airbnb",
        "https://jobs.ashbyhq.com/ramp",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("clearscrape/ats-company-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": [
    "greenhouse:airbnb",
    "https://jobs.ashbyhq.com/ramp"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call clearscrape/ats-company-jobs-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,clearscrape/ats-company-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/8xyl2R5o9ArRqzVcK/builds/FSwZIM6ulT05FodzH/openapi.json
