{"openapi":"3.1.0","info":{"title":"OTTO NOTE API","description":"MVP Stage 1 foundation (продуктовая спецификация — см. DOKI: PDF «План работ», DOCX «Инструкция по работе с OTTO NOTE»).","version":"0.1.0"},"paths":{"/auth/register":{"post":{"tags":["auth"],"summary":"Register","operationId":"register_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserPublic"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login":{"post":{"tags":["auth"],"summary":"Login","operationId":"login_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPair"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/refresh":{"post":{"tags":["auth"],"summary":"Refresh","description":"Exchange a valid refresh token for a new access + refresh token pair.","operationId":"refresh_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPair"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/me":{"get":{"tags":["auth"],"summary":"Get Me","description":"Текущий пользователь (email для кабинета и UI без раскодировки sub).","operationId":"get_me_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserPublic"}}}}},"security":[{"HTTPBearer":[]}]}},"/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","description":"Revoke the given refresh token (server-side logout).","operationId":"logout_auth_logout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshPayload"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/auth/forgot-password":{"post":{"tags":["auth"],"summary":"Forgot Password","description":"Create reset token and send email (falls back to token in response if SMTP not configured).","operationId":"forgot_password_auth_forgot_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotPasswordPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Forgot Password Auth Forgot Password Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/me/password":{"patch":{"tags":["auth"],"summary":"Change Password","description":"Сменить свой пароль по текущему. Не требует SMTP/reset-токена.","operationId":"change_password_auth_me_password_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Change Password Auth Me Password Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/auth/reset-password":{"post":{"tags":["auth"],"summary":"Reset Password","description":"Reset password using token from forgot-password.","operationId":"reset_password_auth_reset_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetPasswordPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Reset Password Auth Reset Password Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/profiles/children":{"get":{"tags":["profiles"],"summary":"List Children","operationId":"list_children_profiles_children_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ChildPublic"},"type":"array","title":"Response List Children Profiles Children Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["profiles"],"summary":"Create Child","operationId":"create_child_profiles_children_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChildCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChildPublic"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/profiles/children/{child_id}":{"get":{"tags":["profiles"],"summary":"Get Child","operationId":"get_child_profiles_children__child_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"child_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Child Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChildPublic"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["profiles"],"summary":"Update Child","operationId":"update_child_profiles_children__child_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"child_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Child Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChildUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChildPublic"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["profiles"],"summary":"Delete Child","description":"Удаляет ребёнка и все зависимые записи (прогресс, награды, аудио,\nтелеметрия, членство в группах). FK без ON DELETE CASCADE — чистим явно,\nчтобы не получить IntegrityError на детях с реальной историей.","operationId":"delete_child_profiles_children__child_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"child_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Child Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/media/upload":{"post":{"tags":["media"],"summary":"Upload Media","operationId":"upload_media_media_upload_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"episode_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Episode Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_media_media_upload_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/media/voice/upload":{"post":{"tags":["media"],"summary":"Upload Voice Media","operationId":"upload_voice_media_media_voice_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_voice_media_media_voice_upload_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceUploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/media/{media_id}/download":{"get":{"tags":["media"],"summary":"Download Media","description":"Redirect to presigned S3 URL for the media file. Public — bucket is already open for anonymous reads.","operationId":"download_media_media__media_id__download_get","parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Media Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users":{"get":{"tags":["admin"],"summary":"List Users","description":"List all users with role codes (admin only).","operationId":"list_users_admin_users_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Users Admin Users Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/admin/users/{user_id}/roles/{role_code}":{"post":{"tags":["admin"],"summary":"Assign Role","description":"Assign role to user (admin only).","operationId":"assign_role_admin_users__user_id__roles__role_code__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"role_code","in":"path","required":true,"schema":{"type":"string","title":"Role Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Assign Role Admin Users  User Id  Roles  Role Code  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Remove Role","description":"Remove role from user (admin only).","operationId":"remove_role_admin_users__user_id__roles__role_code__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"role_code","in":"path","required":true,"schema":{"type":"string","title":"Role Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Remove Role Admin Users  User Id  Roles  Role Code  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/children/{child_id}/skill_level":{"patch":{"tags":["admin"],"summary":"Set Child Skill Level Admin","description":"Установить уровень адаптации `skill_level` для ребёнка (low/mid/high).\n\nПринимаются также legacy-обозначения MIN/STD/EXT (нормализуются).\nПередайте `null`, чтобы сбросить уровень (тогда адаптация отключится\nи применится дефолт «mid»).","operationId":"set_child_skill_level_admin_admin_children__child_id__skill_level_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"child_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Child Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_AdminChildSkillLevelPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Set Child Skill Level Admin Admin Children  Child Id  Skill Level Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/children":{"get":{"tags":["admin"],"summary":"List Children Admin","description":"List all children with parent account info (admin only).","operationId":"list_children_admin_admin_children_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Children Admin Admin Children Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/admin/children/{child_id}/assign-adventure":{"post":{"tags":["admin"],"summary":"Assign Adventure To Child","description":"Создаёт прогресс по всем эпизодам приключения (или сбрасывает при reset).","operationId":"assign_adventure_to_child_admin_children__child_id__assign_adventure_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"child_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Child Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignAdventurePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Assign Adventure To Child Admin Children  Child Id  Assign Adventure Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/children/{child_id}/assign-episode":{"post":{"tags":["admin"],"summary":"Assign Episode To Child","description":"Assign (or re-assign) an episode to a child. Admin bypasses ownership check.","operationId":"assign_episode_to_child_admin_children__child_id__assign_episode_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"child_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Child Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignEpisodePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Assign Episode To Child Admin Children  Child Id  Assign Episode Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/children/{child_id}/episodes":{"get":{"tags":["admin"],"summary":"List Child Episodes","description":"List all episodes assigned (with progress) for a child. Admin only.","operationId":"list_child_episodes_admin_children__child_id__episodes_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"child_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Child Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Child Episodes Admin Children  Child Id  Episodes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/adventures/assign-bulk":{"post":{"tags":["admin"],"summary":"Assign Adventure Bulk","description":"Назначает приключение списку детей одним вызовом.","operationId":"assign_adventure_bulk_admin_adventures_assign_bulk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkAssignAdventurePayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Assign Adventure Bulk Admin Adventures Assign Bulk Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/admin/children/{child_id}/audio-results":{"get":{"tags":["admin"],"summary":"List Child Audio Results","description":"Список голосовых записей ребёнка с метриками оценки.","operationId":"list_child_audio_results_admin_children__child_id__audio_results_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"child_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Child Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Child Audio Results Admin Children  Child Id  Audio Results Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/audio-results/{audio_id}/url":{"get":{"tags":["admin"],"summary":"Get Audio Result Url","description":"Presigned URL на S3-объект записи (1 час).","operationId":"get_audio_result_url_admin_audio_results__audio_id__url_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"audio_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Audio Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Audio Result Url Admin Audio Results  Audio Id  Url Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/media/consistency-check":{"get":{"tags":["admin"],"summary":"Check Media Consistency","description":"Проверяет консистентность между записями Media в БД и файлами в S3.\n\nНаходит:\n- orphan_s3_files: файлы в S3 без записей в БД\n- orphan_db_records: записи в БД без файлов в S3","operationId":"check_media_consistency_admin_media_consistency_check_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Check Media Consistency Admin Media Consistency Check Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/admin/rewards/progress":{"get":{"tags":["admin"],"summary":"List Rewards Progress","description":"Прогресс букв OTTO NOTE и подарков по всем детям.","operationId":"list_rewards_progress_admin_rewards_progress_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Rewards Progress Admin Rewards Progress Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/admin/system/audio-health":{"get":{"tags":["admin"],"summary":"System Audio Health","description":"Проверяет доступность librosa/numpy для голосового анализа.\n\nЕсли что-то из этого недоступно — `audio_analyzer` использует упрощённый\nfallback, и метрики высоты/длительности будут грубыми.","operationId":"system_audio_health_admin_system_audio_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response System Audio Health Admin System Audio Health Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/admin/metrics/summary":{"get":{"tags":["admin"],"summary":"Metrics Summary","description":"Сводка метрик для админ-дашборда (за последние N дней, по умолчанию 7).","operationId":"metrics_summary_admin_metrics_summary_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":7,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Metrics Summary Admin Metrics Summary Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/content/interaction-types":{"get":{"tags":["content"],"summary":"List Interaction Types","description":"Get all registered interaction types (game templates).","operationId":"list_interaction_types_content_interaction_types_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Interaction Types Content Interaction Types Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/content/interaction-types/{code}":{"get":{"tags":["content"],"summary":"Get Interaction Type","description":"Get a specific interaction type by code.","operationId":"get_interaction_type_content_interaction_types__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Interaction Type Content Interaction Types  Code  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/content/validation-rules":{"get":{"tags":["content"],"summary":"Get Validation Rules","description":"Get content validation rules for all interaction types.","operationId":"get_validation_rules_content_validation_rules_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Validation Rules Content Validation Rules Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/content/worlds":{"get":{"tags":["content"],"summary":"List Worlds","operationId":"list_worlds_content_worlds_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Worlds Content Worlds Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["content"],"summary":"Create World","operationId":"create_world_content_worlds_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorldCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create World Content Worlds Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/content/worlds/{world_id}":{"get":{"tags":["content"],"summary":"Get World","operationId":"get_world_content_worlds__world_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"world_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"World Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get World Content Worlds  World Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["content"],"summary":"Update World","operationId":"update_world_content_worlds__world_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"world_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"World Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorldPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update World Content Worlds  World Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["content"],"summary":"Delete World","operationId":"delete_world_content_worlds__world_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"world_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"World Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/content/worlds/{world_id}/adventures":{"get":{"tags":["content"],"summary":"List Adventures","operationId":"list_adventures_content_worlds__world_id__adventures_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"world_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"World Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Adventures Content Worlds  World Id  Adventures Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["content"],"summary":"Create Adventure","operationId":"create_adventure_content_worlds__world_id__adventures_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"world_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"World Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdventureCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Adventure Content Worlds  World Id  Adventures Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/content/adventures/{adventure_id}":{"get":{"tags":["content"],"summary":"Get Adventure","operationId":"get_adventure_content_adventures__adventure_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"adventure_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Adventure Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Adventure Content Adventures  Adventure Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["content"],"summary":"Update Adventure","operationId":"update_adventure_content_adventures__adventure_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"adventure_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Adventure Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdventurePatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Adventure Content Adventures  Adventure Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["content"],"summary":"Delete Adventure","operationId":"delete_adventure_content_adventures__adventure_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"adventure_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Adventure Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/content/adventures/{adventure_id}/episodes":{"get":{"tags":["content"],"summary":"List Episodes","operationId":"list_episodes_content_adventures__adventure_id__episodes_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"adventure_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Adventure Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Episodes Content Adventures  Adventure Id  Episodes Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["content"],"summary":"Create Episode","operationId":"create_episode_content_adventures__adventure_id__episodes_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"adventure_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Adventure Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EpisodeCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Episode Content Adventures  Adventure Id  Episodes Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/content/episodes/{episode_id}":{"get":{"tags":["content"],"summary":"Get Episode","operationId":"get_episode_content_episodes__episode_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"episode_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Episode Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Episode Content Episodes  Episode Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["content"],"summary":"Update Episode","operationId":"update_episode_content_episodes__episode_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"episode_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Episode Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EpisodePatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Episode Content Episodes  Episode Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["content"],"summary":"Delete Episode","operationId":"delete_episode_content_episodes__episode_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"episode_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Episode Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/content/episodes/{episode_id}/items":{"get":{"tags":["content"],"summary":"List Episode Items","operationId":"list_episode_items_content_episodes__episode_id__items_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"episode_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Episode Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Episode Items Content Episodes  Episode Id  Items Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["content"],"summary":"Add Episode Item","operationId":"add_episode_item_content_episodes__episode_id__items_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"episode_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Episode Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EpisodeItemCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Episode Item Content Episodes  Episode Id  Items Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["content"],"summary":"Replace Episode Items","operationId":"replace_episode_items_content_episodes__episode_id__items_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"episode_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Episode Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EpisodeItemsReplace"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Replace Episode Items Content Episodes  Episode Id  Items Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/content/episode-items/{item_id}":{"patch":{"tags":["content"],"summary":"Update Episode Item","operationId":"update_episode_item_content_episode_items__item_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EpisodeItemUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Episode Item Content Episode Items  Item Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["content"],"summary":"Delete Episode Item","operationId":"delete_episode_item_content_episode_items__item_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Item Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/content/audit":{"get":{"tags":["content"],"summary":"List Cms Audit Log","operationId":"list_cms_audit_log_content_audit_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"entity_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Entity Type"}},{"name":"entity_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Entity Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Cms Audit Log Content Audit Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/content/media":{"get":{"tags":["content"],"summary":"List Media","description":"Список медиа для гостя/плеера: ``public_url`` — прямой URL в S3 (быстрее, без редиректа через API).","operationId":"list_media_content_media_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Media Content Media Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/content/media/{media_id}":{"delete":{"tags":["content"],"summary":"Delete Media Item","description":"Удаляет запись медиа из БД и (по умолчанию) объект в S3.\n\npurge_s3=False оставляет файл в бакете — полезно, если на тот же объект\nмогут ссылаться другие записи media с тем же key.","operationId":"delete_media_item_content_media__media_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Media Id"}},{"name":"purge_s3","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Purge S3"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/runtime/children/{child_id}/episodes/{episode_id}":{"get":{"tags":["runtime"],"summary":"Get Episode For Child","description":"Return episode + items + media for Universal Player. Own children or admin preview.","operationId":"get_episode_for_child_runtime_children__child_id__episodes__episode_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"child_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Child Id"}},{"name":"episode_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Episode Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Episode For Child Runtime Children  Child Id  Episodes  Episode Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/runtime/items/{item_id}/preview":{"get":{"tags":["runtime"],"summary":"Preview Item For Level","description":"Возвращает `params_json` сцены, прогнанный через `adapt_params(level)`.\n\nПараметр `level` — `low`, `mid`, `high` (или legacy MIN/STD/EXT). Если не задан\nили невалиден — возвращаются базовые параметры без адаптации.","operationId":"preview_item_for_level_runtime_items__item_id__preview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Item Id"}},{"name":"level","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Level"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Preview Item For Level Runtime Items  Item Id  Preview Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/progress/children/{child_id}/episodes/{episode_id}":{"get":{"tags":["progress"],"summary":"Get Progress","description":"Get progress for resume (step index, state).","operationId":"get_progress_progress_children__child_id__episodes__episode_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"child_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Child Id"}},{"name":"episode_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Episode Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Progress Progress Children  Child Id  Episodes  Episode Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/progress/children/{child_id}":{"post":{"tags":["progress"],"summary":"Write Progress","description":"Write progress (upsert by child_id + episode_id).","operationId":"write_progress_progress_children__child_id__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"child_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Child Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProgressWrite"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Write Progress Progress Children  Child Id  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/progress/children/{child_id}/sync":{"post":{"tags":["progress"],"summary":"Sync Progress","description":"Batch sync progress from offline queue. Upserts all, keeps highest step.","operationId":"sync_progress_progress_children__child_id__sync_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"child_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Child Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchProgressSync"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Sync Progress Progress Children  Child Id  Sync Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/telemetry/events":{"post":{"tags":["telemetry"],"summary":"Ingest Event","description":"Ingest one telemetry event. Only for own children.","operationId":"ingest_event_telemetry_events_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventIngest"}}},"required":true},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/telemetry/events/batch":{"post":{"tags":["telemetry"],"summary":"Ingest Batch","description":"Batch upload events (offline sync). Skips duplicates by event_id.","operationId":"ingest_batch_telemetry_events_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchEventIngest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Ingest Batch Telemetry Events Batch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/telemetry/event-types":{"get":{"tags":["telemetry"],"summary":"List Event Types","description":"Get canonical event type taxonomy.","operationId":"list_event_types_telemetry_event_types_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Event Types Telemetry Event Types Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/telemetry/export/json":{"get":{"tags":["telemetry"],"summary":"Export Events Json","operationId":"export_events_json_telemetry_export_json_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":500,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Export Events Json Telemetry Export Json Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/telemetry/export/csv":{"get":{"tags":["telemetry"],"summary":"Export Events Csv","operationId":"export_events_csv_telemetry_export_csv_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":500,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/telemetry/posthog/status":{"get":{"tags":["telemetry"],"summary":"Posthog Status","operationId":"posthog_status_telemetry_posthog_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Posthog Status Telemetry Posthog Status Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/rewards/children/{child_id}":{"get":{"tags":["rewards"],"summary":"Get Reward Progress","operationId":"get_reward_progress_rewards_children__child_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"child_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Child Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Reward Progress Rewards Children  Child Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/rewards/children/{child_id}/grant":{"post":{"tags":["rewards"],"summary":"Grant Letters","operationId":"grant_letters_rewards_children__child_id__grant_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"child_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Child Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RewardGrantRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Grant Letters Rewards Children  Child Id  Grant Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/rewards/admin/progress":{"get":{"tags":["rewards"],"summary":"List Reward Progress All Admin","description":"Сводка прогресса букв OTTO NOTE по всем детям (только админ).\n\nДублирует ответ `GET /admin/rewards/progress`, чтобы запрос шёл в префикс\n`/rewards` (удобно при прокси/кэшах, где путь `/admin/...` может отличаться).","operationId":"list_reward_progress_all_admin_rewards_admin_progress_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response List Reward Progress All Admin Rewards Admin Progress Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/evaluate/voice":{"post":{"tags":["evaluate"],"summary":"Evaluate Voice","operationId":"evaluate_voice_evaluate_voice_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceEvaluateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoiceEvaluateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/diagnostic/children/{child_id}/evaluate":{"post":{"tags":["diagnostic"],"summary":"Evaluate Child Diagnostic","operationId":"evaluate_child_diagnostic_diagnostic_children__child_id__evaluate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"child_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Child Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiagnosticEvaluateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiagnosticEvaluateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/subscription":{"get":{"tags":["billing"],"summary":"Get Subscription","description":"Return current user subscription status.","operationId":"get_subscription_billing_subscription_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Subscription Billing Subscription Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/billing/checkout":{"post":{"tags":["billing"],"summary":"Create Checkout","description":"Create checkout session (stub provider).","operationId":"create_checkout_billing_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Checkout Billing Checkout Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/billing/webhook":{"post":{"tags":["billing"],"summary":"Billing Webhook","description":"Update subscription from provider webhook.","operationId":"billing_webhook_billing_webhook_post","parameters":[{"name":"x-billing-secret","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Billing-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Billing Webhook Billing Webhook Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/cabinet/parent":{"get":{"tags":["cabinet"],"summary":"Parent Cabinet","description":"Children list + progress summary (completed episodes count per child).","operationId":"parent_cabinet_cabinet_parent_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Parent Cabinet Cabinet Parent Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/cabinet/parent/report":{"get":{"tags":["cabinet"],"summary":"Parent Report","operationId":"parent_report_cabinet_parent_report_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Parent Report Cabinet Parent Report Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/cabinet/teacher":{"get":{"tags":["cabinet"],"summary":"Teacher Cabinet","description":"Groups with students and aggregated progress (MVP: list groups and member count).","operationId":"teacher_cabinet_cabinet_teacher_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Teacher Cabinet Cabinet Teacher Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/cabinet/teacher/report":{"get":{"tags":["cabinet"],"summary":"Teacher Report","operationId":"teacher_report_cabinet_teacher_report_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Teacher Report Cabinet Teacher Report Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/cabinet/teacher/groups":{"post":{"tags":["cabinet"],"summary":"Create Group","operationId":"create_group_cabinet_teacher_groups_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Create Group Cabinet Teacher Groups Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/cabinet/teacher/groups/{group_id}/members":{"post":{"tags":["cabinet"],"summary":"Add Group Member","operationId":"add_group_member_cabinet_teacher_groups__group_id__members_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddMemberBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Add Group Member Cabinet Teacher Groups  Group Id  Members Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notifications/send-test":{"post":{"tags":["notifications"],"summary":"Send Test Notification","operationId":"send_test_notification_notifications_send_test_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationSendPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Send Test Notification Notifications Send Test Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/notifications/inactivity":{"get":{"tags":["notifications"],"summary":"Inactivity Report","operationId":"inactivity_report_notifications_inactivity_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":7,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Inactivity Report Notifications Inactivity Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/notifications/inactivity/notify":{"post":{"tags":["notifications"],"summary":"Notify Inactive Children","operationId":"notify_inactive_children_notifications_inactivity_notify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InactivityNotifyPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Notify Inactive Children Notifications Inactivity Notify Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/healthz":{"get":{"summary":"Healthz","operationId":"healthz_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Healthz Healthz Get"}}}}}}}},"components":{"schemas":{"AddMemberBody":{"properties":{"child_id":{"type":"string","format":"uuid","title":"Child Id"}},"type":"object","required":["child_id"],"title":"AddMemberBody"},"AdventureCreate":{"properties":{"code":{"type":"string","maxLength":64,"minLength":1,"title":"Code"},"title":{"type":"string","maxLength":255,"title":"Title"},"sort_order":{"type":"integer","title":"Sort Order","default":0},"cover_image":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Cover Image"}},"type":"object","required":["code","title"],"title":"AdventureCreate"},"AdventurePatch":{"properties":{"code":{"anyOf":[{"type":"string","maxLength":64,"minLength":1},{"type":"null"}],"title":"Code"},"title":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Title"},"sort_order":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Sort Order"},"cover_image":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Cover Image"}},"type":"object","title":"AdventurePatch"},"AssignAdventurePayload":{"properties":{"adventure_id":{"type":"string","format":"uuid","title":"Adventure Id"},"reset":{"type":"boolean","title":"Reset","default":false}},"type":"object","required":["adventure_id"],"title":"AssignAdventurePayload"},"AssignEpisodePayload":{"properties":{"episode_id":{"type":"string","format":"uuid","title":"Episode Id"},"reset":{"type":"boolean","title":"Reset","default":false}},"type":"object","required":["episode_id"],"title":"AssignEpisodePayload"},"BatchEventIngest":{"properties":{"events":{"items":{"$ref":"#/components/schemas/EventIngest"},"type":"array","maxItems":500,"minItems":1,"title":"Events"}},"type":"object","required":["events"],"title":"BatchEventIngest"},"BatchProgressSync":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ProgressWrite"},"type":"array","maxItems":200,"minItems":1,"title":"Items"}},"type":"object","required":["items"],"title":"BatchProgressSync"},"Body_upload_media_media_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_media_media_upload_post"},"Body_upload_voice_media_media_voice_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_voice_media_media_voice_upload_post"},"BulkAssignAdventurePayload":{"properties":{"adventure_id":{"type":"string","format":"uuid","title":"Adventure Id"},"child_ids":{"items":{"type":"string","format":"uuid"},"type":"array","minItems":1,"title":"Child Ids"},"reset":{"type":"boolean","title":"Reset","default":false}},"type":"object","required":["adventure_id","child_ids"],"title":"BulkAssignAdventurePayload"},"ChangePasswordPayload":{"properties":{"old_password":{"type":"string","maxLength":128,"minLength":1,"title":"Old Password"},"new_password":{"type":"string","maxLength":128,"minLength":8,"title":"New Password"}},"type":"object","required":["old_password","new_password"],"title":"ChangePasswordPayload"},"CheckoutRequest":{"properties":{"plan_code":{"type":"string","maxLength":32,"title":"Plan Code","default":"monthly"},"success_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Success Url"},"cancel_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancel Url"}},"type":"object","title":"CheckoutRequest"},"ChildCreate":{"properties":{"code":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[a-zA-Z0-9_-]+$","title":"Code","description":"Только латиница, цифры, дефис и подчёркивание."},"display_name":{"type":"string","maxLength":120,"minLength":1,"title":"Display Name"},"birth_year":{"anyOf":[{"type":"integer","maximum":2100.0,"minimum":1900.0},{"type":"null"}],"title":"Birth Year"}},"type":"object","required":["code","display_name"],"title":"ChildCreate"},"ChildPublic":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"adult_id":{"type":"string","format":"uuid","title":"Adult Id"},"code":{"type":"string","title":"Code"},"display_name":{"type":"string","title":"Display Name"},"birth_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Birth Year"},"skill_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Skill Level"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","adult_id","code","display_name","birth_year","skill_level","created_at"],"title":"ChildPublic"},"ChildUpdate":{"properties":{"display_name":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Display Name"},"birth_year":{"anyOf":[{"type":"integer","maximum":2100.0,"minimum":1900.0},{"type":"null"}],"title":"Birth Year"},"skill_level":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Skill Level"}},"type":"object","title":"ChildUpdate"},"DiagnosticEvaluateRequest":{"properties":{"sample_size":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Sample Size","default":10}},"type":"object","title":"DiagnosticEvaluateRequest"},"DiagnosticEvaluateResponse":{"properties":{"child_id":{"type":"string","format":"uuid","title":"Child Id"},"skill_level":{"type":"string","title":"Skill Level"},"sample_size":{"type":"integer","title":"Sample Size"},"avg_score":{"type":"number","title":"Avg Score"},"recent_scores":{"items":{"type":"number"},"type":"array","title":"Recent Scores"}},"type":"object","required":["child_id","skill_level","sample_size","avg_score","recent_scores"],"title":"DiagnosticEvaluateResponse"},"EpisodeCreate":{"properties":{"code":{"type":"string","maxLength":64,"minLength":1,"title":"Code"},"title":{"type":"string","maxLength":255,"title":"Title"},"sort_order":{"type":"integer","title":"Sort Order","default":0},"cover_image":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Cover Image"}},"type":"object","required":["code","title"],"title":"EpisodeCreate"},"EpisodeItemCreate":{"properties":{"sort_order":{"type":"integer","title":"Sort Order"},"template_code":{"type":"string","maxLength":64,"title":"Template Code"},"interaction_type_code":{"type":"string","maxLength":64,"title":"Interaction Type Code"},"media_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Code"},"params_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Params Json"}},"type":"object","required":["sort_order","template_code","interaction_type_code"],"title":"EpisodeItemCreate"},"EpisodeItemUpdate":{"properties":{"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"},"template_code":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Template Code"},"interaction_type_code":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Interaction Type Code"},"media_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Media Code"},"params_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Params Json"}},"type":"object","title":"EpisodeItemUpdate"},"EpisodeItemsReplace":{"properties":{"items":{"items":{"$ref":"#/components/schemas/EpisodeItemCreate"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"EpisodeItemsReplace"},"EpisodePatch":{"properties":{"code":{"anyOf":[{"type":"string","maxLength":64,"minLength":1},{"type":"null"}],"title":"Code"},"title":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Title"},"sort_order":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Sort Order"},"cover_image":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Cover Image"},"adventure_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Adventure Id"}},"type":"object","title":"EpisodePatch"},"EventIngest":{"properties":{"event_id":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Event Id"},"child_id":{"type":"string","format":"uuid","title":"Child Id"},"episode_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Episode Id"},"step_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Step Index"},"event_type":{"type":"string","maxLength":64,"title":"Event Type"},"payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload"}},"type":"object","required":["child_id","event_type"],"title":"EventIngest"},"ForgotPasswordPayload":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"ForgotPasswordPayload"},"GroupCreate":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"GroupCreate"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"InactivityNotifyPayload":{"properties":{"days":{"type":"integer","maximum":60.0,"minimum":1.0,"title":"Days","default":7},"channel":{"type":"string","pattern":"^(telegram|email)$","title":"Channel","default":"telegram"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"}},"type":"object","title":"InactivityNotifyPayload"},"LoginPayload":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password"}},"type":"object","required":["email","password"],"title":"LoginPayload"},"MediaUploadResponse":{"properties":{"bucket":{"type":"string","title":"Bucket"},"key":{"type":"string","title":"Key"},"url":{"type":"string","title":"Url"}},"type":"object","required":["bucket","key","url"],"title":"MediaUploadResponse"},"NotificationSendPayload":{"properties":{"channel":{"type":"string","pattern":"^(email|telegram)$","title":"Channel"},"message":{"type":"string","maxLength":1000,"minLength":1,"title":"Message"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"}},"type":"object","required":["channel","message"],"title":"NotificationSendPayload"},"ProgressWrite":{"properties":{"episode_id":{"type":"string","format":"uuid","title":"Episode Id"},"current_step_index":{"type":"integer","minimum":0.0,"title":"Current Step Index"},"completed":{"type":"boolean","title":"Completed","default":false},"state":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"State"}},"type":"object","required":["episode_id","current_step_index"],"title":"ProgressWrite"},"RefreshPayload":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"RefreshPayload"},"ResetPasswordPayload":{"properties":{"token":{"type":"string","title":"Token"},"new_password":{"type":"string","maxLength":128,"minLength":8,"title":"New Password"}},"type":"object","required":["token","new_password"],"title":"ResetPasswordPayload"},"RewardGrantRequest":{"properties":{"amount":{"type":"integer","maximum":3.0,"minimum":1.0,"title":"Amount","default":1},"reason":{"type":"string","maxLength":64,"minLength":1,"title":"Reason","default":"episode_completed"},"grant_key":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Grant Key"}},"type":"object","title":"RewardGrantRequest"},"TokenPair":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"expires_in":{"type":"integer","title":"Expires In","default":0}},"type":"object","required":["access_token","refresh_token"],"title":"TokenPair"},"UserCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":128,"minLength":8,"title":"Password"}},"type":"object","required":["email","password"],"title":"UserCreate"},"UserPublic":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","format":"email","title":"Email"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","email","created_at"],"title":"UserPublic"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VoiceEvaluateDetail":{"properties":{"detected_level":{"type":"string","title":"Detected Level"},"duration_ms":{"type":"integer","title":"Duration Ms"},"in_range":{"type":"boolean","title":"In Range"}},"type":"object","required":["detected_level","duration_ms","in_range"],"title":"VoiceEvaluateDetail"},"VoiceEvaluateRequest":{"properties":{"child_id":{"type":"string","format":"uuid","title":"Child Id"},"episode_item_id":{"type":"string","format":"uuid","title":"Episode Item Id"},"game_run_id":{"type":"string","format":"uuid","title":"Game Run Id"},"audio_s3_key":{"type":"string","maxLength":1024,"minLength":1,"title":"Audio S3 Key"},"eval_mode":{"type":"string","maxLength":32,"minLength":1,"title":"Eval Mode"},"expected_ref":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Expected Ref"}},"type":"object","required":["child_id","episode_item_id","game_run_id","audio_s3_key","eval_mode"],"title":"VoiceEvaluateRequest"},"VoiceEvaluateResponse":{"properties":{"eval_score":{"type":"number","title":"Eval Score"},"eval_mode":{"type":"string","title":"Eval Mode"},"stt_text":{"type":"string","title":"Stt Text"},"detail":{"$ref":"#/components/schemas/VoiceEvaluateDetail"},"audio_result_id":{"type":"string","format":"uuid","title":"Audio Result Id"}},"type":"object","required":["eval_score","eval_mode","stt_text","detail","audio_result_id"],"title":"VoiceEvaluateResponse"},"VoiceUploadResponse":{"properties":{"s3_key":{"type":"string","title":"S3 Key"},"bucket":{"type":"string","title":"Bucket"},"mime_type":{"type":"string","title":"Mime Type"},"size_bytes":{"type":"integer","title":"Size Bytes"},"url":{"type":"string","title":"Url"}},"type":"object","required":["s3_key","bucket","mime_type","size_bytes","url"],"title":"VoiceUploadResponse"},"WebhookPayload":{"properties":{"email":{"type":"string","title":"Email"},"status":{"type":"string","pattern":"^(active|expired|cancelled|trial)$","title":"Status"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["email","status"],"title":"WebhookPayload"},"WorldCreate":{"properties":{"code":{"type":"string","maxLength":64,"minLength":1,"title":"Code"},"title":{"type":"string","maxLength":255,"title":"Title"},"sort_order":{"type":"integer","title":"Sort Order","default":0},"background_image":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Background Image"},"cover_image":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Cover Image"}},"type":"object","required":["code","title"],"title":"WorldCreate"},"WorldPatch":{"properties":{"code":{"anyOf":[{"type":"string","maxLength":64,"minLength":1},{"type":"null"}],"title":"Code"},"title":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Title"},"sort_order":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Sort Order"},"background_image":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Background Image"},"cover_image":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Cover Image"}},"type":"object","title":"WorldPatch"},"_AdminChildSkillLevelPayload":{"properties":{"skill_level":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Skill Level"}},"type":"object","title":"_AdminChildSkillLevelPayload"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}