API documentation
Tenant API v1 for systems that read your organisation's registers and send evidence. This page is generated from the OpenAPI 3.1 specification.
API version: 1.0.0
Download the OpenAPI specification (YAML)
The specification and a guide with examples are also available in the product under Settings > API.
Authentication and abilities
- Base address: https://<your-domain>/api/v1
- Send the token as Authorization: Bearer <token>. The token is shown once, when it is created.
- A token belongs to a service account, a non-personal user that can never sign in. It is created by a super admin under Settings > API.
- Each token has abilities, an expiry date (at most 12 months ahead; a token without an expiry is refused) and can be limited to IP addresses or CIDR ranges.
- Every request, including refused ones, is logged in the audit log (method, path without query string, status and address).
Abilities
read:risks, read:assets, read:controls, read:vendors, read:audit, read:kri, read:evidence, write:evidence
Rate limits and pagination
- Hourly limit per token, 600 requests by default. When it is used up the API answers 429 with a Retry-After header.
- Lists use cursor pagination ordered by updated_at, then id. Use per_page (1 to 200, default 50) and follow links.next, or pass meta.next_cursor as cursor, until it is null.
- filter[updated_after] returns rows updated at or after that time, for incremental sync.
Error format
Errors always have this form:
{ "success": false, "error": { "code": "validation_failed", "message": "...", "details": { "field": ["..."] } } } 401Missing, unknown or expired token.403Missing ability, not a service account's token, or address not allowed.422Validation failed. error.details maps fields to messages.429The hourly limit is used up.
Endpoints
| Method | Path | Ability | |
|---|---|---|---|
| GET | /api/v1/risks | read:risks | List risks |
| GET | /api/v1/assets | read:assets | List information assets |
| GET | /api/v1/controls | read:controls | List controls of the current statements of applicability with effectiveness |
| GET | /api/v1/vendors | read:vendors | List suppliers |
| GET | /api/v1/findings | read:audit | List audit findings |
| GET | /api/v1/kri | read:kri | List indicators (KRI, KCI, KPI) |
| GET | /api/v1/evidence | read:evidence | List evidence items |
| POST | /api/v1/evidence | write:evidence | Submit evidence for a control |
GET /api/v1/risks
List risks
Ability: read:risks · Response codes: 200, 401, 403, 422, 429
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| per_page | query | integer | |
| cursor | query | string | The meta.next_cursor of the previous page. |
| filter[updated_after] | query | string (date-time) | Only rows updated at or after this time (inclusive, so the newest updated_at you hold can be passed back; deduplicate on id). |
Response fields (data) (20)
| Field | Type | Description |
|---|---|---|
| id | integer | |
| title | string | |
| description | string | |
| category | string | null | |
| risk_type | string | null | |
| status | string | |
| likelihood_inherent | integer | |
| impact_inherent | integer | |
| score_inherent | integer | |
| risk_level | string | |
| likelihood_residual | integer | null | |
| impact_residual | integer | null | |
| score_residual | integer | null | |
| residual_risk_level | string | null | |
| appetite_status | string | null | |
| is_emerging | boolean | |
| owner | object | null | |
| owner_confirmed_at | string | null (date-time) | |
| created_at | string (date-time) | |
| updated_at | string (date-time) |
GET /api/v1/assets
List information assets
Ability: read:assets · Response codes: 200, 401, 403, 422, 429
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| per_page | query | integer | |
| cursor | query | string | The meta.next_cursor of the previous page. |
| filter[updated_after] | query | string (date-time) | Only rows updated at or after this time (inclusive, so the newest updated_at you hold can be passed back; deduplicate on id). |
Response fields (data) (19)
| Field | Type | Description |
|---|---|---|
| id | integer | |
| uuid | string | |
| asset_identifier | string | null | |
| name | string | |
| description | string | null | |
| category | string | null | |
| status | string | |
| confidentiality_level | integer | null | |
| integrity_level | integer | null | |
| availability_level | integer | null | |
| overall_classification | integer | null | |
| business_criticality | string | null | |
| is_essential_service | boolean | |
| is_important_service | boolean | |
| owner | object | null | |
| classification_date | string | null (date) | |
| next_review_date | string | null (date) | |
| created_at | string (date-time) | |
| updated_at | string (date-time) |
GET /api/v1/controls
List controls of the current statements of applicability with effectiveness
Ability: read:controls · Response codes: 200, 401, 403, 422, 429
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| per_page | query | integer | |
| cursor | query | string | The meta.next_cursor of the previous page. |
| filter[updated_after] | query | string (date-time) | Only rows updated at or after this time (inclusive, so the newest updated_at you hold can be passed back; deduplicate on id). |
Response fields (data) (18)
| Field | Type | Description |
|---|---|---|
| id | integer | |
| soa_document_id | integer | |
| framework | string | null | |
| control_code | string | null | |
| title | string | null | |
| is_applicable | boolean | |
| implementation_status | string | null | |
| is_key_control | boolean | |
| frequency | string | null | |
| design_effectiveness | string | |
| design_assessed_at | string | null (date-time) | |
| operating_effectiveness | string | |
| operating_tested_at | string | null (date-time) | |
| operating_test_period_start | string | null (date) | |
| operating_test_period_end | string | null (date) | |
| verified | boolean | Effective operation counts only with valid evidence and no active exception. |
| excepted | boolean | |
| updated_at | string (date-time) |
GET /api/v1/vendors
List suppliers
Ability: read:vendors · Response codes: 200, 401, 403, 422, 429
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| per_page | query | integer | |
| cursor | query | string | The meta.next_cursor of the previous page. |
| filter[updated_after] | query | string (date-time) | Only rows updated at or after this time (inclusive, so the newest updated_at you hold can be passed back; deduplicate on id). |
Response fields (data) (20)
| Field | Type | Description |
|---|---|---|
| id | integer | |
| name | string | |
| organization_number | string | null | |
| vendor_type | string | null | |
| criticality | string | null | |
| status | string | null | |
| country | string | null | |
| inherent_risk_score | number | null | |
| residual_risk_score | number | null | |
| last_assessed_at | string | null (date-time) | |
| next_assessment_due | string | null (date-time) | |
| contract_start_date | string | null (date) | |
| contract_end_date | string | null (date) | |
| processes_personal_data | boolean | |
| is_ict_provider | boolean | |
| supports_critical_function | boolean | |
| certifications | array | null | |
| owner | object | null | |
| created_at | string (date-time) | |
| updated_at | string (date-time) |
GET /api/v1/findings
List audit findings
Ability: read:audit · Response codes: 200, 401, 403, 422, 429
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| per_page | query | integer | |
| cursor | query | string | The meta.next_cursor of the previous page. |
| filter[updated_after] | query | string (date-time) | Only rows updated at or after this time (inclusive, so the newest updated_at you hold can be passed back; deduplicate on id). |
Response fields (data) (18)
| Field | Type | Description |
|---|---|---|
| id | integer | |
| uuid | string | |
| audit_id | integer | |
| finding_type | string | |
| severity | string | |
| status | string | |
| control_id | string | null | |
| title | string | |
| description | string | null | |
| audit_criteria_reference | string | null | |
| corrective_action_required | boolean | |
| due_date | string | null (date) | |
| resolved_at | string | null (date-time) | |
| verified_at | string | null (date-time) | |
| withdrawn_at | string | null (date-time) | |
| assigned_to | object | null | |
| created_at | string (date-time) | |
| updated_at | string (date-time) |
GET /api/v1/kri
List indicators (KRI, KCI, KPI)
Ability: read:kri · Response codes: 200, 401, 403, 422, 429
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| per_page | query | integer | |
| cursor | query | string | The meta.next_cursor of the previous page. |
| filter[updated_after] | query | string (date-time) | Only rows updated at or after this time (inclusive, so the newest updated_at you hold can be passed back; deduplicate on id). |
Response fields (data) (19)
| Field | Type | Description |
|---|---|---|
| id | integer | |
| uuid | string | |
| name | string | |
| indicator_type | string | |
| unit | string | null | |
| status | string | |
| measurement_frequency | string | null | |
| threshold_direction | string | null | |
| threshold_green | number | null | |
| threshold_yellow | number | null | |
| threshold_red | number | null | |
| current_value | number | null | |
| current_zone | string | |
| zone_since | string | null (date-time) | |
| days_in_current_zone | integer | null | |
| last_measurement_at | string | null (date-time) | |
| owner | object | null | |
| created_at | string (date-time) | |
| updated_at | string (date-time) |
GET /api/v1/evidence
List evidence items
Ability: read:evidence · Response codes: 200, 401, 403, 422, 429
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| per_page | query | integer | |
| cursor | query | string | The meta.next_cursor of the previous page. |
| filter[updated_after] | query | string (date-time) | Only rows updated at or after this time (inclusive, so the newest updated_at you hold can be passed back; deduplicate on id). |
Response fields (data) (18)
| Field | Type | Description |
|---|---|---|
| id | string | |
| control_id | string | null | |
| framework | string | null | |
| title | string | |
| description | string | null | |
| category | string | null | |
| source_type | string | |
| source_system | string | null | |
| external_reference | string | null | |
| sha256 | string | null | |
| status | string | |
| result | string | null | Verdict of an automatic check. The collected data is never returned. |
| has_file | boolean | |
| collected_at | string (date-time) | |
| expires_at | string | null (date-time) | |
| is_expired | boolean | |
| created_at | string (date-time) | |
| updated_at | string (date-time) |
POST /api/v1/evidence
Submit evidence for a control
Ability: write:evidence · Response codes: 200, 201, 401, 403, 422, 429
Request (fields) (JSON or multipart/form-data)
| Field | Type | Required | Description |
|---|---|---|---|
| control_id | string | yes | Catalog code of the control. |
| framework | string | yes | Framework label or slug, for example iso27001. |
| source_system | string | yes | |
| collected_at | string (date-time) | yes | Not more than five minutes in the future. |
| title | string | yes | |
| description | string | ||
| category | string | ||
| expires_at | string (date-time) | After collected_at. | |
| external_reference | string | The sending system's own reference; makes retries safe. | |
| data | object | yes | Structured content (at most 1 MiB). Send this or a file. |
Evidence is provenance, never a declared status: a request cannot change the implementation or effectiveness status of a control.
Response fields (data) (18)
| Field | Type | Description |
|---|---|---|
| id | string | |
| control_id | string | null | |
| framework | string | null | |
| title | string | |
| description | string | null | |
| category | string | null | |
| source_type | string | |
| source_system | string | null | |
| external_reference | string | null | |
| sha256 | string | null | |
| status | string | |
| result | string | null | Verdict of an automatic check. The collected data is never returned. |
| has_file | boolean | |
| collected_at | string (date-time) | |
| expires_at | string | null (date-time) | |
| is_expired | boolean | |
| created_at | string (date-time) | |
| updated_at | string (date-time) |
Questions about the API: info@securapilot.com