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

FACEIT API

Уровень, ELO и статистика матчей для страниц игроков и ботов сообщества. Достаточно ключа WOK; отдельный ключ FACEIT не нужен.

Откуда данные FACEIT? Из FACEIT через интерфейс, который использует его сайт. Для запросов нужен ключ WOK; отдельный ключ FACEIT не требуется. Доступные методы описаны в документации API.

Ранг и статистика FACEIT: включены, без ключа FACEIT. 2 бесплатные проверки в сутки на один IP. Без регистрации.

Руководство разработчика · Русский

От SteamID64 к ELO, статистике и последним матчам FACEIT

Создайте карточку игрока или бота сообщества с помощью существующих методов FACEIT. Начните с одного запроса профиля; по необходимости загружайте статистику с доступными разрезами по картам и соревнованиям или отдельную страницу последних матчей.

Посмотреть три примера карточки игрока: полученные показатели, отсутствующие данные и сбой запроса истории.

Какой API и ключ FACEIT выбрать

Выберите источник по задаче. WOK — независимый сервис; ключ WOK и ключ официального FACEIT Data API не взаимозаменяемы.

ИнтеграцияПодходящая задачаКлюч и границы доступа
WOK APIКарточка игрока или бот с публичным профилем Steam, ELO, уровнем CS2, общей статистикой и последними матчами FACEIT.Храните ключ WOK на сервере. Ниже описаны поддерживаемые методы профиля, статистики и истории. Данные адаптируются из интерфейса сайта FACEIT; полное покрытие официального Data API не обещается.
FACEIT Data APIПриложение, напрямую использующее документированные ресурсы игроков, команд и соревнований FACEIT.Создайте приложение в FACEIT Developer Portal и используйте ключ FACEIT по официальной документации. Этот ключ не авторизует запросы к WOK.

FACEIT Data API · Официальная инструкция по ключам

Методы WOK и параметры запросов · Объединить Steam и FACEIT · Добавить публичные предметы CS2

  1. Найдите игрокаПередайте SteamID64 в game_player_id с game=cs2. Читайте ELO и уровень из games.cs2.faceit_elo и games.cs2.skill_level.
  2. Сохраните идентификатор игрока FACEITИспользуйте полученный player_id в путях запросов статистики и истории. SteamID64 и никнейм не заменяют этот идентификатор.
  3. Запросите нужные дополнительные данныеОбщая статистика находится в lifetime; необязательный segments[] содержит разрезы Map или Competition с режимом mode из того же ответа. Метка Competition является идентификатором соревнования, а не его названием. Матчи находятся в items[]; необязательный match_stats.Headshots содержит число хедшотов, а не процент. История принимает limit от 1 до 20. Для выбора страницы используйте отдельный HTTP-запрос с page от 0 до 100. Позиции страниц могут меняться.

Скачайте руководство по полям и страницам FACEIT (Markdown, англ.). В нём описаны границы данных, необязательные поля и явный HTTP-запрос страницы; SDK 1.3.0 запрашивает только первую страницу истории.

Храните WOK_API_KEY и WOK_STEAM_ID из 17 цифр в окружении сервера. Нужен ключ тарифа Players или универсального тарифа с доступом к FACEIT; отдельный ключ FACEIT не требуется. Не размещайте ключ WOK в коде браузера, сообщениях бота или публичных URL.

Три запроса через cURL

# Задайте WOK_API_KEY и WOK_STEAM_ID в окружении сервера.
set -eu
curl --fail-with-body --max-time 35 --get \
  -H "Authorization: Bearer $WOK_API_KEY" \
  "https://woksteamapi.com/faceit/data/v4/players" \
  --data-urlencode "game=cs2" \
  --data-urlencode "game_player_id=$WOK_STEAM_ID"

# Сохраните player_id из ответа в WOK_FACEIT_PLAYER_ID.
curl --fail-with-body --max-time 35 \
  -H "Authorization: Bearer $WOK_API_KEY" \
  "https://woksteamapi.com/faceit/data/v4/players/$WOK_FACEIT_PLAYER_ID/stats/cs2"
curl --fail-with-body --max-time 35 \
  -H "Authorization: Bearer $WOK_API_KEY" \
  "https://woksteamapi.com/faceit/data/v4/players/$WOK_FACEIT_PLAYER_ID/history?game=cs2&limit=5"
Полный клиент на Python
# Python 3: установите requests; задайте WOK_API_KEY и WOK_STEAM_ID.
import json
import os
import re
import requests

steam_id = os.environ["WOK_STEAM_ID"]
if not re.fullmatch(r"[0-9]{17}", steam_id):
    raise SystemExit("WOK_STEAM_ID должен содержать SteamID64 из 17 цифр")
session = requests.Session()
session.headers["Authorization"] = f"Bearer {os.environ['WOK_API_KEY']}"

def read(path, params=None, *, allow_missing=False):
    response = session.get("https://woksteamapi.com" + path,
                           params=params, timeout=(5, 30),
                           allow_redirects=False)
    if allow_missing and response.status_code == 404:
        return None
    response.raise_for_status()  # Остановиться при ошибке ключа, квоты или источника.
    return response.json()

profile = read("/faceit/data/v4/players", {
    "game": "cs2", "game_player_id": steam_id,
}, allow_missing=True)
if profile is None:
    raise SystemExit("Для этого SteamID64 не найден профиль FACEIT CS2")
player_id = profile.get("player_id", "")
if not re.fullmatch(r"[A-Za-z0-9-]{1,64}", player_id):
    raise SystemExit("В профиле отсутствует допустимый player_id")
# Эти два запроса необязательны: запрашивайте только нужные странице данные.
stats = read(f"/faceit/data/v4/players/{player_id}/stats/cs2")
history = read(f"/faceit/data/v4/players/{player_id}/history",
               {"game": "cs2", "limit": 5})
print(json.dumps({
    "nickname": profile.get("nickname"),
    "rank": profile.get("games", {}).get("cs2", {}),
    "lifetime": stats.get("lifetime", {}),
    "recent_matches": history.get("items", []),
}, indent=2))
Полный клиент на Node.js
// Node.js 18+: задайте WOK_API_KEY и WOK_STEAM_ID на сервере.
const key = process.env.WOK_API_KEY;
const steamId = process.env.WOK_STEAM_ID;
if (!key || !/^[0-9]{17}$/.test(steamId || "")) {
  throw new Error("Задайте WOK_API_KEY и WOK_STEAM_ID из 17 цифр");
}
async function read(path, params = {}, allowMissing = false) {
  const url = new URL(path, "https://woksteamapi.com");
  url.search = new URLSearchParams(params);
  const response = await fetch(url, {
    headers: { Authorization: `Bearer ${key}` },
    signal: AbortSignal.timeout(35_000),
    redirect: "error"
  });
  if (allowMissing && response.status === 404) return null;
  if (!response.ok) throw new Error(`WOK HTTP ${response.status}`);
  return response.json();
}
const profile = await read("/faceit/data/v4/players", {
  game: "cs2", game_player_id: steamId
}, true);
if (!profile) throw new Error("Для этого SteamID64 не найден профиль FACEIT CS2");
if (!/^[A-Za-z0-9-]{1,64}$/.test(profile.player_id || "")) {
  throw new Error("В профиле отсутствует допустимый player_id");
}
const playerPath = `/faceit/data/v4/players/${encodeURIComponent(profile.player_id)}`;
// Необязательные запросы: получайте только нужные странице игрока данные.
const stats = await read(`${playerPath}/stats/cs2`);
const history = await read(`${playerPath}/history`, { game: "cs2", limit: "5" });
console.log({ nickname: profile.nickname, rank: profile.games?.cs2,
  lifetime: stats.lifetime, recent_matches: history.items });

Эти клиенты выполняют не более трёх запросов и останавливаются при ошибке; автоматических повторов нет. Полный сценарий расходует три единицы квоты, если все вызовы допущены к выполнению. Каждый запрос профиля, статистики или истории стоит одну единицу, включая ответ из кэша. GET /v1/key показывает доступ, остаток квоты и время сброса без расхода единицы запроса.

Читайте ответ, сохраняя неизвестные значения

Метрики lifetime, например Matches, Wins и Average K/D Ratio, при наличии возвращаются строками. Отсутствующее поле означает недоступные данные, а не ноль. Записи последних матчей могут содержать finished_at (Unix-время в секундах), elo, elo_delta и match_stats с картой, счётом, убийствами и смертями. Экранируйте имена и подписи перед вставкой в HTML.

Различайте отсутствие данных, проблемы доступа и временные сбои

ОтветЗначение и дальнейшее действие
Профиль: HTTP 404Игрок FACEIT для этого SteamID и игры не найден. Это не означает ошибку аккаунта Steam.
Статистика: HTTP 200, lifetime:{}Общая статистика не получена. Сохраните профиль, оставьте отсутствующие показатели пустыми.
История: HTTP 200, items:[]Последние матчи не получены. Профиль игрока при этом остаётся действительным.
HTTP 400 / 422Проверьте идентификаторы и параметры; значение limit для истории должно быть от 1 до 20.
HTTP 401 / 403 / 402Проверьте действительность ключа, доступ к методу, состояние аккаунта и квоты. Устраните причину перед повторным запросом.
HTTP 429 / 503Учитывайте Retry-After, если он передан. Приостановите цикл опроса до снятия ограничения или восстановления доступности.
HTTP 502Источник FACEIT временно недоступен. Сохраните предыдущий результат с отметкой об устаревании и повторите запрос позже с ограничением числа попыток; не заменяйте ранг нулём.

Кэш и границы источника данных

Снимки профиля и общей статистики используют настраиваемый TTL кэша, по умолчанию — шесть часов. Ранг из кэша может отставать от только что завершённого матча. Для последних матчей нет постоянного кэша результатов: выполняется отдельный запрос к источнику с ограниченным временем ожидания. История также зависит от доступности FACEIT и не гарантирует немедленное появление завершённого матча. Эти ответы не содержат времени наблюдения или точного возраста кэша; время получения ответа вашим клиентом не подтверждает свежесть данных.

WOK адаптирует подтверждённые публичные поля сайта-источника и не обещает полное покрытие официального FACEIT API. Необязательные memberships и friends_count не подтверждают платную подписку или полноту списка друзей. Профили и инвентари Steam запрашиваются отдельно; ни один метод не открывает закрытые данные Steam.

Как превратить ответы FACEIT в карточку игрока

Три вымышленных примера показывают, какие данные можно вывести пользователю. Это не реальные игроки, отзывы клиентов или свежие данные FACEIT. Профиль, статистика и история ниже — фрагменты отдельных HTTP-ответов; внешние подписи profile, stats, history и http_status добавлены для сравнения и не являются новым форматом ответа API.

Профиль, статистика и один полученный матч

Example playerELO 1450 · Уровень 6120 матчей · 68 победСредний K/D: 1.10Полученный матч: +20 ELO · 12 хедшотов
Сопоставить сохранённые ответы с карточкой
{
  "profile": {
    "http_status": 200,
    "body": {
      "player_id": "example-player",
      "nickname": "Example player",
      "games": {
        "cs2": {
          "faceit_elo": 1450,
          "skill_level": 6
        }
      }
    }
  },
  "stats": {
    "http_status": 200,
    "body": {
      "lifetime": {
        "Matches": "120",
        "Wins": "68",
        "Average K/D Ratio": "1.10"
      }
    }
  },
  "history": {
    "http_status": 200,
    "body": {
      "start": 0,
      "end": 1,
      "items": [
        {
          "match_id": "example-match",
          "game_id": "cs2",
          "elo": 1450,
          "elo_delta": 20,
          "match_stats": {
            "Kills": "24",
            "Deaths": "16",
            "Headshots": "12"
          }
        }
      ]
    }
  }
}

12 — число хедшотов в этом матче, а не процент. Средний K/D из lifetime относится к общей статистике; не подменяйте им K/D отдельного матча. Одна строка истории не доказывает полноту списка матчей.

Профиль есть, дополнительные данные не получены

Example playerELO 1450 · Уровень 6Матчи: недоступноСредний K/D: недоступноПоследние матчи не получены
Сопоставить сохранённые ответы с карточкой
{
  "profile": {
    "http_status": 200,
    "body": {
      "player_id": "example-player",
      "nickname": "Example player",
      "games": {
        "cs2": {
          "faceit_elo": 1450,
          "skill_level": 6
        }
      }
    }
  },
  "stats": {
    "http_status": 200,
    "body": {
      "lifetime": {}
    }
  },
  "history": {
    "http_status": 200,
    "body": {
      "start": 0,
      "end": 0,
      "items": []
    }
  }
}

Сохраните успешно полученный профиль и ранг. Пустые lifetime и items не доказывают, что игрок никогда не играл. Не превращайте отсутствующий счётчик матчей в 0 и не выводите K/D 0.00.

Нулевые счётчики получены, история временно недоступна

Example playerELO 1450 · Уровень 60 матчей · 0 побед в ответе lifetimeСредний K/D: недоступноИстория временно недоступна
Сопоставить сохранённые ответы с карточкой
{
  "profile": {
    "http_status": 200,
    "body": {
      "player_id": "example-player",
      "nickname": "Example player",
      "games": {
        "cs2": {
          "faceit_elo": 1450,
          "skill_level": 6
        }
      }
    }
  },
  "stats": {
    "http_status": 200,
    "body": {
      "lifetime": {
        "Matches": "0",
        "Wins": "0"
      }
    }
  },
  "history": {
    "http_status": 502
  }
}

Строка "0" — полученное значение; отсутствующий Average K/D Ratio остаётся неизвестным. Ошибка HTTP 502 относится к запросу истории: она не отменяет уже сохранённый успешный профиль и не означает отсутствие матчей. Эти раздельные ответы могут относиться к разным снимкам источника.

Время наблюдения и точный возраст кэша в этих ответах отсутствуют: не ставьте отметку «обновлено сейчас» по времени загрузки страницы. Клиенты выше намеренно останавливаются при ошибке. Если ваше приложение должно сохранить карточку при сбое необязательного запроса, сначала сохраните успешный ответ профиля, затем обработайте ошибку статистики или истории отдельно. Сравнение примеров не отправляет запросов и не расходует квоту.

Запустите общую карточку игрока Steam и FACEIT

Скачайте пример Steam + FACEIT на Python и следуйте инструкции по настройке и запуску (англ.). Связывайте два сервиса по найденному SteamID64; храните сведения Steam и ранг FACEIT в отдельных полях. Отсутствие аккаунта FACEIT не делает профиль Steam недействительным. Отсутствующий ранг и показатели lifetime оставляйте недоступными, не заменяйте нулём. Храните ключ WOK на сервере.

Полная справка API · Контракт OpenAPI · Добавить профиль Steam (англ.) · Обзор API CS2 (англ.) · Тарифы и лимиты запросов

Статистика игроков и история матчей

FACEIT API

Уровень, ELO и статистика матчей для страниц игроков и ботов сообщества. Достаточно ключа WOK; отдельный ключ FACEIT не нужен.

1 000 запросов за 30 дней на Free Developer. Оплата не нужна.

FACEITJSON
GET/faceit/data/v4/players
{
  "games": {
    "cs2": {
      "skill_level": 10,
      "faceit_elo": 2100
    }
  }
}

Пример полей ответа. Значения условные.

Посмотреть методы API

От Steam-профиля до вашего продукта

Вставьте открытый Steam-профиль, чтобы увидеть предметы и цены

2 бесплатные проверки в сутки на один IP. Без регистрации.

Пример инвентаряCS2

Примерные значения, не текущие рыночные цены

Ваши игроки уже здесь

Данные инвентарей восьми игр

Интеграция

Данные для полезных функций

Работайте с одним HTTP API, чтобы не подключать инвентари, цены и данные игроков по отдельности.

Посмотреть методы API
/v1/inventory

Инвентари и цены предметов

Предметы и стоимость инвентаря в CS2, Rust, TF2, Dota 2, PUBG, s&box, Unturned и PAYDAY 2. Ответ показывает доступные цены и предметы без оценки.

/faceit/data/v4

Профили Steam и статистика FACEIT

Добавьте в приложение профили игроков, уровень FACEIT, ELO и статистику матчей. Достаточно ключа WOK; отдельный ключ FACEIT не нужен.

/v1/inventories

Пакетные запросы для списка игроков

До 20 игроков и четырёх игр в одном запросе, с отдельным результатом для каждой пары игрок-игра. Каждая запрошенная пара расходует единицу квоты.

meta.cache_age

Понятная свежесть данных

Проверяйте возраст снимка инвентаря и источники цен предметов. Обновляйте цены по локальному каталогу без повторного сканирования актуального снимка.

Сравните стоимость вашей нагрузки

Стоимость запросов инвентаря в WOK, SteamWebAPI и SteamApis при одинаковой нагрузке

30,000запросов за 30 дней
Сервис Стоимость в месяц Включено запросов Запросов в минуту
WOK- -за 30 днейАвтопродление по выбору Включено запросов-за 30 дней Запросов в минуту-
SteamWebAPI- -в месяц Включено запросов-в месяц Запросов в минуту-
SteamApisПакет запросов -в месяц Включено запросов-в месяц Запросов в минутуНе опубликован
Как считаем

Обычные запросы инвентаря одного игрока в одной игре, без пакетной обработки и принудительного обновления. Другие методы и состав данных у сервисов различаются

Расчёт на 30 дней с равномерной нагрузкой в течение суток. Учитываем опубликованные лимиты за месяц, сутки и минуту. Для пиков нагрузки нужен запас

По умолчанию тарифы WOK оплачиваются разово. Для нового тарифа на 30 дней можно выбрать автопродление через Stripe при оформлении заказа.

SteamApis: минимальная стоимость запросов с учётом опубликованных доплат за превышение пакета. Для превышения нужны включённая опция и достаточный баланс. Минутный лимит инвентаря публично не указан. Это оценка стоимости; пропускная способность при выбранной нагрузке не подтверждена

WOK: сначала подходящий готовый тариф. Пакеты квоты добавляются только тогда, когда ни одного тарифа не хватает на выбранный объём. Каждый пакет за $45 добавляет 1 млн единиц и 50 тыс. в сутки до текущего сброса квоты. Пакеты оплачиваются разово и не повышают минутный лимит. Действуют общие пределы одного ключа. Расчёт - для нового окна в 30 дней.

Опубликованные лимиты в минуту: WOK Ultra 1200 / Titan 2000 единиц квоты; SteamWebAPI Inventory High+ 200 запросов. Пакетный запрос может расходовать несколько единиц WOK.

Один пакет по 20 игрокам в 4 играх расходует 80 единиц квоты - максимум 80 пар игрок-игра за вызов.

Официальные тарифыSteamWebAPISteamApis

Цены WOK берём из актуального каталога тарифовЦены конкурентов проверены

Первый запрос

Первый запрос инвентаря

Получите ключ, сохраните его на сервере и запросите публичный инвентарь. Начните с curl, Python или JavaScript и используйте ответ в приложении.

Подключение API инвентарей Steam: пакеты и снимки

# Keep WOK_API_KEY on the server
curl --fail-with-body \
  -H "Authorization: Bearer $WOK_API_KEY" \
  "https://woksteamapi.com/v1/inventory?steam_id=$STEAM_ID&game=cs2"
Справочник API

Все публичные методы в одном месте

Точные параметры, формы ответов и коды состояния работающего сервиса.

Авторизация

Для всех методов данных используйте один ключ WOK в Authorization: Bearer. Ключ Steam настроен на сервере WOK. Запросы из браузера с другого домена (CORS) не поддерживаются: храните ключ WOK на своём сервере. Health доступен без ключа.

Установите типизированный клиент

Скачайте версию 1.3.0 для методов из этой документации.

Версии в npm и PyPI публикуются отдельно. Проверьте скачанные файлы перед установкой и храните API-ключи на сервере.

Манифест сборки и контрольные суммы · SHA256SUMS

Начало работы · один ключ WOK

Подключите сервер или агента за три запроса

Один ключ WOK API работает для всех доступных вашему тарифу игр и методов данных игроков. Ключ Steam Web API хранится на серверах WOK.

  1. Получите ключ WOKСкопируйте ключ из кабинета и сохраните на сервере как WOK_API_KEY. Передавайте Authorization: Bearer <WOK_API_KEY>; не отправляйте ключ WOK в Steam и не помещайте его в URL.
  2. Проверьте ключВызовите GET /v1/key. Метод показывает активность ключа и остаток квоты, не расходуя единицу запроса.
  3. Выберите игру и методИспользуйте GET /v1/inventory?steam_id=STEAMID64&game=rust для инвентаря Rust. Для другой именованной игры измените только game на нужное значение. Достижения и время игры в Rust доступны отдельными методами ниже.
curl -H "Authorization: Bearer ${WOK_API_KEY}" "https://woksteamapi.com/v1/key"
curl -H "Authorization: Bearer ${WOK_API_KEY}" "https://woksteamapi.com/v1/inventory?steam_id=${STEAM_ID}&game=rust"
curl -H "Authorization: Bearer ${WOK_API_KEY}" "https://woksteamapi.com/v1/rust/achievements?steam_id=${STEAM_ID}"

Для статистики Rust и списка друзей нужен SteamID64 из 17 цифр. Методы инвентаря и профиля также принимают ссылки на профиль и пользовательские адреса vanity. Откройте полное руководство по интеграции (англ.) с описанием полей ответа, ошибок и примерами.

Параметр game для инвентаря, цен, каталога и истории
ИграgameSteam AppIDДополнительные методы
Counter-Strike 2cs2730CS2 inspect с дополнением к тарифу
Rustrust252490/v1/rust/stats, /v1/rust/achievements, /v1/rust/playtime
Dota 2dota2570Инвентарь, цены, каталог, история
Team Fortress 2tf2440Инвентарь, цены, каталог, история
PUBGpubg578080Инвентарь, цены, каталог, история
s&boxsandbox590830Инвентарь, цены, каталог, история
Unturnedunturned304930Инвентарь, цены, каталог, история
PAYDAY 2payday2218620Инвентарь, цены, каталог, история
Руководства по интеграции

Выберите сценарий интеграции

Рабочие примеры, поддерживаемые игры и ограничения, которые должно учитывать приложение. Ссылки с пометкой «англ.» ведут к английским материалам.

Тарифы Steam API

Начните с бесплатного ключа или выберите тариф. Разовая оплата или автопродление через Stripe.

Период оплаты

При предоплате за 3 месяца скидка 5%, за 6 месяцев 10%, за 12 месяцев 15%. Оплата одним платежом; дополнения оплачиваются отдельно.

ДОПОЛНИТЕЛЬНЫЕ ФУНКЦИИ

Подключайте только нужные возможности

Купите дополнение для активной подписки. Оплата и активация проходят автоматически.

АВТОМАТИЧЕСКИ

Выберите активную подписку, оплатите, и новая функция подключится автоматически после подтверждения.

Вопросы

Живое состояние сервиса

Системы WOK

Текущее публичное состояние того же рабочего узла, который обслуживает API.

Общее состояниеПроверяем рабочий узел
Последняя проверка...
Публичный APIChecking

HTTP-проверка и ответ приложения

Процесс приложенияChecking

Рабочий процесс сервиса ответил на проверку

База данныхChecking

Проверочное чтение из базы данных выполнено

Проверки в этой сессии браузера

Каждая отметка является реальным ответом health, полученным пока открыта страница.

GET /healthz

Попробуйте в своём проекте

От идеи до первого запроса

1 000 запросов за 30 дней на Free Developer. Оплата не нужна.

Получить бесплатный ключ