Navvo
API Reference

Imagery

Street-level photos and road features from the Navvo imagery network.

Imagery

Street-level imagery and road map-features (signs, signals, crossings) for a point, bounding box, or route corridor — sourced from the Navvo imagery network.

Scope required: imagery

The bbox parameter here is minLng,minLat,maxLng,maxLat (west, south, east, north). Image/feature coordinates are GeoJSON [lng, lat]. JSON responses carry caching metadata (cacheStatus, cachedAt, refreshedAt) and sourceAttributionRequired: true — Navvo imagery attribution is mandatory when you display imagery. Requested bounding boxes and result counts are capped server-side based on zoom.

GET /imagery/mapillary

Street-level image points within a bounding box.

Query parameters

bbox
string required
minLng,minLat,maxLng,maxLat, e.g. 35.9,31.9,35.95,31.96.
zoom
string
Map zoom — drives the bbox cap and default result limit.
limit
string
Max images (clamped 1–200).
{
  "provider": "navvo",
  "configured": true,
  "available": true,
  "bbox": "35.922500,31.929500,35.932500,31.939500",
  "images": [
    {
      "id": "498763215480123",
      "thumb_256_url": "https://…/256.jpg",
      "computed_geometry": { "type": "Point", "coordinates": [35.9281, 31.9344] },
      "captured_at": 1700000000000,
      "sequence": "j1UNvFYGJqcMLi2Zay7l9n"
    }
  ],
  "cacheStatus": "fresh",
  "sourceAttributionRequired": true
}

When the imagery network is not configured: configured:false, available:false, images:[].


GET /imagery/nearest-image

The closest street-level image to a point, plus nearby images and a client token for the Navvo imagery viewer.

GET /imagery/nearest-image and GET /imagery/sequence are throttled to 60 requests/min per IP (they mint a viewer clientToken). Exceeding the limit returns the standard 429 ThrottlerException. The served clientToken is a browser-scoped embeddable viewer token, or null when none is configured.

Query parameters

lon
string required
Longitude.
lat
string required
Latitude.
{
  "available": true,
  "image": {
    "id": "498763215480123",
    "thumb_1024_url": "https://…/1024.jpg",
    "captured_at": "2023-11-14T22:13:20.000Z",
    "sequence_id": "j1UNvFYGJqcMLi2Zay7l9n",
    "computed_geometry": { "type": "Point", "coordinates": [35.9051, 31.9649] }
  },
  "nearby": [ /* up to 11 more, same shape */ ],
  "clientToken": "…",
  "viewerConfigured": true,
  "sourceAttributionRequired": true
}

clientToken is a browser-scoped viewer token for the client-side Navvo imagery viewer. It is null whenever no viewer token is configured, and viewerConfigured tells you which case you are in — so you can distinguish "there is no imagery at this point" from "the viewer is not enabled on this deployment".

availableclientTokenviewerConfiguredWhat it means
truea tokentrueImagery here, viewer can open
truenullfalseImagery here, but the viewer is not enabled — thumbnails still work
falsea tokentrueViewer enabled, no imagery at this point
falsenullfalseNo imagery and no viewer

The thumbnail URLs in image and nearby[] are pre-signed and need no token, so place thumbnails work regardless of viewerConfigured.


GET /imagery/sequence

All images of a Navvo imagery sequence in capture order (for street-view playback).

Query parameters

id
string required
The Navvo imagery sequence ID.
imageId
string
Image ID to start playback from; the returned window begins there.

Returns up to 150 images per call: { sequenceId, count, fetched, orderedImageIds, images, … }.


GET /imagery/map-features

Road map features (signs, signals, crossings) in a bbox, as a normalized list plus a GeoJSON FeatureCollection. Same bbox/zoom/limit params as /imagery/mapillary.

Each feature is normalized with a category (one of traffic_light, speed_limit, stop, yield, no_entry, turn_restriction, pedestrian_crossing, parking, other).

{
  "provider": "navvo",
  "available": true,
  "features": [ { "id": "112233", "object_value": "regulatory--stop--g1", "category": "stop", "geometry": { "type": "Point", "coordinates": [35.9277, 31.9602] } } ],
  "geojson": { "type": "FeatureCollection", "features": [ /* … camelCase properties … */ ] },
  "sourceAttributionRequired": true
}

POST /imagery/map-features/corridor

Map features along a route corridor — build a padded box around a polyline and return the features inside it.

Request body

coordinates
array
Route points as [lng, lat] pairs. (Provide this orpolyline.)
polyline
string
Fallback: "lng,lat;lng,lat;…".
widthMeters
string
Corridor width, clamped 40–800. Defaults to 180.
limit
string
Max features (capped to 200).
zoom
string
Defaults to 15.
{ "coordinates": [[35.90, 31.95], [35.91, 31.96]], "widthMeters": "120" }

Returns 201 with the same shape as /imagery/map-features, plus a corridor block (bbox, widthMeters, points).


GET /imagery/mapillary-tiles/{z}/{x}/{y}

Navvo imagery coverage vector tile endpoint (MVT/protobuf) — where street-level imagery exists. Source-layers: sequence (LineString, the coverage lines, zoom 6–14), image (Point, individual photos, zoom 14), and overview (Point, low-zoom dots, zoom 0–5). Source max zoom is 14 (overzoom for z15+). Returns binary (application/x-protobuf) with cache headers and x-navvo-* cache metadata. 503 if the imagery network isn't configured, 502 if unreachable (a stale cached tile is served when available).

Render the sequence layer as a line layer to show "street view available" coverage (Navvo uses green #05CB63).

GET /imagery/sign-tiles/{z}/{x}/{y}

Navvo traffic-sign vector tile endpoint (MVT/protobuf) — every detected traffic sign as a point. Source-layer traffic_sign (Point, available at zoom 14, source max zoom 14 with overzoom for z15+). Each feature's value property holds the sign type in {category}--{name}--{group} form (e.g. regulatory--stop--g1, warning--curve-left--g1, regulatory--maximum-speed-limit-50--g1; categories: regulatory, warning, information, complementary). Render as a symbol layer with icon-image driven by value for the official sign icons. Same binary response, cache headers, and 503/502 behaviour as the coverage tiles.

The sign taxonomy has hundreds of variants (≈10 regulatory--stop--g1..g10, ≈90 maximum-speed-limit variants, etc.). For a driver-friendly UI, collapse them into a handful of options by matching substrings of value — e.g. all --stop-- → "Stop", all speed-limit → "Speed limits", all warning-- → "Warnings". Filter the symbol layer with a style expression like ["case", [">=", ["index-of", "--stop--", ["get", "value"]], 0], true, false].

GET /imagery/point-tiles/{z}/{x}/{y}

Navvo map-point vector tile endpoint (MVT/protobuf) — detected road points & objects (street lights, CCTV cameras, traffic cones, road markings, manholes, benches, etc.) as points. Source-layer point (Point, available at zoom 14, source max zoom 14 with overzoom for z15+). Each feature's value property holds the object type as object--{name}, marking--{name}, or construction--{name} (e.g. object--street-light, object--cctv-camera, object--traffic-cone, marking--discrete--crosswalk-zebra). Render as a symbol layer with icon-image: ["get", "value"] so each object shows its own icon (a crosswalk marking and a lane-arrow marking render distinct icons), gated to a higher minzoom (≈15) to keep the map clean. Same binary response, cache headers, and 503/502 behaviour as the coverage tiles.

Like signs, render points as a symbol layer (one icon per value), not flat circles. Some point values carry an orientation suffix (object--traffic-light--general-upright-front / -side / -back); if you keep per-value icons, fall back to the orientation-stripped base name (…--general-upright) when the exact icon is missing.
The point taxonomy is large, so group by value substring (object--street-light → "Street lights", marking-- → "Road markings", construction-- / object--traffic-cone → "Roadwork & cones", object--cctv-camera → "CCTV cameras"). For finer control, expose sub-options per group (e.g. Road markings → Crosswalks / Lane arrows / Give-way lines / Stop lines) and build the layer filter from the union of the selected sub-matchers — when a whole group is selected, use its broad matcher so variants without a dedicated sub still show.

GET /imagery/kartaview

An optional additional imagery-source connector placeholder — currently returns { "configured": false, "images": [] }.

Signs & points database (ours-first) — /signs/*

Navvo persists every sign/point it surfaces into its own database and serves them ours-first: the platform reads from its DB, and only falls back to the imagery network to ingest a tile it hasn't seen yet (after which that area is served purely from Navvo — no upstream dependency). Admins have full control over the saved records (hide / edit / delete), and those edits are never overwritten by re-ingest.

GET /signs/features

Returns the saved signs + points in a bounding box as a GeoJSON FeatureCollection. On a first-seen area Navvo ingests the covering tiles, then serves from its DB.

QueryDescription
bboxminLng,minLat,maxLng,maxLat (required)
kindscomma list of sign,point (default both)

Each feature: geometry is a Point; properties carry value (e.g. regulatory--no-entry--g1), a stable key, kind (sign|point), and a brand-neutral src (navvo|admin). Render with a symbol layer (icon-image: ["get","value"]). Hidden/removed records are never returned.

To show the current speed limit on a speedometer, read the maximum-speed-limit-{n} signs from this endpoint, project them onto the active route (cumulative distance along the shape), and display the last one the driver has passed — it carries forward until the next speed sign, and the final sign persists to the route's end. So a street with 60 → 80 → 100 limits steps up as each sign is passed. Outside navigation, fall back to the nearest speed-limit sign.

POST /signs/report

Submit a correction for a sign (e.g. wrong or no longer there). Admins review and approve/reject; an approved report hides that sign for everyone.

{ "key": "sign:regulatory--no-entry--g1:31.95807:35.88645", "value": "regulatory--no-entry--g1", "lat": 31.95807, "lng": 35.88645, "reason": "not-there", "note": "removed during roadworks" }

Per-user disregards — GET/POST/DELETE /me/sign-disregards (auth)

A signed-in rider can disregard a specific sign: it's hidden from their map and ignored by routing for them only (system-wide data is untouched). POST { key, value, lat, lng } to add; DELETE /me/sign-disregards/:idOrKey to restore; GET lists them.

Routing honours signs.POST /routing/plan accepts an optional disregard: string[] (the rider's disregarded keys) and returns a signConstraints block ({ applied, noEntryCount, source: "navvo-signs" }). No-entry / prohibition signs within ~28 m of the planned route become routing exclusions so blocked roads drop out of route options (Navvo routes first, then snaps constraints to the actual corridor — a no-entry sign on a parallel side street the route never uses does not affect it) — except the rider's own disregards. If excluding them leaves no route, Navvo retries without the constraints so routing never fails.
Copyright © 2026