---
title: "Create experiment"
method: POST
path: "/experiments"
---

# Create experiment

`POST /experiments`

Create a new A/B experiment in the project resolved from the API key.
Defaults to draft status; pass `status: 2` to create as active.
Variant `percent` values should sum to 100.

## Request body

- object
  - `name` string, required
  - `slug` string, required
  - `type` 1 | 2, required — 1 = Quiz, 2 = Paywall
  - `status` 1 | 2 | 3 | 4 | 5 | 6 | 7 — Lifecycle status of an A/B experiment: - **1 — Draft** — Created but not serving traffic. No new users enrolled. - **2 — Active** — Running. New users are enrolled and variants are served. Sets `start_at` on first activation; clears a stale past `end_at` on reactivation. - **3 — Pause** — Temporarily halted. No new users enrolled; existing assignments are kept. - **4 — Success** — Marked as a winning test. Sets `end_at` when missing. No new users enrolled. - **5 — Fail** — Marked as a losing test. Sets `end_at` when missing. No new users enrolled. - **6 — Stop** — Stopped (no new users). Sets `end_at` when missing. Differs from Archive — experiment stays in the main list. - **7 — Archive** — Stopped and archived (cabinet "Stop and move to archive"). Sets `end_at` when missing.
  - `allow_intersection` boolean
  - `start_at` string, date-time — Defaults to now when omitted
  - `end_at` string, date-time, nullable
  - `tags` string[]
  - `variants` object[], required
    - `model_id` integer, required — Quiz or paywall ID in this project
    - `name` string
    - `percent` integer, required
  - `filters` object[]
    - `type` integer, required — Filter type (1=country, 2=language, 5=device, 6=utm_source, …)
    - `operator` integer, required — Operator (1=equal, 2=not equal, 3=contains, …)
    - `value` union, required
      - string
      - string[]

## Response `201`

Experiment created

- object
  - `success` boolean
  - `experiment` Experiment
    - `id` integer
    - `project_id` integer
    - `name` string
    - `slug` string
    - `type` integer — Experiment type (1 = Quiz, 2 = Paywall)
    - `start_at` string, date-time, nullable
    - `end_at` string, date-time, nullable
    - `status` 1 | 2 | 3 | 4 | 5 | 6 | 7 — Lifecycle status of an A/B experiment: - **1 — Draft** — Created but not serving traffic. No new users enrolled. - **2 — Active** — Running. New users are enrolled and variants are served. Sets `start_at` on first activation; clears a stale past `end_at` on reactivation. - **3 — Pause** — Temporarily halted. No new users enrolled; existing assignments are kept. - **4 — Success** — Marked as a winning test. Sets `end_at` when missing. No new users enrolled. - **5 — Fail** — Marked as a losing test. Sets `end_at` when missing. No new users enrolled. - **6 — Stop** — Stopped (no new users). Sets `end_at` when missing. Differs from Archive — experiment stays in the main list. - **7 — Archive** — Stopped and archived (cabinet "Stop and move to archive"). Sets `end_at` when missing.
    - `filters` object[] — Array of filter objects
    - `variants` object[] — Array of variant objects
      - `model_id` integer — ID of the quiz or paywall model
      - `name` string — Variant name
      - `percent` integer — Percentage of users for this variant
    - `experiment_users_count` integer — Number of users in the experiment (only in show endpoint)
    - `created_at` string, date-time
    - `updated_at` string, date-time

## Other responses

- `422` — Validation error

---

[API](https://skmtc.net/web2wave/apis/web2wave-api.md) · [All operations](https://skmtc.net/web2wave/apis/web2wave-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/web2wave/web2wave-api/versions/c88545119271/schema)
