# From test to retirement

URL: /products/api/lifecycle · Id: `page:products/api/lifecycle`

> An API runs in test from its first merge, goes live with a deploy, grows by Changes and new versions, and keeps every pinned version serving.

An API runs in `test` from its first merged [Change](/business/nouns/change) and goes live when a [Version](/business/nouns/version) is deployed. After that it grows by Changes, each additive or shipped as a new major.

## From merge to retirement
| Where it is | What is true | Call | Emits |
| --- | --- | --- | --- |
| In test | Every merged Change is callable in `test` at once | [`Change.merge`](/business/nouns/change/merge) | `Change.merged` |
| Live | `live` serves the deployed Version; every [Interface](/business/nouns/interface) and package follows it | [`Version.deploy`](/business/nouns/version/deploy) | `Version.deployed` |
| Growing | An additive Change reaches every version as it ships | `Change.merge` | `Change.merged` |
| Versioned | A breaking Change merges only as the next major, with a gate | [`Change.review`](/business/nouns/change/review) | `Change.reviewed` |
| Pinned | Each [Tenant](/business/nouns/tenant) answers at its own `apiVersion` until it moves | [`Tenant.pin`](/business/nouns/tenant/pin) | `Tenant.pinned` |
| Retired | A version no Tenant pins stops serving, after notice | `Interface.sunset` | None |

`Interface.deprecate` and `Interface.sunset` have status `planned`. Every version a Tenant pins keeps serving, and [API deprecation](/products/api/deprecation) covers what retiring one takes.

## Going live
`live` serves nothing until the first deploy, and a call with a `live` key returns `503` [`not-live`](/code/api/errors/not-live). Each later deploy moves `live` to a new build, and the previous Version stays one revert away.

The deploy is the moment [Customers](/business/nouns/customer) see. Merging to `test` changes nothing they call, so a [Startup](/business/nouns/startup) merges and tests freely, then deploys when its checks pass.

## Undoing a Change
[`Change.revert`](/business/nouns/change/revert) undoes a merged Change with a new Change, deleting nothing. A reverted breaking Change leaves its version in place for every Tenant already pinned to it.

## What Customers hear
The [Changelog](/code/systems/changelog) publishes every merged Change, with the [Verbs](/business/nouns/verb) it touches and the one-line upgrade. Customers follow it by email, feed or [Watch](/business/nouns/watch), and an [Agent](/business/nouns/agent) reads the same notes in Markdown.

A view of what a Change would put live, before it merges, is the [Preview](/code/builders/startup/preview) capability, with status `planned`.