---
title: "Network-map PMTiles archive (whole-European PT network, browsable pre-search)."
method: GET
path: "/tiles/network.pmtiles"
tags: ["map"]
---

# Network-map PMTiles archive (whole-European PT network, browsable pre-search).

`GET /tiles/network.pmtiles`

## Request

- Base URL: `https://pt-api.internal.example`
- URL: `https://pt-api.internal.example/tiles/network.pmtiles`
- Auth: none declared

A single static PMTiles v3 vector-tile archive (~1 GB) with layers `routes` (LineString, per GTFS route) and `stops` (Point, per canonical station), zoom 0–14. Designed for HTTP **Range** reads: PMTiles clients (MapLibre `pmtiles://`, protomaps-leaflet) fetch a few ~100–300 KB byte ranges per viewport — send a `Range: bytes=start-end` header and you get `206 Partial Content` with `Content-Range`. `Accept-Ranges: bytes`, `ETag` (size+mtime) and `Cache-Control: public, max-age=3600` are set; `If-None-Match` yields `304`. Rebuilt nightly and served by path, so a new build is picked up without a gateway restart (the ETag changes with it). A range-less GET streams the whole archive (not needed by clients). Layer/property schema: routes { mode, display_name, color, country, feed_id, trips_per_day }; stops { name, modes (`|`-joined), departures, country }. Per-feature minzoom is baked in (z0–5 rail/ferry trunk + major hubs; z6–9 regional; z10+ full network).

## Headers

- `Range` string

## Response `200`

Full archive (range-less GET; streamed).

## Other responses

- `206`: Partial content (a requested byte range).
- `304`: Not modified (matched If-None-Match).
- `404`: Archive not available (nightly build absent).
- `416`: Requested range not satisfiable.

---

[API](https://skmtc.dev/alltimetables/apis/european-journey-planner-api.md) · [All operations](https://skmtc.dev/alltimetables/apis/european-journey-planner-api/llms.txt) · [OpenAPI document](https://skmtc.dev/alltimetables/apis/european-journey-planner-api/revisions/3216e9384a8b?raw)
