# Career Site Jobs by Company Name – Workday, Greenhouse, Lever (`pharaoh_data/career-site-jobs-finder`) Actor

Type company names (or domains) and get all their jobs. The Actor finds each company's Workday, Greenhouse, Lever, Ashby, or Workable career board for you, filters by country and title, and tracks new, updated, and closed jobs between runs.

- **URL**: https://apify.com/pharaoh_data/career-site-jobs-finder.md
- **Developed by:** [Pharaoh Data](https://apify.com/pharaoh_data) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 job results

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 by Company Name – Workday, Greenhouse, Lever

### Type company names, get every job they post

Most job scrapers need the exact board URL for every company. This one starts from **company names or domains**: `Stripe`, `figma.com`, `Salesforce`. It finds each company's public job board on **Workday, Greenhouse, Lever, Ashby, or Workable**, then returns every job in one schema with **titles, locations, ISO country codes, departments, salaries when published, posting dates, apply links, and descriptions**.

Turn on change tracking and every scheduled run labels jobs **new, updated, or closed**. You get a hiring feed for a list of target companies without looking up a single careers page.

**Built for:**

- **B2B sales and account-based marketing**: watch your target accounts and act when they start hiring for the team you sell to.
- **Recruiters and talent-intelligence teams**: track openings and closures at the companies you hire from or for.
- **Job boards and newsletters**: fill a niche board from a curated employer list, for example fintechs hiring in the UAE.
- **Analysts and investors**: compare hiring velocity across a portfolio or a competitor set.

### What makes it different

|                                   |                                                                                                                                                                                                                                                                                                                         |
| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Names in, boards found**        | Each name is tried against the five systems' public job APIs. Greenhouse and Workable boards publish the company name, so a match is **verified**. Workday sites are found from the career host itself, and when a company has several Workday sites, the one with the most jobs is used.                               |
| **Honest matching**               | A board is used only when it publishes the same company name, or when its board name equals the company's full name. Look-alikes, such as a board that publishes another company's name, are listed as **candidates** in `COMPANY_BOARDS` and are not scraped. Empty placeholder boards are skipped.                    |
| **One schema for five systems**   | Workday, Greenhouse, Lever, Ashby, and Workable jobs share one record shape and one stable `jobId`, so you can merge, deduplicate, and diff them.                                                                                                                                                                       |
| **Countries that are right**      | You can enter `Germany`, `AE`, or `"Saudi Arabia"`. Locations are read as countries even when they only name a state, a city, or a code, such as "San Francisco, CA" (US), "Vancouver, CA" (Canada), "Dubai", or "US-Remote". On Workday, the site's own location filter is used, so only matching jobs are downloaded. |
| **New, updated, and closed jobs** | Each job is labelled against the previous run of the same monitor. Closed jobs are reported only when a board was read in full, so a cut-off run never produces false closures.                                                                                                                                         |
| **Polite and compliant**          | Public JSON endpoints only, with no logins and no proxies. robots.txt is checked for every host, and requests to each host are rate-limited. Contact details inside descriptions are redacted by default.                                                                                                               |

### Quick start

1. Enter company names, domains, or job board URLs under **Companies**.
2. Optionally add **Countries**, **Job titles**, **Locations**, or **Keywords**.
3. Run. Open the **Boards found per company** output to see which board was used for each company and how sure the match is.
4. To monitor, save the run as a task with a schedule (for example daily) and set **Output** to **Changes only**.

```json
{
    "companies": ["Stripe", "figma.com", "Salesforce", "Careem", "https://jobs.lever.co/palantir"],
    "countries": ["United Arab Emirates", "Saudi Arabia", "GB"],
    "jobTitles": [],
    "keywords": [],
    "postedWithinDays": 0,
    "maxJobsPerCompany": 500,
    "includeDescriptions": true,
    "trackChanges": true,
    "outputMode": "changes",
    "monitorId": "target-accounts-gulf-uk"
}
```

**Companies** accepts three kinds of entries:

| Entry                    | Example                                                                                           | What happens                                                                          |
| ------------------------ | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
| Company name             | `Stripe`, `Palo Alto Networks`                                                                    | Board names are tried on all five systems; legal suffixes such as "Inc." are ignored. |
| Company domain           | `figma.com`, `careem.com`                                                                         | The domain's name ("figma") is tried.                                                 |
| Job board or Workday URL | `https://jobs.lever.co/palantir`, `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite` | Used directly, with no search. Use this when you already know the board.              |

### Output

Each dataset item is one job:

```json
{
    "jobId": "ashby:example:1f0c9a52-6d1e-4b8e-9c55-0a2b3c4d5e01",
    "company": "Example",
    "provider": "ashby",
    "boardUrl": "https://jobs.ashbyhq.com/example",
    "title": "Backend Engineer, Payments",
    "location": "Dubai",
    "locations": ["Dubai"],
    "country": "AE",
    "countryName": "United Arab Emirates",
    "countries": ["AE"],
    "workplaceType": "onsite",
    "department": "Engineering / Payments Platform",
    "employmentType": "Full-time",
    "salary": "AED 25K - 35K",
    "salaryRange": { "min": 25000, "max": 35000, "currency": "AED", "interval": "month" },
    "postedAt": "2026-10-02T09:15:00.000Z",
    "jobUrl": "https://jobs.ashbyhq.com/example/1f0c9a52-6d1e-4b8e-9c55-0a2b3c4d5e01",
    "applyUrl": "https://jobs.ashbyhq.com/example/1f0c9a52-6d1e-4b8e-9c55-0a2b3c4d5e01/application",
    "description": "Build our payments platform. Questions? Email [email removed] or call [phone removed]. …",
    "scrapedAt": "2026-10-18T09:00:00.000Z",
    "changeType": "new",
    "changedFields": [],
    "firstSeenAt": "2026-10-18T09:00:00.000Z",
    "lastSeenAt": "2026-10-18T09:00:00.000Z",
    "closedAt": null
}
```

The default key-value store also holds two records:

- **`COMPANY_BOARDS`**: for every entry, the boards used (system, URL, published board name, and confidence: `verified`, `likely`, or `check`), the **candidates** that were found but not used, and a status of `found`, `not-found`, or `invalid`.
- **`RUN_SUMMARY`**: for every board, its status and any error, the jobs on the board, how many were listed, whether the listing was complete, and the matching, saved, new, updated, and closed counts, with a breakdown by country.

### Use it from code, n8n, Make, or an AI agent

```bash
curl -X POST "https://api.apify.com/v2/acts/pharaoh_data~career-site-jobs-finder/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"companies":["Stripe","Figma","Salesforce"],"countries":["GB"],"outputMode":"changes","monitorId":"uk-targets"}'
```

```python
import os

from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("pharaoh_data/career-site-jobs-finder").call(run_input={
    "companies": ["Careem", "Tamara", "Foodics", "Salesforce"],
    "countries": ["SA", "AE"],
    "outputMode": "changes",
})
new_jobs = [job for job in client.dataset(run["defaultDatasetId"]).iterate_items() if job["changeType"] == "new"]
boards = client.key_value_store(run["defaultKeyValueStoreId"]).get_record("COMPANY_BOARDS")["value"]
```

- **Alerts:** schedule a task, then add a webhook or the Slack, email, or Google Sheets integration on "Run succeeded".
- **AI agents (MCP):** `https://mcp.apify.com/?actors=pharaoh_data/career-site-jobs-finder`

### Limits and good to know

- **Five systems only.** Companies that use another applicant-tracking system or their own careers site can't be found by name. They show as `not-found` in `COMPANY_BOARDS` and in the run log. In our tests, well-known tech companies were usually found. Many Gulf and enterprise employers use other systems.
- **Name matching isn't perfect.** Check the confidence in `COMPANY_BOARDS`. `verified` means the board publishes the company's name. `likely` means the board name equals the company's full name, but the board doesn't publish a name to compare. For short or common names, paste the board URL instead.
- **When a company has boards on several systems**, the verified ones are used. A Workday site named exactly like the company is also used, because Workday sites belong to company accounts. Unconfirmed boards are listed as candidates.
- **Board lookups are remembered for 30 days** in your account's named key-value store `career-site-jobs-finder-boards`. A company with no board found is looked up again after 3 days. Turn on **Search for boards again** to refresh now.
- **Workday returns at most 2,000 jobs per search.** For bigger employers, add **Countries**; a cut-off Workday listing never reports closures. Workday descriptions need one request per job, so the first full run of a large site takes a few minutes. "Changes only" mode keeps later runs short.
- **`maxJobsPerCompany`** limits saved jobs per board after filters. Greenhouse, Lever, Ashby, and Workable boards are always read whole, so filters see every job.
- The Actor uses the public job-board endpoints that these career pages load. Each board's errors are reported in `RUN_SUMMARY`, and the other boards still run. Use the data in line with each employer's terms and applicable law. Descriptions are employer content; contact details in them are redacted by default.

### Pricing

Pay per event: you pay per **saved job record** (including closed-job records), plus Apify's small Actor start event. Looking up boards, companies with no board, and jobs that don't match your filters are free. If the Pricing tab lists a **Job change** event, records saved in "Changes only" mode are billed at that price. See the **Pricing** tab for current amounts.

### FAQ

**Why wasn't my company found?**
It probably uses another system or its own careers site, or its board uses a different name, such as "acmehq" instead of "acme". Open a job on the company's careers page. If the address is on `greenhouse.io`, `lever.co`, `ashbyhq.com`, `workable.com`, or `myworkdayjobs.com`, paste that board URL instead of the name.

**A board was listed as a candidate. Is it the right company?**
Maybe. Candidates were found under the company's name but publish a different name, or they compete with a verified board. Open the URL; if it's right, paste it as an entry.

**Can I get a company's Workday internship or graduate site?**
Yes. `COMPANY_BOARDS` lists the company's other Workday sites under `otherSites`. Paste that site's URL, for example `https://company.wd5.myworkdayjobs.com/Campus`.

**What counts as a closed job?**
A job saved by this monitor in an earlier run that is no longer on a board that was read in full. Its last known details are saved again with `changeType: "closed"` and `closedAt`.

# Actor input Schema

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

Company names (Stripe), domains (figma.com), or job board URLs (https://jobs.lever.co/palantir, https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite). Up to 100. Names are matched to public Greenhouse, Lever, Ashby, Workable, and Workday boards; see COMPANY_BOARDS for what was found.

## `providers` (type: `array`):

Where to look for each company's board. Leave empty to search all five.

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

Keep jobs in these countries (names or ISO codes, such as US, Germany, "United Arab Emirates"). Leave empty for all.

## `jobTitles` (type: `array`):

Optional phrases to match in job titles, such as "engineer" or "account executive".

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

Optional city or region terms, such as London, Remote, or Dubai.

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

Optional terms to match in title, description, department, or location.

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

Keep jobs posted within this many days. 0 disables the filter.

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

Maximum matching jobs saved from each company board. Greenhouse, Lever, Ashby, and Workable boards are read whole and then filtered; Workday sites are listed until this many jobs may match.

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

Maximum job records saved per run, including closed-job records. Each record is one billable result.

## `includeDescriptions` (type: `boolean`):

Include plain-text descriptions. Workday descriptions need one extra request per job; in "Changes only" mode only new and updated jobs are read.

## `trackChanges` (type: `boolean`):

Label jobs new, updated, or unchanged, and report removed jobs as closed. History is kept in your account's named key-value store career-site-jobs-finder-state.

## `outputMode` (type: `string`):

"All current jobs" saves every matching job. "Changes only" saves new, updated, and closed jobs for alerts.

## `includeClosed` (type: `boolean`):

Save a record with changeType "closed" when a previously saved job is no longer listed on a fully read board.

## `monitorId` (type: `string`):

Optional name for this monitor's history. When empty, it is derived from the companies, systems, and countries.

## `redactContactDetails` (type: `boolean`):

Remove email addresses, phone numbers, and personal LinkedIn links from descriptions.

## `refreshDiscovery` (type: `boolean`):

Ignore boards remembered from earlier runs (kept for 30 days in the named store career-site-jobs-finder-boards) and search again.

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

How many companies or boards to process at once (1–5). Requests to one host stay rate-limited.

## Actor input object example

```json
{
  "companies": [
    "Stripe",
    "figma.com",
    "Salesforce",
    "https://jobs.lever.co/palantir"
  ],
  "providers": [],
  "countries": [
    "United Kingdom",
    "United Arab Emirates"
  ],
  "jobTitles": [],
  "locations": [],
  "keywords": [],
  "postedWithinDays": 0,
  "maxJobsPerCompany": 25,
  "maxResults": 100,
  "includeDescriptions": true,
  "trackChanges": true,
  "outputMode": "all",
  "includeClosed": true,
  "monitorId": "",
  "redactContactDetails": true,
  "refreshDiscovery": false,
  "maxConcurrency": 3
}
```

# Actor output Schema

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

Dataset of job records with change status.

## `companyBoards` (type: `string`):

For each input: the boards used, with system, URL, and match confidence, plus candidates that may belong to another company.

## `runSummary` (type: `string`):

Per-board totals: jobs on board, listed, matching, saved, new, updated, closed, by country.

# 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",
        "figma.com",
        "Salesforce",
        "https://jobs.lever.co/palantir"
    ],
    "countries": [
        "United Kingdom",
        "United Arab Emirates"
    ],
    "maxJobsPerCompany": 25,
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("pharaoh_data/career-site-jobs-finder").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",
        "figma.com",
        "Salesforce",
        "https://jobs.lever.co/palantir",
    ],
    "countries": [
        "United Kingdom",
        "United Arab Emirates",
    ],
    "maxJobsPerCompany": 25,
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("pharaoh_data/career-site-jobs-finder").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",
    "figma.com",
    "Salesforce",
    "https://jobs.lever.co/palantir"
  ],
  "countries": [
    "United Kingdom",
    "United Arab Emirates"
  ],
  "maxJobsPerCompany": 25,
  "maxResults": 100
}' |
apify call pharaoh_data/career-site-jobs-finder --silent --output-dataset

```

## MCP server setup

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

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/EfafLrW9ZF2GIXRhf/builds/PrNo12SVmvvxiNQAu/openapi.json
