Skip to content

50,000 free calls a month, card-free. Get an API key →

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.

MapMap in 90 seconds · 1:36 · all 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.