# Управление 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} Обновить.
PATCH /{id} Частично обновить root-поля.
POST /{id}/options Добавить вариант.
PATCH /{id}/options/{optionId} Частично обновить вариант.
DELETE /{id}/options/{optionId} Удалить вариант.
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": ["..."],
  "entity": {
    "id": "12d4f8b1-1234-4ab6-aa00-1234abcd5678",
    "title": "Цвет кнопки 'Купить'",
    "variants": []
  }
}

# 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

# Runtime API (Mobile / Backend)

Для scope: "Mobile"/"Backend" варианты выдаются через runtime API, не через web-бандл:

Сценарий Документация
Получить варианты A/B-теста A/B-тесты (runtime)POST /public/{source}/v1.0/ab-tests/apply
Отправить конверсию Reach goalPOST /public/{source}/v1.0/goals/reach

Структура management-сущности совпадает с персонализациями.

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

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