# Company Career Page Jobs (Greenhouse, Lever, Ashby) (`reaperoak/company-career-page-jobs-greenhouse-lever-ashby`) Actor

Export every open job from a company's Greenhouse, Lever or Ashby careers page as clean rows: title, team, location, remote, posted date, salary range and apply link. Filter by keyword, location or recency.

- **URL**: https://apify.com/reaperoak/company-career-page-jobs-greenhouse-lever-ashby.md
- **Developed by:** [Owais Khan](https://apify.com/reaperoak) (community)
- **Categories:** Jobs, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.70 / 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.
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

## Company Career Page Jobs (Greenhouse, Lever, Ashby)

Export every open job from a company's **Greenhouse, Lever or Ashby** careers page as clean, structured rows: title, team, location, remote flag, posted date, **salary range** and apply link. Give it company names or careers URLs, filter by keyword, location or recency, and download JSON, CSV or Excel. No proxy and no login.

### What is the Company Career Page Jobs Actor?

Thousands of startups and scale-ups publish their jobs through Greenhouse, Lever or Ashby, and all three expose a public job-board API. This Actor reads those APIs and normalises the three different formats into one, so you can compare jobs across companies without writing three scrapers.

### What makes it different?

- **One format for three ATS platforms.** Greenhouse, Lever and Ashby fields are mapped to the same columns.
- **Salary ranges where they exist.** Ashby publishes pay directly; for Greenhouse and Lever the Actor also reads ranges quoted in the job text and marks them `salarySource: text` so you know which is which.
- **Filters that save money.** Keywords, locations, departments, remote-only and posted-within-N-days are applied before you are charged, so you only pay for rows you keep.
- **Bare names work.** Type `stripe` and the Actor finds which ATS the company uses.

### What data can you extract from careers pages?

| Field | Example |
|---|---|
| `title` | `Senior Backend Engineer` |
| `company, ats` | `stripe`, `greenhouse` |
| `department, team` | `Engineering`, `Backend` |
| `location, locations, remote` | `New York, NY (HQ)`, `true` |
| `publishedAt` | `2026-09-09T14:50:29.000Z` |
| `salaryMin, salaryMax, salaryCurrency` | `211400`, `290600`, `USD` |
| `url, applyUrl` | links to the job and the application |
| `descriptionText` | plain-text description (optional) |

A `SUMMARY` record shows, for each company, which ATS it was found on, how many jobs are open and how many your filters kept.

### How to scrape jobs from Greenhouse, Lever and Ashby

1. Add companies: slugs like `stripe`, prefixed slugs like `lever:spotify`, or careers URLs.
2. Optionally add keywords, locations, departments, remote-only or a posted-within window.
3. Click **Start**.
4. Download the jobs as JSON, CSV or Excel, or call the Actor from the API, a schedule, Make, n8n or Zapier.

```json
{
    "companies": [
        "greenhouse:stripe",
        "ashby:ramp"
    ],
    "keywords": [
        "engineer"
    ],
    "maxJobsPerCompany": 20
}
```

- **companies**: slugs, `ats:slug` or careers URLs. A bare slug is tried on Greenhouse, then Lever, then Ashby.
- **keywords / excludeKeywords**: matched against the job title.
- **locations / departments**: substring match, so `London` matches `London, UK`.
- **postedWithinDays**: needs a publish date, so undated jobs are dropped when it is set.
- **includeDescription**: adds up to 4,000 characters of plain text per job.

### How much does it cost?

You pay per job returned plus a very small start fee. There is no subscription.

| Jobs | Approximate cost |
|---|---|
| 10 | $0.02 |
| 100 | $0.20 |
| 1,000 | $2 |
| 10,000 | $20 |

Paid Apify plans get tiered discounts, and you can set a maximum cost per run. You can try it on Apify's free plan without a card.

### Who is it for?

- **Recruiters and sourcers** tracking which companies hire for which roles.
- **Job-board builders** needing a clean feed of startup jobs.
- **Sales and market researchers** using hiring as a buying signal.
- **Job seekers and career coaches** comparing salary ranges across companies.

### Frequently asked questions

**Which companies does it work for?** Any company whose careers page runs on Greenhouse, Lever or Ashby. Many do not (Workday, SmartRecruiters and in-house systems are not covered).

**How do I find a company's slug?** It is the last part of its careers URL, for example `jobs.lever.co/spotify` has the slug `spotify`. You can also paste the whole URL.

**Does it need a proxy or login?** No. It uses the public job-board APIs these platforms offer.

**Why is salary empty for some jobs?** Many companies do not publish pay. The Actor only returns a salary when the ATS provides it or the job text states a range.

**What if an ATS changes its API?** The run fails with an explicit error instead of returning empty data, and the Actor is health-checked every night.

### Notes and limits

- Reads public job-board endpoints that the platforms provide for exactly this purpose. Job text belongs to the hiring companies.
- Large boards can have hundreds of jobs; use filters or `maxJobsPerCompany` to control cost.

# Actor input Schema

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

Company slugs (<code>stripe</code>), prefixed slugs (<code>lever:spotify</code>), or careers URLs such as <code>https://jobs.ashbyhq.com/ramp</code>. A bare slug is looked up on Greenhouse, then Lever, then Ashby.

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

Keep only jobs whose title contains any of these words, for example <code>engineer</code> or <code>designer</code>. Leave empty for all jobs.

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

Drop jobs whose title contains any of these words, for example <code>intern</code>.

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

Keep only jobs whose location contains any of these, for example <code>London</code> or <code>Remote</code>.

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

Keep only jobs whose department or team contains any of these, for example <code>Engineering</code>.

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

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

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

Keep only jobs first published in the last N days. 0 means no limit. Jobs without a publish date are dropped when this is set.

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

Stops after this many matching jobs for each company.

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

Adds the plain-text job description (up to 4,000 characters). Off by default to keep rows small.

## Actor input object example

```json
{
  "companies": [
    "greenhouse:stripe",
    "ashby:ramp"
  ],
  "remoteOnly": false,
  "postedWithinDays": 0,
  "maxJobsPerCompany": 20,
  "includeDescription": false
}
```

# Actor output Schema

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

One row per open job: company, title, department, location, remote flag, posted date, salary range and links.

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

For each company: which ATS it uses, how many jobs are open, and how many this run returned.

# 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:stripe",
        "ashby:ramp"
    ],
    "maxJobsPerCompany": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("reaperoak/company-career-page-jobs-greenhouse-lever-ashby").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:stripe",
        "ashby:ramp",
    ],
    "maxJobsPerCompany": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("reaperoak/company-career-page-jobs-greenhouse-lever-ashby").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:stripe",
    "ashby:ramp"
  ],
  "maxJobsPerCompany": 20
}' |
apify call reaperoak/company-career-page-jobs-greenhouse-lever-ashby --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,reaperoak/company-career-page-jobs-greenhouse-lever-ashby"
        }
    }
}
```

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/9ScOrhU11qKDGhTw7/builds/434x249thkKOfh6p4/openapi.json
