Putting AI on a city's camera network requires an agreement with that city, and that process can run for years. We hold one, so you do not need your own — an API key is the whole of it. What comes back is what the cameras see and what residents report, from the same roads, in one feed.
Vehicles perceive the world from inside the vehicle. The step after that is reading the infrastructure as well — a junction able to say what it is seeing before any single car's sensors can. That roadside layer has to exist before anything can read it, and this is it: a live, anonymised, machine-readable account of what is happening on specific metres of specific roads, in a form a city has already agreed to publish.
Residents report what no camera can resolve — a bike lane blocked by scaffolding, a crossing that does not give elderly people enough time, a surface starting to break up. Those reports arrive in the same feed, categorised, geolocated, and carrying the status the city has given them.
It is the half of the road instrumentation does not reach: obstruction, intent, and conditions that have not caused an incident yet but are about to.
{
"event_id": "0a9c3f18-5b2e-5c41-9d07-3ea6b1c4d820",
"event_type": "near_miss",
"occurred_at_ms": 1762166820000,
"monitoring_point_id": "example-junction-03",
"latitude": 18.78841, "longitude": 98.98523,
"source": "camera",
"provisional": true,
"video_reviewed": false,
"attributes": {
"pet_seconds": 1.4, "pet_error_seconds": 0.3,
"crossing_degrees": 72,
"first_class": "motorcycle",
"second_class": "car",
"range_meters": 31.2
},
"provenance": {
"source_kind": "cctv",
"anonymisation": "pre-encode-blur",
"no_persistent_identifier": true
}
}
That row is a collision that did not happen. A motorcycle and a car
crossed at 72°, missing each other by 1.4 seconds, at a precise point
on a city's road network. There was no crash, so there is no insurance
claim, no police report, and no trace of it in any other dataset on earth.
Accident statistics can only count the ones that went wrong; this counts the
ones that nearly did — which is the population you actually want if you are
scoring risk, choosing validation routes, or arguing for a junction redesign.
And the highlighted fields mean you can tell how far
to trust it: whether a human has checked the video, and the error bar on the
measurement. You will not discover the uncertainty in production.
Blue from cameras, purple reported by residents — two independent records of
the same road.
How often it updates: hazard detections reach the API about a minute
after they are detected; road-condition detections — flooding, roadworks,
accidents — come from frame sampling on an hourly cycle. Resident reports
appear as they are submitted. There is no real-time push, and we would
rather say so than let you design around one.
How you can read it back: individual events, or per-camera aggregates,
time series bucketed by hour, day or week, density at roughly 150-metre cells,
and distributions of speed, vehicle class, braking force and queue length.
Those buckets are a query option, not the refresh rate.
The time to evaluate is before the volume arrives, not after. Phuket is signed for citywide deployment, and that is where the volume comes from. The API, the schema and the documentation are live and complete today — so you can run them against your own pipeline now, and be reading production data on day one rather than starting integration then.