# Company Career Site Jobs (Greenhouse, Lever, Ashby & more) (`survivalstudent/company-career-site-jobs`) Actor

Fresh job listings straight from company career sites via the official public Greenhouse, Lever, Ashby and SmartRecruiters job-board APIs. Normalized fields, salary when posted, keyword/location/remote/date filters, tech, defense and healthcare presets. $1 per 1,000 jobs.

- **URL**: https://apify.com/survivalstudent/company-career-site-jobs.md
- **Developed by:** [Shaun Hill](https://apify.com/survivalstudent) (community)
- **Categories:** Jobs, Lead generation, AI
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 job listings

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 Career Site Jobs (Greenhouse, Lever, Ashby, SmartRecruiters)

Get **fresh job listings straight from company career sites**: title, department, team, location, remote flag, employment type, posted date, apply link, **salary range when the company publishes it**, and a clean plain-text description.

The data comes from the **official public job-board APIs** that the ATS vendors provide for career pages: Greenhouse, Lever, Ashby and SmartRecruiters. There are no aggregators, no logins, no proxies and no browser scraping, so runs are fast (about 100 companies in under a minute) and cheap.

### Who it's for

- **Recruiters and staffing agencies** tracking who is hiring, and for what
- **Sales teams** using hiring as a buying signal (for example "hiring 5+ data engineers" or "opening a London office")
- **Job boards, newsletters and AI agents** that need structured, de-duplicated postings
- **Investors and analysts** watching headcount plans at startups, defense tech and health tech

### Features

- **4 ATS platforms**: Greenhouse, Lever (US and EU), Ashby and SmartRecruiters.
- **Flexible board input**: enter `greenhouse:stripe`, a plain `stripe` (the Actor auto-detects the ATS), or paste the career-site URL (`https://jobs.lever.co/palantir`).
- **Built-in presets of verified companies**: **Tech & AI** (49), **Defense, space & govcon** (27: Anduril, SpaceX, Shield AI, Palantir, Saronic, Scale AI, Skydio, Rocket Lab and more) and **Healthcare & health tech** (24: Oscar, Lyra, Zocdoc, Abridge, Sword, Maven and more). With an empty input, the run returns the newest jobs from the tech list.
- **Filters**: title keywords (optionally matched in the description too), excluded keywords, department/team, location text, remote only, posted within N days, max jobs, max per company.
- **One normalized schema** across all ATSs, with ISO-8601 UTC dates and newest jobs first.
- **Salary** as min, max, currency and interval when Greenhouse pay transparency, Lever `salaryRange` or Ashby compensation data is present.

### Input example

```json
{
  "companies": ["greenhouse:stripe", "lever:palantir", "ashby:openai", "https://jobs.smartrecruiters.com/Canva"],
  "preset": "defense",
  "keywords": ["engineer", "data"],
  "locations": ["United States", "Remote"],
  "remoteOnly": false,
  "postedWithinDays": 7,
  "maxJobs": 500,
  "descriptionMaxChars": 2000
}
```

### Output example

```json
{
  "company": "Ramp", "ats": "ashby", "boardToken": "ramp",
  "jobId": "1c8e2b03-fcb3-4949-9113-07812f138eb6",
  "title": "Senior Analyst, Employee Lifecycle Data (Workday)",
  "department": "People & Talent", "team": "People & Talent",
  "location": "New York, NY (HQ)", "allLocations": ["New York, NY (HQ)"],
  "isRemote": false, "workplaceType": "hybrid", "employmentType": "FullTime",
  "postedAt": "2026-10-04T13:55:38Z", "updatedAt": null,
  "applyUrl": "https://jobs.ashbyhq.com/ramp/1c8e2b03-.../application",
  "jobUrl": "https://jobs.ashbyhq.com/ramp/1c8e2b03-...",
  "salary": {"min": 90000, "max": 120000, "currency": "USD", "interval": "1 YEAR", "text": "$90K - $120K"},
  "country": "USA",
  "description": "ABOUT RAMP\n\nRamp is building the smart infrastructure for finance teams...",
  "scrapedAt": "2026-10-04T16:53:11Z"
}
```

### Finding a company's board token

Open the company's careers page and click a job. The token is the part of the URL after the ATS host:

- `boards.greenhouse.io/`**`stripe`** or `job-boards.greenhouse.io/`**`stripe`** gives `greenhouse:stripe`. A URL like `?gh_jid=` on the company's own site also means Greenhouse.
- `jobs.lever.co/`**`palantir`** gives `lever:palantir`
- `jobs.ashbyhq.com/`**`openai`** gives `ashby:openai`
- `jobs.smartrecruiters.com/`**`Canva`** gives `smartrecruiters:Canva`

You can also paste the URL itself.

### Pricing

Pay per event: **$0.001 per job listing returned** ($1 per 1,000 jobs), plus the small Apify Actor start fee. Set *Max jobs* or a run spending limit to cap cost. The Actor stops cleanly when your limit is reached.

### Notes and limits

- Only **currently open, publicly listed** jobs are available. Closed jobs disappear from the APIs.
- Lever doesn't expose an "updated" date. Its `postedAt` is the posting's creation time. Greenhouse `postedAt` is the first-published date.
- Remote detection uses the ATS workplace/remote flag where available (Lever, Ashby, SmartRecruiters). Otherwise it looks for "Remote" in the location.
- SmartRecruiters descriptions are fetched only for the jobs that are returned, so description keyword search doesn't apply to them.
- Companies sometimes change ATS or board tokens. A board that returns nothing is logged as a warning and the run continues.

### Legal and compliance

This Actor calls only the **official, unauthenticated public job-board APIs** that Greenhouse, Lever, Ashby and SmartRecruiters publish so employers can display their openings on career sites. It uses an identified User-Agent and modest concurrency, and it accesses no personal data, logins or non-public content. It isn't affiliated with or endorsed by Greenhouse, Lever, Ashby, SmartRecruiters or any listed employer, and company names are trademarks of their owners. Job content belongs to the posting employer. If you republish listings, link back to the original `jobUrl`/`applyUrl`, keep them current, and follow the employer's and ATS vendor's terms and applicable law, including anti-discrimination and job-advertising rules and GDPR/CCPA. Don't use this data for spam or misleading job ads.

# Actor input Schema

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

One board per line. Use 'ats:token' (greenhouse:stripe, lever:palantir, ashby:openai, smartrecruiters:Canva), a plain token (the Actor tries Greenhouse, Lever, Ashby, then SmartRecruiters), or a board URL such as https://boards.greenhouse.io/stripe or https://jobs.lever.co/palantir.

## `preset` (type: `string`):

A built-in list of verified boards. 'Auto' uses the tech list only when you leave Company job boards empty. Any other choice is added to your own boards.

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

Keep jobs whose title contains any of these, e.g. 'engineer', 'data', 'account executive'. Case-insensitive. Empty means all jobs.

## `searchInDescription` (type: `boolean`):

Off: keywords match the title only. SmartRecruiters descriptions aren't searched, because they're fetched only for the jobs that are returned.

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

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

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

Keep jobs whose department or team contains any of these, e.g. 'engineering', 'sales'.

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

Keep jobs whose location text contains any of these, e.g. 'New York', 'London', 'United States', 'Remote'. Case-insensitive substring match.

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

Uses the ATS remote/workplace flag when the ATS provides one. Otherwise it looks for 'Remote' in the location.

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

Only jobs first published in the last N days (Greenhouse falls back to the last update date). 0 means any date.

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

Maximum listings to return, newest first. You're charged per listing.

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

Cap the listings taken from each company so large boards don't crowd out the rest. 0 means no cap.

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

Plain-text job description, converted from HTML.

## `descriptionMaxChars` (type: `integer`):

Truncate descriptions to this length. 0 means the full text.

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

The number of boards fetched in parallel.

## Actor input object example

```json
{
  "companies": [
    "greenhouse:stripe",
    "lever:palantir",
    "ashby:openai",
    "smartrecruiters:Canva"
  ],
  "preset": "auto",
  "searchInDescription": false,
  "remoteOnly": false,
  "postedWithinDays": 0,
  "maxJobs": 100,
  "maxJobsPerCompany": 0,
  "includeDescription": true,
  "descriptionMaxChars": 3000,
  "maxConcurrency": 8
}
```

# Actor output Schema

## `jobs` (type: `string`):

One item per open job: company, ATS, title, department, location, remote flag, dates, apply URL, salary and 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": [
        "greenhouse:stripe",
        "lever:palantir",
        "ashby:openai",
        "smartrecruiters:Canva"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("survivalstudent/company-career-site-jobs").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",
        "lever:palantir",
        "ashby:openai",
        "smartrecruiters:Canva",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("survivalstudent/company-career-site-jobs").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",
    "lever:palantir",
    "ashby:openai",
    "smartrecruiters:Canva"
  ]
}' |
apify call survivalstudent/company-career-site-jobs --silent --output-dataset

```

## MCP server setup

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

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/9JZFEZ5rQavyU8aZ6/builds/6EAKD7CTtBJs824Hb/openapi.json
