Vector Tiles

Mapbox Vector Tiles of OpenStreetMap, filtered by tag at request time. Draw only the cafes, only the bike lanes, only what your map needs.

How it works

1

Describe the data

Tag filters, layers and properties in the tile URL, or a PlazaQL search(...).

2

Plaza renders the tile

PostGIS ST_AsMVT over the Shortbread layers, clipped and simplified for the zoom level.

3

Your map draws it

Gzipped MVT with cache headers, ready for MapLibre, Mapbox GL or deck.gl.

See it in action

Live tiles, rendered from Plaza's database as you pan.

search(nwr, amenity: "cafe").fields("name", "cuisine")

Who uses this

Teams building with Vector Tiles.

Thematic maps

A map of only EV chargers, only wheelchair-accessible venues, only drinking water.

Data-heavy dashboards

Thousands of features per view without shipping a GeoJSON file to the browser.

Your own basemap

Plaza's style or yours, on Shortbread layers, credited to OpenStreetMap alone.

25

Shortbread layers

2-22

Zoom range

5,000

Free tiles / day

gzip

Compressed MVT

What you can build

Example apps powered by Vector Tiles.

Accessibility Map

Overlay every venue with a wheelchair tag on a light basemap.

Vector Tiles PlazaQL

Cycling Planner

Bike lanes and parking as tiles, routes from the directions API.

Vector Tiles Directions

Store Locator

Your stores from a custom dataset, competitors from OSM tiles.

Vector Tiles Custom Datasets

Start building

curl -g -H "X-API-Key: YOUR_API_KEY" "https://plaza.fyi/api/v1/tiles/14/4823/6160?tags[amenity]=cafe&properties=name,cuisine" --compressed -o cafes.mvt
View endpoints
Method Path Description
GET /api/v1/tiles/:z/:x/:y One vector tile; filter with tags[key]=value, layers, properties, element_types
GET /api/v1/tiles.json TileJSON 3.0 for the same filters (no API key)
GET /api/v1/tiles/style.json MapLibre style over the Shortbread layers (no API key)
POST /api/v1/query The same tile from PlazaQL: search(...).tile(z, x, y)

How it compares

Static tilesets: to show only one kind of place you build and host a new tileset, then rebuild it when the data changes
Plaza: add tags[amenity]=cafe to the tile URL. Every filter combination works, no build step
OpenMapTiles schema: CC-BY, so every map has to credit OpenMapTiles
Plaza: the Shortbread schema is CC-0. You credit OpenStreetMap contributors and nobody else
Self-hosted PMTiles: a snapshot that is as old as your last planet build
Plaza: tiles are rendered from the database that daily OSM diffs update, and cached tiles in an edited area are dropped when a diff lands

Common questions

How are tiles billed?

Each tile is one standard request against a paid plan's monthly allocation ($0.50 per 1,000 after that). The free plan has its own budget of 5,000 tiles a day, separate from its 500 standard requests. Tiles also get their own per-minute rate limit, from 120 a minute on free to 20K on Enterprise, because one map pan loads 10 to 30 tiles.

Is there a free, unmetered basemap?

Not yet. Today the basemap layers in our style are dynamic tiles too, metered like any other tile. A pre-built planet basemap you can load without a key is planned. Until then you can point the style at any Shortbread basemap and use Plaza only for the filtered overlay.

Which filters can I use?

tags[key]=value matches a tag exactly and tags[key]=* matches any value (up to 10, all must match). layers picks Shortbread layers, properties picks which tags land in each feature, and element_types limits the tile to nodes, ways or relations. Every one of them has a PlazaQL equivalent: search(node, amenity: "cafe").fields("name").tile(z, x, y, layers: [...]).

How fresh are the tiles?

They are rendered from the same database that answers every other Plaza request, which applies OpenStreetMap diffs daily. When a diff lands, cached tiles over the edited area are dropped on every server. Browsers may keep a tile for 5 minutes and shared caches for up to an hour (4 hours at zoom 10 and below).

Does it work with MapLibre and Mapbox GL?

Yes. The tiles are standard Mapbox Vector Tiles (spec 2.1). Point MapLibre at /api/v1/tiles/style.json, or add /api/v1/tiles.json as a vector source in your own style, and send your key with tile requests through transformRequest.