Versioning Policy

How FreightUtils versions its REST API, MCP server, and tool contracts — and what you can rely on.

Semantic versioning · Stability contract · 3-month breaking-change notice

FreightUtils ships three things developers version against: a public REST API, an MCP server for agent use, and a tool contract — the input/output shape of each individual tool. This page explains how each is versioned and what stability means in practice.

REST API stability contract

The REST API at www.freightutils.com/api/* is the primary integration surface. It's unversioned in the URL (no /v1/) because all changes follow the stability contract below — a change that would break clients doesn't ship without notice.

What counts as a breaking change

What counts as additive (anytime)

Breaking-change notice

Breaking REST changes get at minimum 3 months notice via: (a) a changelog entry tagged API Change, (b) a deprecation entry, (c) Deprecation and Sunset response headers on affected endpoints, and (d) an email to holders of affected API keys.

MCP server — semantic versioning

The MCP server ships as freightutils-mcp on npm and follows semantic versioning:

The hosted Streamable-HTTP endpoint at www.freightutils.com/api/mcp mirrors the latest minor of the npm package within 24 hours of release. If you need a pinned version, use the npm package via npx freightutils-mcp directly. The legacy URL /api/mcp/mcp remains live for existing clients.

Tool contract stability

Each tool — whether called via REST, MCP, or the npm package — has its own contract: a stable set of inputs and a stable shape of outputs. Tools reach stability in stages.

Stability tiers

Subscribing to breaking-change notifications

Three channels, in order of recommended coverage:

Data versioning

Editioned reference datasets are versioned against their upstream source edition. Today the editions registry tracks 7 of them (adr, emissions, hs, ics2, incoterms, unlocode, validate); continuous datasets such as airlines and airports carry per-record verification dates instead of an edition. The edition served, the authority's current in-force edition and the date that was last checked are returned by the /api/health response under data_versions, and every response envelope carries the same three fields per dataset. Dataset refreshes are additive unless the upstream body itself removes entries (rare, signalled the same way as an API breaking change).

Questions

Contract unclear, spec ambiguous, or a change surprised you? Email contact@freightutils.com — that's always faster than guessing.