Add an uploaded raster tileset in Leaflet

Copy JavaScript and React examples for loading an uploaded raster tileset from Mappinest TileJSON in Leaflet.

Overview

This guide shows how to add an uploaded raster tileset in Leaflet through TileJSON. Leaflet can render raster XYZ tiles directly with L.tileLayer, so no vector-tile plugin is needed for this raster workflow.

If your tileset starts as an MBTiles or PMTiles file, upload it through the console first. See Upload Data for the full upload workflow, then return with the tileset Id and API key from API Keys & Access.

The example uses mappinest.countries-raster as the sample uploaded raster tileset. It fetches TileJSON first, then passes the returned raster tile template and max zoom to L.tileLayer.

For production, replace mappinest.countries-raster with your own tileset Id from the console. Use the Raster Tiles API page for the direct XYZ tile URL and raster endpoint details.

Tiles API raster tiles in Leaflet
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <title>Mappinest raster TileJSON with Leaflet</title>
  <link href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" rel="stylesheet" />
  <link href="https://unpkg.com/maplibre-gl@5/dist/maplibre-gl.css" rel="stylesheet" />
  <style>
    body { margin: 0; }
    #map { height: 100vh; width: 100vw; }
  </style>
</head>
<body>
  <div id="map"></div>
  <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
  <script src="https://unpkg.com/maplibre-gl@5/dist/maplibre-gl.js"></script>
  <script src="https://unpkg.com/@maplibre/maplibre-gl-leaflet@0.1.3/leaflet-maplibre-gl.js"></script>
  <script>
  
    const apiKey = 'YOUR_MAPPINEST_KEY';

    async function initMap() {
      // Fetch TileJSON first, then pass the returned raster tile URL to L.tileLayer.
      const tilejson = await fetch(
        `https://api.mappinest.com/v1/tiles/mappinest.countries-raster.json?key=${apiKey}`
      ).then((response) => response.json());
      const tilesUrl = tilejson.tiles?.[0];

      if (!tilesUrl) {
        throw new Error('TileJSON did not return a tile URL.');
      }

      const map = L.map('map').setView([0, 0], 1);

      L.maplibreGL({
        style: `https://api.mappinest.com/v1/styles/light/style.json?key=${apiKey}`,
        interactive: false
      }).addTo(map);

      // Raster tiles can be added directly with L.tileLayer.
      L.tileLayer(tilesUrl, {
        maxZoom: tilejson.maxzoom ?? 14,
        opacity: 0.9
      }).addTo(map);
    }

    initMap();
  </script>
</body>
</html>

URL patterns used in this example

The bold parameters are the values you replace. Prefer TileJSON as the integration request so the raster tile template and zoom metadata stay behind one URL.

Use caseURL patternDocs
Tileset TileJSON
https://api.mappinest.com/v1/tiles/{tilesetId}.json?key=YOUR_KEY
Direct raster tile URL
https://api.mappinest.com/v1/tiles/{tilesetId}/{z}/{x}/{y}.{format}?key=YOUR_KEY
Map style
https://api.mappinest.com/v1/styles/{styleId}/style.json?key=YOUR_KEY

Get your free API key in API Keys & Access, then replace YOUR_KEY in the example.

Common errors

SymptomWhat to check
Raster layer is blank
Open the TileJSON URL and confirm the tiles array contains a raster tile template.
Tiles appear at the wrong zoom
Check minzoom, maxzoom, and tile bounds in the TileJSON response.
Requests return 403
Check API key restrictions and allowed domains in API Keys & Access.

Last updated: June 24, 2026