# Workday Jobs Scraper 💼 (any career site, full descriptions) (`tagadanar/workday-jobs-scraper`) Actor

Jobs from any company career site hosted on Workday (myworkdayjobs.com): title, all locations, country, remote type, time type, exact posted date and the full description. Filter by keyword, location, category, remote and posted-within days. No API key, no login.

- **URL**: https://apify.com/tagadanar/workday-jobs-scraper.md
- **Developed by:** [Tagada Data](https://apify.com/tagadanar) (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 $0.84 / 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.
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 Scraper: jobs from any company career site on Workday

Paste the link of a company's careers page on Workday (`https://company.wd5.myworkdayjobs.com/...`) and get every open job as a clean row: title, all locations, country, remote type, full or part time, the exact posted date and the full job description as text and HTML.

Filter by keyword, location, job category, remote and "posted in the last N days". Schedule it daily with **Only jobs not seen before** and you have a new-jobs feed for the employers you track, without opening a single career site.

$1.20 per 1,000 jobs (less on higher Apify plans), platform usage included. No API key, no login, no proxy to set up.

### What you get

One row per job:

| Field | Description |
| --- | --- |
| `jobId` | The requisition ID the company uses (`JR2024494`) |
| `title` | Job title |
| `tenant`, `site` | The company's Workday id and career-site name from the link |
| `legalEntity` | The hiring entity Workday lists (often a subsidiary) |
| `url` | Public link to the job |
| `location`, `locations`, `locationCount` | Main location, every location the job lists, and how many |
| `country` | Country of the main location |
| `remoteType` | `Remote`, `Hybrid`, `On-Site` and so on, when the company fills it in (otherwise `null`) |
| `timeType` | `Full time`, `Part time` |
| `jobFamily` | Job category, when the career site was split by category (see limits) |
| `postedAt` | Posted date, ISO (`2026-10-15`) |
| `postedText`, `postedDaysAgo` | What Workday shows ("Posted Yesterday") and the number of days |
| `postedOver30Days` | `true` when Workday only says "30+ days ago" and the job page was not read |
| `validThrough` | Application end date, when the company sets one |
| `descriptionText`, `descriptionHtml` | The full description, as plain text and as the original HTML |
| `detailFetched` | `true` when the job page was read (description, exact date and all locations are only there then) |
| `source`, `scrapedAt` | Which career site the row came from, and when |

#### Example row (real, from a run on 2026-10-16, description shortened)

```json
{
  "jobId": "JR2027829",
  "title": "Relational Foundation Model Intern, Modern Data Stack – 2027",
  "tenant": "nvidia",
  "site": "NVIDIAExternalCareerSite",
  "legalEntity": "DE01 NVIDIA Germany",
  "url": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite/job/Germany-Remote/Relational-Foundation-Model-Intern--Modern-Data-Stack---2027_JR2027829",
  "location": "Germany, Remote",
  "locations": [
    "Germany, Remote",
    "France, Remote"
  ],
  "locationCount": 2,
  "country": "Germany",
  "remoteType": null,
  "timeType": "Full time",
  "jobFamily": null,
  "postedAt": "2026-10-15",
  "postedText": "Posted Yesterday",
  "postedDaysAgo": 1,
  "postedOver30Days": false,
  "validThrough": null,
  "descriptionText": "NVIDIA has been transforming computer graphics, PC gaming, and accelerated computing for more than 25 years. It’s a unique legacy of innovation that’s fueled by...",
  "descriptionHtml": "<p>NVIDIA has been transforming computer graphics...</p>...",
  "detailFetched": true,
  "scrapedAt": "2026-10-16T15:52:46.662Z",
  "source": "nvidia/NVIDIAExternalCareerSite"
}
```

### Who uses this

- **Recruiters and sourcers.** Watch the hiring of target employers by location and category.
- **Sales and BD teams.** A company opening ten roles in one department is a buying signal. Schedule a daily run and react to it.
- **Job boards and aggregators.** Pull complete, de-duplicated postings with descriptions straight from the employer.
- **Analysts and researchers.** Track hiring volume, locations and remote share per company over time.

### Input

| Field | What it does |
| --- | --- |
| Workday career-site links | One per line. `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`, the same with `/en-US/`, a link copied after you searched or filtered on the site (its `?q=` and filters are applied), a link to a single job, or a `myworkdaysite.com` link |
| Keyword | Only jobs Workday finds for this search |
| Locations | `Germany`, `Texas`, `Austin`, one per line. Matched against the locations that career site lists |
| Job category | `Engineering`, `Sales`, `Finance`: text of the site's own category |
| Employment type | Any, full time, part time |
| Remote jobs only | Remote and remote/hybrid jobs |
| Posted within (days) | `7` for the last week |
| Max jobs per career site | Newest first, default 100, up to 20,000 |
| Include full job description | On by default. Off gives a fast listing (title, locations, approximate date), same price per job |
| Only jobs not seen before | Skips jobs delivered by earlier runs of this actor |

Example:

```json
{
  "urls": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    "https://amat.wd1.myworkdayjobs.com/en-US/External"
  ],
  "keyword": "engineer",
  "locations": ["Germany", "Singapore"],
  "postedWithinDays": 14,
  "maxJobsPerSite": 200
}
```

### How to find a company's Workday link

Open the company's careers page, click through to the job list, and copy the address. It looks like `https://<company>.wd<number>.myworkdayjobs.com/<site name>`. If you searched or picked filters before copying, they come along.

### Limits, stated plainly

- **2,000 per search.** Workday itself stops a plain job list at 2,000 on some career sites. Above that the actor splits the site by category or country and de-duplicates, which is why a very large board (3,000+ jobs) still comes back whole. If no filter splits a part further, the run status says so.
- **Location, category and remote filters use the career site's own filters.** If the site has no matching value (a country it has no jobs in), the run status names it and lists the countries the site does offer. Remote-only on a site without a Remote filter opens each job to check it, which is slower on big boards.
- **Keyword** is Workday's own search, so it can match words in the description, not just the title.
- **`jobFamily`** is filled when the actor had to split the site by category, or when you gave one exact category. Workday's job page does not carry it, so otherwise it is `null`.
- **Dates.** With the description on, the posted date is exact. In the fast listing Workday only says "Posted 5 Days Ago", so the date is derived from that, and anything older than 30 days is `postedOver30Days: true` with no date.
- **Only jobs not seen before** keeps its memory per career site in a store named `workday-jobs-scraper-seen` and stops paging after three pages of already-known jobs.
- Closed jobs disappear from Workday, so they cannot be returned. Some career sites hide salary, and the actor does not guess it.

### FAQ

**Does it work for every company on Workday?** For every career site on `myworkdayjobs.com` and `myworkdaysite.com` that is public. Sites behind a login are not covered.

**Which companies use Workday?** Thousands, including many large employers in tech, finance, health care and retail.

**Can I scrape several companies in one run?** Yes, put one link per line. Duplicate jobs across links are delivered once.

**How do I get only new jobs every day?** Set **Posted within** to 1 or 2 days, or switch on **Only jobs not seen before**, and schedule the actor.

**What happens when a link is wrong?** The run does not fail. The status message names the link and says what looks wrong (no such career site, wrong `wd` number, filters that no longer exist).

**Do I pay for jobs that are filtered out?** No. You pay for the jobs delivered, plus a small fixed start fee.

Related actors from the same author: [ATS Jobs Aggregator](https://apify.com/tagadanar/ats-jobs-aggregator) for Greenhouse, Lever, Ashby and other job boards.

Keywords: Workday jobs scraper, myworkdayjobs scraper, Workday career site scraper, Workday job postings API, scrape Workday jobs, company career page scraper.

# Changelog

This Actor's version history is a separate document: https://apify.com/tagadanar/workday-jobs-scraper/changelog.md

# Actor input Schema

## `urls` (type: `array`):

One link per line: the company's careers page on Workday, e.g. https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite. Links with a language (/en-US/), links copied after you searched or filtered on the site (the ?q=... and ?locationCountry=... part is applied), links to one job, and myworkdaysite.com links all work.

## `keyword` (type: `string`):

Only jobs Workday finds for this search, e.g. data engineer. Leave empty for every open job.

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

Countries, states or cities, one per line, e.g. Germany, Texas, Austin. Matched against the locations the career site itself lists, so a place the company has no jobs in is named in the run status instead of silently returning nothing.

## `jobCategory` (type: `string`):

Text of the site's own job category, e.g. Engineering, Sales, Finance. Matched against the categories that career site lists.

## `employmentType` (type: `string`):

Full time or part time, using the site's own time-type filter.

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

Keep only remote jobs (remote and remote/hybrid). Uses the site's Remote filter when it has one; otherwise each job is opened and checked, which takes longer on big career sites.

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

Only jobs posted in the last N days, e.g. 7 for the last week. Leave empty for all.

## `maxJobsPerSite` (type: `integer`):

Newest first. Workday itself stops a plain listing at 2,000 jobs; above that the actor splits the site by category or country to reach the rest. You only pay for jobs delivered.

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

Adds the description as text and HTML, the exact posted date, all locations and the remote type (one extra page per job, slower). Turn it off for a fast listing of titles, locations and approximate dates. The price per job is the same.

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

Remembers the jobs delivered on earlier runs of this actor and returns only new postings. Pair with a schedule for a hiring feed.

## Actor input object example

```json
{
  "urls": [
    "https://adobe.wd5.myworkdayjobs.com/external_experienced",
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "employmentType": "any",
  "remoteOnly": false,
  "maxJobsPerSite": 25,
  "includeDescription": true,
  "onlyNewJobs": false
}
```

# Actor output Schema

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

One item per job in the default dataset.

# 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 = {
    "urls": [
        "https://adobe.wd5.myworkdayjobs.com/external_experienced",
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
    ],
    "maxJobsPerSite": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("tagadanar/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 = {
    "urls": [
        "https://adobe.wd5.myworkdayjobs.com/external_experienced",
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    ],
    "maxJobsPerSite": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("tagadanar/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 '{
  "urls": [
    "https://adobe.wd5.myworkdayjobs.com/external_experienced",
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "maxJobsPerSite": 25
}' |
apify call tagadanar/workday-jobs-scraper --silent --output-dataset

```

## MCP server setup

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