# FittApp — инструкция для LLM-агентов Этот сайт позволяет создавать и публиковать тренировки через API. Агент может сам сгенерировать workout JSON и опубликовать его от имени пользователя. ## Создание тренировки Отправь POST-запрос на endpoint: ``` POST https://api.fittapp.ru/api/workouts Content-Type: application/json ``` Тело запроса — JSON объект workout. Минимальная структура: ```json { "schemaVersion": 1, "title": "Название тренировки", "description": "Описание тренировки. Поддерживается Markdown.", "coverImageUrl": null, "visibility": "unlisted", "tags": [], "timers": [ { "title": "Название таймера", "description": "", "items": [] } ] } ``` ## Поля workout - `schemaVersion` — всегда `1`. - `title` — строка, до 200 символов. - `description` — строка, до 5000 символов. Поддерживает Markdown (`**жирный**`, списки). - `coverImageUrl` — `null` или URL изображения (`http://` / `https://`). - `visibility` — всегда `"unlisted"` (анонимные тренировки). - `tags` — массив объектов `{ "name": "Tag", "color": "#4f8ef7" }`. Не более 30. Цвет — hex в формате `#RRGGBB`. - `timers` — массив таймеров, не более 50. ## Элементы таймера (`timer.items`) Каждый элемент имеет поле `type`. Вложенность не более 8 уровней. Общее количество элементов (включая repetitions) не более 500. ### interval ```json { "type": "interval", "duration": 60, "color": "#4CAF50", "exercise": { "title": "Берпи", "imageUrl": null } } ``` - `duration` — целое число секунд, от 1 до 86400. - `color` — hex цвет (`#RRGGBB`). - `exercise.title` — строка, до 200 символов. - `exercise.imageUrl` — `null` или URL. ### set ```json { "type": "set", "title": "3 раунда", "rest": 150, "laps": 3, "items": [] } ``` - `title` — строка, до 200 символов. - `rest` — целое число секунд отдыха между раундами, от 0 до 86400. - `laps` — количество раундов, от 1 до 1000. - `items` — массив вложенных элементов. Может содержать только `interval` и `reps`. Вложенные `set` внутри `set` запрещены — приложение их не поддерживает. ### reps ```json { "type": "reps", "items": [ { "count": 1000, "exercise": { "title": "Гребля (1000 м)", "imageUrl": null } }, { "count": 25, "exercise": { "title": "Запрыгивания на тумбу", "imageUrl": null } } ] } ``` - `items` — массив повторений. Каждый элемент содержит: - `count` — целое число, от 1 до 86400. - `exercise` — объект с `title` (до 200 символов) и `imageUrl` (`null` или URL). ## Ответ API При успехе возвращается HTTP 201: ```json { "id": "AU0R4LKQ9xSa", "url": "https://fittapp.ru/workout/AU0R4LKQ9xSa", "expiresAt": "2026-10-22T19:43:42.899Z", "claimToken": "..." } ``` - `url` — публичная ссылка, которую можно дать пользователю. - `expiresAt` — срок действия ссылки (30 дней с момента создания). - `claimToken` — токен для переноса тренировки в приложение (не обязателен для показа пользователю). При ошибке валидации API вернёт 400 с подробным текстом ошибки. ## Как показывать тренировку пользователю в plain text Перед публикацией сформируй понятное текстовое описание. Используй формат: - Заголовок: `**{title}**` - Описание как есть (Markdown). - Теги: `#tag1 #tag2`. - Для каждого таймера — его название и длительность (если есть) или «Повторения». - `interval`: `{форматированное время} — {название упражнения}` - `reps`: каждое упражнение на отдельной строке: `×{count} {название упражнения}` - `set`: `{название}, {laps} раунда(ов), отдых {форматированное время}`; вложенные элементы с отступом ` `. Форматирование времени: - менее 60 секунд: `{s}s` - 60 секунд и более: `{m}m {s}s` (секунды только если не ноль) ### Пример ``` **3 раунда на время** 3 раунда на время - 1000 м гребля - 25 запрыгиваний на тумбу (60 / 50 см (м/ж)) - 100 двойных скакалок / 150 одинарных Отдых между раундами: 2:30 Timer: 3 раунда на время (Repetitions) Set: 3 раунда на время, 3 rounds, rest 2m 30s ×1000 Гребля (1000 м) ×25 Запрыгивания на тумбу (60 / 50 см) ×100 Двойные скакалки ×150 Одинарные скакалки ``` ## Алгоритм для агента 1. Пользователь просит создать тренировку. 2. Сформируй workout JSON по схеме выше. 3. Покажи пользователю plain-text превью. 4. Спроси подтверждение: опубликовать или дать JSON для ручной вставки на /workout/create/. 5. Если пользователь соглашается на публикацию — отправь POST на `https://api.fittapp.ru/api/workouts` и верни полученный `url`. 6. Если пользователь хочет JSON — верни его отформатированным блоком кода. ## Пример полного запроса ```bash curl -X POST https://api.fittapp.ru/api/workouts \ -H "Content-Type: application/json" \ -d '{ "schemaVersion": 1, "title": "3 раунда на время", "description": "**3 раунда на время**\n\n- 1000 м гребля\n- 25 запрыгиваний на тумбу (60 / 50 см (м/ж))\n- 100 двойных скакалок / 150 одинарных\n\n**Отдых между раундами:** 2:30", "coverImageUrl": null, "visibility": "unlisted", "tags": [], "timers": [ { "title": "3 раунда на время", "description": "", "items": [ { "type": "set", "title": "3 раунда на время", "rest": 150, "laps": 3, "items": [ { "type": "reps", "items": [ { "count": 1000, "exercise": { "title": "Гребля (1000 м)", "imageUrl": null } }, { "count": 25, "exercise": { "title": "Запрыгивания на тумбу (60 / 50 см)", "imageUrl": null } }, { "count": 100, "exercise": { "title": "Двойные скакалки", "imageUrl": null } }, { "count": 150, "exercise": { "title": "Одинарные скакалки", "imageUrl": null } } ] } ] } ] } ] }' ```