{"openapi":"3.1.0","info":{"title":"GhostMarket Backend","version":"0.1.0"},"paths":{"/api/products/":{"post":{"tags":["Products"],"summary":"Создать товар","description":"Создает новый товар в каталоге.\nДоступно **только администраторам** системы (is_superuser=True).","operationId":"create_product_api_products__post","security":[{"CookieAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCreate"}}}},"responses":{"201":{"description":"Товар успешно создан","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductResponse"}}}},"400":{"description":"Невалидные входные данные","content":{"application/json":{"example":{"detail":"Длина должна быть больше нуля"}}}},"401":{"description":"Не авторизован","content":{"application/json":{"example":{"detail":"Сессия устарела или токен отсутствует"}}}},"403":{"description":"Недостаточно прав","content":{"application/json":{"example":{"detail":"Недостаточно прав для выполнения этой операции."}}}},"409":{"description":"Конфликт данных","content":{"application/json":{"example":{"detail":"Товар с таким именем или слагом уже существует"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Products"],"summary":"Получить список товаров","description":"Возвращает список всех товаров с учетом переданных фильтров (поиск по имени, количеству).\nДля обычных пользователей и гостей автоматически скрываются неактивные товары (`is_active=True`).","operationId":"get_products_api_products__get","security":[{"CookieAuth":[]}],"parameters":[{"name":"name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},{"name":"quantity","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quantity"}},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}}],"responses":{"200":{"description":"Список товаров успешно получен","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/products/{product_id}/":{"get":{"tags":["Products"],"summary":"Получить товар по ID","description":"Возвращает детальную информацию о конкретном товаре по его идентификатору.\nГости и обычные пользователи видят **только активные** товары (`is_active=True`).\nАдминистратор видит **все** товары, включая деактивированные.","operationId":"get_product_api_products__product_id___get","security":[{"CookieAuth":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}}],"responses":{"200":{"description":"Информация о товаре получена","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductResponse"}}}},"404":{"description":"Товар не найден","content":{"application/json":{"example":{"detail":"Товар не найден"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Products"],"summary":"Удалить товар","description":"Удаляет товар по его уникальному ID.\nДоступно **только администраторам** системы.","operationId":"delete_product_api_products__product_id___delete","security":[{"CookieAuth":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}}],"responses":{"204":{"description":"Товар успешно удален"},"401":{"description":"Не авторизован"},"403":{"description":"Недостаточно прав"},"404":{"description":"Товар не найден","content":{"application/json":{"example":{"detail":"Товар не найден"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Products"],"summary":"Частично обновить товар","description":"Обновляет только переданные поля товара (PATCH).\nДоступно **только администраторам** системы.","operationId":"partially_update_product_api_products__product_id___patch","security":[{"CookieAuth":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPartiallyUpdate"}}}},"responses":{"200":{"description":"Товар успешно обновлен","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductResponse"}}}},"401":{"description":"Не авторизован"},"403":{"description":"Недостаточно прав"},"404":{"description":"Товар не найден","content":{"application/json":{"example":{"detail":"Товар не найден"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Products"],"summary":"Полностью обновить товар","description":"Полностью заменяет все поля товара (PUT).\nДоступно **только администраторам** системы.","operationId":"update_product_api_products__product_id___put","security":[{"CookieAuth":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductUpdate"}}}},"responses":{"200":{"description":"Товар успешно обновлен полностью","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductResponse"}}}},"401":{"description":"Не авторизован"},"403":{"description":"Недостаточно прав"},"404":{"description":"Товар не найден","content":{"application/json":{"example":{"detail":"Товар не найден"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/products/{product_id}/translate":{"post":{"tags":["Products"],"summary":"Перевести товар (AI)","description":"Автоматически переводит название и описание товара на английский язык с использованием AI-сервиса.\nДоступно **только администраторам** системы.","operationId":"translate_product_api_products__product_id__translate_post","security":[{"CookieAuth":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}}],"responses":{"200":{"description":"Перевод успешно выполнен и сохранен","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductResponse"}}}},"401":{"description":"Не авторизован","content":{"application/json":{"example":{"detail":"Неавторизованный доступ"}}}},"403":{"description":"Недостаточно прав","content":{"application/json":{"example":{"detail":"Недостаточно прав для выполнения этой операции"}}}},"404":{"description":"Товар не найден","content":{"application/json":{"example":{"detail":"Товар не найден"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/products/{product_id}/images":{"post":{"tags":["Products"],"summary":"Загрузить изображение товара","description":"Загружает изображение с диска и привязывает его к товару.\nДоступно **только администраторам** системы.","operationId":"upload_product_images_api_products__product_id__images_post","security":[{"CookieAuth":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_product_images_api_products__product_id__images_post"}}}},"responses":{"201":{"description":"Изображение успешно сохранено и привязано","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductImageResponse"}}}},"401":{"description":"Не авторизован"},"403":{"description":"Недостаточно прав"},"404":{"description":"Товар не найден","content":{"application/json":{"example":{"detail":"Товар не найден"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/products/{product_id}/images/{image_id}":{"delete":{"tags":["Products"],"summary":"Удалить изображение товара","description":"Удаляет привязанное изображение товара.","operationId":"delete_product_image_api_products__product_id__images__image_id__delete","security":[{"CookieAuth":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}},{"name":"image_id","in":"path","required":true,"schema":{"type":"integer","title":"Image Id"}}],"responses":{"204":{"description":"Изображение успешно удалено"},"401":{"description":"Не авторизован"},"403":{"description":"Недостаточно прав"},"404":{"description":"Товар или изображение не найдено","content":{"application/json":{"example":{"detail":"Изображение товара не найдено"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/products/{product_id}/videos":{"post":{"tags":["Products"],"summary":"Загрузить видео товара","description":"Загружает видео с диска и привязывает его к товару.\nДоступно **только администраторам** системы.","operationId":"upload_product_videos_api_products__product_id__videos_post","security":[{"CookieAuth":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_product_videos_api_products__product_id__videos_post"}}}},"responses":{"201":{"description":"Видео успешно сохранено и привязано","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductVideoResponse"}}}},"401":{"description":"Не авторизован"},"403":{"description":"Недостаточно прав"},"404":{"description":"Товар не найден","content":{"application/json":{"example":{"detail":"Товар не найден"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/products/{product_id}/videos/chunk":{"post":{"tags":["Products"],"summary":"Загрузить чанк видео","operationId":"upload_video_chunk_api_products__product_id__videos_chunk_post","security":[{"CookieAuth":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_video_chunk_api_products__product_id__videos_chunk_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/products/{product_id}/videos/finish":{"post":{"tags":["Products"],"summary":"Завершить загрузку видео","operationId":"finish_video_upload_api_products__product_id__videos_finish_post","security":[{"CookieAuth":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_finish_video_upload_api_products__product_id__videos_finish_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductVideoResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/products/{product_id}/videos/{video_id}":{"patch":{"tags":["Products"],"summary":"Обновить описание видео","operationId":"update_video_description_api_products__product_id__videos__video_id__patch","security":[{"CookieAuth":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}},{"name":"video_id","in":"path","required":true,"schema":{"type":"integer","title":"Video Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductVideoUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductVideoResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Products"],"summary":"Удалить видео товара","description":"Удаляет привязанное видео товара.","operationId":"delete_product_video_api_products__product_id__videos__video_id__delete","security":[{"CookieAuth":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}},{"name":"video_id","in":"path","required":true,"schema":{"type":"integer","title":"Video Id"}}],"responses":{"204":{"description":"Видео успешно удалено"},"401":{"description":"Не авторизован"},"403":{"description":"Недостаточно прав"},"404":{"description":"Товар или видео не найдено","content":{"application/json":{"example":{"detail":"Видео товара не найдено"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orders/webhooks/create":{"post":{"tags":["Orders","Webhooks"],"summary":"Create Order","description":"Создать новый заказ.\n\nДоступно любому авторизованному пользователю. На основе переданных позиций (items)\nи их количества автоматически резервируются товары на складе и рассчитывается общая стоимость.","operationId":"create_order_api_orders_webhooks_create_post","parameters":[{"name":"X-Webhook-Secret","in":"header","required":true,"schema":{"type":"string","title":"X-Webhook-Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOrderCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/orders/":{"get":{"tags":["Orders"],"summary":"Получить список заказов","description":"Возвращает список всех заказов. \nАдминистратор получает вообще все заказы в системе, обычный пользователь — только свои собственные.","operationId":"get_all_orders_api_orders__get","responses":{"200":{"description":"Список заказов успешно получен","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/OrderResponse"},"type":"array","title":"Response Get All Orders Api Orders  Get"}}}},"401":{"description":"Не авторизован"}},"security":[{"CookieAuth":[]}]},"post":{"tags":["Orders"],"summary":"Создать заказ","description":"Создает новый заказ в системе для авторизованного пользователя на основе позиций корзины.\nАвтоматически списывает товары со склада и резервирует доставку.","operationId":"create_order_api_orders__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderCreate"}}},"required":true},"responses":{"201":{"description":"Заказ успешно создан","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponse"}}}},"400":{"description":"Ошибка валидации или нехватка товаров на складе","content":{"application/json":{"example":{"detail":"Недостаточно товара с ID 1 на складе. Запрошено: 2, доступно: 1"}}}},"401":{"description":"Не авторизован","content":{"application/json":{"example":{"detail":"Сессия устарела или токен отсутствует"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"CookieAuth":[]}]}},"/api/orders/{order_id}/":{"patch":{"tags":["Orders"],"summary":"Обновить статус заказа","description":"Обновляет статус оплаты и/или трэк-номер (код доставки) заказа.\nДоступно **только администраторам** системы.","operationId":"update_order_status_api_orders__order_id___patch","security":[{"CookieAuth":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PaymentStatus"},{"type":"null"}],"title":"Status"}},{"name":"delivery_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Code"}}],"responses":{"200":{"description":"Статус заказа успешно обновлен","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponse"}}}},"401":{"description":"Не авторизован"},"403":{"description":"Недостаточно прав (не админ)"},"404":{"description":"Заказ не найден","content":{"application/json":{"example":{"detail":"Заказ с ID 123 не найден"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Orders"],"summary":"Получить заказ по ID","description":"Возвращает детальную информацию о конкретном заказе.\nОбычный пользователь имеет право видеть только свои собственные заказы. Администратор видит любые.","operationId":"get_order_api_orders__order_id___get","security":[{"CookieAuth":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"200":{"description":"Информация о заказе получена","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponse"}}}},"401":{"description":"Не авторизован"},"403":{"description":"Отказ в доступе (попытка просмотра чужого заказа)","content":{"application/json":{"example":{"detail":"Вы не имеете прав на просмотр этого заказа."}}}},"404":{"description":"Заказ не найден","content":{"application/json":{"example":{"detail":"Заказ не найден"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Orders"],"summary":"Удалить заказ","description":"Удаляет заказ из системы по его идентификатору.\nДоступно **только администраторам** системы.","operationId":"delete_order_api_orders__order_id___delete","security":[{"CookieAuth":[]}],"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}}],"responses":{"204":{"description":"Заказ успешно удален"},"401":{"description":"Не авторизован"},"403":{"description":"Недостаточно прав"},"404":{"description":"Заказ не найден","content":{"application/json":{"example":{"detail":"Заказ не найден"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login/":{"post":{"tags":["Auth"],"summary":"Login By Email","description":"Запрашивает одноразовый пароль (OTP) для входа.\nПроверяет наличие пользователя, создает запись в БД при ее отсутствии\nи отправляет код по email.","operationId":"login_by_email_api_auth_login__post","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","format":"email","title":"Email"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login/otp/":{"post":{"tags":["Auth"],"summary":"Verify Otp","description":"Проверяет переданный OTP код. Генерирует JWT пару токенов и устанавливает их в HTTP-only куки.","operationId":"verify_otp_api_auth_login_otp__post","parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","format":"email","title":"Email"}},{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/refresh":{"post":{"tags":["Auth"],"summary":"Refresh Tokens","description":"Обновляет Access-токен доступа на основе действительного Refresh-токена в куках.","operationId":"refresh_tokens_api_auth_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/logout":{"post":{"tags":["Auth"],"summary":"Logout","description":"Удаляет файлы кук авторизации (Access и Refresh токены), завершая сессию пользователя.","operationId":"logout_api_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"CookieAuth":[]}]}},"/api/auth/me":{"get":{"tags":["Auth"],"summary":"Get Profile","description":"Возвращает профиль текущего авторизованного пользователя.","operationId":"get_profile_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}}},"security":[{"CookieAuth":[]}]},"patch":{"tags":["Auth"],"summary":"Update Profile","description":"Обновляет информацию профиля текущего авторизованного пользователя.","operationId":"update_profile_api_auth_me_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"CookieAuth":[]}]}},"/api/auth/users/":{"get":{"tags":["Auth"],"summary":"List Users","description":"Возвращает список всех зарегистрированных пользователей.\nДоступно только суперпользователям.","operationId":"list_users_api_auth_users__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UserResponse"},"type":"array","title":"Response List Users Api Auth Users  Get"}}}}},"security":[{"CookieAuth":[]}]}},"/api/auth/users/{user_id}/":{"get":{"tags":["Auth"],"summary":"Get User Detail","description":"Возвращает детальную информацию о пользователе по его ID.\nДоступно только суперпользователям.","operationId":"get_user_detail_api_auth_users__user_id___get","security":[{"CookieAuth":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Auth"],"summary":"Partial Update User","description":"Частично обновляет данные пользователя по его ID (кроме telegram_chat_id).\nДоступно только суперпользователям.","operationId":"partial_update_user_api_auth_users__user_id___patch","security":[{"CookieAuth":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Auth"],"summary":"Full Update User","description":"Полностью обновляет данные пользователя по его ID (замена всех полей, кроме telegram_chat_id).\nДоступно только суперпользователям.","operationId":"full_update_user_api_auth_users__user_id___put","security":[{"CookieAuth":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUserReplace"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cdek/ticket":{"get":{"tags":["CDEK"],"summary":"Get Cdek Ticket","description":"Генерирует временный HMAC тикет для доступа к прокси виджета CDEK.\nДоступно только авторизованным пользователям.","operationId":"get_cdek_ticket_api_cdek_ticket_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketResponse"}}}}},"security":[{"CookieAuth":[]}]}},"/api/cdek/proxy/{path}":{"post":{"tags":["CDEK"],"summary":"Cdek Proxy","operationId":"cdek_proxy_api_cdek_proxy__path__post","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/CDEKAction"},{"type":"null"}],"title":"Action"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["CDEK"],"summary":"Cdek Proxy","operationId":"cdek_proxy_api_cdek_proxy__path__post","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/CDEKAction"},{"type":"null"}],"title":"Action"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhooks/telegram":{"post":{"tags":["Telegram Webhook"],"summary":"Telegram Webhook","operationId":"telegram_webhook_api_webhooks_telegram_post","parameters":[{"name":"x-telegram-bot-api-secret-token","in":"header","required":false,"schema":{"type":"string","title":"X-Telegram-Bot-Api-Secret-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Update"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhooks/robokassa/result":{"get":{"tags":["Payments"],"summary":"Robokassa Result Webhook","description":"Обработчик ResultURL от Робокассы.\nПроверяет контрольную подпись по Паролю №2 и при совпадении переводит заказ в статус PAID.\nПоддерживает как GET, так и POST методы с любым регистром параметров.","operationId":"robokassa_result_webhook_api_webhooks_robokassa_result_post","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}},"post":{"tags":["Payments"],"summary":"Robokassa Result Webhook","description":"Обработчик ResultURL от Робокассы.\nПроверяет контрольную подпись по Паролю №2 и при совпадении переводит заказ в статус PAID.\nПоддерживает как GET, так и POST методы с любым регистром параметров.","operationId":"robokassa_result_webhook_api_webhooks_robokassa_result_post","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/api/health":{"get":{"summary":"Health Check","operationId":"health_check_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AdminUserReplace":{"properties":{"first_name":{"type":"string","maxLength":50,"minLength":2,"title":"First Name","description":"Имя","examples":["Иван"]},"last_name":{"type":"string","maxLength":50,"minLength":2,"title":"Last Name","description":"Фамилия","examples":["Иванов"]},"phone":{"type":"string","maxLength":30,"minLength":10,"title":"Phone","description":"Номер телефона","examples":["+79991234567"]},"specialty":{"type":"string","maxLength":100,"minLength":2,"title":"Specialty","description":"Специальность","examples":["Фотограф"]},"email":{"type":"string","format":"email","title":"Email","description":"Email адрес","examples":["user@example.com"]},"is_superuser":{"type":"boolean","title":"Is Superuser","description":"Права администратора","default":false,"examples":[false]},"locale":{"$ref":"#/components/schemas/Locale","description":"Локаль","default":"ru","examples":["ru"]},"middle_name":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Middle Name","description":"Отчество","examples":["Иванович"]},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username","description":"Имя в ТГ","examples":["telegram_user"]},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Источник регистрации","examples":["Telegram"]}},"type":"object","required":["first_name","last_name","phone","specialty","email"],"title":"AdminUserReplace"},"AdminUserUpdate":{"properties":{"first_name":{"anyOf":[{"type":"string","maxLength":50,"minLength":2},{"type":"null"}],"title":"First Name","description":"Имя","examples":["Иван"]},"last_name":{"anyOf":[{"type":"string","maxLength":50,"minLength":2},{"type":"null"}],"title":"Last Name","description":"Фамилия","examples":["Иванов"]},"middle_name":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Middle Name","description":"Отчество","examples":["Иванович"]},"phone":{"anyOf":[{"type":"string","maxLength":30,"minLength":10},{"type":"null"}],"title":"Phone","description":"Номер телефона","examples":["+79991234567"]},"specialty":{"anyOf":[{"type":"string","maxLength":100,"minLength":2},{"type":"null"}],"title":"Specialty","description":"Специальность","examples":["Фотограф"]},"locale":{"anyOf":[{"$ref":"#/components/schemas/Locale"},{"type":"null"}],"description":"Локаль","examples":["ru"]},"is_superuser":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Superuser","description":"Права администратора","examples":[false]},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username","description":"Имя в ТГ","examples":["telegram_user"]},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email","description":"Email","examples":["user@example.com"]},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Источник регистрации","examples":["Telegram"]}},"type":"object","title":"AdminUserUpdate"},"Body_finish_video_upload_api_products__product_id__videos_finish_post":{"properties":{"upload_id":{"type":"string","title":"Upload Id"},"content_type":{"type":"string","title":"Content Type"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["upload_id","content_type"],"title":"Body_finish_video_upload_api_products__product_id__videos_finish_post"},"Body_upload_product_images_api_products__product_id__images_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File","description":"Выберите фотографии для отправки"}},"type":"object","required":["file"],"title":"Body_upload_product_images_api_products__product_id__images_post"},"Body_upload_product_videos_api_products__product_id__videos_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File","description":"Выберите видео для отправки"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Краткое описание видео"}},"type":"object","required":["file"],"title":"Body_upload_product_videos_api_products__product_id__videos_post"},"Body_upload_video_chunk_api_products__product_id__videos_chunk_post":{"properties":{"upload_id":{"type":"string","title":"Upload Id"},"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["upload_id","file"],"title":"Body_upload_video_chunk_api_products__product_id__videos_chunk_post"},"CDEKAction":{"type":"string","enum":["offices","calculate","cities","regions","tariffs"],"title":"CDEKAction"},"Delivery":{"type":"string","enum":["CDEK","RUSSIAN_POST","URBAN"],"title":"Delivery"},"Dimensions":{"properties":{"length":{"type":"integer","exclusiveMinimum":0.0,"title":"Length","description":"Длина в сантиметрах."},"width":{"type":"integer","exclusiveMinimum":0.0,"title":"Width","description":"Ширина в сантиметрах."},"height":{"type":"integer","exclusiveMinimum":0.0,"title":"Height","description":"Высота в сантиметрах."}},"type":"object","required":["length","width","height"],"title":"Dimensions"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"Locale":{"type":"string","enum":["ru","en"],"title":"Locale"},"OrderCreate":{"properties":{"address":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Address","description":"Физический адрес доставки заказа. Может быть не указан, если подразумевается самовывоз или цифровой товар.","examples":["Москва, ул. Ленина, д. 5, кв. 10"]},"items":{"items":{"$ref":"#/components/schemas/OrderItemCreate"},"type":"array","minItems":1,"title":"Items","description":"Список позиций (товаров), входящих в состав оформляемого заказа. Заказ должен содержать как минимум один товар."},"delivery":{"anyOf":[{"$ref":"#/components/schemas/Delivery"},{"type":"null"}],"description":"Выбранный способ доставки заказа. Если не указан, будет использован способ по умолчанию (CDEK).","default":"CDEK","examples":["CDEK"]},"tariff_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tariff Code","description":"Код тарифа доставки в системе CDEK. Если не указан, будет использован тариф по умолчанию.","examples":[136]},"delivery_point":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Point","description":"Код ПВЗ (если выбран ПВЗ)","examples":["MSK123"]},"shipment_cost":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Shipment Cost","description":"Стоимость доставки, назначенная компанией-доставщиком.","default":0,"examples":["350.00"]}},"type":"object","required":["items"],"title":"OrderCreate","description":"Схема для создания нового заказа через API или Telegram-бота."},"OrderItemCreate":{"properties":{"product_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Product Id","description":"Уникальный идентификатор (ID) приобретаемого товара из каталога.","examples":[1]},"quantity":{"type":"integer","exclusiveMinimum":0.0,"title":"Quantity","description":"Количество единиц товара в данной позиции заказа. Должно быть строго больше нуля.","default":1,"examples":[2]},"meta":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Meta","description":"Кастомные характеристики конкретной позиции (например, выбранный цвет, размер или гравировка), заполненные на основе текстового ввода.","examples":[{"color":"черный","size":"XL"}]}},"type":"object","required":["product_id"],"title":"OrderItemCreate","description":"Схема для добавления позиций при создании нового заказа."},"OrderItemResponse":{"properties":{"product_id":{"type":"integer","exclusiveMinimum":0.0,"title":"Product Id","description":"Уникальный идентификатор (ID) приобретаемого товара из каталога.","examples":[1]},"quantity":{"type":"integer","exclusiveMinimum":0.0,"title":"Quantity","description":"Количество единиц товара в данной позиции заказа. Должно быть строго больше нуля.","default":1,"examples":[2]},"meta":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Meta","description":"Кастомные характеристики конкретной позиции (например, выбранный цвет, размер или гравировка), заполненные на основе текстового ввода.","examples":[{"color":"черный","size":"XL"}]},"id":{"type":"integer","title":"Id","description":"Уникальный системный идентификатор (ID) конкретной позиции в таблице элементов заказа.","examples":[1]},"order_id":{"type":"integer","title":"Order Id","description":"Идентификатор (ID) родительского заказа, к которому относится данная позиция.","examples":[10]},"price_at_purchase":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*(?:\\d{0,8}|(?=[\\d.]{1,11}0*$)\\d{0,8}\\.\\d{0,2}0*$)","title":"Price At Purchase","description":"Цена за единицу товара на момент покупки.","examples":["1500.00"]}},"type":"object","required":["product_id","id","order_id","price_at_purchase"],"title":"OrderItemResponse","description":"Схема для детального чтения позиций внутри уже существующего заказа."},"OrderResponse":{"properties":{"address":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Address","description":"Физический адрес доставки заказа. Может быть не указан, если подразумевается самовывоз или цифровой товар.","examples":["Москва, ул. Ленина, д. 5, кв. 10"]},"id":{"type":"integer","title":"Id","description":"Уникальный системный идентификатор (ID) заказа в базе данных.","examples":[10]},"code":{"type":"string","title":"Code","description":"Код заказа в формате XXX-XXX","examples":["000-014"]},"user":{"anyOf":[{"$ref":"#/components/schemas/UserResponse"},{"type":"null"}],"description":"Пользователь, совершивший заказ."},"items":{"items":{"$ref":"#/components/schemas/OrderItemResponse"},"type":"array","title":"Items","description":"Позиции в заказе."},"delivery":{"anyOf":[{"$ref":"#/components/schemas/Delivery"},{"type":"null"}],"description":"Выбранный способ доставки заказа. Если не указан, будет использован способ по умолчанию (CDEK).","default":"CDEK","examples":["CDEK"]},"total_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*(?:\\d{0,8}|(?=[\\d.]{1,11}0*$)\\d{0,8}\\.\\d{0,2}0*$)","title":"Total Amount","description":"Итоговая сумма заказа с учетом цен всех позиций и их количества.","examples":["4500.00"]},"payment_status":{"$ref":"#/components/schemas/PaymentStatus","description":"Текущий статус оплаты и обработки заказа.","examples":["PENDING"]},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Дата и время автоматического создания заказа системой.","examples":["2026-07-07T12:00:00Z"]},"payment_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Payment Date","description":"Дата и время успешной оплаты заказа (null, если заказ еще не оплачен).","examples":["2026-07-07T12:05:00Z"]},"payment_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Url","description":"Ссылка для оплаты заказа.","examples":["https://auth.robokassa.ru/Merchant/..."]},"shipment_cost":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Shipment Cost","description":"Стоимость доставки, назначенная компанией-доставщиком.","default":0,"examples":["350.00"]},"delivery_code":{"anyOf":[{},{"type":"null"}],"title":"Delivery Code","description":"Код заказа в ИС доставки.","examples":["10270717213"]}},"type":"object","required":["id","code","user","items","total_amount","payment_status","created_at"],"title":"OrderResponse","description":"Схема для возврата информации о заказе клиенту (API/Витрина/Бот)."},"PaymentStatus":{"type":"string","enum":["PENDING","PAID","FAILED","CANCELED"],"title":"PaymentStatus"},"ProductCreate":{"properties":{"name":{"type":"string","maxLength":128,"title":"Name","description":"Полное наименование товара. Должно быть понятным для покупателя (например, бренд, модель, ключевые свойства).","examples":["Фотоаппарат"]},"name_en":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Name En","description":"Полное наименование товара на английском языке.","examples":["Camera"]},"description":{"type":"string","maxLength":512,"title":"Description","description":"Подробное текстовое описание товара, его преимуществ и ключевых особенностей.","examples":["Полноценное описание товара."]},"description_en":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Description En","description":"Подробное текстовое описание товара, его преимуществ и ключевых особенностей на английском языке.","examples":["Capture the world through a nostalgic lens with this authentic Vintage Camera. Perfect for photography."]},"price":{"anyOf":[{"type":"number","maximum":99999999.99,"exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Price","description":"Стоимость товара. Принимается в формате десятичной дроби (максимум 2 знака после запятой). Должна быть строго больше нуля.","examples":["1000.99"]},"quantity":{"type":"integer","minimum":0.0,"title":"Quantity","description":"Доступное количество товара на складе для продажи. Должно быть больше нуля.","examples":[10]},"weight":{"type":"integer","minimum":0.0,"title":"Weight","description":"Вес товара в граммах. Должен быть больше нуля.","examples":[500]},"dimensions":{"$ref":"#/components/schemas/Dimensions","description":"Габариты товара в сантиметрах. Должны быть больше нуля."},"meta":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Meta","description":"Характеристики товара. После обработки запроса возвращается meta на двух языках системы.","examples":[["Модель вспышки фотоаппарата"]]},"is_active":{"type":"boolean","title":"Is Active","description":"Флаг видимости товара. Если true, товар сразу публикуется в каталоге и доступен для покупки.","examples":[true]}},"type":"object","required":["name","description","price","quantity","weight","dimensions","is_active"],"title":"ProductCreate"},"ProductImageResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Уникальный идентификатор фотографии","examples":[1]},"path":{"type":"string","title":"Path","description":"Относительный путь к фотографии товара","examples":["/media/test_image.png"]}},"type":"object","required":["id","path"],"title":"ProductImageResponse"},"ProductListResponse":{"properties":{"products":{"items":{"$ref":"#/components/schemas/ProductResponse"},"type":"array","title":"Products","description":"Список найденных товаров, соответствующих критериям запроса и пагинации."},"total":{"type":"integer","title":"Total","description":"Общее количество товаров в базе данных, удовлетворяющих фильтрам (используется для построения пагинации на фронтенде).","examples":[1]}},"type":"object","required":["products","total"],"title":"ProductListResponse"},"ProductMeta":{"properties":{"key":{"type":"string","title":"Key","description":"Обязательный уникальный ключ метаданных товара","examples":["camera_model"]},"values":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"propertyNames":{"$ref":"#/components/schemas/Locale"},"type":"object","title":"Values","description":"Человекочитаемые значения ключей, используются для UI пользователя","examples":[{"en":"Camera model","ru":"Модель камеры"}]}},"type":"object","required":["key","values"],"title":"ProductMeta"},"ProductPartiallyUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Name","description":"Новое наименование товара","examples":["Новое имя товара"]},"description":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Description","description":"Обновленное текстовое описание товара.","examples":["Обновленное описание товара."]},"name_en":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Name En","description":"Новое наименование товара на английском","examples":["New Name of Product"]},"description_en":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Description En","description":"Обновленное текстовое описание товара на английском.","examples":["Updated English description of the product."]},"price":{"anyOf":[{"type":"number","maximum":99999999.99,"exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Price","description":"Новая стоимость товара (если требуется изменить).","examples":["1200.50"]},"meta":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Meta","description":"Характеристики товара, опрашиваемые в анкетировании, влияют на метаданные позиции в заказе.","examples":["Модель вспышки фотоаппарата"]},"quantity":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Quantity","description":"Актуальное количество товара на складе (например, после инвентаризации).","examples":[12]},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","description":"Управление видимостью товара (можно скрыть из каталога, передав false).","examples":[false]},"dimensions":{"anyOf":[{"$ref":"#/components/schemas/Dimensions"},{"type":"null"}],"description":"Габариты товара в сантиметрах. Должны быть больше нуля."}},"type":"object","title":"ProductPartiallyUpdate"},"ProductResponse":{"properties":{"name":{"type":"string","maxLength":128,"title":"Name","description":"Полное наименование товара. Должно быть понятным для покупателя (например, бренд, модель, ключевые свойства).","examples":["Фотоаппарат"]},"name_en":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Name En","description":"Полное наименование товара на английском языке.","examples":["Camera"]},"description":{"type":"string","maxLength":512,"title":"Description","description":"Подробное текстовое описание товара, его преимуществ и ключевых особенностей.","examples":["Полноценное описание товара."]},"description_en":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Description En","description":"Подробное текстовое описание товара, его преимуществ и ключевых особенностей на английском языке.","examples":["Capture the world through a nostalgic lens with this authentic Vintage Camera. Perfect for photography."]},"price":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Price","description":"Стоимость товара. Принимается в формате десятичной дроби (максимум 2 знака после запятой). Должна быть строго больше нуля.","examples":["1000.99"]},"quantity":{"type":"integer","minimum":0.0,"title":"Quantity","description":"Доступное количество товара на складе для продажи. Должно быть больше нуля.","examples":[10]},"weight":{"type":"integer","minimum":0.0,"title":"Weight","description":"Вес товара в граммах. Должен быть больше нуля.","examples":[500]},"dimensions":{"$ref":"#/components/schemas/Dimensions","description":"Габариты товара в сантиметрах. Должны быть больше нуля."},"id":{"type":"integer","title":"Id","description":"Уникальный системный идентификатор (ID) товара в базе данных.","examples":[1]},"images":{"items":{"$ref":"#/components/schemas/ProductImageResponse"},"type":"array","title":"Images","description":"Доступные фотографии товара","default":[]},"videos":{"items":{"$ref":"#/components/schemas/ProductVideoResponse"},"type":"array","title":"Videos","description":"Доступные видео товара","default":[]},"is_active":{"type":"boolean","title":"Is Active","description":"Флаг активности товара (доступен ли для покупки)","examples":[true]},"meta":{"anyOf":[{"items":{"$ref":"#/components/schemas/ProductMeta"},"type":"array"},{"type":"null"}],"title":"Meta","description":"Список сгенерированных метаданных"}},"type":"object","required":["name","description","price","quantity","weight","dimensions","id","is_active"],"title":"ProductResponse"},"ProductUpdate":{"properties":{"name":{"type":"string","maxLength":128,"title":"Name","description":"Полное наименование товара. Должно быть понятным для покупателя (например, бренд, модель, ключевые свойства).","examples":["Фотоаппарат"]},"name_en":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Name En","description":"Полное наименование товара на английском языке.","examples":["Camera"]},"description":{"type":"string","maxLength":512,"title":"Description","description":"Подробное текстовое описание товара, его преимуществ и ключевых особенностей.","examples":["Полноценное описание товара."]},"description_en":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Description En","description":"Подробное текстовое описание товара, его преимуществ и ключевых особенностей на английском языке.","examples":["Capture the world through a nostalgic lens with this authentic Vintage Camera. Perfect for photography."]},"price":{"anyOf":[{"type":"number","maximum":99999999.99,"exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Price","description":"Стоимость товара. Принимается в формате десятичной дроби (максимум 2 знака после запятой). Должна быть строго больше нуля.","examples":["1000.99"]},"quantity":{"type":"integer","minimum":0.0,"title":"Quantity","description":"Доступное количество товара на складе для продажи. Должно быть больше нуля.","examples":[10]},"weight":{"type":"integer","minimum":0.0,"title":"Weight","description":"Вес товара в граммах. Должен быть больше нуля.","examples":[500]},"dimensions":{"$ref":"#/components/schemas/Dimensions","description":"Габариты товара в сантиметрах. Должны быть больше нуля."},"meta":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Meta","description":"Характеристики товара...","examples":[["Модель вспышки фотоаппарата"]]},"is_active":{"type":"boolean","title":"Is Active","description":"Управление видимостью товара (можно скрыть из каталога, передав false).","examples":[true]}},"type":"object","required":["name","description","price","quantity","weight","dimensions"],"title":"ProductUpdate"},"ProductVideoResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Уникальный идентификатор видео","examples":[1]},"path":{"type":"string","title":"Path","description":"Относительный путь к видео товара","examples":["/media/test_video.mp4"]},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Краткое описание видео","examples":["Распаковка товара"]}},"type":"object","required":["id","path"],"title":"ProductVideoResponse"},"ProductVideoUpdate":{"properties":{"description":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Description","description":"Обновленное описание видео"}},"type":"object","title":"ProductVideoUpdate"},"TicketResponse":{"properties":{"ticket":{"type":"string","title":"Ticket"}},"type":"object","required":["ticket"],"title":"TicketResponse"},"UserCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email","description":"Email адрес пользователя","examples":["user@example.com"]},"first_name":{"anyOf":[{"type":"string","maxLength":50,"minLength":2},{"type":"null"}],"title":"First Name","description":"Имя пользователя","examples":["Иван"]},"last_name":{"anyOf":[{"type":"string","maxLength":50,"minLength":2},{"type":"null"}],"title":"Last Name","description":"Фамилия пользователя","examples":["Иванов"]},"phone":{"anyOf":[{"type":"string","maxLength":30,"minLength":10},{"type":"null"}],"title":"Phone","description":"Номер телефона в международном формате","examples":["+79991234567"]},"specialty":{"anyOf":[{"type":"string","maxLength":100,"minLength":2},{"type":"null"}],"title":"Specialty","description":"Специальность или род деятельности","examples":["Фотограф"]},"middle_name":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Middle Name","description":"Отчество (если есть)","examples":["Иванович"]},"telegram_chat_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Telegram Chat Id","description":"ID чата в Telegram","examples":[123456789]},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username","description":"Имя пользователя в Telegram","examples":["telegram_user"]}},"type":"object","required":["email"],"title":"UserCreate"},"UserOrderCreate":{"properties":{"address":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Address","description":"Физический адрес доставки заказа. Может быть не указан, если подразумевается самовывоз или цифровой товар.","examples":["Москва, ул. Ленина, д. 5, кв. 10"]},"items":{"items":{"$ref":"#/components/schemas/OrderItemCreate"},"type":"array","minItems":1,"title":"Items","description":"Список позиций (товаров), входящих в состав оформляемого заказа. Заказ должен содержать как минимум один товар."},"delivery":{"anyOf":[{"$ref":"#/components/schemas/Delivery"},{"type":"null"}],"description":"Выбранный способ доставки заказа. Если не указан, будет использован способ по умолчанию (CDEK).","default":"CDEK","examples":["CDEK"]},"tariff_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tariff Code","description":"Код тарифа доставки в системе CDEK. Если не указан, будет использован тариф по умолчанию.","examples":[136]},"delivery_point":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Point","description":"Код ПВЗ (если выбран ПВЗ)","examples":["MSK123"]},"shipment_cost":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Shipment Cost","description":"Стоимость доставки, назначенная компанией-доставщиком.","default":0,"examples":["350.00"]},"user":{"$ref":"#/components/schemas/UserCreate"}},"type":"object","required":["items","user"],"title":"UserOrderCreate","description":"Схема для создания нового заказа через API или Telegram-бота."},"UserResponse":{"properties":{"id":{"type":"integer","title":"Id","description":"Уникальный идентификатор пользователя","examples":[1]},"fullname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fullname","description":"Полное имя пользователя","examples":["Иванов Иван Иванович"]},"email":{"type":"string","format":"email","title":"Email","description":"Email адрес пользователя","examples":["user@example.com"]},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone","description":"Номер телефона в международном формате","examples":["+79991234567"]},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"Дата и время создания аккаунта","examples":["2026-07-07T12:00:00Z"]},"telegram_chat_id":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Telegram Chat Id","description":"ID чата в Telegram (если привязан)","examples":[123456789]},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username","description":"Имя пользователя в Telegram (если привязан)","examples":["telegram_user"]},"specialty":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Specialty","description":"Специальность или род деятельности","examples":["Фотограф"]},"is_superuser":{"type":"boolean","title":"Is Superuser","description":"Флаг администратора","examples":[false]},"locale":{"$ref":"#/components/schemas/Locale","description":"Пользовательская локаль, код предпочитаемого языка","default":"ru","examples":["ru"]}},"type":"object","required":["id","email","created_at","is_superuser"],"title":"UserResponse"},"UserUpdate":{"properties":{"first_name":{"anyOf":[{"type":"string","maxLength":50,"minLength":2},{"type":"null"}],"title":"First Name","description":"Имя пользователя","examples":["Иван"]},"last_name":{"anyOf":[{"type":"string","maxLength":50,"minLength":2},{"type":"null"}],"title":"Last Name","description":"Фамилия пользователя","examples":["Иванов"]},"phone":{"anyOf":[{"type":"string","maxLength":30,"minLength":10},{"type":"null"}],"title":"Phone","description":"Номер телефона","examples":["+79991234567"]},"specialty":{"anyOf":[{"type":"string","maxLength":100,"minLength":2},{"type":"null"}],"title":"Specialty","description":"Специальность или род деятельности","examples":["Фотограф"]},"middle_name":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Middle Name","description":"Отчество","examples":["Иванович"]},"locale":{"anyOf":[{"$ref":"#/components/schemas/Locale"},{"type":"null"}],"description":"Пользовательская локаль","default":"ru","examples":["ru"]}},"type":"object","title":"UserUpdate"},"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"}},"securitySchemes":{"CookieAuth":{"type":"apiKey","in":"cookie","name":"access_token"}}}}