Documentation menu
Build with MapMap
Every page is also served as raw markdown. Append .md to the URL. Agents: /llms.txt · /pricing.json
Prefer to watch? The video library covers the same ground in 49 short videos.
Get started
Mint a key, make the first call, and learn the rules every endpoint shares.
Quickstart
Issue a key in one call, make your first truck-routing request, verify by email.
API conventions
Base URL and availability, authentication, coordinate order and units, quotas and rate limits, the problem+json error model, and ADR tunnel codes, defined once, linked everywhere.
Live demos
Every public demo the site serves: the 3D navigation drives and instrument cluster, the open-data analysis maps, the seven point-cloud scenes and the Roadside cycle routing, with the URL parameters and what each one honestly proves.
Routing and analysis
Routes with lorry dimensions and ADR constraints, plus the analysis endpoints around them.
Truck and ADR routing
Which lorry dimensions and ADR 8.6.4 tunnel restrictions our routing enforces, what each engine backend needs, and the limits stated plainly.
Analysis APIs
Eleven endpoints around routing: isochrones, distance/duration matrices, along-route search, GPS-trace map-matching, elevation profiles, jurisdiction-gated safety cameras, traffic incidents, cheapest fuel and weather along a route, with parameters, complete requests and real response shapes.
Route optimisation
Multi-vehicle, multi-stop optimisation with truck dimensional and ADR constraints, fed by our own routing matrices.
Measured clearance on a route
Whether a vehicle passes under what a survey measured, rather than under what the map records: the corridor walk, the four verdicts, why every figure carries its bound, and why unsurveyed ground is never reported as clear.
Origin-destination analysis
Travel-time matrices for planners: chunking under the 10,000-element cap, a dependency-free script, a kepler.gl-ready CSV of OD pairs, and origins coloured by time to the nearest destination.
Truck restriction data, measured
What one UK OpenStreetMap extract actually records about height, weight and HGV limits: the counts, the denominators, where coverage is good, where it is thin, and what that means for a route we return.
Maps and data
Tiles, styles and Studio, your own data on the map, and the file formats behind both.
Maps, tiles & Studio
Hosted vector tiles, TileJSON and styles, the Studio style editor, fonts and sprites, and the @mapmap/maps web SDK.
Vehicle avatars
Draw the user's vehicle as one of MapMap's own 3D-rendered cars: AvatarPuck in the web SDK, the hosted sprite and model contract for native apps, self-hosting and the artwork licence.
Add your own data
Your data on a MapMap map: clustered pins with PlacesLayer, choropleths and heatmaps through the raw MapLibre escape hatch, PMTiles you host on your own bucket, raster, image and video sources, hover and selection with feature-state, insertion points, custom WebGL layers, MapLibre Native snippets for iOS and Android, reachability rings with IsochroneLayer, GeoJSON overlays on static map images, and the honest limits.
Buses: positions, stops and timetables
England's buses as display data: live positions, NaPTAN stops and BODS lines on a map with TransitStopsLayer, stops near a point and timetabled departures at a stop, the label that says what a live entry is, coverage and the OGL credits.
Leaflet, OpenLayers, deck.gl, Cesium & QGIS
Render MapMap tiles in the clients that are not MapLibre GL JS: a verified snippet each for Leaflet, OpenLayers and deck.gl, what Cesium genuinely cannot do, and the two ways QGIS reads our tiles.
File formats
The channel-index JSON schema, the installed territory package's on-disk layout, and the .drive.jsonl replay-corpus line schema, with a sample corpus.
Data collection & the probe flywheel
How on-device aggregation turns navigation into road-segment statistics without a trajectory ever leaving the vehicle: what a ProbeBatch holds, the three guarantees enforced in code, and the opt-in gate.
SDKs and apps
Web, Android and iOS packages, in-car surfaces, and the Nav reference app.
SDKs & installation
Web, Android, iOS and WASM SDKs: install coordinates, quickstarts, signing-key pinning, and per-vehicle versus per-MAU licensing.
Android API reference
Every public class and method of ai.mapmap:core: territories, offline routing, ADR compliance, guidance, voice and replay. Requires minSdk 26.
Mobile maps with MapLibre Native
Point MapLibre Native at MapMap on iOS and Android: working Swift and Kotlin quickstarts, which style URL to use, why an origin-restricted key cannot work in a native app and what to mint instead, offline territory rendering, and an honest account of what MapMap does not ship for mobile.
CarPlay & Android Auto
In-car turn-by-turn (beta): the Android :car/:car-maplibre modules and iOS MapMapCarPlay, the Apple entitlement and Play Console gates, and DHU/Simulator testing.
MapMap Nav
Our turn-by-turn app, coming soon to the App Store and Google Play: its reference architecture, the React Native bridge, and how to run and build your own on top of it.
Agents and machine payments
Connect an assistant over MCP, teach it with skills, and let it pay for its own calls.
MCP server
Connect Claude Desktop, Claude Code or any MCP client to the full tool surface: routing, dangerous-goods compliance, measured clearance, geocoding, matrix, optimisation, place verification, local geometry and map styling, over stdio or HTTP, hosted or self-hosted.
Use MapMap from any AI assistant
The recipe book: connect the hosted MCP server to ChatGPT, Claude, Cursor, Grok, Perplexity, VS Code or your own agent framework in a minute each, and how an agent mints its own free key mid-task.
Agent skills
Eleven knowledge modules that teach a coding agent how to build with MapMap: truck/ADR routing, the web SDK, branded map design, fleet VRP, syncing with an existing telematics platform, offline maps, machine payments, migrating from Mapbox or Google Maps, self-host ops. The know-how layer that complements the MCP tools.
Machine payments (x402)
The 402 response shape, how agents top up per call, and what is live today versus planned.
The autonomous pay loop
One narrated walkthrough of an agent paying end to end: discover tools over MCP, call with its own key, hit a 402, top up with x402, and continue, with no human. Real wire shapes, plus a runnable script.
Worked recipes
Whole jobs end to end, including moving across from another provider.
Store finder
The worked recipe for "we have N stores": clustered pins and popups, postcode to nearest store, hosted search over your own places, drive-time ranking, and offline options.
Fleet sync with your telematics
The morning-dispatch recipe for fleets that already run Samsara, Webfleet or Geotab: read the day's stops and vehicles from the system that has them, geocode and sanity-check, optimise, write the ordered route back, then follow it live with the stateless progress endpoint. No hosted connector, and no vehicle positions stored by MapMap.
Migrating from Mapbox
Moving a Mapbox GL JS map across: the style URL to createMap, mapbox:// sources to PMTiles you host, slots to insertion points, addInteraction to layer events and feature-state, Standard style config to Studio themes, what MapLibre does not have, and pricing from pricing.json.
Migrating from NextBillion.ai
Endpoint and parameter mapping from NextBillion's Directions, Distance Matrix, Optimization, Snap to Road, Isochrone and Geocoding APIs, what ports with client changes, what MapMap adds (ADR, EV, self-host, agent surface) and what has no replacement.
Run it yourself
The Docker distro on your own hardware, and signed offline territory packages.
Reference
The endpoint surface, generated from the gateway's own OpenAPI document.
Licensing
What each of the three legal surfaces covers, and the ODbL boundary.
Troubleshooting
The web SDK's error messages link straight to the entries below.
Container element not found
The element you pass to the map constructor must exist in the DOM before the map is created. In React, create the map in an effect (after first render), pass a ref's current, and clean up with map.remove().
Map renders 0px tall
MapLibre sizes the canvas from its container, and a container with no explicit height collapses to 0px: a blank “working” map. Give the container (or its parent) a fixed height, and beware absolute inset-0 with Tailwind: MapLibre's own .maplibregl-map { position: relative } rule can win the cascade over the single-class .absolute utility. Size the map div directly off a fixed-height parent instead.
Two copies of maplibre-gl
If your bundle contains maplibre-gl twice (a direct dependency alongside the SDK's), protocol registrations and instanceof checks silently miss each other, and tiles stop loading with no error. De-duplicate: keep one maplibre-gl version, and check with npm ls maplibre-gl.
WebGL unavailable or context lost
Map rendering needs a WebGL context. Headless browsers, virtual machines and very old GPUs may not provide one, and browsers cap how many live contexts a page can hold: destroy maps you no longer show (map.remove()) rather than hiding them. In CI, run Chromium with --use-gl=swiftshader (or Playwright's default software GL) to get a software context.
401 from the hosted API
The gateway rejected your key. Send it as Authorization: Bearer snk_… (or ?api_key=snk_…), check its state with the quota-free GET /v1/keys/self, and remember provisional keys expire after 72 hours until you click the verification email. No key yet? One call, free tier.