# Workday Jobs Scraper - Search Any Workday Career Site (`cirkit/workday-jobs-scraper`) Actor

Scrape open job postings from any company's Workday career site. Server-side keyword search, then full descriptions, resolved locations, ISO country codes, employment type, requisition IDs and exact posting dates. Handles Workday's 2000-result cap without billing duplicate pages.

- **URL**: https://apify.com/cirkit/workday-jobs-scraper.md
- **Developed by:** [Crikit](https://apify.com/cirkit) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.70 / 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.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Workday Jobs Scraper - Search Any Workday Career Site

**Scrape open jobs from any company's Workday career site.** This **Workday jobs scraper** runs a server-side keyword search against the tenant, then returns full descriptions, resolved locations with ISO country codes, employment type, requisition IDs, and exact posting dates — handling Workday's 2,000-result cap along the way.

No Workday API key, no login, and no headless browser. Results land in a structured dataset you can export to JSON, CSV, Excel, or XML, or pull straight from the Apify API.

### What is Workday Jobs Scraper - Search Any Workday Career Site?

Workday Jobs Scraper - Search Any Workday Career Site is an [Apify Actor](https://apify.com/actors) that extracts open job postings from company career sites from [Workday](https://www.workday.com) and returns them as clean, structured records. Workday powers the careers site of a large share of the Fortune 500, and its postings are notoriously hard to reach because the site is a JavaScript app over a private API. This Actor talks to that API directly.

### What data can this Workday jobs scraper extract?

Every run writes one row per job posting. The full schema carries **27 fields**; the most-used ones are below.

| Field | Type | Description |
| --- | --- | --- |
| `jobId` | string | Stable identifier for the posting, and the deduplication key used within a run. This is the Workday requisition ID... |
| `requisitionId` | string | The employer's own requisition number, taken from the job detail endpoint or from the first bullet field of the... |
| `title` | string | Job title exactly as the employer published it on Workday. |
| `companySlug` | string | Workday tenant the posting came from, which is the subdomain of the career site host. For... |
| `companyName` | string | Human-readable company name. Filled in for companies in this Actor's built-in directory. Null for a career site... |
| `hiringEntity` | string | The legal entity named on the posting, which for large multinationals is the local subsidiary rather than the... |
| `location` | string | Primary location as Workday publishes it, for example "US, CA, Santa Clara" or "Israel, Yokneam". Free text set by... |
| `allLocations` | array | Every location the role is open in, primary first. Multi-site roles list each one. Needs the job detail endpoint,... |
| `locationCount` | integer | How many locations the role covers. Always populated, including when the names are unavailable: Workday's search... |
| `countryName` | string | Country of the primary location as Workday names it, for example "United States of America". From the job detail... |
| `countryCode` | string | Two-letter ISO 3166-1 alpha-2 country code for the primary location, for example US or IL. From the job detail... |
| `isRemote` | boolean | True when any of the posting's locations reads as remote, work from home or virtual. Workday publishes no... |
| `employmentType` | string | Normalized to full-time or part-time from Workday's own time type. From the job detail endpoint, so null when... |
| `postedOn` | string | Workday's own relative label, for example "Posted Today" or "Posted 30+ Days Ago". Always present on a real... |
| `postedDate` | string | Exact first-published date as YYYY-MM-DD, which is the only precise posting age Workday exposes. From the job... |
| `applicationDeadline` | string | Date the posting is scheduled to come down, as YYYY-MM-DD, where the employer sets one. Many postings have none.... |
| `daysSincePosted` | integer | Age in days parsed from Workday's relative label, so it is available even with descriptions off. Capped at 30 for... |
| `isAcceptingApplications` | boolean | Whether Workday will still accept an application for this posting. From the job detail endpoint, so null when... |
| `descriptionHtml` | string | Complete job description as the employer's own HTML, typically several thousand characters. From the job detail... |
| `descriptionText` | string | The same description rendered to plain text with paragraph breaks preserved, ready for keyword search or an LLM... |
| `jobUrl` | string | Public apply URL for the posting on the company's Workday career site. Uses the canonical URL Workday publishes on... |
| `workdayTenant` | string | Workday tenant the posting was read from. Same value as the company slug, repeated here so a row remains... |

See the **Output** tab in Apify Console for all 27 fields.

### How to scrape Workday Workday career sites

1. Open [Workday Jobs Scraper - Search Any Workday Career Site](https://apify.com/cirkit/workday-jobs-scraper) and click **Try for free**.
2. Add company slugs to `companies`, or paste Workday career URLs into `startUrls`.
3. Use `searchText` for a server-side keyword search — far cheaper than filtering afterwards.
4. Narrow further with `titleKeywords`, `locationKeywords`, `employmentTypes`, and `remoteOnly`.
5. Set `postedWithinDays` for recency and `maxItemsPerCompany` to bound each tenant.
6. Click **Start** and watch rows appear live in the **Output** tab.
7. Export the dataset as JSON, CSV, Excel, or XML — or fetch it from the [Apify API](https://docs.apify.com/api/v2) once the run finishes.

### Workday Jobs Scraper - Search Any Workday Career Site input options

| Input | Type | What it does | Default |
| --- | --- | --- | --- |
| `companies` | array | One company per line. Use a built-in slug (nvidia, salesforce, cvshealth, target, adobe, intel, disney, capitalone,... | `["nvidia", "salesforce"]` |
| `startUrls` | array | Paste full Workday career site URLs, for example https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite. This... |  |
| `searchText` | string | Keyword sent to Workday's own search, which matches the job title and the description. Because Workday does the... |  |
| `titleKeywords` | array | Keep only postings whose title contains one of these, case-insensitive. Applied after Workday returns the page, so... |  |
| `locationKeywords` | array | Keep only postings whose location, additional locations, country name or two-letter country code contains one of... |  |
| `employmentTypes` | array | Keep only these employment types. Workday publishes this only on the job detail endpoint, so this filter needs... |  |
| `remoteOnly` | boolean | Return only postings whose location text says remote, work from home or virtual. Workday publishes no dedicated... | `false` |
| `postedWithinDays` | integer | Keep only postings first published within this many days. Uses the exact posting date from the job detail endpoint... |  |
| `includeDescriptions` | boolean | On by default. Fetches each posting's detail page for the complete description as HTML and plain text, plus... | `true` |
| `maxItemsPerCompany` | integer | Cap on postings returned from any single career site. Useful when one large employer would otherwise use up the... |  |
| `maxItems` | integer | Hard cap on postings returned across every company, and the cap on what you are charged. Workday itself limits any... | `200` |

Proxy is configured through the standard `proxyConfiguration` object; the defaults shipped with this Actor are already tuned for the target site.

### Example output

```json
{
  "companies": ["nvidia", "salesforce"],
  "searchText": "engineer",
  "titleKeywords": ["senior", "staff", "principal"],
  "includeDescriptions": true,
  "maxItems": 200
}
```

### How much does it cost to scrape Workday?

This Actor runs on **pay per result** pricing: **$0.0007 per job** ($0.7 per 1,000).

| Results | Approximate cost |
| --- | --- |
| 1,000 | $0.70 |
| 10,000 | $7.00 |
| 100,000 | $70.00 |

You pay for rows you actually receive, so a search that returns nothing costs nothing beyond the start fee. Every Apify account includes free monthly usage credit, so you can trial Workday Jobs Scraper - Search Any Workday Career Site at no cost.

### What can you build with Workday data?

#### Monitor enterprise hiring at scale

Most large employers run Workday. Tracking a list of tenants gives you a hiring feed for the enterprise segment that aggregators cover poorly and late.

#### Build an enterprise-focused job board

Full descriptions, locations, and country codes arrive normalised, so aggregating dozens of tenants is a configuration exercise rather than an engineering one.

#### Track a competitor's team growth

Department and location patterns reveal where a competitor is expanding, and requisition counts show how hard.

#### Source candidates and map talent markets

Job locations across a tenant map out where a company actually has offices and headcount.

#### Feed recruitment-marketing analytics

Posting dates and `daysSincePosted` show which roles are struggling to fill — the ones worth pitching on.

### Workday scraping tips and limits

- Use `searchText` rather than pulling everything and filtering later. Workday runs it server-side, so it cuts both runtime and cost substantially.
- Workday caps a single query at 2,000 results. For very large tenants, split by `searchText` or by location to get complete coverage.
- The tenant slug is in the career-site URL, typically `<company>.wd1.myworkdayjobs.com`. `workdayTenant` and `workdaySite` on each row record what was used.
- `includeDescriptions` costs an extra request per job — turn it off for a fast openings census.

### Integrations and automation

Run Workday Jobs Scraper - Search Any Workday Career Site on a [schedule](https://docs.apify.com/platform/schedules) to keep a Workday dataset fresh, or trigger it from your own stack through the [Apify API](https://docs.apify.com/api/v2) and the official [JavaScript](https://docs.apify.com/sdk/js) and [Python](https://docs.apify.com/sdk/python) clients. Native [integrations](https://docs.apify.com/platform/integrations) push results into Google Sheets, Slack, Airtable, Zapier, Make, GitHub, or any webhook endpoint. The Actor also works as an [MCP](https://docs.apify.com/platform/integrations/mcp) tool, so an AI agent can call it directly.

### Related scrapers

| Actor | What it does |
| --- | --- |
| [ATS Job Boards Scraper - Greenhouse, Ashby, Lever](https://apify.com/cirkit/ats-job-boards-scraper) | Greenhouse, Ashby, and Lever boards in one schema. |
| [Indeed Jobs Scraper](https://apify.com/cirkit/indeed-jobs-scraper) | Indeed listings with parsed salary bands. |
| [Glassdoor Company Scraper](https://apify.com/cirkit/glassdoor-company-scraper) | Employee reviews and salary data for the same employers. |
| [Talent.com Jobs Scraper](https://apify.com/cirkit/talent-com-jobs-scraper) | Talent.com jobs across 21 country markets. |

### Frequently asked questions

#### How do I find a company's Workday career site?

It is usually linked from the company's careers page and has the form `<company>.wdN.myworkdayjobs.com/<site>`. Paste that URL into `startUrls`, or pass the company slug.

#### Can it handle Workday's 2,000-result limit?

The Actor works within that cap and reports when it is reached. To go beyond it, split the run by keyword or location so each query returns fewer than 2,000 rows.

#### Do I need a Workday API key?

No. Workday Jobs Scraper - Search Any Workday Career Site reads publicly available Workday pages and endpoints directly, so there is no key to obtain, no OAuth app to register, and no account to connect.

#### Can I export Workday data to CSV, Excel, or Google Sheets?

Yes. Every run stores results in an Apify dataset that exports to JSON, JSONL, CSV, Excel, XML, or HTML with one click, and the Google Sheets integration writes rows straight into a spreadsheet.

#### Can I run Workday Jobs Scraper - Search Any Workday Career Site on a schedule?

Yes. Apify schedules run the Actor hourly, daily, weekly, or on any cron expression, and webhooks can notify your systems the moment a run finishes.

#### Is it legal to scrape Workday?

Scraping publicly available data is broadly lawful in the US and EU, but the answer depends on what you collect and how you use it. This Actor is built to gather public job posting information companies publish on their own public career sites. Personal data carries extra obligations under GDPR and CCPA. Read Apify's guide on [whether web scraping is legal](https://blog.apify.com/is-web-scraping-legal/) and take your own legal advice for your use case.

### Support and feedback

Found a bug, a missing field, or a Workday page shape this Actor does not handle yet? Open an issue from the **Issues** tab on the Actor page. Feature requests and custom-scraper enquiries are welcome there too.

# Actor input Schema

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

One company per line. Use a built-in slug (nvidia, salesforce, cvshealth, target, adobe, intel, disney, capitalone, mastercard, abbott, pwc, hpe, autodesk, workday, redhat, zillow, paypal) or write any other company as tenant:pod:site, for example acme:wd103:AcmeCareers. Both parts come straight out of the company careers URL. For anything not listed, paste the full URL into Career site URLs instead.

## `startUrls` (type: `array`):

Paste full Workday career site URLs, for example https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite. This works for every company on Workday, not just the built-in list. A locale segment such as /en-US/ in the URL is fine. Company careers pages on their own domain normally redirect here, so follow the company's Search jobs link and copy the URL you land on.

## `searchText` (type: `string`):

Keyword sent to Workday's own search, which matches the job title and the description. Because Workday does the filtering, postings that do not match are never fetched and never charged, so this is the cheapest way to narrow a large career site. Leave empty to return every open posting.

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

Keep only postings whose title contains one of these, case-insensitive. Applied after Workday returns the page, so unlike Search keyword it does not reduce what is fetched. Use it to tighten a broad Search keyword, for example searchText "engineer" plus titleKeywords senior, staff.

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

Keep only postings whose location, additional locations, country name or two-letter country code contains one of these, case-insensitive. For example London, Remote, IL, United States. Needs Include full descriptions on for country codes and resolved location names.

## `employmentTypes` (type: `array`):

Keep only these employment types. Workday publishes this only on the job detail endpoint, so this filter needs Include full descriptions on. Postings that do not publish a type are excluded when this filter is set.

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

Return only postings whose location text says remote, work from home or virtual. Workday publishes no dedicated remote flag, so a remote role whose location reads only as a city is excluded. Needs Include full descriptions on, because the resolved location names come from the detail endpoint.

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

Keep only postings first published within this many days. Uses the exact posting date from the job detail endpoint when available and falls back to Workday's own relative label. Note that Workday labels anything older than a month as "Posted 30+ Days Ago", so with descriptions off the oldest age this can resolve is 30. Leave empty for no age filter.

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

On by default. Fetches each posting's detail page for the complete description as HTML and plain text, plus employment type, two-letter country code, country name, exact posting date, application deadline, resolved location names and the hiring legal entity. Turning it off makes a run roughly 20 times fewer requests and much faster, and does not change what you are charged, but it leaves those fields empty and disables the employment type, remote and posting age filters.

## `maxItemsPerCompany` (type: `integer`):

Cap on postings returned from any single career site. Useful when one large employer would otherwise use up the whole run: CVS Health alone publishes over 19,000 open postings. Leave empty for no per-company cap.

## `maxItems` (type: `integer`):

Hard cap on postings returned across every company, and the cap on what you are charged. Workday itself limits any single search to 2000 results per career site, so use Search keyword or run several narrower searches to go beyond that.

## `proxyConfiguration` (type: `object`):

Optional. Workday career sites have no anti-bot vendor in front of them and do not block datacenter IPs, so no proxy is needed for normal runs. Turn one on when sweeping many companies at once, which is when per-IP throttling can appear.

## Actor input object example

```json
{
  "companies": [
    "nvidia",
    "salesforce"
  ],
  "startUrls": [],
  "searchText": "software engineer",
  "titleKeywords": [],
  "locationKeywords": [],
  "employmentTypes": [],
  "remoteOnly": false,
  "includeDescriptions": true,
  "maxItems": 200,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Every job posting collected in this run, as JSON.

## `jobsCsv` (type: `string`):

The same job postings as a CSV download.

## `jobsExcel` (type: `string`):

The same job postings as an Excel workbook.

# 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": [
        "nvidia",
        "salesforce"
    ],
    "remoteOnly": false,
    "includeDescriptions": true,
    "maxItems": 200,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cirkit/workday-jobs-scraper").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": [
        "nvidia",
        "salesforce",
    ],
    "remoteOnly": False,
    "includeDescriptions": True,
    "maxItems": 200,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("cirkit/workday-jobs-scraper").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": [
    "nvidia",
    "salesforce"
  ],
  "remoteOnly": false,
  "includeDescriptions": true,
  "maxItems": 200,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call cirkit/workday-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cirkit/workday-jobs-scraper"
        }
    }
}

```

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/ueE3CkstDYQTX19cU/builds/IqoOjLV9rKaERSWL0/openapi.json
