# Career Site Jobs Scraper (`agarwoods/career-site-jobs-scraper`) Actor

Get open jobs directly from company career sites on Greenhouse, Lever, Ashby, Workable, Recruitee, Breezy, Rippling, Gem, Teamtailor and Workday. Search 8,000+ companies in seconds, or get a feed of new and closed jobs. Returns apply links and published pay. No API keys needed.

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

## Pricing

from $0.85 / 1,000 job delivereds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

Get open jobs straight from company career sites, in one clean format, at $1 per 1,000 jobs. Search thousands of companies in seconds, or follow the companies you care about and get a feed of new and closed jobs. Use it for job boards, recruiting leads, hiring signals, market research and AI agents that need fresh postings.

This Actor reads companies on **Greenhouse, Lever, Ashby, Workable, Recruitee, Breezy, Rippling, Gem, Teamtailor and Workday**. You don't need a login, cookies, an API key or proxies.

### What you get

- One row per job, with the same fields for every system
- Title, company, location, remote status, department, team, employment type and job level
- Posted date, job link and apply link
- Pay, when the company publishes it or states a range in the description
- A free row for each job that has closed, when you turn that on
- The full description in plain text, when you turn it on

### Sample output

```json
{
  "recordType": "job",
  "jobId": "ash-1234",
  "title": "Product Designer",
  "company": "Ramp",
  "source": "ashby",
  "board": "ramp",
  "location": "New York, NY (HQ)",
  "allLocations": ["New York, NY (HQ)", "Remote (US)"],
  "isRemote": true,
  "workplaceType": "Hybrid",
  "department": "Design",
  "team": "Core",
  "employmentType": "FullTime",
  "seniority": null,
  "postedAt": "2026-10-07T17:12:35.753Z",
  "jobUrl": "https://jobs.ashbyhq.com/ramp/ash-1234",
  "applyUrl": "https://jobs.ashbyhq.com/ramp/ash-1234/application",
  "salaryMin": 211000,
  "salaryMax": 290000,
  "salaryCurrency": "USD",
  "salaryInterval": "1 YEAR",
  "salaryText": "$211K to $290K",
  "description": null,
  "status": null,
  "reason": null,
  "fetchedAt": "2026-11-02T10:00:00.000Z"
}
```

This example shows the format. Pay appears only when a company publishes it, so many jobs have empty pay fields.

### How to use it

1. Add companies, one per line. Use a career page link, such as https://jobs.lever.co/spotify, a website, such as stripe.com, or a value such as greenhouse:stripe.
2. Add any filters you want, such as keywords, locations or remote only.
3. Set Maximum jobs in total, then press Start.

A plain name or website is tried on each system, so check the source field if a common name could match another company. Workday needs the full career link, such as https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite.

If you don't have a company list, set Where to search to Built-in company directory and add keywords. It searches a saved copy of jobs that is refreshed about once a day, so it takes seconds. The fetchedAt field shows when that copy was made. Newest jobs come first.

### Get a feed of new and closed jobs

Turn on New jobs only and run the Actor on a schedule. The first run returns all matches and remembers them. Later runs return only jobs that search has not returned before. Give each separate search its own Search name.

Turn on Report closed jobs as well to get a free row with recordType set to closed for each remembered job the company no longer lists. A company that can't be read on a given run closes nothing, so a brief outage doesn't look like closed jobs.

### Pricing

You pay only for what you get, and Apify platform usage is included.

| Event | Price |
| --- | --- |
| Each job delivered | $0.001 ($1 per 1,000) |
| Each run started | $0.00005 |
| Each directory search | $0.01 per run, only when using the built-in directory |

Status rows and closed job rows are free. A run with Maximum jobs in total left at 100 costs about $0.10.

On the free Apify plan, each run returns up to 100 jobs, and a status row tells you when you reach that limit. Any paid Apify plan removes it.

### Status rows

The Actor always tells you what happened. If a company can't be read or nothing matches, you get a free row with recordType set to status:

| Status | Meaning |
| --- | --- |
| not_found | No public board exists under that name |
| no_matches | The board was read, but no jobs matched |
| failed | The source could not be read, and reason says why |
| notice | Something you should know about this run |
| spending_limit | The run reached your maximum cost |
| free_limit | The run reached the free plan limit |

If you only want jobs, filter on recordType equal to job.

### Good to know

- Coverage depends on the company. This Actor can't read LinkedIn, Indeed, iCIMS or career sites built on other systems.
- SmartRecruiters isn't supported, because it asks automated tools not to read its job API.
- Workday has no published job API, so this Actor reads the data behind each public career site and skips any site whose robots.txt blocks it. Reading stops at 5,000 jobs per Workday site, and dates in lists are approximate unless you include descriptions.
- Directory searches don't include descriptions, and they have no department for Greenhouse jobs. List companies by name to get both.
- Rippling publishes no posting date, and Gem and Breezy publish less detail than other systems.
- Job level comes from the title and is empty when the title doesn't say. Pay found in a description is read automatically, so check it before relying on it.

### Using it with AI agents

The main inputs are lists, every field is optional, and no credentials are needed. An agent can search many companies in one call and read status rows to see what went wrong.

### Data and use

This Actor reads only public job postings. It collects no applicant data and uses no login. Job text belongs to the employers, so check their terms before you republish it. Some systems, including Workable and Teamtailor, ask that their content not be used to train AI models. You are responsible for how you use the data. This Actor is not affiliated with or endorsed by any of these systems.

The directory's company list includes data from LastRound AI Hiring Data, licensed under CC BY 4.0.

### Support

Open an issue on the Issues tab with your input and what you expected.

# Actor input Schema

## `scope` (type: `string`):

Use listed to read the companies you name, live. Use directory to search a saved daily copy of jobs from thousands of companies, which needs no company names and takes seconds.

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

One company per line. Accepts a career page link, such as https://jobs.lever.co/spotify or https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite, a website, such as stripe.com, or a system and name, such as greenhouse:stripe, lever:spotify, ashby:ramp, workable:acme, recruitee:acme, breezy:acme, rippling:acme, gem:acme or teamtailor:acme. A plain name or website is tried on each system except Workday. Ignored when scope is directory.

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

Keep jobs whose title or department contains any of these words. Leave empty to keep all jobs.

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

Remove jobs whose title contains any of these words, such as intern.

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

Keep jobs whose location contains any of these words, such as London or United States. Leave empty for all locations.

## `departments` (type: `array`):

Keep jobs whose department or team contains any of these words, such as Sales.

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

Keep only jobs marked remote by the company or with Remote in the location.

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

Keep jobs posted in the last this many days. Use 0 for no limit. Jobs with no published date are removed when this is set.

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

Return only jobs this search has not returned before. The first run returns all matches and remembers them. Use it with a schedule to get a feed of new jobs.

## `reportClosedJobs` (type: `boolean`):

Works with New jobs only. Adds a free row with recordType set to closed for each job an earlier run returned that the company no longer lists.

## `searchName` (type: `string`):

Label for the memory used by New jobs only. Use a different name for each separate search.

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

Add the full description as plain text. Runs take longer, especially on Workday, which needs one extra request per job. Directory searches don't include descriptions.

## `maxJobs` (type: `integer`):

Stop after this many jobs across all companies. This also caps your cost.

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

Limit the jobs taken from each company. Use 0 for no limit.

## Actor input object example

```json
{
  "scope": "listed",
  "companies": [
    "greenhouse:stripe",
    "ashby:ramp",
    "lever:spotify"
  ],
  "keywords": [
    "engineer"
  ],
  "excludeKeywords": [],
  "locations": [],
  "departments": [],
  "remoteOnly": false,
  "postedWithinDays": 0,
  "onlyNewJobs": false,
  "reportClosedJobs": false,
  "searchName": "default",
  "includeDescription": false,
  "maxJobs": 100,
  "maxJobsPerCompany": 0
}
```

# Actor output Schema

## `jobs` (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 = {
    "scope": "listed",
    "companies": [
        "greenhouse:stripe",
        "ashby:ramp",
        "lever:spotify"
    ],
    "keywords": [
        "engineer"
    ],
    "maxJobs": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("agarwoods/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 = {
    "scope": "listed",
    "companies": [
        "greenhouse:stripe",
        "ashby:ramp",
        "lever:spotify",
    ],
    "keywords": ["engineer"],
    "maxJobs": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("agarwoods/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 '{
  "scope": "listed",
  "companies": [
    "greenhouse:stripe",
    "ashby:ramp",
    "lever:spotify"
  ],
  "keywords": [
    "engineer"
  ],
  "maxJobs": 100
}' |
apify call agarwoods/career-site-jobs-scraper --silent --output-dataset

```

## MCP server setup

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