# Workday Jobs Scraper: One Board You Name, No API Key (`glitchbound/workday-jobs-scraper`) Actor

Give it a Workday board token or careers URL and get that company's open roles, live from the source. No key, no login, no cookies. Do not know the company yet? Workday Jobs API searches every Workday

- **URL**: https://apify.com/glitchbound/workday-jobs-scraper.md
- **Developed by:** [Daniel Meshulam](https://apify.com/glitchbound) (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.50 / 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/platform/actors/running/actors-in-store#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: Any Careers Site, No API Key

**Every open role from any Workday careers site, from the URL you already have. Titles, locations and links as clean JSON, no API key and no proxy. Workday is where large enterprises post: NVIDIA 2,000 open roles, Salesforce 1,478, Adobe 832.**

### What people use this for

Hiring data is not really about jobs. It is the earliest public signal a
company gives that something changed, and it is why three different kinds of
buyer end up on the same dataset:

- **Sales and go-to-market.** A company that opens six engineering roles this
  month is a company with new budget. Job postings say which team is growing
  and in which city, weeks before anything shows up in a funding announcement.
- **Investors and market research.** Headcount by function, tracked over time,
  across a whole portfolio or a whole sector. Every row carries the company,
  the team and the date, so a weekly run is a time series.
- **Recruiting and talent.** Where a competitor is hiring, which roles they have been trying to fill for months, and how fast a team is growing. Workday does not publish pay, so no row here claims to know it.

Run it once for a snapshot. Run it on a schedule and the same rows become a
record of who started growing and when.

### Company ids must be exact, and here is why

```json
{ "boards": ["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"] }
```

Domain guessing is deliberately switched off for workday. See the note below: a
`200` from this API does not prove the company exists, so a guess could never be
confirmed, and a confident wrong answer is worse than asking you for the id.

### What makes workday different

- **These are the biggest boards on any system.** Measured 2026-08-01: NVIDIA 2,000 open roles, Salesforce 1,478, Adobe 832. Most large enterprises post here rather than on a startup ATS, so a jobs pipeline that stops at Greenhouse and Lever misses the companies people most want to watch.

- **Workday caps the page size at 20 and answers 400 above it**, undocumented, and that 400 reads as a malformed request rather than a paging problem. Measured: 20 returns 200, 50 is rejected.

- **Workday's `total` lies after the first page.** The real count arrives on page one and every page after it reports 0, so the obvious `offset >= total` loop is true immediately and stops at 40 of 2,000 postings, with no error and nothing in the log. This Actor keeps the first answer and stops only on an empty page.

- **It needs the careers URL, not a company name**, and that is not laziness. A Workday address carries three separate unknowns: the host label, the data-centre number (wd1 through wd12) and the career-site name. Guessing across them would mostly bill you for 404s, so this asks for the page you already have.

### Filters that cost you nothing

```json
{
  "boards": ["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],
  "titleKeywords": ["engineer"],
  "remoteOnly": true
}
```

Filtered rows are **not charged**. Keywords match as plain text, so `c++` and
`node.js` mean exactly that rather than being read as regular expressions.

### What you get

| Field | |
|---|---|
| `title` | the role as the company wrote it |
| `location` | as published, not normalised |
| `url` | the public posting, ready to open |
| `jobId` | the ATS's own id, stable across runs |
| `postedAtRelative` | a phrase, not a date: "Posted Today", "Posted 30+ Days Ago". This source publishes no timestamp, and a date invented from that phrase would read as exact when it is not |
| `company` | what you asked for, echoed back |
| `atsPlatform` | which system it came from |
| `boardToken` | the board id used |
| `boardTokenResolved` | the board id derived from your URL |
| `boardUrl` | the public board this came from |

### Looking for an Indeed or Glassdoor API? There isn't one, and this is why you don't need it

Indeed has no public jobs API. Neither does Glassdoor, ZipRecruiter or LinkedIn
Jobs, and all four block you at the edge. Measured from an ordinary residential
address on 2026-08-01, with normal browser headers:

```
indeed.com/jobs          403      0 bytes
glassdoor.com/Job/...    403      0 bytes
ziprecruiter.com         403      0 bytes
upwork.com/nx/search     403      0 bytes
```

Zero bytes. Cloudflare rejects the request before it reaches an application, so
there is nothing to parse and no proxy budget that fixes it.

**But none of those four originate job data.** They aggregate it from company
career pages, and those pages run on systems like workday that publish a free,
keyless, public API, because companies want their openings indexed. That API
answered with real jobs from the same connection, in the same minute.

Going to the source is also fresher. An aggregator shows you its last crawl.
This shows you the board.

### Notes

- The source is a public API that companies publish deliberately. Nothing here
  is behind a login, a paywall or a bot wall.
- An empty board cannot be told apart from a wrong id on this system, and the message says so.
- Errors are per company. One bad token does not end the run, and error rows
  are not charged.

# Actor input Schema

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

Not supported on workday: it returns the same empty response for a company that does not exist and for one with no open roles, so a derived token could never be confirmed. Use the board field with the exact company id.

## `boards` (type: `array`):

Workday careers page addresses, one per line, e.g. https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite. A company name will not work and the Actor says so: a Workday address carries the host label, the data-centre number and the career-site name, none of which can be derived from a domain.

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

Keep only roles whose title contains any of these, one per line, e.g. security or staff engineer. Matched as plain text, case-insensitive, so c++ and node.js mean exactly that. Filtered rows are not charged.

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

Keep only roles whose location contains any of these, one per line, e.g. London or Israel. Filtered rows are not charged.

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

Keep only roles flagged remote by the ATS, or whose title or location says remote or anywhere.

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

Workday's board listing carries no description text, so this changes nothing here. It is kept for input compatibility with the rest of the shelf.

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

Ceiling on roles taken from any single board.

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

A hard ceiling on rows for the entire run, across every company. The per-company limit above caps each one separately, so fifty companies at a thousand each is still fifty thousand rows; this caps the total. The run stops cleanly when it is reached and nothing beyond that point is fetched or charged. Leave empty for no ceiling.

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

Proxy settings. Every source here is a public API a company publishes on purpose so its openings get indexed, and none of them block datacenter addresses, so the default is fine.

## Actor input object example

```json
{
  "boards": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "remoteOnly": false,
  "includeDescription": false,
  "maxResultsPerCompany": 300,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All rows this run produced, as JSON.

# 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 = {
    "boards": [
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
    ],
    "maxResultsPerCompany": 300
};

// Run the Actor and wait for it to finish
const run = await client.actor("glitchbound/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 = {
    "boards": ["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"],
    "maxResultsPerCompany": 300,
}

# Run the Actor and wait for it to finish
run = client.actor("glitchbound/workday-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "boards": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "maxResultsPerCompany": 300
}' |
apify call glitchbound/workday-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=glitchbound/workday-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/NBV0pPk6WuGv4IgAI/builds/ecDGsHsicQfUV1orb/openapi.json
