# Career Site Jobs Search: Job Postings API from Company Sites (`spellzcode/career-site-jobs-search`) Actor

Search open jobs across company career sites on Greenhouse, Ashby, SmartRecruiters and Lever by title, location, department and date. Direct from employers, with no job board reposts. Schedule it to get only new jobs. Pay per job returned.

- **URL**: https://apify.com/spellzcode/career-site-jobs-search.md
- **Developed by:** [Mårten Fitzback](https://apify.com/spellzcode) (community)
- **Categories:** Jobs, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 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

## Career Site Jobs Search: Job Postings API from Company Sites

Search open jobs across more than 2,600 company career sites in one run, by title, location, department, company and date. Every job comes straight from the career site of the company posting it, on Greenhouse, Ashby, SmartRecruiters and Lever, so there are no job board reposts. Recruitment firms that use these systems do appear.

Use this job postings API to feed a job board, find companies that are hiring for sales outreach, track what competitors hire for, or pull fresh jobs into a spreadsheet or an AI agent. **You pay only per job returned**, and a search that finds nothing is free.

### What you get for each job

| Field | What it is |
|---|---|
| `title`, `company` | The job title and employer |
| `location`, `remote` | Where the job is, and whether the employer marks it remote |
| `department`, `employmentType` | When the employer publishes them |
| `compensation` | Pay range, when the employer publishes one (common on Ashby and some Lever boards) |
| `postedAt` | The date the employer's system gives for publishing the job |
| `firstSeen` | When this index first saw the job |
| `description` | The first 1,800 characters of the description. Not available for SmartRecruiters |
| `source`, `url` | The system, and a direct link to the job on the employer's career site |

### Example searches

- **Remote data roles this week:** set `titleKeywords` to `data engineer`, `analytics engineer`, turn on `remoteOnly` and leave `postedWithinDays` at 7.
- **Who is hiring sales staff in Germany:** set `titleKeywords` to `account executive`, `locations` to `Germany`, `Berlin`, `Munich`.
- **A daily feed of new jobs:** set a `monitorName` such as `daily-design-jobs` and schedule the Actor. Each run returns and charges only for jobs it has not returned before.
- **Exclude what you do not want:** set `excludeTitleKeywords` to `senior`, `intern`.

### Example output

```json
{
  "title": "Data Engineer",
  "company": "Acme Robotics",
  "location": "Berlin, Germany",
  "remote": false,
  "department": "Data",
  "employmentType": "Full-time",
  "compensation": null,
  "postedAt": "2026-10-30T14:02:11.000Z",
  "firstSeen": "2026-10-31T20:24:13.603Z",
  "source": "greenhouse",
  "url": "https://boards.greenhouse.io/acmerobotics/jobs/123456",
  "description": "Acme Robotics builds warehouse robots..."
}
```

### Coverage and limits

**Measured on 31 Oct 2026:** 140,635 open jobs from 2,642 active employer boards: Greenhouse 91,584, Ashby 27,872, SmartRecruiters 20,789 and Lever 390 (Lever coverage is still thin). About 3,400 more boards were waiting to be read, so these figures will change.

- **This is not every job.** It covers employers on these four systems whose boards we have found, and the list keeps growing. Employers on Workday, Workable, iCIMS, Taleo and other systems are not included, nor are jobs posted only on job boards. Larger products cover more systems and add AI-written fields; this one is smaller and costs less.
- **Freshness.** Each board is re-read about every 20 hours, so a new job can take up to a day to appear, and a closed job can stay listed that long. Older than that, check the link.
- **Dates come from the employers.** A date can change when an employer reposts a job.
- **Company names.** Greenhouse and SmartRecruiters publish them. For Lever and Ashby the name is built from the board address, so capitals can differ, such as "Openai".
- **Large employers.** SmartRecruiters boards are read up to 1,000 jobs.
- **Repeated rows.** Identical company, title and location rows are returned once in a run. Employers often post the same role once per city, and those stay separate.

### Pricing

Pay per event: **$0.002 per job returned** ($2 per 1,000 jobs), with 10-30% off on paid Apify plans, plus a tiny start fee of $0.00005. `maxJobs` caps your cost: the default of 100 jobs costs about $0.20. Apify's free monthly credit covers a first test.

### Questions

Found a wrong field or a dead link? Open an issue on the Issues tab with the job URL. Job postings come from employers' public career site feeds; how you use them is your responsibility, including any personal data that appears in a description.

# Actor input Schema

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

Keep jobs whose title contains any of these, such as data engineer or account executive. Empty means all.

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

Drop jobs whose title contains any of these, such as senior or intern.

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

Keep jobs whose location contains any of these, such as Berlin, United Kingdom or NY. Empty means all.

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

Keep only jobs marked remote.

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

Only jobs posted in the last so many days, 1 to 365.

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

Keep jobs from companies whose name contains any of these.

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

Keep jobs whose department contains any of these, such as sales or engineering. Not every employer publishes a department.

## `sources` (type: `array`):

Limit to some systems. Empty means all.

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

Include the start of the job description. SmartRecruiters jobs have none in this tool.

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

Stop after this many jobs. You pay per job, so this also caps the cost.

## `monitorName` (type: `string`):

Give your schedule a name, and each run returns and charges only for jobs it has not returned before.

## Actor input object example

```json
{
  "titleKeywords": [
    "software engineer"
  ],
  "remoteOnly": false,
  "postedWithinDays": 7,
  "includeDescription": true,
  "maxJobs": 100
}
```

# Actor output Schema

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

One item per job.

# 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 = {
    "titleKeywords": [
        "software engineer"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("spellzcode/career-site-jobs-search").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 = { "titleKeywords": ["software engineer"] }

# Run the Actor and wait for it to finish
run = client.actor("spellzcode/career-site-jobs-search").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 '{
  "titleKeywords": [
    "software engineer"
  ]
}' |
apify call spellzcode/career-site-jobs-search --silent --output-dataset

```

## MCP server setup

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

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/ZCcEwleld9j01Xao8/builds/iScugPAgbkWGeidu0/openapi.json
