Changelog
Notable changes to the Routal API and the developer portal. Subscribe to the RSS feed to track every release.
This is the running log of changes to the Routal API. Subscribe to the RSS feed to track every entry without coming back here.
The format is loosely Keep a Changelog. Entries are dated, grouped by type, and link to the relevant docs or endpoints. Breaking changes never ship on the current major — see Versioning below.
Versioning
Routal uses path-based versioning: the major version is the first segment after the host (/v2/, /v3/). The version you call is the contract you get — never silently upgraded under your feet.
Active versions
| Version | Status | Notes |
|---|---|---|
v2 | Stable — covers the full API surface used in production today. | Default for every endpoint in the API Reference unless otherwise noted. |
v3 | Selective — a small set of endpoints that re-shape v2 ergonomics (bulk creation, mostly). | Track the entries below for additions. |
What lives on v3 today
v3 endpoint | Use instead of |
|---|---|
POST /v3/vehicles (create many vehicles in one call) | Multiple calls to POST /v2/vehicle |
Everything else is on v2. v2 is not deprecated.
What counts as a breaking change
These changes only ship in a new major version:
- Removing or renaming a field in a response.
- Tightening a constraint (e.g. an optional field becomes required).
- Removing or renaming an enum value.
- Removing an endpoint.
- Changing an HTTP status code for an existing success path.
- Changing the shape or signing scheme of webhook payloads.
These are not breaking and can ship at any time on the current major:
- Adding a new optional request field.
- Adding a new field to a response.
- Adding a new endpoint.
- Adding a new enum value (handle unknowns defensively — see Forward compatibility).
- Adding a new webhook event type.
- Changing the human-readable
messagetext of an error (usemessage_idfor branching — see Errors).
Forward compatibility
Even on the same major version, your code should:
- Ignore unknown response fields. Deserializers should not reject payloads with extra keys.
- Handle unknown enum values defensively. A webhook can carry
type: "stop.something_new"; a stop status field can return a value you don't know yet. Treat unknown as "ignore" or "route to a dead-letter queue", not "throw". - Dedup webhook deliveries using
(event_id, data.id, data.updated_at)— the envelope doesn't carry a unique delivery ID today (Idempotency). - Don't hard-code response order unless the endpoint guarantees it. Stops in a route are ordered by
chain_position; other arrays are not guaranteed to keep their order between requests.
Deprecation — current status
Routal does not yet publish a formal deprecation timeline (notice period, sunset SLA, automatic 410 Gone responses). When an endpoint or field is going away we will:
- Announce it in the changelog entries below before the change ships.
- Mark it
deprecated: truein the OpenAPI spec. - Email customers whose tenants have called the deprecated surface recently.
If your integration depends on a behaviour that isn't covered by the changelog or the OpenAPI spec, contact us — we'd rather extend the contract than have you build around undocumented quirks.
OpenAPI spec — the source of truth
The machine-readable spec covers both versions:
/openapi.json— OpenAPI 3.0/llms.txt— index for LLM crawlers/llms-full.txt— full markdown dump
If you generate clients, point your codegen at this URL. The Routal backend also serves the same spec at https://api.routal.com/swagger.json (Swagger 2.0); the OpenAPI 3.0 version above is the recommended one for modern tooling.
2026-05-21 — Documentation accuracy pass
Changed
- Authentication: aligned the documented API-key fields and format with what the API actually returns (
label,active,created_at, keys prefixedapi_key_). The single auth error code ishighway.apiKey.error.not_found. - Errors: the machine-code table is now grouped by domain and lists only codes the API actually returns today. A handful of codes that had been documented without ever shipping are gone.
- Rate limits: updated to the real cap — 2,000 requests per minute per credential, global. The previous per-method breakdown and
Retry-Afterheader claim were not accurate to what the platform exposes. - Webhooks: rewritten against the real delivery behaviour — envelope (
{ created_at, project_id, event_id, meta, data }), event catalog (8 events withroutal.<context>.2.<resource>.<action>naming), and failure handling (5 → owner email, 50 → auto-disable). The previous mention of HMAC signing,X-Routal-*headers, and a retry-schedule table was aspirational; none of that is implemented today. - Quickstart: corrected example responses against the real
VehicleData/PlanResponseDataschemas.project_idis required for bothGET /v2/vehiclesandPOST /v2/plan.
Added
<EnumTable>,<SchemaFieldsTable>,<OperationQueryParams>— components that pull values straight from the OpenAPI spec at build time, so enums and defaults can never drift silently from/openapi.json.- A build-time drift check that fails CI if any prose claim no longer matches the spec — 27 claims tracked at launch.
2026-05-21 — Developer portal launch
Added
developers.routal.comgoes live with a curated API reference auto-generated from the OpenAPI spec.- Dedicated pages for Authentication, Errors, Rate limits, and Webhooks.
- New conceptual content: Resource lifecycle, Pagination, Idempotency, and a Versioning policy in this changelog.
- Machine-readable assets for LLM crawlers and codegen:
/openapi.json,/llms.txt,/llms-full.txt.
Changed
- The recommended OpenAPI surface is now
https://developers.routal.com/openapi.json(OpenAPI 3.0). The backend still serves Swagger 2.0 athttps://api.routal.com/swagger.json, but tooling should consume the converted 3.0 version.
Subscribe
- RSS — /changelog/rss.xml
- Email — drop a line at developers@routal.com to be added to the developer announcements list.
- Status incidents — routal.statuspage.io (separate from this changelog).
Reporting a regression
If a recent release broke your integration, email developers@routal.com with the endpoint, the request, and the response. Tag it [regression] in the subject line — those go to the on-call queue.
