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

Every open job of any company from its own careers site: Greenhouse, Lever, Ashby, Workday and SmartRecruiters, detected from a name, domain or link. Title, location, remote, contract, salary when published, date, full description and apply link. Pay per job.

- **URL**: https://apify.com/alaathr/career-site-jobs-scraper.md
- **Developed by:** [Alaa Tahir](https://apify.com/alaathr) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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?

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

Get **every open job of any company straight from its own careers site**: the job boards companies run on **Greenhouse, Lever, Ashby, Workday and SmartRecruiters**. Type a company name, a domain or paste a link: the hiring system is **detected automatically**.

Each job comes with its **title, department, location, remote flag, contract type, salary range when the company publishes it, posting date, full description and apply link**. Fresh data, read from the source the moment you run it, not from a weekly database. You **pay per job delivered**.

### What you get for each job

| Group | Fields |
| --- | --- |
| Job | Company, title, department, team, job ID, requisition number |
| Place | Main location, every location, country, workplace type (remote, hybrid, on-site), remote flag |
| Contract | Employment type (full-time, part-time, contract, internship), experience level when published |
| Pay | Minimum, maximum, currency and period of the salary range, and the range as written, when the company publishes it (structured on Lever and Ashby, read from the description elsewhere) |
| Dates | Posting date, last update (Greenhouse) |
| Text and links | Full description as plain text, job page, apply link |

### Supported hiring systems

| System | What to enter | Example |
| --- | --- | --- |
| Greenhouse | Name, domain or board link | `gitlab`, `https://boards.greenhouse.io/figma` |
| Lever (US and EU) | Name, domain or board link | `https://jobs.lever.co/spotify` |
| Ashby | Name, domain or board link | `notion.com`, `https://jobs.ashbyhq.com/ramp` |
| SmartRecruiters | Company ID or board link | `https://jobs.smartrecruiters.com/BoschGroup` |
| Workday | The careers site link | `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite` |

You can also paste a company's own careers page (`https://www.figma.com/careers/`): the Actor finds the job board linked from it.

### Use cases

- **Job seekers and job boards**: collect every opening of your target companies, filtered by title, location, remote and date.
- **Recruiting and staffing agencies**: spot which companies are hiring for the roles you place, and how fast.
- **Sales intelligence**: hiring for a team is a buying signal; track new roles at your accounts every week.
- **Market and salary research**: compare published pay ranges, locations and remote policies across companies.
- **AI agents and RAG**: feed clean, structured job descriptions to your models.

### How to use it

1. Enter one or more **companies**, one per line: a name, a domain or a link.
2. Optionally filter by **words in the job title**, **location**, **remote jobs only** and **posted in the last N days**.
3. Set **Max jobs per company** (0 for all) and untick **Include the job description** if you only need titles and locations.
4. Click **Start**, then download the results as JSON, CSV or Excel, or read them through the API.

A name is tried on Greenhouse, Lever, Ashby and SmartRecruiters in that order (`Scale AI` tries `scaleai`, `scale-ai` and `scale`). If it does not find the right board, paste its link instead.

### Input example

```json
{
  "companies": ["gitlab", "notion.com", "https://jobs.lever.co/spotify", "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],
  "titleKeywords": ["engineer", "developer"],
  "locations": ["remote", "united states"],
  "postedWithinDays": 30,
  "maxJobsPerCompany": 200,
  "includeDescription": true
}
```

### Output example

```json
{
  "query": "gitlab",
  "company": "GitLab",
  "ats": "greenhouse",
  "board": "gitlab",
  "jobId": "8638232002",
  "title": "AI Transformation Owner, CRO",
  "department": "Enablement",
  "team": null,
  "location": "Remote, United States",
  "locations": ["Remote, United States"],
  "country": null,
  "workplaceType": null,
  "remote": true,
  "employmentType": null,
  "experienceLevel": null,
  "salaryMin": 139200,
  "salaryMax": 235200,
  "salaryCurrency": "USD",
  "salaryPeriod": "year",
  "salaryText": "$139,200—$235,200 USD",
  "postedAt": "2026-07-22T17:38:40Z",
  "updatedAt": "2026-10-28T16:23:39Z",
  "url": "https://job-boards.greenhouse.io/gitlab/jobs/8638232002",
  "applyUrl": "https://job-boards.greenhouse.io/gitlab/jobs/8638232002",
  "requisitionId": "6682",
  "description": "GitLab is the intelligent orchestration platform for DevSecOps...",
  "scrapedAt": "2026-11-03T09:30:00Z"
}
```

### Pricing

**$1.00 per 1,000 jobs** (pay per event). Companies that cannot be found, or whose jobs do not match your filters, come back with an `error` field and are **not charged**. Set "Max jobs per company" and a maximum cost per run in the run options to keep full control.

#### How much does it cost to scrape company job boards?

| Run | Cost |
| --- | --- |
| Every open job of one large company (about 700 jobs) | $0.70 |
| 50 target companies, about 80 jobs each | $4.00 |
| 200 companies every week, only new jobs of the last 7 days (about 6,000 jobs a month) | $6.00 a month |

Apify's free plan includes $5 of usage every month: enough for about 5,000 jobs a month without paying anything.

### Use it from code or from an AI agent

- **API:** start a run and fetch the dataset with the Apify API or the Python and JavaScript clients.
- **Schedules:** run it daily or weekly with "Posted in the last N days" to collect only new openings.
- **AI agents:** the Actor is available as a tool through the Apify MCP server, so assistants such as Claude can look up a company's open jobs directly.

### More tools from this developer

| Tool | What it returns | Price |
| --- | --- | --- |
| [AliExpress Search Scraper](https://apify.com/alaathr/aliexpress-search-products) | AliExpress products for any keyword or URL: price, discount, units sold, rating, delivery | $3.00 / 1,000 products |
| [Google Ads Transparency Scraper](https://apify.com/alaathr/google-ads-transparency-scraper) | Every Google ad of an advertiser or website: format, dates shown, image, texts and link | $1.00 / 1,000 ads |
| [Google Flights Scraper](https://apify.com/alaathr/google-flights-scraper) | Every flight of a route and date with price, times, stops, layovers and CO2, plus a lowest-price calendar | $2.50 / 1,000 searches |
| [Google Hotels Scraper](https://apify.com/alaathr/google-hotels-prices) | Hotel prices for your dates in any city, with stars, ratings, address and links | $3.00 / 1,000 hotels |
| [Google Trends Scraper](https://apify.com/alaathr/google-trends-reliable) | Interest over time, by region and related queries for your own keyword list | $2.50 / 1,000 search terms |
| [Google Trends Trending Now Scraper](https://apify.com/alaathr/google-trends-trending-now) | Every trending search of a country or US state, with volume, timing, category and news | $0.80 / 1,000 trends |

### FAQ

**Which companies are covered?** Any company whose public job board runs on Greenhouse, Lever, Ashby, SmartRecruiters or Workday: together they power the careers pages of tens of thousands of companies, from startups to the Fortune 500.

**Why is there no salary for some jobs?** The Actor returns the pay range only when the company publishes it, as a structured field (Lever, Ashby) or written in the description (common for US jobs, where pay transparency laws apply).

**Does it collect personal data?** No. It returns job postings only: no recruiter or hiring manager names, and e-mail addresses and phone numbers are removed from descriptions.

**Why did a company name return the wrong company or nothing?** Several companies can use similar board names, and some boards use an unusual name. Paste the link of the company's job board (the page listing its open jobs) to target it exactly.

**Is this an official product of these companies?** No. This Actor is not affiliated with or endorsed by Greenhouse, Lever, Ashby, SmartRecruiters, Workday or the companies whose jobs it returns. It reads the public job boards these companies publish for job seekers.

# Actor input Schema

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

One per line: a company name (Stripe), a domain (notion.com), the link of its job board (https://boards.greenhouse.io/figma, https://jobs.lever.co/spotify, https://jobs.ashbyhq.com/ramp, https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite, https://jobs.smartrecruiters.com/BoschGroup) or of its own careers page. The hiring system is detected automatically; Workday sites need their link.

## `ats` (type: `string`):

Leave on auto: names and domains are tried on Greenhouse, Lever, Ashby and SmartRecruiters, links are recognised. Pick one system to look only there.

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

Keep jobs whose title contains at least one of these words (engineer, sales, data...). Empty keeps every job.

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

Drop jobs whose title contains one of these words (intern, senior...).

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

Keep jobs whose location or country contains one of these words (London, Germany, Remote, US...).

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

Keep only jobs the company marks as remote, or whose location says remote.

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

Keep only jobs posted during the last N days. 0 means any date.

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

Stop after this many jobs for each company. 0 means all.

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

Full text of each job. For Workday and SmartRecruiters it needs one more request per job, so untick it for faster runs that only need titles and locations.

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

Companies processed at the same time.

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

How many times a failed request is retried, with a pause, before the company is reported as failed (not charged).

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

Not needed: the job boards are public APIs. Turn on Apify Proxy only if your network requires it.

## Actor input object example

```json
{
  "companies": [
    "gitlab",
    "https://jobs.ashbyhq.com/ramp",
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "ats": "auto",
  "remoteOnly": false,
  "postedWithinDays": 0,
  "maxJobsPerCompany": 100,
  "includeDescription": true,
  "maxConcurrency": 3,
  "maxRetries": 4,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "companies": [
        "gitlab",
        "https://jobs.ashbyhq.com/ramp",
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
    ],
    "maxJobsPerCompany": 100,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("alaathr/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": [
        "gitlab",
        "https://jobs.ashbyhq.com/ramp",
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    ],
    "maxJobsPerCompany": 100,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("alaathr/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": [
    "gitlab",
    "https://jobs.ashbyhq.com/ramp",
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "maxJobsPerCompany": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call alaathr/career-site-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,alaathr/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/gA6kdekTM7CkBSjoZ/builds/ngPrhn446OumYtxH0/openapi.json
