Organization security, access control, and administration: the security overview, audit events and alerts, data-subject-access requests, consent and privacy controls, role-based access control (roles, permissions, policies, departments, and groups), alert rules, and the project-management surface (specs, tasks, categories, and phases).
GET /v1/alert-rules
List alert rules for the authenticated user's organization
Returns all alert rules associated with the authenticated user's active organization. Standard bearer-token authentication.
Auth Session JWT (Bearer)
Responses
| Status | Description |
200 | Array of alert rule records. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
POST /v1/alert-rules
Create an alert rule
Creates a new alert rule in the authenticated user's active organization. Standard bearer-token authentication.
Auth Session JWT (Bearer)
Request Body
| Field | Type | Required | Description |
name | string | yes | Human-readable rule name (trimmed). |
event_type | string | no | |
trigger_type | string | no | |
description | string | no | |
condition | string | no | |
conditions | object | no | Structured condition (bounded JSON, max 64 KB). |
channels | array of object | no | |
Responses
| Status | Description |
201 | Created alert rule. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
201 response body: data fields
| Field | Type | Description |
id | string<uuid> | |
name | string | |
event_type | string | |
trigger_type | string | |
description | string | |
condition | string | |
conditions | object | |
channels | array of object | |
created_at | string<date-time> | |
PUT /v1/alert-rules/{alertRuleId}
Update an alert rule (not yet implemented)
This endpoint is not yet implemented and always returns `501 NOT_IMPLEMENTED`.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
alertRuleId | path | string<uuid> | yes | Alert rule identifier (UUID). |
Request Body
JSON object.
Responses
| Status | Description |
501 | `NOT_IMPLEMENTED`: update is not yet available. |
DELETE /v1/alert-rules/{alertRuleId}
Delete an alert rule (not yet implemented)
This endpoint is not yet implemented and always returns `501 NOT_IMPLEMENTED`.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
alertRuleId | path | string<uuid> | yes | Alert rule identifier (UUID). |
Responses
| Status | Description |
501 | `NOT_IMPLEMENTED`: delete is not yet available. |
POST /v1/mcp
MCP JSON-RPC 2.0 dispatch
Single endpoint that handles all MCP (Model Context Protocol) JSON-RPC 2.0 method calls. Every request body must be a valid JSON-RPC 2.0 object. Supported methods: `initialize`, `tools/list` (with optional `params.full=true`), `tools/call`, `resources/list`, `resources/read`, `ping`. Always returns HTTP `200` for well-formed JSON-RPC requests (including JSON-RPC-level errors per JSON-RPC 2.0 spec). Returns HTTP `401` for missing/invalid API keys, `429` for rate limit exceeded (fail-closed, returns 503 if the rate-limiter service itself is unavailable). OAuth-issued API keys with explicit scopes are supported; direct-mint (legacy) keys without explicit scopes receive a deprecation header in the response.
API key format: `bb_live_<8-char-prefix>_<32-or-64-char-secret>` (hex or base64url).
Auth API key (Bearer bb_live_…)
Request Body
| Field | Type | Required | Description |
jsonrpc | string (enum) 2.0 | yes | |
id | any | no | Request ID (string, integer, or null). Omit for notifications. |
method | string (enum) initializetools/listtools/callresources/listresources/readping | yes | MCP method name. |
params | object | no | Method-specific parameters. |
Responses
| Status | Description |
200 | JSON-RPC 2.0 response (includes both successful results and JSON-RPC-level errors per the JSON-RPC 2.0 specification). |
401 | `AUTH_REQUIRED`: API key header is missing. Or `INVALID_API_KEY`: the key does not exist, is revoked, or has an invalid format. |
429 | `RATE_LIMIT_EXCEEDED`: per-key rate limit reached. |
503 | `SERVICE_UNAVAILABLE`: rate-limiter service is unavailable (fail-closed per security policy). |
GET /v1/projects/{projectId}/categories
List task/spec categories for a project
Returns the list of category definitions for a project. Requires `project.view` permission.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
projectId | path | string<uuid> | yes | Project identifier (UUIDv7). |
Responses
| Status | Description |
200 | Category list. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
POST /v1/projects/{projectId}/categories
Create a category for a project
Creates a new category. Requires `project.update` permission.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
projectId | path | string<uuid> | yes | Project identifier (UUIDv7). |
Request Body
| Field | Type | Required | Description |
name | string | yes | |
description | string | no | |
parent_id | string<uuid> | no | |
Responses
| Status | Description |
201 | Created category. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
201 response body: data fields
| Field | Type | Description |
category_id | string<uuid> | |
name | string | |
color | string | |
GET /v1/projects/{projectId}/phases
List project phases
Returns the ordered list of phase definitions for a project. Requires `project.view` permission.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
projectId | path | string<uuid> | yes | Project identifier (UUIDv7). |
Responses
| Status | Description |
200 | Phase list. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
POST /v1/projects/{projectId}/phases
Create a phase for a project
Creates a new phase definition. Requires `project.update` permission.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
projectId | path | string<uuid> | yes | Project identifier (UUIDv7). |
Request Body
| Field | Type | Required | Description |
name | string | yes | |
description | string | no | |
sort_order | integer | no | |
Responses
| Status | Description |
201 | Created phase. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
201 response body: data fields
| Field | Type | Description |
phase_id | string<uuid> | |
name | string | |
sort_order | integer | |
GET /v1/projects/{projectId}/specs
List specs for a project
Returns all specification documents for the given project. Requires `project.view` permission on the project.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
projectId | path | string<uuid> | yes | Project identifier (UUIDv7). |
Responses
| Status | Description |
200 | Array of spec records. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
POST /v1/projects/{projectId}/specs
Create a spec in a project
Creates a new specification document within a project. Requires `project.update` permission.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
projectId | path | string<uuid> | yes | Project identifier (UUIDv7). |
Request Body
| Field | Type | Required | Description |
title | string | yes | |
content | string | no | |
Responses
| Status | Description |
201 | Created spec record. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
201 response body: data fields
| Field | Type | Description |
spec_id | string<uuid> | |
project_id | string<uuid> | |
title | string | |
content | string | |
created_at | string<date-time> | |
updated_at | string<date-time> | |
GET /v1/projects/{projectId}/task-statuses
List task statuses for a project
Returns the ordered list of task status definitions for a project. Requires `project.view` permission.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
projectId | path | string<uuid> | yes | Project identifier (UUIDv7). |
Responses
| Status | Description |
200 | Task status list. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
POST /v1/projects/{projectId}/task-statuses
Create a task status for a project
Creates a new task status definition. Requires `project.update` permission.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
projectId | path | string<uuid> | yes | Project identifier (UUIDv7). |
Request Body
| Field | Type | Required | Description |
name | string | yes | |
key | string | yes | Unique status key. Must start with a lowercase letter and contain only lowercase letters, digits, and underscores. |
color | string | no | |
sort_order | integer | no | |
Responses
| Status | Description |
201 | Created task status. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
201 response body: data fields
| Field | Type | Description |
status_id | string<uuid> | |
name | string | |
color | string | |
sort_order | integer | |
GET /v1/projects/{projectId}/tasks
List tasks for a project
Returns tasks for the given project, with optional filters. Requires `project.view` permission.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
projectId | path | string<uuid> | yes | Project identifier (UUIDv7). |
spec_id | query | string<uuid> | no | |
status | query | string | no | |
assignee_id | query | string<uuid> | no | |
limit | query | integer | no | |
offset | query | integer | no | |
Responses
| Status | Description |
200 | Array of task records. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
POST /v1/projects/{projectId}/tasks
Create a task in a project
Creates a new task in the project. Requires `project.update` permission.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
projectId | path | string<uuid> | yes | Project identifier (UUIDv7). |
Request Body
| Field | Type | Required | Description |
title | string | yes | |
description | string | no | |
spec_id | string<uuid> | no | |
assignee_id | string<uuid> | no | |
priority | string (enum) lowmediumhighcritical | no | |
depends_on | array of string | no | |
Responses
| Status | Description |
201 | Created task. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
201 response body: data fields
| Field | Type | Description |
task_id | string<uuid> | |
spec_id | string<uuid> | |
project_id | string<uuid> | |
title | string | |
status | string | |
phase | string | |
category | string | |
created_at | string<date-time> | |
updated_at | string<date-time> | |
GET /v1/rbac/departments
List departments
Lists departments in the organization. Departments are logical groupings of members and projects for RBAC/policy assignment.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
search | query | string | no | Filter by department name substring. |
limit | query | integer | no | Maximum departments to return (1 to 100, default 100). |
offset | query | integer | no | Offset for pagination (default 0). |
Responses
| Status | Description |
200 | Department list. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
departments | array of object | |
total_count | integer | |
POST /v1/rbac/departments
Create a department
Creates a new department in the organization. The body uses `.strict()` validation.
Auth Session JWT (Bearer)
Request Body
| Field | Type | Required | Description |
name | string | yes | |
description | string | no | |
Responses
| Status | Description |
201 | Department created. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
409 | 409 Conflict: the request conflicts with an existing resource or current state (unique constraint, optimistic-lock, duplicate). |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
201 response body: data fields
| Field | Type | Description |
id | string<uuid> | |
name | string | |
description | string | null | |
created_at | string<date-time> | |
updated_at | string | null | |
PUT /v1/rbac/departments/{departmentId}
Update a department
Updates an existing department's name or description. The body uses `.strict()` validation.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
departmentId | path | string<uuid> | yes | Department UUID. |
Request Body
| Field | Type | Required | Description |
name | string | no | |
description | string | null | no | |
Responses
| Status | Description |
200 | Updated department. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
id | string<uuid> | |
name | string | |
description | string | null | |
created_at | string<date-time> | |
updated_at | string | null | |
DELETE /v1/rbac/departments/{departmentId}
Delete a department
Permanently deletes a department by UUID. Members and projects are unlinked from the department.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
departmentId | path | string<uuid> | yes | Department UUID. |
Responses
| Status | Description |
200 | Department deleted. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
deleted | boolean (enum) true | |
GET /v1/rbac/effective-permissions
Get effective permissions
Returns the resolved permission set for the target user in the caller's organization, optionally scoped to a specific project. By default queries the authenticated caller's own permissions. Only organization owners, admins, and super-admins may query another user's permissions (returns `403 FORBIDDEN` otherwise).
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
user_id | query | string<uuid> | no | Target user UUID. Omit to query the caller's own permissions. |
project_id | query | string<uuid> | no | Project UUID. When supplied, permissions are further scoped to the given project. |
Responses
| Status | Description |
200 | Resolved effective permissions for the target user. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | `FORBIDDEN`: caller is not an owner/admin/super-admin and is querying another user's permissions. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
GET /v1/rbac/groups
List groups
Lists groups in the organization. Groups are sets of members for policy assignment.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
search | query | string | no | Filter by group name substring. |
limit | query | integer | no | Maximum groups to return (1 to 100, default 100). |
offset | query | integer | no | Offset for pagination (default 0). |
Responses
| Status | Description |
200 | Group list. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
groups | array of object | |
total_count | integer | |
POST /v1/rbac/groups
Create a group
Creates a new group in the organization. The body uses `.strict()` validation.
Auth Session JWT (Bearer)
Request Body
| Field | Type | Required | Description |
name | string | yes | |
description | string | no | |
Responses
| Status | Description |
201 | Group created. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
409 | 409 Conflict: the request conflicts with an existing resource or current state (unique constraint, optimistic-lock, duplicate). |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
201 response body: data fields
| Field | Type | Description |
id | string<uuid> | |
name | string | |
description | string | null | |
created_at | string<date-time> | |
updated_at | string | null | |
PUT /v1/rbac/groups/{groupId}
Update a group
Updates an existing group's name or description. The body uses `.strict()` validation.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
groupId | path | string<uuid> | yes | Group UUID. |
Request Body
| Field | Type | Required | Description |
name | string | no | |
description | string | null | no | |
Responses
| Status | Description |
200 | Updated group. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
id | string<uuid> | |
name | string | |
description | string | null | |
created_at | string<date-time> | |
updated_at | string | null | |
DELETE /v1/rbac/groups/{groupId}
Delete a group
Permanently deletes a group by UUID.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
groupId | path | string<uuid> | yes | Group UUID. |
Responses
| Status | Description |
200 | Group deleted. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
deleted | boolean (enum) true | |
GET /v1/rbac/permissions
List permissions
Returns the permission catalog for the organization. Permissions are referenced by dot-notation slug (e.g. `project.view`, `org.manage_roles`). The response payload is `{ permissions: [...], total_count: N }`.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
search | query | string | no | Filter by name substring. |
limit | query | integer | no | Maximum permissions to return (1 to 100, default 100). |
offset | query | integer | no | Offset for pagination (default 0). |
Responses
| Status | Description |
200 | Permission list. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
permissions | array of object | |
total_count | integer | |
POST /v1/rbac/permissions
Create a permission
Creates a custom permission in the organization's permission catalog. `resource` and `action` define the access dimension. The body is strict (`.strict()`): any unknown field returns `400 VALIDATION_ERROR`.
Auth Session JWT (Bearer)
Request Body
| Field | Type | Required | Description |
name | string | yes | Dot-notation permission slug. Must be unique. |
description | string | no | Optional description. |
resource | string | yes | |
action | string | yes | |
Responses
| Status | Description |
201 | Permission created. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
409 | `CONFLICT`: a permission with the same name or resource/action combination already exists. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
201 response body: data fields
| Field | Type | Description |
id | string<uuid> | |
name | string | Dot-notation permission slug. |
description | string | null | |
resource | string | Resource dimension (e.g. `project`, `org`). |
action | string | Action dimension (e.g. `view`, `manage_roles`). |
is_system | boolean | |
created_at | string<date-time> | |
DELETE /v1/rbac/permissions/{permissionId}
Delete a permission
Deletes a permission from the organization's permission catalog by UUID. Roles that reference this permission will have it removed.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
permissionId | path | string<uuid> | yes | Permission UUID. |
Responses
| Status | Description |
200 | Permission deleted. |
400 | `INVALID_ID_FORMAT`: permissionId is not a valid UUID. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
deleted | boolean (enum) true | |
GET /v1/rbac/policies
List RBAC policies
Returns RBAC access policies for the organization with limit/offset pagination. Supports filtering by resource type, search string, and active/inactive status.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
search | query | string | no | Filter by policy name substring. |
resource_type | query | string | no | Filter by resource type. |
status | query | string (enum) | no | Filter by active/inactive status. Omit for all. |
limit | query | integer | no | Maximum policies to return (1 to 100, default 100). |
offset | query | integer | no | Offset for pagination (default 0). |
Responses
| Status | Description |
200 | Paginated policy list. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
policies | array of object | |
total_count | integer | |
POST /v1/rbac/policies
Create an RBAC policy
Records a new RBAC policy for the organization. Policies are recorded and audited; policy enforcement is a per-organization setting, so a policy takes effect only for organizations that have it enabled. Either `policy_name` or `name` must be supplied. Either `resource_type` or `resource_pattern` must be supplied. Either `operation` or `action_pattern` must be supplied. The body is strict (`additionalProperties: false`).
Auth Session JWT (Bearer)
Request Body
| Field | Type | Required | Description |
policy_name | string | no | |
name | string | no | Alias for `policy_name`. |
description | string | no | |
effect | string (enum) allowdeny | no | |
resource_type | string | no | |
resource_pattern | string | no | |
operation | string | no | |
action_pattern | string | no | |
conditions | object | no | |
is_active | boolean | no | |
Responses
| Status | Description |
201 | Policy created. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
409 | 409 Conflict: the request conflicts with an existing resource or current state (unique constraint, optimistic-lock, duplicate). |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
201 response body: data fields
| Field | Type | Description |
id | string<uuid> | |
name | string | Policy display name. |
description | string | null | |
effect | string (enum) allowdeny | Policy effect. |
resource_type | string | null | |
resource_pattern | string | null | |
operation | string | null | |
action_pattern | string | null | |
conditions | object | null | |
is_active | boolean | |
created_at | string<date-time> | |
updated_at | string | null | |
GET /v1/rbac/policies/{policyId}
Get a policy
Returns a single RBAC policy by UUID.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
policyId | path | string<uuid> | yes | Policy UUID. |
Responses
| Status | Description |
200 | Policy record. |
400 | `INVALID_ID_FORMAT`: policyId is not a valid UUID. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
id | string<uuid> | |
name | string | Policy display name. |
description | string | null | |
effect | string (enum) allowdeny | Policy effect. |
resource_type | string | null | |
resource_pattern | string | null | |
operation | string | null | |
action_pattern | string | null | |
conditions | object | null | |
is_active | boolean | |
created_at | string<date-time> | |
updated_at | string | null | |
PUT /v1/rbac/policies/{policyId}
Update a policy
Updates fields on an existing RBAC policy. Policies are recorded and audited; policy enforcement is a per-organization setting, so a policy takes effect only for organizations that have it enabled. All fields are optional; the body is strict (`additionalProperties: false`).
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
policyId | path | string<uuid> | yes | Policy UUID. |
Request Body
| Field | Type | Required | Description |
name | string | no | |
description | string | null | no | |
effect | string (enum) allowdeny | no | |
resource_type | string | null | no | |
resource_pattern | string | null | no | |
operation | string | null | no | |
action_pattern | string | null | no | |
conditions | object | null | no | |
is_active | boolean | no | |
Responses
| Status | Description |
200 | Updated policy record. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
id | string<uuid> | |
name | string | Policy display name. |
description | string | null | |
effect | string (enum) allowdeny | Policy effect. |
resource_type | string | null | |
resource_pattern | string | null | |
operation | string | null | |
action_pattern | string | null | |
conditions | object | null | |
is_active | boolean | |
created_at | string<date-time> | |
updated_at | string | null | |
DELETE /v1/rbac/policies/{policyId}
Delete a policy
Permanently deletes an RBAC policy.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
policyId | path | string<uuid> | yes | Policy UUID. |
Responses
| Status | Description |
200 | Policy deleted. |
400 | `INVALID_ID_FORMAT`: policyId is not a valid UUID. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
deleted | boolean (enum) true | |
GET /v1/rbac/roles
List RBAC roles
Returns the system and custom roles available within the caller's organization, suitable for display in the IAM Roles UI. System catalog roles (`is_system=true`) are platform-defined and read-only. Custom roles are org-specific. The response payload is `{ roles: [...], total_count: N }`.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
search | query | string | no | Case-insensitive substring filter on role name. |
limit | query | integer | no | Maximum roles to return (1 to 100, default 25). |
offset | query | integer | no | Offset for pagination (default 0). |
Responses
| Status | Description |
200 | List of roles. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
roles | array of object | |
total_count | integer | Total matching roles (for pagination). |
POST /v1/rbac/roles
Create a custom role
Creates a new custom role in the caller's organization with an optional set of permission slugs. The role's `is_system` flag is always `false`; clients cannot create system roles. Permission slugs are validated against the platform's system-permission catalog: unknown slugs are rejected. The body uses `.strict()` validation: any unrecognized field (e.g. `is_super_admin`) returns `400 VALIDATION_ERROR`.
Auth Session JWT (Bearer)
Request Body
| Field | Type | Required | Description |
name | string | yes | Role display name. Must be unique within the organization. |
description | string | no | Optional description. |
permissions | array of string | no | Optional initial set of permission slugs. Unknown slugs are rejected. |
metadata | object | no | Arbitrary metadata. |
Responses
| Status | Description |
201 | Role created. |
400 | `VALIDATION_ERROR`: body failed validation or a permission slug was unrecognized. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | `FORBIDDEN`: caller lacks the `org.manage_roles` permission, or attempted to write to the system catalog (only the root org may do so). |
409 | `CONFLICT`: a role with that name already exists in the organization. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
201 response body: data fields
| Field | Type | Description |
id | string | Role slug key. |
name | string | Display name. |
description | string | null | Optional description. |
is_system | boolean | True for platform-defined catalog roles. System roles cannot be modified by clients. |
permissions | array of string | Permission slugs assigned to this role. |
metadata | object | null | Arbitrary metadata. |
created_at | string<date-time> | |
updated_at | string | null | |
GET /v1/rbac/roles/{roleId}
Get a role
Returns a single role by its slug key. Both system roles (e.g. `owner`, `admin`) and custom roles (lowercase slug) are addressed by their text slug, not a UUID.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
roleId | path | string | yes | Role slug key (lowercase alphanumeric with dots, underscores, and hyphens; 1 to 150 chars). |
Responses
| Status | Description |
200 | Role record. |
400 | `INVALID_ID_FORMAT`: the roleId path param is not a valid role slug. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
id | string | Role slug key. |
name | string | Display name. |
description | string | null | Optional description. |
is_system | boolean | True for platform-defined catalog roles. System roles cannot be modified by clients. |
permissions | array of string | Permission slugs assigned to this role. |
metadata | object | null | Arbitrary metadata. |
created_at | string<date-time> | |
updated_at | string | null | |
PUT /v1/rbac/roles/{roleId}
Update a custom role
Updates a custom role's name, description, permission set, or metadata. System roles (`is_system=true`) cannot be updated via this endpoint. The body uses `.strict()` validation: unknown fields including `is_super_admin` and `is_system` return `400 VALIDATION_ERROR`.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
roleId | path | string | yes | Role slug key (1 to 150 chars, lowercase dot-notation slug). |
Request Body
| Field | Type | Required | Description |
name | string | no | |
description | string | null | no | |
permissions | array of string | no | Full replacement permission slug set. |
metadata | object | null | no | |
Responses
| Status | Description |
200 | Updated role record. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | `FORBIDDEN`: caller lacks `org.manage_roles`, the target is a system role, or a role-hierarchy gate was violated. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
id | string | Role slug key. |
name | string | Display name. |
description | string | null | Optional description. |
is_system | boolean | True for platform-defined catalog roles. System roles cannot be modified by clients. |
permissions | array of string | Permission slugs assigned to this role. |
metadata | object | null | Arbitrary metadata. |
created_at | string<date-time> | |
updated_at | string | null | |
DELETE /v1/rbac/roles/{roleId}
Delete a custom role
Deletes a custom role by slug. System roles cannot be deleted. Any members currently assigned only this role will lose that assignment.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
roleId | path | string | yes | Role slug key. |
Responses
| Status | Description |
200 | Role deleted. |
400 | `INVALID_ID_FORMAT`: the roleId path param is not a valid role slug. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
deleted | boolean (enum) true | |
POST /v1/rbac/sync
Sync RBAC state
Triggers a server-side reconciliation of the organization's RBAC state against the platform's system role-and-permission catalog. Requires organization admin privileges. Use this when role/permission drift is detected.
Auth Session JWT (Bearer)
Request Body
JSON object.
Responses
| Status | Description |
200 | Sync completed. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | `FORBIDDEN`: caller is not an organization admin. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
GET /v1/security
Security overview dashboard
Returns the security posture dashboard for the caller's organization including alert counts, authentication metrics, violation stats, and an overall health score. Optionally includes platform-generated recommendations when `include_recommendations=true`.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
from_date | query | string<date-time> | no | ISO 8601 datetime. Start of the reporting window. |
to_date | query | string<date-time> | no | ISO 8601 datetime. End of the reporting window. |
include_recommendations | query | string (enum) | no | When `true`, the response includes up to 10 platform-generated remediation recommendations. |
Responses
| Status | Description |
200 | Security overview payload. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
GET /v1/security/alerts
List security alerts
Returns security alerts for the organization. Supports filtering by alert type, severity, status, and time range. Limit is 1 to 100 (default 25).
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
alert_type | query | string | no | Filter by alert type string. |
severity | query | string (enum) | no | Filter by severity. |
status | query | string (enum) | no | Filter by status. |
from_date | query | string<date-time> | no | ISO 8601 datetime lower bound. |
to_date | query | string<date-time> | no | ISO 8601 datetime upper bound. |
limit | query | integer | no | Maximum alerts to return (1 to 100, default 25). |
offset | query | integer | no | Offset for pagination (default 0). |
Responses
| Status | Description |
200 | Alert list. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
alerts | array of object | |
total_count | integer | |
POST /v1/security/alerts
Create a security alert
Creates a new security alert for the organization. Alerts can reference threat indicators, affected resources, and recommended response actions. Requires the Create Security Alert permission (`security_alert.create`), held by organization owners and administrators and assignable to a custom role.
Auth Session JWT (Bearer)
Request Body
| Field | Type | Required | Description |
alert_type | string | yes | |
severity | string (enum) lowmediumhighcritical | yes | |
status | string (enum) activeacknowledgedresolvedfalse_positive | no | |
title | string | yes | |
description | string | no | |
pattern_id | string | no | |
risk_score | number | no | |
indicators | array of object | no | |
affected_resources | array of object | no | |
response_actions | array of object | no | |
recommendations | array of object | no | |
metadata | object | no | |
expires_at | string<date-time> | no | |
Responses
| Status | Description |
201 | Alert created. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
201 response body: data fields
| Field | Type | Description |
id | string<uuid> | |
org_id | string<uuid> | |
alert_type | string | |
severity | string (enum) lowmediumhighcritical | |
status | string (enum) activeacknowledgedresolvedfalse_positive | |
title | string | |
description | string | null | |
pattern_id | string | null | |
risk_score | number | null | |
indicators | array | null | |
affected_resources | array | null | |
response_actions | array | null | |
recommendations | array | null | |
resolution_notes | string | null | |
metadata | object | null | |
expires_at | string | null | |
created_at | string<date-time> | |
updated_at | string | null | |
PUT /v1/security/alerts/{alertId}
Update a security alert
Updates a security alert's status, resolution notes, or metadata. Status transitions: `active → acknowledged → resolved` (or `→ false_positive`). Returns `404` if not found.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
alertId | path | string<uuid> | yes | Alert UUID. |
Request Body
| Field | Type | Required | Description |
status | string (enum) activeacknowledgedresolvedfalse_positive | no | |
resolution_notes | string | no | |
metadata | object | no | |
Responses
| Status | Description |
200 | Updated alert. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
id | string<uuid> | |
org_id | string<uuid> | |
alert_type | string | |
severity | string (enum) lowmediumhighcritical | |
status | string (enum) activeacknowledgedresolvedfalse_positive | |
title | string | |
description | string | null | |
pattern_id | string | null | |
risk_score | number | null | |
indicators | array | null | |
affected_resources | array | null | |
response_actions | array | null | |
recommendations | array | null | |
resolution_notes | string | null | |
metadata | object | null | |
expires_at | string | null | |
created_at | string<date-time> | |
updated_at | string | null | |
GET /v1/security/audit/events
List audit events
Returns the organization's audit events, newest first, with limit/offset pagination; `total_count` counts every matching event. Filters combine: event type, user, session, severity and time range (both bounds inclusive). Limit is 1 to 1000 (default 50).
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
event_type | query | string | no | Only events of exactly this event type. |
user_id | query | string<uuid> | no | Only events performed by this user. |
session_id | query | string<uuid> | no | Only events recorded by a request of this session. |
severity | query | string (enum) | no | Only events of this severity. For an event your application reported, the severity you sent. |
from_date | query | string<date-time> | no | Only events recorded at or after this time (ISO 8601). |
to_date | query | string<date-time> | no | Only events recorded at or before this time (ISO 8601). |
limit | query | integer | no | Maximum events to return (1 to 1000, default 50). |
offset | query | integer | no | Events to skip, newest first (default 0). |
Responses
| Status | Description |
200 | Paginated audit event list. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
events | array of object | |
total_count | integer | |
POST /v1/security/audit/events
Record an application-reported audit event
Records an event reported by one of your own applications in the organization's audit trail, so actions that happen outside Backbuild sit beside the ones Backbuild records. Requires the Write Audit Events permission (`audit.write`), held by organization owners and administrators and assignable to a custom role. Reported events are always labelled as reported: `event_type` and `resource_type` use the `custom.` namespace, which Backbuild's own events never use; `details.origin` is `caller_reported`; your classification and payload are stored under `details.reported`; the address, user agent and session you send are stored under `details.claimed`. The event's own `ip_address`, `user_agent` and `session_id` are those Backbuild observed for the request that reported it, and the acting user and organization come from the session. Sign-in events (`login`, `logout`) are recorded by Backbuild only and cannot be reported.
Auth Session JWT (Bearer)
Request Body
| Field | Type | Required | Description |
event_type | string | yes | Your event's type, in the `custom.` namespace: `custom.` followed by one or more dot-separated names of a-z, 0-9 and _ (for example `custom.crm.record_exported`). |
action | string (enum) createupdatedeletestate_changeaccessimportexport | yes | What was done. `login` and `logout` are recorded by Backbuild only. |
outcome | string | yes | The result, for example `success` or `failure`. |
severity | string (enum) lowmediumhighcritical | yes | |
risk_score | number | no | |
target_user_id | string<uuid> | no | The user the event concerns, if any. |
resource_type | string | no | The type of the resource affected, in the `custom.` namespace. |
resource_id | string<uuid> | no | |
details | object | no | Event-specific data (at most 64 KB as JSON). Stored under `details.reported.details`. |
metadata | object | no | Additional data (at most 64 KB as JSON). Stored under `details.reported.metadata`. |
expires_at | string<date-time> | no | |
ip_address | any | no | The address the event concerns, for example your end user's (a single address, no prefix length). Stored as claimed under `details.claimed`; the event's own `ip_address` is the one Backbuild observed. |
user_agent | string | no | The user agent the event concerns. No control or invisible formatting characters. Stored as claimed under `details.claimed`. |
session_id | string | no | The session the event concerns, in your application's own terms. Stored as claimed under `details.claimed`. |
Responses
| Status | Description |
201 | Audit event recorded; the stored record is returned. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
201 response body: data fields
| Field | Type | Description |
id | string<uuid> | |
org_id | string<uuid> | |
event_type | string | Event type. Events reported by your applications use the `custom.` namespace; Backbuild's own events never do. |
action | string | What was done: create, update, delete, state_change, login, logout, access, import or export. |
actor_id | string | null | The user who performed the action (for a reported event, the user whose session reported it). |
actor_type | string | The kind of actor, for example `user`. |
resource_type | string | null | |
resource_id | string | null | |
details | object | Event details. For an event your application reported: `origin` is `caller_reported`, `reporter.credential` is `session` or `api_key`, `reported` holds the outcome, severity, risk_score, target_user_id, expires_at, details and metadata you sent, and `claimed` holds the ip_address, user_agent and session_id you sent. |
ip_address | string | null | The client address Backbuild observed for the request that recorded the event. |
user_agent | string | null | The User-Agent of the request that recorded the event. |
session_id | string | null | The session of the request that recorded the event. |
request_id | string | null | |
created_at | string<date-time> | |
POST /v1/security/consent/cookie
Record cookie consent decision
Records the authenticated user's cookie consent decision (GDPR Art. 6-7, ePrivacy Directive). Accepted categories: `necessary`, `analytics`, `marketing`, `preferences`. Body is strict.
Auth Session JWT (Bearer)
Request Body
| Field | Type | Required | Description |
consent_categories | array of enum necessaryanalyticsmarketingpreferences | yes | Cookie categories included in this consent decision. |
consent_given | boolean | yes | Whether consent was given (`true`) or withdrawn (`false`). |
consent_method | string (enum) bannersettingsapi | no | How the consent was collected. |
Responses
| Status | Description |
201 | Cookie consent recorded. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
POST /v1/security/consent/marketing
Record marketing tracking consent
Records whether the user consents to having conversion data shared with external ad platforms (Meta, Google, Reddit, Bing). For EEA/UK/CH users this consent is required before any PII transfer to US-based platforms occurs (GDPR Art. 49).
Auth Session JWT (Bearer)
Request Body
| Field | Type | Required | Description |
consent_given | boolean | yes | |
consent_method | string (enum) bannersettingsapi | no | |
Responses
| Status | Description |
201 | Marketing consent recorded. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
GET /v1/security/consent/status
Get current consent status
Returns the most recent consent records for the authenticated user by consent type.
Auth Session JWT (Bearer)
Responses
| Status | Description |
200 | Consent records list. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
POST /v1/security/csp-report
Receive a Content Security Policy report
Receives browser-generated CSP violation reports. Unauthenticated endpoint. Rate-limited to 100 requests per minute per IP address. Request body is capped at 16 KB (returns `413 PAYLOAD_TOO_LARGE` on oversize). Accepts `application/csp-report`, `application/reports+json`, and `application/json` content types. Returns `204 No Content` on success.
Public Public: no authentication
Request Body
JSON object.
Responses
| Status | Description |
204 | Report received (no content returned). |
413 | `PAYLOAD_TOO_LARGE`: request body exceeds the 16 KB limit. |
415 | Unsupported content type. Only `application/csp-report`, `application/reports+json`, and `application/json` are accepted. |
429 | 429 Too Many Requests: a rate limit or usage quota was exceeded. Retry after the indicated window. |
GET /v1/security/dsar
List DSAR requests
Returns DSAR requests for the organization. Requires a **fresh MFA step-up**. Supports filtering by status and limit/offset pagination (limit 1 to 1000, default 50).
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
status | query | string | no | Filter by request status. |
limit | query | integer | no | Maximum records to return (1 to 1000, default 50). |
offset | query | integer | no | Offset for pagination (default 0). |
Responses
| Status | Description |
200 | DSAR request list. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | `MFA_STEPUP_REQUIRED`: fresh MFA step-up is required. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
requests | array of object | |
total_count | integer | |
POST /v1/security/dsar
Create a Data Subject Access Request
Opens a Data Subject Access Request (DSAR) for an identified data subject. Covers all GDPR Art. 15-20 right types. Requires a **fresh MFA step-up** (within the last 5 minutes) via `requireMfaStepUp()`. API-key sessions cannot call this endpoint. The body is strict: any unrecognized field returns `400`.
Auth Session JWT (Bearer)
Request Body
| Field | Type | Required | Description |
request_type | string (enum) accessrectificationerasureportabilityrestrictionobjection | yes | GDPR Art. 15-20 request type. |
subject_email | string<email> | yes | Email address of the data subject. |
subject_name | string | no | Full name of the data subject. |
description | string | no | |
data_categories | array of string | no | Specific data categories in scope. |
urgency | string (enum) normalurgent | no | |
Responses
| Status | Description |
201 | DSAR request created. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | `MFA_STEPUP_REQUIRED`: the session does not have a fresh MFA step-up (within the last 5 minutes), or is an API-key session. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
201 response body: data fields
| Field | Type | Description |
id | string<uuid> | |
org_id | string<uuid> | |
request_type | string (enum) accessrectificationerasureportabilityrestrictionobjection | |
subject_email | string<email> | |
subject_name | string | null | |
description | string | null | |
data_categories | array | null | |
urgency | string (enum) normalurgent | |
status | string | Current status of the DSAR (e.g. `pending`, `in_progress`, `completed`, `rejected`). |
created_at | string<date-time> | |
updated_at | string | null | |
GET /v1/security/dsar/{dsarId}
Get a DSAR request
Returns a specific DSAR request by UUID. Requires a fresh MFA step-up.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
dsarId | path | string<uuid> | yes | DSAR request UUID. |
Responses
| Status | Description |
200 | DSAR request record. |
400 | `VALIDATION_ERROR`: dsarId is not a valid UUID. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | `MFA_STEPUP_REQUIRED`: fresh MFA step-up required. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
id | string<uuid> | |
org_id | string<uuid> | |
request_type | string (enum) accessrectificationerasureportabilityrestrictionobjection | |
subject_email | string<email> | |
subject_name | string | null | |
description | string | null | |
data_categories | array | null | |
urgency | string (enum) normalurgent | |
status | string | Current status of the DSAR (e.g. `pending`, `in_progress`, `completed`, `rejected`). |
created_at | string<date-time> | |
updated_at | string | null | |
GET /v1/security/dsar/{dsarId}/export
Export data for a DSAR request
Exports all personal data associated with the DSAR request in machine-readable format (GDPR Art. 20: right to data portability). Requires a fresh MFA step-up.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
dsarId | path | string<uuid> | yes | DSAR request UUID. |
Responses
| Status | Description |
200 | Exported personal data payload. |
400 | `VALIDATION_ERROR`: dsarId is not a valid UUID. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | `MFA_STEPUP_REQUIRED`: fresh MFA step-up required. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
POST /v1/security/dsar/object
Register a GDPR Art. 21 processing objection
Records the authenticated data subject's objection to processing under a specific scope (or all scopes). Per-scope flags are stored on the user account; downstream handlers consult them and skip the processing. Requires a fresh MFA step-up. Compliance admins acting on behalf of third-party subjects must use the standard `POST /v1/security/dsar` workflow with `request_type='objection'`. Body is strict.
Auth Session JWT (Bearer)
Request Body
| Field | Type | Required | Description |
scope | string (enum) marketinganalyticsprofilingall | yes | Processing scope to object to. Use `all` to object to all scopes. |
reason | string | no | |
Responses
| Status | Description |
200 | Objection recorded. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | `MFA_STEPUP_REQUIRED`: fresh MFA step-up required. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
POST /v1/security/dsar/restrict
Activate GDPR Art. 18 processing restriction
Pauses mutation of the authenticated caller's personal data (GDPR Art. 18: right to restriction of processing). Storage and Art. 15 read access remain permitted. Downstream write stored procedures will reject with `PROCESSING_RESTRICTED` until the flag is lifted. Requires a fresh MFA step-up. The body is strict: unknown fields return `400`.
Auth Session JWT (Bearer)
Request Body
| Field | Type | Required | Description |
reason | string | no | Optional reason for activating the processing restriction. |
Responses
| Status | Description |
201 | Processing restriction activated. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | `MFA_STEPUP_REQUIRED` (fresh MFA step-up required, or `FORBIDDEN`) caller lacks the required permission. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
POST /v1/security/dsar/unrestrict
Lift GDPR Art. 18 processing restriction
Lifts the processing restriction for the caller themselves (self-path, omit `user_id`) or for another user (admin-path, supply `user_id` with `compliance.manage` permission). Per GDPR Art. 18(3), the data subject must be notified before lifting: this obligation is operational; the audit trail records `lifted_by_self`/`lifted_by_admin` for verification. Requires a fresh MFA step-up. Body is strict.
Auth Session JWT (Bearer)
Request Body
| Field | Type | Required | Description |
user_id | string<uuid> | no | Target subject UUID. Omit to lift the restriction for the authenticated caller. Supply with `compliance.manage` to lift for another user. |
reason | string | no | |
Responses
| Status | Description |
200 | Processing restriction lifted. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | `MFA_STEPUP_REQUIRED` or `FORBIDDEN`: caller lacks `compliance.manage` when targeting another user. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
POST /v1/security/emergency-access
Invoke break-glass emergency access
Grants time-limited emergency access to a specific resource (HIPAA 164.312(a)(2)(ii); SOC 2 CC6.1). A mandatory reason of at least 10 characters must be supplied. Creates an immutable critical-severity audit event. The grant is automatically revoked after `duration_minutes` (default 60, max 480). The body is strict: unknown fields are rejected.
Auth Session JWT (Bearer)
Request Body
| Field | Type | Required | Description |
reason | string | yes | Mandatory justification for the break-glass access (minimum 10 characters). |
target_resource_type | string | yes | Resource type being accessed under emergency. |
target_resource_id | string<uuid> | yes | UUID of the resource being accessed. |
duration_minutes | integer | no | Grant duration in minutes (default 60, max 480). |
Responses
| Status | Description |
201 | Emergency access granted. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
GET /v1/security/metrics
Get security metrics summary
Returns aggregated security metrics (authentication success/failure rates, anomaly counts, policy violation counts) for the organization within the specified time window.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
from_date | query | string<date-time> | no | ISO 8601 datetime lower bound. |
to_date | query | string<date-time> | no | ISO 8601 datetime upper bound. |
Responses
| Status | Description |
200 | Security metrics payload. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
POST /v1/security/parental-consent
Record parental consent (COPPA)
Records parental consent for a child user account (COPPA 16 CFR Part 312). Accepted verification methods: `email_verification`, `credit_card`, `phone_call`, `video_conference`, `government_id`.
Auth Session JWT (Bearer)
Request Body
| Field | Type | Required | Description |
child_user_id | string<uuid> | yes | UUID of the child user account requiring parental consent. |
parent_email | string<email> | yes | Email address of the consenting parent/guardian. |
consent_method | string (enum) email_verificationcredit_cardphone_callvideo_conferencegovernment_id | yes | COPPA-approved verification method used to obtain consent. |
consent_given | boolean | yes | |
Responses
| Status | Description |
201 | Parental consent recorded. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
GET /v1/security/sbom.json
Get Software Bill of Materials
In production, returns a `302 Found` redirect to the canonical SBOM hosted at `trust.backbuild.ai`. In non-production environments, returns `202 Accepted` with a `Retry-After: 86400` header and `x-placeholder: true` indicating the artifact is not yet available.
Public Public: no authentication
Responses
| Status | Description |
202 | SBOM not yet available (non-production). Retry after `Retry-After` seconds. |
302 | Redirect to the canonical SBOM (production only). |
202 response body: data fields
| Field | Type | Description |
available | boolean (enum) false | |
GET /v1/security/security.txt
RFC 9116 security.txt
Returns the `security.txt` file as per RFC 9116. Response content type is `text/plain; charset=utf-8`. Cached with `Cache-Control: public, max-age=3600`.
Public Public: no authentication
Responses
| Status | Description |
200 | Security contact disclosure file. |
GET /v1/specs/{specId}
Get a spec
Returns a single specification document. Requires `project.view` permission on the parent project.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
specId | path | string<uuid> | yes | Specification identifier (UUID). |
Responses
| Status | Description |
200 | Spec record. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
spec_id | string<uuid> | |
project_id | string<uuid> | |
title | string | |
content | string | |
created_at | string<date-time> | |
updated_at | string<date-time> | |
PUT /v1/specs/{specId}
Update a spec
Updates a specification document. Requires `project.update` permission.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
specId | path | string<uuid> | yes | |
Request Body
| Field | Type | Required | Description |
title | string | no | |
content | string | no | |
Responses
| Status | Description |
200 | Updated spec record. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
spec_id | string<uuid> | |
project_id | string<uuid> | |
title | string | |
content | string | |
created_at | string<date-time> | |
updated_at | string<date-time> | |
DELETE /v1/specs/{specId}
Delete a spec
Permanently deletes a specification document and all its tasks. Requires `project.delete` permission.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
specId | path | string<uuid> | yes | |
Responses
| Status | Description |
200 | Spec deleted. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
deleted | boolean (enum) true | |
GET /v1/specs/{specId}/tasks
List tasks in a spec
Returns all tasks belonging to a specification. Requires `project.view` permission on the parent project.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
specId | path | string<uuid> | yes | |
Responses
| Status | Description |
200 | Array of task records. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
GET /v1/tasks/{taskId}
Get a task
Returns a single task record. Requires `project.view` permission on the parent project.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
taskId | path | string<uuid> | yes | |
Responses
| Status | Description |
200 | Task record. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
task_id | string<uuid> | |
spec_id | string<uuid> | |
project_id | string<uuid> | |
title | string | |
status | string | |
phase | string | |
category | string | |
created_at | string<date-time> | |
updated_at | string<date-time> | |
PUT /v1/tasks/{taskId}
Update a task
Updates a task's fields. Requires `project.update` permission.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
taskId | path | string<uuid> | yes | |
Request Body
| Field | Type | Required | Description |
title | string | no | |
status | string | no | |
phase | string | no | |
category | string | no | |
Responses
| Status | Description |
200 | Updated task record. |
400 | 400 Bad Request: a request parameter, body field, or the JSON body itself failed validation. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
task_id | string<uuid> | |
spec_id | string<uuid> | |
project_id | string<uuid> | |
title | string | |
status | string | |
phase | string | |
category | string | |
created_at | string<date-time> | |
updated_at | string<date-time> | |
DELETE /v1/tasks/{taskId}
Delete a task
Permanently deletes a task and its activity log. Requires `project.delete` permission.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
taskId | path | string<uuid> | yes | |
Responses
| Status | Description |
200 | Task deleted. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |
200 response body: data fields
| Field | Type | Description |
deleted | boolean (enum) true | |
GET /v1/tasks/{taskId}/activity
List task activity log
Returns the ordered activity log for a task (status changes, assignments, comments). Requires `project.view` permission.
Auth Session JWT (Bearer)
Parameters
| Name | In | Type | Required | Description |
taskId | path | string<uuid> | yes | |
Responses
| Status | Description |
200 | Activity log entries. |
401 | 401 Unauthorized: missing, expired, malformed, or revoked credentials. |
403 | 403 Forbidden: authenticated but lacking the required membership, role, permission, MFA step-up, or feature entitlement. |
404 | 404 Not Found: the requested resource does not exist or is not visible to the caller. |
500 | 500 Internal Server Error: an unexpected server-side error. The message is sanitized; the correlation id is logged server-side. |