# Company Career Pages Jobs API - Greenhouse, Lever, Ashby & more (`cape-data-labs/company-career-jobs-api`) Actor

Get every open job from any company's career page. Auto-detects Greenhouse, Lever, Ashby, SmartRecruiters, Workable and Recruitee, returns one clean format with salary, remote and seniority fields, and can return only new jobs since the last run.

- **URL**: https://apify.com/cape-data-labs/company-career-jobs-api.md
- **Developed by:** [Andre van Schalkwyk](https://apify.com/cape-data-labs) (community)
- **Categories:** Jobs, Lead generation, AI
- **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 job returneds

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 Pages Jobs API

Get **every open job from a company's own career page**: give it company names or career-page URLs and get back one clean, consistent dataset. Works with **Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Recruitee, Personio and Breezy HR**, the hiring platforms behind tens of thousands of companies, from startups to enterprises.

- 🔎 **Auto-detects the platform.** Type `Stripe` or `Notion`, and the Actor finds the company's job board. No need to know which ATS they use.
- 🧹 **One format for every platform.** Title, department, location, workplace type (remote / hybrid / on-site), seniority, employment type, salary range, posting date, job and apply links, plus the description as plain text and HTML.
- 🔔 **Only new jobs mode.** Schedule it daily and get only the jobs that appeared since the last run. You pay only for new jobs.
- ✅ **Uses the official public job-board APIs** each platform provides for publishing jobs. No logins, no cookies, no proxies, no blocked runs.
- 💸 **You only pay for jobs returned.** Companies without a supported job board cost nothing.

### Who uses this

- **Recruiters and staffing agencies:** watch target companies and get alerted the moment a matching role opens.
- **Job boards and aggregators:** feed fresh jobs straight from the source, with salary and remote flags already parsed.
- **Sales and growth teams:** hiring is a buying signal. A company hiring 5 data engineers is probably buying data tools.
- **Market and labour researchers:** track hiring trends by company, department, location and seniority.
- **AI agents:** give your agent a tool that answers "who is hiring for X at Y?" with structured data.

### How to use it

1. Add companies, one per line. Any of these work:
   - A company name: `Stripe`
   - A career-page URL: `https://jobs.lever.co/palantir`, `https://boards.greenhouse.io/airbnb`, `https://jobs.ashbyhq.com/ramp`
   - An explicit platform and board: `greenhouse:airbnb`, `lever:palantir`, `ashby:ramp`
2. Optionally filter by title keywords, location, workplace type, seniority or posting date.
3. Run it, then export to JSON, CSV, Excel, or connect via API, Zapier, Make or n8n.

**Tip:** for big lists of company names, give career-page URLs where you have them. They skip detection and run faster.

### Input example

```json
{
  "companies": ["Stripe", "https://jobs.lever.co/palantir", "ashby:ramp"],
  "titleKeywords": ["engineer", "data"],
  "locations": ["London", "New York"],
  "workplaceTypes": ["remote", "hybrid"],
  "onlyNewJobs": true
}
```

### Output example

```json
{
  "company": "Ramp",
  "ats": "ashby",
  "boardToken": "ramp",
  "jobId": "ashby:ramp:7b1c...",
  "title": "Senior Software Engineer, Backend",
  "department": "Engineering",
  "location": "New York, NY | Remote",
  "employmentType": "FullTime",
  "workplaceType": "hybrid",
  "isRemote": false,
  "seniority": "senior",
  "salary": {"min": 180000, "max": 250000, "currency": "USD", "period": "year", "source": "structured"},
  "postedAt": "2026-10-28T14:02:11+00:00",
  "url": "https://jobs.ashbyhq.com/ramp/7b1c...",
  "applyUrl": "https://jobs.ashbyhq.com/ramp/7b1c.../application",
  "descriptionText": "About the role ...",
  "input": "ashby:ramp",
  "scrapedAt": "2026-11-02T20:15:00+00:00"
}
```

Salary comes from the platform's own structured data when the company publishes it (`source: "structured"`), otherwise from a salary range stated in the description (`source: "description"`), or `null`.

The run's `OUTPUT` record lists which platform each company was found on, and which companies had no supported job board.

### Pricing

Pay per result: you're charged per job returned. Companies with no board found, and jobs filtered out, are free. With **Only new jobs** on, repeat runs only charge for new postings, so a daily monitor of 100 companies typically costs cents.

### Supported platforms

| Platform | Accepted input |
|---|---|
| Greenhouse | name, `boards.greenhouse.io/<board>`, `job-boards.greenhouse.io/<board>`, `greenhouse:<board>` |
| Lever | name, `jobs.lever.co/<board>`, `lever:<board>` |
| Ashby | name, `jobs.ashbyhq.com/<board>`, `ashby:<board>` |
| SmartRecruiters | name, `careers.smartrecruiters.com/<company>`, `smartrecruiters:<company>` |
| Workable | name, `apply.workable.com/<account>`, `workable:<account>` |
| Recruitee | name, `<company>.recruitee.com`, `recruitee:<company>` |
| Personio | name, `<company>.jobs.personio.de`, `personio:<company>` |
| Breezy HR | name, `<company>.breezy.hr`, `breezy:<company>` |

More platforms are being added. Missing one you need? Open an issue on the Actor page.

### FAQ

**Is this legal?** The Actor only reads job postings that companies publish through their hiring platform's public job-board API, the same feed that powers their own careers page. It collects no personal data.

**Why wasn't a company found by name?** Some companies use a board name that differs from their brand, or use a platform that isn't supported yet. Paste their careers-page URL instead.

**How fresh is the data?** Live. Every run reads the job board directly.

# Actor input Schema

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

Company names (e.g. Stripe, Notion), career-page URLs (e.g. https://jobs.lever.co/palantir, https://boards.greenhouse.io/airbnb), or explicit 'ats:board' pairs (e.g. ashby:ramp, personio:1komma5grad). The Actor detects which hiring platform each company uses.

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

Only keep jobs whose title contains at least one of these words, e.g. engineer, sales, designer. Leave empty for all jobs.

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

Drop jobs whose title contains any of these words, e.g. intern.

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

Keep jobs whose location contains one of these, e.g. London, Germany, New York, Cape Town.

## `includeRemoteWithLocation` (type: `boolean`):

When a location filter is set, still include jobs marked remote.

## `workplaceTypes` (type: `array`):

Keep only these workplace types.

## `seniority` (type: `array`):

Keep only these seniority levels (inferred from the job title).

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

Only jobs posted in the last N days (where the platform reports a posting date).

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

Remembers which jobs you've already received and returns (and charges for) only new ones. Ideal for daily scheduled runs and job alerts.

## `stateStoreName` (type: `string`):

Use different names to keep separate 'already seen' lists for different monitors.

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

Include full description as plain text and HTML.

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

Limit results per company (newest first). 0 means no limit.

## `atsPlatforms` (type: `array`):

Speeds up detection for plain company names. Leave empty to check all supported platforms.

## Actor input object example

```json
{
  "companies": [
    "Stripe",
    "https://jobs.lever.co/palantir",
    "ashby:ramp"
  ],
  "includeRemoteWithLocation": true,
  "onlyNewJobs": false,
  "stateStoreName": "company-jobs-state",
  "includeDescription": true,
  "maxJobsPerCompany": 0
}
```

# Actor output Schema

## `overview` (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": [
        "Stripe",
        "https://jobs.lever.co/palantir",
        "ashby:ramp"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cape-data-labs/company-career-jobs-api").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": [
        "Stripe",
        "https://jobs.lever.co/palantir",
        "ashby:ramp",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("cape-data-labs/company-career-jobs-api").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": [
    "Stripe",
    "https://jobs.lever.co/palantir",
    "ashby:ramp"
  ]
}' |
apify call cape-data-labs/company-career-jobs-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cape-data-labs/company-career-jobs-api"
        }
    }
}
```

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/nt0JOKUDlvkBysaCs/builds/3SQOeILSLQmcneEyh/openapi.json
