API managementTemplate3 min readUpdated September 2026

API Versioning Strategy: A Fill-In Policy for Your Team

An API versioning strategy answers four questions: what counts as a breaking change, where the version number lives, how long old versions keep working, and how clients hear about changes. Write those four answers down before you ship a second version.

Most versioning pain comes from skipping the first question. Teams argue about URL paths versus headers while quietly making breaking changes in "minor" releases. The outline below is meant to be copied into a one-page internal policy and edited.

Vendors Covered in this Article

Disclosure: We may earn a commission if you buy through some links on this page. It doesn't change what we recommend.

What counts as a breaking change?

Define this in writing, because engineers disagree on the edge cases. A change is breaking if a correct, existing client can stop working without modification. Treat these as breaking:

  • Removing or renaming a field, endpoint, or enum value.
  • Changing a field's type, format or units, including turning a number into a string.
  • Making an optional request field required, or tightening validation.
  • Changing the meaning of an existing value or an error code that clients branch on.
  • Changing authentication or pagination behavior.

Treat these as safe: adding an optional request field, adding a response field, and adding a new endpoint. That rule only holds if you tell clients to ignore unknown fields, so state it in your docs.

Where should the version live?

Three placements are common, and each has a tradeoff:

  • URL path (`/v2/orders`): obvious, easy to route at a gateway, easy to see in logs. Changing a version changes every URL, which some teams dislike.
  • Request header or media type: keeps URLs stable and is more purist. It's harder to test in a browser and easy for clients to forget.
  • Date-based version header: the client pins a date and gets the behavior from that day. Good for frequent small changes, but you need infrastructure to maintain each behavior snapshot.

For a small team with a public API, the URL path is the pragmatic default. Version the whole API at once rather than per endpoint, so customers have one number to track.

How to write your deprecation policy

Fill in this outline and publish it:

  1. Announcement: how far ahead you'll notify clients before removal, and through which channels (changelog, email to the account owner, response header).
  2. Support window: how long the previous version keeps working after the new one is stable. Pick a period you can afford to run two versions.
  3. Signals: add a Deprecation or Sunset header to old-version responses so clients can detect it in code.
  4. Usage tracking: log which keys still call the old version so you can contact them directly before shutting it off.
  5. Shutdown: a date, a final warning, and an agreed exception process for large customers.

Say your window is twelve months. That number matters less than sticking to it. A policy you break once teaches customers to ignore your announcements.

How do you run two versions without doubling the work?

Keep one core implementation and translate at the edge. The new version's logic is the source of truth, and the old version is a thin adapter that reshapes requests and responses. A gateway such as Kong or Apigee can route by version, but the translation logic usually belongs in your code, where tests can reach it.

Avoid copying the whole codebase for v1. That path leads to two sets of bugs. Contract tests that run against both versions on every build catch the drift early.

Which mistakes cause the most client pain?

Watch for these patterns:

  • Shipping a breaking change under the same version because "nobody uses that field". Check logs before deciding, and even then, version it.
  • Bumping the major version for every small change, so nobody knows what the number means.
  • Deprecating with no replacement documented. Every deprecation needs a migration note that shows old call, new call.
  • No changelog. A public, dated list of changes is the cheapest way to build trust.

A useful habit is a standard changelog entry: the date, the version affected, what changed, whether it's breaking, and the exact old and new call. Post it where developers already look, and email account owners for anything breaking. Clients forgive change they were told about early and plainly.

Link your versioning rules to how you structure logs, since version and client ID in every request log line make the usage tracking step possible.

Executive Capability Standard

What Good Looks Like

A written policy defines breaking changes, states where the version lives and how long old versions run, and the team follows it without exceptions.

Building The Capability (5-Stage Skill Ladder)

1. Learn:Read how well-known public APIs version and deprecate, and note which conventions clients already expect.
2. Do Manually:Draft a one-page policy and audit your current API for changes that would count as breaking.
3. Delegate:Give an API owner sign-off on every change to the public contract and on deprecation notices.
4. Automate:Add contract tests and a schema diff check to CI that fails on breaking changes to the current version.
5. Buy:Use an API gateway to route by version and report which clients still call deprecated versions.

How to Get Started

Disclosure: We may earn a commission if you buy through some links on this page. It doesn't change what we recommend.

Kong

Fits when you want to route /v1 and /v2 traffic to different backends at one gateway layer.

Visit Kong→
Apigee

Fits when you need API product management, per-client analytics and a developer-facing catalog alongside version routing.

Visit Apigee→

Frequently Asked Questions

What is the best way to version a REST API?

For most small teams, put a major version in the URL path, such as /v2, and version the whole API together. It's easy to route, log and debug. Header-based versions are valid but harder for clients to discover and test.

How long should you support an old API version?

Long enough for typical customers to plan and ship a migration, and no longer than you can afford to run both. Publish the period in your policy and keep to it. Larger customers may need a documented exception process.

Is adding a field to an API response a breaking change?

Usually not, provided your documentation tells clients to ignore fields they don't recognize. Removing, renaming or changing the type of a field is breaking. State the rule in your docs so client authors write tolerant parsers.

Do internal APIs need versioning?

Often a lighter version. When you control every caller, you can coordinate changes with deploy order and contract tests. Once other teams or external parties depend on an API, treat it like a public one.

About the numbers

This guide doesn't quote a sourced benchmark. Figures in it are estimates or general guidance, so check them against your own numbers.

Related Guides