The Controls API provides access to manage and retrieve control information within a Hyperproof organization. This API allows you to list, create, update, and manage controls and any linked proof, ensuring compliance and oversight of organizational processes.
Controls API (1.0.0)
Request
GET /
Fetches a collection of controls based on specified query parameters. Use this endpoint to retrieve controls with optional filters for permissions, scopes, teams, or status.
Use the GET / controls endpoint with the expandscopes=true query parameter. This addition pulls in extra information about scoped controls, such as:
- Controls with a
parentControlIdvalue, showing the original parent control they stem from. - The linked
scopeIdandscopeNamefor each scoped control.
GET https://api.hyperproof.app/v1/controls?expandscopes=true- Mock serverhttps://developer.hyperproof.app/_mock/hyperproof-api/controls/controls.openapi
- Hyperproof UShttps://api.hyperproof.app/v1/controls
- Hyperproof Govhttps://api.hyperproofgov.app/v1/controls
- Hyperproof EUhttps://api.hyperproof.eu/v1/controls
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X GET \
'https://developer.hyperproof.app/_mock/hyperproof-api/controls/controls.openapi/?canLink=string&expandScopes=string&expandTeams=string&status=string' \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>'Success.
The unique identifier for the organization
The human readable unique identifier for the control within the organization
The name of the control
Name of the scope associated with the control populated if the 'controlType' is 'scopeAssignment'
The description of the control
The freshness policy of an object. Set to 'manual' with a 'freshAsOfDate' value otherwise 'freshness' will be set to 'unknown'.
The freshness status of an object. Cannot be set if 'freshnessPolicy' is 'none' and 'freshAsOfDate' is null.
The date when freshness was last marked 'fresh'
The note populated when the control was marked fresh
Implementation status
Testing status
Design deficiency: The control, as designed, is inadequate to meet its intended objective. Operation deficiency: The control’s design is sound, but it is not being executed or followed as intended in practice.
Determines whether this control can be automated and its current status
Whether the health status is available and its current status
The unique identifier of the user who created the control
The date the control was created (ISO-8601 format)
The unique identifier of the user who last updated the control
The date the control was updated (ISO-8601 format)
This field is deprecated and will be removed in a future version. Use scopeName instead
[ { "id": "d88d505d-5199-11ee-a644-522476618ae8", "orgId": "ce83e3cd-5199-11ee-a644-522476618ae8", "controlType": "scopeAssignment", "controlIdentifier": "SOC2-P4.1.1_Legal", "name": "Include in the privacy notice the use of collected personal information", "scopeName": "Legal", "description": "The privacy notice identifies the use of collected personal information.", "notes": "", "domainId": "d7cf0a26-5199-11ee-a644-522476618ae8", "domainName": "Privacy", "freshnessPolicy": "manual", "freshForDuration": "PT720H", "freshness": "fresh", "freshAsOfDate": "2025-01-12T18:26:10.00.5365Z", "freshAsOfNote": "Initial freshness set", "implementation": "inProgress", "testingStatus": "effective", "testingDeficiency": [], "computeTestingStatus": false, "automation": "partial", "health": "notAvailable", "overrideHealth": false, "owner": { … }, "customFields": [ … ], "status": "active", "createdBy": "82d7c228-8bcd-11e9-a94b-ab3de8494987", "createdOn": "2023-09-12T18:26:10.0053650+00:00", "updatedBy": "82d7c228-8bcd-11e9-a94b-ab3de8494987", "updatedOn": "2023-09-12T18:26:10.0053650+00:00", "permissions": [] } ]
Request
POST /
Adds a new control to the organization with specified attributes, such as identifier, name, description, and owner.
If you’re creating a control from scratch, you can assign a scope right away with the POST /controls endpoint. Just use the desired scopeId in the request payload alongside other control details.
Note: This action creates a NEW control that can be used as a parent. Child controls are not created using the API.
Currently, the creation of scoped child controls on existing controls is not supported.
POST https://api.hyperproof.app/v1/controls
Content-Type: application/json
{
"name": "New Control Name",
"scopeId": "desiredScopeId",
...other control properties...
}
Unique identifier for the control within the organization
Name of the control
Description of the control
Implementation status
The unique identifier of the user who owns the control
- Mock serverhttps://developer.hyperproof.app/_mock/hyperproof-api/controls/controls.openapi
- Hyperproof UShttps://api.hyperproof.app/v1/controls
- Hyperproof Govhttps://api.hyperproofgov.app/v1/controls
- Hyperproof EUhttps://api.hyperproof.eu/v1/controls
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
https://developer.hyperproof.app/_mock/hyperproof-api/controls/controls.openapi/ \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Content-Type: application/json' \
-d '{
"controlIdentifier": "SOC2-P4.1.1",
"name": "Include in the privacy notice the use of collected personal information",
"description": "The privacy notice identifies the use of collected personal information.",
"domainName": "Privacy",
"implementation": "inProgress",
"owner": "82d7c228-8bcd-11e9-a94b-ab3de8494987"
}'Success.
The unique identifier for the organization
The human readable unique identifier for the control within the organization
The name of the control
Name of the scope associated with the control populated if the 'controlType' is 'scopeAssignment'
The description of the control
The freshness policy of an object. Set to 'manual' with a 'freshAsOfDate' value otherwise 'freshness' will be set to 'unknown'.
The freshness status of an object. Cannot be set if 'freshnessPolicy' is 'none' and 'freshAsOfDate' is null.
The date when freshness was last marked 'fresh'
The note populated when the control was marked fresh
Implementation status
Testing status
Design deficiency: The control, as designed, is inadequate to meet its intended objective. Operation deficiency: The control’s design is sound, but it is not being executed or followed as intended in practice.
Determines whether this control can be automated and its current status
Whether the health status is available and its current status
The unique identifier of the user who created the control
The date the control was created (ISO-8601 format)
The unique identifier of the user who last updated the control
The date the control was updated (ISO-8601 format)
{ "id": "d88d505d-5199-11ee-a644-522476618ae8", "orgId": "ce83e3cd-5199-11ee-a644-522476618ae8", "controlType": "scopeAssignment", "controlIdentifier": "SOC2-P4.1.1_Legal", "name": "Include in the privacy notice the use of collected personal information", "createdOn": "2023-09-12T18:26:10.0053650+00:00", "updatedBy": "82d7c228-8bcd-11e9-a94b-ab3de8494987", "updatedOn": "2023-09-12T18:26:10.0053650+00:00", "permissions": [] }
- Mock serverhttps://developer.hyperproof.app/_mock/hyperproof-api/controls/controls.openapi/{controlId}/proof
- Hyperproof UShttps://api.hyperproof.app/v1/controls/{controlId}/proof
- Hyperproof Govhttps://api.hyperproofgov.app/v1/controls/{controlId}/proof
- Hyperproof EUhttps://api.hyperproof.eu/v1/controls/{controlId}/proof
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X POST \
'https://developer.hyperproof.app/_mock/hyperproof-api/controls/controls.openapi/{controlId}/proof' \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Content-Type: multipart/form-data'Success.
Unique identifier of the user who owns the proof item
The date the proof was uploaded (ISO-8601 format)
Status of the proof item
Unique identifier of the user who created the proof item
The date the proof was created (ISO-8601 format)
Unique identifier of the user who last updated the proof item
{ "id": "4eb909de-51af-11ee-a644-522476618ae8", "orgId": "ce83e3cd-5199-11ee-a644-522476618ae8", "filename": "example.txt", "contentType": "text/plain", "fileExtension": "txt", "size": 627, "version": 0, "source": "localComputer", "ownedBy": "82d7c228-8bcd-11e9-a94b-ab3de8494987", "uploadedOn": "2023-09-12T20:59:47.6943530+00:00", "isPrivate": false, "status": "active", "createdBy": "82d7c228-8bcd-11e9-a94b-ab3de8494987", "updatedBy": "82d7c228-8bcd-11e9-a94b-ab3de8494987", "createdOn": "2023-09-12T20:59:47.6943530+00:00", "updatedOn": "2023-09-12T20:59:47.6943530+00:00" }
- Mock serverhttps://developer.hyperproof.app/_mock/hyperproof-api/controls/controls.openapi/filter
- Hyperproof UShttps://api.hyperproof.app/v1/controls/filter
- Hyperproof Govhttps://api.hyperproofgov.app/v1/controls/filter
- Hyperproof EUhttps://api.hyperproof.eu/v1/controls/filter
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X PUT \
https://developer.hyperproof.app/_mock/hyperproof-api/controls/controls.openapi/filter \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Content-Type: application/json' \
-d '{
"controlIds": [
"23b806db-bad2-4f7a-b8d1-ac1177909992",
"23b402db-bad2-4f7a-b8d1-ac1177909992"
]
}'Success.
The unique identifier for the organization
The human readable unique identifier for the control within the organization
The name of the control
Name of the scope associated with the control populated if the 'controlType' is 'scopeAssignment'
The description of the control
The freshness policy of an object. Set to 'manual' with a 'freshAsOfDate' value otherwise 'freshness' will be set to 'unknown'.
The freshness status of an object. Cannot be set if 'freshnessPolicy' is 'none' and 'freshAsOfDate' is null.
The date when freshness was last marked 'fresh'
The note populated when the control was marked fresh
Implementation status
Testing status
Design deficiency: The control, as designed, is inadequate to meet its intended objective. Operation deficiency: The control’s design is sound, but it is not being executed or followed as intended in practice.
Determines whether this control can be automated and its current status
Whether the health status is available and its current status
The unique identifier of the user who created the control
The date the control was created (ISO-8601 format)
The unique identifier of the user who last updated the control
The date the control was updated (ISO-8601 format)
This field is deprecated and will be removed in a future version. Use scopeName instead
[ { "id": "d88d505d-5199-11ee-a644-522476618ae8", "orgId": "ce83e3cd-5199-11ee-a644-522476618ae8", "controlType": "scopeAssignment", "controlIdentifier": "SOC2-P4.1.1_Legal", "name": "Include in the privacy notice the use of collected personal information", "scopeName": "Legal", "description": "The privacy notice identifies the use of collected personal information.", "notes": "", "domainId": "d7cf0a26-5199-11ee-a644-522476618ae8", "domainName": "Privacy", "freshnessPolicy": "manual", "freshForDuration": "PT720H", "freshness": "fresh", "freshAsOfDate": "2025-01-12T18:26:10.00.5365Z", "freshAsOfNote": "Initial freshness set", "implementation": "inProgress", "testingStatus": "effective", "testingDeficiency": [], "computeTestingStatus": false, "automation": "partial", "health": "notAvailable", "overrideHealth": false, "owner": { … }, "customFields": [ … ], "status": "active", "createdBy": "82d7c228-8bcd-11e9-a94b-ab3de8494987", "createdOn": "2023-09-12T18:26:10.0053650+00:00", "updatedBy": "82d7c228-8bcd-11e9-a94b-ab3de8494987", "updatedOn": "2023-09-12T18:26:10.0053650+00:00", "permissions": [] } ]
- Mock serverhttps://developer.hyperproof.app/_mock/hyperproof-api/controls/controls.openapi/summaries
- Hyperproof UShttps://api.hyperproof.app/v1/controls/summaries
- Hyperproof Govhttps://api.hyperproofgov.app/v1/controls/summaries
- Hyperproof EUhttps://api.hyperproof.eu/v1/controls/summaries
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X GET \
'https://developer.hyperproof.app/_mock/hyperproof-api/controls/controls.openapi/summaries?canLink=string&status=string' \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>'[ { "id": "09bb0a00-519a-11ee-a644-522476618ae8", "controlIdentifier": "SOC2-CC9.2.4", "name": "Establish roles and responsibilities to oversee implementation of information security policies, incident response", "createdOn": "2023-09-08T18:26:10.0053650+00:00", "updatedOn": "2023-09-08T18:26:10.0053650+00:00" }, { "id": "d88d505d-5199-11ee-a644-522476618ae8", "controlIdentifier": "SOC2-P4.1.1", "name": "Include in the privacy notice the use of collected personal information", "createdOn": "2023-09-12T18:26:10.0053650+00:00", "updatedOn": "2023-09-12T18:26:10.0053650+00:00" } ]
Request
GET /{controlId}
Fetches detailed information about a specific control using its unique ID.
Use the GET /controls endpoint with the expandscopes=true query parameter. This addition pulls in extra information about scoped controls, such as:
- Controls with a
parentControlIdvalue, showing the original parent control they stem from. - The linked
scopeIdandscopeNamefor each scoped control.
GET https://api.hyperproof.app/v1/controls/{controlId}?expandscopes=true- Mock serverhttps://developer.hyperproof.app/_mock/hyperproof-api/controls/controls.openapi/{controlId}
- Hyperproof UShttps://api.hyperproof.app/v1/controls/{controlId}
- Hyperproof Govhttps://api.hyperproofgov.app/v1/controls/{controlId}
- Hyperproof EUhttps://api.hyperproof.eu/v1/controls/{controlId}
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X GET \
'https://developer.hyperproof.app/_mock/hyperproof-api/controls/controls.openapi/{controlId}' \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>'Success.
The unique identifier for the organization
The human readable unique identifier for the control within the organization
The name of the control
Name of the scope associated with the control populated if the 'controlType' is 'scopeAssignment'
The description of the control
The freshness policy of an object. Set to 'manual' with a 'freshAsOfDate' value otherwise 'freshness' will be set to 'unknown'.
The freshness status of an object. Cannot be set if 'freshnessPolicy' is 'none' and 'freshAsOfDate' is null.
The date when freshness was last marked 'fresh'
The note populated when the control was marked fresh
Implementation status
Testing status
Design deficiency: The control, as designed, is inadequate to meet its intended objective. Operation deficiency: The control’s design is sound, but it is not being executed or followed as intended in practice.
Determines whether this control can be automated and its current status
Whether the health status is available and its current status
The unique identifier of the user who created the control
The date the control was created (ISO-8601 format)
The unique identifier of the user who last updated the control
The date the control was updated (ISO-8601 format)
{ "id": "d88d505d-5199-11ee-a644-522476618ae8", "orgId": "ce83e3cd-5199-11ee-a644-522476618ae8", "controlType": "scopeAssignment", "controlIdentifier": "SOC2-P4.1.1_Legal", "name": "Include in the privacy notice the use of collected personal information", "scopeName": "Legal", "description": "The privacy notice identifies the use of collected personal information.", "notes": "", "domainId": "d7cf0a26-5199-11ee-a644-522476618ae8", "domainName": "Privacy", "freshnessPolicy": "manual", "freshForDuration": "PT720H", "freshness": "fresh", "freshAsOfDate": "2025-01-12T18:26:10.00.5365Z", "freshAsOfNote": "Initial freshness set", "implementation": "inProgress" }
Request
PATCH /{controlId}
Modifies an existing control’s attributes, such as name, description, or owner.
You can do a PATCH request to https://api.hyperproof.app/v1/controls/{controlId}. Just include the scopeId you want to assign in the request body. This links the control to the specified scope.
- You must know the
scopeIdbeforehand. There’s no API endpoint to list all availablescopeIds, so you can get thescopeIdby running aGET /controls?expandscopes=truecall as mentioned earlier. - Double-check that the
scopeIdis valid for your Hyperproof setup before sending the request.
PATCH https://api.hyperproof.app/v1/controls/{controlId}
Content-Type: application/json
{
"scopeId": "desiredScopeId"
}Name of the control
Description of the control
The freshness policy of an object. Set to 'manual' with a 'freshAsOfDate' value otherwise 'freshness' will be set to 'unknown'.
Sets the duration after which the control becomes stale. Supply as a string in standard ISO-8601 duration format ex: P1Y3M2D or PT720H
The freshness status of an object. Cannot be set if 'freshnessPolicy' is 'none' and 'freshAsOfDate' is null.
The date when freshness was last marked 'fresh'
The note to populate when the control is marked 'fresh'
Implementation status
Testing status
The unique identifier of the user who owns the control
The unique identifier of the group assigned to the control. If set, clearGroupId must not be set.
- Mock serverhttps://developer.hyperproof.app/_mock/hyperproof-api/controls/controls.openapi/{controlId}
- Hyperproof UShttps://api.hyperproof.app/v1/controls/{controlId}
- Hyperproof Govhttps://api.hyperproofgov.app/v1/controls/{controlId}
- Hyperproof EUhttps://api.hyperproof.eu/v1/controls/{controlId}
- curl
- JavaScript
- Node.js
- Python
- Java
- C#
- PHP
- Go
- Ruby
- R
- Payload
curl -i -X PATCH \
'https://developer.hyperproof.app/_mock/hyperproof-api/controls/controls.openapi/{controlId}' \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Content-Type: application/json' \
-d '{
"name": "Include in the privacy notice the use of collected personal information",
"description": "The privacy notice identifies the use of collected personal information.",
"notes": "Meet quarterly to review",
"freshnessPolicy": "manual",
"freshForDuration": "PT720H",
"freshness": "fresh",
"freshAsOfDate": "2025-01-12T18:26:10.00.5365Z",
"freshAsOfNote": "Updating expired control freshness",
"implementation": "inProgress",
"testingStatus": "effective",
"owner": "82d7c228-8bcd-11e9-a94b-ab3de8494987",
"customFields": [
{
"fieldId": "ceb912ab-519b-11ee-a644-522476618ae8",
"textValue": "Antonio Moreno"
}
]
}'Success.
The unique identifier for the organization
The human readable unique identifier for the control within the organization
The name of the control
Name of the scope associated with the control populated if the 'controlType' is 'scopeAssignment'
The description of the control
The freshness policy of an object. Set to 'manual' with a 'freshAsOfDate' value otherwise 'freshness' will be set to 'unknown'.
The freshness status of an object. Cannot be set if 'freshnessPolicy' is 'none' and 'freshAsOfDate' is null.
The date when freshness was last marked 'fresh'
The note populated when the control was marked fresh
Implementation status
Testing status
Design deficiency: The control, as designed, is inadequate to meet its intended objective. Operation deficiency: The control’s design is sound, but it is not being executed or followed as intended in practice.
Determines whether this control can be automated and its current status
Whether the health status is available and its current status
The unique identifier of the user who created the control
The date the control was created (ISO-8601 format)
The unique identifier of the user who last updated the control
The date the control was updated (ISO-8601 format)
{ "id": "d88d505d-5199-11ee-a644-522476618ae8", "orgId": "ce83e3cd-5199-11ee-a644-522476618ae8", "controlType": "scopeAssignment", "controlIdentifier": "SOC2-P4.1.1_Legal", "name": "Include in the privacy notice the use of collected personal information", "scopeName": "Legal", "description": "The privacy notice identifies the use of collected personal information.", "notes": "", "domainId": "d7cf0a26-5199-11ee-a644-522476618ae8", "domainName": "Privacy", "freshnessPolicy": "manual", "freshForDuration": "PT720H", "freshness": "fresh", "freshAsOfDate": "2025-01-12T18:26:10.00.5365Z", "freshAsOfNote": "Initial freshness set", "implementation": "inProgress", "testingStatus": "effective", "testingDeficiency": [], "computeTestingStatus": false, "automation": "partial", "health": "notAvailable", "overrideHealth": false, "owner": { "id": "d2363cab-5199-11ee-a644-522476618ae8", "type": "activeUser", "userId": "82d7c228-8bcd-11e9-a94b-ab3de8494987", "email": "jane.doe@example.com", "givenName": "Jane", "surname": "Doe", "language": "en", "locale": "US", "timeZone": "America/Los_Angeles", "status": "active" }, "customFields": [ { … } ], "status": "active", "createdBy": "82d7c228-8bcd-11e9-a94b-ab3de8494987", "createdOn": "2023-09-12T18:26:10.0053650+00:00", "updatedBy": "82d7c228-8bcd-11e9-a94b-ab3de8494987", "updatedOn": "2023-09-12T18:26:10.0053650+00:00", "permissions": [] }