# Workday Jobs Scraper: Career Sites to CSV or JSON (`quicksloth/workday-jobs-scraper`) Actor

Scrape public job postings from Workday career sites (myworkdayjobs.com) into one clean schema. Paste each company's career-site address and get title, locations, remote type, posting date and apply link. Filters, an only-new-jobs mode for scheduled runs, and no recruiter or contact fields.

- **URL**: https://apify.com/quicksloth/workday-jobs-scraper.md
- **Developed by:** [Quicksloth](https://apify.com/quicksloth) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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.

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

Get the open jobs of the companies you follow from their public **Workday** career sites, in **one clean table**. Paste the career-site address of each company; the Actor reads the public postings and returns them as JSON, CSV or Excel: title, every location, remote or hybrid, employment type, posting date, job link and apply link. Switch on **only new jobs** for scheduled runs and, after the first run, you pay only for postings that are new or changed.

*Workday is the HR software that many large employers use to publish their job openings, on career sites at `myworkdayjobs.com`.*

- **One line per company.** Paste Workday career-site addresses, up to 1,000 per run.
- **Same output fields as our ATS Jobs Scraper.** If you also use [ATS Jobs Scraper](https://apify.com/quicksloth/ats-jobs-scraper) for Greenhouse, Lever and Ashby, both datasets have the same fields, so you can merge them without mapping. The `ats` field tells the sources apart.
- **Only new or changed jobs.** For monitoring, get just what appeared or changed since the last run. Postings already returned are not read again, and you pay only for the new ones.
- **Filters before you pay.** Workday's own search, title keywords and "posted in the last N days" cut the list before the details of each posting are read; location and remote filters are applied to the posting details. You pay only for jobs that are saved.
- **Spending under control.** Set a maximum number of jobs or a maximum cost per run; the Actor stops cleanly and says why. Runs started from the Console form are prefilled with a 500-job limit (about $0.75); API and MCP runs have no limit unless you set `maxJobs` or a maximum cost.
- **No personal-data fields.** The output has no recruiter, hiring-manager or contact fields, and job descriptions are off unless you ask for them (see [Legal and data protection](#legal-and-data-protection)).

Free Apify plan: up to 100 jobs per run, enough to test it on your own list of companies.

### What can you do with it?

- **Sales and business development:** use hiring as a buying signal. Find companies opening roles that suggest a need for your product (for example data-engineering jobs) with `searchText` or `titleKeywords`, then watch them on every scheduled run with *Only new or changed jobs*.
- **Recruiting and talent intelligence:** follow the openings, locations and work type of target employers and see the new roles on every scheduled run.
- **Labor-market and hiring-trend analysis:** keep the results of each run and compare open roles by location, work type or employment type over time (`scrapedAt` marks the run, `postedAt` the posting day).
- **Career-site export:** turn a company's career site into a CSV or Excel file for your own analysis (see [Limits](#limits) for very large sites).
- **Internal job alerts:** send new postings to a spreadsheet, a database or a chat channel with Apify schedules, webhooks and integrations.
- **AI agents and data pipelines:** one predictable JSON schema, available through the Apify API and, for AI agents, through [Apify's MCP server](https://docs.apify.com/integrations/mcp).

### How to get jobs from a Workday career site

1. Open the company's careers page, click any job and copy the address up to the site name, for example `https://<company>.wd5.myworkdayjobs.com/<site>`. Paste it into **Workday career sites**, one address per line. A language part (`/en-US/`) or a job path after the site name is accepted and ignored.
2. Optional: add a search text, title or location keywords, limit the posting date with **Posted in the last N days**, and set **Max jobs in total**.
3. Click **Start**. The **Overview** table of the dataset shows title, company, career site, location, workplace, type, posting date and job page. Download it as JSON, CSV or Excel, or read it through the Apify API.

### Pricing

You pay per job saved to the dataset: **$1.50 per 1,000 jobs** ($0.0015 per job), plus Apify's standard start charge of $0.00005 per run. Career sites that are not found or are skipped, jobs removed by your filters, and postings already returned in only-new-jobs mode cost nothing.

| Jobs saved | Cost |
|---|---|
| 100 | $0.15 |
| 1,000 | $1.50 |
| 2,000 | $3.00 |
| 10,000 | $15.00 |

**Monitoring example.** You follow 20 career sites and run the Actor once a day with *Only new or changed jobs* on. The first run saves all matching jobs. If, say, 100 jobs are new or changed on a given day (your number will differ), that run costs about $0.15, and 30 such days cost about $4.50.

**Cost control.** In Apify Console you can set a maximum cost for each run; the Actor stops cleanly when it is reached and says so in the status message. Runs started from the Console form are prefilled with a 500-job limit (about $0.75): change or clear it to get more. API and MCP runs have no limit unless you set `maxJobs` or a maximum cost.

**Free plan.** Users on the free Apify plan get up to 100 jobs per run. The run log and status message say when this limit is reached. Paid plans have no such limit.

### Accepted career-site addresses

| Format | Example |
|---|---|
| Career site on `myworkdayjobs.com` | `https://salesforce.wd12.myworkdayjobs.com/External_Career_Site` |
| With a language part | `https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite` |
| A job page (the site name is read from it) | `https://adobe.wd5.myworkdayjobs.com/external_experienced/job/Bangalore/Enterprise-Architect_R169928` |
| Career site on `myworkdaysite.com` | `https://wd3.myworkdaysite.com/recruiting/<company>/<site>` |

The `myworkdaysite.com` format is accepted, but we have tested mostly `myworkdayjobs.com` career sites. A company's own careers page on its own domain is not an address the Actor can read: click a job there, and if the address changes to `myworkdayjobs.com` or `myworkdaysite.com`, use that one.

### Input examples

**Basic: the newest engineering jobs of two companies**

```json
{
    "companies": [
        "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site",
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
    ],
    "titleKeywords": ["engineer"],
    "postedWithinDays": 7,
    "maxJobs": 200
}
```

**Jobs with "Remote" in a location, posted in the last 14 days**

```json
{
    "companies": [
        "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site",
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
    ],
    "locationKeywords": ["Remote"],
    "postedWithinDays": 14,
    "maxJobs": 200
}
```

**Scheduled monitoring: only new or changed jobs**

```json
{
    "companies": [
        "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site",
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
    ],
    "searchText": "data engineer",
    "postedWithinDays": 7,
    "onlyNewJobs": true,
    "stateKey": "weekly-data-roles"
}
```

#### Input fields

| Field | Type | Default | Description |
|---|---|---|---|
| `companies` | array of strings | (required) | Workday career-site addresses, one per line. Up to 1,000 per run. |
| `searchText` | string | empty | Sent to Workday's own search box (for example `data engineer`), so only matching postings are read: faster, and fewer jobs to pay for. Results then come in Workday's relevance order instead of newest first. |
| `titleKeywords` | array of strings | empty | Keep jobs whose title contains any of these words (case-insensitive; `engineer` also matches "engineering"). Applied before the details are read. |
| `locationKeywords` | array of strings | empty | Keep jobs with a location containing any of these words (case-insensitive), for example a city, a country or `Remote`. Needs the posting details: on a big career site combine it with `postedWithinDays`, `titleKeywords` or `searchText`. |
| `remoteOnly` | boolean | `false` | Keep only jobs whose work type is remote. When the company gives no work type, a location that says "Remote" counts too. See the FAQ. |
| `postedWithinDays` | integer | empty | Keep only jobs posted in the last N days (1–30). Empty or 0 = any date. |
| `includeDescription` | boolean | `false` | Add the job description as plain text (emails, phone numbers and names after labels such as "Recruiter:" removed). Makes the dataset much larger. |
| `onlyNewJobs` | boolean | `false` | Return only jobs that are new, or whose title or listed location changed, since the previous run with the same filters. |
| `stateKey` | string | empty | Optional name for the "only new jobs" history, so different scheduled tasks keep separate histories. |
| `maxJobsPerCompany` | integer | no limit | Keep at most this many jobs per career site (newest first, or in search order when `searchText` is set). |
| `maxJobs` | integer | no limit | Stop after this many jobs in total. The Console form is prefilled with 500; clear it for no limit. |

### Output

Each job is one dataset item. A field is `null` when the company does not publish it for that job.

```json
{
    "id": "workday:salesforce/External_Career_Site:Mid-Level-Senior-Backend-Software-Engineer_JR341307",
    "ats": "workday",
    "board": "salesforce/External_Career_Site",
    "companyName": "salesforce.com Israel Ltd.",
    "jobId": "Mid-Level-Senior-Backend-Software-Engineer_JR341307",
    "title": "Lead Backend Software Engineer",
    "department": null,
    "team": null,
    "locations": ["Israel - Tel Aviv"],
    "location": "Israel - Tel Aviv",
    "isRemote": false,
    "workplaceType": "hybrid",
    "employmentType": "full-time",
    "postedAt": "2026-10-08T00:00:00.000Z",
    "updatedAt": null,
    "url": "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site/job/Israel---Tel-Aviv/Mid-Level-Senior-Backend-Software-Engineer_JR341307",
    "applyUrl": "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site/job/Israel---Tel-Aviv/Mid-Level-Senior-Backend-Software-Engineer_JR341307/apply",
    "salaryMin": null,
    "salaryMax": null,
    "salaryCurrency": null,
    "salaryInterval": null,
    "salaryText": null,
    "descriptionText": null,
    "scrapedAt": "2026-10-08T07:00:00.000Z"
}
```

| Field | Description |
|---|---|
| `id` | Unique, stable id: `workday:<tenant>/<site>:<jobId>`. |
| `ats` | Always `workday`. In [ATS Jobs Scraper](https://apify.com/quicksloth/ats-jobs-scraper) the same field says `greenhouse`, `lever` or `ashby`. |
| `board` | The career site, as `<tenant>/<site>`. Use it to group jobs by career site. |
| `companyName` | The hiring legal entity as the company publishes it, with a leading internal code such as "2100" removed. Large employers list their subsidiaries (for example a country entity) and some add their own prefix, so `companyName` can differ from the brand name. |
| `jobId` | The last part of the job address (unique per posting, also when a requisition is reposted). |
| `title` | Job title. |
| `locations`, `location` | Every location of the posting, and the first one. |
| `isRemote`, `workplaceType` | `workplaceType` is `remote`, `hybrid` or `onsite`. It comes from the company's own work-type label when there is one (for example "Office - Flexible" is reported as `hybrid`), otherwise from the word "Remote" or "Hybrid" in the locations; `null` when neither says. `isRemote` is `true` or `false` only when the label or the locations say so, otherwise `null`. |
| `employmentType` | `full-time`, `part-time`, `contract`, `internship` or `temporary` when Workday's time type matches; other labels are kept as the company writes them. |
| `postedAt` | Posting date, day precision (midnight UTC). |
| `url`, `applyUrl` | The job page on the company's career site, and the same address with `/apply` added. |
| `descriptionText` | Plain-text description when `includeDescription` is on, otherwise `null`. |
| `department`, `team`, `updatedAt`, `salary*` | Workday career sites do not publish these as fields: always `null`. They are kept so the schema is the same as in ATS Jobs Scraper. Pay that a company writes inside the description text is not extracted. |
| `scrapedAt` | When the run started (ISO 8601). |

#### Run summary

Every run also saves a summary in the default key-value store under the key `OUTPUT`:

```json
{
    "companies": [
        { "input": "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site", "board": "salesforce/External_Career_Site", "status": "ok", "listed": 60, "jobs": 10, "error": null }
    ],
    "totalJobs": 10,
    "newJobs": null,
    "stoppedBecause": null
}
```

`status` is `ok`, `failed` or `skipped`. `listed` is how many postings were found in the career site's list; `jobs` is how many were saved. `error` holds a note whenever something needs your attention, even when `status` is `ok` (for example postings that closed while the run was reading them). `stoppedBecause` is `maxResults`, `freePlanLimit` or `maxTotalChargeUsd` when a limit cut the results.

A career site that cannot be found, fails or is skipped does **not** stop the run and costs nothing: it is reported here and the other career sites continue. The run fails only if every career site fails.

### Only new jobs (scheduled runs)

Turn on `onlyNewJobs` and schedule the Actor (for example daily). The first run returns all matching jobs and remembers them. Later runs return only jobs that are **new** or whose **title or listed location changed** (for a posting with several locations, the list shows only their number). Postings already returned are not read again, so you pay only for the new ones. Jobs that were not returned because of a limit stay "unseen" and come back in the next run. A change made only inside the description is not noticed.

Tip: add `postedWithinDays` (at least as long as the gap between your runs) so the first run does not start with the whole career site.

The history is kept in a named key-value store in your account (`workday-jobs-seen-state`), separately for each career site and for each combination of search text, title keywords, location keywords and remote setting. If you run several scheduled tasks with the same filters, give each one its own `stateKey`. Postings that your location or remote filter removes are not remembered: they are checked again on every run, at no cost to you.

### Limits

- Up to 1,000 career sites per run.
- **Workday returns at most 2,000 postings for one search.** On a career site with more open jobs than that, the Actor reads the first 2,000 of Workday's list (newest first on the career sites we tested, when there is no search text). To get the rest, use a narrower `searchText` (for example a job title: Workday's search also looks at the job text, so broad words match almost everything), or schedule short runs with `postedWithinDays` and `onlyNewJobs`. When a career site hits this cap, the `error` field of the run summary says so and gives the approximate number of postings on the site.
- Workday shows posting dates older than 30 days only as "30+ days ago", so `postedWithinDays` goes up to 30.
- Workday career sites do not publish salary, department or team, so those fields are always `null`.
- One request per job is needed to read its details. `searchText`, `titleKeywords`, `postedWithinDays` and `onlyNewJobs` are applied before that request and make runs faster. `locationKeywords` and `remoteOnly` need the details, so on a big career site combine them with one of the others.
- The Actor needs the address of the career site. It cannot look a company up by name and has no directory of employers.
- A career site whose robots.txt does not allow reading it is skipped (see below).

### Legal and data protection

- The Actor reads only **public career sites** that companies publish for job seekers: the same data a browser loads when you open the career page. No login, no private data. Workday does not document these addresses for outside use (see the FAQ).
- It reads the robots.txt of each career site (once per run) and skips a career site whose robots.txt does not allow it. Some companies disallow their career site there and others allow it (checked on 2026-10-08).
- It is gentle with the sites: at most 3 career sites at a time and 4 job-detail requests at a time per career site, a pause and a retry when a site answers "too many requests", and a User-Agent that names the Actor.
- **No personal-data fields**: the output has no names, emails or phone numbers of people. Descriptions are off by default. When you turn them on, they are free text written by the employer: email addresses, phone numbers in common formats and names after labels such as "Recruiter:", "Hiring Manager:" or "Contact:" are removed, but other mentions of people may remain. Check that you have a legal basis before storing them, and that your use of the employer's text is allowed.
- Workday is a trademark of Workday, Inc. Company names in this page belong to their owners; they are named only to say which career sites the Actor can read. This Actor is not affiliated with or endorsed by Workday, Inc. or by the companies whose career sites it reads.
- You are responsible for how you use the data, including compliance with the laws that apply to you and with the terms of the websites you read.

### FAQ

**How do I find a company's career-site address?** Open the company's careers page and click a job. If the address contains `myworkdayjobs.com` or `myworkdaysite.com`, copy it up to the site name.

**My company's careers page is on its own domain. Can I use it?** Click any job: if the address changes to `myworkdayjobs.com` or `myworkdaysite.com`, use that address. Pages that only embed Workday under another domain are not supported yet.

**Can it find companies for me, or read a company by name?** No. It reads the career sites you list; it has no company directory and no search across all employers. Use `searchText`, title and location keywords to filter the jobs of your companies.

**Do I need proxies or a browser?** No. The Actor calls the same public JSON addresses that a career page loads, with plain HTTP requests.

**Is this a Workday product or API?** No. The Actor is independent. It reads the JSON that each public career page itself loads, and Workday does not document those addresses for outside use. If Workday changes them, the Actor can stop working until it is updated; tell us in the Issues tab.

**How does the remote filter work?** Each company fills in its own work-type label on Workday, in its own words (for example "Office - Flexible"), or leaves it empty. The Actor reports `remote`, `hybrid` or `onsite` when the label says so, and otherwise looks for "Remote" or "Hybrid" in the location text. `remoteOnly` keeps jobs reported as remote. A role that the company labels flexible is reported as `hybrid` and is not kept, even if its location says "Remote", and a remote role with no label and no "Remote" in its location is not detected. To keep every job that has "Remote" in a location, use `locationKeywords` with `Remote` instead.

**Why did a career site fail with HTTP 404, 422 or 400?** The company or site name in the address is wrong, or the company moved its career site. Open the address in a browser and copy it again.

**Why was a career site skipped?** Its robots.txt does not allow reading it, the same career site appears twice in your input, or the run had already reached its limit. The reason is in the `error` field of the run summary.

**Why do I see fewer jobs than on the career site?** Workday lists at most 2,000 postings per search (see Limits); your filters and `postedWithinDays` remove postings; and postings that closed between the list and the details are skipped (the run summary notes how many).

**Why are some fields always empty?** A field is `null` when the company does not publish it. Workday career sites never publish salary, department or team as fields.

**What counts as "changed" in only-new mode?** A change in the title or in the location shown in the career-site list. A change only in the description is not noticed. A job that disappears and is posted again later is returned as new when the whole list was read.

**How current is the data?** Each run reads the live career sites. `scrapedAt` is the time of the run; `postedAt` is the posting day shown by Workday.

**Do you support Greenhouse, Lever or Ashby?** Not in this Actor. Use [ATS Jobs Scraper](https://apify.com/quicksloth/ats-jobs-scraper): it has the same output fields, so the two datasets can be combined.

**How many career sites can I add?** Up to 1,000 per run.

### Support

Found a problem, or a career site that does not work? Open an issue in the **Issues** tab of this Actor and include the run ID and the career-site address.

### Changelog

- **0.2 (2026-10-09)**: descriptions remove more phone numbers (national numbers written in one or two blocks, such as UK and Australian numbers, and numbers after labels like "Phone:") and names after "Contact:" or "Name:" at the start of a line.
- **0.1 (2026-10-08)**: first public release.
  - Reads public Workday career sites (`myworkdayjobs.com`, and `myworkdaysite.com` addresses) from their addresses, up to 1,000 per run.
  - One output schema with the same fields as ATS Jobs Scraper: locations, work type, employment type, posting date, job and apply links.
  - Filters: Workday search text, title keywords, location keywords, remote only, posted in the last N days, maximum jobs per career site and in total.
  - Optional job descriptions as plain text, with email addresses, phone numbers and names after labels such as "Recruiter:" removed.
  - Only-new-or-changed mode for scheduled runs, with separate histories through `stateKey`.
  - Run summary per career site in the `OUTPUT` record; one failing career site does not stop the run; career sites whose robots.txt disallows reading are skipped.
  - Pay-per-event pricing: $0.0015 per job saved. Free plan: up to 100 jobs per run.
  - Known limits: at most 2,000 postings per search; posting dates only up to 30 days back; no salary, department or team.

# Actor input Schema

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

One career site per line: the address of the company's Workday career page, e.g. https://<company>.wd5.myworkdayjobs.com/<site> (with or without the language part, e.g. /en-US/) or https://wd3.myworkdaysite.com/recruiting/<company>/<site>. Open the company's careers page, click a job, and copy the address up to the site name.

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

Optional. Sent to Workday's own search box (e.g. "data engineer"), so only matching postings are read: faster and cheaper on big sites. Results then come in Workday's relevance order instead of newest first.

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

Keep only jobs whose title contains at least one of these words (case-insensitive). Leave empty to keep all.

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

Keep only jobs with a location containing at least one of these words (case-insensitive), e.g. a city or country. Leave empty to keep all.

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

Keep only jobs marked as remote by the company (or with "remote" in one of their locations).

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

Keep only jobs posted in the last N days (1-30). Workday shows older postings only as "30+ days ago". Empty or 0 = any date.

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

Add the full job description as plain text. Descriptions are the employer's own text: email addresses, phone numbers in common formats and names after labels such as "Recruiter:" are removed, but other mentions of people may remain. Makes the dataset much larger.

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

For scheduled runs: return only jobs that are new (or whose title or locations changed) since the previous run with the same filters. Jobs already returned are not even re-read, so scheduled runs are fast and cheap. The first run returns everything.

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

Optional. Give each scheduled task its own name so their "only new jobs" histories stay separate. By default the history is shared by runs with the same filters.

## `maxJobsPerCompany` (type: `integer`):

Keep at most this many jobs per career site (newest first, or in search order when "Search text" is set). Empty or 0 = no limit.

## `maxJobs` (type: `integer`):

Stop after this many jobs in total. Empty or 0 = no limit (the run also stops at the maximum cost you set for the run).

## Actor input object example

```json
{
  "companies": [
    "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site",
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "searchText": "data engineer",
  "titleKeywords": [
    "engineer",
    "data"
  ],
  "locationKeywords": [
    "London",
    "Remote"
  ],
  "remoteOnly": false,
  "postedWithinDays": 7,
  "includeDescription": false,
  "onlyNewJobs": false,
  "stateKey": "weekly-engineering",
  "maxJobsPerCompany": 50,
  "maxJobs": 500
}
```

# Actor output Schema

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

No description

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

No description

# 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 = {
    "companies": [
        "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site",
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
    ],
    "maxJobs": 500
};

// Run the Actor and wait for it to finish
const run = await client.actor("quicksloth/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 = {
    "companies": [
        "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site",
        "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
    ],
    "maxJobs": 500,
}

# Run the Actor and wait for it to finish
run = client.actor("quicksloth/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 '{
  "companies": [
    "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site",
    "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
  ],
  "maxJobs": 500
}' |
apify call quicksloth/workday-jobs-scraper --silent --output-dataset

```

## MCP server setup

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