Skip to content
From MapTiler

Migrate from MapTiler to Maptoolkit

This is about as small as a migration gets. Both services are MapLibre-native, both serve OpenMapTiles-lineage vector tiles, and both are driven by a style URL with a key on it. For a map using a stock style and no custom layers, the migration is one URL.

That makes the mechanics the least interesting part of this page, so most of it is about the differences that decide whether the move is worth making at all.

What maps to what

MapTilerMaptoolkitWhat differs
MapTiler SDK JSMaps JS or MapLibre GL JSBoth are MapLibre wrappers. Plain MapLibre works with either service
Vector tiles and stylesVector TilesDifferent schema. See below
Raster tilesRaster TilesSame XYZ scheme
Static Maps APIStatic Maps APIDifferent parameter names
Terrain RGBTerrain TilesBoth Terrarium encoded, so the source config carries over
Geocoding APIGeocoding APIForward and reverse
ElevationElevation APIPoint lookups

What Maptoolkit has that MapTiler does not

  • Outdoor cartography with the difficulty grades in the tiles. The road layer carries sac_scale, mtb_scale, via_ferrata_scale, walking_network, cycling_network, surface, bicycle and access. That is what the Hiking and Cycling styles draw from, and it is the difference between a topographic-looking basemap and one you can filter by trail difficulty. See Outdoor tags.
  • Cycling node networks. The numbered junction networks used across the Benelux and parts of Germany are drawn as their own layer.
  • A Weather API, both as map layers and as coordinate lookups.
  • Route Enhancement and Map Matching, for elevation profiles, surface tags and snapping recorded tracks to the network.
  • Routing, isochrones and matrices as first-party services.

What MapTiler has that Maptoolkit does not

Stated plainly, because these are the reasons not to migrate.

  • Satellite and aerial imagery. There is no Maptoolkit equivalent. If your map has an aerial layer or a hybrid style, you will need to source imagery elsewhere and keep it as a separate raster source.
  • A self-service visual style editor. MapTiler Customize has no counterpart on a Maptoolkit account. Styles are edited as JSON, and custom cartography is an Enterprise arrangement.
  • Self-service dataset hosting. Uploading your own data and having it served back as tiles is not offered.
  • Broader geocoding coverage and a larger ready-made style catalogue.
  • Their own SDK ecosystem, including the geocoding control and the various SDK helpers. Plain MapLibre equivalents exist for most of it, but they are not drop-in.

The style URL

  const map = new maplibregl.Map({
    container: "map",
-   style: "https://api.maptiler.com/maps/streets-v2/style.json?key=MAPTILER_KEY",
+   style: "https://styles.maptoolkit.net/maptoolkit/maptoolkit.street.json?api_key=YOUR_API_KEY",
    center: [16.37, 48.21],
    zoom: 12
  });

Seven styles ship: Summer, Winter, Hiking, Cycling, Street, Light and Dark. Summer is the topographic default and has no direct MapTiler counterpart; Street, Light and Dark are the closest matches to Streets, Basic and Dark Matter.

If you use the MapTiler SDK rather than plain MapLibre, swap it for maplibre-gl at the same time. The SDK is built around MapTiler’s own endpoints and key handling, so keeping it while pointing at another provider fights the library.

Where the schemas diverge

Both schemas descend from the OpenMapTiles lineage, so the broad shape is familiar: a water layer, a building layer, labels split by feature type. The names are not the same, though, and neither are the field values. Any custom layer you wrote against MapTiler’s source-layer names needs remapping, and a layer that references a field that does not exist renders nothing rather than erroring.

The Schema Reference lists every layer, field and allowed value. Work through your style’s custom layers against it before switching; that check is the bulk of the migration for a customised map, and it is the step most often skipped.

Vector tiles are 512px and served as .mvt.

Terrain carries over

Both services use Terrarium encoding, so unlike the Mapbox migration the source config needs only a URL change:

  map.addSource("terrain", {
    type: "raster-dem",
-   url: "https://api.maptiler.com/tiles/terrain-rgb-v2/tiles.json?key=MAPTILER_KEY",
+   url: "https://tiles.maptoolkit.net/terrainrgb.json?api_key=YOUR_API_KEY",
    encoding: "terrarium"
  });

What bites on day one

  • Errors are text/plain. A missing key returns 403 Access denied!, an unrecognised key 403 Api-key not found!, a key without access to that service 403 Api-key not authorized!. Not JSON.
  • The key parameter is api_key, not key. A find-and-replace on the host alone leaves every URL failing with 403 Access denied!, which reads like a key problem rather than a parameter-name problem.
  • Attribution is a license condition. Maptoolkit and OpenStreetMap stay visible. In MapLibre, AttributionControl defaults to compact: true, which collapses the credit behind a button as soon as the map is dragged. Set compact: false to keep it readable.
  • A tile outside a source’s zoom range returns 404 Tile not found, not an empty tile. Check the zoom ranges on Vector Tiles before reading a 404 as missing data.

Doing it in stages

  1. Swap the style URL on a stock style and confirm the map renders. For an uncustomised map this may be the whole migration.
  2. Replace the MapTiler SDK with maplibre-gl if you are using it.
  3. Work your custom layers through the Schema Reference, one at a time.
  4. Move terrain, which is a URL change.
  5. Move the service APIs behind a flag.
  6. Decide what happens to any aerial layer, which has no equivalent here.
  7. Check attribution renders on every map, at every breakpoint, after a drag.

Pricing

Self-service plans are billed through RapidAPI. See RapidAPI for how to subscribe and authenticate. Plan allowances and prices are on the Maptoolkit pricing page. Enterprise customers call the native hosts with a Maptoolkit API key.

Tile requests and API requests are metered separately and at different rates.