# Управление A/B-тестами

CRUD над A/B-тестами. Логически и по форме тела A/B-тест очень похож на персонализацию — те же варианты, те же модификации, тот же контракт условий показа. См. сначала общие правила.

База: https://api.sales-ninja.me/public/api/v1/manage/ab-tests

HTTP Что делает
GET / Список A/B-тестов.
POST /list Список со сложным фильтром.
GET /{id} Полная сущность.
POST / Создать.
PUT /{id} Обновить.
DELETE /{id} Удалить.

# Тело запроса

{
  "title": "Цвет кнопки 'Купить'",
  "state": "Working",
  "scope": "Web",
  "optimizationMetric": "ConversionCount",
  "slotFrom": 0,
  "slotTo": 100,
  "goals": [{"goalId":"299837db-9b51-45a4-996b-844d3fd05bbd"}],
  "stoppingStrategy": {
    "type": "FixedSampleSize",
    "minSessions": 5000
  },
  "isSmart": false,
  "pessimizeControlGroup": false,
  "protectAgainstChanges": false,
  "onlyForManualCalling": false,
  "mlModelAtributionType": "FirstSession",
  "variants": [
    { "title": "Контроль", "isOriginal": true, "isWorking": true, "modifications": [] },
    { "title": "Зелёная",  "isOriginal": false, "isWorking": true, "modifications": [
      { "type": "ChangeStyle",
        "actionJson": {"selector": ".buy", "property": "background-color", "value": "#0a8"} }
    ]}
  ],
  "displayCondition": {
    "fieldCode": "page_url",
    "operation": "Contains",
    "value": "/product/"
  }
}

# Ключевые отличия от персонализации

Поле A/B-тест Персонализация
stoppingStrategy Есть. Описывает, когда тест считается завершённым. Нет.
ML-модель Не учится «выбирать вариант» — просто меряет разницу. Учится.
Контрольный вариант Обязательно, и доля группы фиксируется заранее. Опционально.
displayCondition.target Default PersonalizationWeb

# stoppingStrategy

Объект с одним из значений type:

type Что значит Параметры
Manual Никакого автостопа, оператор останавливает вручную.
FixedSampleSize Остановиться после набора нужного объёма выборки. minSessions
BayesianProbability Остановиться, когда вероятность победителя достигает порога. threshold (0…1)
ConfidenceInterval Остановиться, когда доверительный интервал стал уже порога. widthThreshold

Точный список доступных стратегий и их параметры зависят от конфигурации проекта — стартовать имеет смысл с Manual или FixedSampleSize.

# variants[] и variants[].modifications[]

Идентичны структуре персонализации — см. Управление персонализациями.

# Ответ при сохранении

{
  "abTestId": "12d4f8b1-1234-4ab6-aa00-1234abcd5678",
  "variantIds": ["..."],
  "displayConditionId": "...",
  "createdAbTest": true,
  "createdVariantIds": ["..."]
}

# cURL — создать

curl -X POST "https://api.sales-ninja.me/public/api/v1/manage/ab-tests" \
  -H "X-SN-TOKEN: $SN_TOKEN" \
  -H "Content-Type: application/json" \
  -d @ab-test.json

# Интеграционные модификации

Внутри variants[].modifications[] можно вызывать API внешних систем — см. JS-действия в персонализациях (формат тот же).