Skip to main content

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 false is unsupported.
  • The ETag response header must contain the MD5 hash of the JSON content. If it is incorrect, the SCU logs object 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.json with category definitions.
  • Requires StoreBookmarks to 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.
Categories.json
[
{ "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) and SystemName (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 tags metadata key contains semicolon-separated key:value pairs. 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 CoordinateEntries with LocationWKT (Well-Known Text POINT), SecondsFromStart, and Timestamp.
  • LocationWKT is defined as POINT(longitude latitude).
  • SecondsFromStart is relative to the recording's StartTime (which may differ from TriggerOnTime due to pre-buffer).
GNSS trail example
{
"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 UnknownTime in 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.