# Company Careers Jobs Feed: Greenhouse, Lever, Ashby, Workable (`prism-partners/company-careers-jobs-feed`) Actor

Daily job listings straight from company career sites on Greenhouse, Lever, Ashby and Workable via their official public job-board APIs. Thousands of companies preloaded, new-jobs-only mode, salary, remote flag, normalized schema. $0.99 per 1,000 jobs.

- **URL**: https://apify.com/prism-partners/company-careers-jobs-feed.md
- **Developed by:** [Prism Partners](https://apify.com/prism-partners) (community)
- **Categories:** Jobs, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## Company Careers Jobs Feed — Greenhouse, Lever, Ashby & Workable Job Listings API

Get **fresh job listings straight from company career sites** on **Greenhouse, Lever, Ashby and Workable**. The data comes from each platform's **official public job-board API**: no login, no proxies, no LinkedIn or Indeed scraping. Every posting is normalized into one clean schema with **salary, remote flag, department, employment type, posted date and apply link**.

**$0.99 per 1,000 jobs + $0.02 per run.** You pay only for jobs returned after your filters.

### Why use it

- **12,000+ companies preloaded.** Validated live boards: 5,147 Greenhouse, 2,613 Workable, 2,407 Ashby, 1,918 Lever. Turn on *Include built-in company list* and scan them all, or paste your own slugs or career-page URLs.
- **New-jobs-only daily feed.** Schedule it daily and it returns (and bills) only postings it hasn't returned before, with a `firstSeenAt` timestamp.
- **Salary data.** Uses structured pay ranges from Ashby and Lever, plus pay-transparency ranges parsed from the description (`salarySource` = `structured` or `text`).
- **Straight from the source.** Data is fetched live from the company's own ATS at run time, so there's no stale database.
- **Privacy-friendly.** It outputs only what the job posting publishes. Recruiter names and emails are never collected.
- **Fails loudly.** If an ATS starts blocking requests or changes its API, the run fails instead of silently returning nothing.

### Use cases

- Job boards and niche aggregators (remote, climate, AI, Denver, etc.)
- Sales signals: which companies are hiring for which teams
- Recruiting and talent-market research, salary benchmarking
- AI agents and LLM pipelines that need structured, current job data

### Input examples

**Daily feed of remote engineering jobs across all preloaded companies**

```json
{"useSeedList": true, "keywords": ["engineer", "developer"], "remoteOnly": true, "mode": "newSinceLastRun", "maxResults": 5000}
```

**Specific companies (default mode `all`: every current matching job)**

```json
{"companies": ["stripe", "lever:spotify", "https://jobs.ashbyhq.com/ramp"], "maxResults": 20}
```

With no companies and the built-in list off, it runs a small demo (3 companies, 20 jobs) instead of failing. A bare slug like `stripe` is tried on every selected ATS. Boards that don't exist are skipped at no charge.

### Output (one item per job)

| Field | Description |
|---|---|
| `jobId` | Stable ID `ats:companySlug:postingId` |
| `title`, `company`, `companySlug`, `ats` | Basics |
| `location`, `locations[]`, `isRemote`, `workplaceType` | Where |
| `department`, `team`, `employmentType` | What |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryInterval`, `salaryText`, `salarySource` | Pay, when published |
| `postedAt`, `updatedAt`, `firstSeenAt`, `isNew` | When (UTC ISO 8601) |
| `jobUrl`, `applyUrl` | Links |
| `descriptionText`, `descriptionHtml` (optional) | Full description |

Dataset views: **Jobs overview** and **Jobs with salary**. Export to CSV, Excel or JSON, or connect to Google Sheets, Make, Zapier or the API.

### Field coverage (sample run, 194 boards, 4,502 jobs, Oct 2026)

Title, company, location, posted date, job URL and description: ~100%. Department: 94%. Salary: 40% (Ashby 52%, Lever 54%, Greenhouse 41%, Workable 6%). Employment type: 37%. Greenhouse doesn't publish it, which pulls the average down; it's 89–100% on the other three.

### Pricing

Pay per event: **`actor-start` $0.02 per run** + **`job-result` $0.00099** ($0.99 per 1,000 jobs). In new-only mode you aren't billed again for jobs already returned.

### FAQ

**Is this legal?** It reads the public job-board APIs these ATS vendors provide so that companies' postings can be syndicated. It respects robots.txt (for example, Lever's 1-second crawl delay) and identifies itself with a contact User-Agent.
**Why no SmartRecruiters?** Its API robots.txt disallows automated agents, so we leave it out.
**Workday / iCIMS?** Not yet, because they don't have an official public posting API.

# Actor input Schema

## `atsSources` (type: `array`):

Which applicant-tracking systems to read.

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

Board slugs or career-site URLs, e.g. 'stripe', 'lever:spotify', 'https://jobs.ashbyhq.com/ramp'. A bare slug is tried on every selected ATS.

## `useSeedList` (type: `boolean`):

Scan the preloaded, validated list of company boards (thousands). Defaults to on when no companies are given.

## `seedMinOpenJobs` (type: `integer`):

Skip seed companies that had fewer open jobs than this at validation time.

## `maxCompanies` (type: `integer`):

0 = no limit.

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

Keep jobs whose title (or description, see below) contains any of these. Case-insensitive.

## `keywordsIn` (type: `string`):

Match keywords in the title only, or in title and description.

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

Drop jobs whose title contains any of these (e.g. 'intern', 'senior').

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

Substring match on location, e.g. 'Denver', 'United States', 'London'. 'remote' also matches remote-flagged jobs.

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

Remote only.

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

Substring match on department or team, e.g. 'Engineering', 'Sales'.

## `employmentTypes` (type: `array`):

Employment types.

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

Only jobs posted/updated in the last N days. Empty = any.

## `postedSince` (type: `string`):

YYYY-MM-DD. Overrides 'Posted within'.

## `mode` (type: `string`):

'All matching open jobs' returns every current match. For a scheduled daily feed choose 'Only jobs not returned before': it remembers job IDs in a named key-value store, so scheduled runs return (and bill) only fresh postings.

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

Use different names to keep independent feeds.

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

Include description text.

## `includeHtml` (type: `boolean`):

Include description HTML.

## `maxResults` (type: `integer`):

Stop after this many jobs (0 = no limit). You are charged per job returned. Prefilled to 20 for a quick test run; default 100.

## `concurrency` (type: `integer`):

Concurrent boards.

## Actor input object example

```json
{
  "atsSources": [
    "greenhouse",
    "lever",
    "ashby",
    "workable"
  ],
  "companies": [
    "stripe",
    "lever:spotify",
    "https://jobs.ashbyhq.com/ramp"
  ],
  "useSeedList": false,
  "seedMinOpenJobs": 1,
  "maxCompanies": 0,
  "keywordsIn": "title",
  "remoteOnly": false,
  "mode": "all",
  "stateStoreName": "ats-jobs-feed-state",
  "includeDescription": true,
  "includeHtml": false,
  "maxResults": 20,
  "concurrency": 30
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `salaries` (type: `string`):

No description

## `allResults` (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",
        "lever:spotify",
        "https://jobs.ashbyhq.com/ramp"
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("prism-partners/company-careers-jobs-feed").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",
        "lever:spotify",
        "https://jobs.ashbyhq.com/ramp",
    ],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("prism-partners/company-careers-jobs-feed").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",
    "lever:spotify",
    "https://jobs.ashbyhq.com/ramp"
  ],
  "maxResults": 20
}' |
apify call prism-partners/company-careers-jobs-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,prism-partners/company-careers-jobs-feed"
        }
    }
}
```

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/wALhz2eutfOoWWhUR/builds/f6wkwxwW8st9LBeth/openapi.json
