Control Collections
Build reusable bundles of controls from any supported framework. A collection is
private to its creator by default; setting visibility to SHARED exposes it to
every member of the creator's organization. All endpoints require a SAMS token.
List control collections
GET /api/v1/control-collections
Returns the caller's own collections plus any SHARED collections in their
organization. Soft-deleted collections are excluded.
Response
{
"total": 3,
"collections": [
{
"id": "col-uuid",
"name": "FedRAMP Moderate baseline",
"description": "Core security controls for FedRAMP Moderate",
"tags": ["fedramp", "moderate"],
"color": "#FF5733",
"visibility": "SHARED",
"controlCount": 325,
"createdById": "user-uuid",
"createdAt": "2026-05-15T10:30:00Z",
"updatedAt": "2026-05-20T14:22:00Z"
}
]
}
Create a control collection
POST /api/v1/control-collections
- Name
name- Type
- string
- Description
Collection name.
- Name
description- Type
- string
- Description
Free-form description.
- Name
tags- Type
- array
- Description
Array of string tags.
- Name
color- Type
- string
- Description
Hex color (e.g.
#FF5733).
- Name
visibility- Type
- string
- Description
PRIVATE(default) orSHARED.
Returns 201 with the new collection record. 400 if name is missing.
Get a control collection
GET /api/v1/control-collections/{id}
Returns the collection plus every control in it.
Response
{
"id": "col-uuid",
"name": "FedRAMP Moderate baseline",
"visibility": "shared",
"createdById": "user-uuid",
"createdAt": "2026-05-15T10:30:00Z",
"updatedAt": "2026-05-20T14:22:00Z",
"controls": [
{
"controlId": "AC-2",
"framework": "nist-800-53",
"notes": "Critical control",
"position": 1,
"addedAt": "2026-05-16T08:15:00Z"
}
]
}
Returns 404 if the collection does not exist or the caller has no access.
Update a control collection
PATCH /api/v1/control-collections/{id}
Body accepts any subset of name, description, tags, color, visibility.
Only the creator can update.
Returns 200 with { success: true, id, name }. 403 if the caller is not the
creator, 404 if not found.
Delete a control collection
DELETE /api/v1/control-collections/{id}
Soft-deletes the collection (the row is kept with a deletedAt timestamp). Only
the creator can delete.
Returns 200 with { success: true }. 403 if not creator, 404 if not found.
List controls in a collection
GET /api/v1/control-collections/{id}/controls
- Name
id- Type
- string
- Description
Collection ID.
- Name
framework- Type
- string
- Description
Filter to a single framework.
Each control is returned with its membership metadata (notes, position,
addedAt) joined to the framework record (identifier, title, family,
statement).
Response
{
"collection": { "id": "col-uuid", "name": "FedRAMP Moderate baseline" },
"total": 325,
"controls": [
{
"controlId": "AC-2",
"framework": "nist-800-53",
"notes": "Critical control",
"position": 1,
"addedAt": "2026-05-16T08:15:00Z",
"identifier": "AC-2",
"title": "Account Management",
"family": "Access Control",
"statement": "..."
}
]
}
Add controls to a collection
POST /api/v1/control-collections/{id}/controls
- Name
controls- Type
- array
- Description
Array of
{ controlId, framework, notes? }. Duplicates are silently skipped.
The creator can always add controls; if the collection is SHARED, any member
of the creator's organization can add as well.
Response
{ "success": true, "added": 5, "total": 47 }
Remove controls from a collection
DELETE /api/v1/control-collections/{id}/controls
- Name
controls- Type
- array
- Description
Array of
{ controlId, framework }to remove.
Only the creator can remove items.
Response
{ "success": true, "removed": 3 }
Export a control collection
GET /api/v1/control-collections/{id}/export
- Name
id- Type
- string
- Description
Collection ID.
- Name
format- Type
- string
- Description
Export format:
json(default) orcsv.
{
"collection": { "id": "col-uuid", "name": "FedRAMP Moderate baseline" },
"total": 325,
"controls": [
{
"controlId": "AC-2",
"framework": "nist-800-53",
"identifier": "AC-2",
"title": "Account Management",
"family": "Access Control",
"statement": "...",
"notes": "Critical control"
}
]
}
Returns 404 if not found or caller has no access; 400 for an invalid format.