Map Tiles
Overview
geocodeme.net serves raster and vector map tiles across Europe (rendered from OpenStreetMap data), the natural companion to the geocoding and routing APIs, so your whole map stack runs on one provider and one API key.
Raster tiles are standard 256×256 images in the XYZ scheme ({z}/{x}/{y}),
served as PNG or WebP, in a light or a dark style, and compatible with every
mainstream map library: Leaflet, flutter_map, MapLibre GL, OpenLayers.
Vector tiles are covered further down.
GET https://tiles.geocodeme.net/{style}/{z}/{x}/{y}[@2x].{format}?api_key=YOUR_KEY
| Parameter | Description |
|---|---|
style | streets (light, OSM Bright) or streets-dark (dark theme, ideal behind a dark UI). |
z, x, y | Standard XYZ tile coordinates (Web Mercator). |
@2x | Optional retina suffix: 512×512 rendering for high-DPI screens. |
format | png or webp. Same tile, same price: WebP is typically 30 to 60% lighter, and every modern browser and mobile framework decodes it natively. Pick webp unless you must support very old clients. |
api_key | Your API key, as a query parameter or X-API-Key header. |
Two ways to authenticate, drawing from the same plan limits:
?api_key=: for servers and web apps that can keep a key private.?token=: a short-lived JWT signed by your backend, built for mobile apps where an embedded key could be extracted. See Signed Tile Tokens.
Tiles are rendered from the same European OpenStreetMap extract that backs the
geocoding dataset, so the rendered area is
Europe. The five French overseas regions have their own geocoding and
routing instances, but they are not part of the tile dataset yet; tiles
outside the rendered area return 404. Zoom levels up to 20 are rendered
(from z14 vector data).
Quotas & rate limits
Map tiles are metered separately from geocoding requests; a map view loads 15 to 30 tiles at once, so they never eat into your geocoding quota.
| Plan | Tiles / month | Tiles / second |
|---|---|---|
| Free | 50,000 | 25 |
| Startup | 750,000 | 100 |
| Growth | 2,500,000 | 150 |
| Pro | 7,500,000 | 200 |
Only tiles that reach our servers count against your quota: responses served
from the CDN edge cache are free. Exceeding a limit returns 429 with a JSON
error body; an invalid or missing key returns 401.
Usage examples
- Leaflet
- flutter_map
- MapLibre GL JS
L.tileLayer(
'https://tiles.geocodeme.net/streets/{z}/{x}/{y}.png?api_key=YOUR_KEY',
{
attribution:
'© <a href="https://openmaptiles.org/">OpenMapTiles</a> © <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors',
maxZoom: 20,
}
).addTo(map);
TileLayer(
urlTemplate:
'https://tiles.geocodeme.net/streets/{z}/{x}/{y}{r}.png?api_key=YOUR_KEY',
// {r} resolves to "@2x" on high-DPI screens
retinaMode: RetinaMode.isHighDensity(context),
userAgentPackageName: 'com.example.app',
),
// Attribution (required, see below):
RichAttributionWidget(
attributions: [
TextSourceAttribution('© OpenMapTiles © OpenStreetMap contributors'),
],
),
const map = new maplibregl.Map({
container: 'map',
style: {
version: 8,
sources: {
geocodeme: {
type: 'raster',
tiles: [
'https://tiles.geocodeme.net/streets/{z}/{x}/{y}.png?api_key=YOUR_KEY',
],
tileSize: 256,
attribution: '© OpenMapTiles © OpenStreetMap contributors',
},
},
layers: [{ id: 'geocodeme', type: 'raster', source: 'geocodeme' }],
},
center: [2.35, 48.86],
zoom: 11,
});
Every example above works unchanged with the streets-dark style and with the
.webp extension; a common setup is to switch the URL template on the app's
theme, streets in light mode and streets-dark in dark mode.
Vector tiles
Alongside raster tiles, geocodeme.net serves vector tiles: Mapbox Vector
Tiles (.pbf) in the OpenMapTiles schema,
covering the same regions as the raster tiles:
GET https://tiles.geocodeme.net/vector/{z}/{x}/{y}.pbf?api_key=YOUR_KEY
Why go vector? Tiles are far lighter than PNGs, render crisply at any zoom or rotation, and the map is styled client-side (brand colors, dark mode, showing or hiding layers), all without a single extra server request.
Vector tiles require the Startup plan or above (the vector_tiles
capability). On the Free plan, requests return 403 PLAN_UPGRADE_REQUIRED,
a plan error, distinct from the 429 you get when hitting rate or quota
limits, and it never consumes quota.
Authentication is identical to raster tiles: ?api_key= for servers and web
apps, or a signed ?token= for mobile apps (see
Signed Tile Tokens), and vector tiles draw from the same
tile quotas.
Bring your own style
The server intentionally does not host a style.json, glyphs, or sprites:
you bring your own MapLibre style and point its source at the tile URL. Any
style built for the OpenMapTiles schema works; just replace its sources
block with:
{
"sources": {
"geocodeme": {
"type": "vector",
"tiles": [
"https://tiles.geocodeme.net/vector/{z}/{x}/{y}.pbf?api_key=YOUR_KEY"
],
"minzoom": 0,
"maxzoom": 14
}
}
}
and bundle the style's glyphs and sprites with your app. The attribution requirement below applies to vector tiles too.
Attribution (required)
Map data is © OpenStreetMap contributors, licensed under the
ODbL, rendered with the
OpenMapTiles schema. Your map must display
the attribution © OpenMapTiles © OpenStreetMap contributors; every
library above has a built-in attribution control.
Caching
Tiles are immutable between monthly dataset refreshes and are served with
Cache-Control: public, max-age=86400. Let your HTTP client or map library
cache them; it makes your map faster and stretches your quota.
Errors
| Status | Meaning |
|---|---|
401 INVALID_API_KEY | Missing, invalid, or revoked API key. |
403 PLAN_UPGRADE_REQUIRED | Vector tiles requested on a plan that does not include them. |
404 NOT_FOUND | Tile outside the rendered area, unknown style, or malformed path. |
429 RATE_OR_QUOTA_EXCEEDED | Tile rate limit or monthly tile quota exceeded. |