# Career Site Jobs Scraper: Greenhouse, Lever, Workday (`senshiesr/career-site-jobs-scraper`) Actor

Get every open job from any company's career site. Paste career page URLs, domains or names; the Actor detects Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable or Recruitee and returns clean, normalized jobs. Monitor mode outputs only new jobs.

- **URL**: https://apify.com/senshiesr/career-site-jobs-scraper.md
- **Developed by:** [Ahmed Ewis](https://apify.com/senshiesr) (community)
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 jobs

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Jobs Scraper: Greenhouse, Lever, Ashby, Workday & more

Get **every open job from any company's career site** as clean, structured data. Paste a list of companies (career page URLs, website domains or just names) and the Actor finds their job board automatically, then returns all jobs in one consistent format, no matter which hiring platform each company uses.

Use **monitoring mode** to run it on a schedule and get **only new job postings** since the last run.

### Supported job platforms

| Platform | Example input |
|---|---|
| **Greenhouse** | `https://boards.greenhouse.io/stripe` |
| **Lever** | `https://jobs.lever.co/palantir` |
| **Ashby** | `https://jobs.ashbyhq.com/ramp` |
| **Workday** | `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite` |
| **SmartRecruiters** | `https://jobs.smartrecruiters.com/Ubisoft2` |
| **Workable** | `https://apply.workable.com/huggingface` |
| **Recruitee** | `https://bunq.recruitee.com` |

Don't know which platform a company uses? Just enter **`notion.com`** or **`Hugging Face`**: the Actor checks the company's website and the platforms above and finds the board for you.

### Why this Actor

- **One format for every platform.** Same fields for every job: title, location, remote/hybrid, department, employment type, posting date, salary (when published) and the full description as HTML and plain text.
- **Complete results from large Workday sites.** Workday never shows more than 2,000 jobs per search, and its ordering shifts between pages, so simple scrapers silently miss jobs. This Actor splits large searches and re-checks pages until it has every job the site reports, e.g. all ~2,700 NVIDIA jobs instead of 2,000.
- **Pay only for new jobs.** In monitoring mode, the Actor remembers what it already delivered, so daily runs only output (and charge for) new postings.
- **Fast and reliable.** Uses each platform's public job board feed instead of loading web pages, so no browsers, no proxies and no CAPTCHAs. Hundreds of companies per run.
- **Filters built in:** title keywords, excluded keywords, locations, remote only, posted within N days, max jobs per company.

### Use cases

- **Job boards & aggregators:** fill your board with fresh jobs straight from company career sites.
- **Recruiters & agencies:** track when target companies open roles you can fill.
- **Sales teams:** hiring is a buying signal. Get alerted when prospects hire for roles related to your product.
- **Job seekers:** watch your dream companies and get new matching roles every morning.
- **Market research:** analyze hiring trends by company, team, location or salary.

### Input

```json
{
    "companies": [
        "https://boards.greenhouse.io/stripe",
        "https://jobs.ashbyhq.com/ramp",
        "notion.com",
        "Hugging Face"
    ],
    "titleKeywords": ["engineer", "QA"],
    "excludeTitleKeywords": ["intern"],
    "locations": ["New York", "remote"],
    "postedWithinDays": 7,
    "includeDescription": true,
    "onlyNewJobs": false
}
```

Only `companies` is required. You can also use the shorthand `greenhouse:stripe`, `lever:palantir`, `ashby:ramp` and so on.

### Output

Each job is one item in the dataset. You can download it as JSON, CSV, Excel or HTML, or get it through the API.

```json
{
    "id": "ashby:ramp:96250bac-465c-4524-bc7c-ba0f0b05310f",
    "ats": "ashby",
    "company": "Ramp",
    "companySlug": "ramp",
    "title": "Senior Manager, Account Manager, Enterprise",
    "url": "https://jobs.ashbyhq.com/ramp/96250bac-465c-4524-bc7c-ba0f0b05310f",
    "applyUrl": "https://jobs.ashbyhq.com/ramp/96250bac-465c-4524-bc7c-ba0f0b05310f/application",
    "location": "New York, NY (HQ)",
    "locations": ["New York, NY (HQ)"],
    "country": "USA",
    "isRemote": true,
    "workplaceType": "hybrid",
    "department": "Sales",
    "team": null,
    "employmentType": "FullTime",
    "postedAt": "2026-10-15T21:33:08.330Z",
    "updatedAt": null,
    "salary": { "min": 315000, "max": 415000, "currency": "USD", "period": "1 YEAR", "text": "$315K - $415K" },
    "descriptionHtml": "<h1><strong>About Ramp</strong></h1>…",
    "descriptionText": "ABOUT RAMP\n\nRamp is building the smart infrastructure for finance teams…",
    "input": "https://jobs.ashbyhq.com/ramp",
    "scrapedAt": "2026-10-16T15:20:11.482Z"
}
```

`isRemote` is `true` when the job can be done remotely from at least one of its locations. Fields a platform doesn't publish are `null`. For example, salary is only available where the company publishes it (common on Ashby, Lever and Recruitee).

A run summary (`SUMMARY` in the run's key-value store) lists every input with the platform it was matched to, how many jobs the board has and how many were output, so you can see at a glance if a company wasn't found.

### Monitoring new jobs (scheduled runs)

1. Turn on **Only new jobs since the last run**.
2. Save the input as a task and add a **schedule** (e.g. every morning).
3. Connect an integration (email, Slack, Google Sheets, Zapier, Make, webhook) to receive new jobs.

The first run outputs all current jobs; every later run outputs only jobs that weren't delivered before. If you monitor separate company lists (for example, one per client), give each task its own **Monitoring name** so their histories stay separate.

### Pricing

You pay per job delivered, plus a small fee per run. Filters are applied before charging, so you never pay for jobs you filtered out, and in monitoring mode you only pay for new jobs. You can set a maximum cost per run, and the Actor stops cleanly when it reaches it.

### FAQ

**A company wasn't found. What can I do?**
Paste the URL of its job board (the page that lists all its jobs) instead of the homepage. If the company uses a platform not listed above, it isn't supported yet. Feel free to request it in the Issues tab.

**Is this legal?**
The Actor only reads job listings that companies publish publicly for job seekers, through the platforms' public job board feeds. It doesn't log in, and it doesn't collect personal data about candidates or employees.

**Can I get jobs from thousands of companies?**
Yes. Companies are processed in parallel, and a typical board takes 1–3 seconds. Very large Workday sites (thousands of jobs) take about a minute.

**Found a bug or need a field?** Open an issue in the Issues tab.

### More from the same developer

- **[Bilibili Scraper](https://apify.com/senshiesr/bilibili-scraper)**: videos, creators, trending lists, comments and danmaku from Bilibili (哔哩哔哩), with clean English fields.
- **[Google Hotels Scraper](https://apify.com/senshiesr/google-hotels-scraper)**: hotel prices for any city and dates, prices from every booking site, room offers, ratings and reviews.

# Actor input Schema

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

One company per line. Paste a job board URL (Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Recruitee), the company's own careers page, its website domain (e.g. stripe.com) or just its name. The Actor detects the job platform automatically. You can also use the shorthand ats:slug, e.g. greenhouse:stripe.

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

Adds the full description as HTML and plain text. Turn off for faster runs if you only need titles, locations and links.

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

Only output jobs whose title contains at least one of these words, case-insensitive. Example: engineer, QA, data. Leave empty for all jobs.

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

Skip jobs whose title contains any of these words. Example: intern, senior director.

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

Only output jobs whose location or country contains one of these, e.g. London, Germany, US. Add "remote" to also keep remote jobs.

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

Only output jobs the company marks as remote.

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

Only output jobs published in the last N days. Jobs without a publish date are kept.

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

Limit how many jobs are output per company (newest first). Leave empty for no limit.

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

For scheduled monitoring. Remembers which jobs it already gave you and only outputs new ones, so you only pay for new postings. The first run outputs everything.

## `monitoringName` (type: `string`):

Use a different name for each separate monitoring setup (e.g. one per client) so they keep separate history.

## Actor input object example

```json
{
  "companies": [
    "https://boards.greenhouse.io/stripe",
    "https://jobs.lever.co/palantir",
    "https://jobs.ashbyhq.com/ramp",
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "includeDescription": true,
  "remoteOnly": false,
  "onlyNewJobs": false,
  "monitoringName": "default"
}
```

# Actor output Schema

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

All jobs output by this run, one item per job, in the same format for every platform.

## `jobsFull` (type: `string`):

The same jobs with every field, including the HTML and plain-text descriptions.

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

One entry per input company: detected platform and board, jobs on the board, jobs output, and status (ok, not-found, error, skipped-budget).

# 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": [
        "https://boards.greenhouse.io/stripe",
        "https://jobs.lever.co/palantir",
        "https://jobs.ashbyhq.com/ramp",
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("senshiesr/career-site-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 = { "companies": [
        "https://boards.greenhouse.io/stripe",
        "https://jobs.lever.co/palantir",
        "https://jobs.ashbyhq.com/ramp",
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("senshiesr/career-site-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 '{
  "companies": [
    "https://boards.greenhouse.io/stripe",
    "https://jobs.lever.co/palantir",
    "https://jobs.ashbyhq.com/ramp",
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ]
}' |
apify call senshiesr/career-site-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,senshiesr/career-site-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/5wiYQsH97WIIxKEf1/builds/otnx6y7m2gfpxUpTo/openapi.json
