Skip to content

The real-time road event network

The hazards your users report, and everyone else’s, on one stream.

Relay is the road event network your app publishes to and reads from. The French national operator’s feed is already on it. Publishing is free, always. Reading starts free.

50
events on the wire

8 live · 42 sandbox

13
kinds of hazard

one vocabulary, served by the API

1 s
delivery commitment

p95, publication to reception

Every point on the plate is an event live on the network, read from the API while this page rendered.

what an event is

Every event has a lifetime

Publish one and watch it distributed. Each clip runs from the moment the event was created to the moment it expires, so its length is the life it has left.

watchingGET /v1/stream?lat=48.8698&lon=2.3078&radius=8000
15 live
Connectingwaiting for the snapshot
People on roadA86
Weather hazardA86
Object on roadA4
Stopped vehicleN118
CongestionA86
AccidentA14
Weather hazardA86
Stopped vehicleN118
AccidentA14
lifetime
−1 hnow+1 h+2 h+3 h
readout
People on road · Road worker48.9210, 2.3718publisher · unverifiedclears in 30:00
reading it
highmediumlownot statedhollow — from a public feed · blue edge — yours, with its round trip in ms48.8698, 2.3078 · 8 km radius · a disc is the only area shape the API serves · past four hours is cut at the rim
publishPOST /v1/events

An abnormal queue, normally a segment kilometres long. The easiest event for a telematics box to produce — a prolonged stop outside a delivery point is one — and the one a fleet feels first.

48.8698, 2.3078

move drops it somewhere else in the subscribed area. The key stays on our server; your browser only ever sees the event coming back.

latency

Publish an event and the round trip is timed in this browser — one clock, from the click to the moment it returns down the open stream.

1 000 ms · the published commitment

This publishes with the site’s own sandbox key — a real event on the test network every integrator gets, never served to a live consumer. The incidents already on the tape are live, from the French national road feed. Open the Explorer for the map and every field on the envelope.

how it works

One call to publish, one stream to consume

Both halves are plain HTTP, so anything that speaks it can subscribe — including an embedded client that will never take a cloud vendor’s SDK.

Publish

Free, always. We never ask for a trajectory — only the point event you already derived.

POST /v1/events
curl -X POST https://api.cudatus.com/v1/events \
  -H "Authorization: Bearer $RELAY_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "congestion",
    "lat": 45.7300,
    "lon": 4.8400,
    "severity": "medium",
    "road_ref": "A7",
    "description": "Queue building southbound"
  }'

Subscribe

Reading is authenticated too, and EventSource cannot set a header — so your server mints a 300-second ticket and hands the browser only that.

GET /v1/stream
const API = "https://api.cudatus.com";

// on your server — the key stays here
const { ticket } = await fetch(`${API}/v1/stream/tickets`, {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.RELAY_KEY}` },
}).then((r) => r.json());

// in the browser — a ticket, never the key
const stream = new EventSource(
  `${API}/v1/stream?lat=48.8698&lon=2.3078&radius=8000&ticket=${ticket}`,
);

stream.addEventListener("snapshot", (e) => replaceAll(JSON.parse(e.data).events));

stream.addEventListener("event", (e) => {
  // the delta is an envelope: created | updated | expired
  const { change, event } = JSON.parse(e.data);
  change === "expired" ? drop(event.event_id) : upsert(event);
});

// we always close on schedule; the ticket died long before
stream.addEventListener("bye", () => reconnectWithAFreshTicket());

A correct client owes the wire three things — treat every delta as an upsert, drop an event yourself when its deadline passes, and mint a fresh ticket after a bye. The streaming contract states each of them.

what it costs

Free to start, and the prices are published

Publishing never costs anything, on any plan. What you pay for is reading the network, metered in reads.

10,000 reads a month, free, no cardPaid plans from 24.90 a monthSee the plans
what your users add

A community layer, in two calls

An operator publishes what it has dispatched a crew to. A pothole before that dispatch is in nobody’s system — and these 10 values are what no public feed we ingest can produce.

  • Police checkpolice_check
  • Speed camera · Mobile cameramobile_camera
  • Infrastructure faultinfrastructure_fault
  • Roadworks · Emergency worksemergency_works
  • Road damage · Potholepothole
  • Road damage · Sinkholesinkhole
  • Object on road · Debrisdebris
  • People on road · Road workerroad_worker
  • People on road · Traffic officertraffic_officer
  • People on road · Cyclistcyclist

And on everything the feed does carry, your users are earlier: an operator publishes when the operator knows, and somebody in the third car back knows first.

Report, then confirm

A driver taps an icon — one POST /v1/events. The next driver answers “still there” or “gone” — one POST /v1/events/{id}/signals. Markers expire on their own and promotion needs distinct vehicles, so you write neither a moderation queue nor a stale-hazard sweep.

The community layer, with the code

what it is for

Relay is the layer inside somebody else's product

Three products of the kind that embed Relay, drawn as specimens on one sheet and subscribed to the same stream as the instrument above. Publish an event up there and it arrives in all three on the same tick.

one subscriptionconnecting to the stream
Alerts · Fleet operations
Fleet operations

Road events on your operating area

via Cudatus Relay
RoadEventFrom baseClears in
A86Congestion6.8 km
A14Accident5.8 km
A14Accident5.8 km
A14Accident5.8 km
--:--
high5.8 km

Accident

A14

via Cudatus Relay15 in range
Driver informationvia Cudatus Relay
high

Accident

5.8 km · A14

  • Accident5.8 km
  • Accident5.8 km
Fleet and telematics platformnot a Cudatus product

A fleet operations console

The platform owns the vehicles, the routes and the customers. Relay supplies one panel: what is on the roads they run, queues first, because a queue is what turns into a missed delivery slot.

Navigation and mobility appnot a Cudatus product

A driver-facing app

The app owns the map and the route. Relay supplies what is on it — what is next, how far, how bad.

In-vehicle displayprogramme track

An in-vehicle display

Homologation, functional safety and cybersecurity review run in years — which is exactly the timescale a frozen wire contract is designed to survive. An integration programme rather than an API key.

Cudatus builds none of these. All three are drawn in deliberately anonymous grey, so the only coloured thing inside any of them is the data Relay puts there — which is exactly the shape of what we sell. All three — and the instrument above — are rendering the same 15 events right now. © MapTiler · © OpenStreetMap contributors

who it is for

Where you plug in

Find your row, and read how you connect.

  • Telematics platform editors

    One POST, one stream

    You run the platform a few hundred fleets log into, you have an API and you have developers.

    Your boxes already detect what Relay wants — harsh braking, prolonged immobilisation outside a delivery stop, impact detection. The raw material is on your servers; what it costs you is one HTTP call. We never ask for trajectories, only the point events you already derive.

  • Navigation and mobility apps

    Subscribe and apply deltas

    You put a route in front of a driver, and a hazard on it is worth more the earlier it lands.

    Subscribe to a disc around a position and apply the deltas — one stream, one contract, no per-source integration. An itinerary is covered by subscribing discs along it, each one the same call.

    What your driver sees

  • Road operators and public authorities

    DATEX II in, JSON out

    You already publish DATEX II, and you already asked whether we speak it.

    DATEX II in, JSON out. We consume the European standard and serve a real-time developer API over it — we are not replacing it and not competing with it. Your feed is brought up as a connector; the French national feed runs on one already.

    The feeds already connected

  • Fleet managers

    Through your platform

    A truck stuck behind an accident is a missed delivery slot, and a detour is not trivial at 40 tonnes.

    Through the telematics platform you already use, not through us. A fifty-truck haulier has no development team and should not need one: when your platform integrates Relay, your fleet gets the network with nothing to build on your side.

  • Carmakers

    Integration programme

    You have millions of connected vehicles giving data to a supplier who competes with you on navigation.

    The reciprocity is the argument: what your fleet publishes comes back as every other participant's events, instead of funding a service you then buy back. Homologation, functional safety and cybersecurity review set this cycle in years — an integration programme rather than an API key, and the wire contract is frozen precisely to survive that timescale.

    The reciprocity argument

for reference

What arrives, and how fast

Both numbers here are served by the API rather than written on this page, so a client that reads them at runtime never disagrees with the network.

13 event types, served by the API

Each carries an optional finer subtype — filter on the type, refine on the subtype. A type you do not recognise means the event is opaque to you, so skip it, and never map it onto one you do know.

  • Congestioncongestion
  • Stopped vehiclestopped_vehicle
  • Accidentaccident
  • Object on roadobject_on_road
  • Weather hazardweather_hazard
  • Road damageroad_damage
  • People on roadpeople_on_road
  • Police checkpolice_check
  • Road closureroad_closure
  • Roadworksroadworks
  • Infrastructure faultinfrastructure_fault
  • Speed cameraspeed_camera
  • Wrong-way vehiclewrong_way_vehicle

Five of them arrive from a windscreen and from nowhere else today — police checks, speed cameras, closures, infrastructure faults and roadworks a driver ran into. That is what the community layer is for. The reference carries every time to live and the full fine vocabulary.

A p95 under one second, published rather than promised

The rail inside the instrument above is measuring the deployed stack in your own browser, round trip included. On the reference stack the same measurement is p95 73 ms against the 1 000 ms commitment.

A subscription is a disc, capped at 9.78 km. An itinerary is covered by subscribing discs along it, and a national picture is an assembly of them — the plate at the top is 16 such queries, run concurrently.