# Career Site Jobs (`trap_check/career-site-jobs`) Actor

Fresh jobs straight from 13,000+ companies' own career sites (Greenhouse, Lever, Ashby, Workday), checked daily. No job-board reposts or duplicates. Salary, remote, country and seniority fields, new-since-last-run feeds, pay per job.

- **URL**: https://apify.com/trap_check/career-site-jobs.md
- **Developed by:** [Chris O'Connor](https://apify.com/trap_check) (community)
- **Categories:** Jobs, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

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

Fresh job listings straight from companies' **own career sites**: over 13,000 hiring companies that use **Greenhouse, Lever, Ashby or Workday**. Every company is checked once a day, so you get jobs the day they go up, with no job-board reposts, no staffing-agency duplicates and no expired listings.

Over 1 million open jobs, searchable by title keywords, location, country, remote/hybrid, seniority, salary and company.

### Who it's for

- **Recruiters and sourcers**: see who is hiring for the roles you place, the day the job goes up. Find companies that just opened 10 "Account Executive" roles in London.
- **Job boards and niche job sites**: fill your board with real, direct-from-employer jobs. Schedule a daily run with **Only jobs new since my last run**.
- **Sales and market research**: hiring is a buying signal. Track which companies are hiring for which teams, and where.
- **AI agents**: clean, predictable fields, the same for every job system. Works from the Apify MCP server and API.

### Why career-site data

Most job scrapers read LinkedIn or Indeed, where the same job appears many times, often reposted by agencies, and stays up long after it's filled. Career sites are the source: when a company posts a job, it's there first, and when they close it, it's gone.

### What you get for each job

| Field | Example |
|---|---|
| `title` | Senior Data Engineer |
| `company` | Ramp |
| `location` | New York, NY; Remote (US) |
| `country` | US |
| `workplaceType` | remote, hybrid or onsite |
| `seniority` | intern, junior, senior, lead, manager, director, executive |
| `department`, `employmentType` | Engineering, Full-time |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | 189000, 240000, USD, year |
| `postedAt` | employer's posting date |
| `firstSeenAt` | when our daily check first found it |
| `url` | the job page on the employer's site (apply here) |
| `sourceAts`, `companyId`, `id` | stable ids for de-duplication |
| `descriptionText`, `descriptionHtml` | full description (optional) |

Salary is filled wherever the employer publishes it (common in Lever and Ashby, and in Greenhouse when you turn on descriptions). Country, remote and seniority are worked out from the location and title text, so a small share may be blank.

### How to use it

**All new remote engineering jobs in the US, every morning**

- Job title keywords: `software engineer`, `data engineer`
- Countries: `US`, Workplace type: Remote
- Only jobs new since my last run: on
- Schedule the Actor daily (Schedules tab) and connect it to Google Sheets, Slack, a webhook or Zapier.

**Every open job at a list of companies**

- Companies: `Stripe`, `https://jobs.lever.co/plaid`, `Ramp`
- Leave keywords empty.

**Nursing jobs posted this week in Texas**

- Keywords: `nurse`, Locations: `TX`, `Texas`, Posted in the last N days: `7`

### Pricing

You pay per job returned. Turning on full descriptions costs the same. Set a maximum charge per run in the run options to cap spend.

### Good to know

- Each company is checked about once every 24 hours, so a job appears within a day of being posted.
- `postedAt` comes from the employer. Workday only says "Posted 3 days ago", so for Workday it's accurate to the day, and "30+ days" jobs are dated 30 days back.
- With **Only jobs new since my last run**, the first run returns everything matching your filters; later runs return only jobs first seen since the previous run. Give a feed a **Feed name** if you plan to tweak its filters but keep its place.
- Keywords match job titles by default. Choose "Title, company, location and department" for a broader search.

### Feedback

Missing a company or a field you need? Open an issue in the Issues tab. New companies are added regularly.

# Actor input Schema

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

Each keyword matches job titles containing all its words, e.g. "data engineer" or "nurse". Several keywords: a job matching any of them is returned. Leave empty for all jobs.

## `searchIn` (type: `string`):

Title only (precise), or title + company + location + department (broader).

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

Text the job's location must contain, e.g. "Austin", "London", "Remote". A job matching any of them is returned.

## `countries` (type: `array`):

Two-letter country codes, e.g. US, GB, DE, IN. Worked out from each job's location.

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

Remote, hybrid or on-site, as stated by the employer or found in the location text.

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

Worked out from the job title (e.g. "Senior", "Staff", "Intern", "Director").

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

Only these companies: a name ("Stripe"), a careers page URL (https://jobs.lever.co/acme) or a company id from earlier results. Leave empty for all companies.

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

Limit to companies using these job systems. Leave empty for all four.

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

Uses the employer's posting date; when the employer gives none, the day we first saw the job.

## `onlyNewSinceLastRun` (type: `boolean`):

Schedule this Actor daily and turn this on to get only jobs that appeared since the previous run of the same search. The first run returns everything that matches.

## `feedName` (type: `string`):

Used with "Only new since my last run". Give a search a name to keep its bookmark when you edit its filters. Leave empty to track each different search separately.

## `minSalary` (type: `integer`):

Only jobs whose posted pay range reaches this amount (in the job's own currency and period). Jobs without posted pay are left out.

## `onlyWithSalary` (type: `boolean`):

Only jobs where the employer published a pay range.

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

Fetch each job's full description (text and HTML) from the employer's own job system. Slower, same price.

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

Stop after this many jobs. Newest first.

## Actor input object example

```json
{
  "keywords": [
    "software engineer"
  ],
  "searchIn": "title",
  "onlyNewSinceLastRun": false,
  "onlyWithSalary": false,
  "includeDescription": false,
  "maxResults": 1000
}
```

# Actor output Schema

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

No description

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

// Run the Actor and wait for it to finish
const run = await client.actor("trap_check/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 = { "keywords": ["software engineer"] }

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,trap_check/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/Cz07EqZ2eS9zG6prL/builds/LlfxztOyCBfqt7NtU/openapi.json
