# Workday Jobs API — Europe: jobs from any Workday career site (`benelux-signals/workday-jobs-api-europe`) Actor

Job postings from any public Workday career site (myworkdayjobs.com) as clean JSON: Philips, Shell, ING, Airbus, Novartis and more. 37 verified European seed employers, EU country filter, posted-within-days, only-new-jobs mode. From $0.001/job.

- **URL**: https://apify.com/benelux-signals/workday-jobs-api-europe.md
- **Developed by:** [Benelux Signals](https://apify.com/benelux-signals) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 job postings

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

## Workday Jobs API — Europe: Scrape Jobs from Any Workday Career Site (myworkdayjobs.com)

**Get job postings straight from Workday career sites for $0.0015 per job.** Paste any `myworkdayjobs.com` career-site URL, or switch on the built-in list of **37 verified large European employers** (Philips, Shell, ING, NXP, Airbus, Novartis, Roche, Deutsche Bank, Unilever, Maersk, LEGO and more). The Actor reads the same public Workday job API that powers each company's own careers page and returns one clean, normalised and deduplicated record per job: title, company, legal entity, location(s), country, remote/hybrid/on-site, employment type, exact posting date, closing date, apply link and the full description as plain text.

There are no logins, no proxies and no browser: it only collects what anyone can see on the public careers page. It is fast (about 10–15 jobs per second per site), polite (robots.txt checked, 4 requests at a time per site) and cheap. Career sites that cannot be read show up as a free error row and are **never charged**.

### Who is this Workday jobs scraper for?

- **Recruiters, staffing and executive-search agencies** who track which large employers are hiring which roles in the Netherlands, Belgium, Germany, the UK or anywhere else in Europe.
- **Sales and business-development teams** who use hiring as a buying signal: a corporate opening 15 data-engineering jobs in Amsterdam needs data tools and consultants.
- **Job boards, niche job sites and newsletters** that want direct-from-employer jobs from enterprise companies, refreshed daily with the **only new jobs** mode.
- **HR-tech, labour-market researchers and analysts** who need structured vacancy data per company, country and contract type.
- **AI agents and MCP clients**: every input has a safe default, so a call with just one `careerSiteUrls` entry works.

### What does the Workday Jobs API do?

1. **Understands any Workday career-site URL**: `https://philips.wd3.myworkdayjobs.com/en-US/jobs-and-careers`, `https://shell.wd3.myworkdayjobs.com/ShellCareers`, a job link (`…/job/Eindhoven/…_12345`), `https://wd3.myworkdaysite.com/recruiting/<company>/<site>` or the shorthand `philips/wd3/jobs-and-careers`. Filters in the URL (for example `?locationCountry=…` or `?q=…`) are kept.
2. **Searches each site** through Workday's public job search (20 jobs per request), with your search text and, when the site offers one, **Workday's own country filter**, so a country search on a site with 2,000 jobs only reads the jobs in that country.
3. **Opens each matching job** to get the exact posting date, country, time type, remote type, legal entity, additional locations and description.
4. **Normalises everything**: ISO country codes, regions (`EUROPE`), `remote` / `hybrid` / `onsite`, `full-time` / `part-time` / `contract` / `internship` / `temporary`, ISO 8601 dates, plain-text descriptions with e-mail addresses removed.
5. **Filters** on search text, title keywords, excluded words, countries (including `EU`, `Benelux`, `DACH`, `Nordics`), location text, workplace type, employment type and posting age.
6. **Deduplicates** across the whole run (multi-country jobs are listed once) and, in **only new jobs** mode, skips jobs you already received in earlier runs. Skipped jobs are free.

#### Built-in seed list: 37 European employers on Workday (verified October 2026)

| Region | Employers |
|---|---|
| Benelux | Philips, ING, NXP Semiconductors, Wolters Kluwer, AB InBev Europe |
| UK & Ireland | Shell, RELX, Unilever, AstraZeneca, GSK, Barclays, LSEG, Diageo, Rolls-Royce, Aviva |
| France | Airbus, Sanofi, Valeo, Pernod Ricard |
| Germany | Deutsche Bank, Evonik, Covestro, Heidelberg Materials, Zalando |
| Switzerland | Novartis, Roche, Lonza, Julius Baer, Logitech |
| Spain | Santander, Ferrovial, Iberdrola |
| Nordics | Maersk, LEGO Group, Electrolux, KONE, UPM |

Turn on **Add the built-in European employer list**, optionally narrow it with **Seed list: only employers headquartered in** (for example `NL`, `BE`), and add your own Workday URLs. Together these sites list more than 25,000 open jobs.

### How to use it

1. Open the Actor and paste one or more Workday career-site URLs (or turn on the seed list).
2. Set filters: for example **Countries** `Benelux`, **Search text** `engineer`, **Posted within** `7` days.
3. Set **Max results** (your cost cap) and click **Start**.
4. Download the results as JSON, CSV, Excel or HTML, or get them through the Apify API, webhooks, Zapier, Make or n8n.
5. For a daily feed, schedule the run with **Only new jobs since the last run** turned on.

#### How do I find a company's Workday URL?

Open any job on the company's careers page. If the address contains `myworkdayjobs.com`, copy the part up to the site name, for example `https://nxp.wd3.myworkdayjobs.com/careers`. Search engines also work: `site:myworkdayjobs.com "company name"`.

#### Input example

```json
{
    "careerSiteUrls": [
        "https://philips.wd3.myworkdayjobs.com/en-US/jobs-and-careers",
        "https://ing.wd3.myworkdayjobs.com/ICSGBLCOR"
    ],
    "useSeedList": false,
    "searchText": "",
    "countries": ["Benelux"],
    "postedWithinDays": 14,
    "includeDescription": true,
    "onlyNewJobs": false,
    "maxResults": 200,
    "maxResultsPerCompany": 0
}
```

| Field | What it does | Default |
|---|---|---|
| `careerSiteUrls` | Workday career sites, one per line | Philips example |
| `useSeedList` | Add the 37 built-in European employers | `false` |
| `seedHqCountries` | Only seed employers headquartered in these countries | all |
| `searchText` | Workday's own search (title, description, req ID) | empty |
| `keywords` / `excludeKeywords` | Title must / must not contain | empty |
| `countries` | ISO codes, names, `EU`, `Benelux`, `DACH`, `Nordics` | worldwide |
| `locations` | Location text contains, e.g. `Eindhoven` | empty |
| `workplace` | `any`, `remote`, `remote-or-hybrid`, `hybrid`, `onsite` | `any` |
| `employmentTypes` | `full-time`, `part-time`, `contract`, `internship`, `temporary` | all |
| `postedWithinDays` | Only jobs posted in the last N days (0 = any) | `0` |
| `includeDescription` | Add the full description as text | `true` |
| `onlyNewJobs` / `stateKey` | Incremental mode for schedules | `false` / `default` |
| `maxResults` / `maxResultsPerCompany` | Cost caps | `200` / `0` |
| `maxConcurrency` | Career sites read in parallel | `3` |

#### Output example

```json
{
    "status": "ok",
    "charged": true,
    "jobId": "workday:philips:593371",
    "reqId": "593371",
    "company": "Philips",
    "legalEntity": "NL40 CL Netherlands Drachten DPC",
    "tenant": "philips",
    "careerSite": "https://philips.wd3.myworkdayjobs.com/jobs-and-careers",
    "title": "Process Operator - Philips - Drachten",
    "location": "Drachten",
    "additionalLocations": [],
    "city": "Drachten",
    "country": "NL",
    "countryName": "Netherlands",
    "countries": ["NL"],
    "regions": ["EUROPE"],
    "remote": null,
    "workplaceType": null,
    "remoteTypeRaw": null,
    "employmentType": "full-time",
    "employmentTypeRaw": "Full time",
    "postedAt": "2026-10-27T00:00:00.000Z",
    "postedText": "Posted Today",
    "validThrough": "2026-11-24T00:00:00.000Z",
    "jobUrl": "https://philips.wd3.myworkdayjobs.com/jobs-and-careers/job/Drachten/Process-Operator---Philips---Drachten_593371",
    "applyUrl": "https://philips.wd3.myworkdayjobs.com/jobs-and-careers/job/Drachten/Process-Operator---Philips---Drachten_593371/apply",
    "description": "Job Title\nProcess Operator - Philips - Drachten\n\nJob Description\n...",
    "isNew": null,
    "input": "https://philips.wd3.myworkdayjobs.com/en-US/jobs-and-careers",
    "source": "input",
    "scrapedAt": "2026-10-27T09:15:00.000Z"
}
```

The field names match our [EU Career Site Jobs API](https://apify.com/benelux-signals/eu-career-site-jobs-api) (Greenhouse, Lever, Recruitee, Personio, Ashby…), so you can merge both datasets into one jobs table.

#### Status values

- `ok`: a job posting (charged).
- `error`: a career site could not be read, for example a wrong site name or robots.txt disallows it (free).
- `no_results`: nothing matched your filters, or there were no new jobs since the last run (free).

#### Run summary

Every run stores `RUN_SUMMARY` in the default key-value store: jobs saved, events charged, `maxResultsReached`, `chargeLimitReached`, jobs already delivered earlier, duplicates removed, filtered-out counts per filter and per-site statistics (jobs on site, listed, details fetched, saved, errors).

### Speed

About 10–15 jobs per second per career site, 3 sites in parallel by default. 200 jobs take under a minute; the whole 37-company seed list with `maxResultsPerCompany: 50` takes a few minutes. The default memory of 256 MB is enough.

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

This Actor uses **pay per event**: **$0.0015 per job** on the Free plan, cheaper on paid plans, with platform usage included. Error rows, `no_results` rows, duplicates, filtered-out jobs and jobs skipped by **only new jobs** are free.

| Event | Free plan | Bronze | Silver | Gold and up |
|---|---|---|---|---|
| Job posting | $0.0015 | $0.0013 | $0.0011 | $0.001 |
| Actor start (per run) | $0.005 | | | |

#### Cost table (Free plan prices)

| What you collect | Jobs | Cost |
|---|---|---|
| A quick check of one company | 25 | $0.043 |
| Default run | 200 | $0.305 |
| Daily new jobs from all 37 seed employers | ~300 per day | ~$0.46 per day |
| 10,000 jobs | 10,000 | $15.005 |

**Bill-shock protection:**

- A run never saves more than `maxResults` jobs (default 200, so at most **$0.305 per run** on the Free plan).
- It stops cleanly at your *maximum cost per run*: `RUN_SUMMARY.chargeLimitReached` is set and sites that were skipped are listed in `companiesNotProcessed`.
- Use `maxResultsPerCompany` so one large employer cannot use up the whole budget.

### FAQ

#### Does it work for any company on Workday, not just the seed list?

Yes. Any public Workday career site works (`*.wd1`, `wd3`, `wd5`, `wd103`… `.myworkdayjobs.com` and `myworkdaysite.com`), anywhere in the world. The seed list is just a verified starting point for Europe.

#### Why can't I get more than 2,000 jobs from one site?

Workday's search returns at most 2,000 postings per query. For very large employers (Airbus, for example), add a **Countries** filter or **Search text**; each country is a separate, smaller search.

#### Why is `workplaceType` sometimes empty?

Not every employer fills Workday's remote-type field. When it is missing we only mark a job remote or hybrid if the title or location says so; otherwise the value stays `null` (unknown). The `remote` filters only keep jobs with a known type.

#### How does "only new jobs" work?

The Actor remembers the IDs of the jobs it delivered under your **State key** in the named key-value store `workday-jobs-api-state` in your own Apify account (kept for 180 days). The next run skips those jobs before opening them, so they cost nothing. Use a different state key for each schedule.

#### Can I use it from an AI agent or automation?

Yes. All inputs have defaults, the output is flat JSON, and runs finish in seconds for small requests. It works with the Apify MCP server, the API, Zapier, Make and n8n.

### Is it legal to scrape Workday career sites?

The Actor only reads public job postings that employers publish so they can be found and shared, through the same public endpoints their careers page uses. It does not log in, does not bypass any protection, checks each site's robots.txt and skips sites that disallow it, keeps request rates low and removes e-mail addresses from descriptions. Job postings are business information, but descriptions can be copyrighted: if you republish them, link back to the `applyUrl` and respect each employer's terms. If you process personal data (for example a recruiter's name in a description), you are responsible for complying with GDPR.

Workday is a trademark of Workday, Inc. Company names are trademarks of their respective owners. This Actor is an independent tool by benelux-signals and is not affiliated with, endorsed by or sponsored by Workday or by the employers whose jobs it reads.

### Related actors by benelux-signals

- **[EU Career Site Jobs API](https://apify.com/benelux-signals/eu-career-site-jobs-api)**: the same job schema for Greenhouse, Lever, Recruitee, Workable, Personio, Ashby and SmartRecruiters career sites.
- **EU & Dutch News Monitor**: news from European and Dutch RSS feeds, filtered by keyword.
- **EU Tender Radar**: new public tenders from TED and TenderNed.
- **Benelux Trade Fair Exhibitors**: exhibitor lists from Dutch and Belgian trade fairs.
- **Bulk PageSpeed & SEO Audit**: Core Web Vitals, Lighthouse and on-page SEO for many URLs.

# Actor input Schema

## `careerSiteUrls` (type: `array`):

One Workday career site per line, e.g. https://philips.wd3.myworkdayjobs.com/en-US/jobs-and-careers. Formats: https://<company>.wdN.myworkdayjobs.com/\[locale/]<site>, https://wdN.myworkdaysite.com/recruiting/<company>/<site>, or the shorthand company/wdN/site. Filters in the URL (?locationCountry=…, ?q=…) are kept. Tip: open any job on a company's careers page; if the link contains "myworkdayjobs.com", paste the part up to the site name. The example site is dropped automatically when you turn on the seed list.

## `useSeedList` (type: `boolean`):

Adds our verified list of 37 large European employers on Workday: Philips, Shell, ING, NXP, Wolters Kluwer, RELX, Unilever, AB InBev, Airbus, Sanofi, Valeo, Deutsche Bank, Zalando, Novartis, Roche, AstraZeneca, GSK, Barclays, Santander, Maersk, LEGO, KONE and more. Combine with Max results per company.

## `seedHqCountries` (type: `array`):

Optional. Limit the seed list to employers headquartered in these countries (ISO codes or names, or Benelux / DACH / Nordics), e.g. NL, BE. This does not filter job locations; use Countries below for that.

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

Passed to each site's own Workday search (searches title, description and requisition ID), e.g. data engineer. Leave empty for all jobs.

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

Keep only jobs whose title contains at least one of these words (case-insensitive). Applied before the detail request, so it saves time.

## `excludeKeywords` (type: `array`):

Drop jobs whose title contains any of these words, e.g. intern, senior.

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

Keep only jobs in these countries: ISO codes (NL, DE), names (Netherlands) or groups EU / Europe, Benelux, DACH, Nordics. Uses the site's own country filter when it has one (fast), otherwise the job's location. Empty = worldwide.

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

Keep only jobs whose location (any of its locations) contains one of these texts, e.g. Amsterdam, Eindhoven.

## `workplace` (type: `string`):

Filter on the Workday remote type (Remote / Hybrid / On-site). Jobs without a remote type are treated as unknown and only kept for Any.

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

Keep only these types (from the Workday time type). Empty = all.

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

Keep only jobs posted in the last N days (0 = any age). Uses the exact posting date from the job page.

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

Adds the full job description as plain text (emails removed). Turn off for smaller output; the price per job is the same.

## `onlyNewJobs` (type: `boolean`):

Incremental mode for scheduled runs: jobs already delivered in earlier runs with the same State key are skipped (free). The first run returns everything and remembers it. State is kept in the named key-value store workday-jobs-api-state in your account (180 days).

## `stateKey` (type: `string`):

Name of the memory used by only-new mode. Use a different key per schedule or search, e.g. benelux-engineers.

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

Stop after this many job postings in total (you pay per saved job). Each Workday search returns at most 2,000 jobs per site; use Countries or Search text to reach the rest.

## `maxResultsPerCompany` (type: `integer`):

Optional cap per career site (0 = no cap). Useful with the seed list.

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

How many career sites are read at the same time (each site is read politely, 4 requests at a time).

## Actor input object example

```json
{
  "careerSiteUrls": [
    "https://philips.wd3.myworkdayjobs.com/en-US/jobs-and-careers",
    "https://shell.wd3.myworkdayjobs.com/ShellCareers",
    "https://ing.wd3.myworkdayjobs.com/ICSGBLCOR",
    "nxp/wd3/careers"
  ],
  "useSeedList": false,
  "seedHqCountries": [
    "NL",
    "BE"
  ],
  "searchText": "engineer",
  "keywords": [
    "engineer",
    "developer"
  ],
  "excludeKeywords": [
    "intern"
  ],
  "countries": [
    "EU"
  ],
  "locations": [
    "Amsterdam",
    "Eindhoven"
  ],
  "workplace": "any",
  "employmentTypes": [],
  "postedWithinDays": 0,
  "includeDescription": true,
  "onlyNewJobs": false,
  "stateKey": "default",
  "maxResults": 50,
  "maxResultsPerCompany": 0,
  "maxConcurrency": 3
}
```

# Actor output Schema

## `overview` (type: `string`):

All job postings in the 'overview' table view (company, title, location, country, workplace, employment type, posted date, apply URL).

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

JSON summary (jobs saved, charged count, per-site stats, filtered-out counts, already-seen and duplicate counts, chargeLimitReached and maxResultsReached flags) stored under RUN_SUMMARY.

# 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 = {
    "careerSiteUrls": [
        "https://philips.wd3.myworkdayjobs.com/en-US/jobs-and-careers"
    ],
    "searchText": "",
    "countries": [],
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("benelux-signals/workday-jobs-api-europe").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 = {
    "careerSiteUrls": ["https://philips.wd3.myworkdayjobs.com/en-US/jobs-and-careers"],
    "searchText": "",
    "countries": [],
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("benelux-signals/workday-jobs-api-europe").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 '{
  "careerSiteUrls": [
    "https://philips.wd3.myworkdayjobs.com/en-US/jobs-and-careers"
  ],
  "searchText": "",
  "countries": [],
  "maxResults": 50
}' |
apify call benelux-signals/workday-jobs-api-europe --silent --output-dataset

```

## MCP server setup

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

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/YKT4iptef80pf7dBH/builds/GbKZJBTrN0kudjxnM/openapi.json
