# Career Site & ATS Jobs Scraper — Workday, Greenhouse, Lever (`openclawai/career-site-ats-jobs-scraper`) Actor

Paste a company's careers URL or just its name and get every open job as JSON: title, location, remote flag, salary, department, posted date, apply link, full description. Auto-detects Workday, Greenhouse, Lever, Ashby, SmartRecruiters, SuccessFactors, iCIMS, Workable and 60+ more. No login.

- **URL**: https://apify.com/openclawai/career-site-ats-jobs-scraper.md
- **Developed by:** [Pika Choo](https://apify.com/openclawai) (community)
- **Categories:** Jobs, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Career Site & ATS Jobs Scraper — Workday, Greenhouse, Lever, Ashby & 60+ More

**Paste a company's careers page URL, or just its name, and get every open job as clean JSON. $5 per 1,000 jobs, full descriptions included, no login, no API key.** The Actor detects which applicant tracking system (ATS) the company uses — **Workday, Greenhouse, Lever, Ashby, SmartRecruiters, SuccessFactors, iCIMS, Taleo, Oracle, Phenom, Eightfold, Personio, Teamtailor, Workable, Recruitee, BambooHR, Jobvite, Breezy** and dozens more — and reads the jobs straight from the source. Direct-from-employer data: no job-board delay, no reposts, no scraped aggregator noise.

### Why this careers page scraper

- 🎯 **Source of truth.** Jobs come from the company's own ATS feed the moment they go live, with the real apply link and requisition ID.
- 🧭 **Zero configuration.** Paste `https://boards.greenhouse.io/stripe`, `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite` or simply `Stripe`. The ATS is detected automatically.
- 🏢 **Workday and SuccessFactors included.** Most job scrapers stop at Greenhouse and Lever. This one covers the enterprise systems large employers actually use.
- 💰 **One flat price.** $5/1K jobs with the full Markdown description, salary, department and posted date included. No start fee, no "detail" upcharge. Hint and error rows are free.
- 🗂️ **Typed, normalised rows.** Same schema for every ATS, so 50 companies land in one clean table.
- 🔓 **No login, no cookies.** Public careers pages only.

### Who uses this

- **Recruiters and sourcing teams** tracking openings at target companies daily.
- **Sales and go-to-market teams** using hiring as an intent signal ("they just opened 12 SDR roles").
- **Job boards and aggregators** ingesting direct-from-employer listings with apply links.
- **Market and labour researchers** measuring hiring velocity, salary bands and remote share across companies.
- **Job seekers and career coaches** watching a shortlist of dream employers.
- **AI agents** answering "what engineering jobs is Company X hiring for in London right now?".

### What you can do with it

| Goal | How | Cost |
|---|---|---|
| Every open job at a company | careers URL or name in `queries` | $5 per 1K jobs |
| Only engineering roles | `keywords: ["engineer", "developer"]` | pay only for kept jobs |
| Only jobs in a city or country | `locations: ["London", "United Kingdom"]` | pay only for kept jobs |
| Remote roles only | `remoteOnly: true` | pay only for kept jobs |
| Track 50 companies daily | 50 lines in `queries` + a schedule | same rate |
| Lighter rows without description | `includeDescription: false` | same rate |

### Input

```json
{
    "queries": ["https://boards.greenhouse.io/stripe", "https://jobs.ashbyhq.com/openai", "NVIDIA"],
    "keywords": ["engineer"],
    "locations": [],
    "remoteOnly": false,
    "maxJobsPerCompany": 500,
    "includeDescription": true
}
```

| Field | Type | Default | What it does |
|---|---|---|---|
| `queries` | array | — | Careers page URLs or company names, one per line. |
| `keywords` | array | `[]` | Keep jobs whose title contains any of these words (case-insensitive). |
| `locations` | array | `[]` | Keep jobs whose location contains any of these. |
| `remoteOnly` | boolean | `false` | Keep only remote-flagged jobs. |
| `maxJobsPerCompany` | integer | `500` | Cap per company after filters, 1–10000. |
| `includeDescription` | boolean | `true` | Include the full description as Markdown. |

**Which URL to paste?** The page on the ATS domain works best: `boards.greenhouse.io/<company>`, `jobs.lever.co/<company>`, `jobs.ashbyhq.com/<company>`, `<company>.wd5.myworkdayjobs.com/<site>`, `careers.smartrecruiters.com/<company>`, `<company>.teamtailor.com`, `apply.workable.com/<company>`, `<company>.recruitee.com`. A company's own domain (`jobs.example.com`) is resolved through the directory when the company is tracked; otherwise you get a free hint row telling you what to paste.

### What you get

One row per job. Hint and error rows are free.

| Field | Description |
|---|---|
| `job_id`, `requisition_id` | Stable ID (`greenhouse:8044460`) and the site's own requisition number. |
| `company`, `ats`, `careers_url` | Who, which system, where it was read from. |
| `title`, `location`, `is_remote`, `country_iso`, `region` | The essentials. |
| `employment_type`, `department`, `team`, `experience` | Role metadata when the site exposes it. |
| `salary_min`, `salary_max`, `salary_currency`, `salary_period`, `salary_summary` | Pay when listed (Ashby and many US postings include it). |
| `posted_at`, `application_deadline` | Dates when available. |
| `url`, `apply_url` | Detail page and application link. |
| `description` | Full job description as Markdown. |
| `source_query`, `scraped_at` | Provenance. |

#### Sample JSON output

```json
{
    "item_type": "job",
    "job_id": "ashby:5c1c5b2e-…",
    "company": "openai",
    "title": "Software Engineer, RL Training Infra",
    "location": "San Francisco",
    "is_remote": true,
    "url": "https://jobs.ashbyhq.com/openai/5c1c5b2e-…",
    "apply_url": "https://jobs.ashbyhq.com/openai/5c1c5b2e-…/application",
    "posted_at": "2026-05-23T02:00:50+00:00",
    "employment_type": "FULL_TIME",
    "department": "Engineering",
    "salary_min": 295000,
    "salary_max": 500000,
    "salary_currency": "USD",
    "salary_period": "YEAR",
    "salary_summary": "$295K – $500K • Offers Equity",
    "ats": "ashby",
    "description": "## About the team\n\n…",
    "careers_url": "https://jobs.ashbyhq.com/openai",
    "source_query": "https://jobs.ashbyhq.com/openai",
    "scraped_at": "2026-09-06T14:04:58Z"
}
```

### Pricing: how much does it cost to scrape 1,000 jobs?

**$5.** One event, `job`, at $0.005 per job row, description included. Filters are applied before charging, so `keywords: ["engineer"]` on a 600-job company costs you only the engineering rows. No start fee, no minimum.

### Use cases

- **Daily hiring monitor**: schedule the Actor on a list of competitors and diff `job_id`s to catch new roles the day they open.
- **Intent-based prospecting**: companies opening sales, RevOps or security roles are buying tools in those areas next quarter.
- **Salary benchmarking**: collect `salary_min` / `salary_max` across Ashby- and Greenhouse-hosted companies for a role family.
- **Remote-work research**: `remoteOnly: true` across 100 companies gives the remote share per employer.
- **Job-board seeding**: direct employer listings with apply links, refreshed hourly.

### Use with AI agents and MCP

Add this Actor as a tool in Claude, ChatGPT, Cursor or any MCP client through the Apify MCP server. Ask "what data engineering roles is Stripe hiring for in Europe?" and the agent fills `queries`, `keywords` and `locations` for you.

### Integrations

Runs on a schedule, exports to CSV, Excel, JSON or XML, and connects to Google Sheets, Airtable, Slack, Zapier, Make, n8n and webhooks through the Apify platform. Call it from Python, JavaScript or plain HTTP with the Apify API.

### FAQ

#### Which applicant tracking systems are supported?

Workday, Greenhouse, Lever, Ashby, SmartRecruiters, SuccessFactors, iCIMS, Taleo, Oracle, Phenom, Eightfold, Personio, Teamtailor, Workable, Recruitee, BambooHR, Jobvite, Breezy, JazzHR, Pinpoint, Rippling, Gem, Dayforce, UKG, Paycom, Paylocity, Avature, Cornerstone, PageUp, Softgarden, Join, Keka, Darwinbox, Gupy and several country-specific boards, plus the career sites of Amazon, Apple, Google, Meta, TikTok, Uber and Tesla.

#### The company's careers page is on its own domain. What do I paste?

Try the company name first. Tracked companies resolve automatically to the right ATS. If that fails, open the careers page, click any job, and copy the URL of the job board itself (it usually reveals the ATS domain, e.g. `myworkdayjobs.com` or `greenhouse.io`).

#### Why did I get a hint row instead of jobs?

Either the site is not recognised (the hint tells you what to paste), the company currently lists zero open jobs, or your `keywords` / `locations` filters removed everything. Hint rows are never charged.

#### How fast is it?

Companies are scraped four at a time. Greenhouse, Lever and Ashby return hundreds of jobs in about a second, a 1,000-job SuccessFactors site takes a few seconds, and a large Workday tenant (2,000+ jobs with full descriptions) takes about two minutes because Workday serves 20 jobs per page.

#### Can I export to CSV or Excel?

Yes. Every dataset can be downloaded as CSV, Excel, JSON or XML from the run page or the API.

### Is it legal to scrape careers pages?

Careers pages are published so that anyone can read and apply to the jobs. This Actor reads that public data only, stores no personal information and respects the sites' pagination. You are responsible for using the output in line with applicable law and platform terms.

# Actor input Schema

## `queries` (type: `array`):

One per line. Accepts a careers page URL ('https://boards.greenhouse.io/stripe', 'https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite', 'https://jobs.ashbyhq.com/openai') or just a company name ('Stripe'). URLs on the ATS domain are the most reliable; names are looked up in a directory of tracked companies.

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

Keep only jobs whose title contains at least one of these words, e.g. 'engineer', 'sales'. Case-insensitive. Leave empty for all jobs.

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

Keep only jobs whose location contains at least one of these, e.g. 'London', 'Remote', 'United States'. Leave empty for all locations.

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

Keep only jobs flagged remote or with 'remote' in the location or title.

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

Cap on jobs returned per company after filters (1–10000).

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

On (default): each row carries the full description as Markdown. Off: lighter rows without description text. Same price either way.

## Actor input object example

```json
{
  "queries": [
    "https://boards.greenhouse.io/stripe",
    "https://jobs.ashbyhq.com/openai",
    "NVIDIA"
  ],
  "keywords": [],
  "locations": [],
  "remoteOnly": false,
  "maxJobsPerCompany": 500,
  "includeDescription": true
}
```

# Actor output Schema

## `results` (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 = {
    "queries": [
        "https://boards.greenhouse.io/stripe",
        "https://jobs.ashbyhq.com/openai",
        "NVIDIA"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("openclawai/career-site-ats-jobs-scraper").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 = { "queries": [
        "https://boards.greenhouse.io/stripe",
        "https://jobs.ashbyhq.com/openai",
        "NVIDIA",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("openclawai/career-site-ats-jobs-scraper").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 '{
  "queries": [
    "https://boards.greenhouse.io/stripe",
    "https://jobs.ashbyhq.com/openai",
    "NVIDIA"
  ]
}' |
apify call openclawai/career-site-ats-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,openclawai/career-site-ats-jobs-scraper"
        }
    }
}

```

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/YG06egOljbG9uQXaU/builds/u04eFZHNFe38gPbnz/openapi.json
