Map Tiles & Styles
Map Tiles & Styles
A complete, first-party basemap served by Navvo Maps. Point the Navvo Maps renderer at a style URL and everything else — vector tiles, glyphs, sprites, raster layers — is served by Navvo. Nothing is fetched from outside Navvo.
Scope required: tiles
x-api-key header. Pass the key as a query parameter on the style URL: ?api_key=nvvo_YOUR_KEY.api_key (query param on the style URL, or the SDK apiKey) to get a clean, unwatermarked map.GET /tiles/styles
The catalog of available map styles — for building a style switcher. Each entry's style value is what you pass to GET /tiles/style?style=; category is base or imagery.
curl -s "https://navvo.io/api/v1/tiles/styles" -H "x-api-key: $NAVVO_API_KEY"
{
"provider": "navvo-tiles", "count": 6, "styleUrl": "/tiles/style?style={style}",
"styles": [
{ "style": "standard", "label": "Standard", "category": "base", "description": "The default road map." },
{ "style": "positron", "label": "Light", "category": "base", "description": "Minimal light basemap." },
{ "style": "dark", "label": "Dark", "category": "base", "description": "Night/dark basemap." },
{ "style": "satellite", "label": "Satellite", "category": "imagery", "description": "Aerial/satellite imagery." },
{ "style": "3d", "label": "3D Buildings", "category": "base", "description": "3D building extrusions (supports ?terrain=1)." },
{ "style": "terrain", "label": "Terrain", "category": "imagery", "description": "Shaded-relief terrain." }
]
}
GET /tiles/style
Returns a complete Navvo Maps style document (standard vector style spec, v8) for a named style. This is the URL you give the Navvo Maps renderer.
Query parameters
standard (default), road (alias of standard), positron, dark, satellite, terrain, 3d. The full list with labels is at GET /tiles/styles. Unknown values return 400.name.1/true to include the elevation terrain source in the 3d style (when available).const map = new NavvoMaps.Map({
container: "map",
style: "https://navvo.io/api/v1/tiles/style?style=standard&api_key=nvvo_YOUR_KEY",
center: [35.91, 31.95],
zoom: 12,
});
The returned style references Navvo-hosted child resources (glyphs, sprites, and a vector tile catalog) — all served by Navvo. You don't request these directly; the renderer loads them automatically from the style:
{
"version": 8,
"name": "Navvo standard",
"sources": {
"navvo": { "type": "vector", "url": "https://navvo.io/api/v1/tiles/tilejson/navvo", "attribution": "© Navvo" }
},
"layers": [
{ "id": "background", "type": "background", "paint": { "background-color": "#FAFBFC" } },
{ "id": "water", "type": "fill", "source": "navvo", "source-layer": "water", "paint": { "fill-color": "#D8E7FF" } }
],
"metadata": { "navvoStyle": "standard", "navvoAttribution": "© Navvo" }
}
The satellite and terrain styles are raster styles whose single source points at the raster tile endpoint.
standard/dark/positron/3d styles are vector; satellite/terrain are raster. Use /tiles/style as your single entry point — Navvo Maps resolves the rest.3d vector styles (standard/dark/positron), buildings render as flat 2D footprints via the buildingfill layer, which is visible by default but only appears when zoomed in (minzoom ≈ 15.5). Nothing is raised — the footprints stay flat even when the camera is pitched (e.g. during navigation).To raise buildings into 3D on those styles, add your own fill-extrusion over the same source layer:map.addLayer({
id: 'buildings-3d', type: 'fill-extrusion',
source: 'navvo', 'source-layer': 'building', minzoom: 15.5,
paint: {
'fill-extrusion-color': '#cfd5e0',
'fill-extrusion-height': ['coalesce', ['get', 'render_height'], ['get', 'height'], 6],
'fill-extrusion-base': ['coalesce', ['get', 'render_min_height'], ['get', 'min_height'], 0],
},
});
// (extrusions only read as 3D when the camera is pitched — set map.setPitch(...))
3d style ships this raised layer (navvo-3d-buildings) already, along with a pitched camera — use it when you want 3D buildings out of the box./tiles/style responses are sent with Cache-Control: public, max-age=300, stale-while-revalidate=86400. The style document is safe to reuse for 5 minutes (and served stale-while-revalidate for up to a day), so a renderer, service worker, or CDN can cache it across reloads instead of refetching on every map open. Style edits propagate within ~5 minutes.Content-Encoding: gzip) when your request sends Accept-Encoding: gzip — which every browser and standard HTTP client (and the Navvo renderer) does automatically, transparently decompressing on receipt. This roughly halves the transfer for coverage tiles and cuts vector tiles ~35%. Raster/imagery tiles (PNG/JPEG) are already compressed and are served as-is. Responses carry Vary: Accept-Encoding, so a shared cache stores the right variant.Attribution
Navvo serves the entire basemap itself — there are no runtime calls to any third-party provider. Navvo basemap responses carry © Navvo. Display the Navvo credit; no third-party attribution is required in your app.
- Base map & satellite/imagery:
© Navvo. Keep the renderer's compact attribution control visible — the Navvo SDKs show it by default. GET /map/configreturns anattributionobject so you can render the Navvo credit in a custom UI if you build your own attribution surface.
Tile sources
These endpoints back the styles above. The renderer requests them for you when it loads a style — you normally don't call them by hand. They're listed for completeness and for advanced/custom renderers.
| Endpoint | Returns |
|---|---|
GET /tiles/vector/navvo/planet/{z}/{x}/{y}.pbf | One vector tile (protobuf), application/x-protobuf. The path segment after navvo is typically planet; a .pbf extension on {y} is accepted. Cached public, max-age=86400. |
GET /tiles/tilejson/navvo | The vector tile catalog (TileJSON) the vector styles reference as their source url — tile template, zoom range, and vector layers. |
GET /tiles/raster/{source}/{z}/{x}/{y}.png | One raster tile (PNG/JPEG). source ∈ standard, dark, satellite, terrain, navvo-natural-earth. |
GET /tiles/glyphs/navvo/{fontstack}/{range}.pbf | Font glyph ranges (.pbf) referenced by the style's glyphs. |
GET /tiles/sprites/navvo/sprite | The sprite atlas base URL; the renderer appends .json (index), .png, and @2x.png (images). |
{source} raster values: standard/dark are a clean neutral base, satellite is Navvo satellite imagery, terrain is shaded elevation, and navvo-natural-earth is a low-zoom world base. All child resources are served entirely by Navvo — the style contains no third-party provider names and makes no runtime calls outside Navvo.You can also wire a raster source directly:
map.addSource("nav-sat", {
type: "raster",
tiles: ["https://navvo.io/api/v1/tiles/raster/satellite/{z}/{x}/{y}.png"],
tileSize: 256,
attribution: "© Navvo",
});
GET /tiles/layers
A small discovery catalog of available logical layers, style URLs, and raster tile templates.
{
"layers": ["administrative", "water", "buildings", "roads", "poi", "places"],
"styles": {
"standard": "/api/v1/tiles/style?style=standard",
"dark": "/api/v1/tiles/style?style=dark",
"satellite": "/api/v1/tiles/style?style=satellite",
"terrain": "/api/v1/tiles/style?style=terrain"
},
"tileProxy": {
"standardRaster": "/api/v1/tiles/raster/standard/{z}/{x}/{y}.png",
"satelliteRaster": "/api/v1/tiles/raster/satellite/{z}/{x}/{y}.png"
}
}
Satellite Time-Machine (dated imagery)
Dated, multi-layer satellite imagery, proxied and brand-scrubbed. Request any registered layer at any date.
GET /tiles/gibs/{layer}/{z}/{x}/{y}?date=YYYY-MM-DD
Layers: truecolor, truecolor-aqua, truecolor-viirs, snow, aerosol (dust/air-quality). See GET /tiles/layers → timeMachine for the live registry + default date. Omit date for the most recent available.
Terrain elevation (DEM)
Navvo-hosted elevation tiles (raster-dem) — the source behind 3D terrain (/tiles/style?style=3d&terrain=1) and hillshading. Coverage is Jordan; tiles outside the coverage bounds return 404 (treat that as "flat", not an error).
GET /terrain/tilejson
The DEM tileset descriptor (TileJSON): tile template, zoom range, bounds, and the elevation encoding.
curl -s "https://navvo.io/api/v1/terrain/tilejson" -H "x-api-key: $NAVVO_API_KEY"
{
"tilejson": "2.2.0", "name": "Navvo Jordan terrain", "scheme": "xyz",
"type": "raster-dem", "format": "png", "encoding": "…",
"minzoom": 0, "maxzoom": 14, "bounds": [34.88, 29.12, 39.32, 33.38],
"tiles": ["/api/v1/terrain/tiles/{z}/{x}/{y}.png"],
"metadata": { "license": "ODbL", "generatedAt": "…", "tileCount": 61968 }
}
GET /terrain/tiles/{z}/{x}/{y}.png
One elevation tile (PNG, RGB-encoded elevation). Cached public, max-age=604800, immutable. Out-of-bounds or unbuilt tiles → 404.
GET /tiles/style?style=3d&terrain=1 returns a style whose navvo-terrain-dem source already carries the exact decode parameters — the custom-encoding factors (redFactor, greenFactor, blueFactor, baseShift, i.e. elevation = baseShift + R·redFactor + G·greenFactor + B·blueFactor) — plus a tuned terrain.exaggeration. Use the style and the renderer decodes elevation automatically.Static map images
GET /tiles/static renders a non-interactive map image — for emails, receipts, chat previews, and social-share cards. No renderer needed; put the URL straight into an <img> (or an og:image with format=png).
Query parameters
lat,lng — the map center (note: latitude first).13.WxH in pixels, each side 64–1280. Defaults to 600x400.lat,lng;lat,lng;…. Each renders as a Navvo pin.standard (default), dark, satellite, or terrain.png returns a true raster PNG — use it for og:image / social-share previews, since crawlers don't render SVG.curl -s "https://navvo.io/api/v1/tiles/static?center=31.9539,35.9106&zoom=14&size=600x400&markers=31.9539,35.9106&style=standard&format=png" \
-H "x-api-key: $NAVVO_API_KEY" -o preview.png
Responses are cached (Cache-Control: public, max-age=3600) and carry the © Navvo attribution strip baked into the image. Scope: tiles.