# Workday Jobs Scraper API | $1/1k, New Jobs Daily, No Login (`programmx/workday-jobs-feed`) Actor

Scrape job postings from any Workday career site (myworkdayjobs.com): title, location, posted date, req ID and optional full description. Only-new mode for scheduled daily hiring feeds. No login, no browser.

- **URL**: https://apify.com/programmx/workday-jobs-feed.md
- **Developed by:** [ProgrammX](https://apify.com/programmx) (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 $0.70 / 1,000 job listeds

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 API | $1/1k, New Jobs Daily, No Login

Scrape job postings from **any Workday career site** (`*.myworkdayjobs.com`): title, requisition ID, location, posted date, job URL and, if you want it, the full description, every location, country, time type and remote type. Turn on **only-new mode** and schedule it daily to get a feed of new and changed openings per employer. You don't need a login, a browser or a Workday account.

**Keywords:** Workday jobs scraper, myworkdayjobs scraper, Workday careers API, Workday job postings API, ATS jobs scraper, company career site scraper, new job postings feed, hiring signals, job monitoring, recruiter leads, job aggregator feed, Workday job board export, NVIDIA jobs, Adobe jobs, Salesforce jobs.

### What it does

Thousands of large employers host their careers page on Workday (for example `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`). Each of those pages loads its jobs from a public JSON endpoint. This actor reads that same endpoint directly, so:

- **It's fast and cheap.** One request returns 20 jobs, and a 50-job run takes about 5 seconds.
- **It's reliable.** It reads structured JSON instead of parsing HTML, so page redesigns don't break it.
- **It isn't limited to 2000 results.** Workday stops at 2000 results per query. When a site has more than that, the actor splits the query by job family (or another facet) and removes duplicates, so you get all of them.
- **It works for any tenant.** Paste any Workday career-site URL. Locale paths (`/en-US/`), job-page URLs, `myworkdaysite.com/recruiting/...` URLs and URLs with filters applied (`?locations=...&jobFamilyGroup=...`) all work.

### Who uses it

- **Recruiters and staffing agencies.** See the day a target account opens a role and get to the hiring manager first.
- **Sales and lead-gen teams.** Use new openings (for example "Head of Data", "SOC 2", "Salesforce admin") as buying signals.
- **Job boards and aggregators.** Pull a daily feed of every opening at a list of employers.
- **Market and talent analysts.** Track hiring velocity by company, team and location.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `careerSiteUrls` | string list | NVIDIA example | Workday career-site URLs, one per employer. Filter params in the URL are applied. |
| `searchText` | string | empty | Keyword search, the same as the search box on the career site. |
| `includeDetails` | boolean | `false` | Fetch each job's detail page: description (HTML + text), all locations, country, start date, time type, remote type. |
| `postedWithinDays` | integer 0-30 | empty | Keep only jobs posted within N days, based on Workday's "Posted N Days Ago" label. |
| `onlyNew` | boolean | `false` | Monitoring mode. Return only jobs that are new or changed since earlier runs. |
| `maxItemsPerSite` | integer | `100` | Stop each career site after this many jobs. |
| `maxItems` | integer | `50` | Hard cap on jobs per run, across all sites. Raise it for real feeds. |
| `proxyConfiguration` | proxy | off | Optional. Workday sites normally work without a proxy. |

Example:

```json
{
  "careerSiteUrls": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    "https://adobe.wd5.myworkdayjobs.com/external_experienced"
  ],
  "searchText": "engineer",
  "includeDetails": true,
  "postedWithinDays": 7,
  "maxItemsPerSite": 500,
  "maxItems": 1000
}
```

### Output

One dataset row per job. This is a real list-only record from a test run on 2026-10-03:

```json
{
  "jobReqId": "JR1997186",
  "title": "Senior Software Engineer, NCCL",
  "company": "nvidia",
  "url": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite/job/US-CA-Santa-Clara/Senior-Software-Engineer--GPU-Communications-and-Networking_JR1997186",
  "locationsText": "US, CA, Santa Clara",
  "postedOn": "Posted Yesterday",
  "postedDaysAgo": 1,
  "postedDateEstimate": "2026-10-02",
  "tenant": "nvidia",
  "site": "NVIDIAExternalCareerSite",
  "wd": "wd5",
  "hasDetails": false,
  "scrapedAt": "2026-10-03T15:16:09.498Z"
}
```

With `includeDetails: true` (real Adobe record from the same day, description truncated):

```json
{
  "jobReqId": "R166886",
  "title": "Research Engineer",
  "company": "ADUS-Adobe Inc.",
  "location": "Seattle",
  "country": "United States of America",
  "countryCode": "US",
  "startDate": "2026-09-18",
  "timeType": "Full time",
  "descriptionText": "The Opportunity\n\nThe Research Engineering & Design Lab within Adobe Research is looking for a Research Engineer ...",
  "canApply": true,
  "changeType": "new"
}
```

The full field list (`additionalLocations`, `remoteType`, `endDate`, `descriptionHtml`, `workdayId`, `externalPath`, `careerSiteUrl` and more) is in the dataset schema. Runs also write a `RUN_STATS` record to the default key-value store with requests, retries, items, proxy mode and duration.

### Pricing (pay per event)

| Event | When it is charged | FREE | BRONZE | SILVER | GOLD |
|---|---|---|---|---|---|
| `job-listed` | Per job returned without details | $0.0010 | $0.0009 | $0.0008 | $0.0007 |
| `job-detail` | Per job returned with full details | $0.0020 | $0.0018 | $0.0015 | $0.0012 |

On the FREE tier, 1,000 jobs cost $1 list-only or $2 with full descriptions. In only-new mode you pay only for new or changed jobs. The run stops cleanly when it reaches your max-charge limit. *(Proposed prices. Not live yet.)*

### How to schedule a daily feed

1. Put your target employers' career-site URLs in `careerSiteUrls`, set `onlyNew: true`, and set `maxItemsPerSite` high enough for one day's openings (for example 500).
2. Save the input as a **Task**.
3. Open **Schedules**, create a schedule (for example `0 7 * * *` for 07:00 every day) and attach the task.
4. Connect the output through an integration (webhook, Slack, Google Sheets, Zapier, Make) or read the dataset through the API.

The first run returns a baseline of up to `maxItemsPerSite` newest jobs per site. Later runs return only new or changed jobs, marked with `changeType: "new"` or `"changed"`. Workday lists jobs newest first, so the actor stops a site after 3 pages in a row with nothing new. State is kept in the named key-value store `workday-jobs-feed-state`; delete it to start over.

### Use it from the API, n8n, Make, Zapier or an AI agent

- **API:** start a run and get the results in one call:
  ```bash
  curl -X POST "https://api.apify.com/v2/acts/programmx~workday-jobs-feed/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{"careerSiteUrls": ["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"], "maxItemsPerSite": 50}'
  ```
  The response is the dataset as JSON; add `&format=csv` for CSV. This endpoint waits up to 5 minutes; for longer runs, start the run asynchronously and read the dataset when it finishes.
- **n8n, Make and Zapier:** use the Apify node or app, choose *Run Actor*, pick this actor and paste the input JSON.
- **Google Sheets, Slack, email and webhooks:** add an integration on the actor or task in Apify Console.
- **AI agents:** add this actor to Apify's MCP server (`https://mcp.apify.com`) and call it from any MCP client.

### FAQ

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

Open the company's careers page and click through to the job search. If the address contains `myworkdayjobs.com`, copy it. Site names are case-sensitive.

#### Why does `company` say `nvidia` but `ADUS-Adobe Inc.` in detail mode?

Without details the actor only knows the Workday tenant name. Detail mode adds the hiring entity that Workday reports, which is often a legal-entity name.

#### Can it get more than 2000 jobs from one site?

Yes. When a site reports 2000 (Workday's cap) and you ask for more, the actor splits the query by facet and removes duplicates. In a test it returned 2,001 unique NVIDIA jobs.

#### Do I need a proxy?

Usually not. Workday sits behind Cloudflare, but no challenge appeared in testing. If you run very large volumes, enable a proxy.

#### Is the posted date exact?

Workday's list shows relative labels ("Posted 3 Days Ago", "30+ Days Ago"). `postedDateEstimate` is derived from that label. `startDate` (detail mode) is the date Workday reports.

#### How much does a daily jobs feed cost?

Example on the Free plan: 10 career sites with about 15 new jobs each per day is 150 jobs, so $0.15 a day list-only (about $4.50 a month) or $0.30 a day with full descriptions.

#### Which companies use Workday?

Many large employers host their careers site on `myworkdayjobs.com`. NVIDIA, Adobe, Salesforce, Intel, Workday and Mastercard were tested.

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

Yes. Each run's dataset downloads as CSV, Excel or JSON, and the Google Sheets integration can append every new job to a sheet.

#### Can an AI agent use this actor?

Yes. Apify's MCP server (`https://mcp.apify.com`) can expose this actor as a tool to Claude, Cursor, VS Code and other MCP clients, so an agent can fetch fresh jobs on request.

### Limitations

- You supply the career-site URLs. The actor doesn't discover every Workday tenant on its own.
- Removed (closed) jobs are not reported as removals yet.
- If one facet value alone has more than 2000 jobs, that slice is still capped at 2000.
- `postedWithinDays` can only be as precise as Workday's labels, and anything over 30 days is "30+".
- It reads only public career-site data. It doesn't log in, apply to jobs or access candidate data.

# Actor input Schema

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

One URL per employer, e.g. https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite. Locale segments (/en-US/), job-page URLs, myworkdaysite.com/recruiting/... URLs and filtered URLs (?locations=...\&jobFamilyGroup=...) all work; URL filters are passed to Workday as facets.

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

Optional keyword search applied to every site (same as the search box on the career site). Leave empty for all jobs.

## `includeDetails` (type: `boolean`):

Fetch each posting's detail page: full description (HTML + text), all locations, country, start date, time type. One extra request per job and billed as 'job-detail' instead of 'job-listed'.

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

Optional. Keep only postings Workday labels as posted within N days (0 = today). Workday shows 'Posted Today', 'Posted N Days Ago' and '30+ Days Ago', so values above 30 are not meaningful.

## `onlyNew` (type: `boolean`):

Remember postings already returned (named key-value store 'workday-jobs-feed-state') and return only new or changed ones. Turn on for scheduled daily runs. The first run returns a baseline.

## `maxItemsPerSite` (type: `integer`):

Stop each career site after this many jobs. Workday reports at most 2000 results per query.

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

Hard cap on jobs returned (and charged) per run across all sites.

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

Optional. Workday career sites usually work without a proxy. If Apify Proxy is enabled here it is used; otherwise the actor uses a residential proxy configured via secret env vars, or connects directly.

## Actor input object example

```json
{
  "careerSiteUrls": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "includeDetails": false,
  "onlyNew": false,
  "maxItemsPerSite": 100,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One row per job posting: title, company, location, posted date, req ID and URL, plus the full description, time type and start date when full job details are on. In only new mode just the postings not seen in earlier runs are returned.

## `runStats` (type: `string`):

Summary of the run: rows emitted and charged, requests, retries, proxy mode, errors and duration.

# 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://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("programmx/workday-jobs-feed").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://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("programmx/workday-jobs-feed").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://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call programmx/workday-jobs-feed --silent --output-dataset

```

## MCP server setup

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

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/8pXfhlpqQZ7yM6ETM/builds/gsarXxhreGHvNQaAa/openapi.json
