Перейти к основному содержимому

Общие положения API Сплиттера

В этом разделе описаны основные детали API Trisigma Splitter.

Для работы с API потребуется получить Bearer-токен авторизации, который предоставляется менеджером Trisigma. Данный токен необходимо включать в заголовок Authorization каждого запроса.

API сплиттера использует RPC-протокол на базе HTTP.

API можно тестировать без предварительно настроенных экспериментов. Однако для более точного тестирования рекомендуется завести эксперимент в Trisigma.

Для выполнения запроса необходимо делать POST-запросы вида: https://<host>/<method_name>/.

Обратите внимание: косая черта (/) в конце адреса запроса обязательна.

Параметр <host> можно узнать у менеджера Trisigma, так как для каждого клиента он является уникальным.

Методы API

Получение списка фичей (getFeaturesByTag)

Метод getFeaturesByTag используется для получения списка фичей, связанных с заданным тегом.

Параметры запроса

Эта таблица описывает все поля, которые необходимо передать в теле JSON-запроса.

ПараметрТипОписаниеОбязательный
tagstringТэг эксперимента, используемый для группировки.Да
platform.idintID платформы (например, 1 для Desktop).Да
platform.versionstringВерсия платформы (например, версия приложения: "2.15.0").Да
participant.userIdintID пользователя. Хотя бы один из идентификаторов (userId или visitorId) должен быть передан.Условно
participant.visitorIdstringID устройства или анонимного посетителя. Хотя бы один из идентификаторов (userId или visitorId) должен быть передан.Условно
randomizationUnitslistНет
randomizationUnits.typestringТип параметра пользователя
randomizationUnits.valuestringЗначение параметра пользователя

Формирование запроса

URL:

POST https://<host>/getFeaturesByTag/

Заголовки:

Authorization: Bearer <ваш_токен>
Content-Type: application/json
X-Source: local

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

{
"tag": "<ваш_тег>",
"platform": {
"id": 1,
"version": "2.15.0"
},
"participant": {
"userId": 123456
},
"randomizationUnits": [
{
"type": "phone_hash",
"value": "33AFF380-6289-4B76-BB19-46EB8B7D8998"
},
{
"type": "age",
"value": "30"
},
{
"type": "rating",
"value": "78"
}
]
}

Пример успешного ответа

{
"result": {
"features": [
{
"label": "test_group",
"experimentLabel": "demo_experiment",
"exposureParams": "1:2:12345"
}
]
}
}

Расшифровка ответа:

ПараметрТипОписание
labelstringГруппа, в которую попал пользователь.
experimentLabelstringЛейбл эксперимента, который задается при создании в Trisigma.
exposureParamsstringВнутренний параметр. Будет удален из ответа в будущих версиях.

Алгоритм работы

  1. Отбор экспериментов, в которых есть переданный tag
  2. Проверка участия пользователя в отобранных экспериментах. В ходе проверки переданные параметры пользователя сравниваются с конфигурацией эксперимента

    Обратите внимание: В случае, когда конфигурация эксперимента требует проверки какого-то параметра пользователя (см Условия попадания в эксперимент), которого нет в запросе, эксперимент не попадёт в ответ метода. Ошибка возвращена не будет

  3. Сохранение информации о запросе фичи пользователя для аналитики.
  4. Формирование ответа

Общие рекомендации

  1. Убедитесь, что в заголовке запроса используется актуальный Bearer токен, выданный вам командой Trisigma.
  2. Передавайте максимум возможной информации о пользователе, чтобы гарантировать прохождение всех фильтров эксперимента.
  3. При формировании запроса на получение фичей, в параметре tag укажите значение, связанное с конкретным сервисом или страницей, для которых вы хотите получить данные.
  4. Кеширование ответа. Для оптимизации скорости ответа вашего сервиса рекомендуется запрашивать у сплиттера участие пользователя в эксперименте только один раз за сессию. Такой подход используется, например, в мобильных приложениях. Группы скачиваются редко, что позволяет экономить трафик, так как они изменяются нечасто.
  5. Точка запроса. Старт приложения или начало сессии. хорошая точка, чтобы получить весь список текущих экспериментов и фичей.

Вы также можете прочитать про SLA сплиттера здесь.

Регистрация участия пользователя (exposeManyV2)

Метод exposeManyV2 фиксирует факт показа фичи пользователю в рамках эксперимента. Отправка этих событий (exposures) необходима для последующего анализа данных и формирования отчетов.

Параметры запроса

ПараметрТипОписаниеОбязательный
exposuresarrayМассив объектов, описывающих события показа фичи пользователю.Да

Структура объекта в массиве exposures:

Все поля внутри каждого объекта в массиве exposures являются обязательными.

ПараметрТипОписаниеОбязательный
experimentLabelstringЛейбл эксперимента, к которому относится событие.Да
platform.idintID платформы, на которой произошло событие.Да
platform.versionstringВерсия платформы (например, приложения) в момент события.Да
participant.userIdintID пользователя. Хотя бы один из идентификаторов (userId или visitorId) должен быть передан.Условно
participant.visitorIdstringID устройства или анонимного посетителя. Хотя бы один из идентификаторов (userId или visitorId) должен быть передан.Условно
randomizationUnitslistНет
randomizationUnits.typestringТип параметра пользователя
randomizationUnits.valuestringЗначение параметра пользователя

Формирование запроса

URL:

POST https://<host>/exposeManyV2/

Заголовки:

Authorization: Bearer <ваш_токен>
Content-Type: application/json
X-Source: local

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

{
"exposures": [
{
"experimentLabel": "new_checkout_flow_2023",
"platform": {
"id": 1,
"version": "2.5.1"
},
"participant": {
"userId": 1234567,
"visitorId": "a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8"
},
"randomizationUnits": [
{
"type": "phone_hash",
"value": "33AFF380-6289-4B76-BB19-46EB8B7D8998"
}
]
},
{
"experimentLabel": "homepage_banner_test_Q4",
"platform": {
"id": 5,
"version": "4.12.0"
},
"participant": {
"userId": 9876543,
"visitorId": "z9y8x7w6-v5u4-t321-s9r8-q7p6o5n4m3l2"
}
}
]
}

Пример успешного ответа

{
"result": {
"ok": true
}
}

Алгоритм работы

  1. Метод всегда и сразу возвращает ok = True. Дальнейшая обработка идёт параллельно, чтобы не блокировать клиента
  2. Для каждого события из пачки: 1. По данным клиента и лейблу эксперимента вычисляется группа пользователя 2. Если группа вычислена, то сохраняются данные для построения отчета

    Обратите внимание: При обработке экспоужера происходит повторное вычисление группы. Т.е. если в эксперименте были заданы "условия попадания в эксперимент", то в при отправке экспоужера обязательно должны быть указаны те же самые значения platform, participant и randomizationUnits, которые использовались при вычислении группы. Иначе событие не будет отправлено.

Общие рекомендации

  1. Данные клиента. Требуется передавать в событиях экспоуза те же параметры platform, participant, randomizationUnits, которые передавались при вычислении фичи в ручке GetFeaturesByTag. Это позволит избежать потери данных при повторной проверке участия.
  2. Время отправки. НЕ рекомендуется отправлять событие сразу после получения фичей от сплиттера. Лучшая практика. отправлять его в тот момент, когда пользователь непосредственно взаимодействует с экспериментальной фичей. Это обеспечивает точность данных в отчетах.
  3. Пакетная отправка (батчинг). События можно и нужно накапливать и отправлять пакетами (батчами) для снижения нагрузки. Рекомендуется отправлять накопленные события не реже одного раза в сутки. Один запрос может содержать до 2000 событий.

Обработка ошибок

Статусы ответа:

  1. 400 Bad Request. в случае некорректных данных в теле запроса.

  2. 500 Internal Server Error. в случае серверной ошибки.

В случае ошибки тело ответа будет содержать JSON следующего вида:

{
"error": {
"kind": "<error_kind>",
"message": "<error_message>"
}
}
  1. kind. тип ошибки, повторяющий логику HTTP-статусов.
  2. message. текстовое описание ошибки.

Примеры распространенных ошибок:

СтатусСообщениеПояснение и действия
400"decode input DTO: Decode: field 'tag' is required..."Ошибка валидации. Обязательный параметр tag не был передан. Решение: Убедитесь, что в теле запроса указан параметр tag.
400"decode input DTO: Decode: field 'id' is required..."Ошибка валидации. В объекте platform отсутствует обязательный параметр id. Решение: Добавьте в объект platform параметр id.
400"bad request: все возможные параметры сплитования не заполнены"Ошибка валидации. Не передан ни один идентификатор пользователя. Решение: Убедитесь, что в объекте participant передан хотя бы один из параметров: userId или visitorId.

Ключевые понятия: tag и experimentLabel

При работе со сплиттером Trisigma используются два понятия: Тег и Лейбл. Понимание их назначения и разницы между ними является важной частью эффективной интеграции.

Что такое tag?

tag. это средство группировки экспериментов. Он позволяет ограничить набор экспериментов, которые возвращаются для конкретного сервиса, страницы или компонента. Тег задается при создании эксперимента в интерфейсе Trisigma.

Назначение тегов:

  1. Группировка по сервисам. Каждый сервис может использовать свой уникальный тег для получения только релевантных ему экспериментов.

  2. Оптимизация запросов. Вместо получения всех активных экспериментов сервис запрашивает данные только по нужному тегу.

  3. Гибкое управление. Теги позволяют легко подключать новые эксперименты к разным сервисам без изменения их кода.

Пример:

Карточка товара (PDP): использует тег product_page.

Сервис рекомендаций: использует тег recommendations.

Эксперименты распределены следующим образом:

  1. Эксперимент A связан с тегами product_page и recommendations.
  2. Эксперимент B связан только с тегом product_page.

При запросе сервиса рекомендаций с тегом recommendations, он получит только эксперимент A.

Что такое experimentLabel?

experimentLabel. это уникальный идентификатор (имя) конкретного эксперимента. Он используется для того, чтобы ваш код мог определить, какой именно эксперимент активен для пользователя, и отобразить соответствующую фичу.

Назначение лейблов:

  1. Управление функциональностью. Лейблы позволяют управлять логикой в коде: if (experimentLabel === 'new_blue_button') { ... }.

  2. Тестирование и отчетность. Лейблы помогают точно отслеживать, в каком эксперименте участвует пользователь, и собирать данные для аналитики.

Пример:

Эксперимент A с лейблом test_banner тестирует новый баннер. Сервис, получив этот лейбл, включает баннер для пользователей в тестовой группе.

Ключевые различия между tag и experimentLabel

ХарактеристикаtagexperimentLabel
НазначениеГруппировка экспериментовУникальный идентификатор эксперимента
ПрименениеФильтрация списка экспериментов при запросеУправление логикой в коде
УникальностьМожет быть одинаковым для нескольких экспериментовУникален в рамках системы
Примерproduct_page, recommendationsblue_button_2024, test_banner_Q1
  1. Установите тег для каждого сервиса, компонента или контекста, где проводится эксперимент.
  2. Используйте лейблы для управления функциональностью в коде в зависимости от экспериментов.
  3. При создании экспериментов в админке присваивайте им нужные теги, чтобы ограничить выдачу только для тех сервисов, которые их используют.

Сводная таблица параметров

В этой таблице перечислены все параметры, используемые в методах API. Обратите внимание: обязательность параметра может зависеть от конкретного метода.

ПараметрТипОписаниеОбязательныйИспользуется в методах
tagstringТэг эксперимента для группировки и фильтрации.ДаgetFeaturesByTag
experimentLabelstringЛейбл эксперимента для идентификации.ДаexposeManyV2
labelstringЛейбл фичи (группа, в которую попал пользователь).НетВ ответе getFeaturesByTag
platform.idintID платформы, идентифицирует устройство или среду.ДаgetFeaturesByTag, exposeManyV2
platform.versionstringВерсия платформы (например, версия приложения).ДаgetFeaturesByTag, exposeManyV2
participant.userIdintID пользователя.Условно*getFeaturesByTag, exposeManyV2
participant.visitorIdstringID устройства или анонимного посетителя (кука).Условно*getFeaturesByTag, exposeManyV2
randomizationUnitslistНетgetFeaturesByTag, exposeManyV2
randomizationUnits.typestringТип параметра пользователяgetFeaturesByTag, exposeManyV2
randomizationUnits.valuestringЗначение параметра пользователяgetFeaturesByTag, exposeManyV2

Справочник идентификаторов

Маппинг платформ (platform)

ПлатформаID
Desktop1
iOS4
Android5
Mobile (мобильный веб)6