---
title: "Sign a tile-server URL."
method: GET
path: "/tiles/v1/token"
tags: ["Tiles"]
---

# Sign a tile-server URL.

`GET /tiles/v1/token`

## Request

- Base URL: `https://api.rijwind.com`
- URL: `https://api.rijwind.com/tiles/v1/token`
- Auth: HTTP bearer

Returns a short-lived, IP-bound signed URL for the vector basemap. Feed it to MapLibre's `pmtiles://` protocol handler. Pass a stable `session` id (one per map instance) so background URL refreshes within the session are billed once — the `@rijwind/sdk` tile-session helper manages this for you.

**Quota cost:** 1 unit per tile session; refreshes within the same session are free. Omit `session` to be billed per request instead. Adding the live traffic layer (`?traffic=`) costs 1 extra unit per session. The response also always carries a `buildings` block — access to the 3D buildings tilesets with each covered country's bounding box — and an `imagery` list of every satellite / aerial archive in the session, both free within the session (the SDK consumes them for 3D buildings and the Satellite / Hybrid styles).

## Query parameters

- `session` string
- `traffic` string

## Response `200`

Signed URL.

- SignedTileUrl: Short-lived signed URL pointing at the basemap on `cdn.rijwind.com`. The signature is bound to the requester's IP and expires after a short TTL — refresh it within a tile session rather than re-signing on a fixed schedule (the `@rijwind/sdk` tile-session helper does this for you).
  - `buildings` BuildingsAccess, required: Access descriptor for the 3D-buildings tilesets (OGC 3D Tiles, real roof shapes): a CDN base URL plus a signed query string that validates for every tileset artifact beneath it. The `@rijwind/sdk` `Map` consumes this automatically when 3D buildings are shown.
    - `baseUrl` string, required: Buildings CDN origin to prepend to tileset paths.
    - `countries` string[], required: Countries with 3D-building coverage (ISO 3166-1 alpha-2). The tileset for a country lives at `{baseUrl}/{CC}/tileset.json`.
    - `coverage` object, required: Bounding box `[west, south, east, north]` (WGS84) per covered country — use it to load a country's tileset only when the viewport reaches it.
    - `expiresAt` integer, required: Unix timestamp (seconds) when the signature expires.
    - `query` string, required: Signed query string — append after `?` on any tileset artifact URL.
  - `expiresAt` integer, required: Unix timestamp (seconds) when the signature expires.
  - `imagery` ImageryLayer[], required: Every satellite / aerial imagery archive available to this session, bottom → top: draw them in this order (later entries above earlier ones — country aerials, highest resolution last). The named `satellite…Url` fields above point at the same archives and stay for existing integrations; new countries only appear here. Empty when no imagery is available. Same session, no extra quota cost.
    - `attribution` string, nullable: Required credit as an HTML snippet — put it in the source's `attribution` so it shows in the map's attribution control. `null` when the source needs none.
    - `bounds` number[], nullable: `[west, south, east, north]` (WGS84); `null` = global.
    - `country` string, nullable: Country the archive covers (ISO 3166-1 alpha-2); `null` = global.
    - `id` string, required: Stable identifier of the archive (also a good MapLibre source id).
    - `maxzoom` integer, nullable: Deepest zoom with tiles; beyond it the layer is overzoomed.
    - `minzoom` integer, nullable: Lowest zoom with tiles (cross-fade an `aerial` layer in over the half zoom level above it).
    - `region` string, nullable: Optional part of the country, e.g. `Caribisch Nederland`.
    - `role` string, nullable: Where it sits in the stack: `base` (fills open ocean and the poles), `mosaic` (global satellite), `ocean` (water overlay — fade it out past ~z9), `aerial` (high-resolution country imagery).
    - `url` string, required: Signed archive URL; refresh together with the tile URLs.
  - `satelliteBaseUrl` string, nullable: Signed URL for the global base imagery archive (raster, z0–7) — ocean bathymetry and polar ice. Layer it BELOW the satellite source: the satellite mosaic covers land only, so this is what fills open water and the poles. Same session, no extra quota cost.
  - `satelliteBesUrl` string, nullable: Signed URL for the Caribbean Netherlands aerial archive (raster, z13–21). A separate source from the mainland one — it reaches a deeper zoom — layered the same way. Same session, no extra quota cost.
  - `satelliteNlUrl` string, nullable: Signed URL for the high-resolution Netherlands aerial archive (raster, z13–18) — layer it above the global satellite source. Same session, no extra quota cost. Kept for existing integrations; `imagery` lists this archive and every other covered country.
  - `satelliteOceanUrl` string, nullable: Signed URL for the water-only overlay (raster, z0–7). Draw it ABOVE the satellite source and fade it out past ~z9: the satellite mosaic covers water poorly, so this renders the sea instead. Same session, no extra quota cost.
  - `satelliteUrl` string, nullable: Signed URL for the global satellite imagery archive (raster, z0–13). Feed it to a MapLibre `raster` source for the Satellite / Hybrid styles. Present once satellite imagery is available on the account's region; rendering it is part of the same tile session, so it adds no quota cost. Refresh together with the tile URLs.
  - `terrainUrl` string, required: Signed URL for the optional terrain (elevation) archive — feed it to a MapLibre `raster-dem` source with `encoding: "terrarium"` for hillshade or 3D terrain. Shares this session's expiry; refresh both together. Rendering terrain is part of the same tile session, so it adds no quota cost.
  - `traffic` TrafficAccess: Access descriptor for the live traffic layer: a CDN base URL plus a signed query string that validates for every traffic artifact (geometry tiles, live state, incidents) beneath it.
    - `baseUrl` string, required: Traffic CDN origin to prepend to artifact paths.
    - `countries` string[], required: Countries included in this grant (ISO 3166-1 alpha-2).
    - `expiresAt` integer, required: Unix timestamp (seconds) when the signature expires.
    - `query` string, required: Signed query string — append after `?` on any artifact URL.
  - `url` string, required: Signed URL ready to feed to MapLibre's `pmtiles://` protocol handler.

## Other responses

- `401`: Missing, malformed, or revoked API key.
- `403`: Origin not in the project's allow-list.
- `429`: Monthly quota exhausted (hard-cap plans only).

---

[API](https://skmtc.dev/rijwind/apis/rijwind-api.md) · [All operations](https://skmtc.dev/rijwind/apis/rijwind-api/llms.txt) · [OpenAPI document](https://skmtc.dev/rijwind/apis/rijwind-api/revisions/01d72fb6aa4d?raw)
