Skip to content

Workday Sensor ​

What it ingests ​

Org chart and role context from Workday HCM via the Workday REST API:

Workday objectOntology entitySignal
Supervisory organizationOrganizationorganization
WorkerPerson (identity)worker

A supervisory organization is a team (the HubSpot company analog). Workers are identity — they resolve to Person via email/name, the same contract as a HubSpot contact or Greenhouse candidate, and MEMBER_OF their supervisory org. Manager is identity only (no Person→Person edge).

This is Workday alone. BambooHR is a different HRIS with a different API and has its own BambooHR sensor.

Read-only and poll-based against https://{host}/ccx/api/v1/{tenant}. SOAP, RaaS, SCIM, and Workday Event Notifications are out of v1.

Credential ​

References a workday_api_client credential by id. The secret is a JSON blob:

json
{
  "host": "wd2-impl-services1.workday.com",
  "tenant": "acme",
  "client_id": "<API client id>",
  "client_secret": "<API client secret>",
  "refresh_token": "<non-expiring refresh token>"
}

host is the Workday REST hostname (*.workday.com or *.myworkday.com) — no path. tenant is the tenant name in /ccx/oauth2/{tenant}/token. Auth is the OAuth 2.0 refresh-token grant (API Client for Integrations), not a browser authorization-code flow and not an ISU username/password.

bash
curl -sS -X POST https://your-corveil-host/api/credentials \
  -H "Authorization: Bearer <admin>" -H "Content-Type: application/json" \
  -d '{"type":"workday_api_client","name":"acme-workday","secret":"{\"host\":\"wd2-impl-services1.workday.com\",\"tenant\":\"acme\",\"client_id\":\"…\",\"client_secret\":\"…\",\"refresh_token\":\"…\"}"}'

Config fields ​

KeyRequiredNotes
enabled_objectsnoComma-separated Workday object kinds. Blank polls every supported kind. Unknown names are rejected at configure time.

Supported object names: organizations, workers. supervisory_organizations and orgs are accepted as aliases for organizations.

There is no default_entity_type. This source emits Organization plus identity, so a single override would silently mistype one of them. Host and tenant live on the credential, not on sensor config.

Provider-side setup ​

  1. In Workday, create an Integration System User (ISU) with read access to worker public data and current staffing information.
  2. Search Register API Client for Integrations. Enable Non-Expiring Refresh Tokens. Scope Staffing (and Integration as required).
  3. Search Manage Refresh Tokens for Integrations, select the ISU, and generate a refresh token.
  4. Copy Client ID, Client Secret, refresh token, tenant name, and REST hostname (from your Workday API docs URL — often wd2-impl-services1.workday.com or impl-services1.wd5.myworkday.com).
  5. Activate pending security policy changes.

Wire-up ​

POST /api/sensors

json
{
  "sensor_type": "workday",
  "name": "Acme Workday",
  "config": {
    "enabled_objects": "organizations, workers"
  },
  "credentials": { "api_client": "<workday_api_client credential id>" }
}

Verify ​

Run Test connection. It mints an access token and authenticates against the first enabled object's list endpoint, so a 401/403 fails at save/test rather than on the first poll.

Once polling, each object kind's count appears in the per-poll summary log (organizations_collected, workers_collected). A kind stuck at zero while the other moves is the signal to check that kind's Workday security domain.

How incremental sync works ​

Workday's REST worker/organization collections paginate with limit / offset and do not expose an updated_after filter comparable to Harvest. Corveil:

  • Walks each collection from the persisted offset, up to 10 pages (1,000 records) per object per poll.
  • Resets the offset to 0 when a collection drains, so the next poll rescans from the head. sensor_events dedupes on workday:<signal>:<id>.
  • Stamps OccurredAt from lastModified when present; otherwise uses ingest time (ingest_fallback).
  • Access tokens last about an hour; a 401 re-mints once from the stored refresh token.

Deletes are invisible. A worker vanishing from results is not treated as a deletion.

Not included ​

  • BambooHR. A different HRIS; do not configure this source against BambooHR.
  • SOAP / RaaS / SCIM. Different Workday products; their credentials will not mint a REST access token.
  • OAuth authorization-code (browser). Only the API Client for Integrations refresh-token grant is supported.
  • Positions, jobs, compensation, time off. Deferred. Role context is the worker's businessTitle plus the supervisory org.
  • Event Notifications / webhooks. Out of v1; polling is the supported path.