Playbox Organizer API
Получай данные о своих играх, лигах и матчах из скрипта или со своего сервера: кто играл и как платил, таблицы, бомбардиры, голы, карточки и хайлайты. Только чтение и только твои данные.
Базовый URL: https://app.play-box.xyz/api/organizer/v1/
Первый запрос за 5 минут
- Получи ключ. В приложении Playbox открой «Настройки → Инструменты организатора → API-ключи → Создать ключ». Дай ключу название и отметь «Я согласен с условиями API». Ключ выглядит как
pbo_xxxxxxxx.long-secretи показывается только один раз. Сохрани его в переменных окружения своего сервера. - Проверь подключение.
curl -H "X-Api-Key: $PLAYBOX_KEY" https://app.play-box.xyz/api/organizer/v1/me/
Ответ 200 вернёт твой username, название ключа и дату, до которой ключ действует.
- Получи свои игры.
curl -H "X-Api-Key: $PLAYBOX_KEY" "https://app.play-box.xyz/api/organizer/v1/events/?from=2026-09-01&status=FINISHED"
Ключ
- Ключ личный: он действует от твоего имени и видит только твои данные.
- Ключ действует 365 дней. За 14 и за 3 дня до окончания срока придёт напоминание (push, Telegram, почта). После этого API отвечает
key_expired: создай новый ключ и замени его на сервере. - Одновременно может быть до 5 активных ключей. Ненужный или утёкший ключ можно отозвать в любой момент, он сразу перестаёт работать.
- Передавай ключ в заголовке
X-Api-Key: pbo_...(илиAuthorization: Api-Key pbo_...). Ключ в URL не принимается, потому что он попал бы в логи. - Только с сервера. Запрос из браузера (с заголовком
Origin) получает403 browser_not_allowed: ключ внутри веб-страницы виден каждому посетителю. - Ключ не открывает приложение, а сессия приложения не открывает этот API.
Что считается твоими данными
- игры, которые ты организуешь, создал, получаешь за них деньги или управляешь ими;
- лиги, которые ты создал или администрируешь, и все их игры;
- игры, привязанные к сообществу, которым ты владеешь или которое администрируешь (включая игры, созданные соорганизатором).
Чужая игра или лига возвращает 404, так же как несуществующая. Контакты и фото игроков не отдаются никогда.
Лимиты
60 запросов в минуту на ключ. Запрос это один вызов любого URL API с действующим ключом, включая ответы 404 и 400. Окно обнуляется в начале каждой минуты.
| Заголовок ответа | Значение |
|---|---|
X-RateLimit-Limit | лимит в минуту |
X-RateLimit-Remaining | сколько запросов осталось в текущей минуте |
X-RateLimit-Reset | секунд до обнуления окна |
Retry-After | только при 429: сколько секунд подождать перед повтором |
Храни данные у себя и забирай только новое: свежие игры по from и матчи завершённых игр. Если выкачивать всю историю при каждом открытии сайта, лимит закончится за секунды.
Ошибки
У всех ошибок одинаковая форма. Ветвись по code, а message пиши в лог.
{"error": {"code": "invalid_parameter", "message": "from: Use YYYY-MM-DD.", "fields": {"from": "Use YYYY-MM-DD."}}}
| HTTP | code | Что делать |
|---|---|---|
| 401 | not_authenticated | нет заголовка с ключом |
| 401 | invalid_key | ключ неверный или отозван, создай новый |
| 401 | key_expired | срок ключа истёк, создай новый |
| 403 | browser_not_allowed | запрос пришёл из браузера, вызывай API со своего сервера |
| 404 | not_found | объекта нет или он не твой |
| 400 | invalid_parameter | неверный параметр, подробности в fields |
| 405 | method_not_allowed | API только для чтения, используй GET |
| 429 | rate_limited | подожди retry_after секунд |
Формат данных
- Время всегда в UTC, ISO 8601. Деньги приходят парой:
{"amount": 800.0, "currency": "RSD"}. - Списки (
leagues/,events/) постраничные:?limit=50&offset=0,limitдо 100. Ответ имеет вид{"count", "limit", "offset", "next_offset", "results"}, аnext_offset: nullозначает последнюю страницу. - Игрок:
{"id", "username", "is_guest", "url"}.is_guest: trueэто общий гостевой аккаунт для голов игроков без профиля: такие голы идут в счёт матча, но не в личную статистику. - Ссылки. У игр, матчей, лиг и игроков есть
urlна их страницу в Playbox. Используй его, когда показываешь данные на своём сайте: на странице полная статистика и видео.
Эндпоинты
GET /me/
Чей это ключ: пользователь, название ключа, срок действия, версия условий, лимиты.
GET /leagues/
Твои лиги: id, slug, name, status (active, finished, archived), format, city, date_start, date_end, teams_count, price, game_price, url.
GET /leagues/{id}/
Лига и её правила: техническое поражение, дисциплина (лимит жёлтых карточек, дисквалификации), размер заявки.
GET /leagues/{id}/table/
Турнирная таблица в том же порядке, что и в приложении: position, team, played, wins, draws, losses, goals_for, goals_against, goal_difference, points.
GET /leagues/{id}/players/
Таблица игроков: player, team, position, games, goals, assists, yellow_cards, red_cards, suspension_games_left. Сортировка по голам, затем по передачам.
GET /leagues/{id}/rosters/
Заявки команд: каждая команда со своими игроками и датой их добавления.
GET /events/
Твои игры, сначала новые. Фильтры: from, to (YYYY-MM-DD по дате начала, UTC), status (NOT_STARTED, STARTED, FINISHED, CANCELLED), league (id), format (игроков в команде, например 8). Поля: id, league_id, starts_at, ends_at, status, results_status, format, venue, is_paid, price, price_per_player, capacity, players_count, teams_count, is_ranked, is_private, url.
GET /events/{id}/
Вся игра: команды (цвет, победы, ничьи, поражения, состав), матчи со счётом и url, mvp_player_id, записи на YouTube, трансляции.
GET /events/{id}/participants/
Кто записался и как платил: player, status (In game, Late, Did not come, Invited), team_id, joined_at, payment_method (CASH, WALLET, CARD, STRIPE, APPLE_PAY, GOOGLE_PAY, TELEGRAM), paid, payment_confirmed, paid_by, amount, is_early_bird. Эти данные только для тебя: не публикуй их.
GET /events/{id}/player-stats/
Результат каждого игрока за игру: wins, draws, losses, goals, assists, goals_conceded, yellow_cards, red_cards, rating, rating_change, is_confirmed. Доступно после завершения игры.
GET /matches/{id}/
Весь матч: event_id, league_id, number, tour, starts_at, ends_at, state, teams, score, technical_defeat, referee, video_url, url, хронология timeline, серия пенальти penalty_shootout, составы lineups (кто вышел в старте, секунды на поле) и хайлайты highlights (ссылками на YouTube).
"timeline": [
{"type": "period", "half": 1, "is_extra_time": false, "started_at": "...", "ended_at": "...", "duration_seconds": 1200},
{"type": "goal", "game_time_seconds": 305, "team_id": 1, "player": {}, "assistant": {}, "is_own_goal": false, "youtube_url": "..."},
{"type": "card", "game_time_seconds": 700, "team_id": 2, "player": {}, "card": "YELLOW", "reason": "Dissent"},
{"type": "substitution", "game_time_seconds": 900, "team_id": 2, "player_out": {}, "player_in": {}, "until_end": true}
]
- Типы событий:
period,goal,card,substitution,player_added,player_removed. Тайм 3 и 4 это дополнительное время. - Автогол (
is_own_goal: true) записывается на команду, в пользу которой он засчитан. - При техническом поражении в
scoreприсуждённый счёт, причина и счёт лежат вtechnical_defeat.
Примеры
Python
import os, requests
API = "https://app.play-box.xyz/api/organizer/v1"
session = requests.Session()
session.headers["X-Api-Key"] = os.environ["PLAYBOX_KEY"]
def fetch_all(path, **params):
offset = 0
while offset is not None:
page = session.get(f"{API}/{path}", params={**params, "offset": offset, "limit": 100}).json()
yield from page["results"]
offset = page["next_offset"]
for event in fetch_all("events/", status="FINISHED", **{"from": "2026-09-01"}):
detail = session.get(f"{API}/events/{event['id']}/").json()
for match in detail["matches"]:
print(event["starts_at"], match["score"], match["url"])
JavaScript (Node 18+, на сервере)
const API = "https://app.play-box.xyz/api/organizer/v1";
const headers = { "X-Api-Key": process.env.PLAYBOX_KEY };
const res = await fetch(`${API}/leagues/8/players/`, { headers });
if (!res.ok) {
const { error } = await res.json();
throw new Error(`${error.code}: ${error.message}`);
}
const { results } = await res.json();
console.log(results.slice(0, 10).map(r => `${r.player.username}: ${r.goals}`));
Условия использования (версия 2026-10-01)
- Данные API используются только для работы с твоими играми, лигами и сообществом.
- Не публикуй оплаты, суммы, способы оплаты, статусы явки и фото игроков. Публично можно показывать спортивную статистику: счёт, голы, передачи, таблицы.
- Не передавай и не продавай данные третьим лицам.
- Не веди запись и оплату игр в обход Playbox.
- При публичном показе данных указывай источник «данные Playbox» со ссылкой на Playbox.
- Храни ключ на сервере и никому его не передавай. Если ключ утёк, сразу отзови его.
- При нарушении условий ключ отзывается. После отзыва ключа удали сохранённые персональные данные игроков.
Версии
Версия указана в URL (v1). Новые поля могут появляться в ответах без смены версии, поэтому не падай на незнакомых полях. Удалять или переименовывать поля будем только в v2, а v1 продолжит работать.
- 2026-10-02, v1. Первый выпуск: лиги, игры, участники, матчи, ссылки на Playbox, срок действия ключа, условия, заголовки лимитов, единый формат ошибок.