Skip to content
VisionObject

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.

One event, three readersEvent 08:52
  1. Event at the barrier · 08:52 · vehicle at the gate
  2. Control room · On screen with the still
  3. Your own tool · Built on the event stream
  4. Weekly brief · Counted in the week's figures
Read it where the work happensDashboard, event stream, brief

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.

An event on the stream
{
  "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
  }
}
An alert on the stream
{
  "kind": "alert",
  "ts": 1790270164000,
  "data": {
    "id": 2291,
    "rule_name": "Vehicle in the yard after hours",
    "severity": "warning",
    "status": "new",
    "acked_at": null
  }
}
Create a rule
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"
  }
}
The route of one plate
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/cameras

    Cameras you may see, with their health

  • POST/api/v1/camerasChanges data

    Add a camera: identifier, name and stream address

  • PATCH/api/v1/cameras/{id}Changes data

    Update settings, location, or the zones and lines drawn on the view

  • GET/api/v1/cameras/{id}/frame

    The current still frame

  • GET/api/v1/cameras/{id}/timeline

    Uploaded 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/tracks

    Sightings, 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 data

    Group look-alike sightings as candidates

  • GET/api/v1/events

    Events 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/plates

    Plates read, with sightings, cameras and first and last seen

  • GET/api/v1/plates/{plate}/route

    One plate's sightings in time order; near matches included unless switched off

  • GET/api/v1/watchlist/plates

    The watchlist, with each entry's hit count for the last 7 days

  • POST/api/v1/watchlist/platesChanges data

    Add 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/rules

    Rules, with the cameras each is automatically muted on and why

  • POST/api/v1/rulesChanges data

    Create a rule

  • PATCH/api/v1/rules/{id}Changes data

    Update, enable or disable a rule

  • GET/api/v1/alerts

    Alerts by status: new, acknowledged or false positive

  • POST/api/v1/alerts/{id}/ackChanges data

    Mark an alert Acknowledged

  • PATCH/api/v1/alerts/{id}Changes data

    Assign an alert or change its tags

  • POST/api/v1/alerts/{id}/notesChanges data

    Add 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 data

    Upload 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 data

    Re-run a failed analysis job

  • POST/api/v1/imagesChanges data

    Analyse 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/overview

    Headline figures with the previous period beside them

  • GET/api/v1/stats/occupancy

    Counts by object type, by quarter-hour, hour or day

  • GET/api/v1/audit

    The audit log, filtered by person, action and time

  • WS/ws

    Live stream of detections, events and alerts you may see

  • GET/healthz

    Status 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.