API и MCP

Два способа читать данные GetCourt: обычный JSON API и MCP-сервер для ИИ-ассистентов. Оба только на чтение.

Отдаётся ровно то, что и так видно на странице игры, — вид спорта, уровень, время, корт и сколько мест свободно. Игры на кортах, которые ещё на модерации, наружу не уходят.

JSON API

Ни ключа, ни сессии не нужно — список игр публичный.

GET https://getcourt.co/api/v1/games
GET https://getcourt.co/api/v1/games/:id

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

Параметр Что делает
city Город так, как он записан у корта, например Belgrade. Можно передать несколько раз.
sport Вид спорта, например Tennis, Padel, Squash.
skill_level Уровень игры, например Beginner.
with_spots true — только игры, где остались свободные места.
urgent true — только игры со срочным поиском игроков.
from Дата не раньше, ISO 8601 (ГГГГ-ММ-ДД).
to Дата не позже, ISO 8601 (ГГГГ-ММ-ДД).
upcoming false — добавить уже отыгранные игры. По умолчанию только будущие.
limit Сколько игр вернуть: 1–100, по умолчанию 25.

Повторяющиеся игры проходят фильтры дат всегда: их следующее вхождение считается на лету, а не лежит в колонке, — поэтому в ответе может оказаться игра вне заданного диапазона.

Запрос

curl "https://getcourt.co/api/v1/games?city=Belgrade&sport=Tennis&with_spots=true&limit=2"

Ответ

{
  "games": [
    {
      "id": 1042,
      "date": "2026-09-12",
      "time": "19:00",
      "duration_minutes": 90,
      "recurring": false,
      "sport": "Tennis",
      "skill_level": "Intermediate",
      "surface": "Hard",
      "environment": "outdoor",
      "kind": "game",
      "with_coach": false,
      "urgent_player_search": true,
      "comment": "Doubles, bring a spare ball",
      "players": { "taken": 3, "total": 4, "spots_left": 1 },
      "court": {
        "id": 17,
        "name": "Tennis Club Ada",
        "city": "Belgrade",
        "country_code": "RS",
        "latitude": 44.79,
        "longitude": 20.41,
        "indoor": false,
        "outdoor": true,
        "free": false,
        "url": "https://getcourt.co/courts/17"
      },
      "url": "https://getcourt.co/games/1042"
    }
  ]
}

Участники наружу не уходят: в ответе только «сколько мест занято из скольких», без имён и контактов.

MCP-сервер

Те же данные в виде сервера Model Context Protocol — ассистент ищет игры сам, а не разбирает страницы сайта.

  • Адрес: POST /mcp, Streamable HTTP поверх JSON-RPC 2.0, батчи поддержаны.
  • Версии протокола: 2025-06-18, 2025-03-26, 2024-11-05.
  • Авторизация: Authorization: Bearer <токен>. Без токена или с неверным — 401. Пока не выпущен ни один токен, эндпоинт выключен целиком и отвечает 404.
  • Где взять токен: выпустить себе самому в разделе Аккаунт → Безопасность, когда подтверждена почта или привязан телеграм. Срок — полгода от последнего запроса, так что рабочий токен не протухает; там же его можно отозвать.

Инструменты

Инструмент Что делает
search_games Поиск будущих игр по городу, виду спорта, уровню, датам, свободным местам и срочному поиску.
get_game Одна игра по числовому id.

Настройка клиента

Большинство MCP-клиентов принимают такой JSON-конфиг:

{
  "mcpServers": {
    "getcourt": {
      "type": "http",
      "url": "https://getcourt.co/mcp",
      "headers": { "Authorization": "Bearer YOUR_TOKEN" }
    }
  }
}

Или вызвать напрямую

curl -X POST https://getcourt.co/mcp \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
       "params":{"name":"search_games","arguments":{"city":"Belgrade","with_spots":true}}}'

Ограничения

  • JSON API: 60 запросов в минуту с одного IP.
  • MCP: 120 запросов в минуту с одного IP — на один вопрос обычно уходит несколько вызовов.
  • Оба интерфейса только читают: создать игру или записаться в неё через них нельзя.