Both services bill per map load (one map initialisation per page view; tiles are free). List prices for the Maps SDK for web, November 2026.
| Monthly volume | Mapbox | ExpressMaps |
|---|---|---|
| Free tier | 50,000 loads with a card on file (5,000 without) | 100,000 loads, no card |
| 100,000 loads | $250 | Free |
| 250,000 loads | $800 | $29 |
| 1,000,000 loads | $3,050 | $99 |
| 5,000,000 loads | $13,050 (contact sales above 5M) | $399 |
Mapbox graduated rates: 50,001 to 100,000 at $5.00 per 1,000; to 200,000 at $4.00; to 1,000,000 at $3.00; to 5,000,000 at $2.50. ExpressMaps plans: Free 100,000 loads; Essential $29 for 250,000; Business $99 for 1,000,000; Enterprise $399 for 5,000,000, then $0.05 per 1,000. One map load is one map initialisation; tiles, panning and zooming are not metered. Prices checked 12 November 2026 and may have changed; see the cost calculator for your own numbers.
Mapbox counts a map load each time a Mapbox GL JS Map object is created (v2 and later), with a 12-hour cap per load. Vector tile requests made by the library are included. Above 50,000 you pay a graduated per-thousand rate, so a site doing a million loads pays about $3,050.
ExpressMaps counts a map load the same way, then charges a flat monthly plan rather than a per-load rate: $29 covers up to 250,000, $99 up to a million, $399 up to five million. There is no card on file for the free plan and no surprise invoice when a page goes viral: if the free quota runs out we email you and the maps pause until the next month, or immediately resume when you start a paid plan. Paid plans get a 30-day grace period and roll unused loads into the next month.
new Map(), setStyle, markers, popups, addLayer, GeoJSON sources. Mapbox GL JS 1.x itself also works unchanged with our style URLs.If you need those, keep Mapbox for them. Many customers move only the base map, which is where the volume and the cost are.
Replace the script and stylesheet with MapLibre, delete the access token line, and change the style URL. Everything else stays.
<!-- before -->
<script src="https://api.mapbox.com/mapbox-gl-js/v3.7.0/mapbox-gl.js"></script>
mapboxgl.accessToken = 'pk.…';
var map = new mapboxgl.Map({ container: 'map', style: 'mapbox://styles/mapbox/streets-v12', center: [-0.1276, 51.5072], zoom: 12 });
<!-- after -->
<script src="https://unpkg.com/maplibre-gl@4.7.1/dist/maplibre-gl.js"></script>
var map = new maplibregl.Map({ container: 'map', style: 'https://tiles.expressmaps.com/styles/standard.json?key=YOUR_API_KEY', center: [-0.1276, 51.5072], zoom: 12 });
The embed generator writes this for any of our ten styles, and the docs cover Leaflet, OpenLayers and React.
Versions 2 and 3 require a Mapbox token and talk to Mapbox's billing API, so they will not load third-party styles without one. Switch the script tag to MapLibre GL JS, which has the same API, or stay on Mapbox GL JS 1.13 which works as-is.
Styles built on Mapbox Streets reference Mapbox's own source layers. Our tileset uses the OpenMapTiles schema, so you would rename source layers (for example road to transportation). Our ten styles are a good starting point to edit instead.
No. Mapbox GL JS v2+ sends usage events to Mapbox; MapLibre sends nothing anywhere, and our tiles set no cookies.