Бюро Цифровых Технологий

База знаний

Документация «Вираж»

База знаний по продуктам и API экосистемы «Вираж»: модули, методы, вебхуки — с примерами.

Обновлено: 23.09.2026

Достижения

Ачивки программы лояльности: каталог достижений клуба с условиями выдачи, прогресс болельщика, статистика выдач и таблица лидеров. Сами достижения и их условия настраиваются в админ-панели клуба — через API они доступны на чтение, чтобы показать знаки и прогресс в приложении или на сайте.

Обзор методов

МетодПутьОписание
GET/achievementsКаталог достижений
GET/achievements/{id}Карточка достижения
GET/achievements/{id}/statsСтатистика выдач
GET/achievements/leaderboardТаблица лидеров
GET/users/{user_id}/achievementsДостижения болельщика

Каталог достижений

Эндпоинт
GET /achievements

Список достижений клуба с условиями выдачи, наградой и минимальным уровнем лояльности. Выключенные достижения возвращаются только с is_active=false.

Параметры

ПараметрГдеТипОбязателенОписание
is_activequerybooleanнетТолько активные (true) или только выключенные (false). По умолчанию возвращаются все.
limitqueryintegerнетРазмер страницы, от 1 до 100. По умолчанию — 20.
Запрос
curl "https://api.virazh.io/v1/achievements?is_active=true" \
  -H "Authorization: Bearer sk_test_51H..."
Ответ
{
  "data": [
    {
      "id": "ach_3f10",
      "name": "Свой на трибуне",
      "description": "Десять домашних матчей подряд без пропусков",
      "image": "https://cdn.virazh.io/ach/3f10.png",
      "image_back": "https://cdn.virazh.io/ach/3f10-back.png",
      "points": 500,
      "xp": 150,
      "min_loyalty_status": "silver",
      "is_active": true,
      "conditions": [
        { "rule": "attendance_streak", "target_value": 10 }
      ]
    }
  ],
  "has_more": false
}

Поля ответа

ПолеТипОписание
dataarray<Achievement>Достижения с полями id, name, description, image, image_back, points, xp, min_loyalty_status, is_active.
data[].conditionsarray<Condition>Условия выдачи: rule и target_value. Достижение выдаётся, когда выполнены все условия.
has_morebooleanЕсть ли следующая страница.

Карточка достижения

Эндпоинт
GET /achievements/{id}

Одно достижение с условиями и счётчиком выдач. Правила условий: registration, tickets_bought_total, season_tickets_bought, playoff_tickets_bought, tickets_per_match, early_bird_days, match_day_purchase, subscriptions_bought, subscription_renewal, matches_attended_total, home_matches_attended, attendance_streak, no_show, birthday_attendance, season_spend_total, merch_spend_total, merch_purchases, merch_unique_skus, loyalty_status_reached.

Параметры

ПараметрГдеТипОбязателенОписание
idпутьstringдаИдентификатор достижения, например ach_3f10.
Запрос
curl https://api.virazh.io/v1/achievements/ach_3f10 \
  -H "Authorization: Bearer sk_test_51H..."
Ответ
{
  "id": "ach_3f10",
  "name": "Свой на трибуне",
  "points": 500,
  "xp": 150,
  "min_loyalty_status": "silver",
  "conditions": [
    { "rule": "attendance_streak", "target_value": 10 }
  ],
  "awarded_count": 348
}

Поля ответа

ПолеТипОписание
idstringИдентификатор достижения.
pointsintegerБаллы на бонусный счёт при выдаче.
xpintegerОпыт для перехода по уровням лояльности — отдельный от баллов счётчик.
min_loyalty_statusstring | nullУровень, ниже которого достижение не выдаётся.
conditionsarray<Condition>Правило (rule) и порог (target_value) каждого условия.
awarded_countintegerСколько болельщиков уже получили достижение.

Статистика выдач

Эндпоинт
GET /achievements/{id}/stats

Выдачи достижения по неделям за выбранный период вместе с матчами клуба на той же оси — чтобы видеть, что всплеск дала домашняя серия, а не рассылка.

Параметры

ПараметрГдеТипОбязателенОписание
idпутьstringдаИдентификатор достижения.
periodquerystringнетПериод: last_7_days, last_30_days, current_season, all_time. По умолчанию — current_season.
Запрос
curl "https://api.virazh.io/v1/achievements/ach_3f10/stats?period=current_season" \
  -H "Authorization: Bearer sk_test_51H..."
Ответ
{
  "awarded_total": 128,
  "weeks": [
    { "week_start": "2026-09-01", "awarded": 12 },
    { "week_start": "2026-09-08", "awarded": 41 }
  ],
  "events": [
    { "date": "2026-09-10", "opponent": "Авангард", "is_home": true }
  ]
}

Поля ответа

ПолеТипОписание
awarded_totalintegerВсего выдач за период.
weeksarray<Week>Недели периода с полями week_start и awarded.
eventsarray<Event>Матчи клуба внутри периода: date, opponent, is_home.

Таблица лидеров

Эндпоинт
GET /achievements/leaderboard

Болельщики по числу собранных достижений. Фильтруется по уровню лояльности — лидерборд разбирается по статусам, а не листается целиком.

Параметры

ПараметрГдеТипОбязателенОписание
loyalty_statusquerystringнетФильтр по уровню: silver, gold, platinum.
searchquerystringнетПоиск по имени или телефону болельщика.
limitqueryintegerнетРазмер страницы, от 1 до 100. По умолчанию — 20.
Запрос
curl "https://api.virazh.io/v1/achievements/leaderboard?loyalty_status=gold&limit=20" \
  -H "Authorization: Bearer sk_test_51H..."
Ответ
{
  "data": [
    { "rank": 1, "user_id": "usr_8f21c", "name": "Иван Петров", "achievements_count": 14, "loyalty_status": "gold" },
    { "rank": 2, "user_id": "usr_71bd0", "name": "Мария Орлова", "achievements_count": 11, "loyalty_status": "gold" }
  ],
  "has_more": true
}

Поля ответа

ПолеТипОписание
dataarray<LeaderboardRow>Строки с полями rank, user_id, name, achievements_count, loyalty_status.
has_morebooleanЕсть ли следующая страница.

Достижения болельщика

Эндпоинт
GET /users/{user_id}/achievements

Полученные достижения с датой выдачи и прогресс по ещё не закрытым — то, из чего собирается страница достижений в личном кабинете.

Параметры

ПараметрГдеТипОбязателенОписание
user_idпутьstringдаИдентификатор пользователя.
include_progressquerybooleanнетДобавить незакрытые достижения с текущим прогрессом. По умолчанию — false.
Запрос
curl "https://api.virazh.io/v1/users/usr_8f21c/achievements?include_progress=true" \
  -H "Authorization: Bearer sk_test_51H..."
Ответ
{
  "achievements_count": 14,
  "awarded": [
    {
      "achievement_id": "ach_3f10",
      "name": "Свой на трибуне",
      "image": "https://cdn.virazh.io/ach/3f10.png",
      "awarded_at": "2026-09-10T19:41:00Z",
      "points": 500,
      "xp": 150
    }
  ],
  "in_progress": [
    { "achievement_id": "ach_77b2", "rule": "merch_unique_skus", "current_value": 3, "target_value": 5 }
  ]
}

Поля ответа

ПолеТипОписание
awardedarray<AwardedAchievement>Полученные достижения: achievement_id, name, image, awarded_at, points, xp.
in_progressarray<Progress>Незакрытые достижения: achievement_id, rule, current_value, target_value.
achievements_countintegerСколько достижений собрано всего.

Полезно знать

  • Достижения и условия настраиваются в админ-панели клуба: через API они доступны на чтение — каталог, прогресс, статистика и лидерборд.
  • Баллы и опыт — разные счётчики: points уходят на бонусный счёт и тратятся в магазине, xp двигает болельщика по уровням лояльности.
  • Прогресс считается по факту события — покупка билета, проход на матч, оплаченный заказ мерча, смена уровня. Возврат билета или заказа откатывает счётчик, поэтому значения current_value могут уменьшаться.
  • Проходы дедуплицируются: повторное считывание того же прохода не добавляет матч дважды, а неявки по купленным билетам собираются после матча фоновой задачей.
  • Достижение с min_loyalty_status не выдаётся болельщикам ниже этого уровня, даже если условия выполнены — прогресс при этом продолжает считаться.
  • На выдачу приходит вебхук achievement.awarded — по нему в цепочках отправляется письмо с переменными {achievement_name}, {achievement_image} и {points}.