Developer resources
Read sightings, events, plates and alerts, manage cameras and rules, and subscribe to events as they happen. A signed-in person sees only what their organisation, role and camera scope allow. The deployment's one automation token has platform-administrator rights.
- 1Event at the barrier · 08:52 · vehicle at the gate
- 2Control room · On screen with the still
- 3Your own tool · Built on the event stream
- 4Weekly brief · Counted in the week's figures
Before you start
Access, scope and versions.
What an engineer needs to know before writing a client.
- Specification
- A machine-readable specification of every operation is supplied with the deployment, alongside a written guide with examples. Ask for it when you request a demo.
- Versioning
- The path carries the version. One version, v1, exists today, and the specification supplied with a deployment matches that deployment. Changes are listed in the release notes.
- Authentication
- A person signs in and calls the API with their session. One automation token exists per deployment: it has platform-administrator rights across all organisations and names the organisation it acts in with a request header. For role-limited access, use an account; scoped tokens are not available. After set-up, a data call with neither is refused. The health report and the performance figures stay open to anyone who can reach the API port.
- Read and write scope
- For a person, reads need a role that may view or search, and changes need the role for that change: managing cameras, managing rules, triaging alerts, keeping the watchlist. A refusal names the missing permission. The automation token holds every permission.
- Visibility
- A caller sees only the cameras owned by or granted to the organisation it acts in, narrowed by a member's own camera scope. A record outside that view is reported as not found.
- Module switches
- For a person, a field or filter that belongs to a switched-off module, such as plates or scene readings, is left out or refused with a reason. The automation token is not held to an organisation's module switches.
Samples
An event, an alert, a rule and a route.
The same after-hours sighting the film on the home page follows, as your systems would receive it.
{
"kind": "event",
"ts": 1790270162000,
"data": {
"id": 4182,
"type": "zone_enter",
"time": "2026-09-24T17:16:02Z",
"camera_id": "loading-bay",
"track_id": 9214,
"payload": {
"rule": "Vehicle in the yard after hours",
"zone": "service-yard",
"class": "car"
},
"snapshot": null
}
}{
"kind": "alert",
"ts": 1790270164000,
"data": {
"id": 2291,
"rule_name": "Vehicle in the yard after hours",
"severity": "warning",
"status": "new",
"acked_at": null
}
}POST /api/v1/rules
Authorization: Bearer <your token>
X-Org: <your organisation>
{
"name": "Vehicle in the yard after hours",
"camera_id": "loading-bay",
"spec": {
"when": { "type": "zone_enter", "zone": "service-yard", "class": "car" },
"schedule": { "from": "22:00", "to": "06:00" },
"throttle_s": 60,
"severity": "warning"
}
}GET /api/v1/plates/GJ00VO4821/route?from=2026-09-24T17:00:00Z
{
"plate": "GJ00VO4821",
"fuzzy": true,
"matched_plates": ["GJ00VO4821", "GJ00VD4821"],
"cameras": 2,
"points": [
{ "time": "2026-09-24T17:08:12Z", "camera_name": "Approach road",
"plate": "GJ00VO4821", "conf": 0.84, "valid": true },
{ "time": "2026-09-24T17:12:10Z", "camera_name": "Car park",
"plate": "GJ00VD4821", "conf": 0.62, "valid": true }
]
}Samples are illustrative and use demonstration data. A zone event carries no still of its own, so its snapshot is null: follow track_id to the sighting and its still. The specification supplied with your deployment is the reference.
How events are delivered
- The event stream is one long-lived connection that carries three kinds of message: detection, event and alert.
- Delivery is live only. Nothing is stored for a client that is not connected, and nothing is retried.
- After a disconnection, a client reconnects and reads what it missed from the events and alerts operations, by time.
- A client that reads too slowly loses messages; other clients are not slowed.
- When a person's access changes, their connection is closed so that it reconnects with the new permissions.
- No outbound callbacks to your systems exist. Your client connects to the stream.
What the times mean
- ts on a stream message
- When the server sent the message, in milliseconds.
- time on a live event or sighting
- When the frame reached the server. It is not the camera's own clock.
- time on an event from uploaded footage
- The clip's start time plus the position in the clip. The start time comes from the file name where the export includes one, otherwise from what the operator entered.
- acked_at on an alert
- When a person marked the alert Acknowledged or False positive.
- Time zone
- Times are exchanged in UTC or with an explicit offset. Each organisation has a time zone used for display.
Operations
What the API covers.
A selection, grouped by task. Operations that change something are marked.
Cameras
Register a stream, label it with a location and an area, and draw zones and lines on it.
GET
/api/v1/camerasCameras you may see, with their health
POST
/api/v1/camerasChanges dataAdd a camera: identifier, name and stream address
PATCH
/api/v1/cameras/{id}Changes dataUpdate settings, location, or the zones and lines drawn on the view
GET
/api/v1/cameras/{id}/frameThe current still frame
GET
/api/v1/cameras/{id}/timelineUploaded clips for a camera as one timeline: clips, gaps, events and activity
Sightings and events
What was seen, filtered by camera, type, colour, plate and time. Events are also filtered by area.
GET
/api/v1/tracksSightings, filtered by camera, type, colour, plate, scene tag and time
GET
/api/v1/tracks/{id}One sighting with its stills and attributes
POST
/api/v1/tracks/regroupChanges dataGroup look-alike sightings as candidates
GET
/api/v1/eventsEvents of interest, filtered by type, camera, area and time
Plates and watchlist
Plate history, routes and the organisation's own watchlist. Needs the number-plate module.
GET
/api/v1/platesPlates read, with sightings, cameras and first and last seen
GET
/api/v1/plates/{plate}/routeOne plate's sightings in time order; near matches included unless switched off
GET
/api/v1/watchlist/platesThe watchlist, with each entry's hit count for the last 7 days
POST
/api/v1/watchlist/platesChanges dataAdd a plate with a label, a reason, a severity and an optional expiry
Rules and alerts
The same rules the dashboard edits, and the alert queue.
GET
/api/v1/rulesRules, with the cameras each is automatically muted on and why
POST
/api/v1/rulesChanges dataCreate a rule
PATCH
/api/v1/rules/{id}Changes dataUpdate, enable or disable a rule
GET
/api/v1/alertsAlerts by status: new, acknowledged or false positive
POST
/api/v1/alerts/{id}/ackChanges dataMark an alert Acknowledged
PATCH
/api/v1/alerts/{id}Changes dataAssign an alert or change its tags
POST
/api/v1/alerts/{id}/notesChanges dataAdd a note; the author is the caller
Recorded footage
Upload clips. They are analysed as fast as the hardware allows and never raise alerts.
POST
/api/v1/videosChanges dataUpload a clip: file, camera and start time
GET
/api/v1/videos/{id}Progress, duration and format of an upload
POST
/api/v1/videos/{id}/retryChanges dataRe-run a failed analysis job
POST
/api/v1/imagesChanges dataAnalyse one image: objects, colours, plate
Statistics, logs and stream
Figures for your own reports, the audit log, and events as they happen.
GET
/api/v1/stats/overviewHeadline figures with the previous period beside them
GET
/api/v1/stats/occupancyCounts by object type, by quarter-hour, hour or day
GET
/api/v1/auditThe audit log, filtered by person, action and time
WS
/wsLive stream of detections, events and alerts you may see
GET
/healthzStatus of each part of the system. Open without signing in
Event types
The types an event can have.
The type string is the contract. An event from a switched-off module is not delivered.
- zone_enter, zone_exit
- A followed object enters or leaves a drawn zone
- line_cross
- A drawn line is crossed, with its direction
- loiter
- Time in a zone passes the limit
- object_left
- An item or vehicle stays still past the limit
- class_present
- A count of a chosen object type is reached
- plate_match
- A plate read matches the organisation's watchlist; carries both plates and whether the match was exact
- ai_context
- An AI scene reading was produced for a sighting
- camera_offline
- A feed is still missing after repeated reconnection attempts
- track_started, track_ended
- A sighting begins or ends
Questions we are asked first
Can the stream replay what we missed?
No. It is live only. After a disconnection, read the events and alerts operations for the period you missed, then carry on from the stream.
Can VisionObject call our system when something happens?
No. Your client connects to the event stream and reads from it; VisionObject does not call out.
Is every operation documented?
Yes. A machine-readable specification and a written guide are supplied with the deployment.
Can our engineers try it before a pilot?
Ask for a technical session when you request a demo. We will run the API and the event stream against demonstration footage with your team.
Run the API against demonstration footage.
Ask for a technical session when you request a demo. We will run the API and the event stream with your engineers.