Skip to content

Start splitting shoppers

POST
/v1/experiments/{experiment_id}/start
curl --request POST \
--url https://api.octaneai.com/v1/experiments/example/start \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "confirm": true }'
experiment_id
required
Experiment Id
string
Media typeapplication/json
StartRequest
object
confirm
required
Confirm
boolean

The experiment after the action. Start and end require confirm: true.

Media typeapplication/json
ExperimentResponse
object
ai_fallback
required
AiFallback

After that many runs: decide at the first clear result without the AI, or wait for you

string
Allowed values: when_clear notify
ai_max_runs
Any of:
integer
ai_rationale
Any of:
string
ai_trigger
Any of:
AiTrigger
string
Allowed values: when_clear on_date
ai_verdict
Any of:
AiVerdict

What the AI decided last, as the trusted decide path accepted it; a refused verdict lives on the timeline only.

string
Allowed values: publish keep_running no_change
app_id
required
App Id
string
/^quiz_[0-9a-f]{32}$/
arms
required
Arms
Array<object>
ExperimentArmResponse
object
id
required
Id
string
/^arm_[0-9a-f]{32}$/
is_control
required
Is Control
boolean
label
required
Label
string
position
required
Position

0 for the live version, 1 for the variant

integer
version_id
required
Version Id
string
/^ver_[0-9a-f]{32}$/
version_number
required
Version Number
integer
weight
required
Weight

The arm’s share of the split, a whole number weighed against the other arm’s

integer
clear_since_at
Any of:
string format: date-time
created_at
required
Created At
string format: date-time
decides_at
Any of:
string format: date-time
decision_date
Any of:
string format: date
decision_metric
required
Decision Metric

Completion_rate | email_opt_in | order_conversion | rpv | aov | phone_opt_in | reached_page | product_page_clicked | custom_url_clicked | button_clicked | chose_answer

string
decision_option
required
DecisionOption

Manual: the merchant decides. when_clear: publish at the first clear result. on_date: decide on a date. ai: the AI decides.

string
Allowed values: manual when_clear on_date ai
decision_target
Any of:
object
key
additional properties
any
ended_at
Any of:
string format: date-time
ended_by
Any of:
EndedBy
string
Allowed values: manual auto ai fallback_revert
fallback
required
Fallback

What happens on the date without a clear result: keep running, put the live version back, or tell the merchant and wait.

string
Allowed values: keep revert notify
id
required
Id
string
/^expt_[0-9a-f]{32}$/
long_run_reminders
required
Long Run Reminders

Whether reminder emails go out six weeks after the start and every two weeks after until it ends

boolean
merchant_note
Any of:
string
name
required
Name
string
outcome
Any of:
Outcome

How a test ended, in one word.

string
Allowed values: winner_manual winner_auto winner_ai ai_no_change ai_recommended ai_keep_running ai_blocked_credits srm_flagged no_winner_notify reverted plan_downgraded ended_manual cancelled
period
required
Period

The current counting period: 0 on a draft, 1 once started, one higher each time a new one opens

integer
period_reason
required
PeriodReason

Why a counting period began.

string
Allowed values: started split_changed control_published variant_republished metric_changed revenue_tiers_changed
period_started_at
Any of:
string format: date-time
protect_metrics
required
Protect Metrics

The metrics the test watches for harm: completion_rate | email_opt_in | order_conversion | rpv | aov | phone_opt_in | reached_page | product_page_clicked | custom_url_clicked | button_clicked | chose_answer

Array<string>
revenue_tiers
required
Revenue Tiers

The kinds of revenue counted: added_from_quiz | shown_bought_later | bought_not_shown

Array<string>
revision
required
Revision

A number that goes up with every change to the test

integer
srm_flagged_at
Any of:
string format: date-time
started_at
Any of:
string format: date-time
status
required
ExperimentStatus

Draft: set up, not started. running: shoppers are being split. waiting: still splitting, automatic decisions paused. ended: no longer assigning.

string
Allowed values: draft running waiting ended
timezone
required
Timezone

IANA name of the timezone decision_date is read in

string
updated_at
required
Updated At
string format: date-time
weekly_digest
required
Weekly Digest

Whether a weekly email reports where the test stands

boolean
winner_arm_id
Any of:
string
/^arm_[0-9a-f]{32}$/
Example
{
"ai_fallback": "when_clear",
"app_id": "quiz_7c9e6679742540de944be07fc1f90ae7",
"arms": [
{
"id": "arm_00000000000000000000000000000001",
"is_control": true,
"label": "Live version",
"position": 0,
"version_id": "ver_00000000000000000000000000000001",
"version_number": 1,
"weight": 1
},
{
"id": "arm_00000000000000000000000000000002",
"is_control": false,
"label": "Variant B",
"position": 1,
"version_id": "ver_00000000000000000000000000000002",
"version_number": 2,
"weight": 1
}
],
"created_at": "2026-09-16T12:00:00Z",
"decision_metric": "completion_rate",
"decision_option": "when_clear",
"fallback": "notify",
"id": "expt_7c9e6679742540de944be07fc1f90ae7",
"long_run_reminders": true,
"name": "Skip the email page",
"period": 0,
"period_reason": "started",
"protect_metrics": [],
"revenue_tiers": [
"added_from_quiz",
"shown_bought_later",
"bought_not_shown"
],
"revision": 0,
"status": "draft",
"timezone": "UTC",
"updated_at": "2026-09-16T12:00:00Z",
"weekly_digest": true
}

The key is missing, malformed, revoked or expired.

Media typeapplication/problem+json
Problem

The body of every non-2xx response.

object
detail
required
Detail

What went wrong, for people

string
errors
Any of:
Array<object>
FieldError
object
field
required
Field

The input that failed, as a dotted path (body.label, query.from)

string
message
required
Message

Why it failed

string
export
Any of:
object
key
additional properties
any
feature
Any of:
Feature
string
Allowed values: merchant_api quiz_ab_testing ai_model_switch ai_advanced_model analytics_paths people_filter analytics_funnel analytics_answers quiz_shopify_customer_metafields custom_css_classes shopify_metafields_plan
plan
Any of:
PlanTier

Declared lowest first: a tier includes what every tier before it includes.

string
Allowed values: none basic plus enterprise
request_id
required
Request Id

The same value as the Request-Id header; quote it to support

string
required
Any of:
Array<string>
retry_after
Any of:
integer
status
required
Status

The HTTP status of the response

integer
title
required
Title

The machine-readable error code; the Errors guide lists every one

string
type
required
Type

A stable URI naming the error, on this API’s public host

string
Example
{
"detail": "The API key is missing, malformed, revoked or expired",
"request_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": 401,
"title": "invalid_api_key",
"type": "https://api.octaneai.com/errors/invalid_api_key"
}
WWW-Authenticate
string
Example
Bearer

The store’s plan has no API access, or the key lacks the scope.

Media typeapplication/problem+json
Problem

The body of every non-2xx response.

object
detail
required
Detail

What went wrong, for people

string
errors
Any of:
Array<object>
FieldError
object
field
required
Field

The input that failed, as a dotted path (body.label, query.from)

string
message
required
Message

Why it failed

string
export
Any of:
object
key
additional properties
any
feature
Any of:
Feature
string
Allowed values: merchant_api quiz_ab_testing ai_model_switch ai_advanced_model analytics_paths people_filter analytics_funnel analytics_answers quiz_shopify_customer_metafields custom_css_classes shopify_metafields_plan
plan
Any of:
PlanTier

Declared lowest first: a tier includes what every tier before it includes.

string
Allowed values: none basic plus enterprise
request_id
required
Request Id

The same value as the Request-Id header; quote it to support

string
required
Any of:
Array<string>
retry_after
Any of:
integer
status
required
Status

The HTTP status of the response

integer
title
required
Title

The machine-readable error code; the Errors guide lists every one

string
type
required
Type

A stable URI naming the error, on this API’s public host

string
Examples
{
"detail": "The API key does not carry the scope this route needs",
"request_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"required": [
"experiments:write"
],
"status": 403,
"title": "insufficient_scope",
"type": "https://api.octaneai.com/errors/insufficient_scope"
}

Not found

Media typeapplication/problem+json
Problem

The body of every non-2xx response.

object
detail
required
Detail

What went wrong, for people

string
errors
Any of:
Array<object>
FieldError
object
field
required
Field

The input that failed, as a dotted path (body.label, query.from)

string
message
required
Message

Why it failed

string
export
Any of:
object
key
additional properties
any
feature
Any of:
Feature
string
Allowed values: merchant_api quiz_ab_testing ai_model_switch ai_advanced_model analytics_paths people_filter analytics_funnel analytics_answers quiz_shopify_customer_metafields custom_css_classes shopify_metafields_plan
plan
Any of:
PlanTier

Declared lowest first: a tier includes what every tier before it includes.

string
Allowed values: none basic plus enterprise
request_id
required
Request Id

The same value as the Request-Id header; quote it to support

string
required
Any of:
Array<string>
retry_after
Any of:
integer
status
required
Status

The HTTP status of the response

integer
title
required
Title

The machine-readable error code; the Errors guide lists every one

string
type
required
Type

A stable URI naming the error, on this API’s public host

string
Example
{
"detail": "Not found",
"request_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": 404,
"title": "not_found",
"type": "https://api.octaneai.com/errors/not_found"
}

Only a draft test can be started.

Media typeapplication/problem+json
Problem

The body of every non-2xx response.

object
detail
required
Detail

What went wrong, for people

string
errors
Any of:
Array<object>
FieldError
object
field
required
Field

The input that failed, as a dotted path (body.label, query.from)

string
message
required
Message

Why it failed

string
export
Any of:
object
key
additional properties
any
feature
Any of:
Feature
string
Allowed values: merchant_api quiz_ab_testing ai_model_switch ai_advanced_model analytics_paths people_filter analytics_funnel analytics_answers quiz_shopify_customer_metafields custom_css_classes shopify_metafields_plan
plan
Any of:
PlanTier

Declared lowest first: a tier includes what every tier before it includes.

string
Allowed values: none basic plus enterprise
request_id
required
Request Id

The same value as the Request-Id header; quote it to support

string
required
Any of:
Array<string>
retry_after
Any of:
integer
status
required
Status

The HTTP status of the response

integer
title
required
Title

The machine-readable error code; the Errors guide lists every one

string
type
required
Type

A stable URI naming the error, on this API’s public host

string
Example
{
"detail": "Only a draft test can be started.",
"request_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": 409,
"title": "conflict",
"type": "https://api.octaneai.com/errors/conflict"
}

Automatic decisions wait a full seven days, whatever the numbers look like earlier.

Media typeapplication/problem+json
Problem

The body of every non-2xx response.

object
detail
required
Detail

What went wrong, for people

string
errors
Any of:
Array<object>
FieldError
object
field
required
Field

The input that failed, as a dotted path (body.label, query.from)

string
message
required
Message

Why it failed

string
export
Any of:
object
key
additional properties
any
feature
Any of:
Feature
string
Allowed values: merchant_api quiz_ab_testing ai_model_switch ai_advanced_model analytics_paths people_filter analytics_funnel analytics_answers quiz_shopify_customer_metafields custom_css_classes shopify_metafields_plan
plan
Any of:
PlanTier

Declared lowest first: a tier includes what every tier before it includes.

string
Allowed values: none basic plus enterprise
request_id
required
Request Id

The same value as the Request-Id header; quote it to support

string
required
Any of:
Array<string>
retry_after
Any of:
integer
status
required
Status

The HTTP status of the response

integer
title
required
Title

The machine-readable error code; the Errors guide lists every one

string
type
required
Type

A stable URI naming the error, on this API’s public host

string
Example
{
"detail": "Automatic decisions wait a full seven days, whatever the numbers look like earlier.",
"request_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": 422,
"title": "invalid_experiment",
"type": "https://api.octaneai.com/errors/invalid_experiment"
}

The key’s or the store’s bucket is full; Retry-After says when to try again.

Media typeapplication/problem+json
Problem

The body of every non-2xx response.

object
detail
required
Detail

What went wrong, for people

string
errors
Any of:
Array<object>
FieldError
object
field
required
Field

The input that failed, as a dotted path (body.label, query.from)

string
message
required
Message

Why it failed

string
export
Any of:
object
key
additional properties
any
feature
Any of:
Feature
string
Allowed values: merchant_api quiz_ab_testing ai_model_switch ai_advanced_model analytics_paths people_filter analytics_funnel analytics_answers quiz_shopify_customer_metafields custom_css_classes shopify_metafields_plan
plan
Any of:
PlanTier

Declared lowest first: a tier includes what every tier before it includes.

string
Allowed values: none basic plus enterprise
request_id
required
Request Id

The same value as the Request-Id header; quote it to support

string
required
Any of:
Array<string>
retry_after
Any of:
integer
status
required
Status

The HTTP status of the response

integer
title
required
Title

The machine-readable error code; the Errors guide lists every one

string
type
required
Type

A stable URI naming the error, on this API’s public host

string
Example
{
"detail": "Too many requests",
"request_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"retry_after": 1,
"status": 429,
"title": "rate_limited",
"type": "https://api.octaneai.com/errors/rate_limited"
}

Request limits cannot be checked right now; retry shortly.

Media typeapplication/problem+json
Problem

The body of every non-2xx response.

object
detail
required
Detail

What went wrong, for people

string
errors
Any of:
Array<object>
FieldError
object
field
required
Field

The input that failed, as a dotted path (body.label, query.from)

string
message
required
Message

Why it failed

string
export
Any of:
object
key
additional properties
any
feature
Any of:
Feature
string
Allowed values: merchant_api quiz_ab_testing ai_model_switch ai_advanced_model analytics_paths people_filter analytics_funnel analytics_answers quiz_shopify_customer_metafields custom_css_classes shopify_metafields_plan
plan
Any of:
PlanTier

Declared lowest first: a tier includes what every tier before it includes.

string
Allowed values: none basic plus enterprise
request_id
required
Request Id

The same value as the Request-Id header; quote it to support

string
required
Any of:
Array<string>
retry_after
Any of:
integer
status
required
Status

The HTTP status of the response

integer
title
required
Title

The machine-readable error code; the Errors guide lists every one

string
type
required
Type

A stable URI naming the error, on this API’s public host

string
Example
{
"detail": "Request limits cannot be checked right now; retry shortly",
"request_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": 503,
"title": "limiter_unavailable",
"type": "https://api.octaneai.com/errors/limiter_unavailable"
}

The request timed out.

Media typeapplication/problem+json
Problem

The body of every non-2xx response.

object
detail
required
Detail

What went wrong, for people

string
errors
Any of:
Array<object>
FieldError
object
field
required
Field

The input that failed, as a dotted path (body.label, query.from)

string
message
required
Message

Why it failed

string
export
Any of:
object
key
additional properties
any
feature
Any of:
Feature
string
Allowed values: merchant_api quiz_ab_testing ai_model_switch ai_advanced_model analytics_paths people_filter analytics_funnel analytics_answers quiz_shopify_customer_metafields custom_css_classes shopify_metafields_plan
plan
Any of:
PlanTier

Declared lowest first: a tier includes what every tier before it includes.

string
Allowed values: none basic plus enterprise
request_id
required
Request Id

The same value as the Request-Id header; quote it to support

string
required
Any of:
Array<string>
retry_after
Any of:
integer
status
required
Status

The HTTP status of the response

integer
title
required
Title

The machine-readable error code; the Errors guide lists every one

string
type
required
Type

A stable URI naming the error, on this API’s public host

string
Example
{
"detail": "The request timed out.",
"request_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": 504,
"title": "timeout",
"type": "https://api.octaneai.com/errors/timeout"
}