Workday employee data API
Workday is the mobile self-service client for Workday HCM, the human-capital-management suite from Workday, Inc. Employees of Workday customer organizations sign in with their company tenant to request time off, submit timecards, track expenses, view published shifts and work through onboarding journeys, while managers use it for approvals and attendance.
As a data source the app exposes the worker's slice of the HCM graph: time-off plans (listOfPlans, absenceTypeGroup), hour totals (totalNumber, quantity), expense lines (merchantForExpenseReportLine, expenseLineExtendedAmount), shifts and punches (startTime, eventType) and directory fields (workerPhoneNumberFormatted, workerPhotos). Integrators turn that into payroll syncs, expense reconciliation, roster dashboards and onboarding feeds.
Workday is the employee self-service companion to Workday HCM from Workday, Inc.: workers at customer organizations use it to request time off, review timecards, file expenses, check shifts and complete onboarding. Behind those screens sits a per-tenant dataset — absence-plan catalogs, weekly hour totals, expense-report lines with merchant and corporate-card detail, published shift schedules and worker directory profiles with photos and phones. It feeds payroll and workforce-ops syncs, expense-to-ERP reconciliation, live roster boards and new-hire journey inboxes.
Screenshots
API surface
The endpoints and request/response examples below are reconstructed from the app's interface — illustrative, not a live capture.
Eligible absence types (time-off plans)
GET
/v1/absence/workers/{workerId}/eligible-time-off-plansopendataLists the signed-in worker's eligible absence / time-off plans — the catalog behind the Request Time Off picker.
Auth: OAuth2 Bearer access_token from the PKCE sign-in, plus the tenant session cookie (jsessionId). Limit/offset paging (default limit 100).
- totalNumberOfPlans
- listOfPlans
- id
- label
- category
- absenceTypeGroup
GET /v1/absence/workers/247$1/eligible-time-off-plans?limit=100&offset=0 HTTP/1.1 Authorization: Bearer eyJhbGciOi... Cookie: JSESSIONID=1A2B3C4D{ "totalNumberOfPlans": 2, "listOfPlans": [ {"id": "TIME_OFF_PLAN-6-1", "label": "Vacation", "category": {"id": "Time_Off", "descriptor": "Time Off"}, "absenceTypeGroup": {"id": "Absence_Type_Group-1", "descriptor": "PTO"}}, {"id": "TIME_OFF_PLAN-6-2", "label": "Sick", "category": {"id": "Leave_of_Absence", "descriptor": "Leave"}, "absenceTypeGroup": {"id": "Absence_Type_Group-2", "descriptor": "Sick"}} ] }Documented from the app's Request Time Off picker flowPlan catalog model carries id, label, category and absenceTypeGroup
Time calendar summary
GET
/v1/time-tracking/workers/{workerId}/calendar-summaryopendataReturns per-period hour totals for a worker's time calendar — the numbers on the Edit & Approve Time summary strip.
Auth: OAuth2 Bearer access_token from the PKCE sign-in, plus the tenant session cookie (jsessionId).
- total
- data
- dateRange
- totals
- totalNumber
- label
- quantity
GET /v1/time-tracking/workers/247$1/calendar-summary?from=2026-09-21&to=2026-09-27 HTTP/1.1 Authorization: Bearer eyJhbGciOi... Cookie: JSESSIONID=1A2B3C4D{ "total": 1, "data": [ { "dateRange": "2026-09-21/2026-09-27", "totals": [ {"totalNumber": 40, "label": "Regular", "quantity": "HOURS"}, {"totalNumber": 4, "label": "Overtime", "quantity": "HOURS"} ] } ] }Documented from the Edit & Approve Time summary stripPeriod-total model: dateRange, totals, totalNumber, quantity
Submit / list time review events
POST
/v1/time-tracking/workers/{workerId}/review-eventsopendataSubmits a worker's timecard for review and returns the resulting timeReviewEvents with position and status — the write behind Submit Timecard.
Auth: OAuth2 Bearer access_token from the PKCE sign-in, plus the tenant session cookie (jsessionId).
- date
- timeReviewEvents
- id
- descriptor
- positionData
- status
POST /v1/time-tracking/workers/247$1/review-events HTTP/1.1 Authorization: Bearer eyJhbGciOi... Cookie: JSESSIONID=1A2B3C4D Content-Type: application/json {"date": "2026-09-27"}{ "date": "2026-09-27", "timeReviewEvents": [ { "id": "TIME_REVIEW_EVENT-1-10432", "descriptor": "Week ending 27 Sep 2026", "positionData": {"id": "P-881", "descriptor": "Store associate"}, "status": {"descriptor": "Submitted", "id": "Submitted"} } ] }Documented from the Submit Timecard actionReview-event model carries per-week position and status
Approve timecard business-process step
POST
/v1/workflows/event-steps/{eventStepId}/approveopendataApproves a pending timecard business-process step — the manager action paired with matching deny and sendBack routes.
Auth: OAuth2 Bearer access_token from the PKCE sign-in, plus the tenant session cookie (jsessionId). Manager / time-keeper role required.
- id
- descriptor
- status
POST /v1/workflows/event-steps/EVENT_STEP-6-991/approve HTTP/1.1 Authorization: Bearer eyJhbGciOi... Cookie: JSESSIONID=1A2B3C4D Content-Type: application/json {"comment": "Approved hours for week ending 27 Sep"}{ "id": "EVENT_STEP-6-991", "descriptor": "Approve Time", "status": {"descriptor": "Approved", "id": "Approved"} }Documented from the manager time-approval inboxSibling deny and sendBack actions act on the same event-step resource
Staffing worker (person + phone)
GET
/v1/staffing/workers/{workerId}osintReads a worker's staffing record — person id and work phone — used by manager attendance and shift screens to identify who is on the roster.
Auth: OAuth2 Bearer access_token from the PKCE sign-in, plus the tenant session cookie (jsessionId).
- person
- id
- phone
GET /v1/staffing/workers/247$1 HTTP/1.1 Authorization: Bearer eyJhbGciOi... Cookie: JSESSIONID=1A2B3C4D{ "person": { "id": "247$1", "phone": "+1-415-555-0148" } }Documented from the manager attendance and shift screensWorker record returns person id and work phone
Worker photo resource
GET
/v1/directory/workers/{workerId}/photoosintReturns the worker's photo resource (photoId + href) shown on team, schedule and directory cards.
Auth: OAuth2 Bearer access_token from the PKCE sign-in, plus the tenant session cookie (jsessionId).
- id
- descriptor
- workerPhotos
- photoId
- href
GET /v1/directory/workers/247$1/photo HTTP/1.1 Authorization: Bearer eyJhbGciOi... Cookie: JSESSIONID=1A2B3C4D{ "id": "247$1", "descriptor": "Jordan Lee", "workerPhotos": { "photoId": "PHOTO-3-8821", "descriptor": "Profile photo", "href": "/assets/photos/PHOTO-3-8821" } }Documented from the team, schedule and directory cardsPhoto model returns photoId plus a fetch href
Primary work phones
GET
/v1/directory/people/{personId}/work-phonesosintReturns a person's public primary work phone numbers used on the manager attendance roster when a shift worker needs a call-out.
Auth: OAuth2 Bearer access_token from the PKCE sign-in, plus the tenant session cookie (jsessionId). Query flags primaryOnly=true and publicOnly=true.
- data
- workerPhoneNumberRaw
- workerPhoneNumberFormatted
GET /v1/directory/people/247$1/work-phones?primaryOnly=true&publicOnly=true HTTP/1.1 Authorization: Bearer eyJhbGciOi... Cookie: JSESSIONID=1A2B3C4D{ "data": [ { "workerPhoneNumberRaw": "+14155550148", "workerPhoneNumberFormatted": "+1 415-555-0148" } ] }Documented from the manager call-out rosterReturns raw and formatted public work numbers
Expense report lines (GraphQL)
POST
/graphql/expensesopenfinancePages the worker's expense-report lines — merchant, amount, corporate-card last four and status — behind the Expenses activity list.
Auth: OAuth2 Bearer access_token from the PKCE sign-in, plus the tenant session cookie (jsessionId). GraphQL operation ExpenseReportLineForExpenseActivity.
- expenseReportLine
- merchantForExpenseReportLine
- expenseLineExtendedAmount
- currency
- value
- expenseReportLineStatus
- last4DigitsOfCreditCardNumber
- expenseReportLinePaidWithCorporateCard
- workdayID
- expenseCreditCardTransaction
- creditCardMerchantName
POST /graphql/expenses HTTP/1.1 Authorization: Bearer eyJhbGciOi... Cookie: JSESSIONID=1A2B3C4D Content-Type: application/json {"operationName":"ExpenseReportLineForExpenseActivity","variables":{"dataSource":"expenseReportLinesForWorker","limit":20,"offset":0},"query":"query ExpenseReportLineForExpenseActivity($dataSource: ExpenseReportLine_DataSources!, $limit: BigInt, $offset: BigInt) { expenseReportLine(dataSource: $dataSource, limit: $limit, offset: $offset) { data { merchantForExpenseReportLine expenseLineExtendedAmount { value currency } expenseReportLineStatus { descriptor workdayID { id } } last4DigitsOfCreditCardNumber workdayID { id } } total } }"}{ "data": { "expenseReportLine": { "data": [ { "merchantForExpenseReportLine": "United Airlines", "expenseLineExtendedAmount": {"value": 428.60, "currency": "USD"}, "expenseLineExtendedAmountFormatted": "428.60 USD", "expenseReportLineStatus": {"descriptor": "Draft", "workdayID": {"id": "STATUS-1"}}, "last4DigitsOfCreditCardNumber": "4412", "expenseReportLinePaidWithCorporateCard": true, "workdayID": {"id": "EXPENSE_LINE-6-2044"}, "expenseCreditCardTransaction": { "creditCardMerchantName": "UNITED AIR", "creditCardChargeDateFormatted": "2026-09-18", "creditCardExtendedAmount": {"value": 428.60, "currency": "USD"} } } ], "total": 1 } } }Documented from the Expenses activity listGraphQL operation ExpenseReportLineForExpenseActivity pages lines with limit/offset
Workforce schedule (GraphQL GetSchedule)
POST
/graphql/schedulingopendataLoads a scheduling organization's published week — assigned shifts, roster workers and overlayed timeOffs — for the manager My Shifts / schedule grid.
Auth: OAuth2 Bearer access_token from the PKCE sign-in, plus the tenant session cookie (jsessionId). GraphQL operation GetSchedule.
- getScheduleEdge
- orgId
- status
- fromDate
- toDate
- shifts
- startTime
- endTime
- paidDurationHours
- workerId
- workers
- timeOffs
- absenceType
- quantity
- unit
POST /graphql/scheduling HTTP/1.1 Authorization: Bearer eyJhbGciOi... Cookie: JSESSIONID=1A2B3C4D Content-Type: application/json {"operationName":"GetSchedule","variables":{"orgId":"ORG-881","queryInput":{"fromDate":"2026-09-21","toDate":"2026-09-27"}},"query":"query GetSchedule($orgId: ID!, $queryInput: QueryInput!) { getScheduleEdge(orgId: $orgId, queryInput: $queryInput) { id orgId status fromDate toDate shifts { id startTime endTime workerId paidDurationHours } workers { id name } timeOffs { id startTime endTime quantity unit absenceType { id name } worker { id name } } } }"}{ "data": { "getScheduleEdge": { "id": "SCHED-2026-W39", "orgId": "ORG-881", "status": "PUBLISHED", "fromDate": "2026-09-21", "toDate": "2026-09-27", "shifts": [ {"id": "SHIFT-441", "startTime": "2026-09-24T09:00:00", "endTime": "2026-09-24T17:00:00", "workerId": "247$1", "paidDurationHours": 8.0, "open": false, "status": "ASSIGNED"} ], "workers": [{"id": "247$1", "name": "Jordan Lee"}], "timeOffs": [ {"id": "TO-19", "startTime": "2026-09-25T00:00:00", "endTime": "2026-09-25T23:59:59", "quantity": 1, "unit": "DAYS", "displayType": "FULL_DAY", "absenceType": {"id": "TIME_OFF_PLAN-6-1", "name": "Vacation"}, "worker": {"id": "247$1", "name": "Jordan Lee"}} ] } } }Documented from the manager My Shifts schedule gridGraphQL operation GetSchedule returns shifts, roster workers and time-off overlays
Attendance groups (GraphQL GetAttendanceGroups)
POST
/graphql/schedulingopendataGroups today's shifts into not-checked-in, not-checked-out and checked-in buckets with matching timeClockEvent punches — the manager attendance board.
Auth: OAuth2 Bearer access_token from the PKCE sign-in, plus the tenant session cookie (jsessionId). GraphQL operation GetAttendanceGroups.
- getAttendanceGroups
- notCheckedIn
- notCheckedOut
- checkedIn
- groupedShiftTimeClockEvent
- timeClockEvent
- eventType
- timePeriod
- shiftId
POST /graphql/scheduling HTTP/1.1 Authorization: Bearer eyJhbGciOi... Cookie: JSESSIONID=1A2B3C4D Content-Type: application/json {"operationName":"GetAttendanceGroups","variables":{"matchingShiftsTimeClockEventInput":{"asOf":"2026-09-24T12:00:00"}},"query":"query GetAttendanceGroups($matchingShiftsTimeClockEventInput: MatchingShiftsTimeClockEventInput!) { getAttendanceGroups(matchingShiftsTimeClockEventInput: $matchingShiftsTimeClockEventInput) { notCheckedIn { id name } notCheckedOut { id name } checkedIn { id name } } }"}{ "data": { "getAttendanceGroups": { "notCheckedIn": [ {"id": "GRP-1", "name": "Front of house", "groupedShiftTimeClockEvent": [{"shift": {"id": "SHIFT-441", "startTime": "2026-09-24T09:00:00", "endTime": "2026-09-24T17:00:00", "worker": {"id": "247$1", "name": "Jordan Lee"}}, "timeClockEvent": null}]} ], "notCheckedOut": [], "checkedIn": [ {"id": "GRP-2", "name": "Kitchen", "groupedShiftTimeClockEvent": [{"shift": {"id": "SHIFT-442", "worker": {"id": "248$1", "name": "Sam Ortiz"}}, "timeClockEvent": {"id": "TCE-90", "eventType": "CHECK_IN", "shiftId": "SHIFT-442", "timePeriod": {"start": "2026-09-24T08:57:00", "end": null}}}]} ] } } }Documented from the manager attendance boardGraphQL operation GetAttendanceGroups buckets shifts by punch state
Home cards (GraphQL GetCards)
POST
/graphql/people-experienceopendataReturns the signed-in worker's mobile home cards (payslip, time off, tasks, journeys) that populate the Workday landing screen.
Auth: OAuth2 Bearer access_token from the PKCE sign-in, plus the tenant session cookie (jsessionId). GraphQL operation GetCards.
- home
- getCards
- id
- definition
- layout
- title
- subtitle
- eyebrow
- task
- taskID
- instanceID
POST /graphql/people-experience HTTP/1.1 Authorization: Bearer eyJhbGciOi... Cookie: JSESSIONID=1A2B3C4D Content-Type: application/json {"operationName":"GetCards","variables":{"input":{"layout":"MOBILE"}},"query":"query GetCards($input: HomeGetCardsInput!) { home { getCards(input: $input) { id definition { id } layout { type ... on SimpleCardLayout { title subtitle eyebrow } } } } }"}{ "data": { "home": { "getCards": [ { "id": "CARD-PAYSLIP-SEP", "definition": {"id": "payslip"}, "layout": { "type": "SimpleCardLayout", "title": "Payslip — 15 Sep 2026", "subtitle": "Net $3,412.18", "eyebrow": "Pay", "task": {"id": "TASK-PAYSLIP", "title": "View payslip", "taskID": "2997$18", "instanceID": "2998$4", "isReport": false} } } ] } } }Documented from the mobile landing screenGraphQL operation GetCards returns payslip, time-off and task cards
Onboarding journeys overview (GraphQL)
POST
/graphql/people-experienceopendataLoads the worker's active and completed onboarding journeys with per-card progress — the Journeys section of the people-experience home.
Auth: OAuth2 Bearer access_token from the PKCE sign-in, plus the tenant session cookie (jsessionId). GraphQL operation JourneysOverviewQuery.
- journeys
- activeJourneys
- completedJourneys
- header
- journeyCards
- title
- label
- progress
- completed
- total
- status
- task
POST /graphql/people-experience HTTP/1.1 Authorization: Bearer eyJhbGciOi... Cookie: JSESSIONID=1A2B3C4D Content-Type: application/json {"operationName":"JourneysOverviewQuery","variables":{"input":{}},"query":"query JourneysOverviewQuery($input: JourneySectionCardsInput) { journeys { activeJourneys(input: $input) { id label journeyCards { id title label progress { completed total } status } } completedJourneys(input: $input) { id label } header { title description } } }"}{ "data": { "journeys": { "header": {"title": "Your journeys", "description": "Finish onboarding tasks"}, "activeJourneys": { "id": "SEC-ACTIVE", "label": "In progress", "journeyCards": [ { "id": "JRN-ONB-1", "title": "New hire onboarding", "label": "Due 4 Oct", "progress": {"completed": 3, "total": 8}, "status": "IN_PROGRESS", "task": {"id": "TASK-J1", "title": "Complete I-9", "taskID": "2997$22", "instanceID": "2998$9"} } ] }, "completedJourneys": {"id": "SEC-DONE", "label": "Completed", "journeyCards": []} } } }Documented from the Journeys section of the home feedGraphQL operation JourneysOverviewQuery returns active and completed journey cards
Career-hub connection suggestions
GET
/v1/career-hub/me/connection-suggestionsosintReturns suggested colleague connections for the signed-in worker — name, job title and shared facets used by the onboarding / career-hub People to Meet cards.
Auth: OAuth2 Bearer access_token from the PKCE sign-in, plus the tenant session cookie (jsessionId).
- total
- data
- worker
- id
- descriptor
- workExperience
- jobTitle
- thingsInCommon
- message
- person
GET /v1/career-hub/me/connection-suggestions HTTP/1.1 Authorization: Bearer eyJhbGciOi... Cookie: JSESSIONID=1A2B3C4D{ "total": 2, "data": [ { "worker": { "id": "247$88", "descriptor": "Alex Chen", "workExperience": [{"jobTitle": "People Partner"}], "thingsInCommon": [{"message": "Same location — San Francisco"}], "person": {"photo": [{"id": "PHOTO-3-101"}]} } } ] }Documented from the People to Meet cardsSuggestion model carries job title and shared facets
Onboarding journey cards
GET
/v1/journeysopendataLists assigned onboarding journeys with required-step progress and due dates — the REST catalog behind the Journeys list.
Auth: OAuth2 Bearer access_token from the PKCE sign-in, plus the tenant session cookie (jsessionId).
- total
- data
- id
- descriptor
- name
- status
- formattedDistributionDate
- formattedEndDate
- requiredTotalSteps
- requiredStepsComplete
GET /v1/journeys HTTP/1.1 Authorization: Bearer eyJhbGciOi... Cookie: JSESSIONID=1A2B3C4D{ "total": 1, "data": [ { "id": "JOURNEY-6-441", "descriptor": "New hire onboarding", "name": "New hire onboarding", "status": {"id": "IN_PROGRESS", "descriptor": "In progress"}, "formattedDistributionDate": "1 Sep 2026", "formattedEndDate": "15 Oct 2026", "requiredTotalSteps": 8, "requiredStepsComplete": 3 } ] }Documented from the Journeys listJourney card model carries required-step progress and due dates
Required learning cards
GET
/v1/learning/sliders/{sliderId}/cardsopendataReturns required-learning slider cards — course title, duration, due date and overdue flag — shown on the onboarding Plan / Learning strip.
Auth: OAuth2 Bearer access_token from the PKCE sign-in, plus the tenant session cookie (jsessionId).
- total
- data
- assignment
- dueDate
- overdue
- formattedDueDate
- content
- id
- title
- lessonCount
- contentDeepLink
- duration
GET /v1/learning/sliders/SLIDER-REQ/cards HTTP/1.1 Authorization: Bearer eyJhbGciOi... Cookie: JSESSIONID=1A2B3C4D{ "total": 1, "data": [ { "assignment": {"dueDate": "2026-10-04", "overdue": false, "formattedDueDate": "4 Oct 2026"}, "assignmentCycle": {"dueDate": "2026-12-31", "overdue": false, "formattedDueDate": "31 Dec 2026"}, "content": { "id": "COURSE-19", "title": "Workplace safety", "lessonCount": "4", "contentDeepLink": "wd-learning://course/COURSE-19", "duration": "45m" }, "record": {"id": "REC-19"} } ] }Documented from the onboarding Learning stripCard model joins assignment due dates with course content
Data categories
- time-off plans
- timecards
- expenses
- schedules
- time-clock attendance
- worker profiles
- home tasks
- onboarding journeys
- required learning
Where teams use this data
Workforce time-off and timecard sync
A workforce-ops bot can pull eligible absence plans (listOfPlans.id/label) and weekly calendar totals (dateRange, totals.quantity) then watch timeReviewEvents.status so a downstream payroll file only closes after Submitted/Approved steps.
Expense-to-ERP reconciliation
Finance can page expenseReportLine rows — merchantForExpenseReportLine, expenseLineExtendedAmount.value/currency, last4DigitsOfCreditCardNumber and creditCardMerchantName — and match corporate-card charges to the GL without opening the mobile Expenses screen.
Live roster and punch board
A store-manager dashboard can combine GetSchedule (shifts.startTime/endTime, workerId, timeOffs.absenceType) with GetAttendanceGroups (notCheckedIn / checkedIn timeClockEvent.eventType) and overlay worker photos (workerPhotos.href) plus workerPhoneNumberFormatted from person/v4 workPhones.
New-hire journey and learning inbox
An employee-experience feed can read JourneysOverviewQuery journeyCards.progress plus REST JourneyCard.requiredStepsComplete, then surface RequiredLearningCard content.title/dueDate next to GetCards layout.title so onboarding tasks and payslip actions land in one inbox.
Frequently asked questions
What data does the Workday mobile API expose?
Time-off plan catalogs (totalNumberOfPlans, listOfPlans), timecard calendar totals and review events, expense-report lines with merchant and corporate-card last four, published shifts and timeOffs, attendance punch groups, onboarding journeys and required-learning cards, and worker id/phone/photo resources — all scoped to the signed-in tenant.
How does the Workday app authenticate?
The employee signs in with an OAuth2 PKCE flow that returns an access_token plus a tenant session cookie. Later REST and GraphQL calls send both the Bearer token and the session cookie against the organization's own Workday tenant.
Are these Workday endpoints a public developer API?
No. They are the first-party tenant interfaces the official Workday app uses after an employee signs in with their organization. There is no public developer key for these mobile routes.
Apps similar to Workday
- SAP SuccessFactors — SAP SuccessFactors is an enterprise HCM suite covering core HR, payroll, talent management and workforce planning, and is the closest direct enterprise alternative to Workday.
- Oracle HCM Cloud — Oracle HCM Cloud is an enterprise HCM platform with AI-driven talent management, global payroll and employee self-service portals, aimed especially at organizations already using Oracle ERP.
- UKG Pro — UKG Pro, formed from the Ultimate Software and Kronos merger, is an HCM suite aimed at organizations with large hourly or frontline workforces that need scheduling, time tracking and labor analytics.
- Dayforce — Dayforce, formerly Ceridian, is an HCM platform built on a single database whose real-time payroll calculation suits healthcare, retail and other shift-based industries.
- ADP Mobile Solutions — ADP Mobile Solutions is the employee self-service companion to ADP's payroll-first HCM products, giving workers mobile access to pay, time and HR tasks backed by ADP's compliance coverage.
- Paylocity — Paylocity is a mid-market HCM platform whose self-service portal lets employees manage personal info, benefits and time-off requests, with added engagement features like peer recognition.
- Paycom — Paycom is a single-database HCM platform whose employee self-service tooling, including its Beti feature, lets employees manage and verify their own payroll.
- BambooHR — BambooHR is an HRIS aimed at smaller organizations that gives employees simple self-service for time-off requests and personal data.
Topics
- workday api
- workday time off api
- workday expenses api
- workday schedule api
- workday timecard
- workday worker profile
- workday onboarding journeys
- hcm data api
- workday graphql api
Need this app's data API integrated?
We deliver scoped integrations for any named app — from USD 500 with source-code handoff, or hosted access billed per call. Tell us the data you need.
- NDA + SOW on every engagement
- Delivery in 3–7 days
- Payment only after acceptance
- Work scoped to authorized use