Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Info
titleAPI VERSIONING IN A NUTSHELL

API versioning is done using SemVer 2.0.0: vx.y.z with x, y and z being numbers indicating MAJOR, MINOR and PATCH versions.

In addition to the target public API versions x.y.z, internally to the CAMARA project during the API release process version extensions are used for pre-releases (described in the section below):0.10.0

  • alpha API versions

  • release-candidate API versions

Finally,

  • work-in-progress (wip) is used as the API version before the first pre-release and between 2 pre-releasesas an exception, initial API versions (

  • IMPORTANT: CAMARA public APIs with MAJOR version x=0 ) may have (v0.x.y) MUST use both the MAJOR and the MINOR version number (v0.y), separated by a dot (".") , in the API version in the URLOAS servers/url field: v0.y, e.g. e.g. {apiRoot}/qod/v0.10

The following types of API versions are used throughout an API's release process:

  • work-in-progress (wip) API versions used before the first pre-release or between pre-releases. Having "wip" in the API version field indicates that PRs are ongoing and that the API is not usable by API consumers. The first PR should set the API version to wip, and the next "release PR" shall set the API version to the next (semver) x.y.z version.
  • alpha (x.y.z-alpha.m) API versions (with extensions) for CAMARA internal API rapid development purposes
  • release-candidate (x.y.z-rc.n) API versions (with extensions) for CAMARA internal API bug fixing purposes
  • public (x.y.z) API versions for usage in commercial contexts. Public API versions only have API version number x.y.z (semver 2.0), no extension. The public API can have one of two maturity states: 
    • initial (x=0) - indicating that the API is still not fully stable
    • stable (x=0x>0)stable - indicating that the API has reached a certain level of maturity (x>0)

The use of the different API versions throughout the API release process is illustrated in the following figure.

...

Note: in CAMARA v1.0.0 is considered the first stable public API, while API versions v0.y.z can be public, but are considered unstable (initial).

Precedence example:     0.10.0 < 1.0.0 < 2.0.0 < 2.1.0 < 2.1.1 < 3.0.0.

...

  • Once a stable public API version is created, the API version in the URL shall ONLY contain "vx", and never include an extension.
  • ExceptionIMPORTANT: For initial public API versions 0.y.z, the MINOR number may MUST be included in the URL, e.g. v0.y. A dot (".") is used for readability.
    • in this stage of the API development, y is used to indicate MAJOR (breaking) changes, and z is used to indicate MINOR (non-breaking) changes. Patches, if needed would also increase z. 
  • For alpha and release-candidate API versions, the API version extension shall be included in the URL, but without any hyphens or dots.
    • Example: in the URL of for an alpha API version 2.y.z-alpha.1, the version in the URL is v2alpha1, e.g. {apiRoot}/qod/v2alpha1.

API name

The API name is the segment in the url field in the OAS definition file before the segment holding the API version.

...

API version typePurpose & characteristics

work-in-progress (wip)

The purpose of a work-in-progress API version is to indicate that the API is unstable due to one or more PRs being committed, possibly resulting in temporary inconsistencies.

  • A work in progress (wip) API version has the following information in the API OAS definition file: 
    • Info object - version: wip (instead of x.y.z) 
    • Servers object - url: vwip (instead of vx)
  • A wip API version may exist in 2 cases
    • during the first introduction of a new API upto the creation of the first alpha API version
    • during the time that one or more Pull Requests (PRs) are committed after a given release of an API.
  • Between different PR commits, the API version remains "wip".
  • After or with the last PR commit, the API version and URL version are set to the next API version.
  • The maintainers of the API decide on the release (or not) of the resulting next API version, implying that its corresponding release assets will be created.

alpha (alpha)

The purpose of an alpha API version is to support rapid development of an API and the creation of test implementations for feedback purposes.

  • An alpha API version (x.y.z alpha.m) is an intermediate API version with changes with respect to a previous API version.

release-candidate (rc)

The purpose of a release-candidate API version is to allow for (only) bug fixing encountered during further API implementation testing. 

  • A release-candidate API version (x.y.z-rc.n) is a pre-release of an API version which is stabilized and intended to become the next public API version.
  • It shall be used to create API implementations and test the API and to create required release assets.

public

The purpose of a public API version is that it can be used by organizations outside CAMARA in application development and commercial contexts.

  • A public API version (x.y.z) can be more or less mature:
    • A public API version with x=0 is referred as an initial API version.
    • A public API version with x>0 is referred to as a stable API version.

initial

Initial public API versions only exist for new APIs.

  • They are API versions with x = 0 (0.y.z without version extension).
  • ExceptionIMPORTANT: for an initial public API version (with x=0), the API version in the URL may MUST also include the y (MINOR) version number v0.y (with the dot). This is to simplify the testing of different initial public API versions.

    For initial public API versions:  

    • An update due to a breaking change in a public API version 0.y.z results in a next public API version: 0.y+1.0. Example: 0.9.0 → 0.10.0

    • An update due to a non-breaking change results in an API version change from 0.y.z to API version 0.y.z+1. Example: 0.9.0 → 0.9.1

stable

Stable public API versions are public API versions with x > 0 (x.y.z without version extension).

Stable public API versions are the ones recommended for use in commercial applications. The user can expect that subsequent API versions will be backward-compatible with the one they are using, unless explicitly announced otherwise.

...

API version types in the release processAPI version
(OAS Info object)
initial (x=0) API version in URL (OAS Servers object)
stable (x>0) API version in URL (OAS Servers object)API version can be released
work-in-progresswipvwipvwipNo
alphax.y.z-alpha.mv0.yalphamvxalphamYes (internal pre-release)
release-candidate x.y.z-rc.nv0.yrcnvxrcnYes (internal pre-release)

public

x.y.z

v0.y

vx

Yes

Precedence examples for API versions throughout the release process:

...

  • For MAJOR or MINOR changes, the process is the same as for the creation of a public API version (see previous section), going through alpha and release-candidate API versions to create the updated public API version.
      For PATCH changes, the API Sub Project can decide to either
      • apply the CAMARA API release process, as for MAJOR and MINOR changes resulting in a new API version x.y.z+11.0.0 → 1.0MINOR: 0.9.0 → 0.9.1-alpha.1 → ... → 10.09.1-alpha.m → 10.09.1-rc.1 → ... → 10.09.1-rc.n → 10.09.1 (next stable initial public version)
      • MINOR: 1.0.0 → 1.1.0-alpha.1 → ... → 1.1.0-alpha.m → 1.1.0-rc.1 → ... → 1.1.0-rc.n → 1.1.0 (next stable public version)
      • MAJOR: 0.9.1 → 0.10.0-alpha.1 → ... → 0.10.0-alpha.m → 0.10.0-rc.1 → ... → 0.10.0-rc.n → 0.10.0 (next initial public version)
      • MAJOR: 1.1.0 → 2.0.0-alpha.1 → ... → 2.0.0-alpha.m → 2.0.0-rc.1 → ... → 2.0.0-rc.n → 2.0.0 (next stable public version)
    • For PATCH changes, the API Sub Project can decide to either
      • apply the CAMARA API release process, as for MAJOR and MINOR changes resulting in a new API version x.y.z+1
        • 2.0.0 → 2.0.1-alpha.1 → ... → 2.0.1-alpha.m → 2.0.1-rc.1 → ... → 2.0.1-rc.n → 2.0.1 (next stable public version)
      • apply a apply a short process to create a maintenance-release of the public API version.

    ...

    Semantic versioning on breaking changes:

    ...

    • deleting operations or actions on a resource. For example: POST requests on a resource are no longer accepted.
    • adding a new mandatory input parameters. For example: now, to register a resource, a new required field must be sent in the body of the request.
    • modifying or removing a mandatory parameter in existing operations (resource verbs). For example, when consulting a resource, a certain field is no longer returned, or a field that was previously a string is now numeric. (breaks existing payloads)
    • modifying or removing an endpoint (breaks existing queries)
    • changing input parameters from optional to mandatory. For example: when creating a Person resource, the age field, which was previously optional, is now mandatory.
    • modifying responses to existing operations.
    • adding new responses to existing operations. For example: creating a resource can return a 412 response code.

    ...

    • never change an endpoint name; instead, add a new one and mark the original one for deprecation in a MINOR change and remove it in a later MAJOR (see semver FAQ entry: https://semver.org/#how-should-i-handle-deprecating-functionality)
    • If possible, do the same for attributes
    • new fields should always be added as optional.
    • Postel's Law: “Be conservative in what you do, be liberal in what you accept from others”. When you have input fields that need to be removed, mark them as unused, so they can be ignored.
    • do not change the field’s semantics.
    • do not change the field’s order.
    • do not change the validation rules of the request fields to more restrictive ones.
    • if you use collections that can be returned with no content, then answer with an empty collection and not null.
    • layout pagination support from the start.

    How to avoid breaking changes (API consumer) ?

    • tolerant reader: if it does not recognize a field when faced with a response from a service, do not process it, but record it through the log (or resend it if applicable).
    • ignore fields with null values.
    • variable order rule: DO NOT rely on the order in which data appears in responses from the JSON service, unless the service explicitly specifies it.
    • clients MUST NOT transmit personally identifiable information (PII) parameters in the URL. If necessary, use headers

    Make the information available:

    ...

    • they can be ignored.
    • do not change the field’s semantics.
    • do not change the field’s order.
    • do not change the validation rules of the request fields to more restrictive ones.
    • if you use collections that can be returned with no content, then answer with an empty collection and not null.
    • layout pagination support from the start.

    How to avoid breaking changes (API consumer) ?

    • tolerant reader: if it does not recognize a field when faced with a response from a service, do not process it, but record it through the log (or resend it if applicable).
    • ignore fields with null values.
    • variable order rule: DO NOT rely on the order in which data appears in responses from the JSON service, unless the service explicitly specifies it.
    • clients MUST NOT transmit personally identifiable information (PII) parameters in the URL. If necessary, use headers

    Make the information available:

    • provide an access to the new API version definition file (via a link or dedicated endpoint)
    • if possible, do the same to obtain the currently implemented API version definition file

    Bearing in mind that APIs are continually evolving and certain operations will no longer be supported, the following considerations must be taken into account:

    • Agree to discontinue an API version with consumers.
    • Establish the obsolescence of the API in a reasonable period (6 months).
    • Monitor the use of deprecated APIs.
    • Remove deprecated APIs documentation.
    • Never start using already deprecated APIs.

    ...