{
  "data": {
    "id": "L7eadpJIq6UsaeicD",
    "actId": "vBZKUgBIGEdKTY5mi",
    "userId": "IYgBDiXtHOijAaUel",
    "startedAt": "2026-11-02T08:54:02.631Z",
    "finishedAt": "2026-11-02T08:54:14.732Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 12030,
      "runTimeSecs": 12.03,
      "computeUnits": 0.013366666666666667,
      "imageSizeBytes": 359349760
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "QYo53EZkJk0prePWY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Workday Careers Site Job Listings Extractor Input\",\n  \"description\": \"Choose how to find jobs: paste one or more Workday careers-site URLs (mode=careerSite), name a tenant and its site (mode=tenant), or paste direct job URLs (mode=jobDetail). One of startUrls or tenant + site is required. Then filter by keyword, location, job family, posting date or remote work.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"description\": \"How to find jobs. 'Scrape career site URLs' accepts careers pages or job URLs. 'Scrape a tenant by name' uses tenant + site. 'Scrape specific job URLs' requires /job/... URLs in startUrls.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"careerSite\",\n        \"tenant\",\n        \"jobDetail\"\n      ],\n      \"enumTitles\": [\n        \"Scrape career site URLs\",\n        \"Scrape a tenant by name\",\n        \"Scrape specific job URLs\"\n      ],\n      \"default\": \"careerSite\",\n      \"prefill\": \"careerSite\"\n    },\n    \"startUrls\": {\n      \"title\": \"Workday Careers URLs\",\n      \"type\": \"array\",\n      \"description\": \"Public Workday careers-site or job URLs (mode=careerSite or jobDetail). Paste the URL from your browser; both myworkdayjobs.com and myworkdaysite.com are supported. In careerSite mode a careers URL scrapes the site's jobs and a /job/... URL scrapes that single posting; in jobDetail mode use a /job/... URL.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [\n        \"https://salesforce.wd12.myworkdayjobs.com/External_Career_Site\"\n      ],\n      \"prefill\": [\n        \"https://salesforce.wd12.myworkdayjobs.com/External_Career_Site\"\n      ]\n    },\n    \"tenant\": {\n      \"title\": \"Tenant\",\n      \"type\": \"string\",\n      \"description\": \"Workday tenant name, for example 'nvidia' or 'capitalone' (mode=tenant). You can also paste the full careers URL here or use 'tenant/site'. When the site ID is omitted, the actor finds the tenant's first public site automatically.\",\n      \"editor\": \"textfield\"\n    },\n    \"site\": {\n      \"title\": \"Career Site ID\",\n      \"type\": \"string\",\n      \"description\": \"Optional career site identifier shown in the URL after the tenant host, for example 'NVIDIAExternalCareerSite' or 'External_Career_Site' (mode=tenant). It is case-sensitive. Leave blank to discover the tenant's first public site automatically.\",\n      \"editor\": \"textfield\"\n    },\n    \"region\": {\n      \"title\": \"Workday Region\",\n      \"type\": \"string\",\n      \"description\": \"Workday data-center region. Leave 'auto' to detect it, or set wd1, wd3, wd5, wd12, wd103, and similar when you already know it (mode=tenant).\",\n      \"editor\": \"textfield\",\n      \"default\": \"auto\",\n      \"prefill\": \"auto\"\n    },\n    \"searchText\": {\n      \"title\": \"Search Keyword\",\n      \"type\": \"string\",\n      \"description\": \"Optional keyword passed to the site's own job search, for example 'engineer' or 'marketing'. Workday searches titles and descriptions.\",\n      \"editor\": \"textfield\"\n    },\n    \"locations\": {\n      \"title\": \"Locations\",\n      \"type\": \"array\",\n      \"description\": \"Optional locations to keep. Use names such as 'United States', 'New York', 'Remote' or 'US, CA, Santa Clara'; the actor matches them against the site's own location filters. Facet IDs are also accepted.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": [],\n      \"items\": {\n        \"type\": \"string\"\n      }\n    },\n    \"jobFamilies\": {\n      \"title\": \"Job Families\",\n      \"type\": \"array\",\n      \"description\": \"Optional job families or categories to keep, for example 'Engineering', 'Sales' or 'Finance'. Names come from the site's own Job Category filter; IDs are also accepted.\",\n      \"editor\": \"stringList\",\n      \"default\": [],\n      \"prefill\": [],\n      \"items\": {\n        \"type\": \"string\"\n      }\n    },\n    \"remoteOnly\": {\n      \"title\": \"Remote Jobs Only\",\n      \"type\": \"boolean\",\n      \"description\": \"Keep only postings the employer explicitly marks as remote. Hybrid and onsite postings are excluded. This turns on full detail fetching.\",\n      \"default\": false,\n      \"prefill\": false,\n      \"editor\": \"checkbox\"\n    },\n    \"postedWithin\": {\n      \"title\": \"Posted Within\",\n      \"type\": \"string\",\n      \"description\": \"Keep jobs posted within this window. 'Any time' applies no date filter. Use Posted After for an exact cutoff date.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"any\",\n        \"1 day\",\n        \"3 days\",\n        \"7 days\",\n        \"14 days\",\n        \"30 days\",\n        \"60 days\",\n        \"90 days\"\n      ],\n      \"enumTitles\": [\n        \"Any time\",\n        \"Last 24 hours\",\n        \"Last 3 days\",\n        \"Last 7 days\",\n        \"Last 14 days\",\n        \"Last 30 days\",\n        \"Last 60 days\",\n        \"Last 90 days\"\n      ],\n      \"default\": \"any\",\n      \"prefill\": \"any\"\n    },\n    \"postedAfter\": {\n      \"title\": \"Posted After\",\n      \"type\": \"string\",\n      \"description\": \"Optional exact cutoff date in YYYY-MM-DD form. When both Posted Within and Posted After are set, the stricter cutoff wins.\",\n      \"editor\": \"textfield\"\n    },\n    \"startDateFrom\": {\n      \"title\": \"Start Date From\",\n      \"type\": \"string\",\n      \"description\": \"Optional YYYY-MM-DD cutoff for the role's start date. Only applies when the posting publishes a start date. This turns on full detail fetching.\",\n      \"editor\": \"textfield\"\n    },\n    \"scrapeDetails\": {\n      \"title\": \"Include Full Job Details\",\n      \"type\": \"boolean\",\n      \"description\": \"Fetch each posting's public job page for the full description, exact posting date, employment type, work model and every location. Turn off for a fast listing-only run (title, location, requisition ID, posting label and URL). Direct job URLs always fetch details because a listing has no record for them.\",\n      \"default\": true,\n      \"prefill\": false,\n      \"editor\": \"checkbox\"\n    },\n    \"includeJobFamily\": {\n      \"title\": \"Include Job Family\",\n      \"type\": \"boolean\",\n      \"description\": \"Add each job's family or category (for example Engineering or Sales). This uses the site's own Job Category filter and is skipped automatically when a site has no such filter.\",\n      \"default\": true,\n      \"prefill\": false,\n      \"editor\": \"checkbox\"\n    },\n    \"maxItems\": {\n      \"title\": \"Max Items\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of jobs to save across all URLs. Jobs are returned in URL order, so a large first site can use the whole cap.\",\n      \"default\": 50,\n      \"prefill\": 3,\n      \"minimum\": 1,\n      \"maximum\": 10000,\n      \"editor\": \"number\"\n    },\n    \"proxyConfiguration\": {\n      \"title\": \"Proxy Configuration\",\n      \"type\": \"object\",\n      \"description\": \"Optional. The actor works without a proxy and chooses a working connection automatically; change this only if you need a specific proxy setup.\",\n      \"editor\": \"proxy\",\n      \"default\": {\n        \"useApifyProxy\": false\n      },\n      \"prefill\": {\n        \"useApifyProxy\": false\n      }\n    }\n  },\n  \"required\": [\n    \"mode\"\n  ]\n}",
    "readme": "# Workday Careers Site Job Listings Extractor\r\n\r\nWorkday powers the careers sites of thousands of employers, all at URLs ending in `myworkdayjobs.com` or `myworkdaysite.com`. Point this actor at any of them and get every open role as structured records: exact posting dates, requisition IDs, all locations, job family, remote or hybrid status, time type, published salary ranges, full descriptions and apply links. No login, no API key and no proxy setup.\r\n\r\n## What this actor does\r\n\r\n- **Works with any public Workday careers site** - paste a careers URL, a direct job URL, or use a tenant name (its career-site ID is discovered automatically when omitted). Both `myworkdayjobs.com` and `myworkdaysite.com` URL families are supported.\r\n- **Filters at the source** by keyword, location, job family and remote work, then applies posting-date and start-date cutoffs.\r\n- **Enriches every job** with the full HTML and plain-text description, exact posting date, employment type, work model, every location the role is open to, and a published salary range when the employer states one.\r\n- **Reads the whole site** - pages through all results, removes duplicates across pages and URLs, and splits large sites by job family, then by one small secondary facet such as time type or location when one family is still over Workday's per-query limit.\r\n- **Empty fields are omitted** - a missing salary, remote type or end date is omitted from that job's record instead of being sent empty.\r\n\r\n## Output per job\r\n\r\n**Identity and links**\r\n\r\n- `type` - `job_workday` for every real job record\r\n- `title` - job title\r\n- `id`, `requisitionId` - the requisition identifier, when the employer publishes one\r\n- `jobPostingId` - Workday's internal posting identifier\r\n- `url` - public job page\r\n- `applyUrl` - the posting page where the Apply button lives\r\n- `jobRequisitionUrl` - the employer's canonical posting URL\r\n- `externalPath` - the job's path on its careers site\r\n\r\n**Employer and source**\r\n\r\n- `hiringOrganization` - the legal entity name published on the posting; the Workday tenant slug when details are off or the posting page cannot be read, and omitted when a fetched posting publishes no organization name\r\n- `tenant`, `site`, `region` - the Workday tenant, career-site ID and data-center region the job came from\r\n\r\n**Locations**\r\n\r\n- `location` - primary location text\r\n- `locations` - every location the role is open to, when the posting lists more than one\r\n- `primaryLocation` - structured primary location, including country details\r\n- `additionalLocations` - other locations listed on the posting\r\n- `country`, `countryCode` - country of the primary location and its two-letter code\r\n\r\n**Work model**\r\n\r\n- `timeType` - full-time or part-time designation\r\n- `employmentType` - standardized employment type such as `FULL_TIME`\r\n- `remoteType` - the employer's own remote/hybrid label\r\n- `workplaceType` - normalized `remote`, `hybrid`, `onsite` or `field`\r\n- `jobLocationType` - `TELECOMMUTE` when the posting is marked remote\r\n\r\n**Dates**\r\n\r\n- `postedOn` - how the careers site displays the posting age\r\n- `postingDate` - exact posting date in ISO 8601 form\r\n- `startDate` - role start date, when published\r\n- `endDate`, `applicationCloseDate` - application close date, when published\r\n- `endDateText` - the employer's own end-date wording\r\n- `applicationTimeRemaining` - time left to apply, when shown\r\n\r\n**Description and pay**\r\n\r\n- `jobDescription` - full HTML description\r\n- `descriptionText` - plain-text version of the description\r\n- `compensationRangeMin`, `compensationRangeMax` - published pay range; when a posting lists several location-specific ranges, the range for the job's primary location is used\r\n- `compensationCurrency`, `compensationFrequency` - pay currency and hourly/monthly/yearly period\r\n- `compensationText` - the sentence the range was read from\r\n- `compensationType` - `range` or `single`\r\n\r\n**Classification and extras**\r\n\r\n- `jobFamily` - job family or category, when the site publishes one\r\n- `canApply`, `isPosted` - whether the posting is open to applicants\r\n- `questionnaireId`, `secondaryQuestionnaireId` - application questionnaire references, when present\r\n- `similarJobs` - related roles, each with `title`, `url`, and available listing details\r\n- `logoImage` - employer logo URL, when the site exposes one\r\n- `videoInfo` - embedded recruiting video details, when present\r\n- `scrapedAt` - ISO 8601 timestamp of the scrape\r\n\r\n## Input\r\n\r\n| Field | Type | Default | Description |\r\n|---|---|---|---|\r\n| `mode` | string | `careerSite` | `careerSite` (careers/job URLs), `tenant` (tenant + site), or `jobDetail` (specific `/job/...` URLs). |\r\n| `startUrls` | array | [\"https://salesforce.wd12.myworkdayjobs.com/External_Career_Site\"] | Workday careers-site or job URLs (mode=careerSite or jobDetail). |\r\n| `tenant` | string | - | Workday tenant name, for example `nvidia` (mode=tenant). |\r\n| `site` | string | - | Optional career-site ID from the URL, for example `NVIDIAExternalCareerSite` (mode=tenant). Leave it blank to discover the tenant's first public site automatically. |\r\n| `region` | string | `auto` | Workday data-center region; `auto` detects it (mode=tenant). |\r\n| `searchText` | string | - | Keyword passed to the site's own job search. |\r\n| `locations` | array | `[]` | Location names such as `United States`, `New York` or `Remote`. |\r\n| `jobFamilies` | array | `[]` | Job family names such as `Engineering` or `Sales`. |\r\n| `remoteOnly` | boolean | `false` | Keep only postings explicitly marked remote. |\r\n| `postedWithin` | string | `any` | `any`, `1 day`, `3 days`, `7 days`, `14 days`, `30 days`, `60 days` or `90 days`. |\r\n| `postedAfter` | string | - | Exact cutoff date in `YYYY-MM-DD` form. |\r\n| `startDateFrom` | string | - | Keep roles starting on or after this `YYYY-MM-DD` date. |\r\n| `scrapeDetails` | boolean | `true` | Fetch the full description, exact date, work model and all locations. |\r\n| `includeJobFamily` | boolean | `true` | Add the job family/category to each record. |\r\n| `maxItems` | integer | `50` | Maximum jobs to save across all URLs (1-10,000). Jobs are returned in URL order, so a large first site can use the whole cap. |\r\n| `proxyConfiguration` | object | proxy off | Optional. The actor works without a proxy. |\r\n\r\n### Example: every open role at one company\r\n\r\n```json\r\n{\r\n    \"mode\": \"careerSite\",\r\n    \"startUrls\": [\r\n        \"https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite\"\r\n    ],\r\n    \"maxItems\": 500\r\n}\r\n```\r\n\r\n### Example: engineering roles in the United States\r\n\r\n```json\r\n{\r\n    \"mode\": \"careerSite\",\r\n    \"startUrls\": [\r\n        \"https://salesforce.wd12.myworkdayjobs.com/External_Career_Site\"\r\n    ],\r\n    \"searchText\": \"engineer\",\r\n    \"locations\": [\"United States\"],\r\n    \"jobFamilies\": [\"Engineering\"],\r\n    \"postedWithin\": \"14 days\",\r\n    \"maxItems\": 200\r\n}\r\n```\r\n\r\n### Example: by tenant name, no URL\r\n\r\n```json\r\n{\r\n    \"mode\": \"tenant\",\r\n    \"tenant\": \"workday\",\r\n    \"site\": \"Workday\",\r\n    \"locations\": [\"Remote\"],\r\n    \"scrapeDetails\": true,\r\n    \"maxItems\": 50\r\n}\r\n```\r\n\r\n`site` is optional. When it is omitted, the actor reads the tenant's public `robots.txt` and uses the first career site that responds.\r\n\r\n### Example: one specific posting\r\n\r\n```json\r\n{\r\n    \"mode\": \"jobDetail\",\r\n    \"startUrls\": [\r\n        \"https://salesforce.wd12.myworkdayjobs.com/External_Career_Site/job/Spain---Madrid/Deployment-Strategist---Spanish-Speaker_JR366417\"\r\n    ],\r\n    \"scrapeDetails\": true\r\n}\r\n```\r\n\r\n### Example: a myworkdaysite.com careers site\r\n\r\n```json\r\n{\r\n    \"mode\": \"careerSite\",\r\n    \"startUrls\": [\r\n        \"https://wd1.myworkdaysite.com/en-US/recruiting/fmr/FidelityCareers\"\r\n    ],\r\n    \"searchText\": \"planning\",\r\n    \"maxItems\": 100\r\n}\r\n```\r\n\r\n## Use cases\r\n\r\n- **Talent sourcing** - collect every open role at target employers, with locations and apply links, for outreach or a CRM.\r\n- **Competitive hiring intelligence** - track which teams, offices and job families a competitor is expanding.\r\n- **Compensation benchmarking** - gather published salary ranges by title, family and location.\r\n- **Job-board aggregation** - feed Workday postings from many employers into your own listings or alerts.\r\n- **Labor-market research** - measure remote/hybrid share, time type and posting velocity across companies.\r\n- **Recruiting operations** - monitor a company's careers site on a schedule and diff by requisition ID.\r\n\r\n## FAQ\r\n\r\n**Does this work with any company that uses Workday?**\r\nYes. Any public careers site on `myworkdayjobs.com` or `myworkdaysite.com` works the same way. Paste that careers URL, or use `tenant` with an optional `site`.\r\n\r\n**How do I find the tenant and career-site ID?**\r\nBoth are in the careers URL. In `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`, the tenant is `nvidia`, the region is `wd5` and the site is `NVIDIAExternalCareerSite`. The site ID is case-sensitive, but you can omit it: the actor discovers the tenant's first public site from its `robots.txt`.\r\n\r\n**Why did I get fewer jobs than the company lists?**\r\nWorkday returns at most about 2,000 results for a single search. The actor splits a capped site by job family, and splits a single large family again by one small secondary facet (usually time type) so most sites are read fully. If one slice is still above the cap, narrow the run with `searchText`, `locations` or `postedWithin` and run it more than once.\r\n\r\n**Why are some fields missing from a job?**\r\nEmployers publish different details. Salary ranges, remote or hybrid labels, end dates, logos and similar jobs appear only when the posting includes them. Missing fields are omitted, never sent as null.\r\n\r\n**Why is `jobFamily` missing on some sites?**\r\nA few employers do not publish a job-family/category filter at all. For those sites there is no reliable source for the field, so it is omitted rather than guessed. Setting `includeJobFamily` to `false` also omits it, including on large sites that are split by job family to get past the 2,000-result limit.\r\n\r\n**Which salary range is used when a posting lists several?**\r\nWhen the posting labels ranges by location, the actor uses the range that matches the job's primary location. If no location-specific range applies, it uses the posting's typical/base range. Values are never estimated.\r\n\r\n**What is the difference between `scrapeDetails` on and off?**\r\nWith it on, each job's public page is read for the full description, the exact posting date, employment type, work model and every location. With it off, you get the fast listing fields: title, location, requisition ID, posting age and URL. A `30+ Days Ago` posting has no exact date until details are on.\r\n\r\n**How do I scrape several companies in one run?**\r\nPaste all of their careers URLs and set `maxItems` large enough to cover the total. Jobs are returned in URL order, so a site with more jobs than `maxItems` can use the whole cap; split the run by company if you need equal coverage.\r\n\r\n**Why did a very old date cutoff return fewer jobs than expected?**\r\nWorkday has no server-side date filter, so dates are checked on the postings the site returns, newest first. To avoid reading an entire large site for a sparse cutoff, the actor stops after 30 pages with no match. Narrow the run with `searchText`, `locations` or `jobFamilies` so the matching roles are reached sooner.\r\n\r\n**Can I collect only new jobs?**\r\nSchedule the actor and compare `requisitionId` (or `externalPath`) between runs. The actor returns the current postings each time; it does not keep state between runs.\r\n\r\n**Does it return localized job text?**\r\nJob titles and descriptions are the employer's own text. Workday's public API serves the site's default language and ignores locale headers or query parameters, so the actor does not offer a language switch.\r\n\r\n**Does it work with remote-only searches?**\r\nYes. `remoteOnly` keeps postings the employer explicitly marks remote. Hybrid and onsite postings are excluded.\r\n\r\n**Do I need a proxy, login or API key?**\r\nNo. The actor reads public careers pages and works without any of them. Leave the proxy setting off unless you need a specific connection setup.\r\n\r\n**Why is `hiringOrganization` sometimes a legal entity name?**\r\nThat is the employer name Workday publishes on the posting. Some companies use a legal subsidiary name rather than the consumer brand. When a fetched posting publishes no organization name, the field is omitted instead of guessing a brand; listing-only runs use the Workday tenant slug.\r\n\r\n**Is this affiliated with Workday or the employers whose jobs it returns?**\r\nNo. This is an independent, third-party actor that reads each company's own public careers site. It is not affiliated with or endorsed by Workday, Inc. or any employer listed.\r\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "workday-careers-site-job-listings-extractor",
      "title": "Workday Careers Site Job Listings Extractor",
      "description": "Turn any company's Workday careers site into structured job data: exact posting dates, all locations, job family, remote/hybrid status, time type, salary ranges, full descriptions and apply links. Filter by keyword, location, family or date.",
      "version": "1.1",
      "buildTag": "latest",
      "meta": {
        "templateId": "python-start"
      },
      "readme": "# Workday Careers Site Job Listings Extractor\r\n\r\nWorkday powers the careers sites of thousands of employers, all at URLs ending in `myworkdayjobs.com` or `myworkdaysite.com`. Point this actor at any of them and get every open role as structured records: exact posting dates, requisition IDs, all locations, job family, remote or hybrid status, time type, published salary ranges, full descriptions and apply links. No login, no API key and no proxy setup.\r\n\r\n## What this actor does\r\n\r\n- **Works with any public Workday careers site** - paste a careers URL, a direct job URL, or use a tenant name (its career-site ID is discovered automatically when omitted). Both `myworkdayjobs.com` and `myworkdaysite.com` URL families are supported.\r\n- **Filters at the source** by keyword, location, job family and remote work, then applies posting-date and start-date cutoffs.\r\n- **Enriches every job** with the full HTML and plain-text description, exact posting date, employment type, work model, every location the role is open to, and a published salary range when the employer states one.\r\n- **Reads the whole site** - pages through all results, removes duplicates across pages and URLs, and splits large sites by job family, then by one small secondary facet such as time type or location when one family is still over Workday's per-query limit.\r\n- **Empty fields are omitted** - a missing salary, remote type or end date is omitted from that job's record instead of being sent empty.\r\n\r\n## Output per job\r\n\r\n**Identity and links**\r\n\r\n- `type` - `job_workday` for every real job record\r\n- `title` - job title\r\n- `id`, `requisitionId` - the requisition identifier, when the employer publishes one\r\n- `jobPostingId` - Workday's internal posting identifier\r\n- `url` - public job page\r\n- `applyUrl` - the posting page where the Apply button lives\r\n- `jobRequisitionUrl` - the employer's canonical posting URL\r\n- `externalPath` - the job's path on its careers site\r\n\r\n**Employer and source**\r\n\r\n- `hiringOrganization` - the legal entity name published on the posting; the Workday tenant slug when details are off or the posting page cannot be read, and omitted when a fetched posting publishes no organization name\r\n- `tenant`, `site`, `region` - the Workday tenant, career-site ID and data-center region the job came from\r\n\r\n**Locations**\r\n\r\n- `location` - primary location text\r\n- `locations` - every location the role is open to, when the posting lists more than one\r\n- `primaryLocation` - structured primary location, including country details\r\n- `additionalLocations` - other locations listed on the posting\r\n- `country`, `countryCode` - country of the primary location and its two-letter code\r\n\r\n**Work model**\r\n\r\n- `timeType` - full-time or part-time designation\r\n- `employmentType` - standardized employment type such as `FULL_TIME`\r\n- `remoteType` - the employer's own remote/hybrid label\r\n- `workplaceType` - normalized `remote`, `hybrid`, `onsite` or `field`\r\n- `jobLocationType` - `TELECOMMUTE` when the posting is marked remote\r\n\r\n**Dates**\r\n\r\n- `postedOn` - how the careers site displays the posting age\r\n- `postingDate` - exact posting date in ISO 8601 form\r\n- `startDate` - role start date, when published\r\n- `endDate`, `applicationCloseDate` - application close date, when published\r\n- `endDateText` - the employer's own end-date wording\r\n- `applicationTimeRemaining` - time left to apply, when shown\r\n\r\n**Description and pay**\r\n\r\n- `jobDescription` - full HTML description\r\n- `descriptionText` - plain-text version of the description\r\n- `compensationRangeMin`, `compensationRangeMax` - published pay range; when a posting lists several location-specific ranges, the range for the job's primary location is used\r\n- `compensationCurrency`, `compensationFrequency` - pay currency and hourly/monthly/yearly period\r\n- `compensationText` - the sentence the range was read from\r\n- `compensationType` - `range` or `single`\r\n\r\n**Classification and extras**\r\n\r\n- `jobFamily` - job family or category, when the site publishes one\r\n- `canApply`, `isPosted` - whether the posting is open to applicants\r\n- `questionnaireId`, `secondaryQuestionnaireId` - application questionnaire references, when present\r\n- `similarJobs` - related roles, each with `title`, `url`, and available listing details\r\n- `logoImage` - employer logo URL, when the site exposes one\r\n- `videoInfo` - embedded recruiting video details, when present\r\n- `scrapedAt` - ISO 8601 timestamp of the scrape\r\n\r\n## Input\r\n\r\n| Field | Type | Default | Description |\r\n|---|---|---|---|\r\n| `mode` | string | `careerSite` | `careerSite` (careers/job URLs), `tenant` (tenant + site), or `jobDetail` (specific `/job/...` URLs). |\r\n| `startUrls` | array | [\"https://salesforce.wd12.myworkdayjobs.com/External_Career_Site\"] | Workday careers-site or job URLs (mode=careerSite or jobDetail). |\r\n| `tenant` | string | - | Workday tenant name, for example `nvidia` (mode=tenant). |\r\n| `site` | string | - | Optional career-site ID from the URL, for example `NVIDIAExternalCareerSite` (mode=tenant). Leave it blank to discover the tenant's first public site automatically. |\r\n| `region` | string | `auto` | Workday data-center region; `auto` detects it (mode=tenant). |\r\n| `searchText` | string | - | Keyword passed to the site's own job search. |\r\n| `locations` | array | `[]` | Location names such as `United States`, `New York` or `Remote`. |\r\n| `jobFamilies` | array | `[]` | Job family names such as `Engineering` or `Sales`. |\r\n| `remoteOnly` | boolean | `false` | Keep only postings explicitly marked remote. |\r\n| `postedWithin` | string | `any` | `any`, `1 day`, `3 days`, `7 days`, `14 days`, `30 days`, `60 days` or `90 days`. |\r\n| `postedAfter` | string | - | Exact cutoff date in `YYYY-MM-DD` form. |\r\n| `startDateFrom` | string | - | Keep roles starting on or after this `YYYY-MM-DD` date. |\r\n| `scrapeDetails` | boolean | `true` | Fetch the full description, exact date, work model and all locations. |\r\n| `includeJobFamily` | boolean | `true` | Add the job family/category to each record. |\r\n| `maxItems` | integer | `50` | Maximum jobs to save across all URLs (1-10,000). Jobs are returned in URL order, so a large first site can use the whole cap. |\r\n| `proxyConfiguration` | object | proxy off | Optional. The actor works without a proxy. |\r\n\r\n### Example: every open role at one company\r\n\r\n```json\r\n{\r\n    \"mode\": \"careerSite\",\r\n    \"startUrls\": [\r\n        \"https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite\"\r\n    ],\r\n    \"maxItems\": 500\r\n}\r\n```\r\n\r\n### Example: engineering roles in the United States\r\n\r\n```json\r\n{\r\n    \"mode\": \"careerSite\",\r\n    \"startUrls\": [\r\n        \"https://salesforce.wd12.myworkdayjobs.com/External_Career_Site\"\r\n    ],\r\n    \"searchText\": \"engineer\",\r\n    \"locations\": [\"United States\"],\r\n    \"jobFamilies\": [\"Engineering\"],\r\n    \"postedWithin\": \"14 days\",\r\n    \"maxItems\": 200\r\n}\r\n```\r\n\r\n### Example: by tenant name, no URL\r\n\r\n```json\r\n{\r\n    \"mode\": \"tenant\",\r\n    \"tenant\": \"workday\",\r\n    \"site\": \"Workday\",\r\n    \"locations\": [\"Remote\"],\r\n    \"scrapeDetails\": true,\r\n    \"maxItems\": 50\r\n}\r\n```\r\n\r\n`site` is optional. When it is omitted, the actor reads the tenant's public `robots.txt` and uses the first career site that responds.\r\n\r\n### Example: one specific posting\r\n\r\n```json\r\n{\r\n    \"mode\": \"jobDetail\",\r\n    \"startUrls\": [\r\n        \"https://salesforce.wd12.myworkdayjobs.com/External_Career_Site/job/Spain---Madrid/Deployment-Strategist---Spanish-Speaker_JR366417\"\r\n    ],\r\n    \"scrapeDetails\": true\r\n}\r\n```\r\n\r\n### Example: a myworkdaysite.com careers site\r\n\r\n```json\r\n{\r\n    \"mode\": \"careerSite\",\r\n    \"startUrls\": [\r\n        \"https://wd1.myworkdaysite.com/en-US/recruiting/fmr/FidelityCareers\"\r\n    ],\r\n    \"searchText\": \"planning\",\r\n    \"maxItems\": 100\r\n}\r\n```\r\n\r\n## Use cases\r\n\r\n- **Talent sourcing** - collect every open role at target employers, with locations and apply links, for outreach or a CRM.\r\n- **Competitive hiring intelligence** - track which teams, offices and job families a competitor is expanding.\r\n- **Compensation benchmarking** - gather published salary ranges by title, family and location.\r\n- **Job-board aggregation** - feed Workday postings from many employers into your own listings or alerts.\r\n- **Labor-market research** - measure remote/hybrid share, time type and posting velocity across companies.\r\n- **Recruiting operations** - monitor a company's careers site on a schedule and diff by requisition ID.\r\n\r\n## FAQ\r\n\r\n**Does this work with any company that uses Workday?**\r\nYes. Any public careers site on `myworkdayjobs.com` or `myworkdaysite.com` works the same way. Paste that careers URL, or use `tenant` with an optional `site`.\r\n\r\n**How do I find the tenant and career-site ID?**\r\nBoth are in the careers URL. In `https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite`, the tenant is `nvidia`, the region is `wd5` and the site is `NVIDIAExternalCareerSite`. The site ID is case-sensitive, but you can omit it: the actor discovers the tenant's first public site from its `robots.txt`.\r\n\r\n**Why did I get fewer jobs than the company lists?**\r\nWorkday returns at most about 2,000 results for a single search. The actor splits a capped site by job family, and splits a single large family again by one small secondary facet (usually time type) so most sites are read fully. If one slice is still above the cap, narrow the run with `searchText`, `locations` or `postedWithin` and run it more than once.\r\n\r\n**Why are some fields missing from a job?**\r\nEmployers publish different details. Salary ranges, remote or hybrid labels, end dates, logos and similar jobs appear only when the posting includes them. Missing fields are omitted, never sent as null.\r\n\r\n**Why is `jobFamily` missing on some sites?**\r\nA few employers do not publish a job-family/category filter at all. For those sites there is no reliable source for the field, so it is omitted rather than guessed. Setting `includeJobFamily` to `false` also omits it, including on large sites that are split by job family to get past the 2,000-result limit.\r\n\r\n**Which salary range is used when a posting lists several?**\r\nWhen the posting labels ranges by location, the actor uses the range that matches the job's primary location. If no location-specific range applies, it uses the posting's typical/base range. Values are never estimated.\r\n\r\n**What is the difference between `scrapeDetails` on and off?**\r\nWith it on, each job's public page is read for the full description, the exact posting date, employment type, work model and every location. With it off, you get the fast listing fields: title, location, requisition ID, posting age and URL. A `30+ Days Ago` posting has no exact date until details are on.\r\n\r\n**How do I scrape several companies in one run?**\r\nPaste all of their careers URLs and set `maxItems` large enough to cover the total. Jobs are returned in URL order, so a site with more jobs than `maxItems` can use the whole cap; split the run by company if you need equal coverage.\r\n\r\n**Why did a very old date cutoff return fewer jobs than expected?**\r\nWorkday has no server-side date filter, so dates are checked on the postings the site returns, newest first. To avoid reading an entire large site for a sparse cutoff, the actor stops after 30 pages with no match. Narrow the run with `searchText`, `locations` or `jobFamilies` so the matching roles are reached sooner.\r\n\r\n**Can I collect only new jobs?**\r\nSchedule the actor and compare `requisitionId` (or `externalPath`) between runs. The actor returns the current postings each time; it does not keep state between runs.\r\n\r\n**Does it return localized job text?**\r\nJob titles and descriptions are the employer's own text. Workday's public API serves the site's default language and ignores locale headers or query parameters, so the actor does not offer a language switch.\r\n\r\n**Does it work with remote-only searches?**\r\nYes. `remoteOnly` keeps postings the employer explicitly marks remote. Hybrid and onsite postings are excluded.\r\n\r\n**Do I need a proxy, login or API key?**\r\nNo. The actor reads public careers pages and works without any of them. Leave the proxy setting off unless you need a specific connection setup.\r\n\r\n**Why is `hiringOrganization` sometimes a legal entity name?**\r\nThat is the employer name Workday publishes on the posting. Some companies use a legal subsidiary name rather than the consumer brand. When a fetched posting publishes no organization name, the field is omitted instead of guessing a brand; listing-only runs use the Workday tenant slug.\r\n\r\n**Is this affiliated with Workday or the employers whose jobs it returns?**\r\nNo. This is an independent, third-party actor that reads each company's own public careers site. It is not affiliated with or endorsed by Workday, Inc. or any employer listed.\r\n",
      "input": {
        "title": "Workday Careers Site Job Listings Extractor Input",
        "description": "Choose how to find jobs: paste one or more Workday careers-site URLs (mode=careerSite), name a tenant and its site (mode=tenant), or paste direct job URLs (mode=jobDetail). One of startUrls or tenant + site is required. Then filter by keyword, location, job family, posting date or remote work.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "description": "How to find jobs. 'Scrape career site URLs' accepts careers pages or job URLs. 'Scrape a tenant by name' uses tenant + site. 'Scrape specific job URLs' requires /job/... URLs in startUrls.",
            "editor": "select",
            "enum": [
              "careerSite",
              "tenant",
              "jobDetail"
            ],
            "enumTitles": [
              "Scrape career site URLs",
              "Scrape a tenant by name",
              "Scrape specific job URLs"
            ],
            "default": "careerSite",
            "prefill": "careerSite"
          },
          "startUrls": {
            "title": "Workday Careers URLs",
            "type": "array",
            "description": "Public Workday careers-site or job URLs (mode=careerSite or jobDetail). Paste the URL from your browser; both myworkdayjobs.com and myworkdaysite.com are supported. In careerSite mode a careers URL scrapes the site's jobs and a /job/... URL scrapes that single posting; in jobDetail mode use a /job/... URL.",
            "editor": "stringList",
            "items": {
              "type": "string"
            },
            "default": [
              "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site"
            ],
            "prefill": [
              "https://salesforce.wd12.myworkdayjobs.com/External_Career_Site"
            ]
          },
          "tenant": {
            "title": "Tenant",
            "type": "string",
            "description": "Workday tenant name, for example 'nvidia' or 'capitalone' (mode=tenant). You can also paste the full careers URL here or use 'tenant/site'. When the site ID is omitted, the actor finds the tenant's first public site automatically.",
            "editor": "textfield"
          },
          "site": {
            "title": "Career Site ID",
            "type": "string",
            "description": "Optional career site identifier shown in the URL after the tenant host, for example 'NVIDIAExternalCareerSite' or 'External_Career_Site' (mode=tenant). It is case-sensitive. Leave blank to discover the tenant's first public site automatically.",
            "editor": "textfield"
          },
          "region": {
            "title": "Workday Region",
            "type": "string",
            "description": "Workday data-center region. Leave 'auto' to detect it, or set wd1, wd3, wd5, wd12, wd103, and similar when you already know it (mode=tenant).",
            "editor": "textfield",
            "default": "auto",
            "prefill": "auto"
          },
          "searchText": {
            "title": "Search Keyword",
            "type": "string",
            "description": "Optional keyword passed to the site's own job search, for example 'engineer' or 'marketing'. Workday searches titles and descriptions.",
            "editor": "textfield"
          },
          "locations": {
            "title": "Locations",
            "type": "array",
            "description": "Optional locations to keep. Use names such as 'United States', 'New York', 'Remote' or 'US, CA, Santa Clara'; the actor matches them against the site's own location filters. Facet IDs are also accepted.",
            "editor": "stringList",
            "default": [],
            "prefill": [],
            "items": {
              "type": "string"
            }
          },
          "jobFamilies": {
            "title": "Job Families",
            "type": "array",
            "description": "Optional job families or categories to keep, for example 'Engineering', 'Sales' or 'Finance'. Names come from the site's own Job Category filter; IDs are also accepted.",
            "editor": "stringList",
            "default": [],
            "prefill": [],
            "items": {
              "type": "string"
            }
          },
          "remoteOnly": {
            "title": "Remote Jobs Only",
            "type": "boolean",
            "description": "Keep only postings the employer explicitly marks as remote. Hybrid and onsite postings are excluded. This turns on full detail fetching.",
            "default": false,
            "prefill": false,
            "editor": "checkbox"
          },
          "postedWithin": {
            "title": "Posted Within",
            "type": "string",
            "description": "Keep jobs posted within this window. 'Any time' applies no date filter. Use Posted After for an exact cutoff date.",
            "editor": "select",
            "enum": [
              "any",
              "1 day",
              "3 days",
              "7 days",
              "14 days",
              "30 days",
              "60 days",
              "90 days"
            ],
            "enumTitles": [
              "Any time",
              "Last 24 hours",
              "Last 3 days",
              "Last 7 days",
              "Last 14 days",
              "Last 30 days",
              "Last 60 days",
              "Last 90 days"
            ],
            "default": "any",
            "prefill": "any"
          },
          "postedAfter": {
            "title": "Posted After",
            "type": "string",
            "description": "Optional exact cutoff date in YYYY-MM-DD form. When both Posted Within and Posted After are set, the stricter cutoff wins.",
            "editor": "textfield"
          },
          "startDateFrom": {
            "title": "Start Date From",
            "type": "string",
            "description": "Optional YYYY-MM-DD cutoff for the role's start date. Only applies when the posting publishes a start date. This turns on full detail fetching.",
            "editor": "textfield"
          },
          "scrapeDetails": {
            "title": "Include Full Job Details",
            "type": "boolean",
            "description": "Fetch each posting's public job page for the full description, exact posting date, employment type, work model and every location. Turn off for a fast listing-only run (title, location, requisition ID, posting label and URL). Direct job URLs always fetch details because a listing has no record for them.",
            "default": true,
            "prefill": false,
            "editor": "checkbox"
          },
          "includeJobFamily": {
            "title": "Include Job Family",
            "type": "boolean",
            "description": "Add each job's family or category (for example Engineering or Sales). This uses the site's own Job Category filter and is skipped automatically when a site has no such filter.",
            "default": true,
            "prefill": false,
            "editor": "checkbox"
          },
          "maxItems": {
            "title": "Max Items",
            "type": "integer",
            "description": "Maximum number of jobs to save across all URLs. Jobs are returned in URL order, so a large first site can use the whole cap.",
            "default": 50,
            "prefill": 3,
            "minimum": 1,
            "maximum": 10000,
            "editor": "number"
          },
          "proxyConfiguration": {
            "title": "Proxy Configuration",
            "type": "object",
            "description": "Optional. The actor works without a proxy and chooses a working connection automatically; change this only if you need a specific proxy setup.",
            "editor": "proxy",
            "default": {
              "useApifyProxy": false
            },
            "prefill": {
              "useApifyProxy": false
            }
          }
        },
        "required": [
          "mode"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Workday Careers Site Job Listings Extractor Output",
        "description": "One record per job posting from a Workday careers site, with exact posting dates, every location, job family, remote/hybrid status, time type, salary range when published, full description and apply link.",
        "properties": {
          "jobs": {
            "type": "string",
            "title": "Workday Jobs",
            "description": "Dataset containing all scraped job postings.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "views": {
            "overview": {
              "title": "Workday Jobs",
              "transformation": {
                "fields": [
                  "title",
                  "tenant",
                  "location",
                  "postedOn",
                  "timeType",
                  "workplaceType"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            }
          }
        }
      },
      "dockerfile": "../Dockerfile",
      "environmentVariables": {}
    },
    "buildNumber": "1.1.1",
    "imageDigest": "07a2b4e9ef343d2db7e3d88914bb2205b913a51dd32b71cf83314d1126f56292",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.1"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.013366666666666667
    }
  }
}