---
title: "Hold, advance, or wait a running canary"
method: POST
path: "/api/v1/canaries/{experiment_id}/transition"
tags: ["canaries"]
---

# Hold, advance, or wait a running canary

`POST /api/v1/canaries/{experiment_id}/transition`

## Request

- Base URL: `https://api.outrival.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.outrival.com/api/v1/canaries/{experiment_id}/transition`
- Auth: HTTP bearer

One compare-and-set update; returns the canary body.

## Path parameters

- `experiment_id` string, uuid, required

## Request body

- TransitionCanaryRequest: One step for a running canary, valid only from the phase the caller saw.
  - `action` 'hold' | 'advance' | 'wait', required: hold enrollment, advance to the next phase, or wait for a person
  - `expected_phase` 'phase_10' | 'phase_50' | 'phase_100', required: The phase the caller read; any other phase is canary_stale
  - `wait_reason` 'no_traffic' | 'unsettled' | 'control_too_small' | 'launch_gate', nullable: Why a person must decide. Required for wait

## Response `200`

Successful Response

- unknown

## Other responses

- `401`: The bearer is not the canary service token
- `404`: No canary has this id
- `409`: error_code canary_stale: the canary moved or is not running
- `422`: Advancing phase_100, or wait without a wait_reason
- `503`: CANARY_SERVICE_TOKEN is not configured

## Changes

- **2026-10-21** `a63b52fb6b6e`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/outrival/apis/outrival-api/changes/api/v1/canaries/:experiment_id/transition/post.md)

---

[API](https://skmtc.dev/outrival/apis/outrival-api.md) - [All operations](https://skmtc.dev/outrival/apis/outrival-api/llms.txt) - [OpenAPI document](https://skmtc.dev/outrival/apis/outrival-api/revisions/f27d90300b5e?raw)
