# Changelog | Rijwind docs

# Changelog

We follow semantic versioning at the API level — paths are stamped (`/v1`,
later `/v2`). v1 will keep working for at least 12 months after a v2
announcement.

Material breaking changes are announced by email at least 30 days in
advance. Everything else (additive endpoints, new optional parameters,
extra response fields) ships continuously.

---

## Unreleased

**Breaking — wire format**

- All JSON response fields now use **camelCase** keys instead of
  snake_case (`statusMessage`, `expiresAt`, `sourcesToTargets`,
  `fromIndex`/`toIndex`, `minLat`/`minLon`/`maxLat`/`maxLon`,
  `beginShapeIndex`/`endShapeIndex`). URL query parameters stay
  snake_case to match the convention used by Stripe, GitHub, and
  most major APIs. Update any client that parses these fields by
  name — generated SDKs (incl. `@rijwind/sdk`) pick this up
  automatically on the next `npm install`.

**Breaking — URL scheme**

- Endpoints now use **product namespaces** with the version inside each
  path — `/search/geocode/v1/{forward,autocomplete,reverse}`,
  `/directions/v1`, `/directions-matrix/v1`, `/isochrone/v1`,
  `/tiles/v1/token` — instead of a single shared `/v1/...` prefix. The old
  uniform paths have been retired. Update any hard-coded URLs;
  `@rijwind/sdk` picks the new paths up automatically.

**Added**

- `POST /map-matching/v1` — **map matching**. Snap a noisy GPS trace to the
  road network and get back a clean, route-shaped result. Trace capped at 100
  points (or pass an `encodedPolyline` for longer ones). 1 unit per call.
- `POST /optimized-route/v1` — **route optimization**. Find the optimal
  visiting order over a set of waypoints (a travelling-salesman solve); the
  first and last locations stay fixed. Capped at 20 locations, billed `N` units
  per call.
- `GET /styles/v1/{style}/static/{position}/{size}` — **static map images**.
  Render a map to a PNG, WebP, or JPEG from a single URL — center + zoom, a
  bounding box, or `auto`-fit, plus size, style, markers, paths, and circles —
  and drop it straight into an `<img>` tag. 1 unit per image, 2 for `@2x`.
  See [Static maps](/static-maps).

---

## v1.0 — 14 May 2026

The launch release. Seven endpoints across three surfaces.

**Added**

- `GET /tiles/v1/token` — short-lived signed URLs for the vector basemap,
  for use with MapLibre GL JS over the PMTiles protocol.
- `GET /search/geocode/v1/forward` — forward geocoding (address → coordinates).
- `GET /search/geocode/v1/autocomplete` — type-ahead variant, billed at 0.1 unit
  per call.
- `GET /search/geocode/v1/reverse` — reverse geocoding (coordinates → place).
- `POST /directions/v1` — turn-by-turn directions for car, bike, or pedestrian.
- `POST /directions-matrix/v1` — travel-time matrix, capped at `M × N ≤ 2500` pairs.
- `POST /isochrone/v1` — reachable-area polygons, capped at `L × C ≤ 4`.
- `GET /openapi.json` — full OpenAPI 3.1 spec at runtime, no auth, no
  quota cost.

**Authentication**

- Bearer tokens via the `Authorization` header (`rw_live_…` for
  production, `rw_test_…` for sandbox).
- Per-project allowed-origins whitelist with subdomain wildcards
  (`https://*.example.com`).

**Quota & billing**

- Per-user 30-day quota cycle with hard and soft cap modes; on a paid
  plan the cycle is anchored on your current billing anniversary, on
  the free plan it is anchored on your email-verification date. The
  exact next-reset moment is shown on the dashboard.
- Sub-unit costs supported (autocomplete = 0.1 unit) via integer-scaled
  Redis counters.
- EUR billing with mandate-based recurring payments via a regulated
  EU payment provider.
- Dashboard playground for live testing against your own keys.

**Compliance**

- All processing on EU-resident infrastructure.
- 30-day request log retention.
- Data Processing Agreement available click-through at
  [/legal/dpa](https://rijwind.com/legal/dpa).
- Privacy and Terms at [/legal/privacy](https://rijwind.com/legal/privacy)
  and [/legal/terms](https://rijwind.com/legal/terms).
