Capabilities
The Capability API lets the content destination publish which features it supports. The body worn system (BWS) reads System/Capabilities.json from the content destination and enables features accordingly. Once a capability is declared, the content destination is expected to always support it.
For the full specification, see github.com/AxisCommunications/body-worn-content-destination-api.
File format
The capabilities object is a JSON file at System/Capabilities.json:
{
"Read": {
"<CAPABILITY>": true
},
"Store": {
"<CAPABILITY>": true
},
"StoreAndRead": {
"<CAPABILITY>": true
}
}
Naming convention
- Store — the content destination can receive data (
PUT/POST). - Read — the content destination can serve data (
GET/HEAD). - StoreAndRead — both directions are required.
Implementation notes
- All capabilities are considered unsupported if the object is missing or wrongly formatted.
- A capability not present in the JSON or set to
falseis unsupported. - The
ETagresponse header must contain the MD5 hash of the JSON content. If it is incorrect, the SCU logsobject corrupt.
Connection file shortcut
The connection file attribute FullStoreAndReadSupport can be set for standard Swift object store deployments. When set, the BWS assumes all capabilities are supported. For selective capability support, leave this attribute unset and publish the specific capabilities in Capabilities.json.
Capability reference
ReadCategories
Allows the content destination to define recording categories that are synced to cameras.
- The CD publishes
System/Categories.jsonwith category definitions. - Requires
StoreBookmarksto also be enabled (categories are stored as bookmarks). - The BWS reads categories once per day. Re-uploading the connection file in BWM triggers an immediate sync.
- Handle "unknown" categories gracefully — cameras that haven't been docked since a category change may still upload recordings tagged with removed categories.
[
{ "Name": "Traffic stop", "Id": "cat-001" },
{ "Name": "Use of force", "Id": "cat-002" },
{ "Name": "Arrest", "Id": "cat-003" }
]
StoreReadSystemID
Binds the content destination to a specific BWS installation.
- When first configured, the BWS stores a System ID object in
System/<SystemID>. - On subsequent connections, the BWS verifies the stored ID matches, preventing accidental or malicious redirection to a different CD instance.
- Multiple system objects can exist if several BWS installations share one CD.
- Object metadata:
ConnectionId(set on creation, never changes) andSystemName(display name, can be updated).
StoreUserIDKey
Enables a user-supplied ID field for each user in BWM.
- The ID must be empty or unique across users.
- Stored as metadata on the user object in
Users/. - Recommended display format:
Name (UserID)to disambiguate users with the same display name.
StoreBookmarks
Enables bookmarks and categories on recordings.
- Bookmark objects are named
bookmark_<Timestamp>_<ID>. - The
tagsmetadata key contains semicolon-separatedkey:valuepairs. Be prepared for unknown keys. - Bookmark metadata fields:
CategoryID,CategoryName,Tags,StartTime,EndTime,Location. - Example tags value:
"TriggerOn:Button;SomeTag:SomeValue".
StoreSignedVideo
Declares support for receiving video with embedded cryptographic signatures.
- Signed video provides end-to-end authentication from camera to client.
- The content destination must preserve SEI NAL units containing signature data.
- The content must be exportable without tampering with the original video.
- See Signed video for general information.
StoreGNSSTrackRecording
Enables GNSS (GPS) trail data to be included with recordings.
- The trail is stored as a JSON object named
<date>_<time>_<id>_<bwcid>_gpstrail.json. - Format uses
CoordinateEntrieswithLocationWKT(Well-Known Text POINT),SecondsFromStart, andTimestamp. LocationWKTis defined asPOINT(longitude latitude).SecondsFromStartis relative to the recording'sStartTime(which may differ fromTriggerOnTimedue to pre-buffer).
{
"CoordinateEntries": [
{
"LocationWKT": "POINT(13.221184 55.718409)",
"SecondsFromStart": 64.0,
"Timestamp": "2022-08-23T11:48:10Z"
},
{
"LocationWKT": "POINT(13.220701 55.718702)",
"SecondsFromStart": 82.0,
"Timestamp": "2022-08-23T11:48:28Z"
}
]
}
StoreRejectedContent
Allows the SCU to upload content that was rejected by the normal upload path (due to corrupt data, missing metadata, etc.) into a special container.
- Rejected content container name:
RejectedContent_<RejectedContentTime>_<UUID>. - The time may be
UnknownTimein some cases. - If enabled, the CD must never reject content uploaded to a rejected content container.
- A rejected container may contain clips from at most one recording, but not all clips are guaranteed to end up in the same container.
- Additional metadata:
RejectedContentOriginalContainer,RejectedContentTime,RejectedContentReason.