---
title: "Submit experiment"
method: POST
path: "/api/v1/experiments/{experiment_id}/submit"
tags: ["experiments"]
---

# Submit experiment

`POST /api/v1/experiments/{experiment_id}/submit`

## Request

- Base URL: `https://devs.adaptyvbio.com`
- URL: `https://devs.adaptyvbio.com/api/v1/experiments/{experiment_id}/submit`
- Auth: HTTP bearer

Submits a draft experiment for review. Advances from Draft to
WaitingForConfirmation by finalizing the Stripe quote. To accept an
already-submitted quote, use `POST /experiments/{id}/quote/confirm`.

## Path parameters

- `experiment_id` string, uuid, required

## Response `200`

Experiment submitted for review

- ExperimentConfirmationResponse: Confirmation response returned after a status transition via `POST /confirm`. The confirm endpoint automatically advances the experiment through its lifecycle based on the current status. This response reports both the previous and new status so callers can verify what transition occurred.
  - `confirmed_at` string, date-time, required: RFC3339 timestamp when confirmation completed
  - `experiment_id` string, uuid, required: Experiment identifier
  - `previous_status` 'draft' | 'waiting_for_confirmation' | 'canceled' | 'waiting_for_materials' | 'in_production' | 'quote_sent' | 'in_queue' | 'data_analysis' | 'in_review' | 'done', required: Current lifecycle stage of an experiment. Status values indicate where an experiment is in the submission-to-results pipeline. Some transitions require user action (such as accepting a quote), while others occur automatically as work progresses.
  - `status` 'draft' | 'waiting_for_confirmation' | 'canceled' | 'waiting_for_materials' | 'in_production' | 'quote_sent' | 'in_queue' | 'data_analysis' | 'in_review' | 'done', required: Current lifecycle stage of an experiment. Status values indicate where an experiment is in the submission-to-results pipeline. Some transitions require user action (such as accepting a quote), while others occur automatically as work progresses.
  - `stripe_invoice_url` string, nullable: Hosted invoice URL from Stripe (available after WaitingForConfirmation → WaitingForMaterials)

## Other responses

- `400`: Unknown or inaccessible experiment
- `401`: Invalid or missing authentication token
- `403`: Caller does not have access to this experiment
- `409`: Experiment cannot transition out of its current state. When a prior `POST /experiments` attempted to create a Stripe quote and Stripe rejected it, the response includes `error_kind` and `hint` fields identifying the failure class (e.g. `customer_quote_cap`). Otherwise those fields are omitted (legacy shape).
- `429`: Stripe rate-limited the quote call; retry after `Retry-After` seconds
- `500`: Internal server error
- `502`: Stripe refused or failed a call on the experiment's quote. The cause is on Adaptyv's side and Adaptyv has been alerted; the message says whether retrying can help

---

[API](https://skmtc.dev/adaptyvbio/apis/adaptyv-foundry-api.md) - [All operations](https://skmtc.dev/adaptyvbio/apis/adaptyv-foundry-api/llms.txt) - [OpenAPI document](https://skmtc.dev/adaptyvbio/apis/adaptyv-foundry-api/revisions/5a2228f4bd59?raw)
