---
title: "List a campaign's experiments"
method: GET
path: "/api/v1/campaigns/{campaign_id}/experiments"
tags: ["experiments"]
---

# List a campaign's experiments

`GET /api/v1/campaigns/{campaign_id}/experiments`

## 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/campaigns/{campaign_id}/experiments`
- Auth: HTTP bearer

Every experiment on this campaign, newest first, with headline numbers.

THE LIST IS AN OBJECT, NOT A BARE ARRAY: ``{"experiments": [...]}``. A
top-level array is a dead end — there is nowhere to hang a cursor, a total
or a "some of these could not be read" note without breaking every caller
on the day it is needed — and it is the shape the client already reads.
``tests/routes/test_experiments_wire_contract.py`` pins it.

``last_readout`` is the most recent PERSISTED look, not a fresh
measurement: computing one is a real pass over every enrolled contact's
interactions, and doing it per experiment to render a list would make
opening the list the most expensive thing in the product. Its ``p_better``
is a probability in 0..1, and each group's ``allocation`` is a proportion in
0..1.

## Path parameters

- `campaign_id` string, required

## Response `200`

Successful Response

- object

## Other responses

- `400`: Invalid campaign ID format
- `403`: User may not edit this campaign
- `404`: Campaign not found
- `422`: Validation Error

## Changes

- **2026-09-03** `219a10b80707`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/outrival/apis/fastapi/changes/api/v1/campaigns/:campaign_id/experiments/get.md)

---

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