# Workday Job Postings Scraper | Careers by Company (`aurelix/workday-jobs-scraper`) Actor

Scrape Workday jobs at $1.50 per 1,000 jobs on the free plan, with a new-jobs-since-last-run feed, Slack digest and Canadian province tags. Any myworkdayjobs.com site by URL or company name (141 verified), no login: locations, job type, date.

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

## Pricing

from $0.84 / 1,000 job results

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

### What is Workday Job Postings Scraper?

**Get jobs from any Workday career site by URL or company name (locations, job type, posted date, full description) for $1.50 per 1,000 jobs, no login.**

For job boards, recruiters and sales teams. 141 employers are verified on the live job endpoint, and a new-jobs mode with a Slack digest skips jobs already returned. Your first run with the example input costs about $0.069 (40 jobs in our test run).

[![Workday Job Postings Scraper: example output from a real run](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/workday-jobs-scraper-card-v2.png)](https://console.apify.com/actors/4ppyGzuj3o9bPJJUE?addFromActorId=4ppyGzuj3o9bPJJUE)

[![Workday Job Postings Scraper: 75-second demo video](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/workday-jobs-scraper-demo-thumb-v1.png)](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/workday-jobs-scraper-demo-v1.mp4)

**[▶ Watch the 75-second demo](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/workday-jobs-scraper-demo-v1.mp4)**

| | |
|---|---|
| **Search by** | Workday career-site links, company names (141 verified employers), or a starter list of 27 (15 Canadian) |
| **Filters** | Canada only, countries, remote only, title keywords (sent to Workday's search), max jobs per site, new jobs only |
| **Output** | 27 fields per job; JSON, CSV, Excel, API |
| **Automate** | Schedules, webhooks, Zapier, Make, n8n, Google Sheets, MCP for AI agents |
| **Price** | $1.50 per 1,000 jobs (from $0.84 per 1,000 jobs on paid Apify plans) |
| **Free to try** | Runs on Apify's free plan: the $5 monthly credit covers about 3,300 jobs |
| **Login needed** | No |

### Daily monitor: only what's new, every morning

Set it once, get only the new jobs every morning. With **Only new jobs since last run** on, the first run returns everything that matches; each later run skips jobs that earlier runs already returned, so you pay only for new ones.

```json
{
  "sites": [
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "titleKeywords": [
    "engineer"
  ],
  "incremental": true,
  "stateKey": "nvidia-engineers"
}
```

1. Paste this input into the **Input** tab (JSON view) and click **Save as a new task**; it appears under **Saved tasks**.
2. Open the task from **Saved tasks** and click **Schedule**.
3. Choose **Daily**, pick the hour, and save.

**Cost example:** 1 company, about 20 new jobs a day ≈ $1.17/month on the free plan (from $0.77 on paid plans): one run a day for 30 days, start fee included. The first run returns everything that matches, so it costs more.

Add a Slack incoming-webhook URL in `slackWebhookUrl` (or any URL in `webhookUrl`) to get a short digest of each run's new jobs; nothing is sent when a run finds nothing.

### Why Workday Job Postings Scraper users pick this one

- **Cheaper than the leading tools.** $1.50 per 1,000 jobs, from $0.84 on paid plans.
- **Any site or a company name.** 141 employers verified on the live endpoint.
- **Full job pages.** Locations, country, time type and full description per job.
- **Canada built in.** Province tags, a Canada-only filter, 15 Canadian employers bundled.
- **New jobs only.** With a Slack or webhook digest.

### Get started in 3 steps

1. Paste Workday career-site links into Sites (e.g. https://td.wd3.myworkdayjobs.com/TD_Bank_Careers), type company names into Company names (e.g. Wells Fargo, Pfizer), or pick the Canadian or Canadian + global starter list.
2. Optionally narrow it: Canada only, countries, remote only, title keywords, max jobs per site; turn on 'Only new jobs since last run' for a daily feed.
3. Click Start, then download JSON, CSV or Excel, or schedule the run and send results to Google Sheets, Zapier, Make or n8n.

**[▶ Try it with the example input](https://console.apify.com/actors/4ppyGzuj3o9bPJJUE?addFromActorId=4ppyGzuj3o9bPJJUE)**

The form opens with an example input already filled in: that run costs about $0.069 on the free plan.

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

Pay per event: you pay only for what the run returns, plus a small start fee. Bronze, Silver, Gold and higher Apify plans pay less per result. Paid plans pay $1.05 (Bronze), $0.94 (Silver) and $0.84 (Gold and higher) per 1,000 jobs.

| Jobs | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
| 100 | $0.16 | $0.11 | $0.10 | $0.093 |
| 1,000 | $1.51 | $1.06 | $0.95 | $0.85 |
| 10,000 | $15.01 | $10.51 | $9.41 | $8.41 |

Totals include the $0.009 start fee per run, rounded to the cent (amounts under $0.10 to four decimals). Apify's free plan includes $5 of credit a month, enough for about 3,300 jobs.

No charge for jobs filtered out or already returned in incremental mode. Each run's start fee covers reading the career sites' searches when no job matches.

#### Billing events

| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
| `job-result` | $1.50 per 1,000 jobs | $1.05 per 1,000 jobs | $0.94 per 1,000 jobs | $0.84 per 1,000 jobs |
| `apify-actor-start` | $0.009 per run | $0.009 per run | $0.009 per run | $0.009 per run |

### Benchmarks: how we compare

| Test | Input | Result | Run time |
|---|---|---|---|
| First run of the prefilled input | TD Bank and Enbridge sites, 20 jobs per site | 40 jobs, about $0.069 charged in total | not recorded |
| Whole starter list | 27 sites (starter list 'all'), 15 jobs per site | 405 jobs from 27 of 27 sites | 112 s |
| One full site | CAE career site, no limit, descriptions off | 388 jobs = the site's own total of 388 | - |
| Keyword that matches nothing | 30 of the largest Workday sites (the maximum), a made-up title keyword | 0 jobs, start fee only | 22 s |
| Keyword found only in descriptions | Same 30 sites, 'benefits' | 38 jobs whose title contains the word; status names the one site that hit Workday's 2,000-result cap | 452 s |
| Keyword search recall | TD Bank, Cisco and Sanofi (1,017 to 1,629 jobs each), 9 keywords | Sending the keyword to Workday's search found every title match that reading all jobs found: 0 missed in 27 checks | - |
| New-jobs mode, two runs in a row | One site, 30 jobs per run | 30 new jobs, then 30 more, none repeated | - |
| Accuracy against job pages | 10 jobs from different sites | 10 of 10 matched title, date, job type, locations and description | - |
| robots.txt opt-out | RBC's site, given in two spellings | Skipped in every spelling; run failed with 'robots.txt disallows', nothing charged per job | - |
| Server error after page 1 (simulated) | One site, list page 2 returns 500, 503, 404 or 403 | 20 jobs from page 1 kept; run succeeded with a 'partial ... stopped at job 20' note | - |

Each row is one run on our own account on Apify at the default memory, except the recall check (a script comparing Workday's keyword search with a full read of each site) and the simulated server errors (the same code on our test machine with the fault injected). Accuracy was checked by comparing each job with its own page. Job counts are what the sites showed at the time of each run.

### What data you get

**Workday Job Postings Scraper** reads the public job search on any company's Workday career site (myworkdayjobs.com or myworkdaysite.com) and opens every job's own page, so each row has title, company, all locations, ISO country, Canadian province, remote flag, employment type, posted date, apply link and the full description. Paste the career-site link you see in your browser, type a company name from the bundled list of 141 verified employers (Wells Fargo, Pfizer, Bank of America...), or pick the starter list of 27 verified employers (15 Canadian, such as TD, BMO, CIBC, Manulife and Enbridge). Rows use the same 27 fields as Career Site Jobs Scraper, so Workday and Greenhouse, Lever, Ashby or SmartRecruiters jobs fit one table.

- Title and company
- All locations, ISO country codes, Canadian province codes, is_canada, remote flag, workplace type where the site publishes it
- Employment type (normalised + as published, e.g. 'Full time')
- Posting start date (YYYY-MM-DD)
- Posting link, apply link, full description as text and HTML
- Stable job_id for joins and dedupe

| company | title | locations | provinces | remote | workplace_type | employment_type | posted_at |
|---|---|---|---|---|---|---|---|
| TD Bank | Bilingual Insurance Advisor | \["Dieppe, New Brunswick", "Moncton, New Brunswick", "Rive... | \["NB"] | False | onsite | FULL_TIME | 2026-11-03 |
| Enbridge | Specialist II TIS Application Observability | \["Calgary, AB, CAN", "North York, ON, CAN", "Edmonton, AB... | \["AB", "ON"] | True | remote | FULL_TIME | 2026-11-03 |
| Thomson Reuters | Agile Delivery Lead - AI & Automation | \["United States of America, Eagan, Minnesota", "United St... | \["ON"] | False | hybrid | FULL_TIME | 2026-11-03 |
| Cenovus Energy | Senior Crude & Diluent Commercial Scheduler | \["CA-AB-Calgary"] | \["AB"] | False |  | FULL_TIME | 2026-11-03 |
| Intact Financial | Senior Commercial Property Adjuster | \["Vancouver, British Columbia, CAN", "Victoria, British C... | \["AB", "BC", "MB"] | False |  | FULL_TIME | 2026-10-07 |

One full job record, exactly as a real run returned it (long text and lists shortened here). From a real run:

```json
{
  "job_id": "workday:td/td_bank_careers:bilingual-insurance-advisor_r_1520369",
  "ats": "workday",
  "company_token": "td/TD_Bank_Careers",
  "company": "TD Bank",
  "title": "Bilingual Insurance Advisor",
  "department": null,
  "team": null,
  "locations": [
    "Dieppe, New Brunswick",
    "Moncton, New Brunswick",
    "Riverview, New Brunswick"
  ],
  "countries": [
    "CA"
  ],
  "provinces": [
    "NB"
  ],
  "is_canada": true,
  "remote": false,
  "workplace_type": "onsite",
  "employment_type": "FULL_TIME",
  "employment_type_raw": "Full time",
  "salary_min": null,
  "salary_max": null,
  "salary_currency": null,
  "salary_interval": null,
  "salary_text": null,
  "posted_at": "2026-11-03",
  "updated_at": "2026-11-03",
  "apply_url": "https://td.wd3.myworkdayjobs.com/TD_Bank_Careers/job/Dieppe-New-Brunswick/Bilingual-Insurance-Advisor_R_1520369/apply",
  "description_text": "Work Location:\nDieppe, New Brunswick, Canada\n\nHours:\n35\n\nLine of Business:\nPersonal & Commercial Banking\n\nPay Details:\n5... [8718 more characters]",
  "description_html": "<p style=\"text-align:left\"><b>Work Location:</b></p>Dieppe, New Brunswick, Canada<p style=\"text-align:inherit\"></p><p st... [10074 more characters]",
  "source_url": "https://td.wd3.myworkdayjobs.com/TD_Bank_Careers/job/Dieppe-New-Brunswick/Bilingual-Insurance-Advisor_R_1520369",
  "scraped_at": "2026-11-04T08:17:41Z"
}
```

### Use cases

- Recruiters and staffing agencies watching banks, insurers and energy companies for new openings
- Job boards adding direct-from-employer postings from large Workday employers every day
- Job seekers tracking new roles at specific employers in Canada
- Analysts tracking hiring by employer, location and job type

### Use-case recipes

#### Recruiter: new openings at Canadian banks

Staffing agencies type the banks they place candidates at, turn on Canada only and 'Only new jobs since last run', and schedule it daily. Each run saves only postings not seen before. Sort by `posted_at`, use `provinces` to route jobs to the right regional recruiter, and open `apply_url` for the full posting.

```json
{
  "companies": [
    "TD Bank",
    "BMO",
    "CIBC"
  ],
  "canadaOnly": true,
  "titleKeywords": [
    "analyst",
    "manager"
  ],
  "maxJobsPerSite": 50,
  "incremental": true,
  "stateKey": "banks-canada"
}
```

#### Job board: a daily feed of Canadian employer postings

Pick the Canadian starter list (15 employers) with Canada only on and new-jobs mode on, and add a webhook to Zapier, Make or n8n. The webhook gets the count and the top 10 jobs; read the full dataset from the run for the rest. `title`, `company`, `locations` and `description_html` map straight onto a job post.

```json
{
  "starterList": "canada",
  "canadaOnly": true,
  "maxJobsPerSite": 25,
  "incremental": true,
  "stateKey": "board-canada",
  "webhookUrl": "https://hooks.zapier.com/hooks/catch/000000/abcdef/"
}
```

#### One table with Workday and Greenhouse or Lever jobs

Run this Actor on the Workday employers and Career Site Jobs Scraper on employers that use Greenhouse, Lever, Ashby or SmartRecruiters. Both return the same 27 fields (Career Site Jobs Scraper adds poster_name for SmartRecruiters jobs), so the two datasets append into one sheet with no remapping; the `ats` column tells them apart and `job_id` stays unique.

```json
{
  "sites": [
    "https://td.wd3.myworkdayjobs.com/TD_Bank_Careers",
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "countries": [
    "CA",
    "US"
  ],
  "titleKeywords": [
    "engineer"
  ],
  "maxJobsPerSite": 30
}
```

#### Analyst: where an employer is hiring

Turn descriptions off to keep rows small and pull a sample per employer. Count rows by `company` and `countries`, or `provinces` for Canada, and by `employment_type` and `workplace_type` to see where and how each one hires. Rerun on a schedule to compare counts over time.

```json
{
  "companies": [
    "Pfizer",
    "Novartis",
    "Sanofi"
  ],
  "includeDescription": false,
  "maxJobsPerSite": 100
}
```

### Input

| Field | Type | What it does | Default |
|---|---|---|---|
| `sites` (Workday career sites (URLs)) | array | Workday career-site links, as you see them in the browser: e.g. https://td.wd3.myworkdayjobs.com/TD_Bank_Careers, https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite, https://wd3.myworkdaysite.com/recruiting/magna/Magna, or the short form 'td.wd3/TD_Bank_Careers'. |  |
| `maxJobsPerSite` (Max jobs per site) | integer | Upper limit of results per career site after filters, in the site's own order (usually newest first). 0 = no... | 0 |
| `companies` (Company names) | array | Company names to look up in the bundled list of 141 verified Workday employers, e.g. \['Wells Fargo', 'Pfizer', 'TD Bank']. |  |
| `starterList` (Bundled starter list) | string | Add a curated list of verified Workday career sites. | "none" |
| `canadaOnly` (Canada only) | boolean | Keep only jobs located in Canada (any of the job's locations). | false |
| `countries` (Countries (ISO codes)) | array | Keep only jobs in these countries, as two-letter ISO codes, e.g. \['CA', 'US', 'GB']. |  |

All 13 fields, with examples: see the **Input** tab.

### Use with AI agents (MCP)

MCP (Model Context Protocol) is the open standard that lets AI assistants such as Claude, ChatGPT and Cursor call outside tools. Apify's hosted MCP server at `https://mcp.apify.com/?tools=aurelix/workday-jobs-scraper` gives your assistant this Actor only: it fills in the input from your request, runs it and reads the jobs back, at the same per-result price as a run started by hand.

#### Example prompts

- "Get the engineer jobs in Canada from the Workday career sites of TD Bank, BMO and CIBC and give me a table with title, city, province and apply link."
- "List the 50 newest analyst jobs at Wells Fargo and Bank of America from their Workday sites, with locations and posted date."
- "Check Pfizer, Novartis and Sanofi on Workday for remote jobs and tell me how many each one has, with links."

#### Claude Desktop and claude.ai

**Settings > Connectors > Add custom connector**, name it Apify, paste `https://mcp.apify.com/?tools=aurelix/workday-jobs-scraper`, keep the detected OAuth settings, select **Add** and sign in to Apify.

#### Claude Code

```bash
claude mcp add --transport http apify "https://mcp.apify.com/?tools=aurelix/workday-jobs-scraper"
```

#### Cursor and VS Code

Add this to `~/.cursor/mcp.json` (Cursor); in VS Code's `.vscode/mcp.json` put the same entry under `"servers"` with `"type": "http"`. Sign in to Apify when asked.

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com/?tools=aurelix/workday-jobs-scraper"
    }
  }
}
```

#### ChatGPT

Turn on **Developer mode**, open **Settings > Apps & Connectors > Create**, paste the URL above as the MCP server URL, choose **OAuth** and authorize Apify.

Clients without sign-in send `Authorization: Bearer <YOUR_APIFY_TOKEN>` instead. No Apify account? This Actor supports Apify's agentic payments: an agent can pay per run with a prepaid, spend-capped token, bought with x402 stablecoin payments.

#### n8n AI agent

Give an **AI Agent** node an **MCP Client Tool** with the endpoint `https://mcp.apify.com/?tools=aurelix/workday-jobs-scraper` and a Bearer credential holding your Apify token.

### Use it from AI agents (MCP), the API or no-code

#### Copy this to your AI assistant

```text
Use the Apify Actor aurelix/workday-jobs-scraper (Workday Job Postings Scraper) through Apify's MCP server or API. Main input: sites (Workday career sites (URLs)); maxJobsPerSite (Max jobs per site). Example input: {"sites": ["https://td.wd3.myworkdayjobs.com/TD_Bank_Careers"], "companies": ["Wells Fargo", "Pfizer"], "canadaOnly": false, "titleKeywords": ["engineer", "analyst"], "maxJobsPerSite": 50, "incremental": true}. Each result is one job with fields such as job_id, ats, company_token, company, title, department, team, locations. It costs $1.50 per 1,000 jobs on Apify's free plan plus a $0.009 start fee per run, and needs no login.
```

MCP server URL for this Actor: `https://mcp.apify.com/?tools=aurelix/workday-jobs-scraper` (setup for each client in the section above).

#### API

Start a run and read the dataset with Apify's REST API or the Python and JavaScript clients:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("aurelix/workday-jobs-scraper").call(run_input={'sites': ['https://td.wd3.myworkdayjobs.com/TD_Bank_Careers'], 'companies': ['Wells Fargo', 'Pfizer'], 'canadaOnly': False, 'titleKeywords': ['engineer', 'analyst'], 'maxJobsPerSite': 50, 'incremental': True})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

#### No-code: schedule it in 3 clicks

Send the results to Google Sheets, Zapier, Make, n8n, Slack or any webhook URL.

1. Fill in the input, then click **Save as a new task**.
2. In the task, click **Schedule** and pick daily or weekly (Apify Schedules).
3. Turn on **Only new jobs since last run** so each run returns only what is new, and paste a Slack or webhook URL into **Slack webhook URL** / **Webhook URL** to get a digest of the new items (count plus the top 10) after every run.

Prefer n8n or Make? Ask in the **Issues** tab and we will share a ready-made workflow for it.

### FAQ

#### Can I scrape Workday jobs without login?

Yes. It never logs in, so you need no Workday account, password or cookies; only a free Apify account to run it.

#### Is there a Workday jobs API?

You can use this Actor as one. Start it with Apify's REST API or the Python and JavaScript clients and read the results as JSON (see the code above), or call it from an AI agent through MCP.

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

About $1.51 for 1,000 jobs on Apify's free plan and from $0.85 on paid plans, start fee included. The free $5 monthly credit covers about 3,300 jobs.

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

Yes. Download the results as Excel, CSV, JSON, XML or HTML from the run's **Storage** tab, or send them to Google Sheets with Apify's Google Sheets integration or the API.

#### Is it legal to scrape Workday jobs?

It reads only public data any logged-out visitor can see: the job-search data each Workday career site shows every visitor. It goes at a polite pace, respects robots.txt, never logs in and never solves CAPTCHAs. It returns job posting fields (title, location, dates, description, apply link); descriptions are returned as published, and no candidate profiles are collected. Workday's public job data names no recruiter. Data is returned as shown publicly on the source. To have a record removed, open an issue on this Actor's Issues tab; if an employer formally asks us to stop, this Actor will stop. You are responsible for using the data lawfully, incl. anti-spam and privacy laws; this is not legal advice.

#### Where do I find a company's Workday link?

Open the company's careers page and click a job. If the address contains myworkdayjobs.com or myworkdaysite.com, copy it: e.g. https://td.wd3.myworkdayjobs.com/en-US/TD_Bank_Careers/job/... The Actor keeps only the company and site parts, so a job link works too.

#### Which companies can I look up by name?

141 employers bundled with the Actor, each checked to answer Workday's public job search and to allow it in robots.txt: banks (Wells Fargo, Bank of America, TD, BMO, CIBC, PNC), pharma (Pfizer, Merck, Novartis, Sanofi), tech (NVIDIA, Intel, Cisco, Salesforce), hospitals, universities and more. Case is ignored and a unique part of a name works. Any other Workday company: paste its career-site link.

#### How does 'new since last run' work?

The Actor remembers the job IDs it has returned for the same sites and filters (or for the state name you set) and returns only unseen ones. Jobs are forgotten 60 days after they were last seen.

#### How is Canada detected?

From Workday's country field for the main location, and from the text of every other location: 'Canada', province names and codes and major Canadian cities. With Canada only on, the site's own country filter is used when it has one, so large global sites stay fast.

#### Why is salary empty?

Workday's public job pages have no structured pay field; where an employer states pay, it is inside the description text. The salary fields stay null so the schema matches Career Site Jobs.

#### What am I charged when nothing matches or a site fails?

Only the run's start fee when no job matches. Jobs are charged one by one as they are saved; jobs dropped by your filters or already returned in new-jobs mode are not charged, and neither are sites that could not be read. A site that stops part-way keeps and charges the jobs read before the error, and the status message names it. If no site can be read at all, the run fails and lists why.

#### How many jobs can one run return?

Up to 30 career sites per run (links, company names and starter list together). Per site, 'Max jobs per site' caps the result (0 = no limit), and Workday itself returns at most 2,000 jobs per search; each title keyword is its own search, so keywords or a country filter help on very large sites.

#### How long does a run take?

Each job needs one request for its own page, at most 3 sites and 4 job pages at a time. In our tests 405 jobs from 27 sites took 112 s, and a keyword matching nothing on 30 large sites took 22 s. A keyword that Workday finds in many descriptions but few titles is slower, because those hits are still paged (452 s on 30 sites in our test).

#### Why was a site skipped or marked partial?

The status message lists sites that were not found (check the link), sites whose robots.txt disallows the career pages or the job search, and sites that stopped part-way or hit the 2,000-result cap. If robots.txt cannot be read at all, the site is skipped to be safe; run again later.

#### Are duplicates removed?

Yes, within a run: each job is saved once by 'job_id', even when several title keywords find it or a site is given both as a link and as a company name. Across runs, use 'Only new jobs since last run'.

#### What do the main fields mean?

'company_token' is the Workday tenant and site, e.g. td/TD_Bank_Careers. 'employment_type' is normalised (FULL_TIME, PART_TIME...) and 'employment_type_raw' is the site's wording. 'countries' are ISO codes and 'provinces' Canadian province codes for all of the job's locations; 'is_canada' is true when any location is in Canada. 'remote' is true when the employer marks the job remote; 'posted_at' is Workday's posting start date.

#### Does it use a proxy?

No. Workday career sites answer their public job search without one, so there is no proxy setting and no proxy cost.

#### Can I combine these jobs with Greenhouse or Lever jobs?

Yes. Rows have the same 27 fields as Career Site Jobs Scraper, which covers Greenhouse, Lever, Ashby and SmartRecruiters, so the datasets append into one table; the 'ats' field says which system each job came from.

### Lawful use

- B2B use only: descriptions are kept as the employer published them and can name a hiring contact or a mailbox. That is business contact information; use it only for business purposes such as job search, hiring-market research or a relevant business enquiry, never for consumer marketing.
- No spam: contact people only with relevant, individual business messages, identify yourself, and honour every opt-out at once. Bulk unsolicited email built from this data is not allowed.
- You are responsible for complying with the anti-spam and privacy laws that apply to you and to the people you contact, including Canada's CASL, the US CAN-SPAM Act and the EU/UK GDPR (lawful basis, transparency, the right to object).
- Data is returned as shown publicly on the source. Removal requests: open an issue on this Actor's Issues tab naming the person, email address or domain to remove. It is added to our suppression list and honoured within 7 days; from then on matching records are not returned.
- robots.txt is checked. Data is returned as shown publicly on the source; people can ask for removal by opening an issue on this Actor's Issues tab.

### Limits (stated honestly)

- Company-name lookup covers a bundled list of 141 verified employers (27 in the starter list, 15 Canadian); for any other company paste its Workday career-site link. There is no search across all Workday companies. At most 30 career sites per run, names and starter list included; split longer lists across runs.
- Workday's search returns at most 2,000 jobs per site query. On larger sites use Canada only, countries or title keywords to stay under it (each title keyword is its own Workday search); the run's status message says when the cap was hit.
- Title keywords are sent to Workday's own search, which matches whole words (with stemming, so 'engineer' also finds 'Engineering'), and the job title is then checked for the keyword. Use whole words: a fragment such as 'eng' can miss titles. At most 10 keywords.
- Sites whose robots.txt disallows their career pages (for example RBC's) are skipped.
- Workday publishes a posting date, not a time, and no update time: posted_at is YYYY-MM-DD and updated_at equals it. Department, team and salary fields are always empty.
- Company is the bundled-list name for starter-list sites and company-name lookups, otherwise the hiring entity Workday publishes, which can be a legal subsidiary name (e.g. 'NVIDIA Canada Dev. Inc.').
- Each job needs one extra request for its page, so a full 2,000-job site takes a few minutes.

### Works great with

- **Then: [Career Page Monitor](https://apify.com/aurelix/hiring-signal-monitor)**: put the same Workday site links into its `companies` input to track new, removed and reposted roles per company

### Related Aurelix tools

Public Aurelix Actors, grouped by the data they collect. All are pay-per-result and need no login.

#### Jobs and hiring data

- **[Job Bank Canada Scraper API](https://apify.com/aurelix/job-bank-canada-scraper)**: Official Job Bank Canada postings by month: NOC and NAICS codes, wages, hours and location.
- **[Greenhouse Jobs Scraper](https://apify.com/aurelix/greenhouse-jobs-scraper)**: Live jobs from a company's Greenhouse, Lever, Ashby or SmartRecruiters board, with salary and Canadian province tags.
- **[Career Page Monitor](https://apify.com/aurelix/hiring-signal-monitor)**: New, removed and reposted roles plus hiring velocity per company, from seven job-board systems including Workday.
- **[LinkedIn Jobs Country Filter Scraper](https://apify.com/aurelix/linkedin-jobs)**: Public LinkedIn job postings by keyword and country: title, company, location, seniority, job type, salary text, description.
- **[Multiple Job Boards Scraper](https://apify.com/aurelix/multi-job-board-scraper)**: LinkedIn, about 50 company career sites, Remote OK and We Work Remotely jobs in one deduplicated list.
- **[Remote Job Board Scraper API](https://apify.com/aurelix/remote-jobs-scraper)**: Remote OK and We Work Remotely jobs in one deduplicated list with salary, regions and tags.
- **[Wellfound Jobs API & Scraper](https://apify.com/aurelix/wellfound-jobs-scraper)**: Wellfound startup jobs with salary and equity ranges, company stage and size, $0.50 per 1,000.

#### E-commerce and product data

- **[AliExpress Scraper API](https://apify.com/aurelix/aliexpress-product-search)**: AliExpress search results by keyword: price, discount, rating, units sold, ship-from country and sponsored flag.
- **[Amazon Best Sellers & Amazon New Releases](https://apify.com/aurelix/amazon-best-sellers)**: Amazon Best Sellers and New Releases top 100 on 10 marketplaces: rank, ASIN, price, rating, rank change.
- **[Best Buy Canada Scraper API](https://apify.com/aurelix/best-buy-canada-scraper)**: Best Buy Canada search results: CAD price, sale savings, rating, reviews and seller, plus optional UPC and specs.
- **[Shopify Product Export Scraper](https://apify.com/aurelix/shopify-products-scraper)**: Every public product of any Shopify store with variants, SKUs, prices, barcodes, stock counts and collections.
- **[Shopify Best Sellers Tracker](https://apify.com/aurelix/shopify-best-sellers-tracker)**: Competitor Shopify stores' best-sellers, new products, price changes, stock-outs and restocks since your last run, plus catalogue summary.

#### Leads and company data

- **[Companies House Scraper](https://apify.com/aurelix/companies-house-scraper)**: Newly incorporated UK companies from Companies House: SIC codes, region, registered office, directors with roles.
- **[Contact Page Scraper](https://apify.com/aurelix/contact-details-scraper)**: Published company emails, phones, addresses, social pages and team members from a list of company websites.
- **[Decision Maker Finder](https://apify.com/aurelix/decision-maker-finder)**: Founders, CEOs, VPs and department heads from company team pages, with title, seniority and function.
- **[Newly Funded Companies Hiring](https://apify.com/aurelix/funded-companies-hiring)**: Companies that just raised money (SEC Form D), with their open roles and business contacts, as a new-only monitor.
- **[Google Maps Phone Scraper](https://apify.com/aurelix/google-maps-scraper)**: Local business lists from Google Maps: phones, websites, ratings, hours, coordinates; optional website emails and socials.
- **[Recently Funded Companies API](https://apify.com/aurelix/recently-funded-companies)**: US companies that just filed an SEC Form D: amount raised, industry, state, executives, confirmed website.
- **[Tech Stack API](https://apify.com/aurelix/tech-stack-detector)**: CMS, e-commerce platform, analytics, ad pixels, chat, CDN and email provider for each domain you enter.
- **[Yellow Pages Canada Scraper](https://apify.com/aurelix/yellow-pages-canada-scraper)**: YellowPages.ca businesses by search term and city: phone, website, address, postal code, hours and rating.

#### Ad intelligence

- **[Competitor Watch](https://apify.com/aurelix/competitor-watch)**: One report per competitor with only what is new: Meta and TikTok ads, page changes, Shopify products and prices, jobs.
- **[Facebook Ad Library Search & API](https://apify.com/aurelix/facebook-ad-library-scraper)**: Facebook and Instagram business ads from the Meta Ad Library: copy, creatives, landing pages, dates, optional EU reach.
- **[TikTok Ads Library API](https://apify.com/aurelix/tiktok-ads-library-scraper)**: TikTok Ads Library ads for Europe, UK, Switzerland and Turkey with targeting, reach, ad text and landing pages.

#### Canada and government data

- **[Canada Building Permits](https://apify.com/aurelix/canada-building-permits-scraper)**: Building permits and development applications from 7 Canadian cities: address, type, status, dates, value, applicant, contractor and Toronto planner contact.
- **[Government Tenders Scraper](https://apify.com/aurelix/government-tenders-scraper)**: Open tenders from SAM.gov, CanadaBuys and EU TED in one table: buyer, codes, value, deadline, contact and link.
- **[USPTO Trademark API](https://apify.com/aurelix/uspto-trademark-search)**: US trademark search and watch from USPTO: mark, owner or number lookups, new filings, owner, attorney, goods.

#### AI, content and SEO

- **[Google Trends by Region](https://apify.com/aurelix/google-trends-scraper)**: Google Trends interest over time, by region and rising queries for any number of keywords, plus trending searches.
- **[Google Autocomplete API](https://apify.com/aurelix/google-autocomplete-scraper)**: Expands seed keywords into hundreds of real Google and YouTube autocomplete phrases, tagged by search intent.
- **[PDF Table Extraction & PDF to Markdown OCR](https://apify.com/aurelix/pdf-to-markdown)**: Turns linked PDF and Word files into Markdown per page, with tables as JSON rows, RAG chunks and OCR.
- **[Broken Link Crawler & SEO Audit](https://apify.com/aurelix/seo-audit-crawler)**: Audits a whole site: one row per page with SEO checks and broken links, plus a ranked issues summary.
- **[Bulk TikTok Transcripts Scraper](https://apify.com/aurelix/tiktok-transcript-scraper)**: Returns TikTok video transcripts as text, timed segments and SRT, from video links or @profiles' latest videos.
- **[Website to Markdown API](https://apify.com/aurelix/website-to-markdown)**: Crawls a site and returns one row of clean main-content Markdown per page, with title, headings and links.
- **[YouTube Transcript Scraper](https://apify.com/aurelix/youtube-transcript-scraper)**: Returns YouTube video transcripts as text, timed segments and AI chunks, from videos, channels, playlists or searches.
- **[YouTube Video Scraper API](https://apify.com/aurelix/youtube-video-scraper)**: Full details for every YouTube video in a search, channel or playlist: views, likes, comments, tags, publish time.

#### More data tools

- **[Agoda API (Unofficial)](https://apify.com/aurelix/agoda-reviews-scraper)**: Scrape Agoda guest reviews at $0.50 per 1,000 with this unofficial Agoda API, cheaper than the leading tools: Agoda and...
- **[Tennis Betting Odds Scraper](https://apify.com/aurelix/tennis-odds-scraper)**: Tennis results and upcoming matches with opening and closing odds per bookmaker and implied probabilities.

### Recent changes

- **0.1**: Descriptions are returned as the employer published them, email addresses included.

The full history is on the **Changelog** tab.

### Tested daily

An automated health check runs this Actor every day on a fixed input and checks that at least 4 jobs come back with `job_id`, `title`, `company`, `apply_url`, `posted_at`, `source_url` filled in; a failed check alerts the maintainer straight away.

### Your feedback

Missing a field, found a bug or need another filter? Open an issue on the **Issues** tab; we aim to answer within a day. If this Actor saved you time, a short review helps other people find it.

# Changelog

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

# Actor input Schema

## `sites` (type: `array`):

Workday career-site links, as you see them in the browser: e.g. https://td.wd3.myworkdayjobs.com/TD_Bank_Careers, https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite, https://wd3.myworkdaysite.com/recruiting/magna/Magna, or the short form 'td.wd3/TD_Bank_Careers'. A link to a single job on the site also works. Leave empty to use only the starter list. At most 30 sites per run, starter list included; split longer lists across runs.

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

Company names to look up in the bundled list of 141 verified Workday employers, e.g. \['Wells Fargo', 'Pfizer', 'TD Bank']. Case and punctuation are ignored, and a unique part of a name works ('Merck'). Names not in the list are reported in the log; paste that company's career-site URL into 'sites' instead. Counts toward the 30-site limit.

## `starterList` (type: `string`):

Add a curated list of verified Workday career sites. 'canada' = 15 Canadian-headquartered employers (TD, BMO, CIBC, Manulife, Sun Life, Thomson Reuters, Enbridge, TC Energy, Magna, Suncor, Intact, Brookfield, CPP Investments, Cenovus, CAE); 'all' = those plus 12 large global employers (NVIDIA, Salesforce, Adobe, Intel and others); 'none' = only the sites you list.

## `canadaOnly` (type: `boolean`):

Keep only jobs located in Canada (any of the job's locations).

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

Keep only jobs in these countries, as two-letter ISO codes, e.g. \['CA', 'US', 'GB']. Empty = all countries.

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

Keep only jobs the employer marks as remote.

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

Keep only jobs whose title contains at least one of these words (case-insensitive), e.g. \['engineer', 'analyst']. Each keyword is sent to the site's own Workday search, so use whole words: a word fragment such as 'eng' may miss titles. At most 10. Empty = all titles.

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

Upper limit of results per career site after filters, in the site's own order (usually newest first). 0 = no limit. Example: 50.

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

Include the job description as plain text and HTML. Turn off for smaller output.

## `incremental` (type: `boolean`):

Return only jobs not returned by a previous run with the same sites and filters. Use with a daily schedule for a feed of new postings.

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

Name for the 'new since last run' memory. Leave empty to derive it from the sites and filters; set it to keep separate feeds apart, e.g. 'banks-toronto'.

## `slackWebhookUrl` (type: `string`):

After each run, post a short digest to Slack: how many results were saved (new ones only when 'Only new jobs since last run' is on) and the top 10 with links, e.g. https://hooks.slack.com/services/T000/B000/XXXX. Nothing is posted when the run saved nothing. Leave empty to skip.

## `webhookUrl` (type: `string`):

After each run, POST the same digest as JSON (actor, newOnly, count, items = top 10 results, runUrl, text) to any URL, e.g. a Zapier, Make or n8n webhook. Nothing is sent when the run saved nothing. Leave empty to skip.

## Actor input object example

```json
{
  "sites": [
    "https://td.wd3.myworkdayjobs.com/TD_Bank_Careers",
    "https://enbridge.wd3.myworkdayjobs.com/enbridge_careers"
  ],
  "companies": [],
  "starterList": "none",
  "canadaOnly": false,
  "countries": [],
  "remoteOnly": false,
  "titleKeywords": [],
  "maxJobsPerSite": 20,
  "includeDescription": true,
  "incremental": false
}
```

# Actor output Schema

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

All job postings found in this run, one item per job.

# 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 = {
    "sites": [
        "https://td.wd3.myworkdayjobs.com/TD_Bank_Careers",
        "https://enbridge.wd3.myworkdayjobs.com/enbridge_careers"
    ],
    "maxJobsPerSite": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("aurelix/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 = {
    "sites": [
        "https://td.wd3.myworkdayjobs.com/TD_Bank_Careers",
        "https://enbridge.wd3.myworkdayjobs.com/enbridge_careers",
    ],
    "maxJobsPerSite": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("aurelix/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 '{
  "sites": [
    "https://td.wd3.myworkdayjobs.com/TD_Bank_Careers",
    "https://enbridge.wd3.myworkdayjobs.com/enbridge_careers"
  ],
  "maxJobsPerSite": 20
}' |
apify call aurelix/workday-jobs-scraper --silent --output-dataset

```

## MCP server setup

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