{"components":{"parameters":{"AssistantProvider":{"in":"path","name":"provider","required":true,"schema":{"enum":["deepseek","gigachat"],"type":"string"}},"CSRF":{"description":"CSRF-токен сессии (для запросов с cookie)","in":"header","name":"X-CSRF-Token","required":true,"schema":{"type":"string"}},"Comment":{"description":"Зачем","in":"query","name":"comment","required":false,"schema":{"type":"string"}},"DataLang":{"description":"Язык данных (`ru`, `en`…); по умолчанию — язык сайта. То же даёт префикс `/en/data/…`.","in":"query","name":"lang","schema":{"type":"string"}},"DryRun":{"description":"`1` — проверить и вернуть результат, не записывая","in":"query","name":"dry_run","required":false,"schema":{"enum":[0,1],"type":"integer"}},"EntityID":{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}},"From":{"description":"С даты включительно, YYYY-MM-DD (часовой пояс клуба)","in":"query","name":"from","schema":{"format":"date","type":"string"}},"HelpLang":{"in":"query","name":"lang","schema":{"default":"ru","enum":["ru","en"],"type":"string"}},"IncludeDeleted":{"description":"`1` — вместе с удалёнными","in":"query","name":"deleted","required":false,"schema":{"enum":[0,1],"type":"integer"}},"Lang":{"description":"Язык перевода (не язык сайта по умолчанию)","in":"path","name":"lang","required":true,"schema":{"type":"string"}},"ProposalID":{"in":"path","name":"proposal","required":true,"schema":{"format":"int64","type":"integer"}},"RevisionLang":{"description":"Ревизии перевода на этот язык; пусто — оригинала","in":"query","name":"lang","required":false,"schema":{"type":"string"}},"SecretName":{"in":"path","name":"name","required":true,"schema":{"enum":["smtp_password","telegram_token","max_token","vk_token","tbank_terminal","tbank_password","alted_instance_key"],"type":"string"}},"To":{"description":"По дату включительно, YYYY-MM-DD","in":"query","name":"to","schema":{"format":"date","type":"string"}},"TrialHall":{"description":"id зала; 0 — заявки «подберите зал»; без параметра — все","in":"query","name":"hall","schema":{"format":"int64","type":"integer"}},"TrialStatus":{"in":"query","name":"status","schema":{"enum":["new","contacted","came","no_show","declined"],"type":"string"}},"UserID":{"in":"path","name":"id","required":true,"schema":{"format":"int64","type":"integer"}}},"responses":{"BadRequest":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Неверный запрос; `error.fields` — ошибки по полям"},"Conflict":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Конфликт с текущим состоянием"},"Forbidden":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Не хватает прав, нет или неверен CSRF-токен; `feature_off` — возможность выключена лицензией (ADR 0049)"},"NotFound":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Не найдено"},"TooLarge":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Файл больше разрешённого"},"TooManyRequests":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Слишком много попыток, повторить позже","headers":{"Retry-After":{"schema":{"type":"integer"}}}},"Unauthorized":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Нет сессии или она истекла; у ключа API — неверный или отозванный ключ (`unauthorized`) или истёкший (`key_expired`, ADR 0029)"},"Unsupported":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Тип файла не поддерживается"}},"schemas":{"APIKey":{"properties":{"created_at":{"format":"date-time","type":"string"},"created_by":{"format":"int64","type":"integer"},"created_by_name":{"description":"Имя того, кто выпустил ключ","type":"string"},"expires_at":{"description":"Когда ключ истекает; нет — ключ бессрочный (ADR 0029)","format":"date-time","type":"string"},"id":{"format":"int64","type":"integer"},"last_used_at":{"format":"date-time","type":"string"},"name":{"type":"string"},"permissions":{"items":{"type":"string"},"type":"array"},"revoked_at":{"format":"date-time","type":"string"},"role":{"$ref":"#/components/schemas/Role"},"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"type":"array"}},"required":["id","name","role","scopes","permissions","created_at"],"type":"object"},"Actor":{"properties":{"id":{"format":"int64","type":"integer"},"name":{"type":"string"},"type":{"enum":["user","api_key","system","anonymous"],"type":"string"}},"required":["type"],"type":"object"},"Album":{"description":"Альбом","properties":{"created_at":{"format":"date-time","type":"string"},"data":{"$ref":"#/components/schemas/AlbumData"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"kind":{"enum":["album"],"type":"string"},"rev":{"description":"Номер последней ревизии; 0 — ещё не записан","type":"integer"},"translations":{"additionalProperties":{"$ref":"#/components/schemas/TranslationState"},"description":"Состояние перевода по языкам","type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["kind","id","rev","data","deleted","created_at","updated_at"],"type":"object"},"AlbumData":{"additionalProperties":false,"properties":{"cover":{"description":"Обложка","format":"int64","type":"integer","x-ref":"photo"},"date":{"description":"Дата","format":"date","type":"string"},"description":{"description":"Описание","type":"string","x-translatable":true},"slug":{"description":"Адрес страницы. Часть адреса страницы, латиницей. Пусто — из названия.","pattern":"^[a-z0-9]+(-[a-z0-9]+)*$","type":"string"},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"},"title":{"description":"Название","maxLength":200,"type":"string","x-translatable":true}},"required":["title"],"type":"object"},"AlbumFields":{"additionalProperties":false,"properties":{"cover":{"description":"Обложка","format":"int64","type":"integer","x-ref":"photo"},"date":{"description":"Дата","format":"date","type":"string"},"description":{"description":"Описание","type":"string","x-translatable":true},"slug":{"description":"Адрес страницы. Часть адреса страницы, латиницей. Пусто — из названия.","pattern":"^[a-z0-9]+(-[a-z0-9]+)*$","type":"string"},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"},"title":{"description":"Название","maxLength":200,"type":"string","x-translatable":true}},"type":"object"},"AlbumTranslationData":{"additionalProperties":false,"properties":{"description":{"description":"Описание","type":"string","x-translatable":true},"title":{"description":"Название","maxLength":200,"type":"string","x-translatable":true}},"type":"object"},"AssistantChat":{"allOf":[{"$ref":"#/components/schemas/AssistantChatSummary"},{"properties":{"busy":{"description":"Идёт сообщение","type":"boolean"},"messages":{"items":{"$ref":"#/components/schemas/AssistantMessage"},"type":"array"},"proposals":{"items":{"$ref":"#/components/schemas/AssistantProposal"},"type":"array"},"role":{"$ref":"#/components/schemas/Role"},"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"type":"array"}},"required":["role","scopes","messages","proposals","busy"],"type":"object"}]},"AssistantChatSummary":{"properties":{"author":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"expires_at":{"format":"date-time","type":"string"},"id":{"format":"int64","type":"integer"},"key_id":{"format":"int64","type":"integer"},"model":{"type":"string"},"provider":{"enum":["deepseek","gigachat"],"type":"string"},"title":{"description":"Первые слова первого сообщения","type":"string"},"updated_at":{"format":"date-time","type":"string"},"usage":{"$ref":"#/components/schemas/AssistantUsage"}},"required":["id","title","model","provider","author","created_at","updated_at","usage"],"type":"object"},"AssistantMessage":{"properties":{"at":{"format":"date-time","type":"string"},"is_error":{"description":"У результата инструмента — ошибка","type":"boolean"},"media":{"description":"Фото, приложенное человеком к сообщению (ADR 0036); нет — если его удалили","properties":{"alt":{"type":"string"},"file":{"description":"SHA-256 файла — для миниатюры","type":"string"},"height":{"type":"integer"},"id":{"type":"integer"},"width":{"type":"integer"}},"required":["id","file","alt","width","height"],"type":"object"},"reasoning":{"description":"Рассуждение модели — если включено","type":"string"},"role":{"description":"note — что сделал человек (опубликовал, отклонил), модель это видит","enum":["user","assistant","tool","note"],"type":"string"},"seq":{"type":"integer"},"text":{"type":"string"},"tool_call_id":{"type":"string"},"tool_calls":{"items":{"properties":{"arguments":{"description":"JSON аргументов, как его прислала модель","type":"string"},"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name","arguments"],"type":"object"},"type":"array"},"tool_name":{"type":"string"},"usage":{"$ref":"#/components/schemas/AssistantUsage"}},"required":["seq","role","at"],"type":"object"},"AssistantProposal":{"properties":{"at":{"format":"date-time","type":"string"},"comment":{"description":"Зачем, со слов модели","type":"string"},"id":{"format":"int64","type":"integer"},"kind":{"type":"string"},"preview_path":{"type":"string"},"record_id":{"format":"int64","type":"integer"},"state":{"enum":["pending","published","dismissed"],"type":"string"},"title":{"type":"string"}},"required":["id","kind","record_id","title","comment","state","at"],"type":"object"},"AssistantProvider":{"properties":{"currency":{"description":"В чём считается расход","enum":["usd","rub"],"type":"string"},"experimental":{"description":"В пробах слабее и дороже — показывать с пометкой (ADR 0041)","type":"boolean"},"key_set":{"type":"boolean"},"label":{"type":"string"},"model":{"description":"Модель по умолчанию для новых разговоров","type":"string"},"models":{"items":{"type":"string"},"type":"array"},"name":{"enum":["deepseek","gigachat"],"type":"string"},"rank_tools":{"type":"boolean"},"scope":{"enum":["GIGACHAT_API_PERS","GIGACHAT_API_B2B","GIGACHAT_API_CORP"],"type":"string"},"thinking":{"description":"Режим рассуждения (DeepSeek)","type":"boolean"},"transfer_abroad":{"description":"Тексты сайта уходят за границу — нужен `accept_transfer` при первом ключе","type":"boolean"},"transfer_accepted_at":{"format":"date-time","type":"string"},"transfer_accepted_by":{"description":"Имя того, кто отметил передачу за границу","type":"string"},"vision_models":{"description":"Модели, которые видят приложенное фото","items":{"type":"string"},"type":"array"}},"required":["name","label","model","models","vision_models","key_set","currency","transfer_abroad","experimental"],"type":"object"},"AssistantSettings":{"properties":{"providers":{"items":{"$ref":"#/components/schemas/AssistantProvider"},"type":"array"}},"required":["providers"],"type":"object"},"AssistantUsage":{"properties":{"cache_hit_tokens":{"type":"integer"},"cache_miss_tokens":{"type":"integer"},"completion_tokens":{"type":"integer"},"cost_rub":{"description":"Примерно, по тарифу GigaChat для юрлиц на дату выпуска (ADR 0038)","type":"number"},"cost_usd":{"description":"Примерно, по ценам DeepSeek на дату выпуска с учётом часов пик","type":"number"},"prompt_tokens":{"type":"integer"},"reasoning_tokens":{"type":"integer"},"steps":{"description":"Запросов к модели","type":"integer"}},"required":["steps","prompt_tokens","cache_hit_tokens","cache_miss_tokens","completion_tokens","reasoning_tokens","cost_usd"],"type":"object"},"BlockParam":{"properties":{"default":{},"enum":{"items":{"type":"string"},"type":"array"},"label":{"$ref":"#/components/schemas/Label"},"max":{"type":"number"},"min":{"type":"number"},"name":{"type":"string"},"ref":{"description":"У ref — вид записи; у media — тип медиафайла (photo)","type":"string"},"type":{"description":"media — номер медиафайла (фото), выбирается из медиатеки; ref —\nномер записи вида `ref`. У нового типа ref — только `page` или\n`album` (в шаблоне — `.Page \"имя\"`, `.Album \"имя\"`), ADR 0032\n","enum":["string","text","integer","boolean","enum","ref","media"],"type":"string"}},"required":["name","type","label"],"type":"object"},"BlockTemplate":{"description":"Шаблон блока. Свой html/template для встроенного блока или новый тип блока. Проверяется перед сохранением; на сайте — после публикации.","properties":{"after_publish":{"description":"Только в ответе сухого прогона публикации: что будет на сайте после неё; published_rev и published выше — что на сайте сейчас (ADR 0033)","properties":{"published":{"$ref":"#/components/schemas/BlockTemplateData"},"published_rev":{"description":"0 — снято с публикации","type":"integer"}},"required":["published_rev"],"type":"object"},"created_at":{"format":"date-time","type":"string"},"data":{"$ref":"#/components/schemas/BlockTemplateData"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"kind":{"enum":["block_template"],"type":"string"},"published":{"allOf":[{"$ref":"#/components/schemas/BlockTemplateData"}],"description":"Опубликованные данные — их видит сайт"},"published_rev":{"description":"Опубликованная ревизия; 0 — не опубликовано","type":"integer"},"rev":{"description":"Номер последней ревизии; 0 — ещё не записан","type":"integer"},"translations":{"additionalProperties":{"$ref":"#/components/schemas/TranslationState"},"description":"Состояние перевода по языкам","type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["kind","id","rev","data","deleted","created_at","updated_at"],"type":"object"},"BlockTemplateData":{"additionalProperties":false,"properties":{"base_hash":{"description":"Хеш встроенного шаблона. Когда встроенный шаблон меняется с обновлением, админка показывает разницу.","readOnly":true,"type":"string"},"label":{"description":"Название для админки","type":"string"},"params":{"description":"Параметры (для нового типа). [{\"name\": \"title\", \"type\": \"string|text|integer|boolean|enum\", \"label\": {\"ru\": \"\", \"en\": \"\"}}]"},"template":{"description":"Шаблон","maxLength":50000,"type":"string"},"type":{"description":"Тип блока","maxLength":31,"type":"string"}},"required":["type","template"],"type":"object"},"BlockTemplateFields":{"additionalProperties":false,"properties":{"label":{"description":"Название для админки","type":"string"},"params":{"description":"Параметры (для нового типа). [{\"name\": \"title\", \"type\": \"string|text|integer|boolean|enum\", \"label\": {\"ru\": \"\", \"en\": \"\"}}]"},"template":{"description":"Шаблон","maxLength":50000,"type":"string"},"type":{"description":"Тип блока","maxLength":31,"type":"string"}},"type":"object"},"BlockType":{"properties":{"builtin":{"type":"boolean"},"data":{"description":"Что лежит в `.Data` шаблона: `list` — список (`{{range .Data}}`), `one` — одна запись, `none` — ничего (только `.Club` и `.Param`)","properties":{"fields":{"description":"Поля записи: «Имя тип», вложенные — через точку, например «Instructor.Label string»","items":{"type":"string"},"type":"array"},"kind":{"enum":["list","one","none"],"type":"string"}},"required":["kind","fields"],"type":"object"},"label":{"$ref":"#/components/schemas/Label"},"name":{"type":"string"},"override":{"description":"Своя запись block_template, если есть","properties":{"base_updated":{"description":"Встроенный шаблон изменился после того, как сделано переопределение","type":"boolean"},"id":{"format":"int64","type":"integer"},"published":{"type":"boolean"}},"type":"object"},"params":{"items":{"$ref":"#/components/schemas/BlockParam"},"type":"array"},"template":{"description":"Встроенный шаблон (у встроенных типов)","type":"string"}},"required":["name","label","params","builtin"],"type":"object"},"Capabilities":{"description":"Что можно тому, кто спрашивает (ADR 0029); строится из тех же разрешений, что проверяют ручки","properties":{"blocks":{"description":"Типы блоков, если можно менять раскладку или шаблоны; параметры — `GET /api/v1/blocks`","items":{"properties":{"label":{"$ref":"#/components/schemas/Label"},"name":{"type":"string"}},"required":["name","label"],"type":"object"},"type":"array"},"humans_only":{"description":"Что делает только человек в админке; публикация здесь, только если ключу она недоступна","items":{"properties":{"code":{"enum":["publish","delete","verify_translation","prices","refunds","payments","users","api_keys","settings"],"type":"string"},"label":{"$ref":"#/components/schemas/Label"}},"required":["code","label"],"type":"object"},"type":"array"},"key":{"description":"Только для ключа API","properties":{"expires_at":{"format":"date-time","type":"string"},"name":{"type":"string"},"role":{"$ref":"#/components/schemas/Role"},"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"type":"array"}},"required":["name","role","scopes"],"type":"object"},"kinds":{"items":{"properties":{"create":{"type":"boolean"},"delete_drafts":{"description":"Ключ удаляет черновики, которые ни разу не публиковались и которые правили только ключи его человека (ADR 0032)","type":"boolean"},"label":{"$ref":"#/components/schemas/Label"},"name":{"type":"string"},"own_only":{"description":"Только свои залы или свой профиль (инструктор)","type":"boolean"},"path":{"description":"`/api/v1/\u003cpath\u003e`","type":"string"},"plural":{"$ref":"#/components/schemas/Label"},"publish":{"description":"Публиковать и снимать с публикации (у ключа — с областью `publish`, ADR 0031)","type":"boolean"},"publishing":{"description":"Как правка попадает на сайт — черновик и публикация, поле «Состояние» или сразу (ADR 0033)","enum":["draft","status","immediate"],"type":"string"},"read":{"type":"boolean"},"translate":{"description":"Писать переводы (у ключа — со статусом «перевод модели»)","type":"boolean"},"update":{"type":"boolean"}},"required":["name","path","label","plural","read","create","update","translate","publish","publishing","delete_drafts","own_only"],"type":"object"},"type":"array"},"layout":{"description":"Раскладка страниц и тема — черновиком","type":"boolean"},"next":{"description":"С чего начать — адреса и что по ним","items":{"properties":{"label":{"$ref":"#/components/schemas/Label"},"url":{"type":"string"}},"required":["url","label"],"type":"object"},"type":"array"},"orders":{"description":"Чтение заказов и оплат (персональные данные)","type":"boolean"},"requests":{"description":"Чтение заявок на пробную (персональные данные)","type":"boolean"},"site":{"properties":{"default_language":{"type":"string"},"languages":{"items":{"type":"string"},"type":"array"},"name":{"type":"string"},"url":{"type":"string"}},"required":["name","url","languages","default_language"],"type":"object"},"templates":{"description":"Шаблоны блоков — черновиком","type":"boolean"},"upload":{"description":"Загрузка фото, видео и документов","type":"boolean"}},"required":["site","kinds","layout","templates","upload","requests","orders","blocks","humans_only","next"],"type":"object"},"ChangePasswordRequest":{"properties":{"current_password":{"type":"string"},"new_password":{"minLength":10,"type":"string"}},"required":["current_password","new_password"],"type":"object"},"City":{"description":"Город","properties":{"created_at":{"format":"date-time","type":"string"},"data":{"$ref":"#/components/schemas/CityData"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"kind":{"enum":["city"],"type":"string"},"rev":{"description":"Номер последней ревизии; 0 — ещё не записан","type":"integer"},"translations":{"additionalProperties":{"$ref":"#/components/schemas/TranslationState"},"description":"Состояние перевода по языкам","type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["kind","id","rev","data","deleted","created_at","updated_at"],"type":"object"},"CityData":{"additionalProperties":false,"properties":{"name":{"description":"Название","maxLength":200,"type":"string","x-translatable":true},"region":{"description":"Регион","format":"int64","type":"integer","x-ref":"region"},"slug":{"description":"Адрес страницы. Часть адреса страницы, латиницей. Пусто — из названия.","pattern":"^[a-z0-9]+(-[a-z0-9]+)*$","type":"string"},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"}},"required":["name"],"type":"object"},"CityFields":{"additionalProperties":false,"properties":{"name":{"description":"Название","maxLength":200,"type":"string","x-translatable":true},"region":{"description":"Регион","format":"int64","type":"integer","x-ref":"region"},"slug":{"description":"Адрес страницы. Часть адреса страницы, латиницей. Пусто — из названия.","pattern":"^[a-z0-9]+(-[a-z0-9]+)*$","type":"string"},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"}},"type":"object"},"CityTranslationData":{"additionalProperties":false,"properties":{"name":{"description":"Название","maxLength":200,"type":"string","x-translatable":true}},"type":"object"},"Club":{"description":"Клуб","properties":{"created_at":{"format":"date-time","type":"string"},"data":{"$ref":"#/components/schemas/ClubData"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"kind":{"enum":["club"],"type":"string"},"rev":{"description":"Номер последней ревизии; 0 — ещё не записан","type":"integer"},"translations":{"additionalProperties":{"$ref":"#/components/schemas/TranslationState"},"description":"Состояние перевода по языкам","type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["kind","id","rev","data","deleted","created_at","updated_at"],"type":"object"},"ClubData":{"additionalProperties":false,"properties":{"description":{"allOf":[{"$ref":"#/components/schemas/RichDoc"}],"description":"О клубе коротко. Блок «о клубе» на главной.","x-translatable":true},"disciplines":{"description":"Дисциплины клуба","items":{"format":"int64","type":"integer"},"type":"array","x-ref":"discipline"},"icon":{"description":"Значок сайта. Квадратная картинка для вкладки браузера и экрана телефона, лучше от 512×512. Пусто — логотип, если он квадратный, иначе первая буква названия в круге.","format":"int64","type":"integer","x-ref":"photo"},"logo":{"description":"Логотип","format":"int64","type":"integer","x-ref":"photo"},"max":{"description":"MAX","format":"uri","type":"string"},"name":{"description":"Название","maxLength":200,"type":"string","x-translatable":true},"requisites":{"description":"Реквизиты. Юридическое название, ИНН, ОГРН, адрес — в подвале и контактах.","type":"string","x-translatable":true},"rutube":{"description":"Rutube","format":"uri","type":"string"},"tagline":{"description":"Девиз. Одна строка под названием на главной.","type":"string","x-translatable":true},"telegram":{"description":"Telegram","format":"uri","type":"string"},"vk":{"description":"ВКонтакте","format":"uri","type":"string"},"youtube":{"description":"YouTube","format":"uri","type":"string"}},"required":["name"],"type":"object"},"ClubFields":{"additionalProperties":false,"properties":{"description":{"allOf":[{"$ref":"#/components/schemas/RichDoc"}],"description":"О клубе коротко. Блок «о клубе» на главной.","x-translatable":true},"disciplines":{"description":"Дисциплины клуба","items":{"format":"int64","type":"integer"},"type":"array","x-ref":"discipline"},"icon":{"description":"Значок сайта. Квадратная картинка для вкладки браузера и экрана телефона, лучше от 512×512. Пусто — логотип, если он квадратный, иначе первая буква названия в круге.","format":"int64","type":"integer","x-ref":"photo"},"logo":{"description":"Логотип","format":"int64","type":"integer","x-ref":"photo"},"max":{"description":"MAX","format":"uri","type":"string"},"name":{"description":"Название","maxLength":200,"type":"string","x-translatable":true},"requisites":{"description":"Реквизиты. Юридическое название, ИНН, ОГРН, адрес — в подвале и контактах.","type":"string","x-translatable":true},"rutube":{"description":"Rutube","format":"uri","type":"string"},"tagline":{"description":"Девиз. Одна строка под названием на главной.","type":"string","x-translatable":true},"telegram":{"description":"Telegram","format":"uri","type":"string"},"vk":{"description":"ВКонтакте","format":"uri","type":"string"},"youtube":{"description":"YouTube","format":"uri","type":"string"}},"type":"object"},"ClubTranslationData":{"additionalProperties":false,"properties":{"description":{"allOf":[{"$ref":"#/components/schemas/RichDoc"}],"description":"О клубе коротко. Блок «о клубе» на главной.","x-translatable":true},"name":{"description":"Название","maxLength":200,"type":"string","x-translatable":true},"requisites":{"description":"Реквизиты. Юридическое название, ИНН, ОГРН, адрес — в подвале и контактах.","type":"string","x-translatable":true},"tagline":{"description":"Девиз. Одна строка под названием на главной.","type":"string","x-translatable":true}},"type":"object"},"CommentRequest":{"properties":{"comment":{"type":"string"}},"type":"object"},"Contact":{"description":"Контакт. Телефоны, почта и мессенджеры для посетителей: в подвале сайта, на странице «Контакты» и на странице зала.","properties":{"created_at":{"format":"date-time","type":"string"},"data":{"$ref":"#/components/schemas/ContactData"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"kind":{"enum":["contact"],"type":"string"},"rev":{"description":"Номер последней ревизии; 0 — ещё не записан","type":"integer"},"translations":{"additionalProperties":{"$ref":"#/components/schemas/TranslationState"},"description":"Состояние перевода по языкам","type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["kind","id","rev","data","deleted","created_at","updated_at"],"type":"object"},"ContactData":{"additionalProperties":false,"properties":{"hall":{"description":"Зал. Контакт этого зала. Пусто — контакт клуба.","format":"int64","type":"integer","x-ref":"hall"},"label":{"description":"Подпись. Например, «Администратор» или «Тренер детской группы». Для «Другое» обязательна.","maxLength":100,"type":"string","x-translatable":true},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"},"type":{"description":"Вид","enum":["phone","email","telegram","max","whatsapp","vk","other"],"type":"string"},"value":{"description":"Значение. Телефон, адрес почты, @имя или ссылка t.me для Telegram, ссылка max.ru, телефон WhatsApp, ссылка vk.com; для «Другое» — ссылка.","maxLength":300,"type":"string"}},"required":["type","value"],"type":"object"},"ContactFields":{"additionalProperties":false,"properties":{"hall":{"description":"Зал. Контакт этого зала. Пусто — контакт клуба.","format":"int64","type":"integer","x-ref":"hall"},"label":{"description":"Подпись. Например, «Администратор» или «Тренер детской группы». Для «Другое» обязательна.","maxLength":100,"type":"string","x-translatable":true},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"},"type":{"description":"Вид","enum":["phone","email","telegram","max","whatsapp","vk","other"],"type":"string"},"value":{"description":"Значение. Телефон, адрес почты, @имя или ссылка t.me для Telegram, ссылка max.ru, телефон WhatsApp, ссылка vk.com; для «Другое» — ссылка.","maxLength":300,"type":"string"}},"type":"object"},"ContactTranslationData":{"additionalProperties":false,"properties":{"label":{"description":"Подпись. Например, «Администратор» или «Тренер детской группы». Для «Другое» обязательна.","maxLength":100,"type":"string","x-translatable":true}},"type":"object"},"Counts":{"description":"Ключ и число, по убыванию","items":{"properties":{"key":{"type":"string"},"n":{"type":"integer"}},"required":["key","n"],"type":"object"},"type":"array"},"CreateUserRequest":{"properties":{"email":{"format":"email","type":"string"},"locale":{"$ref":"#/components/schemas/Locale"},"name":{"type":"string"},"password":{"minLength":10,"type":"string"},"role":{"$ref":"#/components/schemas/Role"}},"required":["email","name","role","password"],"type":"object"},"DataEvent":{"properties":{"cancelled":{"type":"boolean"},"city":{"type":"string"},"daily_end":{"description":"Каждый день до (ЧЧ:ММ)","type":"string"},"daily_start":{"description":"Каждый день с (ЧЧ:ММ), у мероприятия на несколько дней","type":"string"},"ends_at":{"type":"string"},"place":{"type":"string"},"slug":{"type":"string"},"starts_at":{"description":"Местное время `YYYY-MM-DDTHH:MM`","type":"string"},"summary":{"type":"string"},"title":{"type":"string"},"type":{"type":"string"},"url":{"format":"uri","type":"string"}},"required":["slug","title","type","starts_at","url"],"type":"object"},"DataEvents":{"properties":{"lang":{"type":"string"},"past":{"items":{"$ref":"#/components/schemas/DataEvent"},"type":"array"},"timezone":{"type":"string"},"upcoming":{"items":{"$ref":"#/components/schemas/DataEvent"},"type":"array"}},"required":["lang","timezone","upcoming","past"],"type":"object"},"DataHalls":{"properties":{"club":{"type":"string"},"halls":{"items":{"properties":{"accessibility":{"type":"string"},"address":{"type":"string"},"city":{"type":"string"},"directions":{"type":"string"},"district":{"type":"string"},"email":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"},"name":{"type":"string"},"phone":{"type":"string"},"slug":{"type":"string"},"status":{"type":"string"},"url":{"format":"uri","type":"string"}},"required":["slug","name","city","address","status","url"],"type":"object"},"type":"array"},"lang":{"type":"string"}},"required":["club","lang","halls"],"type":"object"},"DataSchedule":{"properties":{"classes":{"items":{"properties":{"ages":{"type":"string"},"cancelled":{"type":"boolean"},"changed":{"type":"boolean"},"date":{"format":"date","type":"string"},"discipline":{"type":"string"},"end":{"example":"19:30","type":"string"},"hall":{"type":"string"},"hall_url":{"format":"uri","type":"string"},"instructor":{"type":"string"},"level":{"type":"string"},"note":{"type":"string"},"start":{"example":"18:00","type":"string"},"title":{"type":"string"},"weekday":{"description":"1 — понедельник … 7 — воскресенье","type":"integer"}},"required":["hall","hall_url","date","weekday","start","end","title"],"type":"object"},"type":"array"},"lang":{"type":"string"},"timezone":{"example":"Europe/Moscow","type":"string"},"week_start":{"format":"date","type":"string"}},"required":["lang","week_start","timezone","classes"],"type":"object"},"Discipline":{"description":"Дисциплина","properties":{"created_at":{"format":"date-time","type":"string"},"data":{"$ref":"#/components/schemas/DisciplineData"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"kind":{"enum":["discipline"],"type":"string"},"rev":{"description":"Номер последней ревизии; 0 — ещё не записан","type":"integer"},"translations":{"additionalProperties":{"$ref":"#/components/schemas/TranslationState"},"description":"Состояние перевода по языкам","type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["kind","id","rev","data","deleted","created_at","updated_at"],"type":"object"},"DisciplineData":{"additionalProperties":false,"properties":{"age_from":{"description":"Возраст от","maximum":120,"minimum":0,"type":"integer"},"age_to":{"description":"Возраст до","maximum":120,"minimum":0,"type":"integer"},"description":{"description":"Описание","type":"string","x-translatable":true},"name":{"description":"Название","maxLength":200,"type":"string","x-translatable":true},"slug":{"description":"Адрес страницы. Часть адреса страницы, латиницей. Пусто — из названия.","pattern":"^[a-z0-9]+(-[a-z0-9]+)*$","type":"string"},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"}},"required":["name"],"type":"object"},"DisciplineFields":{"additionalProperties":false,"properties":{"age_from":{"description":"Возраст от","maximum":120,"minimum":0,"type":"integer"},"age_to":{"description":"Возраст до","maximum":120,"minimum":0,"type":"integer"},"description":{"description":"Описание","type":"string","x-translatable":true},"name":{"description":"Название","maxLength":200,"type":"string","x-translatable":true},"slug":{"description":"Адрес страницы. Часть адреса страницы, латиницей. Пусто — из названия.","pattern":"^[a-z0-9]+(-[a-z0-9]+)*$","type":"string"},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"}},"type":"object"},"DisciplineTranslationData":{"additionalProperties":false,"properties":{"description":{"description":"Описание","type":"string","x-translatable":true},"name":{"description":"Название","maxLength":200,"type":"string","x-translatable":true}},"type":"object"},"District":{"description":"Район","properties":{"created_at":{"format":"date-time","type":"string"},"data":{"$ref":"#/components/schemas/DistrictData"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"kind":{"enum":["district"],"type":"string"},"rev":{"description":"Номер последней ревизии; 0 — ещё не записан","type":"integer"},"translations":{"additionalProperties":{"$ref":"#/components/schemas/TranslationState"},"description":"Состояние перевода по языкам","type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["kind","id","rev","data","deleted","created_at","updated_at"],"type":"object"},"DistrictData":{"additionalProperties":false,"properties":{"city":{"description":"Город","format":"int64","type":"integer","x-ref":"city"},"name":{"description":"Название","maxLength":200,"type":"string","x-translatable":true},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"}},"required":["name","city"],"type":"object"},"DistrictFields":{"additionalProperties":false,"properties":{"city":{"description":"Город","format":"int64","type":"integer","x-ref":"city"},"name":{"description":"Название","maxLength":200,"type":"string","x-translatable":true},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"}},"type":"object"},"DistrictTranslationData":{"additionalProperties":false,"properties":{"name":{"description":"Название","maxLength":200,"type":"string","x-translatable":true}},"type":"object"},"DocumentFile":{"description":"Файл документа. Файл на скачивание у материала раздела «Документы». Новая версия загружается поверх, прежние остаются доступны по ссылкам.","properties":{"created_at":{"format":"date-time","type":"string"},"data":{"$ref":"#/components/schemas/DocumentFileData"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"kind":{"enum":["document_file"],"type":"string"},"rev":{"description":"Номер последней ревизии; 0 — ещё не записан","type":"integer"},"translations":{"additionalProperties":{"$ref":"#/components/schemas/TranslationState"},"description":"Состояние перевода по языкам","type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["kind","id","rev","data","deleted","created_at","updated_at"],"type":"object"},"DocumentFileData":{"additionalProperties":false,"properties":{"name":{"description":"Имя в адресе. /docs/\u003cдокумент\u003e/\u003cимя\u003e — всегда текущая версия.","pattern":"^[a-z0-9]+(-[a-z0-9]+)*$","type":"string"},"page":{"description":"Документ","format":"int64","type":"integer","x-ref":"page"},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"},"title":{"description":"Название","maxLength":200,"type":"string","x-translatable":true}},"required":["page","title"],"type":"object"},"DocumentFileFields":{"additionalProperties":false,"properties":{"name":{"description":"Имя в адресе. /docs/\u003cдокумент\u003e/\u003cимя\u003e — всегда текущая версия.","pattern":"^[a-z0-9]+(-[a-z0-9]+)*$","type":"string"},"page":{"description":"Документ","format":"int64","type":"integer","x-ref":"page"},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"},"title":{"description":"Название","maxLength":200,"type":"string","x-translatable":true}},"type":"object"},"DocumentFileTranslationData":{"additionalProperties":false,"properties":{"title":{"description":"Название","maxLength":200,"type":"string","x-translatable":true}},"type":"object"},"EntityRef":{"properties":{"id":{"format":"int64","type":"integer"},"kind":{"type":"string"}},"required":["kind","id"],"type":"object"},"Error":{"properties":{"error":{"properties":{"code":{"description":"Машинный код, например `invalid_credentials`","type":"string"},"details":{"additionalProperties":{"type":"string"},"description":"Для `validation` — путь поля → что не так (по-английски), где кода мало, например у схемы параметров блока","type":"object"},"fields":{"additionalProperties":{"type":"string"},"description":"Ошибки по полям запроса, путь поля → код ошибки","type":"object"},"message":{"description":"Текст для человека на языке пользователя","type":"string"},"problems":{"description":"Для `template_check` — что не так с шаблоном блока","items":{"$ref":"#/components/schemas/TemplateProblem"},"type":"array"},"refs":{"description":"Для `in_use` — кто ссылается на удаляемое","items":{"$ref":"#/components/schemas/EntityRef"},"type":"array"}},"required":["code","message"],"type":"object"}},"required":["error"],"type":"object"},"Event":{"description":"Мероприятие","properties":{"created_at":{"format":"date-time","type":"string"},"data":{"$ref":"#/components/schemas/EventData"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"kind":{"enum":["event"],"type":"string"},"rev":{"description":"Номер последней ревизии; 0 — ещё не записан","type":"integer"},"translations":{"additionalProperties":{"$ref":"#/components/schemas/TranslationState"},"description":"Состояние перевода по языкам","type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["kind","id","rev","data","deleted","created_at","updated_at"],"type":"object"},"EventData":{"additionalProperties":false,"properties":{"address":{"description":"Адрес. Если не в зале клуба.","type":"string","x-translatable":true},"body":{"allOf":[{"$ref":"#/components/schemas/RichDoc"}],"description":"Описание","x-translatable":true},"city":{"description":"Город. Если не в зале клуба.","format":"int64","type":"integer","x-ref":"city"},"cover":{"description":"Обложка","format":"int64","type":"integer","x-ref":"photo"},"daily_end":{"description":"Каждый день до","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$","type":"string"},"daily_start":{"description":"Каждый день с. Для мероприятия на несколько дней: время, с которого оно идёт каждый день. Задаётся вместе с «до».","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$","type":"string"},"ends_at":{"description":"Окончание. Местное время клуба","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$","type":"string"},"hall":{"description":"Зал","format":"int64","type":"integer","x-ref":"hall"},"instructors":{"description":"Инструкторы","items":{"format":"int64","type":"integer"},"type":"array","x-ref":"instructor"},"network":{"description":"В сеть alted. Сеть перескажет мероприятие со ссылкой на сайт клуба. Без контактов людей и данных детей.","type":"boolean"},"registration":{"description":"Регистрация","enum":["none","link","payment"],"type":"string"},"registration_url":{"description":"Ссылка на регистрацию","format":"uri","type":"string"},"slug":{"description":"Адрес страницы. Часть адреса страницы, латиницей. Пусто — из названия.","pattern":"^[a-z0-9]+(-[a-z0-9]+)*$","type":"string"},"social_to":{"description":"В соцсети клуба. Опубликованное мероприятие уйдёт один раз в каждый отмеченный канал.","items":{"enum":["vk","telegram","max"],"type":"string"},"type":"array","uniqueItems":true},"starts_at":{"description":"Начало. Местное время клуба","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$","type":"string"},"status":{"description":"Состояние","enum":["draft","published","cancelled"],"type":"string"},"summary":{"description":"Коротко. Для списка, поиска и соцсетей.","maxLength":500,"type":"string","x-translatable":true},"tariff":{"description":"Тариф участия. Тариф вида «участие в мероприятии».","format":"int64","type":"integer","x-ref":"tariff"},"title":{"description":"Название","maxLength":200,"type":"string","x-translatable":true},"type":{"description":"Тип","format":"int64","type":"integer","x-ref":"event_type"}},"required":["type","title","starts_at","registration","status"],"type":"object"},"EventFields":{"additionalProperties":false,"properties":{"address":{"description":"Адрес. Если не в зале клуба.","type":"string","x-translatable":true},"body":{"allOf":[{"$ref":"#/components/schemas/RichDoc"}],"description":"Описание","x-translatable":true},"city":{"description":"Город. Если не в зале клуба.","format":"int64","type":"integer","x-ref":"city"},"cover":{"description":"Обложка","format":"int64","type":"integer","x-ref":"photo"},"daily_end":{"description":"Каждый день до","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$","type":"string"},"daily_start":{"description":"Каждый день с. Для мероприятия на несколько дней: время, с которого оно идёт каждый день. Задаётся вместе с «до».","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$","type":"string"},"ends_at":{"description":"Окончание. Местное время клуба","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$","type":"string"},"hall":{"description":"Зал","format":"int64","type":"integer","x-ref":"hall"},"instructors":{"description":"Инструкторы","items":{"format":"int64","type":"integer"},"type":"array","x-ref":"instructor"},"network":{"description":"В сеть alted. Сеть перескажет мероприятие со ссылкой на сайт клуба. Без контактов людей и данных детей.","type":"boolean"},"registration":{"description":"Регистрация","enum":["none","link","payment"],"type":"string"},"registration_url":{"description":"Ссылка на регистрацию","format":"uri","type":"string"},"slug":{"description":"Адрес страницы. Часть адреса страницы, латиницей. Пусто — из названия.","pattern":"^[a-z0-9]+(-[a-z0-9]+)*$","type":"string"},"social_to":{"description":"В соцсети клуба. Опубликованное мероприятие уйдёт один раз в каждый отмеченный канал.","items":{"enum":["vk","telegram","max"],"type":"string"},"type":"array","uniqueItems":true},"starts_at":{"description":"Начало. Местное время клуба","pattern":"^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$","type":"string"},"status":{"description":"Состояние","enum":["draft","published","cancelled"],"type":"string"},"summary":{"description":"Коротко. Для списка, поиска и соцсетей.","maxLength":500,"type":"string","x-translatable":true},"tariff":{"description":"Тариф участия. Тариф вида «участие в мероприятии».","format":"int64","type":"integer","x-ref":"tariff"},"title":{"description":"Название","maxLength":200,"type":"string","x-translatable":true},"type":{"description":"Тип","format":"int64","type":"integer","x-ref":"event_type"}},"type":"object"},"EventTranslationData":{"additionalProperties":false,"properties":{"address":{"description":"Адрес. Если не в зале клуба.","type":"string","x-translatable":true},"body":{"allOf":[{"$ref":"#/components/schemas/RichDoc"}],"description":"Описание","x-translatable":true},"summary":{"description":"Коротко. Для списка, поиска и соцсетей.","maxLength":500,"type":"string","x-translatable":true},"title":{"description":"Название","maxLength":200,"type":"string","x-translatable":true}},"type":"object"},"EventType":{"description":"Тип мероприятия","properties":{"created_at":{"format":"date-time","type":"string"},"data":{"$ref":"#/components/schemas/EventTypeData"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"kind":{"enum":["event_type"],"type":"string"},"rev":{"description":"Номер последней ревизии; 0 — ещё не записан","type":"integer"},"translations":{"additionalProperties":{"$ref":"#/components/schemas/TranslationState"},"description":"Состояние перевода по языкам","type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["kind","id","rev","data","deleted","created_at","updated_at"],"type":"object"},"EventTypeData":{"additionalProperties":false,"properties":{"builtin":{"description":"Встроенный. Встроенный тип нельзя удалить, можно переименовать.","readOnly":true,"type":"boolean"},"name":{"description":"Название","maxLength":200,"type":"string","x-translatable":true},"slug":{"description":"Адрес страницы. Часть адреса страницы, латиницей. Пусто — из названия.","pattern":"^[a-z0-9]+(-[a-z0-9]+)*$","type":"string"},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"}},"required":["name"],"type":"object"},"EventTypeFields":{"additionalProperties":false,"properties":{"name":{"description":"Название","maxLength":200,"type":"string","x-translatable":true},"slug":{"description":"Адрес страницы. Часть адреса страницы, латиницей. Пусто — из названия.","pattern":"^[a-z0-9]+(-[a-z0-9]+)*$","type":"string"},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"}},"type":"object"},"EventTypeTranslationData":{"additionalProperties":false,"properties":{"name":{"description":"Название","maxLength":200,"type":"string","x-translatable":true}},"type":"object"},"FieldSchema":{"properties":{"default":{},"enum":{"items":{"type":"string"},"type":"array"},"enum_labels":{"additionalProperties":{"$ref":"#/components/schemas/Label"},"type":"object"},"help":{"$ref":"#/components/schemas/Label"},"label":{"$ref":"#/components/schemas/Label"},"max":{"type":"number"},"max_length":{"type":"integer"},"min":{"type":"number"},"name":{"type":"string"},"options":{"description":"Откуда форма берёт варианты: social_channels — подключённые каналы (`GET /api/v1/social/channels`), из enum показываются только они","enum":["social_channels"],"type":"string"},"read_only":{"type":"boolean"},"ref":{"type":"string"},"required":{"type":"boolean"},"slug_from":{"type":"string"},"translatable":{"type":"boolean"},"type":{"enum":["string","text","rich","int","number","bool","date","time","datetime","enum","enums","ref","refs","media","media_list","url","email","phone","slug","color","user","json","money"],"type":"string"}},"required":["name","type","label","required","translatable","read_only"],"type":"object"},"FileVersion":{"properties":{"actor":{"$ref":"#/components/schemas/Actor"},"at":{"format":"date-time","type":"string"},"comment":{"type":"string"},"filename":{"type":"string"},"mime":{"type":"string"},"sha256":{"type":"string"},"size":{"type":"integer"},"url":{"description":"Адрес этой версии на сайте","type":"string"},"version":{"type":"integer"}},"required":["version","sha256","size","mime","filename","at","url"],"type":"object"},"Group":{"description":"Группа","properties":{"created_at":{"format":"date-time","type":"string"},"data":{"$ref":"#/components/schemas/GroupData"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"kind":{"enum":["group"],"type":"string"},"rev":{"description":"Номер последней ревизии; 0 — ещё не записан","type":"integer"},"translations":{"additionalProperties":{"$ref":"#/components/schemas/TranslationState"},"description":"Состояние перевода по языкам","type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["kind","id","rev","data","deleted","created_at","updated_at"],"type":"object"},"GroupData":{"additionalProperties":false,"properties":{"age_from":{"description":"Возраст от","maximum":120,"minimum":0,"type":"integer"},"age_to":{"description":"Возраст до","maximum":120,"minimum":0,"type":"integer"},"discipline":{"description":"Дисциплина","format":"int64","type":"integer","x-ref":"discipline"},"hall":{"description":"Зал","format":"int64","type":"integer","x-ref":"hall"},"instructor":{"description":"Инструктор","format":"int64","type":"integer","x-ref":"instructor"},"level":{"description":"Уровень. Например: начинающие, 5–1 кю.","type":"string","x-translatable":true},"name":{"description":"Название","maxLength":200,"type":"string","x-translatable":true},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"}},"required":["name","hall"],"type":"object"},"GroupFields":{"additionalProperties":false,"properties":{"age_from":{"description":"Возраст от","maximum":120,"minimum":0,"type":"integer"},"age_to":{"description":"Возраст до","maximum":120,"minimum":0,"type":"integer"},"discipline":{"description":"Дисциплина","format":"int64","type":"integer","x-ref":"discipline"},"hall":{"description":"Зал","format":"int64","type":"integer","x-ref":"hall"},"instructor":{"description":"Инструктор","format":"int64","type":"integer","x-ref":"instructor"},"level":{"description":"Уровень. Например: начинающие, 5–1 кю.","type":"string","x-translatable":true},"name":{"description":"Название","maxLength":200,"type":"string","x-translatable":true},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"}},"type":"object"},"GroupTranslationData":{"additionalProperties":false,"properties":{"level":{"description":"Уровень. Например: начинающие, 5–1 кю.","type":"string","x-translatable":true},"name":{"description":"Название","maxLength":200,"type":"string","x-translatable":true}},"type":"object"},"Hall":{"description":"Зал","properties":{"created_at":{"format":"date-time","type":"string"},"data":{"$ref":"#/components/schemas/HallData"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"kind":{"enum":["hall"],"type":"string"},"rev":{"description":"Номер последней ревизии; 0 — ещё не записан","type":"integer"},"translations":{"additionalProperties":{"$ref":"#/components/schemas/TranslationState"},"description":"Состояние перевода по языкам","type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["kind","id","rev","data","deleted","created_at","updated_at"],"type":"object"},"HallData":{"additionalProperties":false,"properties":{"accessibility":{"description":"Доступность. Пандус, лифт, парковка.","type":"string","x-translatable":true},"address":{"description":"Адрес","type":"string","x-translatable":true},"city":{"description":"Город","format":"int64","type":"integer","x-ref":"city"},"directions":{"description":"Как пройти","type":"string","x-translatable":true},"district":{"description":"Район","format":"int64","type":"integer","x-ref":"district"},"email":{"description":"E-mail для заявок. Сюда придут заявки на пробную и оплаты этого зала; на сайте не показывается. Телефоны и адреса для посетителей — в «Контактах».","format":"email","type":"string"},"gallery":{"description":"Ещё фото","items":{"format":"int64","type":"integer"},"type":"array","x-ref":"photo"},"lat":{"description":"Широта","maximum":90,"minimum":-90,"type":"number"},"lng":{"description":"Долгота","maximum":180,"minimum":-180,"type":"number"},"name":{"description":"Название","maxLength":200,"type":"string","x-translatable":true},"photo":{"description":"Фото","format":"int64","type":"integer","x-ref":"photo"},"slug":{"description":"Адрес страницы. Часть адреса страницы, латиницей. Пусто — из названия.","pattern":"^[a-z0-9]+(-[a-z0-9]+)*$","type":"string"},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"},"status":{"description":"Состояние","enum":["open","temporarily_closed","closed"],"type":"string"},"telegram_chat":{"description":"Чат Telegram зала. Заявки в этот зал придут и сюда: номер чата (-100…) или @канал.","maxLength":40,"type":"string"}},"required":["name","city","address","status"],"type":"object"},"HallFields":{"additionalProperties":false,"properties":{"accessibility":{"description":"Доступность. Пандус, лифт, парковка.","type":"string","x-translatable":true},"address":{"description":"Адрес","type":"string","x-translatable":true},"city":{"description":"Город","format":"int64","type":"integer","x-ref":"city"},"directions":{"description":"Как пройти","type":"string","x-translatable":true},"district":{"description":"Район","format":"int64","type":"integer","x-ref":"district"},"email":{"description":"E-mail для заявок. Сюда придут заявки на пробную и оплаты этого зала; на сайте не показывается. Телефоны и адреса для посетителей — в «Контактах».","format":"email","type":"string"},"gallery":{"description":"Ещё фото","items":{"format":"int64","type":"integer"},"type":"array","x-ref":"photo"},"lat":{"description":"Широта","maximum":90,"minimum":-90,"type":"number"},"lng":{"description":"Долгота","maximum":180,"minimum":-180,"type":"number"},"name":{"description":"Название","maxLength":200,"type":"string","x-translatable":true},"photo":{"description":"Фото","format":"int64","type":"integer","x-ref":"photo"},"slug":{"description":"Адрес страницы. Часть адреса страницы, латиницей. Пусто — из названия.","pattern":"^[a-z0-9]+(-[a-z0-9]+)*$","type":"string"},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"},"status":{"description":"Состояние","enum":["open","temporarily_closed","closed"],"type":"string"},"telegram_chat":{"description":"Чат Telegram зала. Заявки в этот зал придут и сюда: номер чата (-100…) или @канал.","maxLength":40,"type":"string"}},"type":"object"},"HallTranslationData":{"additionalProperties":false,"properties":{"accessibility":{"description":"Доступность. Пандус, лифт, парковка.","type":"string","x-translatable":true},"address":{"description":"Адрес","type":"string","x-translatable":true},"directions":{"description":"Как пройти","type":"string","x-translatable":true},"name":{"description":"Название","maxLength":200,"type":"string","x-translatable":true}},"type":"object"},"Health":{"properties":{"mode":{"description":"`setup` — экземпляр ждёт мастера настройки","enum":["setup","normal"],"type":"string"},"status":{"enum":["ok"],"type":"string"},"version":{"type":"string"}},"required":["status","version","mode"],"type":"object"},"HelpPage":{"allOf":[{"$ref":"#/components/schemas/HelpSummary"},{"properties":{"markdown":{"description":"Текст страницы без первой строки-заголовка","type":"string"}},"required":["markdown"],"type":"object"}]},"HelpSummary":{"properties":{"slug":{"type":"string"},"summary":{"description":"Первый абзац страницы","type":"string"},"title":{"type":"string"}},"required":["slug","title","summary"],"type":"object"},"Instructor":{"description":"Инструктор","properties":{"created_at":{"format":"date-time","type":"string"},"data":{"$ref":"#/components/schemas/InstructorData"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"kind":{"enum":["instructor"],"type":"string"},"rev":{"description":"Номер последней ревизии; 0 — ещё не записан","type":"integer"},"translations":{"additionalProperties":{"$ref":"#/components/schemas/TranslationState"},"description":"Состояние перевода по языкам","type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["kind","id","rev","data","deleted","created_at","updated_at"],"type":"object"},"InstructorData":{"additionalProperties":false,"properties":{"bio":{"allOf":[{"$ref":"#/components/schemas/RichDoc"}],"description":"О себе","x-translatable":true},"halls":{"description":"Залы","items":{"format":"int64","type":"integer"},"type":"array","x-ref":"hall"},"hidden":{"description":"Скрыт на сайте","type":"boolean"},"name":{"description":"Имя","maxLength":200,"type":"string","x-translatable":true},"photo":{"description":"Фото","format":"int64","type":"integer","x-ref":"photo"},"ranks":{"description":"Степени и разряды","type":"string","x-translatable":true},"slug":{"description":"Адрес страницы. Часть адреса страницы, латиницей. Пусто — из названия.","pattern":"^[a-z0-9]+(-[a-z0-9]+)*$","type":"string"},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"},"user":{"description":"Вход в админку. Пользователь-инструктор: правит расписание и мероприятия своих залов.","format":"int64","type":"integer"}},"required":["name"],"type":"object"},"InstructorFields":{"additionalProperties":false,"properties":{"bio":{"allOf":[{"$ref":"#/components/schemas/RichDoc"}],"description":"О себе","x-translatable":true},"halls":{"description":"Залы","items":{"format":"int64","type":"integer"},"type":"array","x-ref":"hall"},"hidden":{"description":"Скрыт на сайте","type":"boolean"},"name":{"description":"Имя","maxLength":200,"type":"string","x-translatable":true},"photo":{"description":"Фото","format":"int64","type":"integer","x-ref":"photo"},"ranks":{"description":"Степени и разряды","type":"string","x-translatable":true},"slug":{"description":"Адрес страницы. Часть адреса страницы, латиницей. Пусто — из названия.","pattern":"^[a-z0-9]+(-[a-z0-9]+)*$","type":"string"},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"},"user":{"description":"Вход в админку. Пользователь-инструктор: правит расписание и мероприятия своих залов.","format":"int64","type":"integer"}},"type":"object"},"InstructorTranslationData":{"additionalProperties":false,"properties":{"bio":{"allOf":[{"$ref":"#/components/schemas/RichDoc"}],"description":"О себе","x-translatable":true},"name":{"description":"Имя","maxLength":200,"type":"string","x-translatable":true},"ranks":{"description":"Степени и разряды","type":"string","x-translatable":true}},"type":"object"},"JSONRPCMessage":{"description":"Сообщение JSON-RPC 2.0 — запрос, уведомление или ответ","properties":{"error":{"properties":{"code":{"type":"integer"},"message":{"type":"string"}},"required":["code","message"],"type":"object"},"id":{"oneOf":[{"type":"string"},{"type":"integer"}]},"jsonrpc":{"enum":["2.0"],"type":"string"},"method":{"type":"string"},"params":{"type":"object"},"result":{"type":"object"}},"required":["jsonrpc"],"type":"object"},"KindSchema":{"properties":{"fields":{"items":{"$ref":"#/components/schemas/FieldSchema"},"type":"array"},"help":{"$ref":"#/components/schemas/Label"},"hide_untranslated":{"type":"boolean"},"label":{"$ref":"#/components/schemas/Label"},"name":{"type":"string"},"path":{"type":"string"},"plural":{"$ref":"#/components/schemas/Label"},"publishable":{"type":"boolean"},"singleton":{"type":"boolean"},"title":{"description":"Поле-заголовок","type":"string"},"translatable":{"type":"boolean"},"write":{"description":"Разрешение на запись","type":"string"}},"required":["name","path","label","plural","fields","singleton","publishable","translatable","title"],"type":"object"},"Label":{"properties":{"en":{"type":"string"},"ru":{"type":"string"}},"required":["ru","en"],"type":"object"},"Layout":{"description":"Раскладка страницы. Секции и блоки страницы: тип, ширина из 12, параметры. Пока раскладки нет — встроенная.","properties":{"after_publish":{"description":"Только в ответе сухого прогона публикации: что будет на сайте после неё; published_rev и published выше — что на сайте сейчас (ADR 0033)","properties":{"published":{"$ref":"#/components/schemas/LayoutData"},"published_rev":{"description":"0 — снято с публикации","type":"integer"}},"required":["published_rev"],"type":"object"},"created_at":{"format":"date-time","type":"string"},"data":{"$ref":"#/components/schemas/LayoutData"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"kind":{"enum":["layout"],"type":"string"},"published":{"allOf":[{"$ref":"#/components/schemas/LayoutData"}],"description":"Опубликованные данные — их видит сайт"},"published_rev":{"description":"Опубликованная ревизия; 0 — не опубликовано","type":"integer"},"rev":{"description":"Номер последней ревизии; 0 — ещё не записан","type":"integer"},"translations":{"additionalProperties":{"$ref":"#/components/schemas/TranslationState"},"description":"Состояние перевода по языкам","type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["kind","id","rev","data","deleted","created_at","updated_at"],"type":"object"},"LayoutData":{"additionalProperties":false,"properties":{"page":{"description":"Страница","enum":["home","history","about","halls","schedule","events","instructors","documents","media","trial","prices","contacts"],"type":"string"},"sections":{"description":"Секции. [{\"blocks\": [{\"type\": \"hero\", \"width\": 12, \"params\": {}}]}]; на страницах разделов — ровно один блок \"content\"."}},"required":["page","sections"],"type":"object"},"LayoutFields":{"additionalProperties":false,"properties":{"page":{"description":"Страница","enum":["home","history","about","halls","schedule","events","instructors","documents","media","trial","prices","contacts"],"type":"string"},"sections":{"description":"Секции. [{\"blocks\": [{\"type\": \"hero\", \"width\": 12, \"params\": {}}]}]; на страницах разделов — ровно один блок \"content\"."}},"type":"object"},"LicenseCheck":{"properties":{"license":{"$ref":"#/components/schemas/LicenseState"},"result":{"description":"Поставлен новый ключ или снят отзыв; без изменений (ключ ещё не выпущен или тот же); центр отозвал экземпляр; центр прислал ключ, который не проверяется — оставлен прежний","enum":["updated","unchanged","revoked","rejected"],"type":"string"},"revoked_reason":{"description":"Почему центр отозвал экземпляр","type":"string"}},"required":["result","license"],"type":"object"},"LicenseState":{"properties":{"center":{"description":"Задан ключ экземпляра: лицензию можно проверить в центре сейчас","type":"boolean"},"domains":{"items":{"type":"string"},"type":"array"},"expires_at":{"format":"date-time","type":"string"},"features":{"description":"Включённые сейчас возможности: messengers, ai, languages, support, payments (ADR 0049); купленные, пробные и оставшиеся навсегда вместе","items":{"type":"string"},"type":"array"},"forever":{"description":"Что останется после конца срока и льготы (на своём хостинге — ai, languages)","items":{"type":"string"},"type":"array"},"grace_until":{"description":"До какого числа платное работает после срока","format":"date-time","type":"string"},"has_key":{"type":"boolean"},"instance":{"type":"string"},"reason":{"description":"Почему платное выключено: нет ключа, ключ не проверяется, срок и льгота прошли, чужой домен, центр сети отозвал экземпляр","enum":["none","invalid","expired","domain","revoked"],"type":"string"},"trial":{"additionalProperties":{"format":"date-time","type":"string"},"description":"Пробные возможности и до какого времени они работают, например {\"ai\": \"…\"}; после даты выключаются без льготы","type":"object"},"variant":{"enum":["hosted","client","free"],"type":"string"},"warning":{"description":"Скоро выключится: до конца срока меньше 14 дней или идёт льготный срок","enum":["expiring","grace"],"type":"string"}},"required":["variant","features","has_key"],"type":"object"},"Locale":{"description":"Язык интерфейса админки","enum":["ru","en"],"type":"string"},"LoginRequest":{"properties":{"email":{"type":"string"},"password":{"type":"string"}},"required":["email","password"],"type":"object"},"MaxChat":{"properties":{"active":{"description":"false — бота удалили из чата или остановили в диалоге","type":"boolean"},"chat_id":{"description":"Номер для настроек","format":"int64","type":"integer"},"kind":{"description":"Диалог с человеком, групповой чат или канал","enum":["dialog","chat","channel"],"type":"string"},"seen_at":{"format":"date-time","type":"string"},"title":{"description":"Название чата или канала, имя человека в диалоге","type":"string"}},"required":["chat_id","kind","title","active","seen_at"],"type":"object"},"Media":{"description":"Фото или видео. Фото загружаются файлом; видео — файлом или ссылкой на VK Видео, Rutube, YouTube.","properties":{"created_at":{"format":"date-time","type":"string"},"data":{"$ref":"#/components/schemas/MediaData"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"kind":{"enum":["media"],"type":"string"},"rev":{"description":"Номер последней ревизии; 0 — ещё не записан","type":"integer"},"translations":{"additionalProperties":{"$ref":"#/components/schemas/TranslationState"},"description":"Состояние перевода по языкам","type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["kind","id","rev","data","deleted","created_at","updated_at"],"type":"object"},"MediaData":{"additionalProperties":false,"properties":{"album":{"description":"Альбом","format":"int64","type":"integer","x-ref":"album"},"alt":{"description":"Описание для незрячих. Что на фото — для экранного диктора и поиска. Обязательно для фото.","maxLength":300,"type":"string","x-translatable":true},"caption":{"description":"Подпись","maxLength":500,"type":"string","x-translatable":true},"family":{"description":"Семейство шрифта. Как шрифт называется в стилях, например Ubuntu.","maxLength":60,"type":"string"},"file":{"description":"Файл. sha256 загруженного файла.","readOnly":true,"type":"string"},"filename":{"description":"Имя файла","readOnly":true,"type":"string"},"height":{"description":"Высота","readOnly":true,"type":"integer"},"mime":{"description":"Тип файла","readOnly":true,"type":"string"},"provider":{"description":"Видеосервис","enum":["vk","rutube","youtube"],"type":"string"},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"},"style":{"description":"Стиль","enum":["normal","italic"],"type":"string"},"type":{"description":"Вид","enum":["photo","video","font"],"type":"string"},"video_id":{"description":"Номер видео","maxLength":100,"type":"string"},"weight":{"description":"Начертание. 400 — обычный, 700 — жирный; у переменного шрифта — диапазон «100 900».","maxLength":7,"type":"string"},"width":{"description":"Ширина","readOnly":true,"type":"integer"}},"required":["type"],"type":"object"},"MediaFields":{"additionalProperties":false,"properties":{"album":{"description":"Альбом","format":"int64","type":"integer","x-ref":"album"},"alt":{"description":"Описание для незрячих. Что на фото — для экранного диктора и поиска. Обязательно для фото.","maxLength":300,"type":"string","x-translatable":true},"caption":{"description":"Подпись","maxLength":500,"type":"string","x-translatable":true},"family":{"description":"Семейство шрифта. Как шрифт называется в стилях, например Ubuntu.","maxLength":60,"type":"string"},"provider":{"description":"Видеосервис","enum":["vk","rutube","youtube"],"type":"string"},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"},"style":{"description":"Стиль","enum":["normal","italic"],"type":"string"},"type":{"description":"Вид","enum":["photo","video","font"],"type":"string"},"video_id":{"description":"Номер видео","maxLength":100,"type":"string"},"weight":{"description":"Начертание. 400 — обычный, 700 — жирный; у переменного шрифта — диапазон «100 900».","maxLength":7,"type":"string"}},"type":"object"},"MediaTranslationData":{"additionalProperties":false,"properties":{"alt":{"description":"Описание для незрячих. Что на фото — для экранного диктора и поиска. Обязательно для фото.","maxLength":300,"type":"string","x-translatable":true},"caption":{"description":"Подпись","maxLength":500,"type":"string","x-translatable":true}},"type":"object"},"Menu":{"description":"Меню. Порядок разделов и скрытые. Раздел без содержимого скрывается сам. Правка — черновиком, на сайте после публикации (ADR 0033).","properties":{"after_publish":{"description":"Только в ответе сухого прогона публикации: что будет на сайте после неё; published_rev и published выше — что на сайте сейчас (ADR 0033)","properties":{"published":{"$ref":"#/components/schemas/MenuData"},"published_rev":{"description":"0 — снято с публикации","type":"integer"}},"required":["published_rev"],"type":"object"},"created_at":{"format":"date-time","type":"string"},"data":{"$ref":"#/components/schemas/MenuData"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"kind":{"enum":["menu"],"type":"string"},"published":{"allOf":[{"$ref":"#/components/schemas/MenuData"}],"description":"Опубликованные данные — их видит сайт"},"published_rev":{"description":"Опубликованная ревизия; 0 — не опубликовано","type":"integer"},"rev":{"description":"Номер последней ревизии; 0 — ещё не записан","type":"integer"},"translations":{"additionalProperties":{"$ref":"#/components/schemas/TranslationState"},"description":"Состояние перевода по языкам","type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["kind","id","rev","data","deleted","created_at","updated_at"],"type":"object"},"MenuData":{"additionalProperties":false,"properties":{"items":{"description":"Разделы. Список {\"section\": \"halls\", \"hidden\": false} по порядку. Своё название раздела — \"label\": {\"ru\": \"Студии\"}, до 40 знаков; оно сильнее слов сайта (ADR 0052)."},"words":{"description":"Слова сайта. Как сайт называет залы, тех, кто ведёт занятия, и пробное: по тематике клуба. Пусто — «Залы», «Инструкторы», «Пробная тренировка» (ADR 0052).","enum":["languages","preschool","school","dance","music","it","art","martial","gymnastics","swimming","team-sports","chess"],"type":"string"}},"type":"object"},"MenuFields":{"additionalProperties":false,"properties":{"items":{"description":"Разделы. Список {\"section\": \"halls\", \"hidden\": false} по порядку. Своё название раздела — \"label\": {\"ru\": \"Студии\"}, до 40 знаков; оно сильнее слов сайта (ADR 0052)."},"words":{"description":"Слова сайта. Как сайт называет залы, тех, кто ведёт занятия, и пробное: по тематике клуба. Пусто — «Залы», «Инструкторы», «Пробная тренировка» (ADR 0052).","enum":["languages","preschool","school","dance","music","it","art","martial","gymnastics","swimming","team-sports","chess"],"type":"string"}},"type":"object"},"NetworkItem":{"properties":{"entity_id":{"format":"int64","type":"integer"},"entity_kind":{"enum":["page","event"],"type":"string"},"error":{"type":"string"},"item_id":{"type":"string"},"kind":{"enum":["news","event"],"type":"string"},"lang":{"type":"string"},"next_at":{"format":"date-time","type":"string"},"remote":{"description":"Последний ответ центра о материале","properties":{"published":{"items":{"properties":{"site":{"type":"string"},"url":{"description":"Адрес пересказа","type":"string"}},"required":["site","url"],"type":"object"},"type":"array"},"reason":{"type":"string"},"result":{"enum":["accepted","unchanged","withdrawn"],"type":"string"},"state":{"description":"received — принят, published — пересказан на сайтах сети, skipped — не взят (reason), withdrawn — снят","enum":["received","published","skipped","withdrawn"],"type":"string"}},"type":"object"},"sent_rev":{"type":"integer"},"state":{"description":"refused — центр отказал (422): повтор после следующей правки","enum":["pending","sent","withdrawn","error","refused"],"type":"string"}},"required":["kind","item_id","entity_kind","entity_id","lang","sent_rev","state"],"type":"object"},"NetworkStatus":{"properties":{"center_url":{"type":"string"},"check_error":{"type":"string"},"check_error_code":{"enum":["unauthorized","forbidden","refused","rate_limited","unavailable"],"type":"string"},"checked_at":{"description":"Последняя онлайн-проверка","format":"date-time","type":"string"},"configured":{"description":"Ключ экземпляра задан","type":"boolean"},"error":{"description":"Центр не ответил или отказал","type":"string"},"error_code":{"description":"Причина: ключ неизвестен или отозван, экземпляр выключен или без карточки, центр отказал, слишком часто, центр недоступен","enum":["unauthorized","forbidden","refused","rate_limited","unavailable"],"type":"string"},"instance":{"description":"Экземпляр, как его знает центр","properties":{"cards":{"items":{"properties":{"city":{"type":"string"},"data_url":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"page_url":{"type":"string"}},"type":"object"},"type":"array"},"domains":{"items":{"type":"string"},"type":"array"},"id":{"type":"string"},"name":{"type":"string"},"status":{"enum":["active","revoked"],"type":"string"},"variant":{"type":"string"}},"type":"object"},"items":{"description":"Материалы в сети, новые первыми","items":{"$ref":"#/components/schemas/NetworkItem"},"type":"array"},"revoked":{"type":"boolean"}},"required":["configured","items"],"type":"object"},"OAuthError":{"properties":{"error":{"type":"string"},"error_description":{"type":"string"}},"required":["error"],"type":"object"},"OAuthRequest":{"properties":{"client_name":{"type":"string"},"loopback":{"description":"Возврат на этот же компьютер (localhost) — предупредить","type":"boolean"},"redirect_host":{"description":"Хост адреса возврата — показать человеку","type":"string"},"roles":{"description":"Роли, которые этот человек может дать","items":{"$ref":"#/components/schemas/Role"},"type":"array"},"scopes":{"description":"Какие области просит клиент (пусто — не сказал)","items":{"$ref":"#/components/schemas/Scope"},"type":"array"}},"required":["client_name","redirect_host","loopback","scopes","roles"],"type":"object"},"Order":{"properties":{"amount":{"description":"Копейки; не меняется","format":"int64","type":"integer"},"anonymized_at":{"format":"date-time","type":"string"},"created_at":{"format":"date-time","type":"string"},"double_paid":{"description":"Оплачен дважды — лишнее вернуть","type":"boolean"},"event":{"format":"int64","type":"integer"},"for_age":{"type":"integer"},"for_child":{"type":"boolean"},"for_name":{"type":"string"},"hall":{"format":"int64","type":"integer"},"id":{"format":"int64","type":"integer"},"lang":{"type":"string"},"number":{"description":"Номер для ссылок и банка","type":"string"},"paid_amount":{"format":"int64","type":"integer"},"paid_at":{"format":"date-time","type":"string"},"payer_email":{"type":"string"},"payer_name":{"type":"string"},"payer_phone":{"type":"string"},"receipt_to":{"description":"Куда банк пришлёт чек","type":"string"},"refunded_amount":{"format":"int64","type":"integer"},"status":{"enum":["created","paid","cancelled","refunded_partial","refunded"],"type":"string"},"tariff":{"format":"int64","type":"integer"},"tariff_kind":{"type":"string"},"tariff_name":{"description":"Название тарифа на момент заказа","type":"string"},"trial_request":{"format":"int64","type":"integer"},"updated_at":{"format":"date-time","type":"string"}},"required":["id","number","tariff","tariff_name","tariff_kind","amount","status","paid_amount","refunded_amount","double_paid","created_at","updated_at"],"type":"object"},"OrderTotals":{"properties":{"count":{"type":"integer"},"paid":{"description":"Оплачено, копейки","format":"int64","type":"integer"},"refunded":{"description":"Возвращено, копейки","format":"int64","type":"integer"}},"required":["count","paid","refunded"],"type":"object"},"OutboxItem":{"properties":{"attempts":{"type":"integer"},"channel":{"enum":["email","telegram","max"],"type":"string"},"created_at":{"format":"date-time","type":"string"},"id":{"format":"int64","type":"integer"},"last_error":{"type":"string"},"next_at":{"format":"date-time","type":"string"},"ref":{"description":"О чём сообщение, например trial:12","type":"string"},"sent_at":{"format":"date-time","type":"string"},"status":{"enum":["pending","sent","failed"],"type":"string"},"subject":{"type":"string"},"target":{"type":"string"},"text":{"type":"string"}},"required":["id","channel","target","status","attempts","created_at"],"type":"object"},"Page":{"description":"Материал. Материалы разделов «История», «О нас», «Контакты», «Документы».","properties":{"after_publish":{"description":"Только в ответе сухого прогона публикации: что будет на сайте после неё; published_rev и published выше — что на сайте сейчас (ADR 0033)","properties":{"published":{"$ref":"#/components/schemas/PageData"},"published_rev":{"description":"0 — снято с публикации","type":"integer"}},"required":["published_rev"],"type":"object"},"created_at":{"format":"date-time","type":"string"},"data":{"$ref":"#/components/schemas/PageData"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"kind":{"enum":["page"],"type":"string"},"published":{"allOf":[{"$ref":"#/components/schemas/PageData"}],"description":"Опубликованные данные — их видит сайт"},"published_rev":{"description":"Опубликованная ревизия; 0 — не опубликовано","type":"integer"},"rev":{"description":"Номер последней ревизии; 0 — ещё не записан","type":"integer"},"translations":{"additionalProperties":{"$ref":"#/components/schemas/TranslationState"},"description":"Состояние перевода по языкам","type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["kind","id","rev","data","deleted","created_at","updated_at"],"type":"object"},"PageData":{"additionalProperties":false,"properties":{"body":{"allOf":[{"$ref":"#/components/schemas/RichDoc"}],"description":"Текст","x-translatable":true},"cover":{"description":"Обложка","format":"int64","type":"integer","x-ref":"photo"},"date":{"description":"Дата. По ней сортируется история.","format":"date","type":"string"},"main":{"description":"Главный материал раздела. В «Истории» открывается первым.","type":"boolean"},"network":{"description":"В сеть alted. Новости «Истории»: сеть перескажет материал со ссылкой на сайт клуба. Без контактов людей и данных детей.","type":"boolean"},"section":{"description":"Раздел","enum":["history","about","contacts","documents","privacy","offer"],"type":"string"},"slug":{"description":"Адрес страницы. Часть адреса страницы, латиницей. Пусто — из названия.","pattern":"^[a-z0-9]+(-[a-z0-9]+)*$","type":"string"},"social_to":{"description":"В соцсети клуба. Новости «Истории»: опубликованная новость уйдёт один раз в каждый отмеченный канал.","items":{"enum":["vk","telegram","max"],"type":"string"},"type":"array","uniqueItems":true},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"},"summary":{"description":"Описание. Для списков, поиска и соцсетей.","maxLength":500,"type":"string","x-translatable":true},"title":{"description":"Заголовок","maxLength":200,"type":"string","x-translatable":true}},"required":["section","title"],"type":"object"},"PageFields":{"additionalProperties":false,"properties":{"body":{"allOf":[{"$ref":"#/components/schemas/RichDoc"}],"description":"Текст","x-translatable":true},"cover":{"description":"Обложка","format":"int64","type":"integer","x-ref":"photo"},"date":{"description":"Дата. По ней сортируется история.","format":"date","type":"string"},"main":{"description":"Главный материал раздела. В «Истории» открывается первым.","type":"boolean"},"network":{"description":"В сеть alted. Новости «Истории»: сеть перескажет материал со ссылкой на сайт клуба. Без контактов людей и данных детей.","type":"boolean"},"section":{"description":"Раздел","enum":["history","about","contacts","documents","privacy","offer"],"type":"string"},"slug":{"description":"Адрес страницы. Часть адреса страницы, латиницей. Пусто — из названия.","pattern":"^[a-z0-9]+(-[a-z0-9]+)*$","type":"string"},"social_to":{"description":"В соцсети клуба. Новости «Истории»: опубликованная новость уйдёт один раз в каждый отмеченный канал.","items":{"enum":["vk","telegram","max"],"type":"string"},"type":"array","uniqueItems":true},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"},"summary":{"description":"Описание. Для списков, поиска и соцсетей.","maxLength":500,"type":"string","x-translatable":true},"title":{"description":"Заголовок","maxLength":200,"type":"string","x-translatable":true}},"type":"object"},"PageHTML":{"properties":{"classes":{"items":{"properties":{"count":{"type":"integer"},"name":{"type":"string"}},"required":["name","count"],"type":"object"},"type":"array"},"html":{"type":"string"},"part":{"enum":["main","header","full"],"type":"string"},"path":{"type":"string"},"truncated":{"type":"boolean"}},"required":["path","part","html","truncated","classes"],"type":"object"},"PageTranslationData":{"additionalProperties":false,"properties":{"body":{"allOf":[{"$ref":"#/components/schemas/RichDoc"}],"description":"Текст","x-translatable":true},"summary":{"description":"Описание. Для списков, поиска и соцсетей.","maxLength":500,"type":"string","x-translatable":true},"title":{"description":"Заголовок","maxLength":200,"type":"string","x-translatable":true}},"type":"object"},"PayAttempt":{"properties":{"amount":{"format":"int64","type":"integer"},"bank_payment_id":{"type":"string"},"confirmed_at":{"format":"date-time","type":"string"},"created_at":{"format":"date-time","type":"string"},"error":{"type":"string"},"id":{"description":"Номер попытки у банка (OrderId)","type":"string"},"status":{"description":"Статус банка","type":"string"},"updated_at":{"format":"date-time","type":"string"}},"required":["id","status","amount","created_at","updated_at"],"type":"object"},"PendingItem":{"properties":{"by":{"$ref":"#/components/schemas/Actor"},"comment":{"description":"Комментарий последней правки","type":"string"},"id":{"format":"int64","type":"integer"},"kind":{"type":"string"},"published_rev":{"description":"Опубликованная ревизия; 0 — не опубликовано","type":"integer"},"rev":{"type":"integer"},"state":{"description":"never_published — ни разу не выложено, changed — изменено после выкладки, draft_status — мероприятие в состоянии «черновик»","enum":["never_published","changed","draft_status"],"type":"string"},"title":{"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"required":["kind","id","title","rev","published_rev","state","updated_at","by","comment"],"type":"object"},"PendingTranslation":{"properties":{"id":{"format":"int64","type":"integer"},"kind":{"type":"string"},"state":{"$ref":"#/components/schemas/TranslationState"},"status":{"description":"Кто написал перевод, если он есть","enum":["machine","human"],"type":"string"},"title":{"type":"string"}},"required":["kind","id","state","title"],"type":"object"},"Refund":{"properties":{"actor_id":{"format":"int64","type":"integer"},"actor_name":{"type":"string"},"amount":{"format":"int64","type":"integer"},"attempt_id":{"type":"string"},"bank_status":{"type":"string"},"comment":{"type":"string"},"created_at":{"format":"date-time","type":"string"},"error":{"type":"string"},"id":{"format":"int64","type":"integer"},"status":{"enum":["requested","done","failed"],"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"required":["id","attempt_id","amount","comment","actor_id","status","created_at","updated_at"],"type":"object"},"Region":{"description":"Регион","properties":{"created_at":{"format":"date-time","type":"string"},"data":{"$ref":"#/components/schemas/RegionData"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"kind":{"enum":["region"],"type":"string"},"rev":{"description":"Номер последней ревизии; 0 — ещё не записан","type":"integer"},"translations":{"additionalProperties":{"$ref":"#/components/schemas/TranslationState"},"description":"Состояние перевода по языкам","type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["kind","id","rev","data","deleted","created_at","updated_at"],"type":"object"},"RegionData":{"additionalProperties":false,"properties":{"name":{"description":"Название","maxLength":200,"type":"string","x-translatable":true},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"}},"required":["name"],"type":"object"},"RegionFields":{"additionalProperties":false,"properties":{"name":{"description":"Название","maxLength":200,"type":"string","x-translatable":true},"sort":{"description":"Порядок. Меньше — выше в списке.","maximum":100000,"minimum":-100000,"type":"integer"}},"type":"object"},"RegionTranslationData":{"additionalProperties":false,"properties":{"name":{"description":"Название","maxLength":200,"type":"string","x-translatable":true}},"type":"object"},"RevertRequest":{"properties":{"comment":{"type":"string"},"rev":{"description":"Ревизия, к которой вернуться","type":"integer"}},"required":["rev"],"type":"object"},"Revision":{"properties":{"actor":{"$ref":"#/components/schemas/Actor"},"at":{"format":"date-time","type":"string"},"comment":{"type":"string"},"data":{"description":"Полный снимок полей","type":"object"},"deleted":{"type":"boolean"},"event":{"enum":["create","update","delete","restore","revert","verify"],"type":"string"},"lang":{"description":"Пусто — оригинал","type":"string"},"rev":{"type":"integer"}},"required":["rev","event","data","deleted","actor","comment","at"],"type":"object"},"RevisionList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Revision"},"type":"array"}},"required":["items"],"type":"object"},"RichDoc":{"additionalProperties":true,"description":"Документ TipTap (ADR 0008): `{\"type\": \"doc\", \"content\": [...]}`. Узлы —\nparagraph, heading (2–4), bulletList, orderedList, listItem, blockquote,\nhorizontalRule, hardBreak, text, table…, image `{media, caption}`,\ngallery `{media: [...]}`, video `{media}` или `{provider, id}`; метки —\nbold, italic, underline, strike, link `{href}`, docLink\n`{document, file, version}`.\n\nПри записи вместо документа можно прислать `{\"markdown\": \"…\"}` или\n`{\"html\": \"…\"}` (ADR 0044): сервер переведёт его в документ и\nсохранит документ. Фото — `media:57` (`![подпись](media:57)`,\n`\u003cimg src=\"media:57\"\u003e`), видео — `youtube:ID`, `rutube:ID`, `vk:ID`\nотдельной ссылкой-строкой или `\u003ciframe\u003e` с адресом видеосервиса.\nЧего богатый текст не умеет, станет текстом или отбросится.\n","properties":{"content":{"items":{"type":"object"},"type":"array"},"html":{"description":"Только при записи — текст в HTML","type":"string"},"markdown":{"description":"Только при записи — текст в Markdown","type":"string"},"type":{"enum":["doc"],"type":"string"}},"type":"object"},"Role":{"enum":["admin","content_manager","instructor"],"type":"string"},"SaveTranslationRequest":{"properties":{"comment":{"type":"string"},"data":{"description":"Только переводимые поля вида","type":"object"},"rev":{"description":"Ревизия перевода, на которой основана правка; 0 — новый","type":"integer"},"status":{"description":"`machine` — перевела модель. Не указан — `human` у человека; по ключу API перевод всегда `machine`.","enum":["machine","human"],"type":"string"}},"required":["rev","data"],"type":"object"},"ScheduleChange":{"description":"Отмена или замена. Занятие в конкретный день отменено или идёт иначе.","properties":{"created_at":{"format":"date-time","type":"string"},"data":{"$ref":"#/components/schemas/ScheduleChangeData"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"kind":{"enum":["schedule_change"],"type":"string"},"rev":{"description":"Номер последней ревизии; 0 — ещё не записан","type":"integer"},"translations":{"additionalProperties":{"$ref":"#/components/schemas/TranslationState"},"description":"Состояние перевода по языкам","type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["kind","id","rev","data","deleted","created_at","updated_at"],"type":"object"},"ScheduleChangeData":{"additionalProperties":false,"properties":{"change":{"description":"Что","enum":["cancelled","changed"],"type":"string"},"date":{"description":"Дата","format":"date","type":"string"},"end":{"description":"Новый конец","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$","type":"string"},"hall":{"description":"Другой зал","format":"int64","type":"integer","x-ref":"hall"},"instructor":{"description":"Замена инструктора","format":"int64","type":"integer","x-ref":"instructor"},"note":{"description":"Примечание","type":"string","x-translatable":true},"slot":{"description":"Занятие","format":"int64","type":"integer","x-ref":"schedule_slot"},"start":{"description":"Новое начало","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$","type":"string"}},"required":["slot","date","change"],"type":"object"},"ScheduleChangeFields":{"additionalProperties":false,"properties":{"change":{"description":"Что","enum":["cancelled","changed"],"type":"string"},"date":{"description":"Дата","format":"date","type":"string"},"end":{"description":"Новый конец","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$","type":"string"},"hall":{"description":"Другой зал","format":"int64","type":"integer","x-ref":"hall"},"instructor":{"description":"Замена инструктора","format":"int64","type":"integer","x-ref":"instructor"},"note":{"description":"Примечание","type":"string","x-translatable":true},"slot":{"description":"Занятие","format":"int64","type":"integer","x-ref":"schedule_slot"},"start":{"description":"Новое начало","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$","type":"string"}},"type":"object"},"ScheduleChangeTranslationData":{"additionalProperties":false,"properties":{"note":{"description":"Примечание","type":"string","x-translatable":true}},"type":"object"},"ScheduleSlot":{"description":"Занятие. Повторяющееся занятие: день недели и время.","properties":{"created_at":{"format":"date-time","type":"string"},"data":{"$ref":"#/components/schemas/ScheduleSlotData"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"kind":{"enum":["schedule_slot"],"type":"string"},"rev":{"description":"Номер последней ревизии; 0 — ещё не записан","type":"integer"},"translations":{"additionalProperties":{"$ref":"#/components/schemas/TranslationState"},"description":"Состояние перевода по языкам","type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["kind","id","rev","data","deleted","created_at","updated_at"],"type":"object"},"ScheduleSlotData":{"additionalProperties":false,"properties":{"discipline":{"description":"Дисциплина. Если без группы.","format":"int64","type":"integer","x-ref":"discipline"},"end":{"description":"Конец","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$","type":"string"},"group":{"description":"Группа","format":"int64","type":"integer","x-ref":"group"},"hall":{"description":"Зал","format":"int64","type":"integer","x-ref":"hall"},"instructor":{"description":"Инструктор","format":"int64","type":"integer","x-ref":"instructor"},"note":{"description":"Примечание","type":"string","x-translatable":true},"start":{"description":"Начало","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$","type":"string"},"valid_from":{"description":"Действует с","format":"date","type":"string"},"valid_to":{"description":"Действует по","format":"date","type":"string"},"weekday":{"description":"День недели. 1 — понедельник, 7 — воскресенье.","maximum":7,"minimum":1,"type":"integer"}},"required":["hall","weekday","start","end"],"type":"object"},"ScheduleSlotFields":{"additionalProperties":false,"properties":{"discipline":{"description":"Дисциплина. Если без группы.","format":"int64","type":"integer","x-ref":"discipline"},"end":{"description":"Конец","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$","type":"string"},"group":{"description":"Группа","format":"int64","type":"integer","x-ref":"group"},"hall":{"description":"Зал","format":"int64","type":"integer","x-ref":"hall"},"instructor":{"description":"Инструктор","format":"int64","type":"integer","x-ref":"instructor"},"note":{"description":"Примечание","type":"string","x-translatable":true},"start":{"description":"Начало","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$","type":"string"},"valid_from":{"description":"Действует с","format":"date","type":"string"},"valid_to":{"description":"Действует по","format":"date","type":"string"},"weekday":{"description":"День недели. 1 — понедельник, 7 — воскресенье.","maximum":7,"minimum":1,"type":"integer"}},"type":"object"},"ScheduleSlotTranslationData":{"additionalProperties":false,"properties":{"note":{"description":"Примечание","type":"string","x-translatable":true}},"type":"object"},"Schema":{"properties":{"default_language":{"type":"string"},"kinds":{"items":{"$ref":"#/components/schemas/KindSchema"},"type":"array"},"languages":{"items":{"type":"string"},"type":"array"}},"required":["kinds","languages","default_language"],"type":"object"},"Scope":{"description":"Области ключа (ADR 0017); `publish` — публикация того, что ключ может менять (ADR 0031); деньги — цены, возвраты, ключи терминала — не даёт ни одна (ADR 0021)","enum":["read","content","translate","schedule","layout","templates","publish","requests:read","orders:read"],"type":"string"},"SecretInfo":{"properties":{"set":{"type":"boolean"},"updated_at":{"format":"date-time","type":"string"}},"required":["set"],"type":"object"},"Session":{"properties":{"csrf_token":{"type":"string"},"permissions":{"description":"Разрешения роли, например `users.manage`","items":{"type":"string"},"type":"array"},"user":{"$ref":"#/components/schemas/User"}},"required":["user","csrf_token","permissions"],"type":"object"},"SetPasswordRequest":{"properties":{"password":{"minLength":10,"type":"string"}},"required":["password"],"type":"object"},"Settings":{"description":"Настройки. Пароли и токены — отдельно, в разделе секретов: здесь их нет.","properties":{"created_at":{"format":"date-time","type":"string"},"data":{"$ref":"#/components/schemas/SettingsData"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"kind":{"enum":["settings"],"type":"string"},"rev":{"description":"Номер последней ревизии; 0 — ещё не записан","type":"integer"},"translations":{"additionalProperties":{"$ref":"#/components/schemas/TranslationState"},"description":"Состояние перевода по языкам","type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["kind","id","rev","data","deleted","created_at","updated_at"],"type":"object"},"SettingsData":{"additionalProperties":false,"properties":{"max_api":{"description":"Адрес MAX API. Менять, только если нужен прокси.","format":"uri","type":"string"},"max_channel":{"description":"Канал MAX клуба. Номер канала из «Где бот MAX»; бот клуба должен быть его администратором.","maxLength":20,"type":"string"},"metrika_id":{"description":"Яндекс-Метрика: номер счётчика. Пусто — Метрики нет. С ней на сайте появится уведомление о cookie.","maxLength":12,"type":"string"},"network_url":{"description":"Адрес центра сети alted. Ключ экземпляра — в секретах.","format":"uri","type":"string"},"notify_emails":{"description":"Адреса для заявок. По одному в строке. У зала может быть свой адрес.","type":"string"},"notify_max":{"description":"Чаты MAX для заявок. Номера чатов из «Каналов и отправки» → «Где бот MAX», по одному в строке.","type":"string"},"notify_telegram":{"description":"Чаты Telegram для заявок. Номер чата (-100…) или @канал, по одному в строке.","type":"string"},"pay_enabled":{"description":"Оплата на сайте включена. Ключи терминала — в секретах.","type":"boolean"},"pay_ffd":{"description":"Версия ФФД чеков. Та же, что в кабинете банка.","enum":["1.05","1.2"],"type":"string"},"pay_taxation":{"description":"Система налогообложения (для чеков)","enum":["osn","usn_income","usn_income_outcome","esn","patent"],"type":"string"},"pay_vat":{"description":"НДС в чеке","enum":["none","vat0","vat5","vat7","vat10","vat22"],"type":"string"},"pay_without":{"description":"Цены без оплаты","enum":["show","hide"],"type":"string"},"primary_domain":{"description":"Основной домен сайта. Например aikido.ru. С других доменов — постоянное перенаправление сюда. Пусто — без перенаправления.","maxLength":253,"type":"string"},"report_max":{"description":"Чаты MAX для отчётов. Пусто — те же, что для заявок.","type":"string"},"report_telegram":{"description":"Чаты для отчётов. Пусто — те же, что для заявок.","type":"string"},"report_time":{"description":"Время отчётов","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$","type":"string"},"reports_daily":{"description":"Ежедневный отчёт в Telegram и MAX","type":"boolean"},"reports_weekly":{"description":"Еженедельный отчёт в Telegram и MAX. По понедельникам за прошлую неделю.","type":"boolean"},"retention_days":{"description":"Срок хранения заявок, дней. Потом имя и контакты обезличиваются (152-ФЗ).","maximum":3650,"minimum":30,"type":"integer"},"smtp_from":{"description":"Адрес отправителя","format":"email","type":"string"},"smtp_host":{"description":"SMTP: сервер","type":"string"},"smtp_mode":{"description":"SMTP: шифрование","enum":["starttls","tls","none"],"type":"string"},"smtp_port":{"description":"SMTP: порт","maximum":65535,"minimum":1,"type":"integer"},"smtp_user":{"description":"SMTP: логин","type":"string"},"telegram_api":{"description":"Адрес Telegram Bot API. Менять, только если нужен прокси.","format":"uri","type":"string"},"telegram_channel":{"description":"Telegram-канал клуба. @канал или -100…; бот клуба должен быть его администратором.","maxLength":100,"type":"string"},"timezone":{"description":"Часовой пояс клуба","enum":["Europe/Kaliningrad","Europe/Moscow","Europe/Samara","Asia/Yekaterinburg","Asia/Omsk","Asia/Novosibirsk","Asia/Krasnoyarsk","Asia/Irkutsk","Asia/Yakutsk","Asia/Vladivostok","Asia/Magadan","Asia/Kamchatka"],"type":"string"},"trial_paid":{"description":"Пробная платная. После записи человек идёт на оплату.","type":"boolean"},"trial_tariff":{"description":"Тариф пробной","format":"int64","type":"integer","x-ref":"tariff"},"update_auto":{"description":"Ставить обновления сами. При любой лицензии; без этого новая версия ставится кнопкой.","type":"boolean"},"update_url":{"description":"Адрес обновлений. Подписанный манифест выпусков alted; менять, только если нужно зеркало.","format":"uri","type":"string"},"vk_api":{"description":"Адрес VK API. Менять, только если нужен прокси.","format":"uri","type":"string"},"vk_group":{"description":"Сообщество ВКонтакте: номер. Для публикации новостей и мероприятий. Ключ доступа — в секретах.","maxLength":20,"type":"string"}},"type":"object"},"SettingsFields":{"additionalProperties":false,"properties":{"max_api":{"description":"Адрес MAX API. Менять, только если нужен прокси.","format":"uri","type":"string"},"max_channel":{"description":"Канал MAX клуба. Номер канала из «Где бот MAX»; бот клуба должен быть его администратором.","maxLength":20,"type":"string"},"metrika_id":{"description":"Яндекс-Метрика: номер счётчика. Пусто — Метрики нет. С ней на сайте появится уведомление о cookie.","maxLength":12,"type":"string"},"network_url":{"description":"Адрес центра сети alted. Ключ экземпляра — в секретах.","format":"uri","type":"string"},"notify_emails":{"description":"Адреса для заявок. По одному в строке. У зала может быть свой адрес.","type":"string"},"notify_max":{"description":"Чаты MAX для заявок. Номера чатов из «Каналов и отправки» → «Где бот MAX», по одному в строке.","type":"string"},"notify_telegram":{"description":"Чаты Telegram для заявок. Номер чата (-100…) или @канал, по одному в строке.","type":"string"},"pay_enabled":{"description":"Оплата на сайте включена. Ключи терминала — в секретах.","type":"boolean"},"pay_ffd":{"description":"Версия ФФД чеков. Та же, что в кабинете банка.","enum":["1.05","1.2"],"type":"string"},"pay_taxation":{"description":"Система налогообложения (для чеков)","enum":["osn","usn_income","usn_income_outcome","esn","patent"],"type":"string"},"pay_vat":{"description":"НДС в чеке","enum":["none","vat0","vat5","vat7","vat10","vat22"],"type":"string"},"pay_without":{"description":"Цены без оплаты","enum":["show","hide"],"type":"string"},"primary_domain":{"description":"Основной домен сайта. Например aikido.ru. С других доменов — постоянное перенаправление сюда. Пусто — без перенаправления.","maxLength":253,"type":"string"},"report_max":{"description":"Чаты MAX для отчётов. Пусто — те же, что для заявок.","type":"string"},"report_telegram":{"description":"Чаты для отчётов. Пусто — те же, что для заявок.","type":"string"},"report_time":{"description":"Время отчётов","pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$","type":"string"},"reports_daily":{"description":"Ежедневный отчёт в Telegram и MAX","type":"boolean"},"reports_weekly":{"description":"Еженедельный отчёт в Telegram и MAX. По понедельникам за прошлую неделю.","type":"boolean"},"retention_days":{"description":"Срок хранения заявок, дней. Потом имя и контакты обезличиваются (152-ФЗ).","maximum":3650,"minimum":30,"type":"integer"},"smtp_from":{"description":"Адрес отправителя","format":"email","type":"string"},"smtp_host":{"description":"SMTP: сервер","type":"string"},"smtp_mode":{"description":"SMTP: шифрование","enum":["starttls","tls","none"],"type":"string"},"smtp_port":{"description":"SMTP: порт","maximum":65535,"minimum":1,"type":"integer"},"smtp_user":{"description":"SMTP: логин","type":"string"},"telegram_api":{"description":"Адрес Telegram Bot API. Менять, только если нужен прокси.","format":"uri","type":"string"},"telegram_channel":{"description":"Telegram-канал клуба. @канал или -100…; бот клуба должен быть его администратором.","maxLength":100,"type":"string"},"timezone":{"description":"Часовой пояс клуба","enum":["Europe/Kaliningrad","Europe/Moscow","Europe/Samara","Asia/Yekaterinburg","Asia/Omsk","Asia/Novosibirsk","Asia/Krasnoyarsk","Asia/Irkutsk","Asia/Yakutsk","Asia/Vladivostok","Asia/Magadan","Asia/Kamchatka"],"type":"string"},"trial_paid":{"description":"Пробная платная. После записи человек идёт на оплату.","type":"boolean"},"trial_tariff":{"description":"Тариф пробной","format":"int64","type":"integer","x-ref":"tariff"},"update_auto":{"description":"Ставить обновления сами. При любой лицензии; без этого новая версия ставится кнопкой.","type":"boolean"},"update_url":{"description":"Адрес обновлений. Подписанный манифест выпусков alted; менять, только если нужно зеркало.","format":"uri","type":"string"},"vk_api":{"description":"Адрес VK API. Менять, только если нужен прокси.","format":"uri","type":"string"},"vk_group":{"description":"Сообщество ВКонтакте: номер. Для публикации новостей и мероприятий. Ключ доступа — в секретах.","maxLength":20,"type":"string"}},"type":"object"},"SiteInfo":{"properties":{"club_name":{"type":"string"},"default_language":{"type":"string"},"hidden_sections":{"description":"Разделы меню, которые сайт не показывает, потому что в них пусто (ADR 0033)","items":{"type":"string"},"type":"array"},"languages":{"items":{"type":"string"},"type":"array"}},"required":["club_name","languages","default_language","hidden_sections"],"type":"object"},"Stats":{"properties":{"ai_bots":{"$ref":"#/components/schemas/Counts"},"days":{"items":{"properties":{"ai":{"type":"integer"},"day":{"format":"date","type":"string"},"search":{"type":"integer"},"views":{"type":"integer"},"visitors":{"type":"integer"}},"required":["day","views","visitors","ai","search"],"type":"object"},"type":"array"},"devices":{"$ref":"#/components/schemas/Counts"},"from":{"format":"date","type":"string"},"funnel":{"properties":{"trial_requests":{"type":"integer"},"trial_views":{"description":"Просмотры формы записи людьми","type":"integer"}},"required":["trial_views","trial_requests"],"type":"object"},"languages":{"$ref":"#/components/schemas/Counts"},"pages":{"$ref":"#/components/schemas/Counts"},"queries":{"$ref":"#/components/schemas/Counts"},"referrers":{"$ref":"#/components/schemas/Counts"},"requests_by_source":{"$ref":"#/components/schemas/Counts"},"search_bots":{"$ref":"#/components/schemas/Counts"},"to":{"format":"date","type":"string"},"totals":{"properties":{"ai":{"type":"integer"},"bots":{"type":"integer"},"scanners":{"type":"integer"},"search":{"type":"integer"},"views":{"type":"integer"},"visitors":{"type":"integer"}},"required":["views","visitors","ai","search","bots","scanners"],"type":"object"}},"required":["from","to","days","totals","pages","referrers","devices","languages","ai_bots","search_bots","funnel","requests_by_source"],"type":"object"},"Tariff":{"description":"Тариф. Цены и оплата. Модели цены не меняют.","properties":{"created_at":{"format":"date-time","type":"string"},"data":{"$ref":"#/components/schemas/TariffData"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"kind":{"enum":["tariff"],"type":"string"},"rev":{"description":"Номер последней ревизии; 0 — ещё не записан","type":"integer"},"translations":{"additionalProperties":{"$ref":"#/components/schemas/TranslationState"},"description":"Состояние перевода по языкам","type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["kind","id","rev","data","deleted","created_at","updated_at"],"type":"object"},"TariffData":{"additionalProperties":false,"properties":{"applies_to":{"description":"Относится к","enum":["all","hall","group","discipline"],"type":"string"},"classes":{"description":"Занятий. Для абонемента на N занятий.","maximum":1000,"minimum":1,"type":"integer"},"description":{"description":"Описание","maxLength":1000,"type":"string","x-translatable":true},"discipline":{"description":"Дисциплина","format":"int64","type":"integer","x-ref":"discipline"},"group":{"description":"Группа","format":"int64","type":"integer","x-ref":"group"},"hall":{"description":"Зал","format":"int64","type":"integer","x-ref":"hall"},"hidden":{"description":"Скрыть с сайта","type":"boolean"},"kind":{"description":"Вид","enum":["trial","single","pack","period","event"],"type":"string"},"name":{"description":"Название","maxLength":120,"type":"string","x-translatable":true},"period":{"description":"Период","enum":["month","quarter","half_year","year"],"type":"string"},"price":{"description":"Цена. В копейках","format":"int64","minimum":0,"type":"integer"},"slug":{"description":"Адрес страницы. Часть адреса страницы, латиницей. Пусто — из названия.","pattern":"^[a-z0-9]+(-[a-z0-9]+)*$","type":"string"},"sort":{"description":"Порядок","type":"integer"},"valid_days":{"description":"Срок действия, дней","maximum":3660,"minimum":1,"type":"integer"}},"required":["name","kind","price","applies_to"],"type":"object"},"TariffFields":{"additionalProperties":false,"properties":{"applies_to":{"description":"Относится к","enum":["all","hall","group","discipline"],"type":"string"},"classes":{"description":"Занятий. Для абонемента на N занятий.","maximum":1000,"minimum":1,"type":"integer"},"description":{"description":"Описание","maxLength":1000,"type":"string","x-translatable":true},"discipline":{"description":"Дисциплина","format":"int64","type":"integer","x-ref":"discipline"},"group":{"description":"Группа","format":"int64","type":"integer","x-ref":"group"},"hall":{"description":"Зал","format":"int64","type":"integer","x-ref":"hall"},"hidden":{"description":"Скрыть с сайта","type":"boolean"},"kind":{"description":"Вид","enum":["trial","single","pack","period","event"],"type":"string"},"name":{"description":"Название","maxLength":120,"type":"string","x-translatable":true},"period":{"description":"Период","enum":["month","quarter","half_year","year"],"type":"string"},"price":{"description":"Цена. В копейках","format":"int64","minimum":0,"type":"integer"},"slug":{"description":"Адрес страницы. Часть адреса страницы, латиницей. Пусто — из названия.","pattern":"^[a-z0-9]+(-[a-z0-9]+)*$","type":"string"},"sort":{"description":"Порядок","type":"integer"},"valid_days":{"description":"Срок действия, дней","maximum":3660,"minimum":1,"type":"integer"}},"type":"object"},"TariffTranslationData":{"additionalProperties":false,"properties":{"description":{"description":"Описание","maxLength":1000,"type":"string","x-translatable":true},"name":{"description":"Название","maxLength":120,"type":"string","x-translatable":true}},"type":"object"},"TemplateCheck":{"properties":{"draft_pages":{"description":"Разница с черновиками (раскладок, шаблонов), если на этих страницах они отличаются от сайта (ADR 0033)","items":{"properties":{"diff":{"type":"string"},"path":{"type":"string"}},"required":["path","diff"],"type":"object"},"type":"array"},"pages":{"description":"Разница с опубликованным сайтом, только страницы, где HTML меняется; пусто при непустом `used_on` — сайт не изменится","items":{"properties":{"diff":{"description":"Строки «-» ушли, «+» пришли","type":"string"},"path":{"type":"string"}},"required":["path","diff"],"type":"object"},"type":"array"},"problems":{"items":{"$ref":"#/components/schemas/TemplateProblem"},"type":"array"},"samples":{"description":"Блок на эталонных данных (пустых и длинных) на каждом языке — видно и на сайте без записей","items":{"properties":{"data":{"enum":["empty","long"],"type":"string"},"html":{"type":"string"},"lang":{"type":"string"}},"required":["lang","data","html"],"type":"object"},"type":"array"},"used_on":{"description":"Страницы (с языком), где тип стоит в черновике или опубликованной раскладке","items":{"type":"string"},"type":"array"}},"required":["problems","used_on","pages","draft_pages","samples"],"type":"object"},"TemplateProblem":{"properties":{"line":{"type":"integer"},"message":{"type":"string"}},"required":["message"],"type":"object"},"Theme":{"description":"Тема. Цвета и шрифт сайта. Контраст проверяется по WCAG AA.","properties":{"after_publish":{"description":"Только в ответе сухого прогона публикации: что будет на сайте после неё; published_rev и published выше — что на сайте сейчас (ADR 0033)","properties":{"published":{"$ref":"#/components/schemas/ThemeData"},"published_rev":{"description":"0 — снято с публикации","type":"integer"}},"required":["published_rev"],"type":"object"},"created_at":{"format":"date-time","type":"string"},"data":{"$ref":"#/components/schemas/ThemeData"},"deleted":{"type":"boolean"},"id":{"format":"int64","type":"integer"},"kind":{"enum":["theme"],"type":"string"},"published":{"allOf":[{"$ref":"#/components/schemas/ThemeData"}],"description":"Опубликованные данные — их видит сайт"},"published_rev":{"description":"Опубликованная ревизия; 0 — не опубликовано","type":"integer"},"rev":{"description":"Номер последней ревизии; 0 — ещё не записан","type":"integer"},"translations":{"additionalProperties":{"$ref":"#/components/schemas/TranslationState"},"description":"Состояние перевода по языкам","type":"object"},"updated_at":{"format":"date-time","type":"string"}},"required":["kind","id","rev","data","deleted","created_at","updated_at"],"type":"object"},"ThemeData":{"additionalProperties":false,"properties":{"accent":{"description":"Акцент: ссылки и кнопки","pattern":"^#[0-9a-f]{6}$","type":"string"},"accent_fg":{"description":"Текст на кнопке","pattern":"^#[0-9a-f]{6}$","type":"string"},"bg":{"description":"Фон","pattern":"^#[0-9a-f]{6}$","type":"string"},"css":{"description":"Своя таблица стилей. Добавляется к стилям сайта: классы для шаблонов блоков. Без @import и внешних адресов.","maxLength":20000,"type":"string"},"fg":{"description":"Текст","pattern":"^#[0-9a-f]{6}$","type":"string"},"font":{"description":"Шрифт. Пусто — как в готовой теме.","enum":["sans","serif","rounded"],"type":"string"},"font_headings":{"description":"Шрифт заголовков. Семейство одного из своих шрифтов. Пусто — как у текста.","maxLength":60,"type":"string"},"font_text":{"description":"Шрифт текста. Семейство одного из своих шрифтов. Пусто — «Шрифт» выше.","maxLength":60,"type":"string"},"fonts":{"description":"Шрифты. Свои шрифты из медиатеки: «Фото и видео» → «Загрузить шрифт».","items":{"format":"int64","type":"integer"},"type":"array","x-ref":"font"},"muted":{"description":"Второстепенный текст","pattern":"^#[0-9a-f]{6}$","type":"string"},"preset":{"description":"Готовая тема","enum":["classic","dojo","sea"],"type":"string"},"radius":{"description":"Скругление углов, px","maximum":24,"minimum":0,"type":"integer"},"surface":{"description":"Фон карточек","pattern":"^#[0-9a-f]{6}$","type":"string"}},"required":["preset"],"type":"object"},"ThemeFields":{"additionalProperties":false,"properties":{"accent":{"description":"Акцент: ссылки и кнопки","pattern":"^#[0-9a-f]{6}$","type":"string"},"accent_fg":{"description":"Текст на кнопке","pattern":"^#[0-9a-f]{6}$","type":"string"},"bg":{"description":"Фон","pattern":"^#[0-9a-f]{6}$","type":"string"},"css":{"description":"Своя таблица стилей. Добавляется к стилям сайта: классы для шаблонов блоков. Без @import и внешних адресов.","maxLength":20000,"type":"string"},"fg":{"description":"Текст","pattern":"^#[0-9a-f]{6}$","type":"string"},"font":{"description":"Шрифт. Пусто — как в готовой теме.","enum":["sans","serif","rounded"],"type":"string"},"font_headings":{"description":"Шрифт заголовков. Семейство одного из своих шрифтов. Пусто — как у текста.","maxLength":60,"type":"string"},"font_text":{"description":"Шрифт текста. Семейство одного из своих шрифтов. Пусто — «Шрифт» выше.","maxLength":60,"type":"string"},"fonts":{"description":"Шрифты. Свои шрифты из медиатеки: «Фото и видео» → «Загрузить шрифт».","items":{"format":"int64","type":"integer"},"type":"array","x-ref":"font"},"muted":{"description":"Второстепенный текст","pattern":"^#[0-9a-f]{6}$","type":"string"},"preset":{"description":"Готовая тема","enum":["classic","dojo","sea"],"type":"string"},"radius":{"description":"Скругление углов, px","maximum":24,"minimum":0,"type":"integer"},"surface":{"description":"Фон карточек","pattern":"^#[0-9a-f]{6}$","type":"string"}},"type":"object"},"Translation":{"properties":{"data":{"description":"Переводимые поля, последняя правка","type":"object"},"lang":{"type":"string"},"rev":{"description":"0 — перевода ещё нет","type":"integer"},"state":{"$ref":"#/components/schemas/TranslationState"},"status":{"enum":["machine","human"],"type":"string"},"updated_at":{"format":"date-time","type":"string"},"verified":{"description":"Проверенный перевод — его видит сайт","type":"object"},"verified_rev":{"type":"integer"}},"required":["lang","rev","state","data"],"type":"object"},"TranslationState":{"description":"missing — перевода нет; outdated — оригинал изменился после перевода;\nunverified — перевод не проверен человеком; verified — проверен,\nего видит сайт.\n","enum":["missing","outdated","unverified","verified"],"type":"string"},"TrialDraft":{"properties":{"code":{"description":"Код для страницы `/trial/confirm/`","pattern":"^\\d{6}$","type":"string"},"confirm_url":{"description":"Ссылка для человека","format":"uri","type":"string"},"expires_at":{"format":"date-time","type":"string"},"instructions":{"description":"Что сказать человеку, на языке черновика","type":"string"}},"required":["confirm_url","code","expires_at","instructions"],"type":"object"},"TrialDraftInput":{"additionalProperties":false,"properties":{"age":{"description":"Полных лет; ребёнку до года — 0 (ADR 0052)","maximum":100,"minimum":0,"type":"integer"},"comment":{"maxLength":2000,"type":"string"},"contact":{"description":"Как связаться; по умолчанию — телефон","enum":["phone","telegram","max","email"],"type":"string"},"discipline":{"description":"`slug` направления (см. `llms.txt`)","type":"string"},"email":{"format":"email","type":"string"},"for_child":{"description":"Записывает родитель за ребёнка","type":"boolean"},"hall":{"description":"`slug` зала из `/data/halls.json`; нет — «подберите зал»","type":"string"},"lang":{"description":"Язык страницы подтверждения; по умолчанию — язык сайта","type":"string"},"name":{"description":"Имя того, кто придёт","maxLength":100,"type":"string"},"phone":{"description":"Телефон или e-mail — хотя бы одно","type":"string"},"preferred":{"description":"Удобные дни и время","maxLength":300,"type":"string"}},"required":["name","age"],"type":"object"},"TrialEvent":{"properties":{"action":{"enum":["submit","update","anonymize","confirm"],"type":"string"},"actor_id":{"format":"int64","type":"integer"},"actor_name":{"type":"string"},"actor_type":{"type":"string"},"at":{"format":"date-time","type":"string"},"detail":{"description":"JSON с подробностями","type":"string"}},"required":["at","actor_type","action"],"type":"object"},"TrialRequest":{"properties":{"age":{"type":"integer"},"anonymized_at":{"format":"date-time","type":"string"},"assignee":{"format":"int64","type":"integer"},"assignee_name":{"description":"Имя ответственного (видно всем, кто видит заявку)","type":"string"},"city":{"format":"int64","type":"integer"},"city_name":{"type":"string"},"comment":{"type":"string"},"consent_at":{"format":"date-time","type":"string"},"consent_hash":{"type":"string"},"consent_ip":{"type":"string"},"contact":{"enum":["phone","telegram","max","email"],"type":"string"},"created_at":{"format":"date-time","type":"string"},"discipline":{"format":"int64","type":"integer"},"discipline_name":{"type":"string"},"email":{"type":"string"},"for_child":{"type":"boolean"},"group":{"format":"int64","type":"integer"},"group_name":{"type":"string"},"hall":{"description":"0 — «подберите зал»","format":"int64","type":"integer"},"hall_name":{"type":"string"},"id":{"format":"int64","type":"integer"},"lang":{"type":"string"},"name":{"description":"Пусто после обезличивания","type":"string"},"notes":{"type":"string"},"phone":{"type":"string"},"preferred":{"type":"string"},"source":{"description":"сайт, диалог с моделью (ADR 0020) или форма из готовой ссылки","enum":["site","llm","link"],"type":"string"},"status":{"enum":["draft","new","contacted","came","no_show","declined"],"type":"string"},"updated_at":{"format":"date-time","type":"string"}},"required":["id","status","source","for_child","name","age","contact","hall","created_at"],"type":"object"},"UpdateStatus":{"properties":{"available":{"description":"Более новая версия, если есть","properties":{"notes":{"additionalProperties":{"type":"string"},"description":"Что нового — по языкам","type":"object"},"released_at":{"format":"date-time","type":"string"},"version":{"type":"string"}},"type":"object"},"checked_at":{"format":"date-time","type":"string"},"configured":{"description":"Адрес манифеста задан в настройках","type":"boolean"},"current":{"description":"Работающая версия","type":"string"},"error":{"description":"Почему проверка не удалась","type":"string"},"error_code":{"description":"Причина ошибки: подпись не сошлась, манифест не читается, нет файла этой архитектуры, файл не совпал, не прошёл проверку на копии, новее нет, уже ставится, сеть","enum":["signature","manifest","no_file","checksum","selfcheck","nothing","busy","network"],"type":"string"},"last":{"description":"Итог последнего обновления","properties":{"at":{"format":"date-time","type":"string"},"from":{"type":"string"},"ok":{"description":"false — новая версия не поднялась, возвращена прежняя и копия базы","type":"boolean"},"to":{"type":"string"}},"required":["from","to","ok","at"],"type":"object"}},"required":["current","configured"],"type":"object"},"UpdateUserRequest":{"description":"Меняются только переданные поля","properties":{"disabled":{"type":"boolean"},"locale":{"$ref":"#/components/schemas/Locale"},"name":{"type":"string"},"role":{"$ref":"#/components/schemas/Role"}},"type":"object"},"User":{"properties":{"created_at":{"format":"date-time","type":"string"},"disabled":{"type":"boolean"},"email":{"format":"email","type":"string"},"id":{"format":"int64","type":"integer"},"locale":{"$ref":"#/components/schemas/Locale"},"name":{"type":"string"},"role":{"$ref":"#/components/schemas/Role"}},"required":["id","email","name","role","locale","disabled","created_at"],"type":"object"},"VerifyRequest":{"properties":{"comment":{"type":"string"},"rev":{"type":"integer"}},"required":["rev"],"type":"object"},"WebPage":{"properties":{"description":{"description":"Описание страницы (meta description)","type":"string"},"images":{"items":{"properties":{"alt":{"type":"string"},"url":{"type":"string"}},"required":["url"],"type":"object"},"type":"array"},"links":{"description":"Ссылки на страницы того же сайта","items":{"properties":{"text":{"type":"string"},"url":{"type":"string"}},"required":["url"],"type":"object"},"type":"array"},"text":{"description":"Текст страницы: заголовки с «#», пункты списков с «- »","type":"string"},"title":{"type":"string"},"truncated":{"description":"Текст обрезан по 40 000 знаков","type":"boolean"},"url":{"description":"Адрес после переадресаций","type":"string"}},"required":["url","title","text","images","links"],"type":"object"}},"securitySchemes":{"bearer":{"description":"Ключ API `cs_…` (ADR 0017)","scheme":"bearer","type":"http"},"session":{"in":"cookie","name":"club_session","type":"apiKey"}}},"info":{"description":"API сайта спортивного клуба: админка и модели (Claude Code или аналог).\n\n- Вход — cookie сессии `club_session` после `POST /api/v1/auth/login`,\n  либо ключ API: `Authorization: Bearer cs_…` (ADR 0017) — для моделей;\n  по ключу CSRF не нужен, изменения требуют `comment`, публикация,\n  удаление и проверка переводов — только человеком (`403 needs_human`);\n  ключ с областью `publish` публикует (ADR 0031), ключ удаляет\n  неопубликованные черновики моделей своего человека (ADR 0032).\n- Изменяющие запросы с cookie несут заголовок `X-CSRF-Token` — токен из\n  ответа входа или `GET /api/v1/auth/me`.\n- Ошибки — `{\"error\": {\"code\": \"...\", \"message\": \"...\"}}`; у\n  `validation` — `fields` (путь → код) и, где код сам не объясняет,\n  `details` (путь → пояснение).\n- Время — RFC 3339, UTC. Необязательное время, которого нет (например\n  `anonymized_at`, `sent_at`), в ответе отсутствует.\n- Сущности (залы, расписание, материалы…) — одинаковый набор ручек на\n  каждый вид: список, создать, прочитать, изменить (`rev` — ревизия, на\n  которой основана правка; устарела — `409 conflict`), удалить (мягко),\n  восстановить, ревизии, откат, публикация (у видов с черновиком),\n  переводы. `?dry_run=1` у изменяющих ручек возвращает результат без\n  записи.\n- Руководство для ИИ-агентов — `/api/agent.md`.\n- Этот файл собран `go run ./cmd/apigen` из `docs/api/base.yaml` и\n  описаний видов `internal/content` (ADR 0011) — правьте их.\n","title":"club-site API","version":"0.1.0"},"openapi":"3.1.0","paths":{"/.well-known/oauth-authorization-server":{"get":{"operationId":"oauthAuthorizationServer","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"authorization_endpoint":{"type":"string"},"code_challenge_methods_supported":{"items":{"type":"string"},"type":"array"},"grant_types_supported":{"items":{"type":"string"},"type":"array"},"issuer":{"type":"string"},"registration_endpoint":{"type":"string"},"response_types_supported":{"items":{"type":"string"},"type":"array"},"scopes_supported":{"items":{"$ref":"#/components/schemas/Scope"},"type":"array"},"token_endpoint":{"type":"string"},"token_endpoint_auth_methods_supported":{"items":{"type":"string"},"type":"array"}},"required":["issuer","authorization_endpoint","token_endpoint","registration_endpoint","response_types_supported","grant_types_supported","code_challenge_methods_supported","token_endpoint_auth_methods_supported","scopes_supported"],"type":"object"}}},"description":"Описание"}},"security":[],"summary":"Описание сервера авторизации (RFC 8414)","tags":["oauth"]}},"/.well-known/oauth-protected-resource":{"get":{"description":"Тот же документ отдаётся по `/.well-known/oauth-protected-resource/mcp`.","operationId":"oauthProtectedResource","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"authorization_servers":{"items":{"type":"string"},"type":"array"},"bearer_methods_supported":{"items":{"type":"string"},"type":"array"},"resource":{"description":"`\u003cсайт\u003e/mcp`","type":"string"},"resource_name":{"type":"string"},"scopes_supported":{"items":{"$ref":"#/components/schemas/Scope"},"type":"array"}},"required":["resource","authorization_servers","scopes_supported","bearer_methods_supported"],"type":"object"}}},"description":"Описание"}},"security":[],"summary":"Описание защищённого ресурса (RFC 9728) — MCP-сервер и его сервер авторизации","tags":["oauth"]}},"/api/agent.md":{"get":{"description":"Как получить ключ, как устроен сайт, что можно менять и чего нельзя, порядок работы, переводы, раскладка, шаблоны блоков, примеры.","operationId":"getAgentGuide","responses":{"200":{"content":{"text/markdown":{"schema":{"type":"string"}}},"description":"Markdown"}},"security":[],"summary":"Руководство для ИИ-агента (AGENTS.md)","tags":["system"]}},"/api/max/updates":{"post":{"description":"Webhook подписки бота (ADR 0046). Подлинность — заголовок `X-Max-Bot-Api-Secret` с секретом сайта; без него или с чужим — 401. Сайт запоминает только номер, вид и название чата; тексты сообщений не читаются. Ответ 200 — и на события, которые сайту не нужны.","operationId":"maxUpdate","parameters":[{"in":"header","name":"X-Max-Bot-Api-Secret","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"description":"Объект Update MAX","type":"object"}}},"required":true},"responses":{"200":{"description":"Принято"},"400":{"description":"Неразборчивое"},"401":{"description":"Не тот секрет"}},"security":[],"summary":"Событие MAX (для MAX)","tags":["settings"]}},"/api/openapi.json":{"get":{"operationId":"getOpenAPI","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Документ OpenAPI"}},"security":[],"summary":"Этот документ в JSON","tags":["system"]}},"/api/pay/tbank/notify":{"post":{"description":"Подпись — `Token` в теле. Ответ — `OK` на подлинное, 400 на поддельное, 500 при нашем сбое (банк повторит).","operationId":"tbankNotification","requestBody":{"content":{"application/json":{"schema":{"type":"object"}}},"required":true},"responses":{"200":{"content":{"text/plain":{"schema":{"enum":["OK"],"type":"string"}}},"description":"OK"},"400":{"description":"Неподлинное или неразборчивое"},"500":{"description":"Сбой, банк повторит"}},"security":[],"summary":"Уведомление Т-Банка о платеже (для банка)","tags":["orders"]}},"/api/trial":{"post":{"description":"Публично, без входа. Создаёт черновик, клубу ничего не уходит. Отдайте\nчеловеку `confirm_url` (или `code` для страницы `/trial/confirm/`):\nон проверит данные, даст согласие на обработку персональных данных и\nподтвердит — тогда заявка дойдёт до клуба. Согласие за человека не\nпередаётся (`consent` → 400). Черновик живёт 24 часа. Не больше 5\nчерновиков в час с одного адреса.\n","operationId":"createTrialDraft","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrialDraftInput"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrialDraft"}}},"description":"Черновик создан"},"400":{"$ref":"#/components/responses/BadRequest"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Слишком много черновиков с этого адреса"}},"security":[],"summary":"Черновик заявки на пробную из диалога с ИИ (ADR 0020)","tags":["public"]}},"/api/v1/albums":{"get":{"operationId":"listAlbums","parameters":[{"$ref":"#/components/parameters/IncludeDeleted"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Album"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Альбомы: список","tags":["content"]},"post":{"operationId":"createAlbum","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/AlbumData"}},"required":["data"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Album"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Альбом: создать","tags":["content"]}},"/api/v1/albums/{id}":{"delete":{"operationId":"deleteAlbum","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Comment"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Альбом: удалить (можно восстановить)","tags":["content"]},"get":{"operationId":"getAlbum","parameters":[{"$ref":"#/components/parameters/EntityID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Album"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Альбом: прочитать","tags":["content"]},"patch":{"operationId":"updateAlbum","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/AlbumFields"},"rev":{"description":"Ревизия, на которой основана правка","type":"integer"}},"required":["rev","data"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Album"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Альбом: изменить","tags":["content"]}},"/api/v1/albums/{id}/restore":{"post":{"operationId":"restoreAlbum","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Album"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Альбом: восстановить","tags":["content"]}},"/api/v1/albums/{id}/revert":{"post":{"operationId":"revertAlbum","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevertRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Album"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Альбом: вернуть к ревизии (новой ревизией)","tags":["content"]}},"/api/v1/albums/{id}/revisions":{"get":{"operationId":"listAlbumRevisions","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/RevisionLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionList"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Альбом: ревизии, новые первыми","tags":["content"]}},"/api/v1/albums/{id}/translations/{lang}":{"get":{"operationId":"getAlbumTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Альбом: перевод","tags":["translations"]},"put":{"operationId":"saveAlbumTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SaveTranslationRequest"}],"properties":{"data":{"$ref":"#/components/schemas/AlbumTranslationData"}}}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Альбом: записать перевод","tags":["translations"]}},"/api/v1/albums/{id}/translations/{lang}/verify":{"post":{"operationId":"verifyAlbumTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Альбом: отметить перевод проверенным","tags":["translations"]}},"/api/v1/api-keys":{"get":{"operationId":"listAPIKeys","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/APIKey"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"Ключи без значений"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Ключи API (администратор, контент-менеджер)","tags":["auth"]},"post":{"description":"Администратор — любой роли; контент-менеджер — своей роли и ниже.","operationId":"createAPIKey","parameters":[{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"expires_in":{"description":"Срок ключа в секундах (ADR 0029); без поля ключ бессрочный","maximum":31536000,"minimum":300,"type":"integer"},"name":{"type":"string"},"role":{"$ref":"#/components/schemas/Role"},"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"type":"array"}},"required":["name","role","scopes"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/APIKey"},{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"}]}}},"description":"Ключ; `token` — только в этом ответе"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Выпустить ключ (значение показывается один раз)","tags":["auth"]}},"/api/v1/api-keys/{id}":{"delete":{"operationId":"revokeAPIKey","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"Отозван"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Отозвать ключ (действует сразу)","tags":["auth"]}},"/api/v1/assistant/chats":{"get":{"operationId":"listAssistantChats","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AssistantChatSummary"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"Список, новые сверху"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Разговоры — свои; администратору все","tags":["assistant"]},"post":{"description":"Роль — не выше своей; области — без `publish`, `requests:read` и\n`orders:read` (публикует человек, персональные данные модели не\nуходят); срок — 1 час, 3 часа или 1 день. Модель — одна из\nмоделей поставщика с ключом (ADR 0038); не задана — модель по\nумолчанию первого такого поставщика. Без ключа —\n`409 assistant_not_configured`.\n","operationId":"createAssistantChat","parameters":[{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"expires_in":{"enum":[3600,10800,86400],"type":"integer"},"model":{"description":"Модель разговора","type":"string"},"role":{"$ref":"#/components/schemas/Role"},"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"type":"array"}},"required":["role","scopes","expires_in"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantChat"}}},"description":"Разговор"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Начать разговор — выпускает ключ API помощника","tags":["assistant"]}},"/api/v1/assistant/chats/{id}":{"delete":{"operationId":"deleteAssistantChat","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"Удалён"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Удалить разговор и отозвать его ключ","tags":["assistant"]},"get":{"operationId":"getAssistantChat","parameters":[{"$ref":"#/components/parameters/EntityID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantChat"}}},"description":"Разговор"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Разговор целиком — сообщения, предложения публикации, расход","tags":["assistant"]}},"/api/v1/assistant/chats/{id}/messages":{"post":{"description":"Сервер ведёт разговор (ADR 0034): передаёт модели историю и\nинструменты, выполняет вызовы, пока модель не ответит текстом. Не\nбольше 30 шагов, 2 минут на ответ модели и 10 минут на всё. Ответ —\n`text/event-stream`, событие `event: \u003cтип\u003e` и `data: \u003cJSON\u003e`:\n\n- `message` — новое сообщение разговора (`AssistantMessage`):\n  текст модели, вызов инструмента, его результат;\n- `proposal` — предложение опубликовать (`AssistantProposal`);\n- `usage` — расход разговора (`AssistantUsage`);\n- `error` — `{\"code\", \"message\"}`: ключ модели неверен, модель не\n  ответила, срок ключа помощника вышел;\n- `done` — `{}`, конец.\n\nПока идёт одно сообщение, другое — `409 busy`.\n\nК сообщению можно приложить одно фото (ADR 0036): его загружает\nчеловек (`POST /api/v1/uploads`), а сообщение несёт номер медиа в\n`media`. Тогда `text` может быть пустым. Модель видит номер,\nразмеры и подпись фото, но не само изображение.\n","operationId":"sendAssistantMessage","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"media":{"description":"Номер медиа — фото, приложенное к сообщению","type":"integer"},"text":{"description":"Обязателен, если нет фото","maxLength":20000,"type":"string"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"text/event-stream":{"schema":{"type":"string"}}},"description":"Поток событий"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Сообщение помощнику — ответ потоком событий","tags":["assistant"]}},"/api/v1/assistant/chats/{id}/proposals/{proposal}/dismiss":{"post":{"operationId":"dismissAssistantProposal","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/ProposalID"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantProposal"}}},"description":"Предложение"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Отклонить предложение публикации","tags":["assistant"]}},"/api/v1/assistant/chats/{id}/proposals/{proposal}/publish":{"post":{"description":"Публикует человек со своими правами и комментарием модели; модель узнаёт об этом в разговоре.","operationId":"publishAssistantProposal","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/ProposalID"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantProposal"}}},"description":"Предложение"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Опубликовать то, что предложила модель, — от имени человека","tags":["assistant"]}},"/api/v1/assistant/settings":{"get":{"operationId":"getAssistantSettings","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantSettings"}}},"description":"Настройки"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Настройки помощника (тем, кто выпускает ключи)","tags":["assistant"]}},"/api/v1/assistant/settings/{provider}":{"put":{"description":"Ключ поставщика хранится как секрет и в ответах не показывается\n(ADR 0034, 0038). У DeepSeek первый ввод ключа требует\n`accept_transfer: true` — отметки, что тексты сайта уходят в\nDeepSeek (Китай); иначе `400 validation` с полем `accept_transfer`.\nОтметка хранится: кто и когда. У GigaChat ключ — «ключ\nавторизации» из личного кабинета, `scope` — кто клиент.\n","operationId":"setAssistantProvider","parameters":[{"$ref":"#/components/parameters/AssistantProvider"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"accept_transfer":{"description":"Согласие на передачу за границу (DeepSeek)","type":"boolean"},"api_key":{"description":"Новый ключ; не задан — прежний","type":"string"},"model":{"description":"Одна из `models` поставщика","type":"string"},"rank_tools":{"description":"Отбор инструментов на шаге (GigaChat) — дешевле, но модель может не увидеть нужный","type":"boolean"},"scope":{"description":"Кто клиент GigaChat — физлицо, юрлицо с предоплатой, юрлицо с постоплатой","enum":["GIGACHAT_API_PERS","GIGACHAT_API_B2B","GIGACHAT_API_CORP"],"type":"string"},"thinking":{"description":"Режим рассуждения модели (DeepSeek)","type":"boolean"}},"required":["model"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantSettings"}}},"description":"Настройки"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Задать модель и ключ поставщика (администратор, только человек)","tags":["assistant"]}},"/api/v1/assistant/settings/{provider}/key":{"delete":{"operationId":"deleteAssistantKey","parameters":[{"$ref":"#/components/parameters/AssistantProvider"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"Стёрт"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Стереть ключ поставщика (администратор)","tags":["assistant"]}},"/api/v1/auth/login":{"post":{"operationId":"login","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Session"}}},"description":"Вошли, cookie сессии выставлен","headers":{"Set-Cookie":{"schema":{"type":"string"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Неверный e-mail или пароль, или пользователь отключён"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"security":[],"summary":"Вход по e-mail и паролю","tags":["auth"]}},"/api/v1/auth/logout":{"post":{"operationId":"logout","parameters":[{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"Вышли"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Выход, сессия гасится","tags":["auth"]}},"/api/v1/auth/me":{"get":{"operationId":"getMe","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Session"}}},"description":"Текущая сессия"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Текущий пользователь и CSRF-токен сессии","tags":["auth"]}},"/api/v1/auth/password":{"post":{"description":"Остальные сессии пользователя гасятся, текущая остаётся.","operationId":"changeOwnPassword","parameters":[{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordRequest"}}},"required":true},"responses":{"204":{"description":"Пароль сменён"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Сменить свой пароль","tags":["auth"]}},"/api/v1/auth/password-reset":{"post":{"description":"Отвечает 204 всегда — и для неизвестного адреса: ответ не выдаёт,\nесть ли такой пользователь. Ссылка действует час, один раз.\n","operationId":"requestPasswordReset","requestBody":{"content":{"application/json":{"schema":{"properties":{"email":{"type":"string"}},"required":["email"],"type":"object"}}},"required":true},"responses":{"204":{"description":"Если адрес известен — письмо отправлено"},"400":{"$ref":"#/components/responses/BadRequest"},"429":{"$ref":"#/components/responses/TooManyRequests"}},"security":[],"summary":"Прислать ссылку для смены пароля","tags":["auth"]}},"/api/v1/auth/password-reset/confirm":{"post":{"description":"Все сессии пользователя гасятся.","operationId":"confirmPasswordReset","requestBody":{"content":{"application/json":{"schema":{"properties":{"password":{"minLength":10,"type":"string"},"token":{"type":"string"}},"required":["token","password"],"type":"object"}}},"required":true},"responses":{"204":{"description":"Пароль задан"},"400":{"$ref":"#/components/responses/BadRequest"}},"security":[],"summary":"Задать новый пароль по ссылке из письма","tags":["auth"]}},"/api/v1/block-templates":{"get":{"operationId":"listBlockTemplates","parameters":[{"$ref":"#/components/parameters/IncludeDeleted"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BlockTemplate"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Шаблоны блоков: список","tags":["content"]},"post":{"operationId":"createBlockTemplate","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/BlockTemplateData"}},"required":["data"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlockTemplate"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Шаблон блока: создать","tags":["content"]}},"/api/v1/block-templates/check":{"post":{"description":"Те же проверки, что при сохранении (ADR 0018, 0032): тип и\nпараметры (`400 validation` с `details`, как при записи), разбор,\nзапреты, отрисовка на всех страницах с этим блоком на всех языках и\nна эталонных данных. Ответ — ошибки, где стоит блок и разница HTML\nпо страницам.\n","operationId":"checkBlockTemplate","parameters":[{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"params":{"description":"Схема параметров нового типа; у встроенного типа не задаётся","items":{"type":"object"},"type":"array"},"template":{"type":"string"},"type":{"type":"string"}},"required":["type","template"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemplateCheck"}}},"description":"Итог проверки; `problems` пусто — шаблон годен"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Проверить шаблон блока, ничего не записывая","tags":["layout"]}},"/api/v1/block-templates/{id}":{"delete":{"operationId":"deleteBlockTemplate","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Comment"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Шаблон блока: удалить (можно восстановить; ключ — только черновик моделей, ни разу не опубликованный, ADR 0032)","tags":["content"]},"get":{"operationId":"getBlockTemplate","parameters":[{"$ref":"#/components/parameters/EntityID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlockTemplate"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Шаблон блока: прочитать","tags":["content"]},"patch":{"operationId":"updateBlockTemplate","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/BlockTemplateFields"},"rev":{"description":"Ревизия, на которой основана правка","type":"integer"}},"required":["rev","data"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlockTemplate"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Шаблон блока: изменить","tags":["content"]}},"/api/v1/block-templates/{id}/publish":{"post":{"operationId":"publishBlockTemplate","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlockTemplate"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Шаблон блока: опубликовать последнюю ревизию (сухой прогон — запись как сейчас и after_publish)","tags":["content"]}},"/api/v1/block-templates/{id}/restore":{"post":{"operationId":"restoreBlockTemplate","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlockTemplate"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Шаблон блока: восстановить","tags":["content"]}},"/api/v1/block-templates/{id}/revert":{"post":{"operationId":"revertBlockTemplate","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevertRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlockTemplate"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Шаблон блока: вернуть к ревизии (новой ревизией)","tags":["content"]}},"/api/v1/block-templates/{id}/revisions":{"get":{"operationId":"listBlockTemplateRevisions","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/RevisionLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionList"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Шаблон блока: ревизии, новые первыми","tags":["content"]}},"/api/v1/block-templates/{id}/unpublish":{"post":{"operationId":"unpublishBlockTemplate","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlockTemplate"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Шаблон блока: снять с публикации","tags":["content"]}},"/api/v1/blocks":{"get":{"operationId":"listBlocks","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"defaults":{"additionalProperties":{"items":{"properties":{"blocks":{"items":{"properties":{"type":{"type":"string"},"width":{"type":"integer"}},"required":["type","width"],"type":"object"},"type":"array"}},"required":["blocks"],"type":"object"},"type":"array"},"description":"Встроенная раскладка каждой страницы (`page` → `sections`) — она на сайте, пока у страницы нет своей","type":"object"},"items":{"items":{"$ref":"#/components/schemas/BlockType"},"type":"array"},"value_fields":{"description":"Поля значения, которое получает любой шаблон блока (`.Width`, `.Lang`, `.Club.Name`…), — «Имя тип»","items":{"type":"string"},"type":"array"},"widths":{"items":{"type":"integer"},"type":"array"}},"required":["items","widths","defaults","value_fields"],"type":"object"}}},"description":"Типы блоков"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Типы блоков, их параметры и шаблоны","tags":["layout"]}},"/api/v1/capabilities":{"get":{"description":"Для ключа API — то, что дают его роль и области; для человека в\nадминке — то, что даёт его роль (ADR 0029). Модель начинает с этого\nзапроса и пересказывает ответ человеку.\n","operationId":"getCapabilities","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Capabilities"}}},"description":"Возможности"},"401":{"$ref":"#/components/responses/Unauthorized"}},"security":[{"bearer":[]},{"session":[]}],"summary":"Что мне можно — записи, раскладка, шаблоны и что делает только человек","tags":["auth"]}},"/api/v1/channels/max/chats":{"get":{"description":"Чаты, каналы и диалоги, о которых сообщил MAX; новые сверху. Номер — для настроек «Чаты MAX…» и «Канал MAX клуба».","operationId":"listMaxChats","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MaxChat"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"Список"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Где бот MAX (администратор)","tags":["settings"]}},"/api/v1/channels/max/connect":{"post":{"description":"`POST /subscriptions` в MAX с адресом `https://\u003cосновной домен\u003e/api/max/updates` и секретом сайта (ADR 0046). После этого сайт узнаёт чаты и каналы, где бот: из событий о добавлении бота, о начале диалога и о сообщениях.","operationId":"connectMax","parameters":[{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"Подписан"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Нет основного домена сайта (`no_domain`) или токена бота (`channel_not_configured`)"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"MAX ответил ошибкой; текст — в error.message"}},"summary":"Подписать бота MAX на события сайта (администратор)","tags":["settings"]}},"/api/v1/channels/{channel}/test":{"post":{"description":"Шлёт проверочное письмо или сообщение сразу, мимо очереди.","operationId":"testChannel","parameters":[{"in":"path","name":"channel","required":true,"schema":{"enum":["email","telegram","max"],"type":"string"}},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"target":{"description":"Адрес, чат Telegram или номер чата MAX","type":"string"}},"required":["target"],"type":"object"}}},"required":true},"responses":{"204":{"description":"Отправлено"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Канал ответил ошибкой; текст — в error.message"}},"summary":"Проверить канал отправкой (администратор)","tags":["settings"]}},"/api/v1/cities":{"get":{"operationId":"listCities","parameters":[{"$ref":"#/components/parameters/IncludeDeleted"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/City"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Города: список","tags":["content"]},"post":{"operationId":"createCity","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/CityData"}},"required":["data"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/City"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Город: создать","tags":["content"]}},"/api/v1/cities/{id}":{"delete":{"operationId":"deleteCity","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Comment"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Город: удалить (можно восстановить)","tags":["content"]},"get":{"operationId":"getCity","parameters":[{"$ref":"#/components/parameters/EntityID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/City"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Город: прочитать","tags":["content"]},"patch":{"operationId":"updateCity","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/CityFields"},"rev":{"description":"Ревизия, на которой основана правка","type":"integer"}},"required":["rev","data"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/City"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Город: изменить","tags":["content"]}},"/api/v1/cities/{id}/restore":{"post":{"operationId":"restoreCity","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/City"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Город: восстановить","tags":["content"]}},"/api/v1/cities/{id}/revert":{"post":{"operationId":"revertCity","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevertRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/City"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Город: вернуть к ревизии (новой ревизией)","tags":["content"]}},"/api/v1/cities/{id}/revisions":{"get":{"operationId":"listCityRevisions","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/RevisionLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionList"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Город: ревизии, новые первыми","tags":["content"]}},"/api/v1/cities/{id}/translations/{lang}":{"get":{"operationId":"getCityTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Город: перевод","tags":["translations"]},"put":{"operationId":"saveCityTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SaveTranslationRequest"}],"properties":{"data":{"$ref":"#/components/schemas/CityTranslationData"}}}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Город: записать перевод","tags":["translations"]}},"/api/v1/cities/{id}/translations/{lang}/verify":{"post":{"operationId":"verifyCityTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Город: отметить перевод проверенным","tags":["translations"]}},"/api/v1/club":{"get":{"operationId":"getClub","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Club"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Клуб: прочитать","tags":["content"]},"patch":{"operationId":"updateClub","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/ClubFields"},"rev":{"description":"Ревизия, на которой основана правка","type":"integer"}},"required":["rev","data"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Club"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Клуб: изменить","tags":["content"]}},"/api/v1/club/revert":{"post":{"operationId":"revertClub","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevertRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Club"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Клуб: вернуть к ревизии (новой ревизией)","tags":["content"]}},"/api/v1/club/revisions":{"get":{"operationId":"listClubRevisions","parameters":[{"$ref":"#/components/parameters/RevisionLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionList"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Клуб: ревизии, новые первыми","tags":["content"]}},"/api/v1/club/translations/{lang}":{"get":{"operationId":"getClubTranslation","parameters":[{"$ref":"#/components/parameters/Lang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Клуб: перевод","tags":["translations"]},"put":{"operationId":"saveClubTranslation","parameters":[{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SaveTranslationRequest"}],"properties":{"data":{"$ref":"#/components/schemas/ClubTranslationData"}}}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Клуб: записать перевод","tags":["translations"]}},"/api/v1/club/translations/{lang}/verify":{"post":{"operationId":"verifyClubTranslation","parameters":[{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Клуб: отметить перевод проверенным","tags":["translations"]}},"/api/v1/contacts":{"get":{"operationId":"listContacts","parameters":[{"$ref":"#/components/parameters/IncludeDeleted"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Contact"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Контакты клуба: список","tags":["content"]},"post":{"operationId":"createContact","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/ContactData"}},"required":["data"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contact"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Контакт: создать","tags":["content"]}},"/api/v1/contacts/{id}":{"delete":{"operationId":"deleteContact","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Comment"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Контакт: удалить (можно восстановить)","tags":["content"]},"get":{"operationId":"getContact","parameters":[{"$ref":"#/components/parameters/EntityID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contact"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Контакт: прочитать","tags":["content"]},"patch":{"operationId":"updateContact","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/ContactFields"},"rev":{"description":"Ревизия, на которой основана правка","type":"integer"}},"required":["rev","data"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contact"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Контакт: изменить","tags":["content"]}},"/api/v1/contacts/{id}/restore":{"post":{"operationId":"restoreContact","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contact"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Контакт: восстановить","tags":["content"]}},"/api/v1/contacts/{id}/revert":{"post":{"operationId":"revertContact","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevertRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contact"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Контакт: вернуть к ревизии (новой ревизией)","tags":["content"]}},"/api/v1/contacts/{id}/revisions":{"get":{"operationId":"listContactRevisions","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/RevisionLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionList"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Контакт: ревизии, новые первыми","tags":["content"]}},"/api/v1/contacts/{id}/translations/{lang}":{"get":{"operationId":"getContactTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Контакт: перевод","tags":["translations"]},"put":{"operationId":"saveContactTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SaveTranslationRequest"}],"properties":{"data":{"$ref":"#/components/schemas/ContactTranslationData"}}}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Контакт: записать перевод","tags":["translations"]}},"/api/v1/contacts/{id}/translations/{lang}/verify":{"post":{"operationId":"verifyContactTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Контакт: отметить перевод проверенным","tags":["translations"]}},"/api/v1/demo":{"get":{"description":"Вход под ней открывает песочницу посетителя — свою копию демо; общий сайт демо не меняется. В режиме демо выключены загрузка файлов, обновления, лицензия, ключ и отправка в сеть — `403 demo`.","operationId":"getDemo","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"cta_url":{"description":"Куда ведёт «Хочу такой»","type":"string"},"email":{"type":"string"},"enabled":{"description":"Экземпляр — демо; иначе остальных полей нет","type":"boolean"},"password":{"type":"string"}},"required":["enabled"],"type":"object"}}},"description":"Демо"}},"security":[],"summary":"Режим демо и его учётная запись (ADR 0026)","tags":["system"]}},"/api/v1/disciplines":{"get":{"operationId":"listDisciplines","parameters":[{"$ref":"#/components/parameters/IncludeDeleted"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Discipline"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Дисциплины и направления: список","tags":["content"]},"post":{"operationId":"createDiscipline","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/DisciplineData"}},"required":["data"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Discipline"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Дисциплина: создать","tags":["content"]}},"/api/v1/disciplines/{id}":{"delete":{"operationId":"deleteDiscipline","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Comment"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Дисциплина: удалить (можно восстановить)","tags":["content"]},"get":{"operationId":"getDiscipline","parameters":[{"$ref":"#/components/parameters/EntityID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Discipline"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Дисциплина: прочитать","tags":["content"]},"patch":{"operationId":"updateDiscipline","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/DisciplineFields"},"rev":{"description":"Ревизия, на которой основана правка","type":"integer"}},"required":["rev","data"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Discipline"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Дисциплина: изменить","tags":["content"]}},"/api/v1/disciplines/{id}/restore":{"post":{"operationId":"restoreDiscipline","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Discipline"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Дисциплина: восстановить","tags":["content"]}},"/api/v1/disciplines/{id}/revert":{"post":{"operationId":"revertDiscipline","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevertRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Discipline"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Дисциплина: вернуть к ревизии (новой ревизией)","tags":["content"]}},"/api/v1/disciplines/{id}/revisions":{"get":{"operationId":"listDisciplineRevisions","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/RevisionLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionList"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Дисциплина: ревизии, новые первыми","tags":["content"]}},"/api/v1/disciplines/{id}/translations/{lang}":{"get":{"operationId":"getDisciplineTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Дисциплина: перевод","tags":["translations"]},"put":{"operationId":"saveDisciplineTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SaveTranslationRequest"}],"properties":{"data":{"$ref":"#/components/schemas/DisciplineTranslationData"}}}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Дисциплина: записать перевод","tags":["translations"]}},"/api/v1/disciplines/{id}/translations/{lang}/verify":{"post":{"operationId":"verifyDisciplineTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Дисциплина: отметить перевод проверенным","tags":["translations"]}},"/api/v1/districts":{"get":{"operationId":"listDistricts","parameters":[{"$ref":"#/components/parameters/IncludeDeleted"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/District"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Районы: список","tags":["content"]},"post":{"operationId":"createDistrict","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/DistrictData"}},"required":["data"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/District"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Район: создать","tags":["content"]}},"/api/v1/districts/{id}":{"delete":{"operationId":"deleteDistrict","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Comment"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Район: удалить (можно восстановить)","tags":["content"]},"get":{"operationId":"getDistrict","parameters":[{"$ref":"#/components/parameters/EntityID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/District"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Район: прочитать","tags":["content"]},"patch":{"operationId":"updateDistrict","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/DistrictFields"},"rev":{"description":"Ревизия, на которой основана правка","type":"integer"}},"required":["rev","data"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/District"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Район: изменить","tags":["content"]}},"/api/v1/districts/{id}/restore":{"post":{"operationId":"restoreDistrict","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/District"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Район: восстановить","tags":["content"]}},"/api/v1/districts/{id}/revert":{"post":{"operationId":"revertDistrict","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevertRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/District"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Район: вернуть к ревизии (новой ревизией)","tags":["content"]}},"/api/v1/districts/{id}/revisions":{"get":{"operationId":"listDistrictRevisions","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/RevisionLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionList"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Район: ревизии, новые первыми","tags":["content"]}},"/api/v1/districts/{id}/translations/{lang}":{"get":{"operationId":"getDistrictTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Район: перевод","tags":["translations"]},"put":{"operationId":"saveDistrictTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SaveTranslationRequest"}],"properties":{"data":{"$ref":"#/components/schemas/DistrictTranslationData"}}}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Район: записать перевод","tags":["translations"]}},"/api/v1/districts/{id}/translations/{lang}/verify":{"post":{"operationId":"verifyDistrictTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Район: отметить перевод проверенным","tags":["translations"]}},"/api/v1/document-files":{"get":{"operationId":"listDocumentFiles","parameters":[{"$ref":"#/components/parameters/IncludeDeleted"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/DocumentFile"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Файлы документов: список","tags":["content"]},"post":{"operationId":"createDocumentFile","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/DocumentFileData"}},"required":["data"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentFile"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Файл документа: создать","tags":["content"]}},"/api/v1/document-files/{id}":{"delete":{"operationId":"deleteDocumentFile","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Comment"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Файл документа: удалить (можно восстановить)","tags":["content"]},"get":{"operationId":"getDocumentFile","parameters":[{"$ref":"#/components/parameters/EntityID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentFile"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Файл документа: прочитать","tags":["content"]},"patch":{"operationId":"updateDocumentFile","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/DocumentFileFields"},"rev":{"description":"Ревизия, на которой основана правка","type":"integer"}},"required":["rev","data"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentFile"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Файл документа: изменить","tags":["content"]}},"/api/v1/document-files/{id}/restore":{"post":{"operationId":"restoreDocumentFile","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentFile"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Файл документа: восстановить","tags":["content"]}},"/api/v1/document-files/{id}/revert":{"post":{"operationId":"revertDocumentFile","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevertRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentFile"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Файл документа: вернуть к ревизии (новой ревизией)","tags":["content"]}},"/api/v1/document-files/{id}/revisions":{"get":{"operationId":"listDocumentFileRevisions","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/RevisionLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionList"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Файл документа: ревизии, новые первыми","tags":["content"]}},"/api/v1/document-files/{id}/translations/{lang}":{"get":{"operationId":"getDocumentFileTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Файл документа: перевод","tags":["translations"]},"put":{"operationId":"saveDocumentFileTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SaveTranslationRequest"}],"properties":{"data":{"$ref":"#/components/schemas/DocumentFileTranslationData"}}}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Файл документа: записать перевод","tags":["translations"]}},"/api/v1/document-files/{id}/translations/{lang}/verify":{"post":{"operationId":"verifyDocumentFileTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Файл документа: отметить перевод проверенным","tags":["translations"]}},"/api/v1/document-files/{id}/versions":{"get":{"operationId":"listFileVersions","parameters":[{"$ref":"#/components/parameters/EntityID"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/FileVersion"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"Версии, новые первыми"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Версии файла документа","tags":["files"]},"post":{"description":"Старые версии остаются и доступны по номеру (ADR 0010).","operationId":"addFileVersion","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"comment":{"type":"string"},"file":{"format":"binary","type":"string"}},"required":["file"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileVersion"}}},"description":"Версия добавлена"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"413":{"$ref":"#/components/responses/TooLarge"},"415":{"$ref":"#/components/responses/Unsupported"}},"summary":"Загрузить новую версию файла документа","tags":["files"]}},"/api/v1/event-types":{"get":{"operationId":"listEventTypes","parameters":[{"$ref":"#/components/parameters/IncludeDeleted"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/EventType"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Типы мероприятий: список","tags":["content"]},"post":{"operationId":"createEventType","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/EventTypeData"}},"required":["data"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventType"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Тип мероприятия: создать","tags":["content"]}},"/api/v1/event-types/{id}":{"delete":{"operationId":"deleteEventType","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Comment"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Тип мероприятия: удалить (можно восстановить)","tags":["content"]},"get":{"operationId":"getEventType","parameters":[{"$ref":"#/components/parameters/EntityID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventType"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Тип мероприятия: прочитать","tags":["content"]},"patch":{"operationId":"updateEventType","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/EventTypeFields"},"rev":{"description":"Ревизия, на которой основана правка","type":"integer"}},"required":["rev","data"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventType"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Тип мероприятия: изменить","tags":["content"]}},"/api/v1/event-types/{id}/restore":{"post":{"operationId":"restoreEventType","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventType"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Тип мероприятия: восстановить","tags":["content"]}},"/api/v1/event-types/{id}/revert":{"post":{"operationId":"revertEventType","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevertRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventType"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Тип мероприятия: вернуть к ревизии (новой ревизией)","tags":["content"]}},"/api/v1/event-types/{id}/revisions":{"get":{"operationId":"listEventTypeRevisions","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/RevisionLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionList"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Тип мероприятия: ревизии, новые первыми","tags":["content"]}},"/api/v1/event-types/{id}/translations/{lang}":{"get":{"operationId":"getEventTypeTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Тип мероприятия: перевод","tags":["translations"]},"put":{"operationId":"saveEventTypeTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SaveTranslationRequest"}],"properties":{"data":{"$ref":"#/components/schemas/EventTypeTranslationData"}}}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Тип мероприятия: записать перевод","tags":["translations"]}},"/api/v1/event-types/{id}/translations/{lang}/verify":{"post":{"operationId":"verifyEventTypeTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Тип мероприятия: отметить перевод проверенным","tags":["translations"]}},"/api/v1/events":{"get":{"operationId":"listEvents","parameters":[{"$ref":"#/components/parameters/IncludeDeleted"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Event"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Мероприятия: список","tags":["content"]},"post":{"operationId":"createEvent","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/EventData"}},"required":["data"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Мероприятие: создать","tags":["content"]}},"/api/v1/events/{id}":{"delete":{"operationId":"deleteEvent","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Comment"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Мероприятие: удалить (можно восстановить)","tags":["content"]},"get":{"operationId":"getEvent","parameters":[{"$ref":"#/components/parameters/EntityID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Мероприятие: прочитать","tags":["content"]},"patch":{"operationId":"updateEvent","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/EventFields"},"rev":{"description":"Ревизия, на которой основана правка","type":"integer"}},"required":["rev","data"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Мероприятие: изменить","tags":["content"]}},"/api/v1/events/{id}/restore":{"post":{"operationId":"restoreEvent","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Мероприятие: восстановить","tags":["content"]}},"/api/v1/events/{id}/revert":{"post":{"operationId":"revertEvent","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevertRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Мероприятие: вернуть к ревизии (новой ревизией)","tags":["content"]}},"/api/v1/events/{id}/revisions":{"get":{"operationId":"listEventRevisions","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/RevisionLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionList"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Мероприятие: ревизии, новые первыми","tags":["content"]}},"/api/v1/events/{id}/translations/{lang}":{"get":{"operationId":"getEventTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Мероприятие: перевод","tags":["translations"]},"put":{"operationId":"saveEventTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SaveTranslationRequest"}],"properties":{"data":{"$ref":"#/components/schemas/EventTranslationData"}}}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Мероприятие: записать перевод","tags":["translations"]}},"/api/v1/events/{id}/translations/{lang}/verify":{"post":{"operationId":"verifyEventTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Мероприятие: отметить перевод проверенным","tags":["translations"]}},"/api/v1/groups":{"get":{"operationId":"listGroups","parameters":[{"$ref":"#/components/parameters/IncludeDeleted"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Group"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Группы: список","tags":["content"]},"post":{"operationId":"createGroup","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/GroupData"}},"required":["data"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Group"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Группа: создать","tags":["content"]}},"/api/v1/groups/{id}":{"delete":{"operationId":"deleteGroup","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Comment"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Группа: удалить (можно восстановить)","tags":["content"]},"get":{"operationId":"getGroup","parameters":[{"$ref":"#/components/parameters/EntityID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Group"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Группа: прочитать","tags":["content"]},"patch":{"operationId":"updateGroup","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/GroupFields"},"rev":{"description":"Ревизия, на которой основана правка","type":"integer"}},"required":["rev","data"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Group"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Группа: изменить","tags":["content"]}},"/api/v1/groups/{id}/restore":{"post":{"operationId":"restoreGroup","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Group"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Группа: восстановить","tags":["content"]}},"/api/v1/groups/{id}/revert":{"post":{"operationId":"revertGroup","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevertRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Group"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Группа: вернуть к ревизии (новой ревизией)","tags":["content"]}},"/api/v1/groups/{id}/revisions":{"get":{"operationId":"listGroupRevisions","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/RevisionLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionList"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Группа: ревизии, новые первыми","tags":["content"]}},"/api/v1/groups/{id}/translations/{lang}":{"get":{"operationId":"getGroupTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Группа: перевод","tags":["translations"]},"put":{"operationId":"saveGroupTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SaveTranslationRequest"}],"properties":{"data":{"$ref":"#/components/schemas/GroupTranslationData"}}}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Группа: записать перевод","tags":["translations"]}},"/api/v1/groups/{id}/translations/{lang}/verify":{"post":{"operationId":"verifyGroupTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Группа: отметить перевод проверенным","tags":["translations"]}},"/api/v1/halls":{"get":{"operationId":"listHalls","parameters":[{"$ref":"#/components/parameters/IncludeDeleted"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Hall"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Залы: список","tags":["content"]},"post":{"operationId":"createHall","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/HallData"}},"required":["data"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hall"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Зал: создать","tags":["content"]}},"/api/v1/halls/{id}":{"delete":{"operationId":"deleteHall","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Comment"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Зал: удалить (можно восстановить)","tags":["content"]},"get":{"operationId":"getHall","parameters":[{"$ref":"#/components/parameters/EntityID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hall"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Зал: прочитать","tags":["content"]},"patch":{"operationId":"updateHall","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/HallFields"},"rev":{"description":"Ревизия, на которой основана правка","type":"integer"}},"required":["rev","data"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hall"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Зал: изменить","tags":["content"]}},"/api/v1/halls/{id}/restore":{"post":{"operationId":"restoreHall","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hall"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Зал: восстановить","tags":["content"]}},"/api/v1/halls/{id}/revert":{"post":{"operationId":"revertHall","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevertRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hall"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Зал: вернуть к ревизии (новой ревизией)","tags":["content"]}},"/api/v1/halls/{id}/revisions":{"get":{"operationId":"listHallRevisions","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/RevisionLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionList"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Зал: ревизии, новые первыми","tags":["content"]}},"/api/v1/halls/{id}/translations/{lang}":{"get":{"operationId":"getHallTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Зал: перевод","tags":["translations"]},"put":{"operationId":"saveHallTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SaveTranslationRequest"}],"properties":{"data":{"$ref":"#/components/schemas/HallTranslationData"}}}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Зал: записать перевод","tags":["translations"]}},"/api/v1/halls/{id}/translations/{lang}/verify":{"post":{"operationId":"verifyHallTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Зал: отметить перевод проверенным","tags":["translations"]}},"/api/v1/help":{"get":{"description":"Как делать в админке обычные дела: страницы по порядку, с кратким\nописанием. Читает любой вошедший сотрудник и ключ модели.\n","operationId":"listHelp","parameters":[{"$ref":"#/components/parameters/HelpLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/HelpSummary"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"Страницы по порядку"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Страницы помощи для владельца клуба (ADR 0042)","tags":["help"]}},"/api/v1/help/{slug}":{"get":{"operationId":"getHelp","parameters":[{"in":"path","name":"slug","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/HelpLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HelpPage"}}},"description":"Страница"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Страница помощи — Markdown","tags":["help"]}},"/api/v1/instructors":{"get":{"operationId":"listInstructors","parameters":[{"$ref":"#/components/parameters/IncludeDeleted"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Instructor"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Инструкторы: список","tags":["content"]},"post":{"operationId":"createInstructor","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/InstructorData"}},"required":["data"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Instructor"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Инструктор: создать","tags":["content"]}},"/api/v1/instructors/{id}":{"delete":{"operationId":"deleteInstructor","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Comment"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Инструктор: удалить (можно восстановить)","tags":["content"]},"get":{"operationId":"getInstructor","parameters":[{"$ref":"#/components/parameters/EntityID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Instructor"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Инструктор: прочитать","tags":["content"]},"patch":{"operationId":"updateInstructor","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/InstructorFields"},"rev":{"description":"Ревизия, на которой основана правка","type":"integer"}},"required":["rev","data"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Instructor"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Инструктор: изменить","tags":["content"]}},"/api/v1/instructors/{id}/restore":{"post":{"operationId":"restoreInstructor","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Instructor"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Инструктор: восстановить","tags":["content"]}},"/api/v1/instructors/{id}/revert":{"post":{"operationId":"revertInstructor","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevertRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Instructor"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Инструктор: вернуть к ревизии (новой ревизией)","tags":["content"]}},"/api/v1/instructors/{id}/revisions":{"get":{"operationId":"listInstructorRevisions","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/RevisionLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionList"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Инструктор: ревизии, новые первыми","tags":["content"]}},"/api/v1/instructors/{id}/translations/{lang}":{"get":{"operationId":"getInstructorTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Инструктор: перевод","tags":["translations"]},"put":{"operationId":"saveInstructorTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SaveTranslationRequest"}],"properties":{"data":{"$ref":"#/components/schemas/InstructorTranslationData"}}}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Инструктор: записать перевод","tags":["translations"]}},"/api/v1/instructors/{id}/translations/{lang}/verify":{"post":{"operationId":"verifyInstructorTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Инструктор: отметить перевод проверенным","tags":["translations"]}},"/api/v1/key":{"get":{"operationId":"getKey","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKey"}}},"description":"Ключ"},"401":{"$ref":"#/components/responses/Unauthorized"}},"security":[{"bearer":[]}],"summary":"Текущий ключ API — имя, роль, области, разрешения","tags":["auth"]}},"/api/v1/layouts":{"get":{"operationId":"listLayouts","parameters":[{"$ref":"#/components/parameters/IncludeDeleted"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Layout"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Раскладки: список","tags":["content"]},"post":{"operationId":"createLayout","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/LayoutData"}},"required":["data"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Layout"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Раскладка страницы: создать","tags":["content"]}},"/api/v1/layouts/{id}":{"delete":{"operationId":"deleteLayout","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Comment"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Раскладка страницы: удалить (можно восстановить; ключ — только черновик моделей, ни разу не опубликованный, ADR 0032)","tags":["content"]},"get":{"operationId":"getLayout","parameters":[{"$ref":"#/components/parameters/EntityID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Layout"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Раскладка страницы: прочитать","tags":["content"]},"patch":{"operationId":"updateLayout","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/LayoutFields"},"rev":{"description":"Ревизия, на которой основана правка","type":"integer"}},"required":["rev","data"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Layout"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Раскладка страницы: изменить","tags":["content"]}},"/api/v1/layouts/{id}/publish":{"post":{"operationId":"publishLayout","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Layout"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Раскладка страницы: опубликовать последнюю ревизию (сухой прогон — запись как сейчас и after_publish)","tags":["content"]}},"/api/v1/layouts/{id}/restore":{"post":{"operationId":"restoreLayout","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Layout"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Раскладка страницы: восстановить","tags":["content"]}},"/api/v1/layouts/{id}/revert":{"post":{"operationId":"revertLayout","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevertRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Layout"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Раскладка страницы: вернуть к ревизии (новой ревизией)","tags":["content"]}},"/api/v1/layouts/{id}/revisions":{"get":{"operationId":"listLayoutRevisions","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/RevisionLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionList"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Раскладка страницы: ревизии, новые первыми","tags":["content"]}},"/api/v1/layouts/{id}/unpublish":{"post":{"operationId":"unpublishLayout","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Layout"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Раскладка страницы: снять с публикации","tags":["content"]}},"/api/v1/license":{"get":{"operationId":"getLicense","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseState"}}},"description":"Состояние лицензии"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Лицензия экземпляра — вариант, возможности, срок, предупреждения","tags":["license"]},"put":{"description":"Пустой ключ — бесплатный вариант. Неверный ключ не сохраняется (`400 validation`, поле `key`).","operationId":"setLicense","parameters":[{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"key":{"type":"string"}},"required":["key"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseState"}}},"description":"Состояние лицензии с новым ключом"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Ввести ключ лицензии (администратор; не по ключу API)","tags":["license"]}},"/api/v1/license/check":{"post":{"description":"Спрашивает центр (`GET /v1/instance/license`) и ставит ключ из ответа\nтак же, как суточная проверка; суточную проверку не трогает (ADR 0050).\nНет ключа экземпляра — `409 network_not_configured`.\n","operationId":"checkLicense","parameters":[{"$ref":"#/components/parameters/CSRF"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LicenseCheck"}}},"description":"Итог проверки и лицензия после неё"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Не задан ключ экземпляра (`network_not_configured`)"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Центр просит подождать (`center_rate_limited`)","headers":{"Retry-After":{"schema":{"type":"integer"}}}},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Центр не ответил или отказал: `center_unauthorized`, `center_forbidden`, `center_refused`, `center_unavailable`"}},"summary":"Проверить лицензию в центре сети сейчас (администратор; не по ключу API)","tags":["license"]}},"/api/v1/media":{"get":{"operationId":"listMedia","parameters":[{"$ref":"#/components/parameters/IncludeDeleted"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Media"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Фото и видео: список","tags":["content"]},"post":{"operationId":"createMedia","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/MediaData"}},"required":["data"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Media"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Фото или видео: создать","tags":["content"]}},"/api/v1/media/{id}":{"delete":{"operationId":"deleteMedia","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Comment"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Фото или видео: удалить (можно восстановить)","tags":["content"]},"get":{"operationId":"getMedia","parameters":[{"$ref":"#/components/parameters/EntityID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Media"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Фото или видео: прочитать","tags":["content"]},"patch":{"operationId":"updateMedia","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/MediaFields"},"rev":{"description":"Ревизия, на которой основана правка","type":"integer"}},"required":["rev","data"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Media"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Фото или видео: изменить","tags":["content"]}},"/api/v1/media/{id}/restore":{"post":{"operationId":"restoreMedia","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Media"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Фото или видео: восстановить","tags":["content"]}},"/api/v1/media/{id}/revert":{"post":{"operationId":"revertMedia","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevertRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Media"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Фото или видео: вернуть к ревизии (новой ревизией)","tags":["content"]}},"/api/v1/media/{id}/revisions":{"get":{"operationId":"listMediaRevisions","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/RevisionLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionList"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Фото или видео: ревизии, новые первыми","tags":["content"]}},"/api/v1/media/{id}/translations/{lang}":{"get":{"operationId":"getMediaTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Фото или видео: перевод","tags":["translations"]},"put":{"operationId":"saveMediaTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SaveTranslationRequest"}],"properties":{"data":{"$ref":"#/components/schemas/MediaTranslationData"}}}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Фото или видео: записать перевод","tags":["translations"]}},"/api/v1/media/{id}/translations/{lang}/verify":{"post":{"operationId":"verifyMediaTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Фото или видео: отметить перевод проверенным","tags":["translations"]}},"/api/v1/menu":{"get":{"operationId":"getMenu","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Menu"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Меню: прочитать","tags":["content"]},"patch":{"operationId":"updateMenu","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/MenuFields"},"rev":{"description":"Ревизия, на которой основана правка","type":"integer"}},"required":["rev","data"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Menu"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Меню: изменить","tags":["content"]}},"/api/v1/menu/publish":{"post":{"operationId":"publishMenu","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Menu"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Меню: опубликовать последнюю ревизию (сухой прогон — запись как сейчас и after_publish)","tags":["content"]}},"/api/v1/menu/revert":{"post":{"operationId":"revertMenu","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevertRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Menu"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Меню: вернуть к ревизии (новой ревизией)","tags":["content"]}},"/api/v1/menu/revisions":{"get":{"operationId":"listMenuRevisions","parameters":[{"$ref":"#/components/parameters/RevisionLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionList"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Меню: ревизии, новые первыми","tags":["content"]}},"/api/v1/menu/unpublish":{"post":{"operationId":"unpublishMenu","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Menu"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Меню: снять с публикации","tags":["content"]}},"/api/v1/network":{"get":{"operationId":"getNetwork","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkStatus"}}},"description":"Состояние"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Связь с сетью alted — ключ, экземпляр в центре, проверка, материалы в сети","tags":["network"]}},"/api/v1/network/items/{kind}/{id}/resend":{"post":{"description":"Центр примет его заново — например, чтобы пересказать. Отправка — при ближайшей сверке или сразу по «Отправить сейчас».","operationId":"resendNetworkItem","parameters":[{"in":"path","name":"kind","required":true,"schema":{"enum":["news","event"],"type":"string"}},{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/CSRF"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkStatus"}}},"description":"Состояние после отправки"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Отправить материал в сеть ещё раз (с большей ревизией)","tags":["network"]}},"/api/v1/network/sync":{"post":{"operationId":"syncNetwork","parameters":[{"$ref":"#/components/parameters/CSRF"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NetworkStatus"}}},"description":"Состояние после отправки"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Отправить в сеть сейчас и сверить экземпляр с центром","tags":["network"]}},"/api/v1/oauth/approve":{"post":{"operationId":"approveOAuth","parameters":[{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"expires_in":{"enum":[3600,10800,86400,604800,2592000],"type":"integer"},"params":{"additionalProperties":{"type":"string"},"description":"Параметры `/oauth/authorize` как есть","type":"object"},"role":{"$ref":"#/components/schemas/Role"},"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"type":"array"}},"required":["params","role","scopes","expires_in"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"redirect":{"type":"string"}},"required":["redirect"],"type":"object"}}},"description":"Куда вернуть человека"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Разрешить — код на 10 минут и адрес возврата с ним","tags":["oauth"]}},"/api/v1/oauth/deny":{"post":{"operationId":"denyOAuth","parameters":[{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"params":{"additionalProperties":{"type":"string"},"type":"object"}},"required":["params"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"redirect":{"type":"string"}},"required":["redirect"],"type":"object"}}},"description":"Куда вернуть человека"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Отказать — адрес возврата с `error=access_denied`","tags":["oauth"]}},"/api/v1/oauth/request":{"get":{"description":"Те же параметры, что у `/oauth/authorize`; проверяются заново. Только человек в админке.","operationId":"getOAuthRequest","parameters":[{"in":"query","name":"client_id","required":true,"schema":{"type":"string"}},{"in":"query","name":"redirect_uri","schema":{"type":"string"}},{"in":"query","name":"code_challenge","required":true,"schema":{"type":"string"}},{"in":"query","name":"code_challenge_method","required":true,"schema":{"type":"string"}},{"in":"query","name":"state","schema":{"type":"string"}},{"in":"query","name":"scope","schema":{"type":"string"}},{"in":"query","name":"resource","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthRequest"}}},"description":"Запрос"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Что за запрос доступа — для страницы согласия","tags":["oauth"]}},"/api/v1/orders":{"get":{"description":"Новые первыми. Право `orders.read`; ключу — область `orders:read`.","operationId":"listOrders","parameters":[{"in":"query","name":"status","schema":{"enum":["created","paid","cancelled","refunded_partial","refunded"],"type":"string"}},{"$ref":"#/components/parameters/From"},{"$ref":"#/components/parameters/To"},{"in":"query","name":"tariff","schema":{"format":"int64","type":"integer"}},{"in":"query","name":"trial_request","schema":{"format":"int64","type":"integer"}},{"in":"query","name":"event","schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Order"},"type":"array"},"totals":{"$ref":"#/components/schemas/OrderTotals"}},"required":["items","totals"],"type":"object"}}},"description":"Заказы"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Заказы с суммами оплат и возвратов за выборку","tags":["orders"]}},"/api/v1/orders/export.csv":{"get":{"operationId":"exportOrders","parameters":[{"in":"query","name":"status","schema":{"enum":["created","paid","cancelled","refunded_partial","refunded"],"type":"string"}},{"$ref":"#/components/parameters/From"},{"$ref":"#/components/parameters/To"},{"in":"query","name":"tariff","schema":{"format":"int64","type":"integer"}},{"in":"query","name":"trial_request","schema":{"format":"int64","type":"integer"}},{"in":"query","name":"event","schema":{"format":"int64","type":"integer"}}],"responses":{"200":{"content":{"text/csv":{"schema":{"type":"string"}}},"description":"CSV"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Выгрузка заказов в CSV (UTF-8 с BOM)","tags":["orders"]}},"/api/v1/orders/{id}":{"get":{"operationId":"getOrder","parameters":[{"$ref":"#/components/parameters/EntityID"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"attempts":{"items":{"$ref":"#/components/schemas/PayAttempt"},"type":"array"},"messages":{"items":{"$ref":"#/components/schemas/OutboxItem"},"type":"array"},"order":{"$ref":"#/components/schemas/Order"},"refunds":{"items":{"$ref":"#/components/schemas/Refund"},"type":"array"}},"required":["order","attempts","refunds","messages"],"type":"object"}}},"description":"Заказ"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Заказ, его попытки оплаты, возвраты и уведомления","tags":["orders"]}},"/api/v1/orders/{id}/check":{"post":{"operationId":"checkOrder","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}},"description":"Заказ после сверки"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Банк не ответил — сверка не сделана"}},"summary":"Сверить заказ с банком сейчас","tags":["orders"]}},"/api/v1/orders/{id}/refund":{"post":{"description":"Только человек с правом `orders.refund` (администратор); ключ API —\n`403 needs_human`. Возвращается новейшая оплаченная попытка с\nостатком. Банк отказал — `409 bank_refused`; не ответил — `502\nbank_unavailable`, возврат записан и будет повторён сверкой.\n","operationId":"refundOrder","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"amount":{"description":"Копейки","format":"int64","minimum":1,"type":"integer"},"comment":{"description":"Почему — обязательно","type":"string"}},"required":["amount","comment"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Refund"}}},"description":"Возврат"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Нечего возвращать, больше остатка или банк отказал"},"502":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Банк не ответил; возврат будет повторён"}},"summary":"Вернуть деньги — часть или всё (администратор)","tags":["orders"]}},"/api/v1/outbox":{"get":{"operationId":"listOutbox","parameters":[{"in":"query","name":"status","schema":{"enum":["pending","sent","failed"],"type":"string"}},{"in":"query","name":"ref","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/OutboxItem"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"Сообщения, новые первыми"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Журнал отправки писем и сообщений (администратор)","tags":["settings"]}},"/api/v1/outbox/{id}/retry":{"post":{"operationId":"retryOutbox","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"Поставлено в очередь"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Отправить снова (администратор)","tags":["settings"]}},"/api/v1/page-html":{"get":{"description":"Страница рисуется как в предпросмотре: черновики раскладок, меню,\nтемы и шаблонов поверх опубликованного (ADR 0033). Части: `main` —\nсодержимое, `header` — шапка с меню, `full` — вся страница. Больше\n200 КБ — обрезается, `truncated: true`. `classes` — CSS-классы\nэтой части и сколько раз они встречаются.\n","operationId":"getPageHTML","parameters":[{"description":"Адрес страницы на сайте, например `/` или `/en/halls/`","in":"query","name":"path","required":true,"schema":{"type":"string"}},{"in":"query","name":"part","schema":{"default":"main","enum":["main","header","full"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageHTML"}}},"description":"HTML"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"HTML страницы сайта с черновиками — для модели, которая правит вид","tags":["layout"]}},"/api/v1/pages":{"get":{"operationId":"listPages","parameters":[{"$ref":"#/components/parameters/IncludeDeleted"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Page"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Материалы: список","tags":["content"]},"post":{"operationId":"createPage","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/PageData"}},"required":["data"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Материал: создать","tags":["content"]}},"/api/v1/pages/{id}":{"delete":{"operationId":"deletePage","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Comment"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Материал: удалить (можно восстановить; ключ — только черновик моделей, ни разу не опубликованный, ADR 0032)","tags":["content"]},"get":{"operationId":"getPage","parameters":[{"$ref":"#/components/parameters/EntityID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Материал: прочитать","tags":["content"]},"patch":{"operationId":"updatePage","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/PageFields"},"rev":{"description":"Ревизия, на которой основана правка","type":"integer"}},"required":["rev","data"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Материал: изменить","tags":["content"]}},"/api/v1/pages/{id}/publish":{"post":{"operationId":"publishPage","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Материал: опубликовать последнюю ревизию (сухой прогон — запись как сейчас и after_publish)","tags":["content"]}},"/api/v1/pages/{id}/restore":{"post":{"operationId":"restorePage","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Материал: восстановить","tags":["content"]}},"/api/v1/pages/{id}/revert":{"post":{"operationId":"revertPage","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevertRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Материал: вернуть к ревизии (новой ревизией)","tags":["content"]}},"/api/v1/pages/{id}/revisions":{"get":{"operationId":"listPageRevisions","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/RevisionLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionList"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Материал: ревизии, новые первыми","tags":["content"]}},"/api/v1/pages/{id}/translations/{lang}":{"get":{"operationId":"getPageTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Материал: перевод","tags":["translations"]},"put":{"operationId":"savePageTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SaveTranslationRequest"}],"properties":{"data":{"$ref":"#/components/schemas/PageTranslationData"}}}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Материал: записать перевод","tags":["translations"]}},"/api/v1/pages/{id}/translations/{lang}/verify":{"post":{"operationId":"verifyPageTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Материал: отметить перевод проверенным","tags":["translations"]}},"/api/v1/pages/{id}/unpublish":{"post":{"operationId":"unpublishPage","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Материал: снять с публикации","tags":["content"]}},"/api/v1/pending":{"get":{"description":"Черновики видов с публикацией, которые не выложены или изменены\nпосле выкладки, и мероприятия в состоянии «черновик» (ADR 0033).\nУ каждого — последняя правка: когда, кто и зачем. Новые сверху.\n","operationId":"listPending","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PendingItem"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"Список"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Что ждёт публикации","tags":["content"]}},"/api/v1/preview":{"post":{"description":"Открывает сайт с черновиками раскладок, меню, темы, шаблонов блоков\nи материалов (ADR 0018, 0033, 0035). Ссылку можно открыть в браузере без входа — чтобы снять\nэкран на телефоне и десктопе.\n","operationId":"createPreview","parameters":[{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"path":{"description":"Страница, по умолчанию /","type":"string"}},"type":"object"}}}},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"expires_at":{"format":"date-time","type":"string"},"url":{"type":"string"}},"required":["url","expires_at"],"type":"object"}}},"description":"Ссылка"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Ссылка предпросмотра черновиков (на час)","tags":["layout"]}},"/api/v1/read-page":{"post":{"description":"Сайт сам скачивает страницу по адресу, который дал человек, —\nнапример, текущий сайт клуба, чтобы перенести его на этот (видео\n«сайт за один разговор», ADR 0026). Ничего не меняет. Те же\nограничения адреса, что у загрузки фото по ссылке (ADR 0033):\nтолько `https` на 443 или `http` на 80, без внутренних адресов, 3 переадресации,\n20 секунд; страница — HTML до 3 МБ. 60 страниц в час на человека.\nВ ответе — заголовок, описание, текст страницы (заголовки с `#`,\nпункты списков с `- `, до 40 000 знаков), фото (`https`, у страницы на `http` и `http`; до 60) и\nссылки на страницы того же сайта (до 100). Фото переносятся\nотдельно, `POST /api/v1/uploads/from-url`.\n","operationId":"readPage","parameters":[{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"url":{"type":"string"}},"required":["url"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebPage"}}},"description":"Страница"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"413":{"$ref":"#/components/responses/TooLarge"},"415":{"$ref":"#/components/responses/Unsupported"},"429":{"description":"Слишком часто"}},"summary":"Прочитать страницу по ссылке","tags":["files"]}},"/api/v1/regions":{"get":{"operationId":"listRegions","parameters":[{"$ref":"#/components/parameters/IncludeDeleted"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Region"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Регионы: список","tags":["content"]},"post":{"operationId":"createRegion","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/RegionData"}},"required":["data"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Region"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Регион: создать","tags":["content"]}},"/api/v1/regions/{id}":{"delete":{"operationId":"deleteRegion","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Comment"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Регион: удалить (можно восстановить)","tags":["content"]},"get":{"operationId":"getRegion","parameters":[{"$ref":"#/components/parameters/EntityID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Region"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Регион: прочитать","tags":["content"]},"patch":{"operationId":"updateRegion","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/RegionFields"},"rev":{"description":"Ревизия, на которой основана правка","type":"integer"}},"required":["rev","data"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Region"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Регион: изменить","tags":["content"]}},"/api/v1/regions/{id}/restore":{"post":{"operationId":"restoreRegion","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Region"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Регион: восстановить","tags":["content"]}},"/api/v1/regions/{id}/revert":{"post":{"operationId":"revertRegion","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevertRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Region"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Регион: вернуть к ревизии (новой ревизией)","tags":["content"]}},"/api/v1/regions/{id}/revisions":{"get":{"operationId":"listRegionRevisions","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/RevisionLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionList"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Регион: ревизии, новые первыми","tags":["content"]}},"/api/v1/regions/{id}/translations/{lang}":{"get":{"operationId":"getRegionTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Регион: перевод","tags":["translations"]},"put":{"operationId":"saveRegionTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SaveTranslationRequest"}],"properties":{"data":{"$ref":"#/components/schemas/RegionTranslationData"}}}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Регион: записать перевод","tags":["translations"]}},"/api/v1/regions/{id}/translations/{lang}/verify":{"post":{"operationId":"verifyRegionTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Регион: отметить перевод проверенным","tags":["translations"]}},"/api/v1/reports/{kind}/send":{"post":{"description":"daily — за вчера, weekly — за прошлую неделю; в чаты отчётов из настроек.","operationId":"sendReportNow","parameters":[{"in":"path","name":"kind","required":true,"schema":{"enum":["daily","weekly"],"type":"string"}},{"$ref":"#/components/parameters/CSRF"}],"responses":{"202":{"content":{"application/json":{"schema":{"properties":{"ref":{"description":"ref сообщений в журнале отправки","type":"string"}},"required":["ref"],"type":"object"}}},"description":"Отчёт поставлен в очередь отправки"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Отправить отчёт в Telegram сейчас (администратор)","tags":["stats"]}},"/api/v1/schedule-changes":{"get":{"operationId":"listScheduleChanges","parameters":[{"$ref":"#/components/parameters/IncludeDeleted"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ScheduleChange"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Отмены и замены: список","tags":["content"]},"post":{"operationId":"createScheduleChange","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/ScheduleChangeData"}},"required":["data"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleChange"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Отмена или замена: создать","tags":["content"]}},"/api/v1/schedule-changes/{id}":{"delete":{"operationId":"deleteScheduleChange","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Comment"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Отмена или замена: удалить (можно восстановить)","tags":["content"]},"get":{"operationId":"getScheduleChange","parameters":[{"$ref":"#/components/parameters/EntityID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleChange"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Отмена или замена: прочитать","tags":["content"]},"patch":{"operationId":"updateScheduleChange","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/ScheduleChangeFields"},"rev":{"description":"Ревизия, на которой основана правка","type":"integer"}},"required":["rev","data"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleChange"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Отмена или замена: изменить","tags":["content"]}},"/api/v1/schedule-changes/{id}/restore":{"post":{"operationId":"restoreScheduleChange","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleChange"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Отмена или замена: восстановить","tags":["content"]}},"/api/v1/schedule-changes/{id}/revert":{"post":{"operationId":"revertScheduleChange","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevertRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleChange"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Отмена или замена: вернуть к ревизии (новой ревизией)","tags":["content"]}},"/api/v1/schedule-changes/{id}/revisions":{"get":{"operationId":"listScheduleChangeRevisions","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/RevisionLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionList"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Отмена или замена: ревизии, новые первыми","tags":["content"]}},"/api/v1/schedule-changes/{id}/translations/{lang}":{"get":{"operationId":"getScheduleChangeTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Отмена или замена: перевод","tags":["translations"]},"put":{"operationId":"saveScheduleChangeTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SaveTranslationRequest"}],"properties":{"data":{"$ref":"#/components/schemas/ScheduleChangeTranslationData"}}}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Отмена или замена: записать перевод","tags":["translations"]}},"/api/v1/schedule-changes/{id}/translations/{lang}/verify":{"post":{"operationId":"verifyScheduleChangeTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Отмена или замена: отметить перевод проверенным","tags":["translations"]}},"/api/v1/schedule-slots":{"get":{"operationId":"listScheduleSlots","parameters":[{"$ref":"#/components/parameters/IncludeDeleted"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ScheduleSlot"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Расписание: список","tags":["content"]},"post":{"operationId":"createScheduleSlot","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/ScheduleSlotData"}},"required":["data"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleSlot"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Занятие: создать","tags":["content"]}},"/api/v1/schedule-slots/{id}":{"delete":{"operationId":"deleteScheduleSlot","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Comment"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Занятие: удалить (можно восстановить)","tags":["content"]},"get":{"operationId":"getScheduleSlot","parameters":[{"$ref":"#/components/parameters/EntityID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleSlot"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Занятие: прочитать","tags":["content"]},"patch":{"operationId":"updateScheduleSlot","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/ScheduleSlotFields"},"rev":{"description":"Ревизия, на которой основана правка","type":"integer"}},"required":["rev","data"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleSlot"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Занятие: изменить","tags":["content"]}},"/api/v1/schedule-slots/{id}/restore":{"post":{"operationId":"restoreScheduleSlot","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleSlot"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Занятие: восстановить","tags":["content"]}},"/api/v1/schedule-slots/{id}/revert":{"post":{"operationId":"revertScheduleSlot","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevertRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleSlot"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Занятие: вернуть к ревизии (новой ревизией)","tags":["content"]}},"/api/v1/schedule-slots/{id}/revisions":{"get":{"operationId":"listScheduleSlotRevisions","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/RevisionLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionList"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Занятие: ревизии, новые первыми","tags":["content"]}},"/api/v1/schedule-slots/{id}/translations/{lang}":{"get":{"operationId":"getScheduleSlotTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Занятие: перевод","tags":["translations"]},"put":{"operationId":"saveScheduleSlotTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SaveTranslationRequest"}],"properties":{"data":{"$ref":"#/components/schemas/ScheduleSlotTranslationData"}}}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Занятие: записать перевод","tags":["translations"]}},"/api/v1/schedule-slots/{id}/translations/{lang}/verify":{"post":{"operationId":"verifyScheduleSlotTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Занятие: отметить перевод проверенным","tags":["translations"]}},"/api/v1/schema":{"get":{"description":"По нему админка строит формы, модель — понимает, что можно менять.","operationId":"getSchema","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Schema"}}},"description":"Описание видов"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Виды сущностей и их поля","tags":["content"]}},"/api/v1/secrets":{"get":{"description":"Значения секретов API не отдаёт никогда (ADR 0013).","operationId":"listSecrets","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"additionalProperties":{"$ref":"#/components/schemas/SecretInfo"},"type":"object"}},"required":["items"],"type":"object"}}},"description":"Секреты"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Какие секреты заданы (без значений)","tags":["settings"]}},"/api/v1/secrets/{name}":{"delete":{"operationId":"deleteSecret","parameters":[{"$ref":"#/components/parameters/SecretName"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"Стёрт"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Стереть секрет (администратор)","tags":["settings"]},"put":{"operationId":"setSecret","parameters":[{"$ref":"#/components/parameters/SecretName"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"value":{"minLength":1,"type":"string"}},"required":["value"],"type":"object"}}},"required":true},"responses":{"204":{"description":"Задан"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Задать секрет (администратор)","tags":["settings"]}},"/api/v1/settings":{"get":{"operationId":"getSettings","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Settings"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Настройки: прочитать","tags":["content"]},"patch":{"operationId":"updateSettings","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/SettingsFields"},"rev":{"description":"Ревизия, на которой основана правка","type":"integer"}},"required":["rev","data"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Settings"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Настройки: изменить","tags":["content"]}},"/api/v1/settings/revert":{"post":{"operationId":"revertSettings","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevertRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Settings"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Настройки: вернуть к ревизии (новой ревизией)","tags":["content"]}},"/api/v1/settings/revisions":{"get":{"operationId":"listSettingsRevisions","parameters":[{"$ref":"#/components/parameters/RevisionLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionList"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Настройки: ревизии, новые первыми","tags":["content"]}},"/api/v1/site":{"get":{"operationId":"getSite","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteInfo"}}},"description":"Сведения о сайте"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Основные сведения о сайте","tags":["site"]}},"/api/v1/social/channels":{"get":{"description":"Каналы, куда материал может уйти по отметке «В соцсети клуба» (ADR 0047): задан адресат и ключ или токен, лицензия даёт `messengers`. В порядке `vk`, `telegram`, `max`.","operationId":"listSocialChannels","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"enum":["vk","telegram","max"],"type":"string"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"Список"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Подключённые каналы публикаций (для формы материала)","tags":["settings"]}},"/api/v1/stats":{"get":{"description":"Агрегаты по дням без cookie (ADR 0016). По умолчанию — последние 30 дней.","operationId":"getStats","parameters":[{"$ref":"#/components/parameters/From"},{"$ref":"#/components/parameters/To"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Stats"}}},"description":"Статистика"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Статистика посещений за период","tags":["stats"]}},"/api/v1/tariffs":{"get":{"operationId":"listTariffs","parameters":[{"$ref":"#/components/parameters/IncludeDeleted"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/Tariff"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Тарифы: список","tags":["content"]},"post":{"operationId":"createTariff","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/TariffData"}},"required":["data"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tariff"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Тариф: создать","tags":["content"]}},"/api/v1/tariffs/{id}":{"delete":{"operationId":"deleteTariff","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Comment"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"responses":{"204":{"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Тариф: удалить (можно восстановить)","tags":["content"]},"get":{"operationId":"getTariff","parameters":[{"$ref":"#/components/parameters/EntityID"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tariff"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Тариф: прочитать","tags":["content"]},"patch":{"operationId":"updateTariff","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/TariffFields"},"rev":{"description":"Ревизия, на которой основана правка","type":"integer"}},"required":["rev","data"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tariff"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Тариф: изменить","tags":["content"]}},"/api/v1/tariffs/{id}/restore":{"post":{"operationId":"restoreTariff","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tariff"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Тариф: восстановить","tags":["content"]}},"/api/v1/tariffs/{id}/revert":{"post":{"operationId":"revertTariff","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevertRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tariff"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Тариф: вернуть к ревизии (новой ревизией)","tags":["content"]}},"/api/v1/tariffs/{id}/revisions":{"get":{"operationId":"listTariffRevisions","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/RevisionLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionList"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Тариф: ревизии, новые первыми","tags":["content"]}},"/api/v1/tariffs/{id}/translations/{lang}":{"get":{"operationId":"getTariffTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Тариф: перевод","tags":["translations"]},"put":{"operationId":"saveTariffTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/SaveTranslationRequest"}],"properties":{"data":{"$ref":"#/components/schemas/TariffTranslationData"}}}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Тариф: записать перевод","tags":["translations"]}},"/api/v1/tariffs/{id}/translations/{lang}/verify":{"post":{"operationId":"verifyTariffTranslation","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/Lang"},{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Translation"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Тариф: отметить перевод проверенным","tags":["translations"]}},"/api/v1/theme":{"get":{"operationId":"getTheme","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Theme"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Тема: прочитать","tags":["content"]},"patch":{"operationId":"updateTheme","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"comment":{"description":"Зачем","type":"string"},"data":{"$ref":"#/components/schemas/ThemeFields"},"rev":{"description":"Ревизия, на которой основана правка","type":"integer"}},"required":["rev","data"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Theme"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Тема: изменить","tags":["content"]}},"/api/v1/theme/publish":{"post":{"operationId":"publishTheme","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Theme"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Тема: опубликовать последнюю ревизию (сухой прогон — запись как сейчас и after_publish)","tags":["content"]}},"/api/v1/theme/revert":{"post":{"operationId":"revertTheme","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevertRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Theme"}}},"description":"OK"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Тема: вернуть к ревизии (новой ревизией)","tags":["content"]}},"/api/v1/theme/revisions":{"get":{"operationId":"listThemeRevisions","parameters":[{"$ref":"#/components/parameters/RevisionLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevisionList"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Тема: ревизии, новые первыми","tags":["content"]}},"/api/v1/theme/unpublish":{"post":{"operationId":"unpublishTheme","parameters":[{"$ref":"#/components/parameters/DryRun"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Theme"}}},"description":"OK"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Тема: снять с публикации","tags":["content"]}},"/api/v1/translations":{"get":{"description":"Сущности, у которых перевода нет или он устарел (ADR 0009); `state`\nвыбирает другие состояния.\n","operationId":"listPendingTranslations","parameters":[{"in":"query","name":"lang","required":true,"schema":{"type":"string"}},{"description":"Через запятую: missing, outdated, unverified. По умолчанию — missing,outdated","in":"query","name":"state","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PendingTranslation"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"Очередь переводов"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Что перевести на язык","tags":["translations"]}},"/api/v1/trial-requests":{"get":{"description":"Инструктор видит заявки своих залов и «подберите зал» своих городов.","operationId":"listTrialRequests","parameters":[{"$ref":"#/components/parameters/TrialStatus"},{"$ref":"#/components/parameters/TrialHall"},{"in":"query","name":"source","schema":{"type":"string"}},{"$ref":"#/components/parameters/From"},{"$ref":"#/components/parameters/To"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TrialRequest"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"Заявки, новые первыми"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Заявки на пробную тренировку","tags":["requests"]}},"/api/v1/trial-requests/export.csv":{"get":{"operationId":"exportTrialRequests","parameters":[{"$ref":"#/components/parameters/TrialStatus"},{"$ref":"#/components/parameters/TrialHall"},{"in":"query","name":"source","schema":{"type":"string"}},{"$ref":"#/components/parameters/From"},{"$ref":"#/components/parameters/To"}],"responses":{"200":{"content":{"text/csv":{"schema":{"type":"string"}}},"description":"CSV"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Выгрузка заявок в CSV (UTF-8 с BOM)","tags":["requests"]}},"/api/v1/trial-requests/{id}":{"get":{"operationId":"getTrialRequest","parameters":[{"$ref":"#/components/parameters/EntityID"}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"events":{"items":{"$ref":"#/components/schemas/TrialEvent"},"type":"array"},"messages":{"items":{"$ref":"#/components/schemas/OutboxItem"},"type":"array"},"orders":{"description":"Заказы по заявке (платная пробная) — только с правом `orders.read`","items":{"$ref":"#/components/schemas/Order"},"type":"array"},"request":{"$ref":"#/components/schemas/TrialRequest"}},"required":["request","events","messages"],"type":"object"}}},"description":"Заявка"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Заявка, её события и уведомления","tags":["requests"]},"patch":{"operationId":"updateTrialRequest","parameters":[{"$ref":"#/components/parameters/EntityID"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"assignee":{"description":"id пользователя; 0 — никто","format":"int64","type":"integer"},"notes":{"type":"string"},"status":{"enum":["new","contacted","came","no_show","declined"],"type":"string"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrialRequest"}}},"description":"Заявка"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Статус, ответственный, заметки","tags":["requests"]}},"/api/v1/update":{"get":{"operationId":"getUpdate","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStatus"}}},"description":"Обновления"},"401":{"$ref":"#/components/responses/Unauthorized"}},"summary":"Версия, доступное обновление и итог последнего","tags":["license"]}},"/api/v1/update/check":{"post":{"operationId":"checkUpdate","parameters":[{"$ref":"#/components/parameters/CSRF"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStatus"}}},"description":"Обновления после проверки"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Проверить обновление сейчас","tags":["license"]}},"/api/v1/update/install":{"post":{"description":"Файл сверяется с подписанным манифестом и проверяется на копии\nданных; прошёл — копия базы, замена, перезапуск (`202`). Не прошёл —\n`409 update_failed` с причиной, ничего не тронуто.\n","operationId":"installUpdate","parameters":[{"$ref":"#/components/parameters/CSRF"}],"responses":{"202":{"description":"Ставится; сайт перезапустится"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Нечего ставить или файл не прошёл проверку"}},"summary":"Поставить доступное обновление (администратор; не по ключу API)","tags":["license"]}},"/api/v1/uploads":{"post":{"description":"Создаёт сущность `media`. Фото — JPEG, PNG или WebP: метаданные\n(EXIF с геометкой) вырезаются, строятся превью. SVG с одной\nкартинкой внутри (выгрузка Figma и подобных) принимается как эта\nкартинка; векторный SVG — нет (`415`, в `details.file` — что\nделать): админка переводит SVG в PNG сама (ADR 0044). Видео — MP4\nили WebM. Шрифт — WOFF2, WOFF, TTF или OTF до 2 МБ, с `family`.\n","operationId":"upload","parameters":[{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"album":{"type":"integer"},"alt":{"description":"Обязательно для фото","type":"string"},"caption":{"type":"string"},"comment":{"type":"string"},"family":{"description":"Семейство шрифта, например Ubuntu — обязательно для шрифта","type":"string"},"file":{"format":"binary","type":"string"},"style":{"enum":["normal","italic"],"type":"string"},"type":{"enum":["photo","video","font"],"type":"string"},"weight":{"description":"Начертание шрифта — 400, 700 или диапазон «100 900»; по умолчанию 400","type":"string"}},"required":["file","type"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Media"}}},"description":"Создано"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"413":{"$ref":"#/components/responses/TooLarge"},"415":{"$ref":"#/components/responses/Unsupported"}},"summary":"Загрузить фото, видео или шрифт","tags":["files"]}},"/api/v1/uploads/from-url":{"post":{"description":"Сайт сам скачивает фото по адресу (ADR 0033) и создаёт сущность\n`media`, как `POST /api/v1/uploads`. Только `https` на порт 443\nили `http` на порт 80, без перехода с `https` на `http`, без внутренних и локальных адресов (проверяется при каждом\nсоединении и после переадресации), не больше 3 переадресаций,\n20 секунд и 20 МБ; только JPEG, PNG или WebP. 30 загрузок в час на\nчеловека. Отказ по адресу — `400 validation` с `details.url`.\n","operationId":"uploadFromURL","parameters":[{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"album":{"format":"int64","type":"integer"},"alt":{"description":"Что на фото — для тех, кто не видит","type":"string"},"caption":{"type":"string"},"comment":{"description":"Зачем; у ключа обязательно","type":"string"},"url":{"type":"string"}},"required":["url","alt"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Media"}}},"description":"Создано"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"413":{"$ref":"#/components/responses/TooLarge"},"415":{"$ref":"#/components/responses/Unsupported"},"429":{"description":"Слишком часто"}},"summary":"Загрузить фото по ссылке","tags":["files"]}},"/api/v1/users":{"get":{"operationId":"listUsers","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"items":{"items":{"$ref":"#/components/schemas/User"},"type":"array"}},"required":["items"],"type":"object"}}},"description":"Все пользователи, включая отключённых"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}},"summary":"Пользователи (администратор)","tags":["users"]},"post":{"operationId":"createUser","parameters":[{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUserRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}},"description":"Создан"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Создать пользователя (администратор)","tags":["users"]}},"/api/v1/users/{id}":{"patch":{"description":"Смена роли и отключение гасят сессии пользователя. Последнего\nдействующего администратора нельзя ни отключить, ни понизить.\n","operationId":"updateUser","parameters":[{"$ref":"#/components/parameters/UserID"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}},"description":"Изменён"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"}},"summary":"Изменить имя, роль, язык или отключить (администратор)","tags":["users"]}},"/api/v1/users/{id}/password":{"post":{"description":"Сессии пользователя гасятся.","operationId":"setUserPassword","parameters":[{"$ref":"#/components/parameters/UserID"},{"$ref":"#/components/parameters/CSRF"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetPasswordRequest"}}},"required":true},"responses":{"204":{"description":"Пароль задан"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}},"summary":"Задать пользователю пароль (администратор)","tags":["users"]}},"/data/events.json":{"get":{"description":"Ближайшие (до 100) и прошедшие (до 20) опубликованные мероприятия.","operationId":"getDataEvents","parameters":[{"$ref":"#/components/parameters/DataLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataEvents"}}},"description":"Мероприятия"}},"security":[],"summary":"Мероприятия (открытые данные)","tags":["public"]}},"/data/halls.json":{"get":{"description":"Опубликованные залы, кроме закрытых. Без персональных данных.","operationId":"getDataHalls","parameters":[{"$ref":"#/components/parameters/DataLang"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataHalls"}}},"description":"Залы"}},"security":[],"summary":"Залы (открытые данные, ADR 0019)","tags":["public"]}},"/data/prices.json":{"get":{"description":"Пустой список до фазы 4 (онлайн-оплата).","operationId":"getDataPrices","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"note":{"type":"string"},"prices":{"items":{"type":"object"},"type":"array"}},"required":["prices"],"type":"object"}}},"description":"Цены"}},"security":[],"summary":"Цены (открытые данные)","tags":["public"]}},"/data/schedule.json":{"get":{"description":"Занятия недели с отменами и заменами; время местное.","operationId":"getDataSchedule","parameters":[{"$ref":"#/components/parameters/DataLang"},{"description":"Любой день недели `YYYY-MM-DD`; по умолчанию — текущая","in":"query","name":"week","schema":{"format":"date","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataSchedule"}}},"description":"Расписание"}},"security":[],"summary":"Расписание недели (открытые данные)","tags":["public"]}},"/docs/{page}/{name}":{"get":{"operationId":"downloadDocumentFile","parameters":[{"in":"path","name":"page","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Файл"},"404":{"$ref":"#/components/responses/NotFound"}},"security":[],"summary":"Текущая версия файла документа (публично)","tags":["files"]}},"/docs/{page}/{name}/v{version}":{"get":{"operationId":"downloadDocumentFileVersion","parameters":[{"in":"path","name":"page","required":true,"schema":{"type":"string"}},{"in":"path","name":"name","required":true,"schema":{"type":"string"}},{"in":"path","name":"version","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Файл"},"404":{"$ref":"#/components/responses/NotFound"}},"security":[],"summary":"Конкретная версия файла документа (публично)","tags":["files"]}},"/files/{name}":{"get":{"description":"`\u003csha256\u003e` или `\u003csha256\u003e.\u003cрасширение\u003e`. Кешируется навсегда.","operationId":"getFile","parameters":[{"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Файл"},"404":{"$ref":"#/components/responses/NotFound"}},"security":[],"summary":"Файл по хешу (публично)","tags":["files"]}},"/files/{name}/{variant}":{"get":{"description":"`w\u003cширина\u003e.\u003cwebp|jpeg|png\u003e` — превью этого формата с ближайшей\nшириной не меньше заданной, иначе самое большое. Ширины — 320, 640,\n1024, 1600 и исходная, если меньше 1600.\n","operationId":"getPhotoPreview","parameters":[{"description":"sha256 исходного фото","in":"path","name":"name","required":true,"schema":{"type":"string"}},{"in":"path","name":"variant","required":true,"schema":{"pattern":"^w\\d+\\.(webp|jpeg|png)$","type":"string"}}],"responses":{"200":{"description":"Превью"},"404":{"$ref":"#/components/responses/NotFound"}},"security":[],"summary":"Превью фото (публично)","tags":["files"]}},"/healthz":{"get":{"operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}},"description":"Экземпляр работает"}},"security":[],"summary":"Состояние экземпляра","tags":["system"]}},"/mcp":{"get":{"operationId":"mcpStream","responses":{"405":{"description":"Сервер без потока событий"}},"security":[],"summary":"Поток событий сервера — не держится","tags":["mcp"]},"post":{"description":"Те же ручки API как инструменты MCP (ADR 0030): `what_can_i_do`,\n`read_guide`, `get_schema`, `list_records`, `get_record`,\n`create_record`, `update_record`, `record_history`,\n`pending_translations`, `get_translation`, `save_translation`,\n`list_blocks`, `check_block_template`, `preview_link`,\n`publish_record` (с областью `publish`, ADR 0031, и сухим\nпрогоном), `revert_record`, `delete_record` (только черновики\nмоделей, ADR 0032), `get_page_html`, `pending_publication`,\n`import_photo` (ADR 0033), `call_api`.\nПрава — права ключа. Без состояния: `Mcp-Session-Id` не выдаётся.\nВерсии протокола — `2025-03-26`, `2025-06-18`, `2025-11-25`.\n","operationId":"mcp","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JSONRPCMessage"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JSONRPCMessage"}}},"description":"Ответ JSON-RPC"},"202":{"description":"Уведомление или ответ клиента принят"},"400":{"description":"Не JSON-RPC"},"401":{"description":"Нет ключа, ключ неверный, отозван или истёк","headers":{"WWW-Authenticate":{"schema":{"type":"string"}}}},"403":{"description":"Запрос со страницы чужого сайта (`Origin`)"}},"security":[{"bearer":[]}],"summary":"MCP-сервер — инструменты сайта для моделей (Streamable HTTP, JSON-RPC 2.0)","tags":["mcp"]}},"/oauth/authorize":{"get":{"operationId":"oauthAuthorize","parameters":[{"in":"query","name":"response_type","required":true,"schema":{"enum":["code"],"type":"string"}},{"in":"query","name":"client_id","required":true,"schema":{"type":"string"}},{"in":"query","name":"redirect_uri","schema":{"type":"string"}},{"in":"query","name":"code_challenge","required":true,"schema":{"type":"string"}},{"in":"query","name":"code_challenge_method","required":true,"schema":{"enum":["S256"],"type":"string"}},{"in":"query","name":"state","schema":{"type":"string"}},{"in":"query","name":"scope","schema":{"type":"string"}},{"in":"query","name":"resource","schema":{"type":"string"}}],"responses":{"302":{"description":"На `/admin/oauth?…` или, при ошибке запроса, на адрес возврата с `error`"},"400":{"description":"Неизвестный клиент или адрес возврата — ошибка на месте, без перехода"}},"security":[],"summary":"Начало входа — проверка клиента и PKCE, переход на страницу согласия в админке","tags":["oauth"]}},"/oauth/register":{"post":{"operationId":"oauthRegister","requestBody":{"content":{"application/json":{"schema":{"properties":{"client_name":{"type":"string"},"grant_types":{"items":{"type":"string"},"type":"array"},"redirect_uris":{"description":"`https://…` или `http://localhost`/`http://127.0.0.1` (порт при сверке не учитывается)","items":{"type":"string"},"type":"array"},"response_types":{"items":{"type":"string"},"type":"array"},"token_endpoint_auth_method":{"enum":["none"],"type":"string"}},"required":["redirect_uris"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"client_id":{"type":"string"},"client_id_issued_at":{"type":"integer"},"client_name":{"type":"string"},"grant_types":{"items":{"type":"string"},"type":"array"},"redirect_uris":{"items":{"type":"string"},"type":"array"},"response_types":{"items":{"type":"string"},"type":"array"},"token_endpoint_auth_method":{"type":"string"}},"required":["client_id","client_id_issued_at","redirect_uris","token_endpoint_auth_method","grant_types","response_types"],"type":"object"}}},"description":"Клиент"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}},"description":"`invalid_redirect_uri` или `invalid_client_metadata` (RFC 7591)"},"429":{"description":"Слишком часто"}},"security":[],"summary":"Регистрация клиента (RFC 7591) — без входа, не чаще 20 раз в час с адреса","tags":["oauth"]}},"/oauth/token":{"post":{"operationId":"oauthToken","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"properties":{"client_id":{"type":"string"},"code":{"type":"string"},"code_verifier":{"type":"string"},"grant_type":{"enum":["authorization_code"],"type":"string"},"redirect_uri":{"type":"string"},"resource":{"type":"string"}},"required":["grant_type","code","redirect_uri","client_id","code_verifier"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"access_token":{"description":"Ключ API `cs_…`","type":"string"},"expires_in":{"type":"integer"},"scope":{"type":"string"},"token_type":{"enum":["Bearer"],"type":"string"}},"required":["access_token","token_type","expires_in","scope"],"type":"object"}}},"description":"Токен"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}},"description":"`invalid_grant`, `invalid_client`, `invalid_request`, `unsupported_grant_type` (RFC 6749)"}},"security":[],"summary":"Обмен кода на токен — ключ API со сроком из согласия","tags":["oauth"]}}},"security":[{"session":[]},{"bearer":[]}],"servers":[{"url":"/"}],"tags":[{"name":"system"},{"name":"auth"},{"name":"users"},{"name":"site"},{"name":"content"},{"name":"translations"},{"name":"files"},{"name":"settings"},{"name":"requests"},{"name":"stats"},{"description":"Лицензия и обновления (ADR 0023, 0024). Публичный сайт работает при любом состоянии лицензии.","name":"license"},{"description":"Связь с сетью alted (ADR 0025) — новости и мероприятия в сеть, онлайн-проверка лицензии.","name":"network"},{"description":"Заказы и оплаты (ADR 0021, 0022). Цены, возвраты и ключи терминала моделям недоступны ни при какой области ключа.","name":"orders"},{"name":"layout"},{"description":"MCP-сервер для моделей (ADR 0030)","name":"mcp"},{"description":"Вход чатов в MCP-сервер по OAuth 2.1 с PKCE (ADR 0030); токен — ключ API со сроком","name":"oauth"},{"description":"Помощник в админке — модель по ключу API клиента правит сайт в разговоре (ADR 0034). Без возможности лицензии `ai` все ручки отвечают `403 feature_off` (ADR 0049)","name":"assistant"},{"description":"Помощь владельцу клуба — как делать в админке обычные дела (ADR 0042)","name":"help"},{"description":"Публичный слой для ИИ и машин (ADR 0019). Кроме этих ручек — `/llms.txt`,\n`/llms-full.txt` (и с префиксом языка), `/sitemap.xml`, `/robots.txt`,\nстраница `/dlya-ii/`, JSON-LD schema.org на страницах.\n","name":"public"}]}