Skip to content

Versioning Strategy

APX uses a three-layer versioning model that keeps API identity, release versioning, and lifecycle metadata cleanly separated. Understanding these three layers is essential for releasing, consuming, and governing APIs across your organization.

The Three Layers

1. API Line (Compatibility Namespace)

The API line (v0, v1, v2, …) appears in the API ID and determines the compatibility scope:

proto/payments/ledger/v0    ← initial development, breaking changes expected
proto/payments/ledger/v1    ← all backward-compatible changes within v1
proto/payments/ledger/v2    ← breaking change from v1, new namespace

Rules: - Only backward-incompatible changes create a new API line for stable APIs. - v0 is a special line for initial development — breaking changes are allowed at any time (see v0 Policy below).

2. Release Version (SemVer)

Each API line can have multiple SemVer releases:

v1.0.0-alpha.1   ← early exploratory build
v1.0.0-beta.1    ← feature-complete preview
v1.0.0-rc.1      ← release candidate
v1.0.0           ← general availability (GA)
v1.1.0           ← additive change
v1.1.1           ← patch fix

Pre-release identifiers (-alpha, -beta, -rc) go in the version tag, not in the import path.

3. Lifecycle (Support Signal)

The lifecycle field communicates maturity and support level independently from the version number:

State Meaning Compatibility Production use
experimental Early exploration, API still forming No guarantee Not recommended
beta API surface is stabilizing Stabilizing — minor breaking changes possible Use with caution
stable Production-ready, fully supported Full backward compatibility within the line Recommended
deprecated Superseded, maintained for existing users Maintained — no new features Migrate away
sunset End of life, no further releases End of life Do not use

Note

preview is accepted as a backward-compatible alias for beta.

Why separate layers?

Each layer answers a different question:

Question Layer Example
What compatibility scope am I in? API line v0, v1, v2
Which build am I running? Release version 1.0.0-beta.1, 1.2.3
Is this safe to depend on in production? Lifecycle experimental, beta, stable

Without separating these, teams overload version strings to convey lifecycle meaning — which is fragile and confusing.

v0: Initial Development

APX supports v0 API lines for APIs that are still taking shape. SemVer defines major version zero as initial development where anything may change at any time.

v0 Policy

Rule Detail
Allowed lifecycles experimental or beta only
Breaking changes Allowed — bumps the minor version
Production use Not recommended
Promotion to stable Not permitted on v0; graduate to v1 instead

v0 Version Examples

0.1.0   ← first beta
0.2.0   ← breaking change (minor bump)
0.2.1   ← patch fix
0.3.0   ← another breaking change

When the API is ready for production, create the v1 line and release v1.0.0 with lifecycle stable.

Two Beta Workflows

APX supports two official workflows for pre-production APIs:

Workflow 1 — Rolling Preview (v0 + experimental)

For APIs that are still being shaped and may break frequently:

apx release prepare proto/payments/ledger/v0 \
  --version 0.4.0 --lifecycle experimental

Use this when: - The API is under active design iteration - Others may observe or consume it, but everyone understands it can break - You are not yet committed to a stable contract

Workflow 2 — Prerelease on Upcoming Stable Line (v1 + beta)

For APIs approaching GA that need integration testing:

apx release prepare proto/payments/ledger/v1 \
  --version 1.0.0-alpha.1 --lifecycle beta

apx release prepare proto/payments/ledger/v1 \
  --version 1.0.0-beta.1  --lifecycle beta

apx release prepare proto/payments/ledger/v1 \
  --version 1.0.0-rc.1    --lifecycle beta

apx release prepare proto/payments/ledger/v1 \
  --version 1.0.0          --lifecycle stable

Use this when: - You want beta users to test the actual v1 contract before GA - The API is mostly defined and you are converging toward a release - Pre-release labels (alpha, beta, rc) communicate release phase

Compatibility Promise

APX derives a compatibility promise from the API line and lifecycle:

API Line Lifecycle Compatibility Level Promise
v0 experimental None No backward-compatibility guarantee; anything may change
v0 beta None No backward-compatibility guarantee; breaking changes expected
v1+ experimental None No backward-compatibility guarantee
v1+ beta Stabilizing API surface is stabilizing; minor breaking changes possible
v1+ stable Full Full backward compatibility within the major version line
any deprecated Maintenance Bug fixes only; no new features; migrate to successor
any sunset End of life No further releases

This promise is shown when you run apx show:

$ apx show proto/payments/ledger/v1
# ...
Compatibility:
  Level:    full
  Promise:  full backward compatibility within the major version line
  Breaking: backward-incompatible changes are blocked on this line
  Use:      recommended for production

Why This Matters

Stable Import Paths

Consumers use the same import path from alpha through GA:

import ledgerv1 "github.com/acme/apis/proto/payments/ledger/v1"

Only the go get version changes:

go get github.com/acme/apis/proto/payments/ledger@v1.0.0-beta.1  # during preview
go get github.com/acme/apis/proto/payments/ledger@v1.0.0          # at GA

No Import Rewrites

Because alpha/beta is in the version, not the path, moving from pre-release to GA requires zero code changes — just a version bump in go.mod.

Go Module Versioning

APX follows Go's major version suffix convention:

API Line Go Module Path Go Import Path
v0 github.com/<org>/apis/<format>/<domain>/<name> github.com/<org>/apis/<format>/<domain>/<name>/v0
v1 github.com/<org>/apis/<format>/<domain>/<name> github.com/<org>/apis/<format>/<domain>/<name>/v1
v2 github.com/<org>/apis/<format>/<domain>/<name>/v2 github.com/<org>/apis/<format>/<domain>/<name>/v2

For v0 and v1, the module path has no version suffix (Go convention). For v2+, both module and import paths include the /vN suffix.

Inspecting Versions

# See the full identity and version info
apx inspect release proto/payments/ledger/v1@v1.0.0-beta.1

# Understand Go path derivation
apx explain go-path proto/payments/ledger/v1

# See lifecycle and compatibility details
apx show proto/payments/ledger/v1