# Career Site Jobs API — Workday, Oracle, Greenhouse & more (`viridian_layout_ea2/career-site-jobs-api`) Actor

Search 1.4M+ open roles on 7,200+ companies' own career sites in seconds: Workday, Oracle, SmartRecruiters, Greenhouse, Ashby and Lever, refreshed daily. Filter by title, location, company, remote and date.

- **URL**: https://apify.com/viridian\_layout\_ea2/career-site-jobs-api.md
- **Developed by:** [Dave Hughes](https://apify.com/viridian_layout_ea2) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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 API — Workday, Oracle, SmartRecruiters, Greenhouse, Lever, Ashby

Search **every open role on 7,200+ companies' own career sites** in seconds, not hours.
That's more than 1.4 million jobs from Workday, Oracle Recruiting Cloud, SmartRecruiters,
Greenhouse, Ashby and Lever, collected fresh every day.

Most large employers hire through Workday (NVIDIA, Salesforce, CVS, Lowe's, Morgan Stanley)
or Oracle Recruiting Cloud (JPMorgan Chase, Marriott, Kroger, Hilton, Macy's). Mid-size and
global companies use SmartRecruiters (Bosch, Domino's, Accor, AECOM); startups and scale-ups
use Greenhouse, Ashby and Lever. This Actor covers all six with one set of output fields.

| System | Jobs |
|---|---:|
| Workday | 841,000+ |
| Oracle Recruiting Cloud | 283,000+ |
| SmartRecruiters | 222,000+ |
| Greenhouse | 89,000+ |
| Ashby | 32,000+ |
| Lever | 2,900+ |

*Counts from the 27 Sep 2026 index; they change daily.*

### Why this one

- **Fast.** Every career site is collected once a day into an index, so a search
  doesn't crawl thousands of sites while you wait. A typical search finishes in 10–20 seconds.
- **Straight from the source.** Every role comes from the company's own career site, not
  a third-party job board, and the `url` is the company's own apply link.
- **Newest first.** Results are sorted by posting date, and `postedWithinDays` skips the
  old ones cheaply.
- **Nothing silently missing.** Workday hides everything past its first 2,000 results; the
  daily collection gets past that, so big employers like Dollar Tree (23,000+ roles) are
  complete.
- **Real company names** (`companyName`), plus the career-site id (`company`) for joins.
- **Pay only for what you get.** Filters run before charging.

### Pricing

**$2 per 1,000 jobs**, plus Apify's standard run-start fee. Platform usage is
included, so you are not billed for compute separately.

- **`maxJobs`** is a hard cap per run.
- **Apify's maximum cost per run** also works: if the limit is reached mid-run, the Actor
  stops cleanly and keeps everything delivered so far.

### Input

| Field | What it does |
|---|---|
| `titleKeywords` / `titleExcludeKeywords` | Case-insensitive "contains" filters on the job title. |
| `locationKeywords` | Matches any listed location or the country. |
| `companyKeywords` | Matches the company name or its career-site id. |
| `postedWithinDays` | Only recent roles. Undated roles count from the day the index first saw them. |
| `remoteOnly` | Only roles whose location or workplace label says remote. |
| `sources` | Limit to Workday, Oracle, SmartRecruiters, Greenhouse, Ashby and/or Lever. |
| `includeDescription` | Adds the full description as plain text. |
| `maxJobs` / `maxJobsPerCompany` | Caps on results, and your cost control. |

### Output

| Field | Description |
|---|---|
| `id` | Stable identifier |
| `title` | Role title |
| `companyName` / `company` | Company name, and its career-site id |
| `location` / `additionalLocations` / `country` | Every listed location (country where the site publishes it) |
| `remote` / `remoteEligible` / `workplaceType` | Remote signals, and the company's own workplace label where published |
| `department` | Team or job category |
| `postedAt` | When the company posted the role |
| `firstSeenAt` | When the index first saw it. A reliable "new since" signal, even for undated roles |
| `employmentType` | Full time, part time, contract… where published |
| `url` | Apply link on the company's own career site |
| `description` | Plain-text description (optional) |
| `ats` | `workday`, `oracle`, `smartrecruiters`, `greenhouse`, `ashby` or `lever` |
| `indexedAt` | When the index this run read was built |

The field names match our [Workday](https://apify.com/viridian_layout_ea2/workday-jobs-scraper)
and [Greenhouse / Ashby / Lever](https://apify.com/viridian_layout_ea2/company-career-site-jobs)
Actors, which fetch a company's jobs live when you need the very latest.

### Examples

**Data engineers in Texas, last 7 days**

```json
{ "titleKeywords": ["data engineer"], "locationKeywords": ["Texas", "TX"], "postedWithinDays": 7 }
```

**Every new remote role in the last day, titles and links only**

```json
{ "remoteOnly": true, "postedWithinDays": 1, "includeDescription": false, "maxJobs": 20000 }
```

**Everything two companies have open**

```json
{ "companyKeywords": ["Morgan Stanley", "Stripe"], "maxJobs": 10000 }
```

### Notes

- The index is rebuilt once a day. The run's `SUMMARY` record and every job's `indexedAt`
  say exactly when. For a single company's roles to the minute, use the live Actors
  linked above.
- Roles disappear from the index within a few days of the company closing them.

# Actor input Schema

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

Only roles whose title contains one of these (case-insensitive), e.g. "data engineer", "nurse".

## `titleExcludeKeywords` (type: `array`):

Drop roles whose title contains any of these, e.g. "intern", "senior".

## `locationKeywords` (type: `array`):

Only roles where any listed location (or the country) contains one of these, e.g. "Texas", "London", "Germany". Multi-location roles match on every location.

## `companyKeywords` (type: `array`):

Only these companies — matches the company name or its career-site id, e.g. "Morgan Stanley", "stripe".

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

Only roles posted in the last N days. Roles without a posting date count from the day our index first saw them.

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

Only roles whose location or workplace label says remote.

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

Limit to some systems. Leave empty for all.

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

Turn off for a smaller, faster dataset with titles, locations and links only.

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

Hard cap on results, and your main cost control — you are charged per job returned. Newest roles come first.

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

Optional cap per company, so one big employer does not fill the whole result.

## Actor input object example

```json
{
  "titleKeywords": [
    "data engineer"
  ],
  "titleExcludeKeywords": [],
  "locationKeywords": [],
  "companyKeywords": [],
  "postedWithinDays": 7,
  "remoteOnly": false,
  "sources": [],
  "includeDescription": true,
  "maxJobs": 1000
}
```

# Actor output Schema

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

Every job delivered, newest first: title, company, locations, posting date, apply URL, and (optionally) the description.

## `summary` (type: `string`):

Jobs returned, why the run stopped, and when the index was built.

# 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": [
        "data engineer"
    ],
    "postedWithinDays": 7
};

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

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,viridian_layout_ea2/career-site-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/oDFG9ptBmIy6QjQDZ/builds/5d7FDiNqgTCfDtEqr/openapi.json
