Skip to content
BDOT SOFTWAREBDOT Software

Insights / Architecture

API versioning without multiplying endpoints

Most API changes do not need a new version number. Compatibility comes from explicit contracts, additive evolution, and a measured deprecation path.

Kiran Bandarupalli · 2 Oct 2026 · 2 min read

Circuit traces on a board, a visual metaphor for stable interfaces between software components

Versioning is often introduced as a URL convention before anyone has defined what counts as a breaking change. The result can be several endpoints that differ only slightly, each needing fixes and documentation. Start with a compatibility policy instead.

Prefer additive evolution

Adding an optional response field is usually compatible if clients ignore fields they do not recognize. Adding a new endpoint can also be safe. More risky changes include renaming a field, changing its meaning or units, tightening accepted input, changing nullability, and changing ordering or pagination behavior that clients rely on.

Even an additive change can break a client with a strict decoder. Publish the expected behavior in the contract and test the clients that matter. For public APIs, use a schema format such as OpenAPI and validate generated examples in CI.

Separate wire compatibility from domain change

A stable external representation does not require the internal database model to remain frozen. Map between the public contract and internal types at the service boundary. This gives the application room to reorganize without exposing implementation details in every API response.

When a version is warranted

Use a new major version when clients cannot safely interpret the old and new behavior through an additive extension or a migration window. Document the differences, provide a transition period, and keep the old version only as long as it is supported and monitored.

Make retirement observable

  • Record which client versions call each deprecated behavior.
  • Publish the deprecation date and replacement path.
  • Use consumer contract tests for high-value integrations.
  • Remove the old behavior only after usage has moved or an agreed support window ends.

Versioning is not a substitute for communication. A small, explicit compatibility promise—and instrumentation to see whether clients still depend on a behavior—keeps both the API and the engineering workload manageable.