Workday REST and SOAP (WWS v45+) API Capabilities

Type: ERP Integration System: Workday HCM / Financials (WWS v45.2) Confidence: 0.88 Sources: 7 Verified: 2026-03-02 Freshness: evolving

TL;DR

System Profile

Workday is a cloud-only enterprise platform covering HCM, Financial Management, Payroll, Student, and Planning. Unlike traditional on-premise ERPs, Workday is multi-tenant SaaS with no self-hosted option. All integrations route through Workday's cloud APIs. Workday releases two major updates per year (R1 in March, R2 in September), each introducing new WWS versions. The current production version is WWS v45.2 (2025R2, January 2026). Capabilities depend on which modules are licensed — there are no traditional "editions."

PropertyValue
VendorWorkday
SystemWorkday HCM / Financial Management
API SurfaceSOAP (WWS), REST v1, RaaS, WQL, Graph API
Current API VersionWWS v45.2 (2025R2) / REST v1 / Graph API v1
Editions CoveredAll licensed modules — HCM, Financials, Payroll, Student
DeploymentCloud (multi-tenant SaaS only)
API DocsWWS Directory v45.2
StatusGA (all API surfaces)

API Surfaces & Capabilities

Workday provides five distinct API surfaces, each suited to different integration patterns.

API SurfaceProtocolBest ForMax Records/RequestRate LimitReal-time?Bulk?
SOAP (WWS v45.2)HTTPS/XML (WSDL)Complex CRUD, payroll, financial transactionsConfigurable (page/count)~10 calls/sec/tenantYesVia pagination
REST API v1HTTPS/JSONWorker data, staffing, modern integrationsPaginated (default varies)~10 calls/sec/tenantYesNo
RaaSHTTPS/XML or JSONReporting, scheduled data extracts2 GB output, 30-min timeoutShared with SOAP/RESTSemi (on-demand)Yes (single report)
WQLHTTPS/JSONAd-hoc queries, analyticsPaginated~10 calls/sec/tenantYesYes (paginated)
Graph API (2023R1+)HTTPS/JSONModern read/write, mobile/web appsPaginatedPer-tenant, 429 on exceedYesNo

SOAP (WWS) — 55 Services

The SOAP API is Workday's most comprehensive integration surface with 55 named services as of v45.2, covering: Core HCM (Human_Resources, Staffing, Compensation, Benefits_Administration, Absence_Management, Talent, Performance_Management, Recruiting, Time_Tracking, Learning, Workforce_Planning, Scheduling), Financial (Financial_Management, Cash_Management, Revenue_Management, Settlement_Services, Professional_Services_Automation, Resource_Management), Payroll (Payroll, Payroll_Interface, Payroll_AUS, Payroll_CAN, Payroll_FRA, Payroll_GBR), Student (Student_Core, Student_Finance, Student_Records, and more), and Platform (Integrations, Identity_Management, Prism_Analytics, Workday_Extensibility, and others).

Rate Limits & Quotas

Per-Request Limits

Limit TypeValueApplies ToNotes
API calls per second~10 per tenantAll API surfacesObserved limit; not officially published. 429 returned when exceeded
Strategic Sourcing API5 requests/secSourcing endpoints onlyDocumented per-endpoint limit
RaaS output size2 GBAdvanced custom reportsMaximum output for web-service-enabled reports
RaaS execution timeout30 minutesAll RaaS reportsLarge reports (>50K rows) may timeout
SOAP response page sizeConfigurableWWS SOAP requestsSet via Response_Filter element (Count + Page)
REST response page sizeDefault variesREST APIPagination via offset/limit parameters

Rolling / Daily Limits

Limit TypeValueWindowEdition Differences
Per-tenant throughput~10 calls/sec (observed)Per-secondSame across all subscriptions
Concurrent integrationsTenant-dependentOngoingMay throttle during peak windows (payroll, year-end)
Graph API rate limitPer-tenant (undisclosed)Per-second429 + Retry-After header returned
RaaS concurrent reportsLimitedPer-tenantMultiple large reports simultaneously causes queuing

Rate Limit Behavior

Workday does not publicly document precise rate limits for most endpoints. The ~10 calls/second limit is widely observed by integration partners. When limits are exceeded, the API returns HTTP 429 with a Retry-After header. During high-load periods (payroll processing, open enrollment, year-end close), effective throughput may drop significantly.

Authentication

FlowUse WhenToken LifetimeRefresh?Notes
OAuth 2.0 (Auth Code)REST API, Graph API, WQL~60 min (configurable)Yes (refresh token)Register via "Register API Client for Integrations"
WS-Security (ISU)SOAP (WWS)Session-basedN/AUsername/password in SOAP header; ISU needs domain grants
OAuth 2.0 (Client Creds)Server-to-server RESTConfigurableYesFor non-interactive/daemon integrations
RaaS URL with ISURaaS report accessPer-requestN/AISU credentials in URL or basic auth header

Authentication Gotchas

Constraints

Integration Pattern Decision Tree

START -- User needs to integrate with Workday
|-- What's the integration pattern?
|   |-- Real-time (individual records, <1s)
|   |   |-- Reading data?
|   |   |   |-- Simple worker/org lookup -> REST API v1 or Graph API
|   |   |   +-- Complex multi-object query -> SOAP (WWS) Get operations
|   |   +-- Writing data?
|   |       |-- Standard business process -> SOAP (WWS) Submit/Put
|   |       +-- Custom object data -> REST API or Workday Extend
|   |-- Batch/Bulk (scheduled, high volume)
|   |   |-- Outbound (extracting)?
|   |   |   |-- < 50K rows -> RaaS (XML format with pagination)
|   |   |   |-- > 50K rows -> WQL with pagination or RaaS XML chunking
|   |   |   +-- Need calculated fields? -> RaaS
|   |   +-- Inbound (loading)?
|   |       |-- File-based -> EIB with CSV/XML
|   |       |-- Record-by-record -> SOAP Put/Submit with retry
|   |       +-- Mass migration -> Workday migration tools
|   |-- Event-driven (notifications)
|   |   |-- Outbound notifications -> Integration Events
|   |   +-- Real-time change detection -> Poll via RaaS/WQL (no native CDC)
|   +-- Reporting / Analytics
|       |-- Ad-hoc queries -> WQL via REST
|       |-- Scheduled reports -> RaaS via EIB
|       +-- Advanced analytics -> Prism Analytics API
|-- Direction?
|   |-- Inbound -> SOAP WWS (Put/Submit) or EIB
|   |-- Outbound -> RaaS, WQL, REST, or Graph API
|   +-- Bidirectional -> separate inbound/outbound flows
+-- Error tolerance?
    |-- Zero-loss -> idempotency + error logging + retry queues
    +-- Best-effort -> exponential backoff on 429s

Quick Reference

Key SOAP Operations by Service

ServiceCommon OperationsMethodPayloadNotes
Human_ResourcesGet_Workers, Put_Worker, Get_OrganizationsPOST (SOAP)XMLCore worker data CRUD
StaffingHire_Employee, Terminate_Employee, Change_JobPOST (SOAP)XMLBusiness process operations
CompensationGet_Compensation_Plans, Put_CompensationPOST (SOAP)XMLSalary, bonus, stock data
Financial_ManagementGet_Journals, Submit_Accounting_JournalPOST (SOAP)XMLGL, AP, AR operations
PayrollGet_Payroll_Results, Get_Payroll_InputPOST (SOAP)XMLPayroll data extraction
Benefits_AdministrationGet_Benefit_Plans, Enroll_In_BenefitsPOST (SOAP)XMLBenefits enrollment/changes
RecruitingGet_Job_Requisitions, Get_CandidatesPOST (SOAP)XMLRequisitions and applicant data
Time_TrackingGet_Time_Entries, Put_Time_EntryPOST (SOAP)XMLTime clock and timesheet data
IntegrationsGet_Integration_Events, Get_Integration_SystemsPOST (SOAP)XMLIntegration monitoring
Identity_ManagementGet_Workday_Account, Put_Workday_AccountPOST (SOAP)XMLUser provisioning/deprovisioning

REST API Key Endpoints

ResourceMethodEndpointNotes
WorkersGET/ccx/api/v1/{tenant}/workersList/search workers
Worker by IDGET/ccx/api/v1/{tenant}/workers/{id}Single worker detail
OrganizationsGET/ccx/api/v1/{tenant}/organizationsOrg hierarchy
Job PostingsGET/ccx/api/v1/{tenant}/jobPostingsActive job postings
Time OffGET/ccx/api/v1/{tenant}/timeOffRequestsTime off requests

Step-by-Step Integration Guide

1. Create an Integration System User (ISU)

Every Workday integration starts with a dedicated ISU for audit trail and security isolation. [src4]

  1. Search "Create Integration System User" in Workday
  2. Set username (e.g., ISU_MyIntegration) and password
  3. Uncheck "Require New Password at Next Sign In"
  4. Create an Integration System Security Group (ISSG) and add the ISU
  5. Grant domain security policy permissions (Get/Put) for required data domains
  6. Run "Activate Pending Security Policy Changes"

Verify: Log in as the ISU and confirm access to required data via Workday search.

2. Register an OAuth 2.0 API Client (for REST/Graph)

Required for REST, Graph API, and WQL access. [src5]

  1. Search "Register API Client for Integrations" in Workday
  2. Set Client Name, select Non-Expiring Refresh Tokens
  3. Add required scopes (HCM, Financials, Staffing)
  4. Save Client ID and Client Secret
  5. Save Token Endpoint and Authorization Endpoint URLs
  6. Generate initial refresh token via "Manage Refresh Tokens for Integrations"

Verify: Exchange refresh token for access token and confirm 200 response.

3. Authenticate and Obtain Access Token (REST)

Exchange the refresh token for an access token. [src5]

curl -X POST "https://wd2-impl-services1.workday.com/ccx/oauth2/{tenant}/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -u "{client_id}:{client_secret}" \
  -d "grant_type=refresh_token&refresh_token={refresh_token}"

Verify: Response contains access_token and token_type: Bearer.

4. Execute a SOAP Request (Get Workers)

Construct an XML envelope with WS-Security credentials. [src1, src3]

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:wd="urn:com.workday/bsvc">
  <env:Header>
    <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/...">
      <wsse:UsernameToken>
        <wsse:Username>ISU_MyIntegration@{tenant}</wsse:Username>
        <wsse:Password>your_password</wsse:Password>
      </wsse:UsernameToken>
    </wsse:Security>
  </env:Header>
  <env:Body>
    <wd:Get_Workers_Request wd:version="v45.2">
      <wd:Response_Filter>
        <wd:Page>1</wd:Page>
        <wd:Count>100</wd:Count>
      </wd:Response_Filter>
    </wd:Get_Workers_Request>
  </env:Body>
</env:Envelope>

Verify: Response contains <wd:Get_Workers_Response> with worker data.

5. Handle Pagination (SOAP)

SOAP responses include total results and total pages. Loop through all pages. [src1]

page = 1
all_workers = []
while True:
    # Build SOAP envelope with Response_Filter Page={page}, Count=100
    response = requests.post(soap_endpoint, data=envelope, headers=headers)
    root = ElementTree.fromstring(response.content)
    workers = root.findall('.//{urn:com.workday/bsvc}Worker')
    all_workers.extend(workers)
    total_pages = int(root.find('.//{urn:com.workday/bsvc}Total_Pages').text)
    if page >= total_pages:
        break
    page += 1

Verify: len(all_workers) matches Total_Results from first page.

6. Implement Rate Limit Handling

Respect the ~10 calls/sec limit with exponential backoff. [src4]

def workday_request(url, headers, data, max_retries=5):
    for attempt in range(max_retries):
        response = requests.post(url, headers=headers, data=data)
        if response.status_code == 429:
            retry_after = int(response.headers.get('Retry-After', 2 ** attempt))
            time.sleep(retry_after)
            continue
        response.raise_for_status()
        return response
    raise Exception(f"Max retries ({max_retries}) exceeded")

Verify: Integration completes without unhandled 429 errors during load testing.

Code Examples

Python: Query Workers via REST API

# Input:  OAuth access token, tenant name
# Output: List of active workers in JSON format

import requests

BASE_URL = "https://wd2-impl-services1.workday.com"
TENANT = "your_tenant"
ACCESS_TOKEN = "your_access_token"

headers = {
    "Authorization": f"Bearer {ACCESS_TOKEN}",
    "Content-Type": "application/json"
}

offset, limit, all_workers = 0, 100, []
while True:
    url = f"{BASE_URL}/ccx/api/v1/{TENANT}/workers?limit={limit}&offset={offset}"
    resp = requests.get(url, headers=headers)
    if resp.status_code == 429:
        import time; time.sleep(int(resp.headers.get("Retry-After", 2)))
        continue
    resp.raise_for_status()
    workers = resp.json().get("data", [])
    all_workers.extend(workers)
    if len(workers) < limit: break
    offset += limit
print(f"Retrieved {len(all_workers)} workers")

cURL: Test REST API Authentication

# Step 1: Get access token
curl -X POST "https://wd2-impl-services1.workday.com/ccx/oauth2/{tenant}/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -u "{client_id}:{client_secret}" \
  -d "grant_type=refresh_token&refresh_token={refresh_token}"

# Step 2: Query workers
curl -X GET "https://wd2-impl-services1.workday.com/ccx/api/v1/{tenant}/workers?limit=10" \
  -H "Authorization: Bearer {access_token}"

Data Mapping

SOAP vs REST Field Naming

Workday Field (SOAP)REST API FieldTypeTransformGotcha
Worker_ID/IDidStringDirectSOAP returns composite ID element; REST returns simple string
Legal_Name_Data/First_NamelegalName.firstNameStringDirectSOAP nested XML vs REST dot-notation JSON
Position_Data/Business_TitlebusinessTitleStringDirectMay differ from Job_Profile title
Worker_Status_Data/ActiveactiveBoolean"1"/"0" to true/falseSOAP returns string; REST returns boolean
Organization_Data/Organization_ReferencesupervisoryOrganizationObjectXML Ref to JSON objectSOAP uses WID reference; REST uses nested object
Effective_DateeffectiveDateDateYYYY-MM-DDReturns in tenant timezone, not UTC

Data Type Gotchas

Error Handling & Failure Points

Common Error Codes

CodeMeaningCauseResolution
429Rate limit exceededToo many API calls per second per tenantExponential backoff with Retry-After header
401UnauthorizedInvalid/expired credentials or tokenRe-authenticate; check ISU is active; refresh OAuth token
403ForbiddenISU lacks domain security permissionsGrant Get/Put on security domains; activate pending changes
500Internal Server ErrorWorkday server-side error (transient)Retry with backoff; contact support if persistent
INVALID_REFERENCEObject not found (SOAP)WID or reference ID doesn't existValidate reference IDs before submission
VALIDATION_ERRORBusiness rule violation (SOAP)Data fails Workday validationCheck business process rules; review error detail
VERSION_ERRORUnsupported WWS version (SOAP)Requested version deprecated or invalidUpdate to supported WWS version

Failure Points in Production

Anti-Patterns

Wrong: Using JSON format for large RaaS extracts

# BAD -- JSON RaaS has no pagination; large datasets will timeout
url = f"https://{host}/ccx/service/customreport2/{tenant}/{report}?format=json"
response = requests.get(url, auth=(isu_user, isu_pass))
# This will timeout for >50K rows

Correct: Use XML format with pagination for large RaaS extracts

# GOOD -- XML format supports Response_Filter with Page/Count
page = 1
all_rows = []
while True:
    url = f"https://{host}/ccx/service/customreport2/{tenant}/{report}?format=simplexml&Page={page}&Count=1000"
    response = requests.get(url, auth=(isu_user, isu_pass))
    rows = parse_xml_rows(response.content)
    all_rows.extend(rows)
    if len(rows) < 1000: break
    page += 1

Wrong: Sharing a single ISU across multiple integrations

# BAD -- Permission changes for one integration break all others
ISU: ISU_SharedAccount
  -> Integration A, B, C (all sharing same credentials)

Correct: One ISU per integration system

# GOOD -- Isolated credentials, permissions, and audit trail
ISU: ISU_HCM_Sync         -> Integration A
ISU: ISU_Payroll_Extract   -> Integration B
ISU: ISU_Benefits_Enroll   -> Integration C

Wrong: Hardcoding WWS version without upgrade plan

# BAD -- v37.0 will be deprecated; no upgrade path
SOAP_URL = f"https://{host}/ccx/service/{tenant}/Human_Resources/v37.0"

Correct: Parameterize version and monitor deprecation

# GOOD -- Version is configurable and monitored
WWS_VERSION = os.environ.get("WORKDAY_WWS_VERSION", "v45.2")
SOAP_URL = f"https://{host}/ccx/service/{tenant}/Human_Resources/{WWS_VERSION}"
# Alert when version approaches deprecation (18-month window)

Common Pitfalls

Diagnostic Commands

# Test REST API authentication (OAuth token exchange)
curl -X POST "https://wd2-impl-services1.workday.com/ccx/oauth2/{tenant}/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -u "{client_id}:{client_secret}" \
  -d "grant_type=refresh_token&refresh_token={refresh_token}"

# Check WWS WSDL for a specific service (verify version is accessible)
curl -X GET "https://wd2-impl-services1.workday.com/ccx/service/{tenant}/Human_Resources/v45.2?wsdl"

# Test RaaS report access (XML format, first page)
curl -X GET "https://wd2-impl-services1.workday.com/ccx/service/customreport2/{tenant}/{owner}/{report}?format=simplexml&Page=1&Count=5" \
  -u "ISU_User@tenant:password"

# Test WQL query endpoint
curl -X POST "https://wd2-impl-services1.workday.com/ccx/api/wql/v1/{tenant}" \
  -H "Authorization: Bearer {access_token}" \
  -H "Content-Type: application/json" \
  -d '{"query": "SELECT worker, fullName FROM allActiveWorkers LIMIT 5"}'

Version History & Compatibility

API VersionRelease DateStatusBreaking ChangesMigration Notes
WWS v45.2 (2025R2)2026-01-09CurrentNone (patch)Latest patch for 2025R2 cycle
WWS v45.0 (2025R2)2025-09-19CurrentNew services/operationsBase 2025R2 release
WWS v44.2 (2025R1)2025-07-11SupportedNone (patch)Final patch for 2025R1
WWS v44.0 (2025R1)2025-03-14SupportedNew services/operationsBase 2025R1 release
REST API v12019CurrentEvolving (additive)No breaking changes planned
Graph API v12023R1Current (GA)N/A (first release)Introduced 2023R1; evolving
WWS v37.02021-09-17Nearing EOL---Plan upgrade to v44+ or v45+

Deprecation Policy: Workday supports each major WWS API version for a minimum of 18 months. Deprecation is announced through Workday Community and release notes. Backward compatibility is maintained within a version — integrations built for v45.0 continue working with v45.0 even as v46.x is released. Older versions do not receive new features.

When to Use / When Not to Use

Use WhenDon't Use WhenUse Instead
Full CRUD on HCM data (workers, orgs, compensation)Simple read-only report extractionRaaS with XML pagination
Complex business process operations (hire, terminate)Lightweight mobile/web data accessGraph API or REST v1
Financial transactions requiring SOAP securityBulk data migration (>100K records)EIB file-based import or migration tools
Need access to all 55 WWS servicesReal-time change notifications (CDC)Integration Events + polling
Integration with middleware (MuleSoft, Boomi, Workato)Direct database-level accessN/A — Workday has no DB access

Important Caveats

Related Units