Client Versioning (Semantic Version Header)
Scope note: this version header contract applies to external Link Org API requests (proto/org.proto). It does not define a SIL-specific version header contract.
This API uses semantic versioning via a request header to enable backward-compatible evolution without changing service or method names.
The API itself is versioned in the Git repository, and the client version header is used to safely negotiate behavior within a given API version.
Overview
Clients may optionally send their semantic version with each request using gRPC metadata:
link-semver: <semver>
Example:
link-semver: v1.4.2+7
If the header is omitted, the server assumes an unknown / legacy client and will default to the safest behavior.
Semantic Version Format
The value of link-semver must follow semantic versioning:
vMAJOR.MINOR.PATCH+BUILD
- MAJOR — breaking changes
- MINOR — backward-compatible feature additions
- PATCH — backward-compatible bug fixes
- BUILD — build or revision number (used for fine-grained comparisons)
Examples of valid versions:
v1.0.0v1.2.3v2.4.1+5
The leading v is required. Invalid or malformed versions, including ones without the v, cause the server to ignore the header.
How the Server Uses This Version
The server may conditionally enable behavior based on the minimum client version required for a feature.
Conceptually:
“Is the client running at least version
X.Y.Z(+B)?”
Version comparison is performed in the following order:
- Major
- Minor
- Patch
- Build
A client is considered compatible if its version is greater than or equal to the required version.
Backward Compatibility Guarantees
- Minor, patch, and build increments are always backward-compatible
- Breaking changes only occur across major versions
This means:
- Upgrading your client’s minor or patch version should never break existing integrations
- New features may be conditionally enabled for newer clients
- Older clients will continue to receive stable, compatible responses
Multiple Headers
Clients must not send more than one link-semver value per request.
❌ link-semver: v1.2.0
❌ link-semver: v1.3.0
If multiple versions are sent, the request may be rejected or treated as invalid.
Recommended Client Behavior
-
Always send
link-semveronce your client is versioned -
Treat unknown enum values (for example new
AuditTypevalues) as forward-compatible data; ignore/drop values you do not support -
Treat
ReceivedAuditpayload variants as forward-compatible data; new payload types may appear over time -
Increment:
- PATCH for bug fixes
- MINOR for backward-compatible features
- MAJOR only when explicitly coordinated with the server
-
Treat omission of the header as a legacy compatibility mode
Current Implementation Notes
The current public Link Org API has these important characteristics:
- Aliro support was added to the public Org API, including device configuration operations and Aliro credential assignment flows
- Aliro reader public keys are discovered through device summaries
- Audit stream payloads evolve over time, so clients should tolerate new
ReceivedAuditpayload variants and unknown enum values - Credential profiles are supported through the current Org API for generic DESFire configuration
When writing a client, prefer capability-based handling over assuming a fixed payload set forever.
Summary
- The API is versioned in the Git repository
- Client behavior is negotiated via the
link-semverrequest header - Versions follow strict semantic versioning
- The server enables features based on minimum client version
- This approach allows safe, incremental evolution without endpoint churn