Обновлено: 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_active | query | boolean | нет | Только активные (true) или только выключенные (false). По умолчанию возвращаются все. |
limit | query | integer | нет | Размер страницы, от 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
}Поля ответа
| Поле | Тип | Описание |
|---|---|---|
data | array<Achievement> | Достижения с полями id, name, description, image, image_back, points, xp, min_loyalty_status, is_active. |
data[].conditions | array<Condition> | Условия выдачи: rule и target_value. Достижение выдаётся, когда выполнены все условия. |
has_more | boolean | Есть ли следующая страница. |
Карточка достижения
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
}Поля ответа
| Поле | Тип | Описание |
|---|---|---|
id | string | Идентификатор достижения. |
points | integer | Баллы на бонусный счёт при выдаче. |
xp | integer | Опыт для перехода по уровням лояльности — отдельный от баллов счётчик. |
min_loyalty_status | string | null | Уровень, ниже которого достижение не выдаётся. |
conditions | array<Condition> | Правило (rule) и порог (target_value) каждого условия. |
awarded_count | integer | Сколько болельщиков уже получили достижение. |
Статистика выдач
GET /achievements/{id}/statsВыдачи достижения по неделям за выбранный период вместе с матчами клуба на той же оси — чтобы видеть, что всплеск дала домашняя серия, а не рассылка.
Параметры
| Параметр | Где | Тип | Обязателен | Описание |
|---|---|---|---|---|
id | путь | string | да | Идентификатор достижения. |
period | query | string | нет | Период: 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_total | integer | Всего выдач за период. |
weeks | array<Week> | Недели периода с полями week_start и awarded. |
events | array<Event> | Матчи клуба внутри периода: date, opponent, is_home. |
Таблица лидеров
GET /achievements/leaderboardБолельщики по числу собранных достижений. Фильтруется по уровню лояльности — лидерборд разбирается по статусам, а не листается целиком.
Параметры
| Параметр | Где | Тип | Обязателен | Описание |
|---|---|---|---|---|
loyalty_status | query | string | нет | Фильтр по уровню: silver, gold, platinum. |
search | query | string | нет | Поиск по имени или телефону болельщика. |
limit | query | integer | нет | Размер страницы, от 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
}Поля ответа
| Поле | Тип | Описание |
|---|---|---|
data | array<LeaderboardRow> | Строки с полями rank, user_id, name, achievements_count, loyalty_status. |
has_more | boolean | Есть ли следующая страница. |
Достижения болельщика
GET /users/{user_id}/achievementsПолученные достижения с датой выдачи и прогресс по ещё не закрытым — то, из чего собирается страница достижений в личном кабинете.
Параметры
| Параметр | Где | Тип | Обязателен | Описание |
|---|---|---|---|---|
user_id | путь | string | да | Идентификатор пользователя. |
include_progress | query | boolean | нет | Добавить незакрытые достижения с текущим прогрессом. По умолчанию — 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 }
]
}Поля ответа
| Поле | Тип | Описание |
|---|---|---|
awarded | array<AwardedAchievement> | Полученные достижения: achievement_id, name, image, awarded_at, points, xp. |
in_progress | array<Progress> | Незакрытые достижения: achievement_id, rule, current_value, target_value. |
achievements_count | integer | Сколько достижений собрано всего. |
Полезно знать
- Достижения и условия настраиваются в админ-панели клуба: через API они доступны на чтение — каталог, прогресс, статистика и лидерборд.
- Баллы и опыт — разные счётчики:
pointsуходят на бонусный счёт и тратятся в магазине,xpдвигает болельщика по уровням лояльности. - Прогресс считается по факту события — покупка билета, проход на матч, оплаченный заказ мерча, смена уровня. Возврат билета или заказа откатывает счётчик, поэтому значения
current_valueмогут уменьшаться. - Проходы дедуплицируются: повторное считывание того же прохода не добавляет матч дважды, а неявки по купленным билетам собираются после матча фоновой задачей.
- Достижение с
min_loyalty_statusне выдаётся болельщикам ниже этого уровня, даже если условия выполнены — прогресс при этом продолжает считаться. - На выдачу приходит вебхук
achievement.awarded— по нему в цепочках отправляется письмо с переменными{achievement_name},{achievement_image}и{points}.
