How to enable bookmarks and recording categories in a content destination
This guide shows how to add evidence tagging to your body worn integration. With bookmarks and categories, camera users can mark and classify recordings while they're still in the field, and that context arrives with the recording in your content destination. You'll declare the right capabilities, publish your category list, and read the bookmark metadata that comes back.
The full reference is the body worn content destination API repository. This guide covers the bookmarks and categories workflow and links there for full detail.
Prerequisites
- A working content destination connected to a body worn system (BWS). If you haven't connected one yet, start with How to set up a content destination connection for the BWS.
- The ability to serve and update a JSON object in the
System/container. - Familiarity with the body worn content destination API.
How bookmarks and categories relate
Categories are stored as bookmarks. On the BWS, a user marks a recording as belonging to a category; when the recording uploads, that category is included as a bookmark object. Because of this, you need the bookmark capability before categories will work.
Step 1: Declare the capabilities
In your System/Capabilities.json, enable both StoreBookmarks and ReadCategories:
{
"Read": {
"ReadCategories": true
},
"Store": {
"StoreBookmarks": true
}
}
StoreBookmarks lets the BWS send bookmark objects with recordings. ReadCategories lets it read the category list you publish. Without StoreBookmarks, categories can't be stored, because they travel as bookmarks.
Remember to set the ETag header to the MD5 hash of the object when you serve it. If the checksum is wrong, the system controller logs object corrupt and ignores the capability.
Step 2: Publish your category list
Publish the active categories as a JSON object named Categories.json in the System/ container. The BWS reads it with a GET request to System/Categories.json.
[
{ "Name": "Traffic stop", "Id": "cat-001" },
{ "Name": "Arrest", "Id": "cat-002" },
{ "Name": "Interview", "Id": "cat-003" }
]
Each entry has a display Name and a stable Id. Keep the Id constant even if you rename a category, so existing recordings stay correctly associated.
As with the capabilities file, set the ETag header to the MD5 hash of the object. The BWS uses it as a checksum.
If ReadCategories isn't fulfilled, or if FullStoreAndReadSupport is enabled and Categories.json is missing, the BWS falls back to its built-in default category list.
Step 3: Understand the sync timing
The BWS reads categories from your content destination once per day. After you add the ReadCategories capability and publish Categories.json, it can take up to 24 hours for cameras to pick up the new list.
To sync immediately, an administrator can re-upload the content destination configuration file in AXIS Body Worn Manager. This forces an instant read instead of waiting for the daily cycle.
Step 4: Read bookmark metadata from recordings
When a user tags or bookmarks a recording, the BWS uploads a bookmark object into the recording container. The object is named bookmark_<Timestamp>_<ID>, and its body holds the free-text description in UTF-8. Because each bookmark has a timestamp, a recording can carry several.
Bookmark objects carry this metadata:
| Field | Description |
|---|---|
CategoryID | The ID of the category applied to the recording. |
CategoryName | The display name for that category. |
Tags | A semicolon-separated list of key:value pairs, for example TriggerOn:Button;SomeTag:SomeValue. |
StartTime | When the marked segment begins, RFC 3339 (UTC). Defaults to the start of the recording if the user didn't set it. |
EndTime | When the marked segment ends, RFC 3339 (UTC). Absent if the user didn't set it. |
Location | Up to 64 bytes, if location is available. |
A category bookmark always includes CategoryID, CategoryName, and StartTime. Be prepared for unknown keys and values in the Tags list – the BWS can add keys you don't recognize, so don't reject a bookmark just because a tag is unfamiliar.
Step 5: Handle categories from undocked cameras
Categories aren't updated on a camera until it docks and syncs. A camera that's been in the field since before you changed your list can upload a recording tagged with a category you've already removed.
Handle this gracefully. Treat an unknown CategoryID as a valid-but-retired category rather than an error: keep the recording, store the CategoryName that came with it, and surface it in your interface instead of dropping the tag. This keeps the chain of custody intact even when your category list changes over time.
Verify the setup
- Publish
Categories.json, then trigger a sync by re-uploading the configuration file in AXIS Body Worn Manager. - Tag a recording in the field (for example, with the AXIS Body Worn Assistant mobile app) and dock the camera.
- Watch for a bookmark object named
bookmark_<Timestamp>_<ID>in the recording container, and confirm theCategoryIDandCategoryNamematch a category you published.
Related resources
- How to set up a content destination connection for the BWS – connect your content destination first.
- How to retrieve body worn recordings via the integration API – receive and download the recordings that carry these bookmarks.
- Axis body worn solution – metadata and chain-of-custody overview.
- Body worn content destination API specification and example server.