Workday Jobs Lookup — Careers Site Job Postings API
Pricing
from $3.00 / 1,000 successful lookups
Workday Jobs Lookup — Careers Site Job Postings API
Look up any company's live Workday-hosted careers site and get its open roles — title, location, posted date, apply link. Filter by title, location, or remote, or watch for new postings since your last run. Charged once per company checked — none open costs nothing.
Pricing
from $3.00 / 1,000 successful lookups
Rating
0.0
(0)
Developer
Adrian Voss
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Workday Jobs Lookup
You give this actor a list of Workday careers-site URLs — the same link you'd paste into your
browser, like https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite — and it calls
Workday's own job-search API (/wday/cxs/<tenant>/<site>/jobs) directly, no login and no headless
browser. You get back one row per company: job titles, locations, how long ago each was posted,
and a working apply link, ready to drop into a spreadsheet, a Clay table, or a CRM.
Who it's for
The accountable_eel catalogue sells company intelligence columns for outbound. Each actor takes a list of domains or company identifiers and returns one flat, stably-named row per input — firmographics, registry IDs, tech stack, email route, hiring activity — the shape a Clay table, an n8n workflow, or an AI agent can consume without post-processing. Pricing is pay-per-event and per-domain: a few tenths of a cent for a row that was actually found, and nothing for a miss, so a list that doesn't enrich costs you next to nothing. Where an official source exists — VIES, GLEIF, SEC EDGAR, Brønnøysund, PRH, RDAP — it is queried directly instead of scraped. No seat licence, no monthly minimum, no credit system to decode. Here the identifier is a company's Workday careers-site URL and the "official source" is Workday's own CXS search endpoint, queried live on every run.
Why this one
- Reads Workday's own API, not the rendered page. No headless browser, no waiting for client-side JavaScript to paint a job board — this calls the same JSON endpoint the careers site itself calls.
- Works for any tenant. The tenant, pod (
wd5,wd12, …), and site name are parsed generically out of the URL you paste — nothing is hardcoded to one employer. - Real filters, not a raw dump. Narrow by title keyword, excluded keyword, location, or remote-only, and combine them — see How to use.
- A hiring-alert mode. Turn on
onlyNewSinceLastRun, put the actor on a schedule, and every run after the first returns only postings you haven't seen before. - You only pay for a company that resolves. A URL that isn't a live Workday site, or a site
with zero open roles, comes back
found: falseand is never charged.
What you get
One row per input URL by default, expanded into one row per job posting when the console's row expansion is on (each job row repeats the company-level fields and adds its own title/location/ posting/apply columns). Every field is stably named — safe to build a Clay column or an agent prompt around.
| Field | Type / format | What it is |
|---|---|---|
query | text | The Workday careers-site URL you submitted. |
found | boolean | true if the URL resolved to a live Workday site. |
status | text | OK, NOT_FOUND, BLOCKED, BAD_FORMAT, or REQUEST_FAILED. |
message | text | Present only on a miss row (found: false) — a short explanation of why. |
tenant | text | The Workday tenant name, parsed from the URL. |
site | text | The careers-site name, parsed from the URL. |
totalReported | number | Workday's own count of the company's entire open-role total — independent of pagination or filters. |
totalJobCount | number | How many postings were on the fetched page (up to 20, Workday's own page size) before any filtering. |
jobCount | number | How many of that page's postings matched your filters. |
newJobs | number or null | Postings new since your last run — only populated when onlyNewSinceLastRun is on. |
firstRun | boolean or null | Whether this was the baseline run of a delta watchlist — only populated when onlyNewSinceLastRun is on. |
note | text | A human-readable caveat, e.g. "Showing first 20 of 2000 — Workday's default page size." |
jobs | array | The full list of matching postings for this company, each with title, location, postedOn, remote, applyUrl. |
title | text | Job title (present on each expanded job row). |
location | text | Job location as Workday reports it (present on each expanded job row). |
postedOn | text | Workday's own relative posting age — "Posted Today", "Posted 30+ Days Ago" — kept verbatim. There is no separate absolute-date field; see the FAQ. |
remote | boolean | Best-effort remote flag, matched against the location and title text. |
applyUrl | link | The direct apply link for that posting. |
scrapedAt | text (ISO datetime) | When this row was fetched. |
Price
$5.2 per 1,000 companies, plus a $0.0001 start fee. Misses (found:false) are never charged.
1,000 companies through this actor: ~$5.20 if every one resolves to a live Workday site with open roles, less if some don't. The same 1,000 rows through a credit-based enrichment platform typically runs $80–$400. A company with no Workday careers site, or with zero open roles, costs nothing either way here — you're only billed for a company that actually answers.
How to use
- In the Apify Console. Open the actor page and click Start — the
companiesfield is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found. - Via the API. Call it directly with a POST request — no Console needed once you have an API token:
curl "https://api.apify.com/v2/acts/accountable_eel~workday-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"companies":["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"]}'
- On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.
Paste one Workday careers-site URL per line into companies — the full URL as it appears in your
browser, locale prefix and all (en-US is accepted and ignored):
{"companies": ["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite","https://salesforce.wd12.myworkdayjobs.com/en-US/External_Career_Site"],"maxConcurrency": 5}
maxConcurrency (default 5, max 20) caps parallel requests. This target has no browser fallback,
so getting rate-limited costs you more than going slow — a lower value is safer than pushing it
high. proxyConfiguration lets you set Apify Proxy options directly; residential proxies help if
you see blocked or empty responses.
Filters (all optional, all under 🎯 Job filters in the Input tab):
| Input | What it does |
|---|---|
titleKeywords | Keep only roles whose title contains at least one of these — case-insensitive, partial words count ("engineer" matches Engineering Manager). |
excludeTitleKeywords | Drop any role whose title contains one of these, applied after titleKeywords. |
locations | Keep only roles whose location contains one of these. |
remoteOnly | Keep only roles that read as remote — matches remote, anywhere, work from home, wfh, distributed in the location, and the literal word remote in the title. |
Different filters combine with AND; values inside one filter combine with OR. Filtering happens before the row is built, so it applies the same whether you're reading one row per company or one row per job.
Two counts protect you from ambiguous zeros: totalJobCount is what was on the fetched page before
filtering, jobCount is what matched your filters, and totalReported is Workday's own count of
the company's whole open-role total, independent of both. A company whose roles all get filtered
out still returns a found: true row with jobCount: 0 — you asked, and got a real answer, so it's
charged like anything else. Only a URL with no live Workday site, or zero open roles company-wide,
comes back found: false and free.
Watching for new jobs. Turn on onlyNewSinceLastRun and put the actor on a schedule to get a
hiring alert instead of a full dump each time. The first run returns everything matching your
filters and remembers it; every run after returns only what's new, with newJobs telling you how
many and firstRun telling you whether this was the baseline. A quiet run still returns a row
(jobCount: 0, newJobs: 0) so you can tell "nothing changed" from "this broke." The seen-list
lives in a named key-value store in your own Apify account (workday-jobs-lookup-state), keyed by
tenant and site, and your filters are part of that identity — change titleKeywords and you start
a fresh watchlist.
Input
{"companies": ["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"]}
One company per line — paste the full Workday careers-site URL you'd see in your browser. Accepted formats: https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite, https://salesforce.wd12.myworkdayjobs.com/en-US/External_Career_Site.
Sample output
| query | found | status | tenant | site | totalReported | jobCount | totalJobCount | newJobs | firstRun | note | jobs | title | location | postedOn | remote | applyUrl | scrapedAt |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite | true | OK | nvidia | NVIDIAExternalCareerSite | 2000 | 20 | <open jobs on this page (before filters)> | <first run of this watchlist?> | Showing first 20 of 2000 — Workday's default page size. | <all jobs (full list)> | Senior Software Engineer, Cloud-Native Stack – CSP Engagements | 5 Locations | Posted Today | <remote? (best-effort)> | https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite/job/US-CA-Santa-Clara/Senior-Software-Engineer--Cloud-Native-Stack---CSP-Engagements_JR2001098 | 2026-08-23T23:07:36.711Z |
A found row, unexpanded:
{"query": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite","found": true,"data": {"tenant": "nvidia","site": "NVIDIAExternalCareerSite","totalReported": 2000,"jobCount": 20,"totalJobCount": 20,"newJobs": null,"firstRun": null,"note": "Showing first 20 of 2000 — Workday's default page size.","jobs": [{"title": "Senior Software Engineer","location": "Santa Clara, CA","postedOn": "Posted 3 Days Ago","remote": false,"applyUrl": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite/job/..."}]},"scrapedAt": "2026-08-20T12:00:00.000Z"}
A URL that isn't a valid Workday careers-site link, doesn't resolve, or resolves with zero open
postings comes back as {"found": false, ...} and is never charged.
Use it from Clay, n8n, Make, or an AI agent
This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.
curl "https://api.apify.com/v2/acts/accountable_eel~workday-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"companies":["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"]}'
n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~workday-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"companies":["https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"]} (swap in an expression from an earlier node for a real value).
Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~workday-jobs-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"companies":["{{company}}"]}, mapping the row's company into the companies array.
MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "Workday Jobs Lookup | Apify" — the agent will find and run this actor.
Tips
- Paste the exact browser URL. The parser expects the tenant/pod/site pattern
(
<tenant>.<pod>.myworkdayjobs.com/<site>) as it appears in the address bar, locale prefix optional. A shortened or redirected link won't parse. - Keep concurrency modest on a big batch. There's no browser fallback here, so a blocked response costs you a retry, not a silent recovery — start at the default (5) and raise it only if you're not seeing blocks.
- Use
totalReported, nottotalJobCount, for headcount comparisons across companies.totalJobCountis capped at the 20-per-page limit;totalReportedis the company's real total. - Set filters once, then schedule. Combine
titleKeywords/locations/remoteOnlywithonlyNewSinceLastRunfor a running "new roles matching X" alert instead of re-reading a full dump each week. - Don't pair delta mode with "only keep rows containing." A row-level keyword filter can drop
the
jobCount: 0heartbeat row that tells you the watchlist is alive and just quiet.
vs. alternatives
| What it costs | What you get | Trade-off | |
|---|---|---|---|
This actor (workday-jobs-lookup) | $0.0052 per company whose Workday site is found (less on paid tiers), $0.0001 actor start, nothing for a company with no live Workday site | Every open posting on the first page of a company's Workday careers site — title, location, relative post age, apply URL — filtered by title keyword, location, or remote, with onlyNewSinceLastRun for a hiring-alert schedule | Workday only. v1 reads only the first page (up to 20 postings, though totalReported shows the real total), and there's no absolute posted date — Workday's own listing endpoint never provides one. |
| TheirStack | $0.005–$0.03 per company | A job-postings dataset with history, normalised across many ATS platforms and job boards | Broader coverage than one platform, and it keeps history. This reads Workday's own API live, at the bottom of that price range. |
| Workday's own API (DIY) | Free | The same JSON | It's the same source, but you handle the tenant/pod/site parsing from a careers-site URL, the CXS request shape, title/location/remote filtering, the delta seen-list, and the retries — this hands you a flat, filtered table instead. |
| Clay | $0.08–$0.40 per enriched row in credits, on top of a seat | A whole enrichment workspace — waterfalls across dozens of providers, plus the table and the sequencing around it | If you want one place that does everything and you're not counting rows, that's Clay. This is one column, priced per column, callable from Clay via its HTTP step. |
Prices for third-party tools are their published list prices as of August 2026 and are not tracked here — check the vendor before relying on the comparison.
FAQ
What input format do I need? The full careers-site URL as it appears in your browser, e.g.
https://<tenant>.<pod>.myworkdayjobs.com/<site>. A locale prefix like en-US is also accepted.
What if my input isn't a valid Workday URL? It comes back found: false and is never charged —
one bad item doesn't fail the whole run.
Why was I charged for a company that returned 0 jobs? Because its careers site resolved and had
open roles on the fetched page — they just didn't match your filters, or weren't new since your
last run. totalJobCount shows how many were actually on that page before filtering, and
totalReported shows the company's whole open-role count regardless of the page or your filters. A
company with no Workday site, or nothing open at all, comes back found: false and free.
Why is there no postedDate field? Workday's own job-search endpoint — the one this actor calls
— only ever reports posting age as relative text ("Posted Today", "Posted 30+ Days Ago"). The
absolute calendar date lives on a separate per-job detail endpoint this actor doesn't call (one
extra request per posting, per company). Rather than fabricate a date from that text or ship a
column that's always empty, that field was dropped: postedOn carries Workday's own text verbatim,
and there's no postedAfter filter, because it couldn't actually filter on anything real.
How does the "new since last run" state work, and can I reset it? Turn on
onlyNewSinceLastRun and schedule the actor; the seen-list is kept in a named key-value store
(workday-jobs-lookup-state) inside your own Apify account, one entry per tenant+site, so nobody
else can see it. Delete that store to reset every watchlist. The identity it tracks is derived from
each posting's externalPath (its URL path) — Workday's listing has no native job id to use
instead. Changing your filters starts a fresh watchlist automatically.
Does this paginate beyond the first 20 jobs? No — v1 reads Workday's own default first page (up
to 20 postings) per query, plus totalReported so you know the real total.
Should I use a proxy, and is there a rate limit to worry about? Residential proxies help if
you're querying many tenants in one run or see blocked/empty responses — set this via
proxyConfiguration. There's no published Workday rate limit; maxConcurrency (default 5, max 20)
is the lever you control, and lower is safer since there's no browser fallback to recover a block.
Is this GDPR-safe to run against EU companies? The actor only reads what a company already publishes on its own public careers site — job titles, locations, and apply links, no personal data about applicants or employees. You're responsible for how you use the output, same as with any public-web lookup.
Can I call this from an AI agent instead of the Console? Yes — it runs synchronously over the Apify API, and it's discoverable through the Apify MCP server (ask for "Workday Jobs Lookup | Apify"). See Use it from Clay, n8n, Make, or an AI agent.