{
  "openapi": "3.1.0",
  "info": {
    "title": "Scanderm Product API",
    "version": "1.2.0",
    "description": "Общий клиентский контракт сервисов Scanderm Product. URL, набор включённых модулей и доступы предоставляются отдельно для каждого проекта. Опциональные операции помечены полем x-availability.\n\n**Стандартный путь Product Demo:**\n\n1. `POST /auth/guest` — получить гостевой JWT.\n2. `POST /analysis/upload?module=face` — загрузить фото и получить `session_id`.\n3. `GET /analysis/stream/{session_id}?token=<JWT>` — читать SSE до события `complete`.\n4. `POST /recommendations` — запросить товары по готовому снимку метрик.\n5. `POST /face-results` — сохранить метрики и рекомендации под коротким id.\n6. `GET /face-results/{result_id}` — открыть или передать сохранённый результат.\n\nРекомендации можно считать параллельно с визуализациями, когда в SSE уже пришёл снимок метрик.\n\n**Прямой нейроанализ:** `/neural/analyze` и `/neural/analyze/stream` — сокращённый опциональный сценарий без гостевого пользователя, JWT, истории, рекомендаций и сохранения результата.",
    "contact": {
      "name": "Scanderm Team"
    }
  },
  "externalDocs": {
    "description": "Полный integration guide и стандартный путь анализа",
    "url": "https://docs.scanderm.pro/#standard-flow"
  },
  "paths": {
    "/analysis/history": {
      "get": {
        "tags": [
          "analysis"
        ],
        "summary": "Get History",
        "operationId": "get_history_analysis_history_get",
        "security": [
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "model_type",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Model Type"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 100,
              "default": 20,
              "title": "Limit"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0,
              "title": "Offset"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AnalysisResultOut"
                  },
                  "title": "Response Get History Analysis History Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Возвращает постраничную историю анализов текущего пользователя; используйте фильтр model_type, если нужен один модуль.\n\n**English:** Returns the current user's paginated analysis history; use model_type to limit the response to one module."
      }
    },
    "/analysis/results/{result_id}": {
      "get": {
        "tags": [
          "analysis"
        ],
        "summary": "Get Result",
        "operationId": "get_result_analysis_results__result_id__get",
        "security": [
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "result_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Result Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnalysisResultOut"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Возвращает сохранённый ML-результат по его идентификатору вместе с временной ссылкой на исходное изображение.\n\n**English:** Returns a stored ML result by id together with a temporary URL for the source image."
      }
    },
    "/analysis/stream/{session_id}": {
      "get": {
        "tags": [
          "analysis"
        ],
        "summary": "Stream Analysis",
        "operationId": "stream_analysis_analysis_stream__session_id__get",
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Session Id"
            }
          },
          {
            "name": "token",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Token"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "description": "Открывает SSE-поток прогресса анализа по session_id. В браузерном EventSource JWT передаётся параметром token, потому что EventSource не поддерживает произвольные заголовки.\n\n**English:** Opens the analysis progress SSE stream for a session_id. Browser EventSource clients pass the JWT in the token query parameter because EventSource cannot set custom headers."
      }
    },
    "/analysis/upload": {
      "post": {
        "tags": [
          "analysis"
        ],
        "summary": "Upload For Analysis",
        "operationId": "upload_for_analysis_analysis_upload_post",
        "security": [
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "module",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "description": "Analysis module: face, skin, nails, lips",
              "title": "Module"
            },
            "description": "Analysis module: face, skin, nails, lips"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/Body_upload_for_analysis_analysis_upload_post"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AnalysisUploadResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Принимает JPEG, PNG или WebP, запускает выбранный модуль анализа в фоне и сразу возвращает session_id для подключения к SSE-потоку.\n\n**English:** Accepts a JPEG, PNG or WebP image, starts the selected analysis module in the background, and immediately returns a session_id for the SSE stream."
      }
    },
    "/auth/guest": {
      "post": {
        "tags": [
          "auth"
        ],
        "summary": "Guest",
        "description": "Создаёт анонимного пользователя и выдаёт access/refresh tokens. Это стандартная точка входа для демо, киоска и гостевого веб-сценария.\n\n**English:** Creates an anonymous user and returns access and refresh tokens. This is the standard entry point for demos, kiosks, and guest web journeys.",
        "operationId": "guest_auth_guest_post",
        "responses": {
          "201": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TokenPair"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ]
      }
    },
    "/auth/login": {
      "post": {
        "tags": [
          "auth"
        ],
        "summary": "Login",
        "operationId": "login_auth_login_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LoginRequest"
              }
            }
          },
          "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"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "description": "Авторизует зарегистрированного пользователя по учётным данным и возвращает JWT-токены.\n\n**English:** Authenticates a registered user with credentials and returns JWT tokens."
      }
    },
    "/auth/logout": {
      "post": {
        "tags": [
          "auth"
        ],
        "summary": "Logout",
        "operationId": "logout_auth_logout_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": "Successful Response"
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "description": "Завершает пользовательскую сессию и отзывает переданный refresh token.\n\n**English:** Ends the user session and revokes the supplied refresh token."
      }
    },
    "/auth/refresh": {
      "post": {
        "tags": [
          "auth"
        ],
        "summary": "Refresh",
        "operationId": "refresh_auth_refresh_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshRequest"
              }
            }
          },
          "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"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "description": "Обменивает действующий refresh token на новую пару JWT-токенов без повторного входа.\n\n**English:** Exchanges a valid refresh token for a fresh JWT pair without requiring another login."
      }
    },
    "/auth/register": {
      "post": {
        "tags": [
          "auth"
        ],
        "summary": "Register",
        "operationId": "register_auth_register_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RegisterRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TokenPair"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "description": "Создаёт постоянную учётную запись пользователя и возвращает JWT-токены для дальнейших запросов.\n\n**English:** Creates a persistent user account and returns JWT tokens for subsequent requests."
      }
    },
    "/care-flow": {
      "get": {
        "tags": [
          "care-flow"
        ],
        "summary": "Get Care Flow",
        "description": "Возвращает настроенную для проекта последовательность этапов ухода; используйте её для порядка блоков рекомендаций в интерфейсе.\n\n**English:** Returns the project's configured care-step order; use it to arrange recommendation sections in the UI.",
        "operationId": "get_care_flow_care_flow_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ]
      }
    },
    "/client-cart": {
      "post": {
        "tags": [
          "client-cart"
        ],
        "summary": "Submit Client Cart",
        "operationId": "submit_client_cart_client_cart_post",
        "parameters": [
          {
            "name": "result_id",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "id результата анализа",
              "title": "Result Id"
            },
            "description": "id результата анализа"
          },
          {
            "name": "authorization",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "default": "",
              "title": "Authorization"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/CartItem"
                },
                "title": "Items"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "PartnerBearer": []
          }
        ],
        "x-availability": "optional; enabled per project",
        "description": "Передаёт выбранные пользователем товары в партнёрскую корзину по result_id. Используется только в проектах с подключённой партнёрской интеграцией.\n\n**English:** Sends products selected by the user to a partner cart for a result_id. Use it only when the project has a partner-cart integration enabled."
      }
    },
    "/face-config/filters": {
      "get": {
        "tags": [
          "face-config"
        ],
        "summary": "Get Filter Config",
        "description": "Возвращает доступные фильтры, бренды и ценовые границы для экрана рекомендаций по лицу.\n\n**English:** Returns available filters, brands, and price bounds for the face-recommendation UI.",
        "operationId": "get_filter_config_face_config_filters_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ]
      }
    },
    "/face-results": {
      "post": {
        "tags": [
          "face-results"
        ],
        "summary": "Create Face Result",
        "operationId": "create_face_result_face_results_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FaceResultIn"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "description": "Сохраняет итог анализа лица, рекомендации и ссылку на фото под коротким id. Вызывается перед переходом на постоянную страницу результата или показом QR.\n\n**English:** Stores the final face analysis, recommendations, and photo URL under a short id. Call it before opening a persistent result page or showing a QR code."
      }
    },
    "/face-results/{result_id}": {
      "get": {
        "tags": [
          "face-results"
        ],
        "summary": "Get Face Result",
        "operationId": "get_face_result_face_results__result_id__get",
        "parameters": [
          {
            "name": "result_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Result Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FaceResultOut"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "description": "Возвращает сохранённый публичный результат лица для страницы результата, QR-лендинга или повторного открытия ссылки.\n\n**English:** Returns a stored public face result for the result page, QR landing page, or a reopened share link."
      }
    },
    "/face-results/{result_id}/detailed-llm": {
      "post": {
        "tags": [
          "face-results"
        ],
        "summary": "Start Or Get Detailed Llm",
        "operationId": "start_or_get_detailed_llm_face_results__result_id__detailed_llm_post",
        "parameters": [
          {
            "name": "result_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Result Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "description": "Запускает расширенный LLM/VLM-разбор результата либо сразу возвращает готовый кэш. Операция идемпотентна для одного result_id.\n\n**English:** Starts the extended LLM/VLM interpretation or immediately returns the cached result. The operation is idempotent for a result_id."
      },
      "get": {
        "tags": [
          "face-results"
        ],
        "summary": "Get Detailed Llm",
        "operationId": "get_detailed_llm_face_results__result_id__detailed_llm_get",
        "parameters": [
          {
            "name": "result_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Result Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "description": "Возвращает статус и, когда расчёт завершён, данные расширенного LLM/VLM-разбора; используйте для polling после POST.\n\n**English:** Returns the status and, once complete, the extended LLM/VLM data; poll this endpoint after the POST call."
      }
    },
    "/face-results/{result_id}/landing-visit": {
      "post": {
        "tags": [
          "face-results"
        ],
        "summary": "Mark Landing Visit",
        "description": "Фиксирует первое открытие страницы результата пользователем после перехода по QR или публичной ссылке.\n\n**English:** Records the user's first visit to the result page after following a QR code or public link.",
        "operationId": "mark_landing_visit_face_results__result_id__landing_visit_post",
        "parameters": [
          {
            "name": "result_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Result Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ]
      }
    },
    "/face-results/{result_id}/pdf": {
      "get": {
        "tags": [
          "face-results"
        ],
        "summary": "Get Face Result Pdf",
        "description": "Возвращает готовый PDF-отчёт по результату; при отсутствии кэша сервер запускает или ожидает рендер документа.\n\n**English:** Returns the result PDF report; when no cached file exists, the server starts or joins the document render.",
        "operationId": "get_face_result_pdf_face_results__result_id__pdf_get",
        "parameters": [
          {
            "name": "result_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Result Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ]
      }
    },
    "/face-results/{result_id}/pdf/prewarm": {
      "post": {
        "tags": [
          "face-results"
        ],
        "summary": "Prewarm Face Result Pdf",
        "description": "Заранее запускает расширенный анализ и сборку PDF, чтобы последующее скачивание пользователем прошло без долгого ожидания.\n\n**English:** Prestarts the extended analysis and PDF build so the user's later download does not incur the full rendering delay.",
        "operationId": "prewarm_face_result_pdf_face_results__result_id__pdf_prewarm_post",
        "parameters": [
          {
            "name": "result_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Result Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ]
      }
    },
    "/face-results/{result_id}/qr-shown": {
      "post": {
        "tags": [
          "face-results"
        ],
        "summary": "Mark Qr Shown",
        "description": "Фиксирует показ QR-кода «забрать результат» для витринной и киосковой аналитики.\n\n**English:** Records that the 'take your result' QR code was displayed for showcase and kiosk analytics.",
        "operationId": "mark_qr_shown_face_results__result_id__qr_shown_post",
        "parameters": [
          {
            "name": "result_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Result Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ]
      }
    },
    "/face-results/{result_id}/recs": {
      "patch": {
        "tags": [
          "face-results"
        ],
        "summary": "Update Recs",
        "description": "Заменяет рекомендации в сохранённом результате после применения пользовательских фильтров.\n\n**English:** Replaces the recommendations stored with a result after user filters have been applied.",
        "operationId": "update_recs_face_results__result_id__recs_patch",
        "parameters": [
          {
            "name": "result_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Result Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RecsUpdate"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ]
      }
    },
    "/face-results/{result_id}/saved-products": {
      "patch": {
        "tags": [
          "face-results"
        ],
        "summary": "Update Saved Products",
        "description": "Заменяет список товаров, сохранённых пользователем на публичной странице результата.\n\n**English:** Replaces the list of products saved by the user on the public result page.",
        "operationId": "update_saved_products_face_results__result_id__saved_products_patch",
        "parameters": [
          {
            "name": "result_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Result Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/app__face_results__router__SavedProductsIn"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ]
      }
    },
    "/hair-color-results": {
      "post": {
        "tags": [
          "hair-color"
        ],
        "summary": "Create Result",
        "operationId": "create_result_hair_color_results_post",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/Body_create_result_hair_color_results_post"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "x-availability": "optional; enabled per project",
        "description": "Принимает исходные фотографии и параметры, создаёт задачу подбора цвета волос и возвращает идентификатор результата.\n\n**English:** Accepts source images and parameters, creates a hair-color analysis job, and returns its result id."
      }
    },
    "/hair-color-results/config": {
      "get": {
        "tags": [
          "hair-color"
        ],
        "summary": "Get Config",
        "operationId": "get_config_hair_color_results_config_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "x-availability": "optional; enabled per project",
        "description": "Возвращает конфигурацию модуля окрашивания: доступные оттенки и параметры, необходимые клиентскому интерфейсу.\n\n**English:** Returns the hair-color module configuration, including the shades and parameters needed by the client UI."
      }
    },
    "/hair-color-results/{result_id}": {
      "get": {
        "tags": [
          "hair-color"
        ],
        "summary": "Get Result",
        "operationId": "get_result_hair_color_results__result_id__get",
        "security": [
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "result_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Result Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "x-availability": "optional; enabled per project",
        "description": "Возвращает состояние и данные ранее созданного результата подбора цвета волос.\n\n**English:** Returns the status and data of a previously created hair-color result."
      }
    },
    "/hair-color-results/{result_id}/recolors": {
      "post": {
        "tags": [
          "hair-color"
        ],
        "summary": "Create Recolor",
        "operationId": "create_recolor_hair_color_results__result_id__recolors_post",
        "security": [
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "result_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Result Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RecolorIn"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "x-availability": "optional; enabled per project",
        "description": "Запускает генерацию примерки выбранного оттенка для существующего результата.\n\n**English:** Starts generation of a selected shade preview for an existing result."
      }
    },
    "/hair-color-results/{result_id}/recolors/{shade_code}/image": {
      "get": {
        "tags": [
          "hair-color"
        ],
        "summary": "Get Recolor Image",
        "operationId": "get_recolor_image_hair_color_results__result_id__recolors__shade_code__image_get",
        "security": [
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "result_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Result Id"
            }
          },
          {
            "name": "shade_code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Shade Code"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "x-availability": "optional; enabled per project",
        "description": "Возвращает сгенерированное изображение примерки конкретного оттенка.\n\n**English:** Returns the generated preview image for a specific shade."
      }
    },
    "/hair-color-results/{result_id}/source": {
      "get": {
        "tags": [
          "hair-color"
        ],
        "summary": "Get Source",
        "operationId": "get_source_hair_color_results__result_id__source_get",
        "security": [
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "result_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Result Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "x-availability": "optional; enabled per project",
        "description": "Возвращает исходное изображение, связанное с результатом подбора цвета волос.\n\n**English:** Returns the source image associated with a hair-color result."
      }
    },
    "/hair-results": {
      "post": {
        "tags": [
          "hair"
        ],
        "summary": "Create Result",
        "operationId": "create_result_hair_results_post",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/Body_create_result_hair_results_post"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "x-availability": "optional; enabled per project",
        "description": "Принимает требуемые ракурсы волос и анкету, запускает анализ и возвращает результат модуля волос.\n\n**English:** Accepts the required hair views and survey data, runs the analysis, and returns the hair-module result."
      }
    },
    "/hair-results/config": {
      "get": {
        "tags": [
          "hair"
        ],
        "summary": "Get Config",
        "description": "Возвращает всё, что нужно интерфейсу модуля волос: ракурсы, параметры, анкету, слоты и фильтры брендов.\n\n**English:** Returns everything the hair-module UI needs: views, metrics, survey, recommendation slots, and brand filters.",
        "operationId": "get_config_hair_results_config_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "x-availability": "optional; enabled per project"
      }
    },
    "/hair-results/{result_id}": {
      "get": {
        "tags": [
          "hair"
        ],
        "summary": "Get Result",
        "operationId": "get_result_hair_results__result_id__get",
        "parameters": [
          {
            "name": "result_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Result Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "x-availability": "optional; enabled per project",
        "description": "Возвращает сохранённый результат анализа волос, включая показатели и рекомендации.\n\n**English:** Returns a stored hair-analysis result, including metrics and recommendations."
      },
      "patch": {
        "tags": [
          "hair"
        ],
        "summary": "Update Result",
        "description": "Обновляет ответы анкеты или фильтры и пересчитывает показатели и подбор ухода, не перезапуская разметку фотографий.\n\n**English:** Updates survey answers or filters and recalculates metrics and care recommendations without rerunning image segmentation.",
        "operationId": "update_result_hair_results__result_id__patch",
        "parameters": [
          {
            "name": "result_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Result Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SurveyIn"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "x-availability": "optional; enabled per project"
      }
    },
    "/hair-results/{result_id}/landing-visit": {
      "post": {
        "tags": [
          "hair"
        ],
        "summary": "Mark Landing Visit",
        "operationId": "mark_landing_visit_hair_results__result_id__landing_visit_post",
        "parameters": [
          {
            "name": "result_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Result Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "x-availability": "optional; enabled per project",
        "description": "Фиксирует открытие пользователем публичной страницы результата анализа волос.\n\n**English:** Records a user's visit to the public hair-result page."
      }
    },
    "/hair-results/{result_id}/qr-shown": {
      "post": {
        "tags": [
          "hair"
        ],
        "summary": "Mark Qr Shown",
        "operationId": "mark_qr_shown_hair_results__result_id__qr_shown_post",
        "parameters": [
          {
            "name": "result_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Result Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "x-availability": "optional; enabled per project",
        "description": "Фиксирует показ QR-кода для получения результата анализа волос.\n\n**English:** Records that the QR code for retrieving a hair-analysis result was shown."
      }
    },
    "/hair-results/{result_id}/saved-products": {
      "patch": {
        "tags": [
          "hair"
        ],
        "summary": "Update Saved Products",
        "description": "Сохраняет выбранные пользователем товары в результате анализа волос для QR-лендинга.\n\n**English:** Stores the user's selected products in a hair result for the QR landing page.",
        "operationId": "update_saved_products_hair_results__result_id__saved_products_patch",
        "parameters": [
          {
            "name": "result_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Result Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/app__hair__router__SavedProductsIn"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "x-availability": "optional; enabled per project"
      }
    },
    "/health": {
      "get": {
        "summary": "Health",
        "operationId": "health_health_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "security": [],
        "tags": [
          "system"
        ],
        "description": "Проверяет доступность API без авторизации; используйте для мониторинга и smoke-проверок интеграции.\n\n**English:** Checks API availability without authentication; use it for monitoring and integration smoke tests."
      }
    },
    "/image-proxy": {
      "get": {
        "tags": [
          "image-proxy"
        ],
        "summary": "Proxy Image",
        "operationId": "proxy_image_image_proxy_get",
        "parameters": [
          {
            "name": "u",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "description": "Полный URL картинки",
              "title": "U"
            },
            "description": "Полный URL картинки"
          },
          {
            "name": "w",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "integer",
                  "maximum": 2048,
                  "minimum": 16
                },
                {
                  "type": "null"
                }
              ],
              "description": "Целевая ширина, px (даунскейл)",
              "title": "W"
            },
            "description": "Целевая ширина, px (даунскейл)"
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 95,
              "minimum": 30,
              "description": "Качество кодирования при ресайзе",
              "default": 75,
              "title": "Q"
            },
            "description": "Качество кодирования при ресайзе"
          },
          {
            "name": "fmt",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "webp",
                "jpeg"
              ],
              "type": "string",
              "description": "Формат результата при ресайзе",
              "default": "webp",
              "title": "Fmt"
            },
            "description": "Формат результата при ресайзе"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "description": "Безопасно проксирует внешнее изображение с изменением ширины, качества и формата; нужен, когда источник не отдаёт корректный CORS или content-type.\n\n**English:** Safely proxies an external image with optional width, quality, and format conversion; use it when the source has unsuitable CORS or content type headers."
      }
    },
    "/import-queue/items/{item_id}": {
      "put": {
        "tags": [
          "import-queue"
        ],
        "summary": "Update Item",
        "operationId": "update_item_import_queue_items__item_id__put",
        "security": [
          {
            "ProjectApiKey": [],
            "AdminApiKey": []
          },
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "item_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Item Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ItemUpdateBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Редактирует распознанные поля одной позиции в очереди до одобрения и записи в основной каталог.\n\n**English:** Edits the parsed fields of one queued item before approval and commit to the main catalog."
      }
    },
    "/import-queue/sessions": {
      "get": {
        "tags": [
          "import-queue"
        ],
        "summary": "List Sessions",
        "operationId": "list_sessions_import_queue_sessions_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": [],
            "AdminApiKey": []
          },
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "description": "Возвращает список пакетных импортов и их текущие статусы для административного интерфейса.\n\n**English:** Lists batch-import sessions and their current statuses for the administration UI."
      }
    },
    "/import-queue/sessions/{session_id}": {
      "get": {
        "tags": [
          "import-queue"
        ],
        "summary": "Get Session",
        "operationId": "get_session_import_queue_sessions__session_id__get",
        "security": [
          {
            "ProjectApiKey": [],
            "AdminApiKey": []
          },
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Session Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Возвращает сводку выбранной сессии импорта: состояние, счётчики и ошибки обработки.\n\n**English:** Returns the selected import session summary, including status, counters, and processing errors."
      },
      "delete": {
        "tags": [
          "import-queue"
        ],
        "summary": "Cancel Session",
        "operationId": "cancel_session_import_queue_sessions__session_id__delete",
        "security": [
          {
            "ProjectApiKey": [],
            "AdminApiKey": []
          },
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Session Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Отменяет незавершённую сессию импорта и исключает её из дальнейшей обработки.\n\n**English:** Cancels an unfinished import session and prevents further processing."
      }
    },
    "/import-queue/sessions/{session_id}/approve": {
      "post": {
        "tags": [
          "import-queue"
        ],
        "summary": "Approve Items",
        "operationId": "approve_items_import_queue_sessions__session_id__approve_post",
        "security": [
          {
            "ProjectApiKey": [],
            "AdminApiKey": []
          },
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Session Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BatchActionBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Одобряет выбранные позиции сессии для последующей записи в каталог.\n\n**English:** Approves selected session items for a later catalog commit."
      }
    },
    "/import-queue/sessions/{session_id}/approve-all-valid": {
      "post": {
        "tags": [
          "import-queue"
        ],
        "summary": "Approve All Valid",
        "operationId": "approve_all_valid_import_queue_sessions__session_id__approve_all_valid_post",
        "security": [
          {
            "ProjectApiKey": [],
            "AdminApiKey": []
          },
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Session Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Одобряет все позиции сессии, прошедшие валидацию без ошибок.\n\n**English:** Approves every item in the session that passed validation without errors."
      }
    },
    "/import-queue/sessions/{session_id}/commit": {
      "post": {
        "tags": [
          "import-queue"
        ],
        "summary": "Commit Approved",
        "operationId": "commit_approved_import_queue_sessions__session_id__commit_post",
        "security": [
          {
            "ProjectApiKey": [],
            "AdminApiKey": []
          },
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Session Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Записывает одобренные позиции сессии в основной каталог; вызывайте после проверки очереди.\n\n**English:** Commits approved session items to the main catalog; call it after reviewing the queue."
      }
    },
    "/import-queue/sessions/{session_id}/enrich": {
      "post": {
        "tags": [
          "import-queue"
        ],
        "summary": "Enrich Session",
        "operationId": "enrich_session_import_queue_sessions__session_id__enrich_post",
        "security": [
          {
            "ProjectApiKey": [],
            "AdminApiKey": []
          },
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Session Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Запускает дополнительное обогащение данных товаров в выбранной сессии перед модерацией.\n\n**English:** Starts additional product-data enrichment for the selected session before moderation."
      }
    },
    "/import-queue/sessions/{session_id}/items": {
      "get": {
        "tags": [
          "import-queue"
        ],
        "summary": "Get Items",
        "operationId": "get_items_import_queue_sessions__session_id__items_get",
        "security": [
          {
            "ProjectApiKey": [],
            "AdminApiKey": []
          },
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Session Id"
            }
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Status"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0,
              "title": "Offset"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 200,
              "default": 50,
              "title": "Limit"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Возвращает позиции сессии импорта постранично и позволяет отфильтровать их по статусу.\n\n**English:** Returns the import session items with pagination and optional status filtering."
      }
    },
    "/import-queue/sessions/{session_id}/reject": {
      "post": {
        "tags": [
          "import-queue"
        ],
        "summary": "Reject Items",
        "operationId": "reject_items_import_queue_sessions__session_id__reject_post",
        "security": [
          {
            "ProjectApiKey": [],
            "AdminApiKey": []
          },
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Session Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BatchActionBody"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Отклоняет выбранные позиции сессии, чтобы они не попали в каталог при commit.\n\n**English:** Rejects selected session items so they are excluded from the catalog commit."
      }
    },
    "/import-queue/sessions/{session_id}/reject-all-error": {
      "post": {
        "tags": [
          "import-queue"
        ],
        "summary": "Reject All Error",
        "operationId": "reject_all_error_import_queue_sessions__session_id__reject_all_error_post",
        "security": [
          {
            "ProjectApiKey": [],
            "AdminApiKey": []
          },
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Session Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Отклоняет все позиции сессии, в которых обнаружены ошибки валидации.\n\n**English:** Rejects all session items that contain validation errors."
      }
    },
    "/import-queue/sessions/{session_id}/upload-images": {
      "post": {
        "tags": [
          "import-queue"
        ],
        "summary": "Upload Images Zip",
        "description": "Прикрепляет ZIP с изображениями, названными по SKU, к позициям выбранного пакетного импорта.\n\n**English:** Attaches a ZIP archive of SKU-named images to items in the selected batch import.",
        "operationId": "upload_images_zip_import_queue_sessions__session_id__upload_images_post",
        "security": [
          {
            "ProjectApiKey": [],
            "AdminApiKey": []
          },
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "session_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Session Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/Body_upload_images_zip_import_queue_sessions__session_id__upload_images_post"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/import-queue/upload-csv": {
      "post": {
        "tags": [
          "import-queue"
        ],
        "summary": "Upload Csv",
        "operationId": "upload_csv_import_queue_upload_csv_post",
        "security": [
          {
            "ProjectApiKey": [],
            "AdminApiKey": []
          },
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "product_type_id",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Product Type Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/Body_upload_csv_import_queue_upload_csv_post"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Создаёт модерируемую сессию импорта из CSV. Используйте этот путь, если данные нужно проверить или исправить до записи в каталог.\n\n**English:** Creates a moderated import session from CSV. Use this flow when data must be reviewed or corrected before it reaches the catalog."
      }
    },
    "/import-queue/upload-excel": {
      "post": {
        "tags": [
          "import-queue"
        ],
        "summary": "Upload Excel",
        "operationId": "upload_excel_import_queue_upload_excel_post",
        "security": [
          {
            "ProjectApiKey": [],
            "AdminApiKey": []
          },
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "product_type_id",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Product Type Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/Body_upload_excel_import_queue_upload_excel_post"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Создаёт модерируемую сессию импорта из Excel. Используйте этот путь для проверки, обогащения и выборочного одобрения строк.\n\n**English:** Creates a moderated import session from Excel. Use it for review, enrichment, and selective row approval."
      }
    },
    "/loyalty-card": {
      "post": {
        "tags": [
          "loyalty"
        ],
        "summary": "Save Loyalty Card",
        "operationId": "save_loyalty_card_loyalty_card_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LoyaltyCardIn"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": true,
                  "type": "object",
                  "title": "Response Save Loyalty Card Loyalty Card Post"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "description": "Сохраняет номер отсканированной карты лояльности до запуска пользовательского сценария; применяется в подключённых киосковых проектах.\n\n**English:** Stores a scanned loyalty-card number before the user journey starts; used by enabled kiosk projects."
      }
    },
    "/makeup-api/checkout/": {
      "post": {
        "tags": [
          "makeup"
        ],
        "summary": "Checkout",
        "description": "Создаёт результат из корзины макияжа и возвращает id для экрана заказа или QR-перехода.\n\n**English:** Creates a result from the makeup basket and returns an id for the order screen or QR handoff.",
        "operationId": "checkout_makeup_api_checkout__post",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "x-availability": "optional; enabled per project"
      }
    },
    "/makeup-api/core/start_new_test/": {
      "post": {
        "tags": [
          "makeup"
        ],
        "summary": "Start New Test",
        "operationId": "start_new_test_makeup_api_core_start_new_test__post",
        "parameters": [
          {
            "name": "test_type",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Test Type"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "x-availability": "optional; enabled per project",
        "description": "Начинает новую временную сессию виртуальной примерки макияжа выбранного типа.\n\n**English:** Starts a new temporary virtual-makeup session for the selected test type."
      }
    },
    "/makeup-api/shop/avalible_products/": {
      "get": {
        "tags": [
          "makeup"
        ],
        "summary": "Avalible Products",
        "operationId": "avalible_products_makeup_api_shop_avalible_products__get",
        "parameters": [
          {
            "name": "test_type",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Test Type"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "x-availability": "optional; enabled per project",
        "description": "Возвращает товары, доступные для выбранного типа виртуальной примерки.\n\n**English:** Returns the products available for the selected virtual-makeup test type."
      }
    },
    "/makeup-api/shop/basket/": {
      "get": {
        "tags": [
          "makeup"
        ],
        "summary": "Get Basket",
        "operationId": "get_basket_makeup_api_shop_basket__get",
        "parameters": [
          {
            "name": "test_type",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Test Type"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "x-availability": "optional; enabled per project",
        "description": "Возвращает текущую корзину макияжа временного пользователя.\n\n**English:** Returns the temporary user's current makeup basket."
      },
      "put": {
        "tags": [
          "makeup"
        ],
        "summary": "Put Basket",
        "operationId": "put_basket_makeup_api_shop_basket__put",
        "parameters": [
          {
            "name": "quantity",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Quantity"
            }
          },
          {
            "name": "product_code",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Product Code"
            }
          },
          {
            "name": "test_type",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Test Type"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "type": "object",
                    "additionalProperties": true
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Body"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "x-availability": "optional; enabled per project",
        "description": "Добавляет товар в корзину макияжа или изменяет его количество.\n\n**English:** Adds a product to the makeup basket or changes its quantity."
      },
      "delete": {
        "tags": [
          "makeup"
        ],
        "summary": "Delete Basket",
        "operationId": "delete_basket_makeup_api_shop_basket__delete",
        "parameters": [
          {
            "name": "product_code",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Product Code"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "x-availability": "optional; enabled per project",
        "description": "Удаляет выбранный товар из корзины макияжа.\n\n**English:** Removes the selected product from the makeup basket."
      }
    },
    "/makeup-api/shop/product/": {
      "post": {
        "tags": [
          "makeup"
        ],
        "summary": "Get Product",
        "operationId": "get_product_makeup_api_shop_product__post",
        "parameters": [
          {
            "name": "test_type",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Test Type"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "type": "object",
                    "additionalProperties": true
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Body"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "x-availability": "optional; enabled per project",
        "description": "Возвращает карточку товара макияжа по данным запроса; POST сохранён для совместимости модуля.\n\n**English:** Returns a makeup product card from request data; POST is retained for module compatibility."
      }
    },
    "/makeup-api/shop/selected_shop/": {
      "get": {
        "tags": [
          "makeup"
        ],
        "summary": "Selected Shop",
        "operationId": "selected_shop_makeup_api_shop_selected_shop__get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "x-availability": "optional; enabled per project",
        "description": "Возвращает магазин, выбранный в текущей сессии макияжа.\n\n**English:** Returns the store selected in the current makeup session."
      }
    },
    "/makeup-api/shop/shop/": {
      "post": {
        "tags": [
          "makeup"
        ],
        "summary": "Select Shop",
        "operationId": "select_shop_makeup_api_shop_shop__post",
        "parameters": [
          {
            "name": "test_type",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Test Type"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "type": "object",
                    "additionalProperties": true
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Body"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "x-availability": "optional; enabled per project",
        "description": "Сохраняет выбранный магазин для текущей сессии макияжа и последующей фильтрации ассортимента.\n\n**English:** Stores the selected shop for the current makeup session and subsequent assortment filtering."
      }
    },
    "/makeup-api/shop/shop_list/": {
      "get": {
        "tags": [
          "makeup"
        ],
        "summary": "Shop List",
        "operationId": "shop_list_makeup_api_shop_shop_list__get",
        "parameters": [
          {
            "name": "test_type",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Test Type"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "x-availability": "optional; enabled per project",
        "description": "Возвращает список магазинов, доступных в сценарии макияжа.\n\n**English:** Returns the stores available in the makeup journey."
      }
    },
    "/makeup-api/users/profile/": {
      "get": {
        "tags": [
          "makeup"
        ],
        "summary": "Users Profile",
        "operationId": "users_profile_makeup_api_users_profile__get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "x-availability": "optional; enabled per project",
        "description": "Возвращает профиль временного пользователя модуля макияжа.\n\n**English:** Returns the temporary makeup-module user profile."
      }
    },
    "/makeup-api/users/temp_user_create/": {
      "get": {
        "tags": [
          "makeup"
        ],
        "summary": "Temp User Create",
        "operationId": "temp_user_create_makeup_api_users_temp_user_create__get",
        "parameters": [
          {
            "name": "shop",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Shop"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "x-availability": "optional; enabled per project",
        "description": "Создаёт временного пользователя модуля макияжа и при необходимости связывает его с магазином.\n\n**English:** Creates a temporary makeup-module user and optionally associates it with a shop."
      }
    },
    "/me": {
      "get": {
        "tags": [
          "profile"
        ],
        "summary": "Get Profile",
        "operationId": "get_profile_me_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "description": "Возвращает профиль текущего пользователя, определённого по Bearer JWT.\n\n**English:** Returns the current user profile identified by the Bearer JWT."
      },
      "put": {
        "tags": [
          "profile"
        ],
        "summary": "Update Profile",
        "operationId": "update_profile_me_put",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProfileUpdate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "description": "Обновляет имя и пользовательские настройки текущего профиля.\n\n**English:** Updates the current profile's name and user preferences."
      }
    },
    "/neural/analyze": {
      "post": {
        "tags": [
          "neural"
        ],
        "summary": "Analyze a photo directly (REST)",
        "description": "Принимает одну фотографию и держит REST-запрос открытым до полного нейроанализа. Используйте для простого server-to-server сценария без пользователя, JWT, истории и сохранения результата.\n\n**English:** Accepts one photo and keeps the REST request open until neural analysis completes. Use it for a simple server-to-server flow without users, JWT, history, or result persistence.",
        "operationId": "direct_analyze_neural_analyze_post",
        "parameters": [
          {
            "name": "module",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "description": "Enabled analysis module",
              "default": "face",
              "title": "Module"
            },
            "description": "Enabled analysis module"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/Body_direct_analyze_neural_analyze_post"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DirectAnalysisResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "x-availability": "optional; enabled per project"
      }
    },
    "/neural/analyze/stream": {
      "post": {
        "tags": [
          "neural"
        ],
        "summary": "Analyze a photo directly (SSE)",
        "description": "Принимает одну фотографию и возвращает события анализа в том же SSE-ответе. Используйте, когда клиенту нужен прогресс без отдельной пользовательской сессии.\n\n**English:** Accepts one photo and streams analysis events in the same SSE response. Use it when the client needs progress without a separate user session.",
        "operationId": "direct_analyze_stream_neural_analyze_stream_post",
        "parameters": [
          {
            "name": "module",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "description": "Enabled analysis module",
              "default": "face",
              "title": "Module"
            },
            "description": "Enabled analysis module"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/Body_direct_analyze_stream_neural_analyze_stream_post"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Server-Sent Events stream",
            "content": {
              "text/event-stream": {
                "schema": {
                  "type": "string"
                },
                "example": "event: session\\ndata: {\"session_id\":\"...\"}\\n\\nevent: progress\\ndata: {\"task_id\":\"redness\",\"status\":\"done\"}\\n\\nevent: result\\ndata: {\"status\":\"done\",\"results\":{}}\\n\\nevent: done\\ndata: {\"session_id\":\"...\"}\\n\\n"
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "x-availability": "optional; enabled per project"
      }
    },
    "/partner/results": {
      "get": {
        "tags": [
          "partner"
        ],
        "summary": "List Partner Results",
        "description": "Возвращает последние результаты, связанные с client_token партнёра; используйте для синхронизации сканов пользователя во внешнюю систему.\n\n**English:** Returns the latest results linked to a partner client_token; use it to synchronize a user's scans into an external system.",
        "operationId": "list_partner_results_partner_results_get",
        "parameters": [
          {
            "name": "client_token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "description": "токен пользователя, с которым открывали виджет",
              "title": "Client Token"
            },
            "description": "токен пользователя, с которым открывали виджет"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 20,
              "minimum": 1,
              "default": 5,
              "title": "Limit"
            }
          },
          {
            "name": "X-Partner-Key",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "default": "",
              "title": "X-Partner-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "PartnerApiKey": []
          }
        ],
        "x-availability": "optional; enabled per project"
      }
    },
    "/partner/results/{result_id}": {
      "get": {
        "tags": [
          "partner"
        ],
        "summary": "Get Partner Result",
        "description": "Возвращает один партнёрский результат по id для детального просмотра или повторной синхронизации.\n\n**English:** Returns one partner result by id for detailed viewing or resynchronization.",
        "operationId": "get_partner_result_partner_results__result_id__get",
        "parameters": [
          {
            "name": "result_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Result Id"
            }
          },
          {
            "name": "X-Partner-Key",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "default": "",
              "title": "X-Partner-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "PartnerApiKey": []
          }
        ],
        "x-availability": "optional; enabled per project"
      }
    },
    "/products": {
      "get": {
        "tags": [
          "products"
        ],
        "summary": "List Products",
        "operationId": "list_products_products_get",
        "parameters": [
          {
            "name": "category",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Category"
            }
          },
          {
            "name": "module",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Module"
            }
          },
          {
            "name": "search",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Search"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 500,
              "default": 50,
              "title": "Limit"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0,
              "title": "Offset"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "description": "Возвращает каталог с поиском, пагинацией и фильтрами по категории или модулю. Это основной read-only метод для витрины и рекомендаций клиента.\n\n**English:** Lists catalog products with search, pagination, and category or module filters. This is the main read-only catalog endpoint for client storefronts and recommendations."
      },
      "post": {
        "tags": [
          "products"
        ],
        "summary": "Create Product",
        "operationId": "create_product_products_post",
        "security": [
          {
            "ProjectApiKey": [],
            "AdminApiKey": []
          },
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProductCreate"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Создаёт одну карточку товара. Вызывайте только с доверенного server-side контура администратора.\n\n**English:** Creates one product card. Call it only from a trusted server-side administration environment."
      }
    },
    "/products/import": {
      "post": {
        "tags": [
          "products"
        ],
        "summary": "Import Products",
        "operationId": "import_products_products_import_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": true,
                "type": "object",
                "title": "Data"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": [],
            "AdminApiKey": []
          },
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "description": "Импортирует набор товаров из JSON напрямую в каталог. Подходит для проверенного server-to-server фида без ручной модерации.\n\n**English:** Imports a JSON batch directly into the catalog. Use it for a validated server-to-server feed that does not require manual moderation."
      }
    },
    "/products/import-csv": {
      "post": {
        "tags": [
          "products"
        ],
        "summary": "Import Csv",
        "description": "Импортирует товары из UTF-8 CSV напрямую в каталог и возвращает отчёт по строкам.\n\n**English:** Imports products from a UTF-8 CSV directly into the catalog and returns a row-level report.",
        "operationId": "import_csv_products_import_csv_post",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/Body_import_csv_products_import_csv_post"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": [],
            "AdminApiKey": []
          },
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ]
      }
    },
    "/products/import-excel": {
      "post": {
        "tags": [
          "products"
        ],
        "summary": "Import Excel",
        "description": "Импортирует товары из Excel напрямую в каталог и возвращает детальный отчёт об ошибках.\n\n**English:** Imports products from Excel directly into the catalog and returns a detailed error report.",
        "operationId": "import_excel_products_import_excel_post",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/Body_import_excel_products_import_excel_post"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": [],
            "AdminApiKey": []
          },
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ]
      }
    },
    "/products/{product_id}": {
      "get": {
        "tags": [
          "products"
        ],
        "summary": "Get Product",
        "operationId": "get_product_products__product_id__get",
        "parameters": [
          {
            "name": "product_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Product Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "description": "Возвращает полную карточку одного товара по внутреннему идентификатору.\n\n**English:** Returns the complete product card for one internal product id."
      },
      "put": {
        "tags": [
          "products"
        ],
        "summary": "Update Product",
        "operationId": "update_product_products__product_id__put",
        "security": [
          {
            "ProjectApiKey": [],
            "AdminApiKey": []
          },
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "product_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Product Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProductUpdate"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Полностью обновляет нормализованные поля существующей карточки товара.\n\n**English:** Updates the normalized fields of an existing product card."
      },
      "delete": {
        "tags": [
          "products"
        ],
        "summary": "Delete Product",
        "operationId": "delete_product_products__product_id__delete",
        "security": [
          {
            "ProjectApiKey": [],
            "AdminApiKey": []
          },
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "product_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Product Id"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Successful Response"
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Удаляет товар из каталога по внутреннему идентификатору.\n\n**English:** Deletes a catalog product by its internal id."
      }
    },
    "/products/{product_id}/raw": {
      "put": {
        "tags": [
          "products"
        ],
        "summary": "Update Product Raw",
        "description": "Обновляет карточку сырым JSON-набором полей. Используйте для интеграций, которым нужно сохранить дополнительные атрибуты источника.\n\n**English:** Updates a product using raw JSON fields. Use it when an integration must preserve additional source attributes.",
        "operationId": "update_product_raw_products__product_id__raw_put",
        "security": [
          {
            "ProjectApiKey": [],
            "AdminApiKey": []
          },
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "product_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Product Id"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": true,
                "title": "Data"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/recommendations": {
      "post": {
        "tags": [
          "recommendations"
        ],
        "summary": "Get Recommendations",
        "operationId": "get_recommendations_recommendations_post",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RecommendationsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecommendationsResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "description": "Подбирает товары по результатам анализа и фильтрам пользователя. Передайте inline analysis_results для текущего стрима либо result_id для уже сохранённого анализа.\n\n**English:** Selects products from analysis results and user filters. Send inline analysis_results for a live stream or result_id for an already stored analysis."
      }
    },
    "/settings/field-config": {
      "get": {
        "tags": [
          "settings"
        ],
        "summary": "Get Field Config",
        "description": "Возвращает конфигурацию полей каталога целиком или для конкретного типа товара.\n\n**English:** Returns catalog field configuration globally or for a specific product type.",
        "operationId": "get_field_config_settings_field_config_get",
        "parameters": [
          {
            "name": "product_type_id",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Product Type Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true,
                  "title": "Response Get Field Config Settings Field Config Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ]
      },
      "put": {
        "tags": [
          "settings"
        ],
        "summary": "Put Field Config",
        "operationId": "put_field_config_settings_field_config_put",
        "security": [
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": true,
                "title": "Body"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true,
                  "title": "Response Put Field Config Settings Field Config Put"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Обновляет конфигурацию полей каталога для административного интерфейса и импорта.\n\n**English:** Updates catalog field configuration used by the administration UI and import pipeline."
      }
    },
    "/settings/product-types": {
      "get": {
        "tags": [
          "settings"
        ],
        "summary": "Get Product Types",
        "operationId": "get_product_types_settings_product_types_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "items": {},
                  "type": "array",
                  "title": "Response Get Product Types Settings Product Types Get"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "description": "Возвращает настроенные типы товаров и их идентификаторы.\n\n**English:** Returns configured product types and their identifiers."
      },
      "put": {
        "tags": [
          "settings"
        ],
        "summary": "Put Product Types",
        "operationId": "put_product_types_settings_product_types_put",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "items": {
                  "additionalProperties": true,
                  "type": "object"
                },
                "type": "array",
                "title": "Body"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "items": {},
                  "type": "array",
                  "title": "Response Put Product Types Settings Product Types Put"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "description": "Заменяет конфигурацию типов товаров проекта.\n\n**English:** Replaces the project's product-type configuration."
      }
    },
    "/settings/stock-integration": {
      "get": {
        "tags": [
          "settings"
        ],
        "summary": "Get Stock Integration",
        "operationId": "get_stock_integration_settings_stock_integration_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": true,
                  "type": "object",
                  "title": "Response Get Stock Integration Settings Stock Integration Get"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "description": "Возвращает server-side конфигурацию интеграции цен и остатков для проекта.\n\n**English:** Returns the project's server-side price and stock integration configuration."
      },
      "put": {
        "tags": [
          "settings"
        ],
        "summary": "Put Stock Integration",
        "operationId": "put_stock_integration_settings_stock_integration_put",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "additionalProperties": true,
                "type": "object",
                "title": "Body"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "additionalProperties": true,
                  "type": "object",
                  "title": "Response Put Stock Integration Settings Stock Integration Put"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ],
        "description": "Обновляет настройки источника цен и остатков. Не вызывайте из публичного frontend-кода.\n\n**English:** Updates the price and stock source settings. Do not call this endpoint from public frontend code."
      }
    },
    "/shops": {
      "get": {
        "tags": [
          "shops"
        ],
        "summary": "List Shops",
        "operationId": "list_shops_shops_get",
        "parameters": [
          {
            "name": "city",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "City"
            }
          },
          {
            "name": "search",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Search"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 200,
              "default": 50,
              "title": "Limit"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0,
              "title": "Offset"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "description": "Возвращает список магазинов с поиском, фильтром по городу и пагинацией.\n\n**English:** Lists shops with search, city filtering, and pagination."
      }
    },
    "/shops/nearest": {
      "get": {
        "tags": [
          "shops"
        ],
        "summary": "Nearest Shop",
        "operationId": "nearest_shop_shops_nearest_get",
        "parameters": [
          {
            "name": "lat",
            "in": "query",
            "required": true,
            "schema": {
              "type": "number",
              "title": "Lat"
            }
          },
          {
            "name": "lng",
            "in": "query",
            "required": true,
            "schema": {
              "type": "number",
              "title": "Lng"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "description": "Находит ближайший магазин по переданным координатам пользователя.\n\n**English:** Finds the nearest shop for the supplied user coordinates."
      }
    },
    "/shops/{code}": {
      "get": {
        "tags": [
          "shops"
        ],
        "summary": "Get Shop",
        "operationId": "get_shop_shops__code__get",
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "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"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "description": "Возвращает данные одной торговой точки по её внешнему коду.\n\n**English:** Returns one shop by its external code."
      }
    },
    "/shops/{code}/pull-stock": {
      "post": {
        "tags": [
          "shops"
        ],
        "summary": "Pull Stock",
        "description": "Принудительно запрашивает актуальные цены и остатки выбранного магазина из настроенного внешнего источника; sku ограничивает обновление одним товаром.\n\n**English:** Forces a price and stock refresh for the selected shop from the configured external source; sku limits the refresh to one product.",
        "operationId": "pull_stock_shops__code__pull_stock_post",
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Code"
            }
          },
          {
            "name": "sku",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Sku"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": [],
            "AdminApiKey": []
          },
          {
            "ProjectApiKey": [],
            "BearerAuth": []
          }
        ]
      }
    },
    "/shops/{code}/stock/prices": {
      "get": {
        "tags": [
          "shops"
        ],
        "summary": "Get Stock Prices",
        "operationId": "get_stock_prices_shops__code__stock_prices_get",
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "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"
                }
              }
            }
          }
        },
        "security": [
          {
            "ProjectApiKey": []
          }
        ],
        "description": "Возвращает текущие цены и наличие товаров для выбранного магазина.\n\n**English:** Returns current product prices and availability for the selected shop."
      }
    }
  },
  "components": {
    "schemas": {
      "AnalysisResultOut": {
        "properties": {
          "id": {
            "type": "string",
            "title": "Id"
          },
          "session_id": {
            "type": "string",
            "title": "Session Id"
          },
          "model_type": {
            "type": "string",
            "title": "Model Type"
          },
          "visualization_type": {
            "type": "string",
            "title": "Visualization Type"
          },
          "result": {
            "additionalProperties": true,
            "type": "object",
            "title": "Result"
          },
          "image_url": {
            "type": "string",
            "title": "Image Url"
          },
          "created_at": {
            "type": "string",
            "title": "Created At"
          }
        },
        "type": "object",
        "required": [
          "id",
          "session_id",
          "model_type",
          "visualization_type",
          "result",
          "image_url",
          "created_at"
        ],
        "title": "AnalysisResultOut"
      },
      "AnalysisUploadResponse": {
        "properties": {
          "session_id": {
            "type": "string",
            "title": "Session Id"
          },
          "s3_key": {
            "type": "string",
            "title": "S3 Key"
          },
          "status": {
            "type": "string",
            "title": "Status",
            "default": "done"
          },
          "cropped_face_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Cropped Face Url"
          },
          "results": {
            "additionalProperties": true,
            "type": "object",
            "title": "Results",
            "default": {}
          }
        },
        "type": "object",
        "required": [
          "session_id",
          "s3_key"
        ],
        "title": "AnalysisUploadResponse"
      },
      "BatchActionBody": {
        "properties": {
          "item_ids": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Item Ids"
          }
        },
        "type": "object",
        "required": [
          "item_ids"
        ],
        "title": "BatchActionBody"
      },
      "Body_create_result_hair_color_results_post": {
        "properties": {
          "file": {
            "type": "string",
            "format": "binary",
            "title": "File"
          }
        },
        "type": "object",
        "required": [
          "file"
        ],
        "title": "Body_create_result_hair_color_results_post"
      },
      "Body_create_result_hair_results_post": {
        "properties": {
          "mode": {
            "type": "string",
            "title": "Mode"
          },
          "views": {
            "type": "string",
            "title": "Views"
          },
          "files": {
            "items": {
              "type": "string",
              "format": "binary"
            },
            "type": "array",
            "title": "Files"
          }
        },
        "type": "object",
        "required": [
          "mode",
          "views",
          "files"
        ],
        "title": "Body_create_result_hair_results_post"
      },
      "Body_direct_analyze_neural_analyze_post": {
        "properties": {
          "file": {
            "type": "string",
            "format": "binary",
            "title": "File",
            "description": "Photo to analyze"
          }
        },
        "type": "object",
        "required": [
          "file"
        ],
        "title": "Body_direct_analyze_neural_analyze_post"
      },
      "Body_direct_analyze_stream_neural_analyze_stream_post": {
        "properties": {
          "file": {
            "type": "string",
            "format": "binary",
            "title": "File",
            "description": "Photo to analyze"
          }
        },
        "type": "object",
        "required": [
          "file"
        ],
        "title": "Body_direct_analyze_stream_neural_analyze_stream_post"
      },
      "Body_import_csv_products_import_csv_post": {
        "properties": {
          "file": {
            "type": "string",
            "format": "binary",
            "title": "File"
          }
        },
        "type": "object",
        "required": [
          "file"
        ],
        "title": "Body_import_csv_products_import_csv_post"
      },
      "Body_import_excel_products_import_excel_post": {
        "properties": {
          "file": {
            "type": "string",
            "format": "binary",
            "title": "File"
          }
        },
        "type": "object",
        "required": [
          "file"
        ],
        "title": "Body_import_excel_products_import_excel_post"
      },
      "Body_upload_csv_import_queue_upload_csv_post": {
        "properties": {
          "file": {
            "type": "string",
            "format": "binary",
            "title": "File"
          }
        },
        "type": "object",
        "required": [
          "file"
        ],
        "title": "Body_upload_csv_import_queue_upload_csv_post"
      },
      "Body_upload_excel_import_queue_upload_excel_post": {
        "properties": {
          "file": {
            "type": "string",
            "format": "binary",
            "title": "File"
          }
        },
        "type": "object",
        "required": [
          "file"
        ],
        "title": "Body_upload_excel_import_queue_upload_excel_post"
      },
      "Body_upload_for_analysis_analysis_upload_post": {
        "properties": {
          "file": {
            "type": "string",
            "format": "binary",
            "title": "File"
          }
        },
        "type": "object",
        "required": [
          "file"
        ],
        "title": "Body_upload_for_analysis_analysis_upload_post"
      },
      "Body_upload_images_zip_import_queue_sessions__session_id__upload_images_post": {
        "properties": {
          "file": {
            "type": "string",
            "format": "binary",
            "title": "File"
          }
        },
        "type": "object",
        "required": [
          "file"
        ],
        "title": "Body_upload_images_zip_import_queue_sessions__session_id__upload_images_post"
      },
      "CartItem": {
        "properties": {
          "sku": {
            "type": "string",
            "title": "Sku"
          },
          "count": {
            "type": "integer",
            "title": "Count",
            "default": 1
          }
        },
        "type": "object",
        "required": [
          "sku"
        ],
        "title": "CartItem"
      },
      "CreateResponse": {
        "properties": {
          "id": {
            "type": "string",
            "title": "Id"
          }
        },
        "type": "object",
        "required": [
          "id"
        ],
        "title": "CreateResponse"
      },
      "DirectAnalysisResponse": {
        "properties": {
          "session_id": {
            "type": "string",
            "title": "Session Id"
          },
          "status": {
            "type": "string",
            "title": "Status"
          },
          "backend": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Backend"
          },
          "cropped_face_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Cropped Face Url"
          },
          "scores": {
            "additionalProperties": {
              "type": "number"
            },
            "type": "object",
            "title": "Scores"
          },
          "age": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Age"
          },
          "results": {
            "additionalProperties": true,
            "type": "object",
            "title": "Results"
          },
          "warning": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Warning"
          }
        },
        "additionalProperties": true,
        "type": "object",
        "required": [
          "session_id",
          "status"
        ],
        "title": "DirectAnalysisResponse"
      },
      "FaceResultIn": {
        "properties": {
          "session_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Session Id"
          },
          "metrics": {
            "additionalProperties": true,
            "type": "object",
            "title": "Metrics"
          },
          "recs": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Recs"
          },
          "photo_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Photo Url"
          },
          "shop_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Shop Code"
          },
          "loyalty_card": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Loyalty Card"
          },
          "client_token": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Client Token"
          }
        },
        "type": "object",
        "required": [
          "metrics"
        ],
        "title": "FaceResultIn"
      },
      "FaceResultOut": {
        "properties": {
          "id": {
            "type": "string",
            "title": "Id"
          },
          "session_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Session Id"
          },
          "metrics": {
            "additionalProperties": true,
            "type": "object",
            "title": "Metrics"
          },
          "recs": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Recs"
          },
          "photo_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Photo Url"
          },
          "cropped_face_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Cropped Face Url"
          },
          "saved_products": {
            "items": {
              "additionalProperties": true,
              "type": "object"
            },
            "type": "array",
            "title": "Saved Products",
            "default": []
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "title": "Created At"
          }
        },
        "type": "object",
        "required": [
          "id",
          "metrics",
          "created_at"
        ],
        "title": "FaceResultOut"
      },
      "HTTPValidationError": {
        "properties": {
          "detail": {
            "items": {
              "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
          }
        },
        "type": "object",
        "title": "HTTPValidationError"
      },
      "ItemUpdateBody": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Data"
          },
          "status": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Status"
          }
        },
        "type": "object",
        "title": "ItemUpdateBody"
      },
      "LoginRequest": {
        "properties": {
          "email": {
            "type": "string",
            "format": "email",
            "title": "Email"
          },
          "password": {
            "type": "string",
            "title": "Password"
          }
        },
        "type": "object",
        "required": [
          "email",
          "password"
        ],
        "title": "LoginRequest"
      },
      "LoyaltyCardIn": {
        "properties": {
          "card_number": {
            "type": "string",
            "maxLength": 64,
            "minLength": 1,
            "title": "Card Number"
          }
        },
        "type": "object",
        "required": [
          "card_number"
        ],
        "title": "LoyaltyCardIn"
      },
      "ProductCreate": {
        "properties": {
          "sku": {
            "type": "string",
            "title": "Sku"
          },
          "name": {
            "type": "string",
            "title": "Name"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "brand": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Brand"
          },
          "volume": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Volume"
          },
          "care_stage": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Care Stage"
          },
          "product_line": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Product Line"
          },
          "type": {
            "type": "string",
            "title": "Type",
            "default": "product"
          },
          "modules": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Modules",
            "default": []
          },
          "categories": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Categories",
            "default": []
          },
          "tags": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Tags",
            "default": []
          },
          "inci_components": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Inci Components",
            "default": []
          },
          "skin_types": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Skin Types",
            "default": []
          },
          "contraindications": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Contraindications",
            "default": []
          },
          "confirmation_tags": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Confirmation Tags",
            "default": []
          },
          "hypoallergenic": {
            "type": "boolean",
            "title": "Hypoallergenic",
            "default": false
          },
          "pregnancy_safe": {
            "type": "boolean",
            "title": "Pregnancy Safe",
            "default": false
          },
          "image_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Image Url"
          },
          "color": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Color"
          },
          "attributes": {
            "additionalProperties": true,
            "type": "object",
            "title": "Attributes",
            "default": {}
          },
          "images": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Images",
            "default": []
          },
          "price": {
            "type": "number",
            "title": "Price",
            "default": 0
          },
          "currency": {
            "type": "string",
            "title": "Currency",
            "default": "RUB"
          }
        },
        "type": "object",
        "required": [
          "sku",
          "name"
        ],
        "title": "ProductCreate"
      },
      "ProductUpdate": {
        "properties": {
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "brand": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Brand"
          },
          "volume": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Volume"
          },
          "care_stage": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Care Stage"
          },
          "product_line": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Product Line"
          },
          "type": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Type"
          },
          "modules": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Modules"
          },
          "categories": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Categories"
          },
          "tags": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Tags"
          },
          "inci_components": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Inci Components"
          },
          "skin_types": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Skin Types"
          },
          "contraindications": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Contraindications"
          },
          "confirmation_tags": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Confirmation Tags"
          },
          "hypoallergenic": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Hypoallergenic"
          },
          "pregnancy_safe": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Pregnancy Safe"
          },
          "image_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Image Url"
          },
          "color": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Color"
          },
          "attributes": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Attributes"
          },
          "images": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Images"
          },
          "price": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Price"
          },
          "currency": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Currency"
          },
          "is_active": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Is Active"
          }
        },
        "type": "object",
        "title": "ProductUpdate"
      },
      "ProfileUpdate": {
        "properties": {
          "first_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "First Name"
          },
          "last_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Name"
          },
          "phone": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Phone"
          },
          "age": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Age"
          },
          "gender": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Gender"
          },
          "preferences": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Preferences"
          }
        },
        "type": "object",
        "title": "ProfileUpdate"
      },
      "RecolorIn": {
        "properties": {
          "shade_code": {
            "type": "string",
            "maxLength": 20,
            "minLength": 1,
            "title": "Shade Code"
          }
        },
        "type": "object",
        "required": [
          "shade_code"
        ],
        "title": "RecolorIn"
      },
      "RecommendationsRequest": {
        "properties": {
          "module": {
            "type": "string",
            "title": "Module",
            "default": "face"
          },
          "result_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Result Id"
          },
          "session_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Session Id"
          },
          "analysis_results": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Analysis Results"
          },
          "age": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Age"
          },
          "gender": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Gender"
          },
          "limit": {
            "type": "integer",
            "title": "Limit",
            "default": 10
          },
          "exclude_skus": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Exclude Skus",
            "default": []
          },
          "shop_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Shop Code"
          },
          "user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "User Id"
          },
          "price_min": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Price Min"
          },
          "price_max": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Price Max"
          },
          "boolean_filters": {
            "additionalProperties": true,
            "type": "object",
            "title": "Boolean Filters",
            "default": {}
          },
          "preferred_brands": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Preferred Brands",
            "default": []
          }
        },
        "type": "object",
        "title": "RecommendationsRequest"
      },
      "RecommendationsResponse": {
        "properties": {
          "user_id": {
            "type": "string",
            "title": "User Id"
          },
          "project_id": {
            "type": "string",
            "title": "Project Id"
          },
          "module": {
            "type": "string",
            "title": "Module"
          },
          "products": {
            "items": {
              "$ref": "#/components/schemas/RecommendedProduct"
            },
            "type": "array",
            "title": "Products",
            "default": []
          },
          "procedure_page": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Procedure Page"
          }
        },
        "type": "object",
        "required": [
          "user_id",
          "project_id",
          "module"
        ],
        "title": "RecommendationsResponse"
      },
      "RecommendedProduct": {
        "properties": {
          "sku": {
            "type": "string",
            "title": "Sku"
          },
          "name": {
            "type": "string",
            "title": "Name"
          },
          "brand": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Brand"
          },
          "stage": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Stage"
          },
          "categories": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Categories",
            "default": []
          },
          "price": {
            "type": "number",
            "title": "Price",
            "default": 0.0
          },
          "original_price": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Original Price"
          },
          "currency": {
            "type": "string",
            "title": "Currency",
            "default": "RUB"
          },
          "score": {
            "type": "number",
            "title": "Score",
            "default": 0.0
          },
          "reason": {
            "type": "string",
            "title": "Reason",
            "default": ""
          },
          "image_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Image Url"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "spec": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Spec"
          },
          "skin_types": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Skin Types",
            "default": []
          },
          "skin_states": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Skin States",
            "default": []
          },
          "texture": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Texture"
          },
          "how_to_use": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "How To Use"
          },
          "country": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Country"
          },
          "effect": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Effect"
          },
          "volume": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Volume"
          },
          "spf": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Spf"
          },
          "care_level": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Care Level"
          },
          "hypoallergenic": {
            "type": "boolean",
            "title": "Hypoallergenic",
            "default": false
          },
          "pregnancy_safe": {
            "type": "boolean",
            "title": "Pregnancy Safe",
            "default": false
          },
          "price_tier": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Price Tier"
          }
        },
        "type": "object",
        "required": [
          "sku",
          "name"
        ],
        "title": "RecommendedProduct"
      },
      "RecsUpdate": {
        "properties": {
          "recs": {
            "additionalProperties": true,
            "type": "object",
            "title": "Recs"
          }
        },
        "type": "object",
        "required": [
          "recs"
        ],
        "title": "RecsUpdate",
        "description": "Юзер применил фильтры на экране результатов → фронт PATCH'ит сюда\nотфильтрованные рекомендации, чтобы QR-лендинг отдавал именно их,\nа не исходный (нефильтрованный) список со скана."
      },
      "RefreshRequest": {
        "properties": {
          "refresh_token": {
            "type": "string",
            "title": "Refresh Token"
          }
        },
        "type": "object",
        "required": [
          "refresh_token"
        ],
        "title": "RefreshRequest"
      },
      "RegisterRequest": {
        "properties": {
          "email": {
            "type": "string",
            "format": "email",
            "title": "Email"
          },
          "password": {
            "type": "string",
            "title": "Password"
          },
          "first_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "First Name"
          },
          "last_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Name"
          },
          "phone": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Phone"
          },
          "age": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Age"
          },
          "gender": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Gender"
          },
          "preferences": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Preferences"
          }
        },
        "type": "object",
        "required": [
          "email",
          "password"
        ],
        "title": "RegisterRequest"
      },
      "SurveyIn": {
        "properties": {
          "survey": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Survey"
          },
          "filters": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Filters"
          }
        },
        "type": "object",
        "title": "SurveyIn"
      },
      "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"
          }
        },
        "type": "object",
        "required": [
          "access_token",
          "refresh_token"
        ],
        "title": "TokenPair"
      },
      "ValidationError": {
        "properties": {
          "loc": {
            "items": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "integer"
                }
              ]
            },
            "type": "array",
            "title": "Location"
          },
          "msg": {
            "type": "string",
            "title": "Message"
          },
          "type": {
            "type": "string",
            "title": "Error Type"
          }
        },
        "type": "object",
        "required": [
          "loc",
          "msg",
          "type"
        ],
        "title": "ValidationError"
      },
      "app__face_results__router__SavedProductsIn": {
        "properties": {
          "saved_products": {
            "items": {
              "additionalProperties": true,
              "type": "object"
            },
            "type": "array",
            "title": "Saved Products"
          }
        },
        "type": "object",
        "required": [
          "saved_products"
        ],
        "title": "SavedProductsIn",
        "description": "Юзер закидывает SKU в корзину на киоске → перед открытием\n«Забрать результат» фронт PATCH'ит сюда выбранные продукты, чтобы\nQR-лендинг (другое устройство) увидел только то, что юзер реально\nотметил, а не весь LLM-список рекомендаций."
      },
      "app__hair__router__SavedProductsIn": {
        "properties": {
          "saved_products": {
            "items": {
              "additionalProperties": true,
              "type": "object"
            },
            "type": "array",
            "title": "Saved Products"
          }
        },
        "type": "object",
        "required": [
          "saved_products"
        ],
        "title": "SavedProductsIn",
        "description": "Товары, которые пользователь положил в корзину на результате.\n\nСписок хранится в самом hair-result: QR открывается уже на другом\nустройстве и должен показать именно выбранные позиции, а не все советы."
      }
    },
    "securitySchemes": {
      "ProjectApiKey": {
        "type": "apiKey",
        "in": "header",
        "name": "X-API-Key",
        "description": "Ключ проекта; предоставляется вместе с URL, если требуется."
      },
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT",
        "description": "access_token из /auth/guest, /auth/register или /auth/login."
      },
      "AdminApiKey": {
        "type": "apiKey",
        "in": "header",
        "name": "X-Internal-Key",
        "description": "Серверный ключ каталога и импорта. Не передавать во frontend."
      },
      "PartnerApiKey": {
        "type": "apiKey",
        "in": "header",
        "name": "X-Partner-Key",
        "description": "Ключ чтения результатов партнёром."
      },
      "PartnerBearer": {
        "type": "http",
        "scheme": "bearer",
        "description": "Bearer-токен партнёра для отправки корзины."
      }
    }
  },
  "tags": [
    {
      "name": "auth",
      "description": "Сессии и авторизация"
    },
    {
      "name": "analysis",
      "description": "Загрузка и анализ изображения"
    },
    {
      "name": "neural",
      "description": "Опциональный прямой REST/SSE-анализ"
    },
    {
      "name": "profile",
      "description": "Профиль и пользовательские настройки"
    },
    {
      "name": "face-results",
      "description": "Результаты лица, QR и отчёты"
    },
    {
      "name": "face-config",
      "description": "Фильтры и конфигурация анализа лица"
    },
    {
      "name": "hair",
      "description": "Опциональный анализ волос"
    },
    {
      "name": "hair-color",
      "description": "Опциональный подбор цвета волос"
    },
    {
      "name": "makeup",
      "description": "Опциональный модуль макияжа"
    },
    {
      "name": "recommendations",
      "description": "Товарные рекомендации"
    },
    {
      "name": "care-flow",
      "description": "Порядок этапов ухода"
    },
    {
      "name": "loyalty",
      "description": "Карта лояльности в киосковом сценарии"
    },
    {
      "name": "image-proxy",
      "description": "Проксирование и преобразование изображений"
    },
    {
      "name": "system",
      "description": "Проверка доступности API"
    },
    {
      "name": "client-cart",
      "description": "Передача корзины партнёру"
    },
    {
      "name": "partner",
      "description": "Получение результатов партнёром"
    },
    {
      "name": "products",
      "description": "Каталог и импорт"
    },
    {
      "name": "shops",
      "description": "Магазины, цены и остатки"
    },
    {
      "name": "settings",
      "description": "Настройки каталога и интеграций"
    },
    {
      "name": "import-queue",
      "description": "Очередь импорта"
    }
  ],
  "x-scanderm-api-url": "URL предоставляется отдельно"
}
