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 field <op> value. Comparison operators are eq, in, and contains, composed with the logical connectives and, or, and not (negation is expressed as not (field eq value) — there is no ne). The set of filterable fields and supported operators varies per resource. Example: significance eq 'key'.

$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

eq, in, ne

activeIssueCount

eq, gt, lt

activeTestingSignal

eq, ne

automatedManual

eq, ne

controlId

eq, contains, ne

controlType

eq, in

definitionId

eq, contains

description

eq, contains, ne

frequency

eq, ne

id

eq, in

locations

eq, ne

locations.id

eq, in

mitigatedRisks

eq, ne

mitigatedRisks.id

eq, in

name

eq, contains, ne

overriddenFields

eq, in

owner.id

eq, in

preventiveDetective

eq, ne

process.id

eq, in

process.name

eq

programs

eq, ne

programs.id

eq, in

projectId

eq, in

significance

eq, ne

subProcess

eq, ne

subProcess.id

eq, in

subProcess.name

eq

systems

eq, ne

systems.id

eq, in

Sorting Options#

Name

Orders Supported

automatedManual

asc, desc

controlId

asc, desc

description

asc, desc

frequency

asc, desc

name

asc, desc

preventiveDetective

asc, desc

process.name

asc, desc

significance

asc, desc

subProcess.name

asc, desc

updatedAt

asc, desc

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."
}