List controls#
Description#
Return a paginated collection of controls as full representations. A workspace is in either standalone mode or multi-instance mode. Unfiltered results contain standalone controls in standalone mode, or definition and instance controls in multi-instance mode. Use $filter=controlType eq 'standalone' (or in) to request a subset of the types available in that workspace mode. To page through the instances derived from a specific definition, filter by that definition’s controlId with $filter=definitionId eq 'BEN.002'. Nested attributes are filtered with dotted paths that mirror the response body, for example process.name eq 'Revenue' or locations.id eq '...'. Absence is expressed as <field> eq null and presence as <field> ne null; for subProcess, locations, systems, programs, mitigatedRisks and activeTestingSignal a null comparison is the only form supported. Against a value, ne is the negation of eq, so like not (...) it does not match controls whose value is absent; use <field> eq null to find those. overriddenFields accepts either a standard field name or a custom field schema id, where in matches instances overriding any of the listed fields and eq matches a single overridden field.
GET /controls
Required OAuth Scopes
grc:read
Parameters#
Parameter |
In |
Type |
Required |
Description |
|---|---|---|---|---|
X-Version |
header |
string |
true |
Version of the API (2026-09-01.grc.preview) |
$maxpagesize |
query |
integer(int32) |
false |
Maximum number of items to return in a single page. The service applies a default and a maximum; requests above the maximum are clamped. |
$next |
query |
string |
false |
Opaque cursor identifying the next page of results, taken from the previous page. Omit on the first request. |
$filter |
query |
string |
false |
Filter expression restricting the collection, of the form |
$orderBy |
query |
string |
false |
Sort criteria of the form `field [asc |
Wk-Workspace |
header |
string |
true |
The id of the Workiva workspace to operate in. Authorization is enforced against the authenticated user’s access within this workspace. |
Filter Options#
Available logical operators: and, or, not
Name |
Predicates Supported |
|---|---|
activeAssessments |
|
activeIssueCount |
|
activeTestingSignal |
|
automatedManual |
|
controlId |
|
controlType |
|
definitionId |
|
description |
|
frequency |
|
id |
|
locations |
|
locations.id |
|
mitigatedRisks |
|
mitigatedRisks.id |
|
name |
|
overriddenFields |
|
owner.id |
|
preventiveDetective |
|
process.id |
|
process.name |
|
programs |
|
programs.id |
|
projectId |
|
significance |
|
subProcess |
|
subProcess.id |
|
subProcess.name |
|
systems |
|
systems.id |
|
Sorting Options#
Name |
Orders Supported |
|---|---|
automatedManual |
|
controlId |
|
description |
|
frequency |
|
name |
|
preventiveDetective |
|
process.name |
|
significance |
|
subProcess.name |
|
updatedAt |
|
Code Samples#
curl -X GET https://api.app.wdesk.com/controls \
-H 'Accept: application/json' \
-H 'Wk-Workspace: 1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d' \
-H 'Authorization: Bearer {access-token}' \
-H 'X-Version: 2026-09-01.grc.preview'
http GET https://api.app.wdesk.com/controls \
X-Version:2026-09-01.grc.preview \
Accept:application/json \
Wk-Workspace:1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d \
Authorization:"Bearer {access-token}"
wget --method=GET "https://api.app.wdesk.com/controls" \
--output-document - \
--header 'Accept: application/json' \
--header 'Wk-Workspace: 1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d' \
--header 'Authorization: Bearer {access-token}' \
--header 'X-Version: 2026-09-01.grc.preview'
import requests
headers = {
'X-Version': '2026-09-01.grc.preview',
'Accept': 'application/json',
'Wk-Workspace': '1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api.app.wdesk.com/controls', headers = headers)
print(r.json())
Returns#
200 - A paginated collection of controls.#
A collection of controls.
400 - The request was invalid.#
Error response indicating the service could not process the request.
401 - Authentication is missing or invalid.#
Error response indicating the service could not process the request.
403 - The caller is not permitted to access this resource.#
Error response indicating the service could not process the request.
429 - The rate limit has been exceeded.#
Error response indicating the service could not process the request.
500 - An unexpected error occurred.#
Error response indicating the service could not process the request.
Example Responses#
{
"@nextLink": "https://api.app.wdesk.com/controls?$next=b3BhcXVlLW5leHQtcGFnZS10b2tlbg==",
"data": [
{
"automatedManual": "manual",
"controlId": "BEN.002",
"controlType": "definition",
"customFields": [
{
"enumValue": "Medium",
"id": "8f3c1a2b-4d5e-4f6a-8b7c-9d0e1f2a3b4c",
"name": "Risk Rating",
"type": "singleSelectEnum"
}
],
"definition": {
"instanceCount": 3
},
"description": "Approves AP invoices before payment is released.",
"frequency": "monthly",
"id": "4a3b2c1d-0e9f-4a8b-7c6d-5e4f3a2b1c0d",
"locations": [],
"name": "AP Invoice Approval",
"owner": {
"id": "u_4cc9f9128a684f45a7a37b08b70b54c1"
},
"preventiveDetective": "detective",
"process": {
"id": "2b1e5a7c-3d4f-4a1b-9c2d-6e7f8a9b0c1d",
"name": "Financial Reporting"
},
"risks": [
{
"id": "9a8b7c6d-5e4f-4a3b-2c1d-0e9f8a7b6c5d",
"name": "Misstated account balances",
"riskId": "R.001"
}
],
"significance": "key",
"subProcess": {
"id": "3c2f6b8d-4e5a-4b2c-8d3e-7f8a9b0c1d2e",
"name": "Account Reconciliation"
},
"systems": []
},
{
"automatedManual": "manual",
"controlId": "BEN.002",
"controlType": "instance",
"customFields": [
{
"enumValue": "Medium",
"id": "8f3c1a2b-4d5e-4f6a-8b7c-9d0e1f2a3b4c",
"name": "Risk Rating",
"type": "singleSelectEnum"
}
],
"description": "Approves AP invoices before payment is released.",
"frequency": "monthly",
"id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
"instance": {
"definition": {
"controlId": "BEN.002",
"id": "4a3b2c1d-0e9f-4a8b-7c6d-5e4f3a2b1c0d",
"name": "AP Invoice Approval"
},
"overriddenFields": [
"frequency",
"8f3c1a2b-4d5e-4f6a-8b7c-9d0e1f2a3b4c"
]
},
"locations": [
{
"id": "7f6e5d4c-3b2a-4c1d-9e8f-0a1b2c3d4e5f",
"name": "North America"
}
],
"name": "AP Invoice Approval",
"owner": {
"id": "u_4cc9f9128a684f45a7a37b08b70b54c1"
},
"preventiveDetective": "detective",
"process": {
"id": "2b1e5a7c-3d4f-4a1b-9c2d-6e7f8a9b0c1d",
"name": "Financial Reporting"
},
"risks": [
{
"id": "9a8b7c6d-5e4f-4a3b-2c1d-0e9f8a7b6c5d",
"name": "Misstated account balances",
"riskId": "R.001"
}
],
"significance": "key",
"subProcess": {
"id": "3c2f6b8d-4e5a-4b2c-8d3e-7f8a9b0c1d2e",
"name": "Account Reconciliation"
},
"systems": [
{
"id": "5d4c3b2a-1f0e-4d9c-8b7a-6f5e4d3c2b1a",
"name": "Workday"
}
]
}
]
}
{
"@nextLink": "https://api.app.wdesk.com/controls?$next=b3BhcXVlLW5leHQtcGFnZS10b2tlbg==",
"data": [
{
"automatedManual": "manual",
"controlId": "BEN.001",
"controlType": "standalone",
"customFields": [
{
"enumValue": "High",
"id": "8f3c1a2b-4d5e-4f6a-8b7c-9d0e1f2a3b4c",
"name": "Risk Rating",
"type": "singleSelectEnum"
}
],
"description": "Ensures general ledger balances are reconciled monthly.",
"frequency": "monthly",
"id": "d9c09501-214c-432e-85c9-8cd1009b9660",
"locations": [
{
"id": "7f6e5d4c-3b2a-4c1d-9e8f-0a1b2c3d4e5f",
"name": "North America"
},
{
"id": "8a7b6c5d-4e3f-4d2c-1b0a-9f8e7d6c5b4a",
"name": "EMEA"
}
],
"name": "General Ledger Reconciliation",
"owner": {
"id": "u_4cc9f9128a684f45a7a37b08b70b54c1"
},
"preventiveDetective": "preventive",
"process": {
"id": "2b1e5a7c-3d4f-4a1b-9c2d-6e7f8a9b0c1d",
"name": "Financial Reporting"
},
"risks": [
{
"id": "9a8b7c6d-5e4f-4a3b-2c1d-0e9f8a7b6c5d",
"name": "Misstated account balances",
"riskId": "R.001"
}
],
"significance": "key",
"subProcess": {
"id": "3c2f6b8d-4e5a-4b2c-8d3e-7f8a9b0c1d2e",
"name": "Account Reconciliation"
},
"systems": [
{
"id": "5d4c3b2a-1f0e-4d9c-8b7a-6f5e4d3c2b1a",
"name": "Workday"
}
]
}
]
}
{
"code": "invalidFilter",
"message": "The $filter value could not be parsed.",
"target": "$filter"
}
{
"code": "unauthenticated",
"message": "Authentication credentials were missing or invalid."
}
{
"code": "permissionDenied",
"message": "You do not have permission to access this resource."
}
{
"code": "rateLimitExceeded",
"message": "Rate limit exceeded. Retry after the period indicated in the response headers."
}
{
"code": "internalError",
"message": "An unexpected error occurred. Please try again later."
}