Plate lists on many cameras
If you run ALPR on more than one camera, keep one set of allow and block lists and put it on every camera. The cameras match plates themselves, with no cloud connection. For a single camera, use the console: Plates, then Watchlist.
Each camera holds up to 4 lists. How many plates it holds depends on the camera's memory:
| Camera memory | Plates in one list | Plates in total |
|---|---|---|
| 900 MB or more | 10,000 | 40,000 |
| 560 to 900 MB | 10,000 | 20,000 |
| Less than 560 MB | 5,000 | 5,000 |
A camera refuses a bundle over its limits, and the refusal names the list and the limit. You can read the limits a camera holds.
Releases before 0.5.495 hold only 10 plates in 2 lists.
On the cameras we measured, a camera checks a plate against all of its lists in under 1 ms at the 99th percentile: 0.87 ms on an ARTPEC-8 holding 20,000 plates in 4 lists, and 0.47 ms on an ARTPEC-9 holding 40,000 plates in 4 lists.
GET /local/AnavaAgent/web/api/v1/plate-lists, with the same header and account, returns the limits that camera holds (maxEntries, maxEntriesPerList and maxLists) and how many plates it has now.
Plate lists need a camera that reads plates: an ARTPEC-8 or ARTPEC-9 camera running Anava Edge.
How it works
- You keep the lists in one file, the plate list bundle.
- Every camera that gets the bundle holds the same lists. The camera reports a version for the bundle, and cameras with the same bundle report the same version.
- A new bundle replaces the lists from the previous bundle. Lists someone typed on a camera's own console are not touched.
- Plate matching must be switched on. See Turn plate matching on.
- When a plate is on a list, the camera raises the Anava event Block list hit or Allow list hit. Use it in AXIS Camera Station, Milestone or a camera action rule to open a gate, sound an alarm or start a recording. This works with no cloud.
There are two ways to get the bundle to your cameras. Use one of them for a site, not both: a camera set to pull from a file refuses a pushed bundle.
| Way | Best for |
|---|---|
| Pull from a file on your network | Sites managed with AXIS Device Manager, and lists that change often |
| Send to each camera | A few cameras, or a site with no web server |
Prepare the bundle
The bundle is one JSON file. It holds every list and every plate:
{
"format": "anava.alpr.lists.v1",
"lists": [
{
"listId": "stolen",
"entries": [
{ "plate": "ABC1234", "listType": "block", "id": "case-2026-114" },
{ "plate": "XYZ789", "listType": "allow" }
]
}
]
}
| Field | Required | Meaning |
|---|---|---|
format | yes | Always anava.alpr.lists.v1 |
lists[].listId | yes | The list's name, for example stolen |
lists[].entries[].plate | yes | The plate |
lists[].entries[].listType | yes | block or allow |
lists[].entries[].id | no | Your own reference for the entry, such as a case number |
lists[].entries[].expiresTs | no | When the entry stops matching, in milliseconds since 1970 (Unix time) |
Anava does not ship a spreadsheet converter for this file. If your lists live in a spreadsheet, a short script of your own can write it.
- A list name starts with a lower-case letter or digit, then lower-case letters, digits,
.,_or-, at most 64 characters. - Spaces and dashes in plates are ignored. A plate has 4 to 16 letters and digits.
- Words that mean "no plate" (
NONE,NULL,N/A,UNKNOWN) are refused. - An
idcan appear only once in a list. - The same plate may be on a block list and an allow list. If a plate is on both, the block list wins.
Pull from a file on your network
Each camera fetches the bundle file from a web server on your network (a NAS or IIS, for example) and checks it again on a schedule. AXIS Device Manager only sets three small parameters.
- Save the bundle as
anava-plate-lists.jsonand find its SHA-256. On Windows, in PowerShell, runGet-FileHash .\anava-plate-lists.json -Algorithm SHA256. On macOS or Linux, runshasum -a 256 anava-plate-lists.json. - Put the file on a web server the cameras can reach, for example
https://files.example.local/anava-plate-lists.json. - Set these parameters on every camera:
| Parameter | Value |
|---|---|
root.AnavaAgent.AlprListBundleURL | the file's URL |
root.AnavaAgent.AlprListBundleSHA256 | the file's SHA-256 (required for http://, recommended for https://) |
root.AnavaAgent.AlprListSyncMinutes | how often to check, 1 to 1440 (default 15) |
Set them with AXIS Device Manager (Configure Devices) or a script:
curl --anyauth -u "root:$CAMERA_PASSWORD" \
--data-urlencode "action=update" \
--data-urlencode "root.AnavaAgent.AlprListBundleURL=https://files.example.local/anava-plate-lists.json" \
--data-urlencode "root.AnavaAgent.AlprListBundleSHA256=<sha256>" \
"https://CAMERA_IP/axis-cgi/param.cgi"
Then turn plate matching on.
To change the lists, replace the file and set the new SHA-256 on the cameras. With a SHA-256 set, a camera only takes a file with exactly that hash, so a changed or damaged file is refused.
Check the result
Each camera writes what happened to root.AnavaAgent.AlprListBundleStatus, which AXIS Device Manager can read:
ok 3f2a9c1d0b7e lists=3 entries=1200 at 2026-10-17T12:00:00Z: the bundle is in place.unchanged ...: the file has not changed since the last check.error ...: what went wrong. The camera keeps the lists it had.off: no URL is set.
Rules for the URL
http://orhttps://only. Plainhttp://needsAlprListBundleSHA256.- No username or password in the URL. Camera parameters can be read by other tools, so the camera refuses a URL with credentials.
https://uses the camera's trusted certificate authorities.
Turn plate matching on
The name of the switch depends on the Anava Edge release on the camera:
| Release | Parameter | Value |
|---|---|---|
Releases with AlprPlateListsEnabled | root.AnavaAgent.AlprPlateListsEnabled | yes (the default) |
| Earlier releases | root.AnavaAgent.AlprPlateLists | on (the default is off) |
With a script, set each one in its own request, because a camera refuses a request that names a parameter it does not have:
curl --anyauth -u "root:$CAMERA_PASSWORD" \
--data-urlencode "action=update" \
--data-urlencode "root.AnavaAgent.AlprPlateListsEnabled=yes" \
"https://CAMERA_IP/axis-cgi/param.cgi"
Other ways
The camera API takes a bundle directly: PUT /local/AnavaAgent/web/api/v1/plate-list-bundle with the header X-Anava-Request: lite-ui and an administrator account, and GET on the same path returns the camera's bundle and version. A bundle you get back can be pushed to another camera as it is.
curl --anyauth -u "root:$CAMERA_PASSWORD" -X PUT \
-H "Content-Type: application/json" \
-H "X-Anava-Request: lite-ui" \
--data-binary @anava-plate-lists.json \
"https://CAMERA_IP/local/AnavaAgent/web/api/v1/plate-list-bundle"
A camera that is set to pull from a file refuses this request. Clear AlprListBundleURL first.