nmtoken is right, you need to request capabilities from the server. In your case you just need to add `gkt` (key) parameter with valid key value to the request: https://gatekeeper1.geonorge.no/BaatGatekeeper/gk/gk.nib_utm32_wmts_v2?REQUEST=GetCapabilities&service=WMTS&gkt=gkt_value I sneaked gkt key from https://www.norgeskart.no/ site and got the following values (excerpt from GetCapabilities reply): <ows:Identifier>Nibcache_UTM32_EUREF89_v2</ows:Identifier> <ows:BoundingBox crs="urn:ogc:def:crs:EPSG::25832"> <ows:LowerCorner>-2000000.0 3500000.0</ows:LowerCorner> <ows:UpperCorner>3545984.0 9045984.0</ows:UpperCorner> </ows:BoundingBox> In your case origin (upper left corner) would be: origin: [-2500000.0, 9045984.0] And by the way, I never was able to get WMTS plugin to work correctly togeteher with proj4leaflet. I constructed WMTS tile request myself. In your case it would be something like: var gkt = 'gkt_value'; var url = 'http://gatekeeper{s}.geonorge.no/BaatGatekeeper/gk/gk.nib_utm32_wmts_v2?&gkt=' + gkt +'&layer=Nibcache_UTM32_EUREF89&style=default&tilematrixset=default028mm&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image%2Fpng&TileMatrix={z}&TileCol={x}&TileRow={y}'; var layer = new L.TileLayer(url, { subdomains: ['1', '2', '3'], maxZoom: 16, minZoom: 0, attribution: '' }); var resol = [ 21664, 10832, 5416, 2708, 1354, 677, 338.5, 169.25, 84.625, 42.3125, 21.15625, 10.578125, 5.2890625, 2.64453125, 1.322265625, 0.661132813, 0.330566406 ]; var crs = new L.Proj.CRS('EPSG:25832','+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs', { origin: [-2000000.0, 9045984.0], bounds: L.bounds( [-128543, 8015869], [1165657, 6381457]), resolutions: resol }); map = new L.Map('map', { crs: crs }); map.addLayer(layer); map.setView([59.877812, 8.590628], 5);