A Mapbox alternative for web maps

Mapbox is a good product with a pricing curve that gets steep fast: 50,000 free loads with a card on file, then $5 per 1,000. ExpressMaps gives twice the free quota with no card and flat plans after that, and because MapLibre GL JS is a fork of Mapbox GL JS, your existing map code needs a one-line change.

Pricing compared

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 volumeMapboxExpressMaps
Free tier50,000 loads with a card on file (5,000 without)100,000 loads, no card
100,000 loads$250Free
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.

How the billing differs

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.

What stays the same

  • The library. MapLibre GL JS is the open-source fork of Mapbox GL JS 1.x. The API is the same: new Map(), setStyle, markers, popups, addLayer, GeoJSON sources. Mapbox GL JS 1.x itself also works unchanged with our style URLs.
  • Vector tiles and styles. Our styles are standard MapLibre style JSON over an OpenMapTiles-schema tileset, the same lineage as Mapbox Streets v8 in structure. Custom styles you have written for Mapbox usually port with layer-name changes.
  • Rotation, tilt, high-DPI rendering, GeoJSON overlays, clustering, popups: all library features, all unchanged.

What Mapbox does that we do not

  • Satellite imagery, 3D terrain and the Mapbox Standard style with 3D buildings.
  • Navigation SDKs, turn-by-turn routing, traffic data and the Search Box API at scale. We offer address autocomplete for display maps, not a routing product.
  • Mapbox Studio for designing styles in a browser. With ExpressMaps you edit style JSON yourself or with Maputnik.
  • Mobile SDKs with native rendering. Our tiles work in MapLibre Native on iOS and Android, but we do not ship an SDK of our own.

If you need those, keep Mapbox for them. Many customers move only the base map, which is where the volume and the cost are.

Switching from Mapbox

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.

Questions people ask

Does my Mapbox GL JS v2 or v3 code work?

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.

Can I keep my custom Mapbox style?

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.

Is there telemetry?

No. Mapbox GL JS v2+ sends usage events to Mapbox; MapLibre sends nothing anywhere, and our tiles set no cookies.

Start free with 100,000 loads See the live demo