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 twelve short videos.
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.
API reference
Endpoint summary for the hosted gateway: routing, ADR check, keys, errors. The OpenAPI document on your deployment is authoritative.
Analysis APIs
Isochrones, distance/duration matrices, GPS-trace map-matching, elevation profiles, and jurisdiction-gated safety cameras along a route: parameters, complete requests, and real response shapes.
MCP server
Connect Claude Desktop, Claude Code or any MCP client to our routing, geocoding and ADR tools, over stdio or HTTP.
Agent skills
Ten knowledge modules that teach a coding agent how to build with MapMap: truck/ADR routing, the web SDK, branded map design, fleet VRP, offline maps, machine payments, migrating from Mapbox or Google Maps, self-host ops. The know-how layer that complements the MCP tools.
Licensing
The three legal surfaces (hosted API terms, SDK commercial licence, self-host agreement), what each costs, how the paid pilot and perpetual options work, and the ODbL boundary, in plain language.
Self-hosting
Run the full platform (gateway, routing engine, geocoder, MCP server) on your own hardware with the Docker distro.
Territory packages & OTA updates
ed25519-signed offline map packages, content-addressed layers, and differential over-the-air updates.
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.
Maps, tiles & Studio
Hosted vector tiles, TileJSON and styles, the Studio style editor, fonts and sprites, and the @mapmap/maps web SDK.
Add your own data
Your data on a MapMap map: clustered pins with PlacesLayer, choropleths and heatmaps through the raw MapLibre escape hatch, reachability rings with IsochroneLayer, GeoJSON overlays on static map images, and the honest limits.
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.
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.
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.
Route optimisation
Multi-vehicle, multi-stop optimisation with truck dimensional and ADR constraints, fed by our own routing matrices.
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.
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.
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.
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.
MapMap Nav
Early access: download the Android app (sideload APK) with full offline navigation and UK safety-camera alerts, plus the reference architecture, the React Native bridge, and how to run and build your own on top of it.
3D demos
The live 3D navigation demos and the instrument-cluster framing: URL parameters (time, vehicle, city, embed, style), what is real, and how they relate to the API.
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.
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.
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.