Stitchflow
Workiva logo

Workiva User Management API Guide

API workflow

How to automate user lifecycle operations through APIs with caveats that matter in production.

UpdatedMar 17, 2026

Summary and recommendation

Workiva exposes a REST Platform API at https://api.app.wdesk.com/platform/v1 authenticated via OAuth 2.0 (client_credentials or authorization_code flows).

Separate scopes gate read and write access for both users (iam:users:read, iam:users:write) and groups (iam:groups:read, iam:groups:write);

all scopes must be explicitly granted to the OAuth client by a workspace administrator.

All user operations are workspace-scoped to the OAuth client's associated workspace-cross-workspace automation requires separate client credentials per workspace.

This API is the foundation for building an identity graph that maps Workiva users, their roles, and group memberships across workspaces into a unified access model.

Pagination uses an opaque nextPageToken cursor with a maximum page size of 100;

do not construct token values manually.

Rate-limit thresholds and Retry-After behavior are not published in official documentation as of the research date-contact Workiva support before designing high-frequency polling loops.

API quick reference

Has user APIYes
Auth methodOAuth 2.0 (client credentials and authorization code flows)
Base URLOfficial docs
SCIM availableYes
SCIM plan requiredEnterprise

Authentication

Auth method: OAuth 2.0 (client credentials and authorization code flows)

Setup steps

  1. Log in to Workiva and navigate to the Developer Portal (developers.workiva.com).
  2. Create an API client application to obtain a client_id and client_secret.
  3. Request an access token via POST to https://api.app.wdesk.com/iam/v1/oauth2/token using client_credentials grant.
  4. Include the returned Bearer token in the Authorization header for all API requests.
  5. Ensure the client application has been granted the required scopes by a workspace administrator.

Required scopes

Scope Description Required for
iam:users:read Read user profiles and list users in the workspace. GET /users, GET /users/{id}
iam:users:write Create, update, and deactivate users in the workspace. POST /users, PATCH /users/{id}, DELETE /users/{id}
iam:groups:read Read group membership and group details. GET /groups, GET /groups/{id}
iam:groups:write Create and manage groups and group membership. POST /groups, PATCH /groups/{id}

User object / data model

Field Type Description On create On update Notes
id string Unique Workiva-assigned user identifier. system-generated immutable Used as path parameter in user-specific endpoints.
email string User's primary email address; used as login identifier. required allowed Must be unique within the workspace.
firstName string User's given name. required allowed
lastName string User's family name. required allowed
displayName string Full display name shown in the Workiva UI. optional allowed Often derived from firstName + lastName.
active boolean Whether the user account is active. optional (defaults true) allowed Setting to false deactivates the user without deleting.
roles array List of workspace roles assigned to the user. optional allowed Role identifiers are workspace-specific.
createdAt string (ISO 8601) Timestamp when the user was created. system-generated immutable
updatedAt string (ISO 8601) Timestamp of last modification. system-generated system-generated
workspaceId string Identifier of the workspace the user belongs to. system-assigned immutable

Core endpoints

List Users

  • Method: GET
  • URL: https://api.app.wdesk.com/platform/v1/users
  • Watch out for: Pagination uses nextPageToken; iterate until token is absent or empty.

Request example

GET /platform/v1/users?pageSize=50
Authorization: Bearer {token}

Response example

{
  "data": [{"id":"usr_abc","email":"jane@example.com","firstName":"Jane","active":true}],
  "nextPageToken": "tok_xyz"
}

Get User

  • Method: GET
  • URL: https://api.app.wdesk.com/platform/v1/users/{userId}
  • Watch out for: Returns 404 if user does not exist in the authenticated workspace.

Request example

GET /platform/v1/users/usr_abc
Authorization: Bearer {token}

Response example

{
  "id": "usr_abc",
  "email": "jane@example.com",
  "firstName": "Jane",
  "lastName": "Doe",
  "active": true
}

Create User

  • Method: POST
  • URL: https://api.app.wdesk.com/platform/v1/users
  • Watch out for: Email must be unique; duplicate email returns 409 Conflict.

Request example

POST /platform/v1/users
Authorization: Bearer {token}
Content-Type: application/json

{"email":"new@example.com","firstName":"New","lastName":"User"}

Response example

{
  "id": "usr_new1",
  "email": "new@example.com",
  "active": true,
  "createdAt": "2024-01-15T10:00:00Z"
}

Update User

  • Method: PATCH
  • URL: https://api.app.wdesk.com/platform/v1/users/{userId}
  • Watch out for: Partial updates only; omitted fields are unchanged.

Request example

PATCH /platform/v1/users/usr_abc
Authorization: Bearer {token}
Content-Type: application/json

{"active":false}

Response example

{
  "id": "usr_abc",
  "active": false,
  "updatedAt": "2024-06-01T12:00:00Z"
}

Delete User

  • Method: DELETE
  • URL: https://api.app.wdesk.com/platform/v1/users/{userId}
  • Watch out for: Deletion is permanent. Consider setting active=false for reversible deprovisioning.

Request example

DELETE /platform/v1/users/usr_abc
Authorization: Bearer {token}

Response example

HTTP 204 No Content

List Groups

  • Method: GET
  • URL: https://api.app.wdesk.com/platform/v1/groups
  • Watch out for: Group membership details require a separate GET /groups/{id}/members call.

Request example

GET /platform/v1/groups
Authorization: Bearer {token}

Response example

{
  "data": [{"id":"grp_1","name":"Finance Team","memberCount":12}],
  "nextPageToken": null
}

Add User to Group

  • Method: POST
  • URL: https://api.app.wdesk.com/platform/v1/groups/{groupId}/members
  • Watch out for: User must already exist in the workspace before being added to a group.

Request example

POST /platform/v1/groups/grp_1/members
Authorization: Bearer {token}
Content-Type: application/json

{"userId":"usr_abc"}

Response example

HTTP 201 Created
{"groupId":"grp_1","userId":"usr_abc"}

Remove User from Group

  • Method: DELETE
  • URL: https://api.app.wdesk.com/platform/v1/groups/{groupId}/members/{userId}
  • Watch out for: Does not deactivate the user; only removes group membership.

Request example

DELETE /platform/v1/groups/grp_1/members/usr_abc
Authorization: Bearer {token}

Response example

HTTP 204 No Content

Rate limits, pagination, and events

  • Rate limits: Workiva's public documentation does not explicitly publish specific rate-limit thresholds or tier-based limits for the Platform API.

  • Rate-limit headers: Unknown

  • Retry-After header: Unknown

  • Rate-limit notes: No explicit rate-limit values, headers, or Retry-After behavior documented in official sources as of research date. Contact Workiva support for current limits.

  • Pagination method: token

  • Default page size: 100

  • Max page size: 100

  • Pagination pointer: pageToken

  • Webhooks available: No

  • Webhook notes: Workiva's public Platform API documentation does not describe a webhook or event-subscription system for user lifecycle events as of the research date.

  • Alternative event strategy: Poll GET /users with updatedAt filtering or use SCIM provisioning via an IdP for event-driven user lifecycle management.

SCIM API status

  • SCIM available: Yes

  • SCIM version: 2.0

  • Plan required: Enterprise

  • Endpoint: https://api.app.wdesk.com/scim/v2

  • Supported operations: GET /Users, GET /Users/{id}, POST /Users, PUT /Users/{id}, PATCH /Users/{id}, DELETE /Users/{id}, GET /Groups, POST /Groups, PATCH /Groups/{id}, DELETE /Groups/{id}

Limitations:

  • Requires Enterprise plan; not available on lower tiers.
  • SCIM token is generated within Workiva admin settings and is workspace-scoped.
  • IdP-side connector configuration (e.g., Okta, Azure AD) must use the Workiva-provided SCIM base URL and bearer token.
  • SCIM provisioning does not automatically grant document-level permissions; workspace role assignment is separate.
  • Workiva does not publish a native Okta or Entra SCIM app in their gallery; configuration is done via generic SCIM 2.0 connector in the IdP.

Common scenarios

Provisioning a new employee requires: (1) obtain a Bearer token via POST /iam/v1/oauth2/token;

(2) POST /platform/v1/users with email, firstName, lastName;

(3) capture the returned user id;

(4) POST /platform/v1/groups/{groupId}/members to assign group membership.

Check for an existing user via GET /users?email= before creation-duplicate email returns 409 Conflict.

For deprovisioning, PATCH /platform/v1/users/{userId} with {"active": false} is the preferred reversible action;

DELETE is permanent and cannot be undone via API, so reserve it for post-retention-review cleanup only.

For Enterprise accounts, SCIM 2.0 is available at https://api.app.wdesk.com/scim/v2 using a static bearer token generated in the Workiva admin UI-this token is separate from OAuth 2.0 credentials and is workspace-scoped.

Workiva does not publish a pre-built IdP gallery app;

configure SCIM via a generic SCIM 2.0 connector in Okta or Azure AD.

Note that SCIM group push does not automatically grant document-level permissions inside Workiva;

workspace role assignment remains a separate step.

Provision a new employee via REST API

  1. Obtain OAuth 2.0 access token via POST to /iam/v1/oauth2/token with client_credentials grant.
  2. POST /platform/v1/users with email, firstName, lastName to create the user account.
  3. Capture the returned user id.
  4. POST /platform/v1/groups/{groupId}/members with the new userId to assign group membership.
  5. Optionally PATCH /platform/v1/users/{userId} to assign workspace roles.

Watch out for: If the email already exists in the workspace, POST /users returns 409; check for existing users with GET /users?email= before creating.

Deprovision a departing employee

  1. GET /platform/v1/users?email={email} to resolve the user's id.
  2. PATCH /platform/v1/users/{userId} with {"active": false} to immediately disable access.
  3. Optionally DELETE /platform/v1/users/{userId} for permanent removal after data retention review.

Watch out for: Deactivation (active=false) is preferred over deletion to preserve audit trails; deletion is irreversible.

Set up SCIM auto-provisioning via IdP (Enterprise)

  1. Confirm workspace is on the Enterprise plan.
  2. In Workiva Admin, navigate to Security > SCIM Provisioning and generate a SCIM bearer token.
  3. Note the SCIM base URL: https://api.app.wdesk.com/scim/v2.
  4. In your IdP (e.g., Okta or Azure AD), configure a generic SCIM 2.0 application using the Workiva SCIM base URL and bearer token.
  5. Map IdP user attributes to SCIM attributes (userName → email, name.givenName → firstName, etc.).
  6. Enable provisioning features: Create Users, Update User Attributes, Deactivate Users.
  7. Test with a pilot user before enabling for all users.

Watch out for: Workiva does not have a pre-built IdP gallery app; use the generic SCIM 2.0 connector. Group push via SCIM does not automatically grant document permissions inside Workiva.

Why building this yourself is a trap

The most consequential caveat is the irreversibility of DELETE /platform/v1/users/{userId}-any automation that calls DELETE rather than PATCH active=false will permanently remove user records with no API-level recovery path. OAuth 2.0 tokens are short-lived; omitting token refresh logic will cause silent failures in long-running provisioning jobs.

The SCIM bearer token and OAuth 2.0 tokens are entirely separate credentials with different generation paths and rotation requirements-conflating them in a single secrets store without clear labeling is a common integration error. Role identifiers in the roles array are workspace-specific strings;

always retrieve valid role IDs via GET /roles before assignment rather than hardcoding values. Webhooks for user lifecycle events are not available in the public Platform API; event-driven workflows must fall back to polling GET /users with updatedAt filtering or rely on IdP-side SCIM push as the trigger mechanism.

Automate Workiva workflows without one-off scripts

Stitchflow builds and maintains end-to-end IT automation across your SaaS stack, including apps without APIs. Built for exactly how your company works, with human approvals where they matter.

Every app coverage, including apps without APIs
60+ app integrations plus browser automation for apps without APIs
IT graph reconciliation across apps and your IdP
Less than a week to launch, maintained as APIs and admin consoles change
SOC 2 Type II. ~2 hours of your team's time

UpdatedMar 17, 2026

* Details sourced from official product documentation and admin references.

Keep exploring

Related apps

15Five logo

15Five

Full API + SCIM
AutomationAPI + SCIM
Last updatedFeb 2026

15Five uses a fixed role-based permission model with six predefined roles: Account Admin, HR Admin, Billing Admin, Group Admin, Manager, and Employee. No custom roles can be constructed. User management lives at Settings gear → People → Manage people p

1Password logo

1Password

Full API + SCIM
AutomationAPI + SCIM
Last updatedFeb 2026

1Password's admin console at my.1password.com covers the full user lifecycle — invitations, group assignments, vault access, suspension, and deletion — without any third-party tooling. Like every app that mixes role-based and resource-level permissions

8x8 logo

8x8

Full API + SCIM
AutomationAPI + SCIM
Last updatedFeb 2026

8x8 Admin Console supports full lifecycle user management — create, deactivate, and delete — across its X Series unified communications platform. Every app a user can access (8x8 Work desktop, mobile, web, Agent Workspace) is gated by license assignmen