Два входа
easygym предлагает REST API для сайтов, приложений и скриптов и MCP-сервер для AI-ассистента, который поддерживает Model Context Protocol. Оба живут по адресу админки: REST API — под /v1, MCP-сервер — на /mcp. Полные адреса вашей установки показывает вкладка «API» в «Настройках».
Оба входа авторизуются одними и теми же ключами доступа, видят только данные клуба, выдавшего ключ, и записывают на занятия по той же логике, что и личный кабинет: правила записи, вместимость, настройка листа ожидания занятия и покрытие абонементом.
Создайте ключ доступа
- Откройте «Настройки» → «API». Создавать ключи могут владелец клуба, администраторы и свои роли с полным доступом к «Настройкам».
- В блоке «Создать ключ» укажите «Название» — например, для какой интеграции он — и отметьте нужные «Области доступа».
- Нажмите «Создать ключ» и сразу скопируйте ключ: он показывается один раз. easygym хранит только его хеш.
- Передавайте его в каждом запросе заголовком Authorization: Bearer, за которым следует ключ.
Список «Ключи доступа» показывает название ключа, его видимое начало (ec_sk_live_ и несколько символов), области и «Последнее использование». «Отозвать» выключает ключ сразу — даже когда админка только для чтения. Сами ключи не истекают, поэтому отзывайте те, что больше не нужны. Поддержка easygym не может выдавать ключи даже в режиме поддержки.
Ключ получает не больше, чем роль его создателя
«Области доступа» предлагают только то, что роль создателя может во всём клубе: роль без доступа к участникам не создаст ключ с contacts:read. При последующих изменениях ролей ключ сохраняет свои области, поэтому отзывайте ключи, которым они больше не положены.
Области доступа
Область имеет вид ресурс:действие, и право на запись включает чтение того же ресурса. «Области доступа» в форме ключа предлагают ровно те области, которые проверяют REST API и MCP-сервер:
- contacts:read — список контактов, а через MCP — поиск участника и сводка по нему.
- classes:read — расписание со свободными местами.
- bookings:read — список записей.
- bookings:write — запись участника на занятие.
- analytics:read — показатели клуба через MCP.
У ключа, созданного раньше, в списке могут быть и другие области. Ни один эндпоинт и ни один инструмент их не требует, а с областями выше ключ продолжает работать.
REST-эндпоинты
- GET /v1/contacts (contacts:read): контакты не из архива — id, uuid, имя и фамилия, почта, телефон, тип и дата регистрации.
- GET /v1/classes (classes:read): занятия — id, uuid, название, начало и конец, вместимость, цена без налога, зона, филиал, число записей и свободные места. Необязательные параметры from и to ограничивают время начала.
- GET /v1/bookings (bookings:read): записи — id, uuid, uuid участника, название занятия, начало и конец, статус, состояние оплаты и цена.
- POST /v1/bookings (bookings:write): записывает участника на занятие; в JSON-теле — contactUuid и classUuid.
Списки отдаются страницами. Параметр limit задаёт размер страницы — по умолчанию 25, максимум 100. В ответе есть data и nextCursor; передайте nextCursor обратно параметром cursor, чтобы получить следующую страницу, пока он не станет null. Даты — строки ISO 8601.
Запись через API
POST /v1/bookings работает по той же логике записи, что и личный кабинет, и ключ не может обойти правила записи. Если занятие покрывает абонемент участника, используется он; если ни один не покрывает, запись создаётся неоплаченной по цене занятия. Заполненное занятие ставит участника в лист ожидания, если лист ожидания у занятия не выключен. Участника, который уже записан на занятие или стоит в его листе ожидания, второй раз не записывают, поэтому повтор запроса не создаёт дубль.
- 201 с data.status booked и data.bookingId либо waitlisted и data.waitlistEntryId.
- 409 already_booked: участник уже записан на это занятие или стоит в его листе ожидания.
- 409 class_full: занятие заполнено, а лист ожидания у него выключен.
- 409 class_closed: занятие отменено или уже прошло.
- 409 policy_blocked: запись не разрешают правила — например, окно записи закрыто или у участника нет доступа к онлайн-филиалу.
- 404 contact_not_found или class_not_found: такого uuid в этом клубе нет.
- 400 invalid_body или missing_fields: тело не JSON или в нём нет contactUuid или classUuid.
MCP-сервер
MCP-сервер говорит на JSON-RPC 2.0 поверх HTTP POST: один запрос — один JSON-ответ, версия протокола 2025-06-18. initialize и tools/list работают без ключа; для tools/call нужен ключ в заголовке Authorization с областью инструмента. Результат приходит текстом и в structuredContent; неудачная проверка ключа возвращает ошибку JSON-RPC с кодом -32001. Запись, в которой book_class отказывает, возвращается ошибкой инструмента (isError) с тем же кодом, что и в REST API, — например, already_booked или class_full.
- list_classes (classes:read): ближайшие занятия с числом записей; limit до 50, по умолчанию 10.
- find_member (contacts:read): поиск по имени, телефону, почте или коду чекина.
- member_summary (contacts:read): по contactUuid — абонементы участника, записи на сегодня и сумма долга.
- club_metrics (analytics:read): последние 30 дней, как на экране «Аналитика»: активная база, новые и ушедшие участники, отток, quick ratio и индекс посещаемости.
- book_class (bookings:write): запись участника на занятие по той же логике, что у POST /v1/bookings.
Лимиты, ошибки и режим только для чтения
- До 100 запросов в минуту на клуб: запросы REST и вызовы инструментов MCP по всем его ключам считаются вместе. Счёт начинается заново в начале каждой минуты; сверх лимита API отвечает 429 rate_limited с заголовком Retry-After — сколько секунд осталось до следующей минуты.
- Ошибки приходят в JSON с error.code и error.message: 401 с unauthorized, malformed, unknown, revoked или expired при проблемах с ключом и 403 scope, если у ключа нет нужной области.
- Когда админка только для чтения из-за неоплаченного счёта easygym, чтение работает, а запись отвечает 403 read_only.
Вебхуков на ваш сервер нет
Зарегистрировать свой вебхук нельзя: easygym не отправляет события на ваши адреса, поэтому опрашивайте API. Единственный вебхук, который easygym настраивает, — в аккаунте Stripe клуба для оплат картой.
Внутренние адреса
Адреса /v1/access — внутренние: ключи доступа они не принимают и в публичный API не входят.
Связанные инструкции
- Настройки клубаЧто находится в «Настройках»: название клуба, филиалы, часовой пояс и валюта, реквизиты продавца и контакты сайта, адрес сайта и свой домен, тарификация, самообслуживание, форма регистрации и помощник.Читать инструкцию
- РасписаниеЗанятия и еженедельные серии, их изменение, отмена и удаление, места, правила записи и отмены, лист ожидания, запись участников из админки, отметки тренера с телефона и запись участников онлайн.Читать инструкцию
- Участники и карточки клиентовБаза клиентов в разделе «Участники»: поиск, типы и рабочие списки, добавление, изменение и удаление человека, карточка участника, форма регистрации на сайте и что подсказывает «Главная».Читать инструкцию
- АналитикаРаздел «Аналитика»: главные числа, движение базы, начисленные и полученные деньги, визиты и загруженные часы, записи, ёмкость, цветные коридоры и пояснение «?» к каждому показателю.Читать инструкцию
- AI-помощникСпрашивайте о клубе своими словами или начните с того, что помощник нашёл сегодня. В ответе — числа, как они посчитаны, и ссылка на тот же список; черновики писем уходят, только когда их отправит сотрудник.Читать инструкцию