{
    "openapi": "3.0.0",
    "info": {
        "title": "HHBro API (v2)",
        "description": "External API v2. All endpoints require an access token (Authorization: Bearer {accessToken}).",
        "version": "2.0.0"
    },
    "servers": [
        {
            "url": "/api",
            "description": "API base URL"
        }
    ],
    "paths": {
        "/v2/ai/generate-search-filters": {
            "post": {
                "tags": [
                    "AI"
                ],
                "summary": "AI-автозаполнение поисковых фильтров",
                "description": "Генерирует оптимальные фильтры поиска вакансий на основе резюме и желаемой должности. ⚠️ ПЛАТНАЯ ОПЕРАЦИЯ.",
                "operationId": "generateSearchFiltersV2",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/GenerateSearchFiltersRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Фильтры успешно сгенерированы",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GenerateSearchFiltersResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Unauthorized"
                    },
                    "402": {
                        "description": "Недостаточно кредитов"
                    },
                    "403": {
                        "description": "Нет доступа к резюме"
                    },
                    "404": {
                        "description": "Резюме не найдено"
                    },
                    "422": {
                        "description": "Validation error"
                    },
                    "500": {
                        "description": "Server error"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/applications": {
            "get": {
                "tags": [
                    "Applications"
                ],
                "summary": "Получение списка откликов пользователя",
                "operationId": "listApplicationsV2",
                "responses": {
                    "200": {
                        "description": "Список откликов успешно получен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListApplicationsResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Applications"
                ],
                "summary": "Отклик на вакансию",
                "operationId": "applyToVacancyV2",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/ApplyToVacancyRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Отклик успешно отправлен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ApplyToVacancyResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/applications/{id}": {
            "get": {
                "tags": [
                    "Applications"
                ],
                "summary": "Получение деталей одного отклика",
                "operationId": "getApplicationV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "description": "ID отклика",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Детали отклика успешно получены",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetApplicationResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/applications/stats": {
            "get": {
                "tags": [
                    "Applications"
                ],
                "summary": "Получение статистики откликов",
                "operationId": "getApplicationStatsV2",
                "responses": {
                    "200": {
                        "description": "Статистика успешно получена",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetApplicationStatsResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/applications/browser": {
            "post": {
                "tags": [
                    "Applications"
                ],
                "summary": "Регистрация отклика через браузер (fallback)",
                "description": "Регистрирует отклик, отправленный пользователем вручную через браузер. Используется как fallback, когда API отклик недоступен.",
                "operationId": "registerBrowserApplicationV2",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/RegisterBrowserApplicationRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Отклик успешно зарегистрирован",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ApplyToVacancyResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/logout": {
            "post": {
                "tags": [
                    "Authentication"
                ],
                "summary": "Выход (отозвать токен)",
                "description": "Отзывает personal access token текущего пользователя. Требует авторизации через personal access token.",
                "operationId": "revokeTokenV2",
                "responses": {
                    "202": {
                        "description": "Токен отозван",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/RevokeTokenResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/cities/search": {
            "get": {
                "tags": [
                    "Cities"
                ],
                "summary": "Поиск городов",
                "operationId": "searchCitiesV2",
                "parameters": [
                    {
                        "name": "q",
                        "in": "query",
                        "description": "Поисковый запрос",
                        "required": false,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "services",
                        "in": "query",
                        "description": "Массив сервисов",
                        "required": false,
                        "schema": {
                            "type": "array",
                            "items": {
                                "type": "string",
                                "enum": [
                                    "hh",
                                    "sj",
                                    "trudvsem",
                                    "zarplata",
                                    "rabota",
                                    "yandex",
                                    "linkedin"
                                ]
                            }
                        }
                    },
                    {
                        "name": "limit",
                        "in": "query",
                        "description": "Лимит результатов",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "default": 20,
                            "maximum": 50,
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Города успешно найдены",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/SearchCitiesResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/cities/popular": {
            "get": {
                "tags": [
                    "Cities"
                ],
                "summary": "Популярные города",
                "operationId": "getPopularCitiesV2",
                "parameters": [
                    {
                        "name": "services",
                        "in": "query",
                        "description": "Массив кодов сервисов (hh, sj, trudvsem, zarplata, rabota, yandex, linkedin)",
                        "required": false,
                        "schema": {
                            "type": "array",
                            "items": {
                                "type": "string",
                                "enum": [
                                    "hh",
                                    "sj",
                                    "trudvsem",
                                    "zarplata",
                                    "rabota",
                                    "yandex",
                                    "linkedin"
                                ]
                            }
                        }
                    },
                    {
                        "name": "limit",
                        "in": "query",
                        "description": "Лимит результатов",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "default": 20,
                            "maximum": 50,
                            "minimum": 1
                        }
                    },
                    {
                        "name": "country",
                        "in": "query",
                        "description": "Код страны (RU, BY, KZ и т.д.)",
                        "required": false,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Популярные города получены",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetPopularCitiesResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/cities/{id}/mappings": {
            "get": {
                "tags": [
                    "Cities"
                ],
                "summary": "Получить маппинги для города",
                "description": "Возвращает данные города и маппинги для всех сервисов (hh, sj, trudvsem и т.д.)",
                "operationId": "getCityMappingsV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "description": "ID города в справочнике",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 8394
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Маппинги получены",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetCityMappingsResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/cities/find-by-service-key": {
            "get": {
                "tags": [
                    "Cities"
                ],
                "summary": "Найти город по ключу сервиса",
                "operationId": "findCityByServiceKeyV2",
                "responses": {
                    "200": {
                        "description": "Город найден"
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/cities/tree": {
            "get": {
                "tags": [
                    "Cities"
                ],
                "summary": "Иерархическое дерево городов",
                "operationId": "getCityTreeV2",
                "parameters": [
                    {
                        "name": "service",
                        "in": "query",
                        "description": "Код сервиса для фильтрации",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "hh",
                                "sj",
                                "trudvsem",
                                "zarplata",
                                "rabota",
                                "yandex",
                                "linkedin"
                            ]
                        }
                    },
                    {
                        "name": "parent_id",
                        "in": "query",
                        "description": "ID родителя (null = корневой уровень)",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "nullable": true
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Дерево городов получено",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetCityTreeResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/hr/smart-search/company-contacts": {
            "post": {
                "tags": [
                    "CompanyContact"
                ],
                "summary": "Search company contacts (v2)",
                "operationId": "searchCompanyContactsV2",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/SearchCompanyContactsRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Company contacts resolved",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/SearchCompanyContactsResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "apiKey": []
                    }
                ]
            }
        },
        "/v2/contacts": {
            "get": {
                "tags": [
                    "Contacts"
                ],
                "summary": "List contacts",
                "operationId": "listContactsV2",
                "responses": {
                    "200": {
                        "description": "Contacts retrieved successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListContactsResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Contacts"
                ],
                "summary": "Create contact",
                "operationId": "createContactV2",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/CreateContactRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Contact created successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/CreateContactResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/contacts/{contactId}": {
            "get": {
                "tags": [
                    "Contacts"
                ],
                "summary": "Get contact",
                "operationId": "getContactV2",
                "parameters": [
                    {
                        "name": "contactId",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Contact retrieved successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetContactResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "put": {
                "tags": [
                    "Contacts"
                ],
                "summary": "Update contact",
                "operationId": "updateContactV2",
                "parameters": [
                    {
                        "name": "contactId",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/UpdateContactRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Contact updated successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/UpdateContactResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Contacts"
                ],
                "summary": "Delete contact",
                "operationId": "deleteContactV2",
                "parameters": [
                    {
                        "name": "contactId",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Contact deleted successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/DeleteContactResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/contacts/{contactId}/timeline": {
            "get": {
                "tags": [
                    "Contacts"
                ],
                "summary": "Get contact timeline",
                "operationId": "getContactTimelineV2",
                "parameters": [
                    {
                        "name": "contactId",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Contact timeline retrieved successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ContactTimelineResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/cover-letters": {
            "get": {
                "tags": [
                    "CoverLetters"
                ],
                "summary": "Получение списка сопроводительных писем (бесплатно)",
                "description": "Возвращает список сопроводительных писем пользователя. ✅ БЕСПЛАТНО.",
                "operationId": "listCoverLettersV2",
                "responses": {
                    "200": {
                        "description": "Список писем успешно получен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListCoverLettersResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/cover-letters/{id}": {
            "get": {
                "tags": [
                    "CoverLetters"
                ],
                "summary": "Получение сопроводительного письма по ID (бесплатно)",
                "description": "Возвращает сопроводительное письмо по ID. ✅ БЕСПЛАТНО.",
                "operationId": "getCoverLetterV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "description": "ID сопроводительного письма",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Письмо успешно получено",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetCoverLetterResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "put": {
                "tags": [
                    "CoverLetters"
                ],
                "summary": "Обновление сопроводительного письма (бесплатно)",
                "description": "Обновляет содержимое сопроводительного письма. ✅ БЕСПЛАТНО.",
                "operationId": "updateCoverLetterV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "description": "ID сопроводительного письма",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/UpdateCoverLetterRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Письмо успешно обновлено",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/UpdateCoverLetterResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "CoverLetters"
                ],
                "summary": "Удаление сопроводительного письма (бесплатно)",
                "description": "Удаляет сопроводительное письмо пользователя. ✅ БЕСПЛАТНО.",
                "operationId": "deleteCoverLetterV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "description": "ID сопроводительного письма",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Письмо успешно удалено",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/DeleteCoverLetterResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/cover-letters/{externalVacancyId}/generate": {
            "post": {
                "tags": [
                    "CoverLetters"
                ],
                "summary": "Генерация сопроводительного письма (5 CR)",
                "description": "AI-генерация сопроводительного письма для вакансии. ⚠️ ПЛАТНАЯ ОПЕРАЦИЯ: 5 CR (бесплатно при наличии кэша).",
                "operationId": "generateCoverLetterV2",
                "parameters": [
                    {
                        "name": "externalVacancyId",
                        "in": "path",
                        "description": "Внешний ID вакансии",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/GenerateCoverLetterRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Письмо успешно сгенерировано",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GenerateCoverLetterResponseV2"
                                }
                            }
                        }
                    },
                    "402": {
                        "description": "Недостаточно кредитов",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ErrorResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/cover-letters/vacancy/{externalVacancyId}": {
            "get": {
                "tags": [
                    "CoverLetters"
                ],
                "summary": "Получение сопроводительного письма по вакансии (бесплатно)",
                "description": "Возвращает сопроводительное письмо по внешнему ID вакансии. ✅ БЕСПЛАТНО.",
                "operationId": "getCoverLetterByVacancyV2",
                "parameters": [
                    {
                        "name": "externalVacancyId",
                        "in": "path",
                        "description": "Внешний ID вакансии",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "service_code",
                        "in": "query",
                        "description": "Код сервиса (hh, sj, ...)",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "resume_id",
                        "in": "query",
                        "description": "ID резюме (опционально; если не передан — используется активное)",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "nullable": true
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Письмо успешно получено",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetCoverLetterResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/cover-letters/{externalVacancyId}/generate-styles": {
            "post": {
                "tags": [
                    "CoverLetters"
                ],
                "summary": "Генерация мульти-стилевых писем",
                "operationId": "generateCoverLetterStylesV2",
                "parameters": [
                    {
                        "name": "externalVacancyId",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "Idempotency-Key",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "service_code"
                                ],
                                "properties": {
                                    "service_code": {
                                        "type": "string",
                                        "example": "hh"
                                    },
                                    "resume_id": {
                                        "type": "integer",
                                        "nullable": true
                                    },
                                    "styles": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        }
                                    },
                                    "force_regenerate": {
                                        "type": "boolean",
                                        "default": false
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "OK"
                    },
                    "404": {
                        "description": "Feature disabled"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/cover-letters/vacancy/{externalVacancyId}/styles": {
            "get": {
                "tags": [
                    "CoverLetters"
                ],
                "summary": "Список стилей по вакансии",
                "operationId": "getCoverLetterStylesListV2",
                "parameters": [
                    {
                        "name": "externalVacancyId",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "service_code",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "resume_id",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    },
                    "404": {
                        "description": "Not found"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/cover-letters/vacancy/{externalVacancyId}/styles/{style}": {
            "get": {
                "tags": [
                    "CoverLetters"
                ],
                "summary": "Контент одного стиля",
                "operationId": "getCoverLetterStyleContentV2",
                "parameters": [
                    {
                        "name": "externalVacancyId",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "style",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "service_code",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "resume_id",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    },
                    "404": {
                        "description": "Not found"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/cover-letters/vacancy/{externalVacancyId}/styles/add": {
            "post": {
                "tags": [
                    "CoverLetters"
                ],
                "summary": "Добавить один стиль (1 CR)",
                "operationId": "addCoverLetterStyleV2",
                "parameters": [
                    {
                        "name": "externalVacancyId",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "Idempotency-Key",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "service_code",
                                    "resume_id",
                                    "style"
                                ],
                                "properties": {
                                    "service_code": {
                                        "type": "string"
                                    },
                                    "resume_id": {
                                        "type": "integer"
                                    },
                                    "style": {
                                        "type": "string"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "OK"
                    },
                    "409": {
                        "description": "Conflict"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/cover-letters/vacancy/{externalVacancyId}/styles/add-all": {
            "post": {
                "tags": [
                    "CoverLetters"
                ],
                "summary": "Добавить все оставшиеся стили (скидка)",
                "operationId": "addAllCoverLetterStylesV2",
                "parameters": [
                    {
                        "name": "externalVacancyId",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "Idempotency-Key",
                        "in": "header",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "service_code",
                                    "resume_id"
                                ],
                                "properties": {
                                    "service_code": {
                                        "type": "string"
                                    },
                                    "resume_id": {
                                        "type": "integer"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/cover-letters/preferences": {
            "get": {
                "tags": [
                    "CoverLetters"
                ],
                "summary": "Настройки стилей пользователя",
                "operationId": "getCoverLetterPreferencesV2",
                "responses": {
                    "200": {
                        "description": "OK"
                    },
                    "404": {
                        "description": "Feature disabled"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "put": {
                "tags": [
                    "CoverLetters"
                ],
                "summary": "Сохранить настройки стилей",
                "operationId": "setCoverLetterPreferencesV2",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "enabled_styles",
                                    "default_style"
                                ],
                                "properties": {
                                    "enabled_styles": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        }
                                    },
                                    "default_style": {
                                        "type": "string"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/credits/balance": {
            "get": {
                "tags": [
                    "Credits"
                ],
                "summary": "Получение баланса кредитов (бесплатно)",
                "description": "Возвращает текущий баланс кредитов пользователя. ✅ БЕСПЛАТНО.",
                "operationId": "getBalanceV2",
                "responses": {
                    "200": {
                        "description": "Баланс успешно получен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetBalanceResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/credits/history": {
            "get": {
                "tags": [
                    "Credits"
                ],
                "summary": "История транзакций кредитов (бесплатно)",
                "description": "Возвращает историю списаний и пополнений кредитов. ✅ БЕСПЛАТНО.",
                "operationId": "getCreditHistoryV2",
                "parameters": [
                    {
                        "name": "per_page",
                        "in": "query",
                        "description": "Количество элементов на странице",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "default": 10
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "История транзакций успешно получена",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetCreditHistoryResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/credits/costs": {
            "get": {
                "tags": [
                    "Credits"
                ],
                "summary": "Стоимость операций в кредитах (бесплатно)",
                "description": "Возвращает актуальные стоимости операций и пакеты кредитов. ✅ БЕСПЛАТНО.",
                "operationId": "getCreditCostsV2",
                "responses": {
                    "200": {
                        "description": "Стоимость операций успешно получена",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetCreditCostsResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/developer/sdk.zip": {
            "get": {
                "tags": [
                    "Developer"
                ],
                "summary": "Скачать SDK v2 (zip)",
                "description": "Возвращает zip-архив с автогенерируемым SDK v2 (TypeScript) и Zod схемами. Генерируется командой php artisan sdk:generate.",
                "operationId": "downloadSdkZipV2",
                "responses": {
                    "200": {
                        "description": "SDK v2 archive",
                        "content": {
                            "application/zip": {
                                "schema": {
                                    "type": "string",
                                    "format": "binary"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/external-api/keys": {
            "get": {
                "tags": [
                    "API Keys V2"
                ],
                "summary": "Список API ключей",
                "description": "Возвращает список всех API ключей пользователя. Требует авторизацию через user token.",
                "operationId": "listApiKeysV2",
                "responses": {
                    "200": {
                        "description": "Список получен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListApiKeysResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "API Keys V2"
                ],
                "summary": "Создать API ключ",
                "description": "Создает новый API ключ для внешних приложений. Ключ показывается только один раз в ответе. Требует авторизацию через user token (не API key).",
                "operationId": "generateApiKeyV2",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/GenerateApiKeyRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "API ключ успешно создан",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GenerateApiKeyResponseV2"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Ошибка валидации",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "properties": {
                                        "message": {
                                            "type": "string",
                                            "example": "The given data was invalid."
                                        },
                                        "errors": {
                                            "properties": {
                                                "name": {
                                                    "type": "array",
                                                    "items": {
                                                        "type": "string"
                                                    },
                                                    "example": [
                                                        "The name field is required."
                                                    ]
                                                }
                                            },
                                            "type": "object"
                                        }
                                    },
                                    "type": "object"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/external-api/keys/{id}": {
            "delete": {
                "tags": [
                    "API Keys V2"
                ],
                "summary": "Отозвать API ключ",
                "description": "Отзывает (soft delete) или удаляет (hard delete) API ключ. Если ключ уже отозван, выполняется полное удаление. Требует авторизацию через user token.",
                "operationId": "revokeApiKeyV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "description": "ID API ключа",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "API ключ успешно отозван или удален",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "properties": {
                                        "message": {
                                            "type": "string",
                                            "example": "API key revoked successfully"
                                        }
                                    },
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "API ключ не найден",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ErrorResponse"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/api/balance": {
            "get": {
                "tags": [
                    "Public API"
                ],
                "summary": "Получить баланс кредитов",
                "operationId": "getPublicApiBalanceV2",
                "responses": {
                    "200": {
                        "description": "Баланс получен"
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/api/credit-costs": {
            "get": {
                "tags": [
                    "Public API"
                ],
                "summary": "Получить стоимости кредитов",
                "operationId": "getPublicApiCreditCostsV2",
                "responses": {
                    "200": {
                        "description": "Стоимости получены"
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/api/usage": {
            "get": {
                "tags": [
                    "Public API"
                ],
                "summary": "Получить статистику использования",
                "operationId": "getUsageV2",
                "responses": {
                    "200": {
                        "description": "Статистика получена"
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/interviews": {
            "get": {
                "tags": [
                    "Interviews"
                ],
                "summary": "List interview stages",
                "operationId": "listInterviewStagesV2",
                "responses": {
                    "200": {
                        "description": "Interview stages retrieved successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListInterviewStagesResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Interviews"
                ],
                "summary": "Create interview stage",
                "operationId": "createInterviewStageV2",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/CreateInterviewStageRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Interview stage created successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/CreateInterviewStageResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/interviews/{stageId}": {
            "get": {
                "tags": [
                    "Interviews"
                ],
                "summary": "Get interview stage",
                "operationId": "getInterviewStageV2",
                "parameters": [
                    {
                        "name": "stageId",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Interview stage retrieved successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetInterviewStageResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "put": {
                "tags": [
                    "Interviews"
                ],
                "summary": "Update interview stage",
                "operationId": "updateInterviewStageV2",
                "parameters": [
                    {
                        "name": "stageId",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/UpdateInterviewStageRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Interview stage updated successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/UpdateInterviewStageResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Interviews"
                ],
                "summary": "Delete interview stage",
                "operationId": "deleteInterviewStageV2",
                "parameters": [
                    {
                        "name": "stageId",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Interview stage deleted successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/DeleteInterviewStageResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/interviews/{stageId}/reschedule": {
            "post": {
                "tags": [
                    "Interviews"
                ],
                "summary": "Reschedule interview stage",
                "operationId": "rescheduleInterviewStageV2",
                "parameters": [
                    {
                        "name": "stageId",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/RescheduleInterviewStageRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Interview stage rescheduled successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/RescheduleInterviewStageResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/interviews/{stageId}/result": {
            "post": {
                "tags": [
                    "Interviews"
                ],
                "summary": "Update interview stage result",
                "operationId": "updateInterviewStageResultV2",
                "parameters": [
                    {
                        "name": "stageId",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/UpdateStageResultRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Interview stage result updated successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/UpdateStageResultResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/interviews/extract-vacancy-text": {
            "post": {
                "tags": [
                    "Interviews"
                ],
                "summary": "Extract vacancy text from file",
                "description": "Uploads a vacancy file and extracts text (PDF, DOC, DOCX, TXT)",
                "operationId": "extractVacancyTextFromFileV2",
                "requestBody": {
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "required": [
                                    "file"
                                ],
                                "properties": {
                                    "file": {
                                        "type": "string",
                                        "format": "binary"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Vacancy text extracted successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ExtractVacancyTextFromFileResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/interviews/limits": {
            "get": {
                "tags": [
                    "Interviews"
                ],
                "summary": "Get interview calendar limits",
                "description": "Returns free limit, purchased blocks, active count, and auto-renewal settings",
                "operationId": "getInterviewLimitsV2",
                "responses": {
                    "200": {
                        "description": "Interview limits retrieved successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetInterviewLimitsResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/interviews/purchase-blocks": {
            "post": {
                "tags": [
                    "Interviews"
                ],
                "summary": "Purchase calendar blocks",
                "description": "Purchase blocks of +50 cards for 100 CR each (1-10 blocks)",
                "operationId": "purchaseCalendarBlocksV2",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "blocks_count"
                                ],
                                "properties": {
                                    "blocks_count": {
                                        "type": "integer",
                                        "maximum": 10,
                                        "minimum": 1,
                                        "example": 2
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Calendar blocks purchased successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetInterviewLimitsResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/interview/rejection-reasons": {
            "get": {
                "tags": [
                    "Interviews"
                ],
                "summary": "List rejection reasons",
                "description": "Get dictionary of rejection reasons",
                "operationId": "listRejectionReasonsV2",
                "parameters": [
                    {
                        "name": "category",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "company",
                                "candidate"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Rejection reasons retrieved successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListRejectionReasonsResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/interview-analytics/funnel": {
            "get": {
                "tags": [
                    "InterviewAnalytics"
                ],
                "summary": "Get interview funnel",
                "operationId": "getInterviewFunnelV2",
                "parameters": [
                    {
                        "name": "date_from",
                        "in": "query",
                        "description": "Start date (YYYY-MM-DD)",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "date_to",
                        "in": "query",
                        "description": "End date (YYYY-MM-DD)",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Funnel data retrieved successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/InterviewAnalyticsFunnelResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/interview-analytics/company-conversion": {
            "get": {
                "tags": [
                    "InterviewAnalytics"
                ],
                "summary": "Get company conversion",
                "operationId": "getInterviewCompanyConversionV2",
                "parameters": [
                    {
                        "name": "date_from",
                        "in": "query",
                        "description": "Start date (YYYY-MM-DD)",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "date_to",
                        "in": "query",
                        "description": "End date (YYYY-MM-DD)",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Company conversion retrieved successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/InterviewAnalyticsCompanyConversionResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/interview-analytics/salary": {
            "get": {
                "tags": [
                    "InterviewAnalytics"
                ],
                "summary": "Get salary analytics",
                "operationId": "getInterviewSalaryAnalyticsV2",
                "parameters": [
                    {
                        "name": "date_from",
                        "in": "query",
                        "description": "Start date (YYYY-MM-DD)",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "date_to",
                        "in": "query",
                        "description": "End date (YYYY-MM-DD)",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Salary analytics retrieved successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/InterviewAnalyticsSalaryResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/interview-analytics/resume-performance": {
            "get": {
                "tags": [
                    "InterviewAnalytics"
                ],
                "summary": "Get resume performance",
                "operationId": "getInterviewResumePerformanceV2",
                "parameters": [
                    {
                        "name": "date_from",
                        "in": "query",
                        "description": "Start date (YYYY-MM-DD)",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "date_to",
                        "in": "query",
                        "description": "End date (YYYY-MM-DD)",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Resume performance retrieved successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/InterviewAnalyticsResumePerformanceResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/interview-analytics/rejection-reasons": {
            "get": {
                "tags": [
                    "InterviewAnalytics"
                ],
                "summary": "Get rejection reasons",
                "operationId": "getInterviewRejectionReasonsV2",
                "parameters": [
                    {
                        "name": "date_from",
                        "in": "query",
                        "description": "Start date (YYYY-MM-DD)",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "date_to",
                        "in": "query",
                        "description": "End date (YYYY-MM-DD)",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Rejection reasons retrieved successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/InterviewAnalyticsRejectionReasonsResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/interview-analytics/ai-insights": {
            "post": {
                "tags": [
                    "InterviewAnalytics"
                ],
                "summary": "Generate AI insights",
                "operationId": "generateInterviewAIInsightsV2",
                "parameters": [
                    {
                        "name": "date_from",
                        "in": "query",
                        "description": "Start date (YYYY-MM-DD)",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    },
                    {
                        "name": "date_to",
                        "in": "query",
                        "description": "End date (YYYY-MM-DD)",
                        "schema": {
                            "type": "string",
                            "format": "date"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "AI insights generated successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/InterviewAnalyticsAIInsightsResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/job-search/services": {
            "get": {
                "tags": [
                    "JobSearch"
                ],
                "summary": "Получить список доступных сервисов",
                "operationId": "getServicesV2",
                "responses": {
                    "200": {
                        "description": "Сервисы получены",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetServicesResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/job-search/filters": {
            "get": {
                "tags": [
                    "JobSearch"
                ],
                "summary": "Получить унифицированные фильтры",
                "operationId": "getFiltersV2",
                "responses": {
                    "200": {
                        "description": "Фильтры получены",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetFiltersResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/job-search/filters-by-service": {
            "get": {
                "tags": [
                    "JobSearch"
                ],
                "summary": "Получить фильтры по сервисам",
                "operationId": "getFiltersByServiceV2",
                "responses": {
                    "200": {
                        "description": "Фильтры получены",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetFiltersByServiceResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/job-search/urls": {
            "post": {
                "tags": [
                    "JobSearch"
                ],
                "summary": "Сгенерировать URL поиска",
                "operationId": "generateUrlsV2",
                "responses": {
                    "200": {
                        "description": "URL сгенерированы",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GenerateUrlsResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/job-search/suggests/{type}": {
            "get": {
                "tags": [
                    "JobSearch"
                ],
                "summary": "Получить подсказки",
                "operationId": "getSuggestsV2",
                "parameters": [
                    {
                        "name": "type",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "areas",
                                "professional_roles",
                                "positions"
                            ]
                        },
                        "example": "positions"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Подсказки получены",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetSuggestsResponseV2"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad Request",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ErrorResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/job-search/regions": {
            "get": {
                "tags": [
                    "JobSearch"
                ],
                "summary": "Поиск регионов",
                "operationId": "getRegionsV2",
                "parameters": [
                    {
                        "name": "q",
                        "in": "query",
                        "description": "Поисковый запрос (минимум 2 символа)",
                        "required": false,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "service_id",
                        "in": "query",
                        "description": "ID сервиса для получения service_value",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "services",
                        "in": "query",
                        "description": "Массив кодов сервисов (hh, sj, trudvsem, zarplata, rabota, yandex, linkedin)",
                        "required": false,
                        "schema": {
                            "type": "array",
                            "items": {
                                "type": "string",
                                "enum": [
                                    "hh",
                                    "sj",
                                    "trudvsem",
                                    "zarplata",
                                    "rabota",
                                    "yandex",
                                    "linkedin"
                                ]
                            }
                        }
                    },
                    {
                        "name": "type",
                        "in": "query",
                        "description": "Тип региона",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "city",
                                "region",
                                "country"
                            ]
                        }
                    },
                    {
                        "name": "limit",
                        "in": "query",
                        "description": "Максимум результатов",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "default": 50,
                            "maximum": 100,
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Регионы получены",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/SearchRegionsResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/job-search/regions/{id}": {
            "get": {
                "tags": [
                    "JobSearch"
                ],
                "summary": "Получить регион по ID",
                "operationId": "getRegionV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    },
                    {
                        "name": "service_id",
                        "in": "query",
                        "description": "ID сервиса для получения service_value",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Регион получен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetRegionResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/job-search/regions/tree": {
            "get": {
                "tags": [
                    "JobSearch"
                ],
                "summary": "Получить дерево регионов",
                "operationId": "getRegionsTreeV2",
                "parameters": [
                    {
                        "name": "service_id",
                        "in": "query",
                        "description": "ID сервиса для фильтрации",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "parent_id",
                        "in": "query",
                        "description": "ID родительского региона (null для корня)",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "nullable": true
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Дерево регионов получено",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetRegionsTreeResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/job-search/regions/popular": {
            "get": {
                "tags": [
                    "JobSearch"
                ],
                "summary": "Получить популярные города",
                "operationId": "getJobSearchPopularRegionsV2",
                "parameters": [
                    {
                        "name": "service_id",
                        "in": "query",
                        "description": "ID сервиса для фильтрации",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "services",
                        "in": "query",
                        "description": "Массив кодов сервисов (hh, sj, trudvsem, zarplata, rabota, yandex, linkedin)",
                        "required": false,
                        "schema": {
                            "type": "array",
                            "items": {
                                "type": "string",
                                "enum": [
                                    "hh",
                                    "sj",
                                    "trudvsem",
                                    "zarplata",
                                    "rabota",
                                    "yandex",
                                    "linkedin"
                                ]
                            }
                        }
                    },
                    {
                        "name": "limit",
                        "in": "query",
                        "description": "Количество городов",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "default": 20,
                            "maximum": 50,
                            "minimum": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Популярные города получены",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetPopularCitiesResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/multi-search/start": {
            "post": {
                "tags": [
                    "MultiSearch"
                ],
                "summary": "Запустить мультипоиск",
                "operationId": "startMultiSearchV2",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/StartMultiSearchRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "202": {
                        "description": "Поиск запущен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/StartMultiSearchResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/multi-search/{id}/progress": {
            "get": {
                "tags": [
                    "MultiSearch"
                ],
                "summary": "Получить прогресс поиска",
                "operationId": "getProgressV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "description": "ID сессии поиска",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Прогресс получен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetProgressResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/multi-search/{id}/results": {
            "get": {
                "tags": [
                    "MultiSearch"
                ],
                "summary": "Получить результаты поиска",
                "operationId": "getResultsV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "description": "ID сессии поиска",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "min_match_score",
                        "in": "query",
                        "description": "Минимальный процент совпадения (0-100)",
                        "required": false,
                        "schema": {
                            "type": "number",
                            "format": "float",
                            "maximum": 100,
                            "minimum": 0,
                            "example": 70.5
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Результаты получены",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetResultsResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/multi-search/recent": {
            "get": {
                "tags": [
                    "MultiSearch"
                ],
                "summary": "Получить последние сессии поиска",
                "operationId": "getRecentSessionsV2",
                "responses": {
                    "200": {
                        "description": "Сессии получены",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetRecentSessionsResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/multi-search/availability": {
            "get": {
                "tags": [
                    "MultiSearch"
                ],
                "summary": "Получить доступность сервисов",
                "operationId": "getServiceAvailabilityV2",
                "responses": {
                    "200": {
                        "description": "Доступность сервисов получена",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetServiceAvailabilityResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/multi-search/quota": {
            "get": {
                "tags": [
                    "MultiSearch"
                ],
                "summary": "Получить квоту пользователя",
                "operationId": "getUserQuotaStatusV2",
                "responses": {
                    "200": {
                        "description": "Квота пользователя получена",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetUserQuotaStatusResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/payment-systems": {
            "get": {
                "tags": [
                    "Payments"
                ],
                "summary": "Получить список платежных систем",
                "operationId": "getPaymentSystemsV2",
                "responses": {
                    "200": {
                        "description": "Список платежных систем получен"
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/payments/calculate-cost": {
            "post": {
                "tags": [
                    "Payments"
                ],
                "summary": "Рассчитать стоимость кредитов",
                "operationId": "calculateCostV2",
                "responses": {
                    "200": {
                        "description": "Стоимость рассчитана"
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/payments": {
            "post": {
                "tags": [
                    "Payments"
                ],
                "summary": "Создать платеж",
                "operationId": "createPaymentV2",
                "responses": {
                    "201": {
                        "description": "Платеж создан"
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/payments/history": {
            "get": {
                "tags": [
                    "Payments"
                ],
                "summary": "Получить историю платежей",
                "operationId": "getPaymentHistoryV2",
                "responses": {
                    "200": {
                        "description": "История платежей получена"
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/payments/{uuid}/check": {
            "get": {
                "tags": [
                    "Payments"
                ],
                "summary": "Проверить статус платежа",
                "operationId": "checkPaymentV2",
                "responses": {
                    "200": {
                        "description": "Статус платежа получен"
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/payments/{id}": {
            "delete": {
                "tags": [
                    "Payments"
                ],
                "summary": "Отменить платеж",
                "operationId": "cancelPaymentV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Платеж отменен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/CancelPaymentResponseV2"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Payment cannot be cancelled",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ErrorResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/payments/subscription/{productKey}": {
            "post": {
                "tags": [
                    "Payments"
                ],
                "summary": "Оформить платёж за премиум-подписку",
                "description": "Создаёт платёж на подписку (например premium-monthly 10 000 ₽/мес). Возвращает payment_url для редиректа на оплату.",
                "operationId": "createSubscriptionPaymentV2",
                "parameters": [
                    {
                        "name": "productKey",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "example": "premium-monthly"
                        }
                    }
                ],
                "responses": {
                    "201": {
                        "description": "Платёж создан"
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/referral/info": {
            "get": {
                "tags": [
                    "Referral"
                ],
                "summary": "Публичная информация о программе (без авторизации)",
                "description": "Публичный эндпоинт v2 — только описание программы (без авторизации).\nДля внешних разработчиков; опасные методы (code, apply, stats, referrals) доступны только по v2.private с API ключом.",
                "operationId": "getReferralInfoV2",
                "responses": {
                    "200": {
                        "description": "Условия и примеры",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetReferralInfoResponseV2"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/v2/referral/code": {
            "get": {
                "tags": [
                    "Referral"
                ],
                "summary": "Получить или создать реферальный код (API ключ)",
                "operationId": "getReferralCodeV2",
                "responses": {
                    "200": {
                        "description": "Код и ссылка",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetReferralCodeResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Unauthorized"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/referral/apply": {
            "post": {
                "tags": [
                    "Referral"
                ],
                "summary": "Применить реферальный код (API ключ)",
                "operationId": "applyReferralCodeV2",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/ApplyReferralCodeRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Код применён",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ApplyReferralCodeResponseV2"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Ошибка (свой код, уже привязан, код не найден)"
                    },
                    "401": {
                        "description": "Unauthorized"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/referral/stats": {
            "get": {
                "tags": [
                    "Referral"
                ],
                "summary": "Статистика рефералов (API ключ)",
                "operationId": "getReferralStatsV2",
                "responses": {
                    "200": {
                        "description": "Статистика",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetReferralStatsResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Unauthorized"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/referral/referrals": {
            "get": {
                "tags": [
                    "Referral"
                ],
                "summary": "Список приглашённых с пагинацией (API ключ)",
                "operationId": "getReferralsV2",
                "parameters": [
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "default": 15
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Список рефералов",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetReferralsResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Unauthorized"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/categories": {
            "get": {
                "tags": [
                    "Resume Categories"
                ],
                "summary": "Получение списка категорий резюме",
                "description": "Возвращает список категорий резюме пользователя с количеством резюме в каждой категории",
                "operationId": "listResumeCategoriesV2",
                "responses": {
                    "200": {
                        "description": "Список категорий успешно получен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListCategoriesResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "Resume Categories"
                ],
                "summary": "Создание категории резюме",
                "description": "Создает новую категорию резюме для текущего пользователя",
                "operationId": "createResumeCategoryV2",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/CreateCategoryRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Категория успешно создана",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/CreateCategoryResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/categories/{id}": {
            "put": {
                "tags": [
                    "Resume Categories"
                ],
                "summary": "Обновление категории резюме",
                "description": "Обновляет данные категории резюме (название, цвет, иконку, порядок сортировки)",
                "operationId": "updateResumeCategoryV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "description": "ID категории",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/UpdateCategoryRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Категория успешно обновлена",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/UpdateCategoryResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Resume Categories"
                ],
                "summary": "Удаление категории резюме",
                "description": "Удаляет категорию резюме. Системные категории не могут быть удалены",
                "operationId": "deleteResumeCategoryV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "description": "ID категории",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Категория успешно удалена",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/DeleteCategoryResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "403": {
                        "$ref": "#/components/responses/ForbiddenV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/categories/with-items": {
            "get": {
                "tags": [
                    "Resume Categories"
                ],
                "summary": "Получение категорий с резюме",
                "description": "Возвращает категории с резюме для страницы коллекций. Автоматически создает категории по умолчанию, если их нет",
                "operationId": "getCategoriesWithItemsV2",
                "responses": {
                    "200": {
                        "description": "Категории с резюме успешно получены",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetCategoriesWithItemsResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/categories/move-item": {
            "put": {
                "tags": [
                    "Resume Categories"
                ],
                "summary": "Перемещение резюме в категорию",
                "description": "Перемещает резюме в категорию или удаляет из категории (если category_id = null)",
                "operationId": "moveResumeToCategoryV2",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/MoveItemRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Резюме успешно перемещено",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/MoveItemResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/categories/reorder": {
            "put": {
                "tags": [
                    "Resume Categories"
                ],
                "summary": "Изменение порядка категорий",
                "description": "Изменяет порядок категорий резюме пользователя",
                "operationId": "reorderCategoriesV2",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/ReorderCategoriesRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Порядок категорий успешно изменен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ReorderCategoriesResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes": {
            "get": {
                "tags": [
                    "Resumes"
                ],
                "summary": "Получение списка резюме (бесплатно)",
                "description": "Возвращает все резюме аутентифицированного пользователя. ✅ БЕСПЛАТНО.",
                "operationId": "listResumesV2",
                "responses": {
                    "200": {
                        "description": "Success",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListResumesResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/{id}": {
            "get": {
                "tags": [
                    "Resumes"
                ],
                "summary": "Получение деталей резюме (бесплатно)",
                "description": "Возвращает детальную информацию о конкретном резюме. ✅ БЕСПЛАТНО.",
                "operationId": "getResumeV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetResumeResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "403": {
                        "$ref": "#/components/responses/ForbiddenV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "put": {
                "tags": [
                    "Resumes"
                ],
                "summary": "Update resume",
                "description": "Updates resume information",
                "operationId": "updateResumeV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/UpdateResumeRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Resume updated successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/UpdateResumeResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "403": {
                        "$ref": "#/components/responses/ForbiddenV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Resumes"
                ],
                "summary": "Delete resume",
                "description": "Deletes a resume (soft delete)",
                "operationId": "deleteResumeV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Resume deleted successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/DeleteResumeResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "403": {
                        "$ref": "#/components/responses/ForbiddenV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/{id}/select": {
            "post": {
                "tags": [
                    "Resumes"
                ],
                "summary": "Выбор активного резюме (бесплатно)",
                "description": "Устанавливает резюме как активное для откликов на вакансии. ✅ БЕСПЛАТНО.",
                "operationId": "selectResumeV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Resume selected successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/SelectResumeResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "403": {
                        "$ref": "#/components/responses/ForbiddenV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/upload": {
            "post": {
                "tags": [
                    "Resumes"
                ],
                "summary": "Upload resume from file",
                "description": "Uploads and parses a resume file (PDF, DOC, DOCX, TXT, RTF)",
                "operationId": "uploadResumeV2",
                "requestBody": {
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "required": [
                                    "file"
                                ],
                                "properties": {
                                    "file": {
                                        "type": "string",
                                        "format": "binary"
                                    },
                                    "title": {
                                        "type": "string",
                                        "nullable": true
                                    },
                                    "category_id": {
                                        "type": "integer",
                                        "nullable": true
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Resume uploaded and parsed successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ImportResumeFromFileResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/{id}/recognize": {
            "post": {
                "tags": [
                    "Resumes"
                ],
                "summary": "AI-распознавание структуры резюме (10 CR)",
                "description": "Использует AI для парсинга и структурирования текста резюме. ⚠️ ПЛАТНАЯ ОПЕРАЦИЯ: 10 CR.",
                "operationId": "recognizeResumeV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/RecognizeResumeRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Resume recognized successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/RecognizeResumeResponseV2"
                                }
                            }
                        }
                    },
                    "402": {
                        "description": "Insufficient credits",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ErrorResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "403": {
                        "$ref": "#/components/responses/ForbiddenV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/{id}/enhance": {
            "post": {
                "tags": [
                    "Resumes"
                ],
                "summary": "AI-улучшение резюме (платно)",
                "description": "Создает новую AI-улучшенную версию резюме. ⚠️ ПЛАТНАЯ ОПЕРАЦИЯ: стоимость зависит от объема.",
                "operationId": "enhanceResumeV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Resume enhanced successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/EnhanceResumeResponseV2"
                                }
                            }
                        }
                    },
                    "402": {
                        "description": "Insufficient credits",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ErrorResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "403": {
                        "$ref": "#/components/responses/ForbiddenV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/{id}/photo": {
            "post": {
                "tags": [
                    "Resumes"
                ],
                "summary": "Upload resume photo",
                "description": "Uploads a photo for the resume",
                "operationId": "uploadResumePhotoV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "required": [
                                    "photo"
                                ],
                                "properties": {
                                    "photo": {
                                        "type": "string",
                                        "format": "binary"
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Photo uploaded successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/UploadResumePhotoResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "403": {
                        "$ref": "#/components/responses/ForbiddenV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "Resumes"
                ],
                "summary": "Delete resume photo",
                "description": "Deletes the photo from resume",
                "operationId": "deleteResumePhotoV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Photo deleted successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/DeleteResumePhotoResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "403": {
                        "$ref": "#/components/responses/ForbiddenV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/{id}/export": {
            "get": {
                "tags": [
                    "Resumes"
                ],
                "summary": "Export resume",
                "description": "Exports resume to PDF, DOCX, or RTF format",
                "operationId": "exportResumeV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    },
                    {
                        "name": "format",
                        "in": "query",
                        "description": "Export format (uses marketing preset by default)",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "default": "pdf",
                            "enum": [
                                "pdf",
                                "docx",
                                "rtf"
                            ]
                        },
                        "example": "pdf"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Resume exported successfully",
                        "content": {
                            "application/pdf": {
                                "schema": {
                                    "type": "string",
                                    "format": "binary"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "403": {
                        "$ref": "#/components/responses/ForbiddenV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/{id}/generate-ai-cv": {
            "post": {
                "tags": [
                    "Resumes"
                ],
                "summary": "AI-генерация улучшенного CV (5 CR)",
                "description": "Генерирует AI-улучшенную версию CV. ⚠️ ПЛАТНАЯ ОПЕРАЦИЯ: 5 CR.",
                "operationId": "generateAICVV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "AI CV generated successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GenerateAICVResponseV2"
                                }
                            }
                        }
                    },
                    "402": {
                        "description": "Insufficient credits",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ErrorResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "403": {
                        "$ref": "#/components/responses/ForbiddenV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/{id}/job-search-status": {
            "patch": {
                "tags": [
                    "Resumes"
                ],
                "summary": "Update job search status",
                "description": "Updates the job search status for the resume",
                "operationId": "updateJobSearchStatusV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/UpdateJobSearchStatusRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Job search status updated successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/UpdateJobSearchStatusResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "403": {
                        "$ref": "#/components/responses/ForbiddenV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/{id}/sort-order": {
            "put": {
                "tags": [
                    "Resumes"
                ],
                "summary": "Update vacancy search sort order",
                "description": "Updates the vacancy search sort order for the resume",
                "operationId": "updateSortOrderV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/UpdateSortOrderRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Sort order updated successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/UpdateSortOrderResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "403": {
                        "$ref": "#/components/responses/ForbiddenV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/career-path": {
            "post": {
                "tags": [
                    "Resumes"
                ],
                "summary": "Анализ карьерного пути",
                "description": "AI-анализ карьерного пути на основе резюме. ⚠️ ПЛАТНАЯ ОПЕРАЦИЯ: 20 CR.",
                "operationId": "analyzeCareerPathV2",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/AnalyzeCareerPathRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Анализ успешно выполнен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/CareerPathResponseV2"
                                }
                            }
                        }
                    },
                    "402": {
                        "description": "Недостаточно кредитов",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ErrorResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/career-path/cached": {
            "get": {
                "tags": [
                    "Resumes"
                ],
                "summary": "Получить кэшированный анализ карьеры",
                "description": "Получение кэшированного анализа карьерного пути (бесплатно). ✅ FREE (cached results only).",
                "operationId": "getCachedCareerPathV2",
                "parameters": [
                    {
                        "name": "resume_id",
                        "in": "query",
                        "description": "ID резюме",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Кэшированный анализ получен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/CareerPathResponseV2"
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/skills-gap": {
            "post": {
                "tags": [
                    "Resumes"
                ],
                "summary": "Анализ пробелов навыков",
                "description": "AI-анализ пробелов навыков относительно целевой позиции. ⚠️ ПЛАТНАЯ ОПЕРАЦИЯ: 15 CR.",
                "operationId": "analyzeSkillsGapV2",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/AnalyzeSkillsGapRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Анализ успешно выполнен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/SkillsGapResponseV2"
                                }
                            }
                        }
                    },
                    "402": {
                        "description": "Недостаточно кредитов",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ErrorResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/skills-gap/cached": {
            "get": {
                "tags": [
                    "Resumes"
                ],
                "summary": "Получить кэшированный анализ навыков",
                "description": "Получение кэшированного анализа пробелов навыков (бесплатно). ✅ FREE (cached results only).",
                "operationId": "getCachedSkillsGapV2",
                "parameters": [
                    {
                        "name": "resume_id",
                        "in": "query",
                        "description": "ID резюме",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Кэшированный анализ получен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/SkillsGapResponseV2"
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/career/chat": {
            "post": {
                "tags": [
                    "Resumes"
                ],
                "summary": "Карьерный чат",
                "description": "Чат с AI карьерным коучем на основе резюме. ⚠️ ПЛАТНАЯ ОПЕРАЦИЯ: 5 CR (первые 3 вопроса бесплатно).",
                "operationId": "careerChatV2",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/CareerChatRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Ответ AI-коуча получен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/CareerChatResponseV2"
                                }
                            }
                        }
                    },
                    "402": {
                        "description": "Недостаточно кредитов",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ErrorResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/salary-benchmark": {
            "post": {
                "tags": [
                    "Resumes"
                ],
                "summary": "Бенчмарк зарплаты",
                "description": "AI-анализ зарплатного бенчмарка для резюме. ⚠️ ПЛАТНАЯ ОПЕРАЦИЯ: 10 CR.",
                "operationId": "analyzeSalaryBenchmarkV2",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/AnalyzeSalaryBenchmarkRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Анализ успешно выполнен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/SalaryBenchmarkResponseV2"
                                }
                            }
                        }
                    },
                    "402": {
                        "description": "Недостаточно кредитов",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ErrorResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/salary-benchmark/cached": {
            "get": {
                "tags": [
                    "Resumes"
                ],
                "summary": "Получить кэшированный бенчмарк зарплаты",
                "description": "Получение кэшированного анализа зарплатного бенчмарка (бесплатно). ✅ FREE (cached results only).",
                "operationId": "getCachedSalaryBenchmarkV2",
                "parameters": [
                    {
                        "name": "resume_id",
                        "in": "query",
                        "description": "ID резюме",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "current_salary",
                        "in": "query",
                        "description": "Текущая зарплата (опционально)",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "current_salary_currency",
                        "in": "query",
                        "description": "Валюта текущей зарплаты (опционально)",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "example": "RUB"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Кэшированный анализ получен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/SalaryBenchmarkResponseV2"
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/tailor-to-vacancy": {
            "post": {
                "tags": [
                    "Resumes"
                ],
                "summary": "Tailor resume to vacancy",
                "description": "Create a new AI-tailored resume specifically optimized for a vacancy. ⚠️ ПЛАТНАЯ ОПЕРАЦИЯ: 40 CR.",
                "operationId": "tailorResumeToVacancyV2",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/TailorResumeToVacancyRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Success - Tailored resume created",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "properties": {
                                        "message": {
                                            "type": "string",
                                            "example": "Resume tailored successfully"
                                        },
                                        "data": {
                                            "$ref": "#/components/schemas/ResumeV2"
                                        }
                                    },
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "402": {
                        "description": "Insufficient credits (required: 40 CR)",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ErrorResponseV2"
                                }
                            }
                        }
                    },
                    "403": {
                        "$ref": "#/components/responses/ForbiddenV2"
                    },
                    "404": {
                        "description": "Base resume not found or vacancy not analyzed",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ErrorResponseV2"
                                }
                            }
                        }
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "503": {
                        "description": "AI service unavailable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ErrorResponseV2"
                                }
                            }
                        }
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/{id}/download-ai-cv": {
            "get": {
                "tags": [
                    "Resumes"
                ],
                "summary": "Скачать AI-резюме",
                "description": "Скачивает ранее сгенерированное AI-резюме в формате PDF, DOCX или RTF. ✅ БЕСПЛАТНО после генерации.",
                "operationId": "downloadAiCvV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    },
                    {
                        "name": "format",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "default": "pdf",
                            "enum": [
                                "pdf",
                                "docx",
                                "rtf"
                            ]
                        },
                        "example": "pdf"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Файл AI-резюме успешно скачан",
                        "content": {
                            "application/pdf": {
                                "schema": {
                                    "type": "string",
                                    "format": "binary"
                                }
                            },
                            "application/vnd.openxmlformats-officedocument.wordprocessingml.document": {
                                "schema": {
                                    "type": "string",
                                    "format": "binary"
                                }
                            },
                            "application/rtf": {
                                "schema": {
                                    "type": "string",
                                    "format": "binary"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "403": {
                        "$ref": "#/components/responses/ForbiddenV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "400": {
                        "description": "AI-резюме ещё не сгенерировано или неверный формат",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ErrorResponseV2"
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/career-analysis/export": {
            "get": {
                "tags": [
                    "Resumes"
                ],
                "summary": "Экспорт карьерного анализа",
                "description": "Экспорт карьерного анализа (Career Path + Skills Gap) в PDF/DOCX/RTF. ✅ БЕСПЛАТНО — экспортирует только закэшированные результаты.",
                "operationId": "exportCareerAnalysisV2",
                "parameters": [
                    {
                        "name": "resume_id",
                        "in": "query",
                        "description": "ID резюме",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "format",
                        "in": "query",
                        "description": "Формат экспорта",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "default": "pdf",
                            "enum": [
                                "pdf",
                                "docx",
                                "rtf"
                            ]
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Файл успешно сгенерирован",
                        "content": {
                            "application/octet-stream": {
                                "schema": {
                                    "type": "string",
                                    "format": "binary"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "400": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/{id}/upgrade": {
            "post": {
                "tags": [
                    "ResumeUpgrade"
                ],
                "summary": "Upgrade resume using AI",
                "description": "Starts the resume upgrade process using AI. Costs 50 credits.",
                "operationId": "upgradeResumeV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Resume upgrade started successfully",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/UpgradeResumeResponseV2"
                                }
                            }
                        }
                    },
                    "402": {
                        "description": "Insufficient credits",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ErrorResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "403": {
                        "$ref": "#/components/responses/ForbiddenV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/upgrades": {
            "get": {
                "tags": [
                    "ResumeUpgrade"
                ],
                "summary": "Get resume upgrade history",
                "description": "Returns paginated list of resume upgrades for the authenticated user",
                "operationId": "getUpgradeHistoryV2",
                "parameters": [
                    {
                        "name": "per_page",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "default": 15,
                            "maximum": 100,
                            "minimum": 1
                        },
                        "example": 15
                    },
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "default": 1,
                            "minimum": 1
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetUpgradeHistoryResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/resumes/upgrades/{id}": {
            "get": {
                "tags": [
                    "ResumeUpgrade"
                ],
                "summary": "Get resume upgrade details",
                "description": "Returns details of a specific resume upgrade",
                "operationId": "getUpgradeDetailsV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetUpgradeDetailsResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "403": {
                        "$ref": "#/components/responses/ForbiddenV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/saved-searches": {
            "get": {
                "tags": [
                    "SavedSearch"
                ],
                "summary": "Список сохраненных поисков",
                "operationId": "listSavedSearchesV2",
                "parameters": [
                    {
                        "name": "source",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "local",
                                "hh_synced"
                            ]
                        },
                        "example": "local"
                    },
                    {
                        "name": "resume_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    },
                    {
                        "name": "starred",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "boolean"
                        },
                        "example": true
                    },
                    {
                        "name": "category_id",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Список поисков",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListSavedSearchesResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "post": {
                "tags": [
                    "SavedSearch"
                ],
                "summary": "Создать сохраненный поиск",
                "operationId": "createSavedSearchV2",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/CreateSavedSearchRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Поиск создан",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/CreateSavedSearchResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/saved-searches/{id}": {
            "get": {
                "tags": [
                    "SavedSearch"
                ],
                "summary": "Получить сохраненный поиск",
                "operationId": "getSavedSearchV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Поиск найден",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetSavedSearchResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "put": {
                "tags": [
                    "SavedSearch"
                ],
                "summary": "Обновить сохраненный поиск",
                "operationId": "updateSavedSearchV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/UpdateSavedSearchRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Поиск обновлен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/UpdateSavedSearchResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "delete": {
                "tags": [
                    "SavedSearch"
                ],
                "summary": "Удалить сохраненный поиск",
                "operationId": "deleteSavedSearchV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Поиск удален",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/DeleteSavedSearchResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/saved-searches/{id}/toggle-starred": {
            "post": {
                "tags": [
                    "SavedSearch"
                ],
                "summary": "Переключить избранное",
                "operationId": "toggleStarredV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Статус изменен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ToggleStarredResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/saved-searches/reorder": {
            "post": {
                "tags": [
                    "SavedSearch"
                ],
                "summary": "Изменить порядок поисков",
                "operationId": "reorderSearchesV2",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/ReorderSearchesRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Порядок сохранен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ReorderSearchesResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/saved-searches/{id}/sort-order": {
            "put": {
                "tags": [
                    "SavedSearch"
                ],
                "summary": "Обновить порядок сортировки",
                "operationId": "updateSavedSearchSortOrderV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    }
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/UpdateSavedSearchSortOrderRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Порядок обновлен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/UpdateSavedSearchSortOrderResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/saved-searches/{id}/select": {
            "post": {
                "tags": [
                    "SavedSearch"
                ],
                "summary": "Выбрать активный поиск",
                "operationId": "selectSavedSearchV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "example": 1
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Поиск выбран",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/SelectSavedSearchResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/saved-searches/filters-compatibility": {
            "get": {
                "tags": [
                    "SavedSearch"
                ],
                "summary": "Получить совместимость фильтров",
                "operationId": "getFiltersCompatibilityV2",
                "parameters": [
                    {
                        "name": "service_ids",
                        "in": "query",
                        "required": false,
                        "style": "form",
                        "explode": true,
                        "schema": {
                            "type": "array",
                            "items": {
                                "type": "integer"
                            }
                        },
                        "example": [
                            1,
                            2
                        ]
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Совместимость фильтров",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetFiltersCompatibilityResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/saved-searches/preview-urls": {
            "post": {
                "tags": [
                    "SavedSearch"
                ],
                "summary": "Получить предпросмотр URL",
                "operationId": "previewUrlsV2",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/PreviewUrlsRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "URL для предпросмотра",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/PreviewUrlsResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancies/analyze": {
            "post": {
                "tags": [
                    "Analyze"
                ],
                "summary": "Анализ вакансии (10 CR)",
                "description": "AI-анализ вакансии через GigaChat. ⚠️ ПЛАТНАЯ ОПЕРАЦИЯ: 10 CR (бесплатно при наличии кэша в vacancy_history). Возвращает VacancyCardDTO с полным анализом.",
                "operationId": "analyzeVacancyV2",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/AnalyzeVacancyRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Вакансия успешно проанализирована",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/AnalyzeVacancyResponseV2"
                                }
                            }
                        }
                    },
                    "402": {
                        "description": "Недостаточно кредитов",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ErrorResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancies/letter": {
            "post": {
                "tags": [
                    "Analyze"
                ],
                "summary": "Генерация сопроводительного письма (5 CR)",
                "description": "AI-генерация сопроводительного письма для вакансии. ⚠️ ПЛАТНАЯ ОПЕРАЦИЯ: 5 CR (бесплатно при наличии кэша в vacancy_history). Возвращает VacancyCardDTO с письмом.",
                "operationId": "generateLetterV2",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/GenerateLetterRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Письмо успешно сгенерировано",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GenerateLetterResponseV2"
                                }
                            }
                        }
                    },
                    "402": {
                        "description": "Недостаточно кредитов",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ErrorResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancies/analyze-all": {
            "post": {
                "tags": [
                    "Analyze"
                ],
                "summary": "Массовый анализ вакансий (10 CR × N)",
                "description": "Массовый AI-анализ вакансий через GigaChat. ⚠️ ПЛАТНАЯ ОПЕРАЦИЯ: 10 CR за каждую новую вакансию (бесплатно для закэшированных в vacancy_history). Возвращает VacancyCardListDTO с результатами и статистикой.",
                "operationId": "analyzeAllVacanciesV2",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/AnalyzeAllRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Вакансии успешно проанализированы",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/AnalyzeAllResponseV2"
                                }
                            }
                        }
                    },
                    "402": {
                        "description": "Недостаточно кредитов для анализа всех вакансий",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ErrorResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancies/analyze-session/start": {
            "post": {
                "tags": [
                    "Analyze"
                ],
                "summary": "Запуск сессии анализа (асинхронно)",
                "description": "Запускает асинхронную сессию анализа списка вакансий. UI должен опрашивать статус сессии для прогресса.",
                "operationId": "startAnalyzeSessionV2",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/StartAnalyzeSessionRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Сессия анализа успешно запущена",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/StartAnalyzeSessionResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancies/analyze-session/{id}": {
            "get": {
                "tags": [
                    "Analyze"
                ],
                "summary": "Статус сессии анализа",
                "description": "Возвращает статус и прогресс асинхронной сессии анализа для polling UI.",
                "operationId": "getAnalyzeSessionV2",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "description": "ID сессии анализа",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Статус сессии успешно получен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetAnalyzeSessionResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancies/{serviceCode}/{externalVacancyId}/analysis/check": {
            "get": {
                "tags": [
                    "Analyze"
                ],
                "summary": "Проверка наличия анализа (бесплатно)",
                "description": "Легковесная проверка наличия анализа вакансии в vacancy_history. ✅ БЕСПЛАТНО. Не выполняет анализ, только проверяет кеш. Используется расширением для проверки перед показом кнопки анализа.",
                "operationId": "checkVacancyAnalysisV2",
                "parameters": [
                    {
                        "name": "serviceCode",
                        "in": "path",
                        "description": "Код сервиса (hh, sj, etc.)",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "externalVacancyId",
                        "in": "path",
                        "description": "Внешний ID вакансии",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "resume_id",
                        "in": "query",
                        "description": "ID резюме (если не указано, используется активное)",
                        "required": false,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Проверка выполнена",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "properties": {
                                        "exists": {
                                            "type": "boolean",
                                            "example": true
                                        },
                                        "match_score": {
                                            "type": "number",
                                            "example": 85.5,
                                            "nullable": true
                                        },
                                        "match_data": {
                                            "type": "object",
                                            "nullable": true
                                        },
                                        "created_at": {
                                            "type": "string",
                                            "example": "2025-12-15T10:30:00Z",
                                            "nullable": true
                                        },
                                        "updated_at": {
                                            "type": "string",
                                            "example": "2025-12-15T10:30:00Z",
                                            "nullable": true
                                        }
                                    },
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "description": "Анализ не найден",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "properties": {
                                        "exists": {
                                            "type": "boolean",
                                            "example": false
                                        }
                                    },
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancies/analysis/check-multiple": {
            "post": {
                "tags": [
                    "Analyze"
                ],
                "summary": "Массовая проверка анализов (бесплатно)",
                "description": "Легковесная проверка наличия анализов для нескольких вакансий. ✅ БЕСПЛАТНО. Не выполняет анализ, только проверяет кеш. Используется расширением для проверки на страницах списков вакансий.",
                "operationId": "checkMultipleVacancyAnalysisV2",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "vacancies"
                                ],
                                "properties": {
                                    "vacancies": {
                                        "description": "Массив вакансий для проверки",
                                        "type": "array",
                                        "items": {
                                            "required": [
                                                "service_code",
                                                "external_vacancy_id"
                                            ],
                                            "properties": {
                                                "service_code": {
                                                    "type": "string",
                                                    "example": "hh"
                                                },
                                                "external_vacancy_id": {
                                                    "type": "string",
                                                    "example": "12345678"
                                                }
                                            },
                                            "type": "object"
                                        }
                                    },
                                    "resume_id": {
                                        "description": "ID резюме (если не указано, используется активное)",
                                        "type": "integer",
                                        "nullable": true
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Проверка выполнена",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "properties": {
                                        "results": {
                                            "description": "Карта результатов: ключ = 'service_code:external_vacancy_id', значение = данные анализа или null",
                                            "type": "object",
                                            "additionalProperties": {
                                                "oneOf": [
                                                    {
                                                        "type": "object",
                                                        "nullable": true
                                                    },
                                                    {
                                                        "type": "null"
                                                    }
                                                ]
                                            }
                                        }
                                    },
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/search/parse-url": {
            "post": {
                "tags": [
                    "Search"
                ],
                "summary": "Парсинг URL в фильтры (бесплатно)",
                "description": "Преобразует URL поиска вакансий (hh.ru, superjob.ru и др.) в унифицированные фильтры. ✅ БЕСПЛАТНО.",
                "operationId": "parseSearchUrlV2",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/ParseUrlRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "URL успешно распарсен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ParseUrlResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/search/get-url": {
            "post": {
                "tags": [
                    "Search"
                ],
                "summary": "Генерация URL из фильтров (бесплатно)",
                "description": "Преобразует унифицированные фильтры в URL поиска для указанных сервисов. ✅ БЕСПЛАТНО.",
                "operationId": "getSearchUrlV2",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/GetUrlRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "URL успешно сгенерированы",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetUrlResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/search": {
            "post": {
                "tags": [
                    "Search"
                ],
                "summary": "Поиск вакансий (бесплатно)",
                "description": "Ищет вакансии по URL или сохранённому поиску. Если передан URL, парсит его в фильтры и ищет вакансии. Если передан saved_search_id, использует сохранённый поиск. ✅ БЕСПЛАТНО.",
                "operationId": "searchVacanciesV2",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/SearchRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Поиск успешно выполнен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/SearchResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/search/by-query": {
            "post": {
                "tags": [
                    "Search"
                ],
                "summary": "Поиск по запросу (бесплатно)",
                "description": "Поиск вакансий по текстовому запросу (Elasticsearch, enterprise search). Не меняет URL поиска. ✅ БЕСПЛАТНО.",
                "operationId": "searchVacanciesByQueryV2",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/SearchByQueryRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Поиск выполнен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/SearchResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/search/by-resume/{resumeId}": {
            "post": {
                "tags": [
                    "Search"
                ],
                "summary": "Поиск по резюме (бесплатно)",
                "description": "Поиск вакансий по резюме (Elasticsearch). ✅ БЕСПЛАТНО.",
                "operationId": "searchVacanciesByResumeV2",
                "parameters": [
                    {
                        "name": "resumeId",
                        "in": "path",
                        "description": "ID резюме",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/SearchByResumeRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Поиск выполнен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/SearchResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancies": {
            "get": {
                "tags": [
                    "Vacancies"
                ],
                "summary": "Получение списка вакансий пользователя (бесплатно)",
                "description": "Возвращает список вакансий пользователя с учётом фильтров и сохранённых поисков. ✅ БЕСПЛАТНО.",
                "operationId": "listVacanciesV2",
                "parameters": [
                    {
                        "name": "filtered",
                        "in": "query",
                        "description": "Если true — возвращаются только AI-отфильтрованные вакансии",
                        "required": false,
                        "schema": {
                            "type": "boolean",
                            "default": false
                        }
                    },
                    {
                        "name": "saved_search_id",
                        "in": "query",
                        "description": "Опциональный фильтр по сохранённому поиску",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "nullable": true
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Список вакансий успешно получен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListVacanciesResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancies/{serviceCode}/{externalVacancyId}": {
            "get": {
                "tags": [
                    "Vacancies"
                ],
                "summary": "Получение одной вакансии (бесплатно)",
                "description": "Возвращает детальную карточку вакансии для указанного сервиса и внешнего ID. ✅ БЕСПЛАТНО.",
                "operationId": "getVacancyV2",
                "parameters": [
                    {
                        "name": "serviceCode",
                        "in": "path",
                        "description": "Код сервиса работы",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "externalVacancyId",
                        "in": "path",
                        "description": "Внешний идентификатор вакансии",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Вакансия успешно получена",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetVacancyResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            },
            "put": {
                "tags": [
                    "Vacancies"
                ],
                "summary": "Обновление пользовательских данных вакансии (бесплатно)",
                "description": "Обновляет заметки, теги, статусы и другие пользовательские данные вакансии. ✅ БЕСПЛАТНО.",
                "operationId": "updateVacancyDataV2",
                "parameters": [
                    {
                        "name": "serviceCode",
                        "in": "path",
                        "description": "Код сервиса работы",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "externalVacancyId",
                        "in": "path",
                        "description": "Внешний идентификатор вакансии",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/UpdateVacancyDataRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Данные вакансии успешно обновлены",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/UpdateVacancyDataResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancies/{serviceCode}/{externalVacancyId}/hide": {
            "post": {
                "tags": [
                    "Vacancies"
                ],
                "summary": "Скрыть вакансию (бесплатно)",
                "description": "Помечает вакансию как скрытую для текущего пользователя. ✅ БЕСПЛАТНО.",
                "operationId": "hideVacancyV2",
                "parameters": [
                    {
                        "name": "serviceCode",
                        "in": "path",
                        "description": "Код сервиса работы",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "externalVacancyId",
                        "in": "path",
                        "description": "Внешний идентификатор вакансии",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Вакансия успешно скрыта",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/HideVacancyResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancies/fetch": {
            "post": {
                "tags": [
                    "Vacancies"
                ],
                "summary": "Обогащение вакансии из внешнего сервиса (бесплатно)",
                "description": "Обогащает/обновляет данные вакансии через внешний job-сервис (HeadHunter, SuperJob и т.д.) с проверкой кеша. ✅ БЕСПЛАТНО.",
                "operationId": "fetchVacancyV2",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/FetchVacancyRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Вакансия успешно обогащена",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/FetchVacancyResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancies/fetch-all": {
            "post": {
                "tags": [
                    "Vacancies"
                ],
                "summary": "Массовое обогащение вакансий (бесплатно)",
                "description": "Пакетное обогащение вакансий с проверкой кеша и статистикой обработки. ✅ БЕСПЛАТНО.",
                "operationId": "fetchAllVacanciesV2",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/FetchAllVacanciesRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Вакансии успешно обогащены",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ListVacanciesResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancies/sync-from-client": {
            "post": {
                "tags": [
                    "Vacancies"
                ],
                "summary": "Синхронизация вакансий с клиента (только запись в БД)",
                "description": "Принимает от клиента (desktop) уже полученные данные вакансий и только записывает их в БД. Не выполняет запросов к HH/сервисам. ✅ БЕСПЛАТНО.",
                "operationId": "syncVacanciesFromClientV2",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/SyncFromClientRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Вакансии записаны",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/SyncFromClientResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancies/enrichment-status": {
            "post": {
                "tags": [
                    "Vacancies"
                ],
                "summary": "Статус обогащения вакансий (бесплатно)",
                "description": "Получает статус обогащения для списка вакансий. Используется для polling во время асинхронной загрузки описаний. ✅ БЕСПЛАТНО.",
                "operationId": "enrichmentStatusV2",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "properties": {
                                    "ids": {
                                        "description": "Массив external_vacancy_id",
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        }
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Статусы обогащения получены",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/GetEnrichmentStatusResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancies/{externalVacancyId}/retry-enrichment": {
            "post": {
                "tags": [
                    "Vacancies"
                ],
                "summary": "Повтор обогащения вакансии (бесплатно)",
                "description": "Повторно запускает обогащение вакансии после ошибки. ✅ БЕСПЛАТНО.",
                "operationId": "retryEnrichmentV2",
                "parameters": [
                    {
                        "name": "externalVacancyId",
                        "in": "path",
                        "description": "Внешний идентификатор вакансии",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Обогащение запущено",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "properties": {
                                        "message": {
                                            "type": "string"
                                        },
                                        "success": {
                                            "type": "boolean"
                                        }
                                    },
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancies/{serviceCode}/{externalVacancyId}/status": {
            "post": {
                "tags": [
                    "Vacancies"
                ],
                "summary": "Изменение статуса вакансии (бесплатно)",
                "description": "Изменяет персональный статус вакансии пользователя. Поддерживает: hide/unhide (скрытие), apply (отклик), favorite/unfavorite (избранное), bookmark/unbookmark (закладки), interview/offer/rejected/hired (воронка), notes (заметки), rating (рейтинг). ✅ БЕСПЛАТНО.",
                "operationId": "updateVacancyStatusV2",
                "parameters": [
                    {
                        "name": "serviceCode",
                        "in": "path",
                        "description": "Код сервиса работы",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "externalVacancyId",
                        "in": "path",
                        "description": "Внешний идентификатор вакансии",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "required": [
                                    "action"
                                ],
                                "properties": {
                                    "action": {
                                        "description": "Действие",
                                        "type": "string",
                                        "enum": [
                                            "hide",
                                            "unhide",
                                            "apply",
                                            "interview",
                                            "offer",
                                            "rejected",
                                            "hired",
                                            "favorite",
                                            "unfavorite",
                                            "toggle_favorite",
                                            "bookmark",
                                            "unbookmark",
                                            "view",
                                            "notes",
                                            "rating"
                                        ]
                                    },
                                    "notes": {
                                        "description": "Текст заметки (для action=notes)",
                                        "type": "string",
                                        "nullable": true
                                    },
                                    "rating": {
                                        "description": "Рейтинг 1-5 (для action=rating)",
                                        "type": "integer",
                                        "nullable": true
                                    }
                                },
                                "type": "object"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Статус вакансии обновлён",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/UpdateVacancyDataResponseV2"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Ошибка валидации",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "properties": {
                                        "message": {
                                            "type": "string"
                                        },
                                        "error": {
                                            "type": "string"
                                        }
                                    },
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancies/{serviceCode}/{externalVacancyId}/apply": {
            "post": {
                "tags": [
                    "Vacancies"
                ],
                "summary": "Отклик на вакансию (бесплатно)",
                "description": "Помечает вакансию как 'откликнулся'. После этого вакансия исключается из результатов поиска. Возвращает URL для перехода на страницу вакансии. ✅ БЕСПЛАТНО.",
                "operationId": "applyVacancyV2",
                "parameters": [
                    {
                        "name": "serviceCode",
                        "in": "path",
                        "description": "Код сервиса работы",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "externalVacancyId",
                        "in": "path",
                        "description": "Внешний идентификатор вакансии",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Вакансия помечена как откликнулся",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ApplyVacancyResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancies/{serviceCode}/{externalVacancyId}/deactivate": {
            "post": {
                "tags": [
                    "Vacancies"
                ],
                "summary": "Деактивация вакансии (бесплатно)",
                "description": "Деактивирует вакансию (помечает как неактивную/в архиве). Деактивированные вакансии не участвуют в поисках. ✅ БЕСПЛАТНО.",
                "operationId": "deactivateVacancyV2",
                "parameters": [
                    {
                        "name": "serviceCode",
                        "in": "path",
                        "description": "Код сервиса работы",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "externalVacancyId",
                        "in": "path",
                        "description": "Внешний идентификатор вакансии",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Вакансия успешно деактивирована",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "properties": {
                                        "message": {
                                            "type": "string",
                                            "example": "Vacancy deactivated successfully"
                                        },
                                        "success": {
                                            "type": "boolean",
                                            "example": true
                                        }
                                    },
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancy-analysis/red-flags": {
            "post": {
                "tags": [
                    "VacancyAnalysis"
                ],
                "summary": "Детектор красных флагов вакансии (3 CR)",
                "description": "AI-анализ вакансии на наличие красных флагов и рисков. ⚠️ ПЛАТНАЯ ОПЕРАЦИЯ: 3 CR (бесплатно при наличии кэша).",
                "operationId": "detectRedFlagsV2",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/DetectRedFlagsRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Анализ успешно выполнен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/RedFlagsAnalysisResponseV2"
                                }
                            }
                        }
                    },
                    "402": {
                        "description": "Недостаточно кредитов",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ErrorResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancy-analysis/red-flags/cached": {
            "get": {
                "tags": [
                    "VacancyAnalysis"
                ],
                "summary": "Получить кэшированный анализ рисков (бесплатно)",
                "description": "Получение кэшированного анализа красных флагов вакансии. ✅ БЕСПЛАТНО (возвращает ранее сгенерированный анализ).",
                "operationId": "getCachedRedFlagsV2",
                "parameters": [
                    {
                        "name": "external_vacancy_id",
                        "in": "query",
                        "description": "Внешний ID вакансии",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "service_code",
                        "in": "query",
                        "description": "Код сервиса (по умолчанию 'hh')",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "default": "hh"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Кэшированный анализ получен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/RedFlagsAnalysisResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancies/{externalVacancyId}/culture-fit": {
            "post": {
                "tags": [
                    "VacancyAnalysis"
                ],
                "summary": "Анализ культуры компании (5 CR)",
                "description": "AI-анализ соответствия кандидата культуре компании. ⚠️ ПЛАТНАЯ ОПЕРАЦИЯ: 5 CR (бесплатно при наличии кэша).",
                "operationId": "analyzeCompanyCultureFitV2",
                "parameters": [
                    {
                        "name": "externalVacancyId",
                        "in": "path",
                        "description": "Внешний ID вакансии",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/AnalyzeCompanyCultureFitRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Анализ успешно выполнен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/CompanyCultureFitResponseV2"
                                }
                            }
                        }
                    },
                    "402": {
                        "description": "Недостаточно кредитов",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ErrorResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancies/{externalVacancyId}/culture-fit/cached": {
            "get": {
                "tags": [
                    "VacancyAnalysis"
                ],
                "summary": "Получить кэшированный анализ культуры (бесплатно)",
                "description": "Получение кэшированного анализа культуры компании. ✅ БЕСПЛАТНО.",
                "operationId": "getCachedCompanyCultureFitV2",
                "parameters": [
                    {
                        "name": "externalVacancyId",
                        "in": "path",
                        "description": "Внешний ID вакансии",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "resume_id",
                        "in": "query",
                        "description": "ID резюме (обязательно)",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "service_code",
                        "in": "query",
                        "description": "Код сервиса (по умолчанию 'hh')",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "default": "hh"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Кэшированный анализ получен",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/CompanyCultureFitResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancy-analysis/salary-negotiation": {
            "post": {
                "tags": [
                    "VacancyAnalysis"
                ],
                "summary": "Стратегия переговоров о зарплате (10 CR)",
                "description": "AI-генерация персонализированной стратегии переговоров о зарплате. ⚠️ ПЛАТНАЯ ОПЕРАЦИЯ: 10 CR (бесплатно при наличии кэша).",
                "operationId": "generateSalaryNegotiationV2",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/GenerateSalaryNegotiationRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Стратегия успешно сгенерирована",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/SalaryNegotiationResponseV2"
                                }
                            }
                        }
                    },
                    "402": {
                        "description": "Недостаточно кредитов",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ErrorResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancy-analysis/salary-negotiation/cached": {
            "get": {
                "tags": [
                    "VacancyAnalysis"
                ],
                "summary": "Получить кэшированную стратегию (бесплатно)",
                "description": "Получение кэшированной стратегии переговоров о зарплате. ✅ БЕСПЛАТНО.",
                "operationId": "getCachedSalaryNegotiationV2",
                "parameters": [
                    {
                        "name": "external_vacancy_id",
                        "in": "query",
                        "description": "Внешний ID вакансии",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "resume_id",
                        "in": "query",
                        "description": "ID резюме (обязательно для salary-negotiation)",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "service_code",
                        "in": "query",
                        "description": "Код сервиса (по умолчанию 'hh')",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "default": "hh"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Кэшированная стратегия получена",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/SalaryNegotiationResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancy-analysis/interview-prep": {
            "post": {
                "tags": [
                    "VacancyAnalysis"
                ],
                "summary": "Подготовка к собеседованию (15 CR)",
                "description": "AI-генерация персонализированной подготовки к собеседованию. ⚠️ ПЛАТНАЯ ОПЕРАЦИЯ: 15 CR (бесплатно при наличии кэша).",
                "operationId": "prepareInterviewV2",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/PrepareInterviewRequestV2"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Подготовка успешно сгенерирована",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/InterviewPrepResponseV2"
                                }
                            }
                        }
                    },
                    "402": {
                        "description": "Недостаточно кредитов",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ErrorResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        },
        "/v2/vacancy-analysis/interview-prep/cached": {
            "get": {
                "tags": [
                    "VacancyAnalysis"
                ],
                "summary": "Получить кэшированную подготовку (бесплатно)",
                "description": "Получение кэшированной подготовки к собеседованию. ✅ БЕСПЛАТНО.",
                "operationId": "getCachedInterviewPrepV2",
                "parameters": [
                    {
                        "name": "external_vacancy_id",
                        "in": "query",
                        "description": "Внешний ID вакансии",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "resume_id",
                        "in": "query",
                        "description": "ID резюме (обязательно для interview-prep)",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "service_code",
                        "in": "query",
                        "description": "Код сервиса (по умолчанию 'hh')",
                        "required": false,
                        "schema": {
                            "type": "string",
                            "default": "hh"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Кэшированная подготовка получена",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/InterviewPrepResponseV2"
                                }
                            }
                        }
                    },
                    "401": {
                        "$ref": "#/components/responses/UnauthorizedV2"
                    },
                    "404": {
                        "$ref": "#/components/responses/NotFoundV2"
                    },
                    "422": {
                        "$ref": "#/components/responses/ValidationErrorV2"
                    },
                    "429": {
                        "$ref": "#/components/responses/RateLimitV2"
                    },
                    "500": {
                        "$ref": "#/components/responses/ServerErrorV2"
                    }
                },
                "security": [
                    {
                        "bearerAuth": []
                    }
                ]
            }
        }
    },
    "components": {
        "schemas": {
            "ErrorResponseV2": {
                "required": [
                    "error_code",
                    "message_en",
                    "message_ru"
                ],
                "properties": {
                    "error_code": {
                        "description": "Machine-readable error code",
                        "type": "string"
                    },
                    "message_en": {
                        "description": "Human-readable message (EN)",
                        "type": "string"
                    },
                    "message_ru": {
                        "description": "Human-readable message (RU)",
                        "type": "string"
                    },
                    "data": {
                        "description": "Optional error details (validation errors, debug, etc.)",
                        "type": "object",
                        "nullable": true,
                        "additionalProperties": true
                    }
                },
                "type": "object"
            },
            "GenerateSearchFiltersRequestV2": {
                "title": "Generate Search Filters Request (v2)",
                "description": "Запрос на AI-генерацию поисковых фильтров",
                "required": [
                    "resume_id",
                    "desired_position",
                    "service_ids"
                ],
                "properties": {
                    "resume_id": {
                        "description": "ID резюме пользователя",
                        "type": "integer",
                        "example": 42
                    },
                    "desired_position": {
                        "description": "Желаемая должность",
                        "type": "string",
                        "example": "Python разработчик"
                    },
                    "service_ids": {
                        "description": "Массив ID активных сервисов",
                        "type": "array",
                        "items": {
                            "type": "integer"
                        },
                        "example": [
                            1,
                            2,
                            3
                        ]
                    }
                },
                "type": "object"
            },
            "GenerateSearchFiltersResponseV2": {
                "title": "Generate Search Filters Response (v2)",
                "description": "Ответ AI-генерации поисковых фильтров",
                "properties": {
                    "message": {
                        "description": "Статус сообщение",
                        "type": "string",
                        "example": "Фильтры успешно сгенерированы"
                    },
                    "data": {
                        "properties": {
                            "draft": {
                                "description": "Промежуточный canonical JSON (для дебага)",
                                "type": "object",
                                "additionalProperties": true
                            },
                            "unified_filters": {
                                "description": "Per-service фильтры в формате unified_filters",
                                "type": "object",
                                "additionalProperties": {
                                    "type": "object"
                                }
                            },
                            "filter_labels": {
                                "description": "Человекочитаемые лейблы (service:filter:value => label)",
                                "type": "object",
                                "additionalProperties": {
                                    "type": "string"
                                }
                            },
                            "applied_fields": {
                                "description": "Коды применённых фильтров",
                                "type": "array",
                                "items": {
                                    "type": "string"
                                }
                            },
                            "skipped_fields": {
                                "description": "Коды пропущенных фильтров",
                                "type": "array",
                                "items": {
                                    "type": "string"
                                }
                            },
                            "warnings": {
                                "description": "Предупреждения",
                                "type": "array",
                                "items": {
                                    "type": "string"
                                }
                            },
                            "credits_spent": {
                                "description": "Количество списанных кредитов",
                                "type": "number",
                                "example": 5
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "ApplicationV2": {
                "description": "Application entity",
                "properties": {
                    "id": {
                        "type": "integer",
                        "example": 1
                    },
                    "user_id": {
                        "type": "integer",
                        "example": 1
                    },
                    "service_code": {
                        "type": "string",
                        "example": "hh",
                        "nullable": true
                    },
                    "external_vacancy_id": {
                        "type": "string",
                        "example": "12345678",
                        "nullable": true
                    },
                    "resume_id": {
                        "type": "integer",
                        "example": 1
                    },
                    "cover_letter_id": {
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                    },
                    "letter_text": {
                        "type": "string",
                        "example": "Cover letter text",
                        "nullable": true
                    },
                    "status": {
                        "type": "string",
                        "enum": [
                            "pending",
                            "sent",
                            "error"
                        ],
                        "example": "sent"
                    },
                    "hh_negotiation_id": {
                        "type": "string",
                        "example": "negotiation_12345",
                        "nullable": true
                    },
                    "error_data": {
                        "type": "object",
                        "nullable": true
                    },
                    "applied_at": {
                        "type": "string",
                        "format": "date-time",
                        "example": "2024-01-01T12:00:00Z",
                        "nullable": true
                    },
                    "resume": {
                        "type": "object",
                        "nullable": true
                    },
                    "cover_letter": {
                        "type": "object",
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "ApplyToVacancyRequestV2": {
                "description": "Запрос на отклик на вакансию",
                "properties": {
                    "service_code": {
                        "description": "Код сервиса (hh, sj, ...)",
                        "type": "string",
                        "example": "hh"
                    },
                    "external_vacancy_id": {
                        "description": "Внешний ID вакансии",
                        "type": "string",
                        "example": "12345678"
                    },
                    "cover_letter_id": {
                        "description": "ID сопроводительного письма (опционально)",
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "RegisterBrowserApplicationRequestV2": {
                "description": "Запрос на регистрацию отклика через браузер (обязательно указать резюме)",
                "required": [
                    "service_code",
                    "external_vacancy_id",
                    "resume_id"
                ],
                "properties": {
                    "service_code": {
                        "description": "Код сервиса (hh, sj, ...)",
                        "type": "string",
                        "example": "hh"
                    },
                    "external_vacancy_id": {
                        "description": "Внешний ID вакансии",
                        "type": "string",
                        "example": "12345678"
                    },
                    "resume_id": {
                        "description": "ID резюме, которым откликаются (обязательно)",
                        "type": "integer",
                        "example": 1
                    },
                    "cover_letter_id": {
                        "description": "ID сопроводительного письма (опционально)",
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "ApplyToVacancyResponseV2": {
                "description": "Ответ на запрос отклика на вакансию",
                "properties": {
                    "data": {
                        "description": "Данные отклика",
                        "properties": {
                            "id": {
                                "type": "integer",
                                "example": 1
                            },
                            "service_code": {
                                "type": "string",
                                "example": "hh"
                            },
                            "external_vacancy_id": {
                                "type": "string",
                                "example": "12345678"
                            },
                            "status": {
                                "type": "string",
                                "enum": [
                                    "pending",
                                    "sent",
                                    "error",
                                    "requires_browser"
                                ],
                                "example": "sent"
                            },
                            "applied_at": {
                                "type": "string",
                                "format": "date-time",
                                "nullable": true
                            },
                            "requires_browser": {
                                "description": "Требуется отклик через браузер (API недоступен)",
                                "type": "boolean",
                                "nullable": true
                            },
                            "reason": {
                                "description": "Причина необходимости браузерного отклика",
                                "type": "string",
                                "nullable": true
                            },
                            "vacancy_url": {
                                "description": "URL вакансии для браузерного отклика",
                                "type": "string",
                                "nullable": true
                            },
                            "cover_letter_text": {
                                "description": "Текст сопроводительного письма для копирования",
                                "type": "string",
                                "nullable": true
                            }
                        },
                        "type": "object"
                    },
                    "message": {
                        "description": "Сообщение об успешной отправке",
                        "type": "string",
                        "example": "Application submitted successfully"
                    }
                },
                "type": "object"
            },
            "GetApplicationResponseV2": {
                "description": "Ответ на запрос деталей отклика на вакансию",
                "properties": {
                    "data": {
                        "$ref": "#/components/schemas/ApplicationV2"
                    }
                },
                "type": "object"
            },
            "GetApplicationStatsResponseV2": {
                "description": "Ответ на запрос статистики откликов на вакансии",
                "properties": {
                    "data": {
                        "description": "Статистика откликов",
                        "properties": {
                            "total": {
                                "type": "integer",
                                "example": 50
                            },
                            "sent": {
                                "type": "integer",
                                "example": 40
                            },
                            "pending": {
                                "type": "integer",
                                "example": 5
                            },
                            "error": {
                                "type": "integer",
                                "example": 5
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "ListApplicationsResponseV2": {
                "description": "Ответ на запрос списка откликов на вакансии",
                "properties": {
                    "data": {
                        "description": "Массив откликов",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/ApplicationV2"
                        }
                    },
                    "pagination": {
                        "description": "Метаданные пагинации",
                        "properties": {
                            "current_page": {
                                "type": "integer",
                                "example": 1
                            },
                            "per_page": {
                                "type": "integer",
                                "example": 10
                            },
                            "total": {
                                "type": "integer",
                                "example": 50
                            },
                            "last_page": {
                                "type": "integer",
                                "example": 5
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "ForgotPasswordRequestV2": {
                "description": "Запрос на сброс пароля",
                "properties": {
                    "email": {
                        "description": "Email пользователя",
                        "type": "string",
                        "format": "email",
                        "example": "user@example.com"
                    }
                },
                "type": "object"
            },
            "ResetPasswordRequestV2": {
                "description": "Запрос на сброс пароля с токеном",
                "properties": {
                    "token": {
                        "description": "Токен сброса пароля",
                        "type": "string",
                        "example": "abc123..."
                    },
                    "email": {
                        "description": "Email пользователя",
                        "type": "string",
                        "format": "email",
                        "example": "user@example.com"
                    },
                    "password": {
                        "description": "Новый пароль",
                        "type": "string",
                        "minLength": 8,
                        "example": "NewPassword123!"
                    },
                    "password_confirmation": {
                        "description": "Подтверждение нового пароля",
                        "type": "string",
                        "example": "NewPassword123!"
                    }
                },
                "type": "object"
            },
            "SendEmailVerificationResponseV2": {
                "description": "Ответ на запрос отправки письма верификации",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Verification email sent"
                    }
                },
                "type": "object"
            },
            "VerifyEmailResponseV2": {
                "description": "Ответ на запрос верификации email",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Email verified successfully"
                    }
                },
                "type": "object"
            },
            "GetStatisticsResponseV2": {
                "description": "Ответ на запрос статистики платформы",
                "properties": {
                    "data": {
                        "description": "Статистика платформы",
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "ForgotPasswordResponseV2": {
                "description": "Ответ на запрос сброса пароля",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Password reset email sent"
                    }
                },
                "type": "object"
            },
            "ResetPasswordResponseV2": {
                "description": "Ответ на запрос сброса пароля с токеном",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Password reset successfully"
                    }
                },
                "type": "object"
            },
            "RevokeTokenResponseV2": {
                "description": "Ответ на запрос отзыва токена",
                "properties": {
                    "message": {
                        "description": "Сообщение об успехе",
                        "type": "string",
                        "example": "Token revoked successfully."
                    }
                },
                "type": "object"
            },
            "WelcomeResponseV2": {
                "description": "Ответ приветствия API",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Welcome to API"
                    }
                },
                "type": "object"
            },
            "AssignRolesToUserRequestV1": {
                "description": "Запрос на назначение ролей пользователю",
                "properties": {
                    "roles_ids": {
                        "description": "Массив ID ролей",
                        "type": "array",
                        "items": {
                            "type": "integer"
                        },
                        "example": [
                            1,
                            2
                        ]
                    }
                },
                "type": "object"
            },
            "CreateRoleRequestV1": {
                "description": "Запрос на создание роли",
                "properties": {
                    "name": {
                        "description": "Имя роли (только буквы)",
                        "type": "string",
                        "maxLength": 20,
                        "minLength": 2,
                        "example": "admin"
                    },
                    "description": {
                        "description": "Описание роли",
                        "type": "string",
                        "maxLength": 255,
                        "nullable": true
                    },
                    "display_name": {
                        "description": "Отображаемое имя роли",
                        "type": "string",
                        "maxLength": 100,
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "GivePermissionsToRoleRequestV1": {
                "description": "Запрос на выдачу прав роли",
                "properties": {
                    "permissions_ids": {
                        "description": "Массив ID прав",
                        "type": "array",
                        "items": {
                            "type": "integer"
                        },
                        "example": [
                            1,
                            2,
                            3
                        ]
                    }
                },
                "type": "object"
            },
            "GivePermissionsToUserRequestV1": {
                "description": "Запрос на выдачу прав пользователю",
                "properties": {
                    "permissions_ids": {
                        "description": "Массив ID прав",
                        "type": "array",
                        "items": {
                            "type": "integer"
                        },
                        "example": [
                            1,
                            2,
                            3
                        ]
                    }
                },
                "type": "object"
            },
            "ListPermissionsResponseV1": {
                "description": "Ответ со списком прав",
                "properties": {
                    "data": {
                        "description": "Список прав",
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    }
                },
                "type": "object"
            },
            "ListRolesResponseV1": {
                "description": "Ответ со списком ролей",
                "properties": {
                    "data": {
                        "description": "Список ролей",
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    }
                },
                "type": "object"
            },
            "PermissionResponseV1": {
                "description": "Ответ с данными прав",
                "properties": {
                    "data": {
                        "description": "Данные прав",
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "RoleResponseV1": {
                "description": "Ответ с данными роли",
                "properties": {
                    "data": {
                        "description": "Данные роли",
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "CityV2": {
                "description": "Город/регион из унифицированного справочника",
                "properties": {
                    "id": {
                        "description": "ID города в справочнике",
                        "type": "integer",
                        "example": 7850
                    },
                    "name": {
                        "description": "Название города",
                        "type": "string",
                        "example": "Санкт-Петербург"
                    },
                    "type": {
                        "description": "Тип населенного пункта",
                        "type": "string",
                        "enum": [
                            "city",
                            "region",
                            "district",
                            "country"
                        ],
                        "example": "city"
                    },
                    "country_code": {
                        "description": "Код страны (ISO 3166-1 alpha-2)",
                        "type": "string",
                        "example": "RU"
                    },
                    "country_name": {
                        "description": "Название страны",
                        "type": "string",
                        "example": "Россия"
                    },
                    "region_code": {
                        "description": "Код региона РФ",
                        "type": "string",
                        "example": "78",
                        "nullable": true
                    },
                    "population": {
                        "description": "Население",
                        "type": "integer",
                        "example": 5384342,
                        "nullable": true
                    },
                    "is_regional_center": {
                        "description": "Является ли региональным центром",
                        "type": "boolean",
                        "example": true
                    },
                    "is_capital": {
                        "description": "Является ли столицей страны",
                        "type": "boolean",
                        "example": false
                    },
                    "short_path": {
                        "description": "Краткий путь (город, регион)",
                        "type": "string",
                        "example": "Санкт-Петербург, Ленинградская область"
                    },
                    "full_path": {
                        "description": "Полный путь (страна, регион, город)",
                        "type": "string",
                        "example": "Россия, Ленинградская область, Санкт-Петербург"
                    },
                    "mappings": {
                        "description": "Маппинги для сервисов {service_code: source_key}",
                        "type": "object",
                        "example": {
                            "hh": "2",
                            "sj": "14"
                        },
                        "nullable": true,
                        "additionalProperties": {
                            "type": "string"
                        }
                    }
                },
                "type": "object"
            },
            "FindCityByServiceKeyRequestV2": {
                "description": "Запрос поиска города по коду сервиса и ключу источника",
                "properties": {
                    "service_code": {
                        "description": "Код сервиса (hh, sj, trudvsem, zarplata, rabota, yandex, linkedin)",
                        "type": "string",
                        "example": "hh"
                    },
                    "source_key": {
                        "description": "Ключ источника (ID города в системе сервиса)",
                        "type": "string",
                        "example": "1"
                    }
                },
                "type": "object"
            },
            "GetCityMappingsRequestV2": {
                "description": "Запрос получения маппингов города для всех сервисов",
                "properties": {
                    "id": {
                        "description": "ID города в справочнике",
                        "type": "integer",
                        "example": 7850
                    }
                },
                "type": "object"
            },
            "GetCityTreeRequestV2": {
                "description": "Запрос получения иерархического дерева городов",
                "properties": {
                    "service": {
                        "description": "Код сервиса для фильтрации",
                        "type": "string",
                        "enum": [
                            "hh",
                            "sj",
                            "trudvsem",
                            "zarplata",
                            "rabota",
                            "yandex",
                            "linkedin"
                        ],
                        "example": "hh",
                        "nullable": true
                    },
                    "parent_id": {
                        "description": "ID родителя (null = корневой уровень)",
                        "type": "integer",
                        "example": null,
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "GetPopularCitiesRequestV2": {
                "description": "Запрос получения популярных городов",
                "properties": {
                    "services": {
                        "description": "Массив кодов сервисов (hh, sj, trudvsem, zarplata, rabota, yandex, linkedin)",
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "hh",
                                "sj",
                                "trudvsem",
                                "zarplata",
                                "rabota",
                                "yandex",
                                "linkedin"
                            ]
                        },
                        "example": [
                            "hh"
                        ],
                        "nullable": true
                    },
                    "limit": {
                        "description": "Лимит результатов",
                        "type": "integer",
                        "default": 20,
                        "maximum": 50,
                        "minimum": 1,
                        "example": 10
                    },
                    "country": {
                        "description": "Код страны (RU, BY, KZ и т.д.)",
                        "type": "string",
                        "example": "RU",
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "SearchCitiesRequestV2": {
                "description": "Запрос поиска городов с маппингами для сервисов",
                "properties": {
                    "q": {
                        "description": "Поисковый запрос (минимум 2 символа)",
                        "type": "string",
                        "example": "Москва",
                        "nullable": true
                    },
                    "services": {
                        "description": "Массив кодов сервисов (hh, sj, trudvsem, zarplata, rabota, yandex, linkedin)",
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "hh",
                                "sj",
                                "trudvsem",
                                "zarplata",
                                "rabota",
                                "yandex",
                                "linkedin"
                            ]
                        },
                        "example": [
                            "hh"
                        ],
                        "nullable": true
                    },
                    "limit": {
                        "description": "Лимит результатов",
                        "type": "integer",
                        "default": 20,
                        "maximum": 50,
                        "minimum": 1,
                        "example": 20
                    }
                },
                "type": "object"
            },
            "FindCityByServiceKeyResponseV2": {
                "description": "Ответ поиска города по коду сервиса и ключу источника",
                "properties": {
                    "data": {
                        "description": "Данные города с маппингами",
                        "properties": {
                            "city": {
                                "description": "Данные города",
                                "type": "object"
                            },
                            "mappings": {
                                "description": "Маппинги города",
                                "type": "object"
                            },
                            "city_master_id": {
                                "description": "ID города в city_master",
                                "type": "integer"
                            }
                        },
                        "type": "object"
                    },
                    "message": {
                        "description": "Сообщение",
                        "type": "string",
                        "example": "City found"
                    }
                },
                "type": "object"
            },
            "GetCityMappingsResponseV2": {
                "description": "Ответ на запрос получения маппингов города",
                "properties": {
                    "data": {
                        "description": "Данные города и маппинги",
                        "properties": {
                            "city": {
                                "$ref": "#/components/schemas/CityV2"
                            },
                            "mappings": {
                                "description": "Маппинги для всех сервисов {service_code: source_key}",
                                "type": "object",
                                "example": {
                                    "hh": "2",
                                    "sj": "14"
                                },
                                "additionalProperties": {
                                    "type": "string"
                                }
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "GetCityTreeResponseV2": {
                "description": "Ответ на запрос получения иерархического дерева городов",
                "properties": {
                    "data": {
                        "description": "Массив узлов дерева",
                        "type": "array",
                        "items": {
                            "properties": {
                                "id": {
                                    "type": "integer",
                                    "example": 1
                                },
                                "name": {
                                    "type": "string",
                                    "example": "Россия"
                                },
                                "type": {
                                    "type": "string",
                                    "enum": [
                                        "city",
                                        "region",
                                        "district",
                                        "country"
                                    ],
                                    "example": "country"
                                },
                                "country_code": {
                                    "type": "string",
                                    "example": "RU"
                                },
                                "has_mapping": {
                                    "type": "boolean",
                                    "example": false
                                },
                                "children_count": {
                                    "type": "integer",
                                    "example": 85
                                },
                                "is_selectable": {
                                    "type": "boolean",
                                    "example": false
                                }
                            },
                            "type": "object"
                        }
                    },
                    "meta": {
                        "description": "Метаданные",
                        "properties": {
                            "service": {
                                "type": "string",
                                "example": "hh",
                                "nullable": true
                            },
                            "parent_id": {
                                "type": "integer",
                                "example": null,
                                "nullable": true
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "GetPopularCitiesResponseV2": {
                "description": "Ответ на запрос получения популярных городов",
                "properties": {
                    "data": {
                        "description": "Массив популярных городов",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/CityV2"
                        }
                    },
                    "meta": {
                        "description": "Метаданные",
                        "properties": {
                            "services": {
                                "type": "array",
                                "items": {
                                    "type": "string"
                                },
                                "example": [
                                    "hh"
                                ]
                            },
                            "country": {
                                "type": "string",
                                "example": "RU",
                                "nullable": true
                            },
                            "count": {
                                "type": "integer",
                                "example": 10
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "SearchCitiesResponseV2": {
                "description": "Ответ на запрос поиска городов",
                "properties": {
                    "data": {
                        "description": "Массив городов",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/CityV2"
                        }
                    },
                    "meta": {
                        "description": "Метаданные",
                        "properties": {
                            "query": {
                                "type": "string",
                                "example": "Москва"
                            },
                            "services": {
                                "type": "array",
                                "items": {
                                    "type": "string"
                                },
                                "example": [
                                    "hh"
                                ]
                            },
                            "count": {
                                "type": "integer",
                                "example": 5
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "CompanyContactCardV2": {
                "description": "Company contact card (v2)",
                "properties": {
                    "name": {
                        "type": "string",
                        "example": "Иван Петров"
                    },
                    "position": {
                        "type": "string",
                        "example": "Recruiter",
                        "nullable": true
                    },
                    "email": {
                        "type": "string",
                        "example": "recruiting@example.com",
                        "nullable": true
                    },
                    "phone": {
                        "type": "string",
                        "example": "+7 999 111-22-33",
                        "nullable": true
                    },
                    "source_url": {
                        "type": "string",
                        "example": "https://example.com/source",
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "SearchCompanyContactsRequestV2": {
                "description": "Search company contacts request (v2)",
                "properties": {
                    "company_name": {
                        "type": "string",
                        "maxLength": 255,
                        "minLength": 2,
                        "example": "Acme HR LLC"
                    },
                    "company_address_or_city": {
                        "type": "string",
                        "maxLength": 255,
                        "example": "Moscow",
                        "nullable": true
                    },
                    "force_refresh": {
                        "type": "boolean",
                        "example": false,
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "SearchCompanyContactsResponseV2": {
                "description": "Search company contacts response (v2)",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Smart HR company contacts resolved"
                    },
                    "data": {
                        "properties": {
                            "company_name": {
                                "type": "string",
                                "example": "Acme HR LLC"
                            },
                            "company_key": {
                                "type": "string",
                                "example": "a3f1..."
                            },
                            "contacts": {
                                "type": "array",
                                "items": {
                                    "$ref": "#/components/schemas/CompanyContactCardV2"
                                }
                            },
                            "other_contacts": {
                                "type": "array",
                                "items": {
                                    "$ref": "#/components/schemas/CompanyContactCardV2"
                                }
                            },
                            "supplementary_info": {
                                "type": "array",
                                "items": {
                                    "properties": {
                                        "title": {
                                            "type": "string",
                                            "example": "ИНН"
                                        },
                                        "value": {
                                            "type": "string",
                                            "example": "7840359278"
                                        }
                                    },
                                    "type": "object"
                                }
                            },
                            "raw_payload": {
                                "type": "object",
                                "additionalProperties": {}
                            }
                        },
                        "type": "object"
                    },
                    "meta": {
                        "properties": {
                            "cache": {
                                "properties": {
                                    "hit": {
                                        "type": "boolean"
                                    },
                                    "source": {
                                        "type": "string"
                                    },
                                    "etag": {
                                        "type": "string",
                                        "nullable": true
                                    },
                                    "ttl_days": {
                                        "type": "integer"
                                    }
                                },
                                "type": "object"
                            },
                            "validation": {
                                "properties": {
                                    "is_valid": {
                                        "type": "boolean"
                                    },
                                    "invalid_agent_response": {
                                        "type": "boolean"
                                    },
                                    "errors": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        }
                                    },
                                    "schema_version": {
                                        "type": "string"
                                    }
                                },
                                "type": "object"
                            },
                            "billing": {
                                "properties": {
                                    "operation": {
                                        "type": "string"
                                    },
                                    "charged_credits": {
                                        "type": "number",
                                        "format": "float"
                                    },
                                    "refund_credits": {
                                        "type": "number",
                                        "format": "float"
                                    },
                                    "net_credits": {
                                        "type": "number",
                                        "format": "float"
                                    },
                                    "policy": {
                                        "type": "string"
                                    }
                                },
                                "type": "object"
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "ContactMethodV2": {
                "description": "Метод связи с контактом",
                "properties": {
                    "id": {
                        "description": "ID",
                        "type": "integer",
                        "example": 11
                    },
                    "method_type": {
                        "description": "Тип метода",
                        "type": "string",
                        "enum": [
                            "email",
                            "phone",
                            "linkedin",
                            "telegram",
                            "whatsapp",
                            "other"
                        ],
                        "example": "telegram"
                    },
                    "value": {
                        "description": "Значение",
                        "type": "string",
                        "example": "@username"
                    }
                },
                "type": "object"
            },
            "ContactV2": {
                "description": "Contact",
                "properties": {
                    "id": {
                        "type": "integer",
                        "example": 1
                    },
                    "full_name": {
                        "type": "string",
                        "example": "Иван Иванов"
                    },
                    "role": {
                        "type": "string",
                        "example": "HR",
                        "nullable": true
                    },
                    "company": {
                        "type": "string",
                        "example": "ACME",
                        "nullable": true
                    },
                    "company_logo_url": {
                        "description": "URL логотипа компании (например из HH suggests)",
                        "type": "string",
                        "nullable": true
                    },
                    "notes": {
                        "type": "string",
                        "example": "Созванивались по вакансии",
                        "nullable": true
                    },
                    "methods": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/ContactMethodV2"
                        }
                    },
                    "created_at": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true
                    },
                    "last_interaction_at": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true
                    },
                    "interviews_count": {
                        "type": "integer",
                        "example": 3,
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "ContactTimelineV2": {
                "description": "История взаимодействий с контактом",
                "properties": {
                    "contact": {
                        "$ref": "#/components/schemas/ContactV2"
                    },
                    "interviews": {
                        "description": "Список интервью",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/InterviewStageV2"
                        }
                    }
                },
                "type": "object"
            },
            "ContactMethodPayloadV2": {
                "description": "Метод связи с контактом (payload)",
                "properties": {
                    "method_type": {
                        "type": "string",
                        "enum": [
                            "email",
                            "phone",
                            "linkedin",
                            "telegram",
                            "whatsapp",
                            "other"
                        ]
                    },
                    "value": {
                        "type": "string"
                    }
                },
                "type": "object"
            },
            "CreateContactRequestV2": {
                "description": "Запрос создания контакта",
                "properties": {
                    "full_name": {
                        "description": "ФИО",
                        "type": "string",
                        "example": "Иван Петров"
                    },
                    "role": {
                        "description": "Роль",
                        "type": "string",
                        "nullable": true
                    },
                    "company": {
                        "description": "Компания",
                        "type": "string",
                        "nullable": true
                    },
                    "company_logo_url": {
                        "description": "URL логотипа компании (например из HH suggests)",
                        "type": "string",
                        "nullable": true
                    },
                    "notes": {
                        "description": "Заметки",
                        "type": "string",
                        "nullable": true
                    },
                    "methods": {
                        "description": "Методы связи",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/ContactMethodPayloadV2"
                        }
                    }
                },
                "type": "object"
            },
            "ListContactsRequestV2": {
                "description": "Запрос списка контактов",
                "properties": {
                    "query": {
                        "type": "string",
                        "nullable": true
                    },
                    "company": {
                        "type": "string",
                        "nullable": true
                    },
                    "role": {
                        "type": "string",
                        "nullable": true
                    },
                    "method_type": {
                        "type": "string",
                        "nullable": true
                    },
                    "has_interviews": {
                        "type": "boolean",
                        "nullable": true
                    },
                    "has_offers": {
                        "type": "boolean",
                        "nullable": true
                    },
                    "manual_only": {
                        "type": "boolean",
                        "nullable": true
                    },
                    "last_interaction_from": {
                        "type": "string",
                        "format": "date",
                        "nullable": true
                    },
                    "last_interaction_to": {
                        "type": "string",
                        "format": "date",
                        "nullable": true
                    },
                    "sort": {
                        "type": "string",
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "UpdateContactRequestV2": {
                "description": "Запрос обновления контакта",
                "properties": {
                    "full_name": {
                        "description": "ФИО",
                        "type": "string",
                        "nullable": true
                    },
                    "role": {
                        "description": "Роль",
                        "type": "string",
                        "nullable": true
                    },
                    "company": {
                        "description": "Компания",
                        "type": "string",
                        "nullable": true
                    },
                    "company_logo_url": {
                        "description": "URL логотипа компании",
                        "type": "string",
                        "nullable": true
                    },
                    "notes": {
                        "description": "Заметки",
                        "type": "string",
                        "nullable": true
                    },
                    "methods": {
                        "description": "Методы связи",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/ContactMethodPayloadV2"
                        },
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "ContactTimelineResponseV2": {
                "description": "Ответ на запрос истории контакта",
                "properties": {
                    "message": {
                        "description": "Сообщение",
                        "type": "string",
                        "example": "Contact timeline retrieved"
                    },
                    "data": {
                        "$ref": "#/components/schemas/ContactTimelineV2"
                    }
                },
                "type": "object"
            },
            "CreateContactResponseV2": {
                "description": "Ответ на запрос создания контакта",
                "properties": {
                    "message": {
                        "description": "Сообщение",
                        "type": "string",
                        "example": "Contact created"
                    },
                    "data": {
                        "$ref": "#/components/schemas/ContactV2"
                    }
                },
                "type": "object"
            },
            "DeleteContactResponseV2": {
                "description": "Ответ на запрос удаления контакта",
                "properties": {
                    "message": {
                        "description": "Сообщение",
                        "type": "string",
                        "example": "Contact deleted"
                    }
                },
                "type": "object"
            },
            "GetContactResponseV2": {
                "description": "Ответ на запрос получения контакта",
                "properties": {
                    "message": {
                        "description": "Сообщение",
                        "type": "string",
                        "example": "Contact retrieved"
                    },
                    "data": {
                        "$ref": "#/components/schemas/ContactV2"
                    }
                },
                "type": "object"
            },
            "ListContactsResponseV2": {
                "description": "Ответ на запрос списка контактов",
                "properties": {
                    "message": {
                        "description": "Сообщение",
                        "type": "string",
                        "example": "Contacts retrieved"
                    },
                    "data": {
                        "description": "Список контактов",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/ContactV2"
                        }
                    }
                },
                "type": "object"
            },
            "UpdateContactResponseV2": {
                "description": "Ответ на запрос обновления контакта",
                "properties": {
                    "message": {
                        "description": "Сообщение",
                        "type": "string",
                        "example": "Contact updated"
                    },
                    "data": {
                        "$ref": "#/components/schemas/ContactV2"
                    }
                },
                "type": "object"
            },
            "CoverLetterV2": {
                "description": "Расширенные данные сопроводительного письма",
                "properties": {
                    "id": {
                        "type": "integer",
                        "example": 42
                    },
                    "user_id": {
                        "type": "integer",
                        "example": 1
                    },
                    "service_code": {
                        "description": "Код сервиса (hh, sj, ...)",
                        "type": "string",
                        "example": "hh"
                    },
                    "external_vacancy_id": {
                        "description": "Внешний ID вакансии",
                        "type": "string",
                        "example": "EXT-123456"
                    },
                    "resume_id": {
                        "type": "integer",
                        "example": 7
                    },
                    "content": {
                        "description": "Текст сопроводительного письма",
                        "type": "string"
                    },
                    "status": {
                        "description": "Текущий статус письма",
                        "type": "string",
                        "example": "draft"
                    },
                    "generated_at": {
                        "type": "string",
                        "example": "2025-01-15T10:30:00Z"
                    }
                },
                "type": "object"
            },
            "GenerateCoverLetterRequestV2": {
                "description": "Запрос генерации сопроводительного письма для вакансии. Требуется API токен доступа.",
                "properties": {
                    "service_code": {
                        "description": "Код сервиса (по умолчанию hh)",
                        "type": "string",
                        "example": "hh",
                        "nullable": false
                    },
                    "resume_id": {
                        "description": "ID резюме (опционально, если не указан - используется активное резюме)",
                        "type": "integer",
                        "example": 7,
                        "nullable": true
                    },
                    "force_regenerate": {
                        "description": "Принудительно пересоздать сопроводительное письмо (игнорируя кеш/существующее)",
                        "type": "boolean",
                        "example": false,
                        "nullable": false
                    }
                },
                "type": "object"
            },
            "UpdateCoverLetterRequestV2": {
                "description": "Запрос обновления содержимого сопроводительного письма. Требуется API токен доступа.",
                "properties": {
                    "content": {
                        "description": "Обновленное содержимое сопроводительного письма",
                        "type": "string",
                        "example": "Уважаемый работодатель! Я заинтересован в данной вакансии..."
                    }
                },
                "type": "object"
            },
            "DeleteCoverLetterResponseV2": {
                "description": "Ответ на запрос удаления сопроводительного письма",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешном удалении",
                        "type": "string",
                        "example": "Cover letter deleted successfully"
                    }
                },
                "type": "object"
            },
            "GenerateCoverLetterResponseV2": {
                "description": "Ответ на запрос генерации сопроводительного письма",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной генерации",
                        "type": "string",
                        "example": "Cover letter generated successfully"
                    },
                    "cost": {
                        "description": "Стоимость генерации в кредитах",
                        "type": "number",
                        "format": "float",
                        "example": 10
                    },
                    "from_cache": {
                        "description": "Флаг, указывающий что письмо было взято из кеша",
                        "type": "boolean",
                        "example": false
                    },
                    "data": {
                        "$ref": "#/components/schemas/CoverLetterV2"
                    }
                },
                "type": "object"
            },
            "ListCoverLettersResponseV2": {
                "description": "Ответ на запрос списка сопроводительных писем пользователя",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной загрузке",
                        "type": "string",
                        "example": "Cover letters retrieved successfully"
                    },
                    "data": {
                        "description": "Массив сопроводительных писем",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/CoverLetterV2"
                        }
                    },
                    "pagination": {
                        "description": "Метаданные пагинации",
                        "properties": {
                            "current_page": {
                                "description": "Текущая страница",
                                "type": "integer",
                                "example": 1
                            },
                            "per_page": {
                                "description": "Элементов на странице",
                                "type": "integer",
                                "example": 10
                            },
                            "total": {
                                "description": "Общее количество записей",
                                "type": "integer",
                                "example": 25
                            },
                            "last_page": {
                                "description": "Номер последней страницы",
                                "type": "integer",
                                "example": 3
                            },
                            "from": {
                                "description": "Номер первой записи на странице",
                                "type": "integer",
                                "example": 1,
                                "nullable": true
                            },
                            "to": {
                                "description": "Номер последней записи на странице",
                                "type": "integer",
                                "example": 10,
                                "nullable": true
                            },
                            "has_more": {
                                "description": "Есть ли еще страницы",
                                "type": "boolean",
                                "example": true
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "UpdateCoverLetterResponseV2": {
                "description": "Ответ на запрос обновления сопроводительного письма",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешном обновлении",
                        "type": "string",
                        "example": "Letter updated successfully"
                    },
                    "data": {
                        "$ref": "#/components/schemas/CoverLetterV2"
                    }
                },
                "type": "object"
            },
            "GetCoverLetterResponseV2": {
                "description": "Ответ на запрос получения сопроводительного письма",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Cover letter retrieved successfully"
                    },
                    "data": {
                        "$ref": "#/components/schemas/CoverLetterV2"
                    }
                },
                "type": "object"
            },
            "GetBalanceResponseV2": {
                "description": "Ответ на запрос баланса кредитов (v2)",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной загрузке",
                        "type": "string",
                        "example": "Balance retrieved"
                    },
                    "data": {
                        "description": "Данные баланса",
                        "properties": {
                            "balance": {
                                "description": "Текущий баланс",
                                "type": "number",
                                "format": "float",
                                "example": 150
                            },
                            "lifetime_earned": {
                                "description": "Всего заработано за все время",
                                "type": "number",
                                "format": "float",
                                "example": 500
                            },
                            "lifetime_spent": {
                                "description": "Всего потрачено за все время",
                                "type": "number",
                                "format": "float",
                                "example": 350
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "GetCreditHistoryResponseV2": {
                "description": "Ответ на запрос истории транзакций по кредитам (v2)",
                "properties": {
                    "data": {
                        "description": "Массив транзакций",
                        "type": "array",
                        "items": {
                            "properties": {
                                "id": {
                                    "type": "integer",
                                    "example": 1
                                },
                                "type": {
                                    "type": "string",
                                    "enum": [
                                        "credit",
                                        "debit"
                                    ],
                                    "example": "debit"
                                },
                                "amount": {
                                    "type": "number",
                                    "format": "float",
                                    "example": 10
                                },
                                "reason": {
                                    "type": "string",
                                    "example": "vacancy_filtering",
                                    "nullable": true
                                },
                                "operation_key": {
                                    "type": "string",
                                    "example": "vacancy_filtering",
                                    "nullable": true
                                },
                                "operation_label": {
                                    "type": "string",
                                    "example": "Фильтрация вакансий",
                                    "nullable": true
                                },
                                "metadata": {
                                    "type": "object",
                                    "nullable": true
                                },
                                "created_at": {
                                    "type": "string",
                                    "format": "date-time",
                                    "example": "2025-01-15T10:30:00Z"
                                }
                            },
                            "type": "object"
                        }
                    },
                    "pagination": {
                        "description": "Метаданные пагинации",
                        "properties": {
                            "current_page": {
                                "type": "integer",
                                "example": 1
                            },
                            "per_page": {
                                "type": "integer",
                                "example": 10
                            },
                            "total": {
                                "type": "integer",
                                "example": 50
                            },
                            "last_page": {
                                "type": "integer",
                                "example": 5
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "GetCreditCostsResponseV2": {
                "description": "Ответ со стоимостью операций в кредитах (v2)",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Credit costs retrieved"
                    },
                    "data": {
                        "description": "Данные со стоимостью операций",
                        "properties": {
                            "costs": {
                                "description": "Стоимость операций в кредитах",
                                "type": "object",
                                "additionalProperties": {
                                    "type": "number"
                                }
                            },
                            "labels": {
                                "description": "Человекочитаемые названия операций",
                                "type": "object",
                                "additionalProperties": {
                                    "type": "string"
                                }
                            },
                            "pricing": {
                                "description": "Цены на покупку кредитов",
                                "properties": {
                                    "credit_price": {
                                        "type": "number",
                                        "example": 10
                                    }
                                },
                                "type": "object"
                            },
                            "packages": {
                                "description": "Пакеты кредитов",
                                "type": "array",
                                "items": {
                                    "type": "object"
                                }
                            },
                            "is_premium_credits_free": {
                                "description": "При true у пользователя премиум и все операции на сайте/в расширении — 0 CR",
                                "type": "boolean",
                                "example": false
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object",
                "example": {
                    "message": "Credit costs retrieved",
                    "data": {
                        "costs": {
                            "vacancy_filtering": 10,
                            "vacancy_auto_filtering": 50,
                            "cover_letter_generation": 5,
                            "resume_upgrade": 50,
                            "resume_recognition": 10,
                            "ai_cv_generation": 5,
                            "vacancy_analysis": 10,
                            "red_flags_analysis": 3,
                            "salary_negotiation": 10,
                            "interview_prep": 15,
                            "vacancy_analysis_per_vacancy": 1.8,
                            "vacancy_batch_analysis_base": 90,
                            "vacancy_batch_analysis_size": 50
                        },
                        "labels": {
                            "vacancy_filtering": "Анализ соответствия вакансии",
                            "cover_letter_generation": "Генерация сопроводительного письма",
                            "resume_upgrade": "Улучшение резюме AI",
                            "resume_recognition": "AI-распознавание структуры резюме",
                            "ai_cv_generation": "AI-генерация профессионального CV",
                            "red_flags_analysis": "Анализ рисков вакансии",
                            "salary_negotiation": "Стратегия переговоров о зарплате",
                            "interview_prep": "Подготовка к собеседованию"
                        },
                        "pricing": {
                            "credit_price": 10
                        },
                        "packages": []
                    }
                }
            },
            "ApiKeyV2": {
                "description": "API ключ для внешних интеграций (без значения ключа)",
                "properties": {
                    "id": {
                        "type": "integer",
                        "example": 1
                    },
                    "name": {
                        "type": "string",
                        "example": "Desktop App"
                    },
                    "type": {
                        "type": "string",
                        "enum": [
                            "desktop_app",
                            "public_api",
                            "browser_extension"
                        ],
                        "example": "desktop_app"
                    },
                    "scopes": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "example": [
                            "vacancies:read",
                            "applications:write"
                        ]
                    },
                    "last_used_at": {
                        "type": "string",
                        "format": "date-time",
                        "example": "2026-01-15T10:00:00Z",
                        "nullable": true
                    },
                    "created_at": {
                        "type": "string",
                        "format": "date-time",
                        "example": "2026-01-15T10:00:00Z",
                        "nullable": true
                    },
                    "revoked_at": {
                        "type": "string",
                        "format": "date-time",
                        "example": null,
                        "nullable": true
                    },
                    "is_valid": {
                        "type": "boolean",
                        "example": true
                    }
                },
                "type": "object"
            },
            "GenerateApiKeyRequestV2": {
                "description": "Запрос на создание API ключа",
                "properties": {
                    "name": {
                        "type": "string",
                        "maxLength": 255,
                        "example": "Desktop App"
                    },
                    "type": {
                        "type": "string",
                        "default": "desktop_app",
                        "enum": [
                            "desktop_app",
                            "public_api",
                            "browser_extension"
                        ],
                        "example": "desktop_app"
                    },
                    "scopes": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "example": [
                            "vacancies:read",
                            "applications:write"
                        ],
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "GenerateApiKeyResponseV2": {
                "description": "Ответ на создание API ключа (ключ показывается один раз)",
                "properties": {
                    "data": {
                        "properties": {
                            "id": {
                                "type": "integer",
                                "example": 1
                            },
                            "name": {
                                "type": "string",
                                "example": "Desktop App"
                            },
                            "key": {
                                "description": "Ключ показывается только один раз",
                                "type": "string",
                                "example": "hhbro_production_xxxxxxxxxxxxxxxxxxxxx"
                            },
                            "type": {
                                "type": "string",
                                "enum": [
                                    "desktop_app",
                                    "public_api",
                                    "browser_extension"
                                ],
                                "example": "desktop_app"
                            },
                            "scopes": {
                                "type": "array",
                                "items": {
                                    "type": "string"
                                }
                            },
                            "created_at": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2026-01-15T10:00:00Z"
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "ListApiKeysResponseV2": {
                "description": "Ответ со списком API ключей пользователя",
                "properties": {
                    "data": {
                        "description": "Список API ключей",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/ApiKeyV2"
                        }
                    }
                },
                "type": "object"
            },
            "InterviewLimitsV2": {
                "description": "Лимиты календаря интервью",
                "properties": {
                    "free_limit": {
                        "type": "integer",
                        "example": 50
                    },
                    "current_extra_blocks": {
                        "type": "integer",
                        "example": 2
                    },
                    "total_limit": {
                        "type": "integer",
                        "example": 150
                    },
                    "active_count": {
                        "type": "integer",
                        "example": 75
                    },
                    "can_add": {
                        "type": "boolean",
                        "example": true
                    },
                    "usage_percentage": {
                        "type": "integer",
                        "example": 50
                    },
                    "blocks_expire_at": {
                        "type": "string",
                        "format": "date-time",
                        "example": "2026-03-01T00:00:00Z",
                        "nullable": true
                    },
                    "auto_renew_enabled": {
                        "type": "boolean",
                        "example": true
                    },
                    "auto_renew_blocks": {
                        "type": "integer",
                        "example": 2
                    },
                    "next_charge_date": {
                        "type": "string",
                        "format": "date",
                        "example": "2026-03-01",
                        "nullable": true
                    },
                    "next_charge_amount": {
                        "type": "integer",
                        "example": 200
                    }
                },
                "type": "object"
            },
            "InterviewLocationV2": {
                "description": "Место проведения собеседования",
                "properties": {
                    "id": {
                        "description": "ID",
                        "type": "integer",
                        "example": 10
                    },
                    "location_type": {
                        "description": "Тип места",
                        "type": "string",
                        "enum": [
                            "office",
                            "online",
                            "phone",
                            "async"
                        ],
                        "example": "online"
                    },
                    "address": {
                        "description": "Адрес",
                        "type": "string",
                        "nullable": true
                    },
                    "location_comment": {
                        "description": "Комментарий",
                        "type": "string",
                        "nullable": true
                    },
                    "link": {
                        "description": "Ссылка на встречу",
                        "type": "string",
                        "nullable": true
                    },
                    "platform": {
                        "description": "Платформа",
                        "type": "string",
                        "nullable": true
                    },
                    "phone_number": {
                        "description": "Телефон",
                        "type": "string",
                        "nullable": true
                    },
                    "deadline": {
                        "description": "Дедлайн (для async)",
                        "type": "string",
                        "format": "date-time",
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "InterviewSalaryHistoryV2": {
                "description": "История обсуждения зарплаты",
                "properties": {
                    "id": {
                        "description": "ID записи",
                        "type": "integer",
                        "example": 5
                    },
                    "amount": {
                        "description": "Сумма",
                        "type": "number",
                        "format": "float",
                        "example": 150000
                    },
                    "currency": {
                        "description": "Валюта",
                        "type": "string",
                        "example": "RUB"
                    },
                    "is_gross": {
                        "description": "Gross",
                        "type": "boolean",
                        "example": false,
                        "nullable": true
                    },
                    "created_at": {
                        "description": "Дата создания",
                        "type": "string",
                        "format": "date-time"
                    }
                },
                "type": "object"
            },
            "InterviewStageV2": {
                "description": "Этап собеседования",
                "properties": {
                    "id": {
                        "description": "ID",
                        "type": "integer",
                        "example": 1
                    },
                    "user_id": {
                        "description": "ID пользователя",
                        "type": "integer",
                        "example": 10
                    },
                    "vacancy": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/VacancyCardV2"
                            }
                        ],
                        "nullable": true
                    },
                    "resume_id": {
                        "description": "ID резюме",
                        "type": "integer",
                        "example": 5,
                        "nullable": true
                    },
                    "stage_type": {
                        "description": "Тип этапа",
                        "type": "string",
                        "example": "technical"
                    },
                    "stage_custom_name": {
                        "description": "Кастомное имя этапа",
                        "type": "string",
                        "nullable": true
                    },
                    "vacancy_description": {
                        "description": "Текстовое описание вакансии (если нет ссылки)",
                        "type": "string",
                        "nullable": true
                    },
                    "datetime_start": {
                        "description": "Начало",
                        "type": "string",
                        "format": "date-time"
                    },
                    "datetime_end": {
                        "description": "Окончание",
                        "type": "string",
                        "format": "date-time",
                        "nullable": true
                    },
                    "status": {
                        "description": "Статус",
                        "type": "string",
                        "example": "upcoming"
                    },
                    "result_comment": {
                        "description": "Комментарий результата",
                        "type": "string",
                        "nullable": true
                    },
                    "location": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/InterviewLocationV2"
                            }
                        ],
                        "nullable": true
                    },
                    "contact": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/ContactV2"
                            }
                        ],
                        "nullable": true
                    },
                    "rejection": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/RejectionV2"
                            }
                        ],
                        "nullable": true
                    },
                    "reminder_enabled": {
                        "description": "Напоминание включено",
                        "type": "boolean",
                        "example": true
                    },
                    "reminder_offset_minutes": {
                        "description": "Смещение напоминания (мин)",
                        "type": "integer",
                        "example": 30,
                        "nullable": true
                    },
                    "salary_discussed": {
                        "description": "Обсуждаемая зарплата",
                        "type": "number",
                        "format": "float",
                        "example": 250000,
                        "nullable": true
                    },
                    "salary_currency": {
                        "description": "Валюта зарплаты",
                        "type": "string",
                        "example": "RUB",
                        "nullable": true
                    },
                    "salary_is_gross": {
                        "description": "Зарплата gross",
                        "type": "boolean",
                        "example": true,
                        "nullable": true
                    },
                    "salary_history": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/InterviewSalaryHistoryV2"
                        }
                    },
                    "created_at": {
                        "description": "Создано",
                        "type": "string",
                        "format": "date-time"
                    },
                    "updated_at": {
                        "description": "Обновлено",
                        "type": "string",
                        "format": "date-time"
                    }
                },
                "type": "object"
            },
            "RejectionReasonV2": {
                "description": "Причина отказа",
                "properties": {
                    "id": {
                        "description": "ID",
                        "type": "integer",
                        "example": 1
                    },
                    "category": {
                        "description": "Категория",
                        "type": "string",
                        "example": "company_side"
                    },
                    "reason_key": {
                        "description": "Ключ причины",
                        "type": "string",
                        "example": "no_team_fit"
                    },
                    "reason_ru": {
                        "description": "Причина (RU)",
                        "type": "string",
                        "example": "Не подошел команде"
                    },
                    "reason_en": {
                        "description": "Причина (EN)",
                        "type": "string",
                        "example": "Not a team fit"
                    },
                    "is_active": {
                        "description": "Активна",
                        "type": "boolean",
                        "example": true
                    }
                },
                "type": "object"
            },
            "RejectionV2": {
                "description": "Отказ по этапу собеседования",
                "properties": {
                    "id": {
                        "description": "ID",
                        "type": "integer",
                        "example": 1
                    },
                    "rejection_source": {
                        "description": "Источник отказа",
                        "type": "string",
                        "enum": [
                            "company",
                            "candidate",
                            "unknown"
                        ],
                        "example": "company"
                    },
                    "rejection_reason_id": {
                        "description": "ID причины отказа",
                        "type": "integer",
                        "example": 2,
                        "nullable": true
                    },
                    "rejection_custom_reason": {
                        "description": "Кастомная причина",
                        "type": "string",
                        "nullable": true
                    },
                    "rejection_comment": {
                        "description": "Комментарий",
                        "type": "string",
                        "nullable": true
                    },
                    "rejection_reason": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/RejectionReasonV2"
                            }
                        ],
                        "nullable": true,
                        "description": "Детали причины"
                    }
                },
                "type": "object"
            },
            "VacancyTextExtractedV2": {
                "description": "Результат извлечения текста вакансии",
                "properties": {
                    "text": {
                        "description": "Текст вакансии",
                        "type": "string",
                        "example": "Описание вакансии..."
                    }
                },
                "type": "object"
            },
            "CreateInterviewStageRequestV2": {
                "description": "Запрос создания этапа собеседования",
                "properties": {
                    "vacancy_id": {
                        "description": "ID вакансии",
                        "type": "integer",
                        "example": 123,
                        "nullable": true
                    },
                    "service_code": {
                        "description": "Код сервиса (если нет vacancy_id)",
                        "type": "string",
                        "example": "hh",
                        "nullable": true
                    },
                    "external_vacancy_id": {
                        "description": "Внешний ID вакансии",
                        "type": "string",
                        "example": "123456",
                        "nullable": true
                    },
                    "vacancy_description": {
                        "description": "Текстовое описание вакансии (если нет ссылки)",
                        "type": "string",
                        "nullable": true
                    },
                    "resume_id": {
                        "description": "ID резюме",
                        "type": "integer",
                        "example": 77,
                        "nullable": true
                    },
                    "stage_type": {
                        "description": "Тип этапа",
                        "type": "string",
                        "enum": [
                            "response",
                            "hr_screening",
                            "initial_call",
                            "technical",
                            "test_task",
                            "team_interview",
                            "manager_interview",
                            "final",
                            "offer",
                            "rejection",
                            "custom"
                        ],
                        "example": "technical"
                    },
                    "stage_custom_name": {
                        "description": "Кастомное название этапа",
                        "type": "string",
                        "nullable": true
                    },
                    "datetime_start": {
                        "description": "Дата/время начала",
                        "type": "string",
                        "format": "date-time"
                    },
                    "datetime_end": {
                        "description": "Дата/время окончания",
                        "type": "string",
                        "format": "date-time",
                        "nullable": true
                    },
                    "status": {
                        "description": "Статус",
                        "type": "string",
                        "enum": [
                            "upcoming",
                            "completed",
                            "rejected",
                            "rescheduled"
                        ],
                        "nullable": true
                    },
                    "result_comment": {
                        "description": "Комментарий к результату",
                        "type": "string",
                        "nullable": true
                    },
                    "location_id": {
                        "description": "ID места",
                        "type": "integer",
                        "nullable": true
                    },
                    "location": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/InterviewLocationPayloadV2"
                            }
                        ],
                        "nullable": true,
                        "description": "Данные места проведения"
                    },
                    "contact_id": {
                        "description": "ID контакта",
                        "type": "integer",
                        "nullable": true
                    },
                    "contact": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/CreateContactRequestV2"
                            }
                        ],
                        "nullable": true,
                        "description": "Данные контакта"
                    },
                    "reminder_enabled": {
                        "description": "Напоминание включено",
                        "type": "boolean",
                        "example": true
                    },
                    "reminder_offset_minutes": {
                        "description": "Смещение напоминания",
                        "type": "integer",
                        "example": 30,
                        "nullable": true
                    },
                    "salary_discussed": {
                        "description": "Обсуждаемая зарплата",
                        "type": "number",
                        "nullable": true
                    },
                    "salary_currency": {
                        "description": "Валюта зарплаты",
                        "type": "string",
                        "nullable": true
                    },
                    "salary_is_gross": {
                        "description": "Gross",
                        "type": "boolean",
                        "nullable": true
                    },
                    "rejection": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/InterviewRejectionPayloadV2"
                            }
                        ],
                        "nullable": true,
                        "description": "Данные отказа"
                    }
                },
                "type": "object"
            },
            "InterviewLocationPayloadV2": {
                "description": "Данные места проведения собеседования",
                "properties": {
                    "location_type": {
                        "type": "string",
                        "enum": [
                            "office",
                            "online",
                            "phone",
                            "async"
                        ]
                    },
                    "address": {
                        "type": "string",
                        "nullable": true
                    },
                    "location_comment": {
                        "type": "string",
                        "nullable": true
                    },
                    "link": {
                        "type": "string",
                        "nullable": true
                    },
                    "platform": {
                        "type": "string",
                        "nullable": true
                    },
                    "phone_number": {
                        "type": "string",
                        "nullable": true
                    },
                    "deadline": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "InterviewRejectionPayloadV2": {
                "description": "Данные отказа по этапу собеседования",
                "properties": {
                    "rejection_source": {
                        "type": "string",
                        "enum": [
                            "company",
                            "candidate",
                            "unknown"
                        ]
                    },
                    "rejection_reason_id": {
                        "type": "integer",
                        "nullable": true
                    },
                    "rejection_custom_reason": {
                        "type": "string",
                        "nullable": true
                    },
                    "rejection_comment": {
                        "type": "string",
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "ListInterviewStagesRequestV2": {
                "description": "Запрос списка этапов собеседований",
                "properties": {
                    "vacancy_id": {
                        "type": "integer",
                        "nullable": true
                    },
                    "resume_id": {
                        "type": "integer",
                        "nullable": true
                    },
                    "stage_type": {
                        "type": "string",
                        "nullable": true
                    },
                    "status": {
                        "type": "string",
                        "nullable": true
                    },
                    "location_type": {
                        "type": "string",
                        "nullable": true
                    },
                    "date_from": {
                        "type": "string",
                        "format": "date",
                        "nullable": true
                    },
                    "date_to": {
                        "type": "string",
                        "format": "date",
                        "nullable": true
                    },
                    "salary_min": {
                        "type": "number",
                        "nullable": true
                    },
                    "salary_max": {
                        "type": "number",
                        "nullable": true
                    },
                    "query": {
                        "description": "Поиск по названию, компании или контакту",
                        "type": "string",
                        "nullable": true
                    },
                    "service_code": {
                        "description": "Код сервиса вакансии",
                        "type": "string",
                        "nullable": true
                    },
                    "external_vacancy_id": {
                        "description": "Внешний ID вакансии",
                        "type": "string",
                        "nullable": true
                    },
                    "company": {
                        "type": "string",
                        "nullable": true
                    },
                    "sort": {
                        "type": "string",
                        "example": "-date",
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "RescheduleInterviewStageRequestV2": {
                "description": "Запрос переноса этапа собеседования",
                "properties": {
                    "datetime_start": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "datetime_end": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true
                    },
                    "ignore_conflicts": {
                        "type": "boolean",
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "UpdateInterviewStageRequestV2": {
                "description": "Запрос обновления этапа собеседования",
                "properties": {
                    "vacancy_id": {
                        "description": "ID вакансии",
                        "type": "integer",
                        "nullable": true
                    },
                    "service_code": {
                        "description": "Код сервиса",
                        "type": "string",
                        "nullable": true
                    },
                    "external_vacancy_id": {
                        "description": "Внешний ID вакансии",
                        "type": "string",
                        "nullable": true
                    },
                    "vacancy_description": {
                        "description": "Текстовое описание вакансии (если нет ссылки)",
                        "type": "string",
                        "nullable": true
                    },
                    "resume_id": {
                        "description": "ID резюме",
                        "type": "integer",
                        "nullable": true
                    },
                    "stage_type": {
                        "description": "Тип этапа",
                        "type": "string",
                        "nullable": true
                    },
                    "stage_custom_name": {
                        "description": "Кастомное название этапа",
                        "type": "string",
                        "nullable": true
                    },
                    "datetime_start": {
                        "description": "Дата/время начала",
                        "type": "string",
                        "format": "date-time",
                        "nullable": true
                    },
                    "datetime_end": {
                        "description": "Дата/время окончания",
                        "type": "string",
                        "format": "date-time",
                        "nullable": true
                    },
                    "status": {
                        "description": "Статус",
                        "type": "string",
                        "nullable": true
                    },
                    "result_comment": {
                        "description": "Комментарий к результату",
                        "type": "string",
                        "nullable": true
                    },
                    "location_id": {
                        "description": "ID места",
                        "type": "integer",
                        "nullable": true
                    },
                    "location": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/InterviewLocationPayloadV2"
                            }
                        ],
                        "nullable": true,
                        "description": "Данные места проведения"
                    },
                    "contact_id": {
                        "description": "ID контакта",
                        "type": "integer",
                        "nullable": true
                    },
                    "contact": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/UpdateContactRequestV2"
                            }
                        ],
                        "nullable": true,
                        "description": "Данные контакта"
                    },
                    "reminder_enabled": {
                        "description": "Напоминание включено",
                        "type": "boolean",
                        "nullable": true
                    },
                    "reminder_offset_minutes": {
                        "description": "Смещение напоминания",
                        "type": "integer",
                        "nullable": true
                    },
                    "salary_discussed": {
                        "description": "Обсуждаемая зарплата",
                        "type": "number",
                        "nullable": true
                    },
                    "salary_currency": {
                        "description": "Валюта зарплаты",
                        "type": "string",
                        "nullable": true
                    },
                    "salary_is_gross": {
                        "description": "Gross",
                        "type": "boolean",
                        "nullable": true
                    },
                    "rejection": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/InterviewRejectionPayloadV2"
                            }
                        ],
                        "nullable": true,
                        "description": "Данные отказа"
                    }
                },
                "type": "object"
            },
            "UpdateStageResultRequestV2": {
                "description": "Запрос обновления результата этапа собеседования",
                "properties": {
                    "status": {
                        "description": "Статус этапа",
                        "type": "string",
                        "enum": [
                            "upcoming",
                            "completed",
                            "rejected",
                            "rescheduled"
                        ],
                        "example": "completed"
                    },
                    "result_comment": {
                        "description": "Комментарий",
                        "type": "string",
                        "nullable": true
                    },
                    "rejection": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/InterviewRejectionPayloadV2"
                            }
                        ],
                        "nullable": true,
                        "description": "Данные отказа"
                    }
                },
                "type": "object"
            },
            "CreateInterviewStageResponseV2": {
                "description": "Ответ на запрос создания этапа собеседования",
                "properties": {
                    "message": {
                        "description": "Сообщение",
                        "type": "string",
                        "example": "Interview stage created"
                    },
                    "data": {
                        "$ref": "#/components/schemas/InterviewStageV2"
                    }
                },
                "type": "object"
            },
            "DeleteInterviewStageResponseV2": {
                "description": "Ответ на запрос удаления этапа собеседования",
                "properties": {
                    "message": {
                        "description": "Сообщение",
                        "type": "string",
                        "example": "Interview stage deleted"
                    }
                },
                "type": "object"
            },
            "ExtractVacancyTextFromFileResponseV2": {
                "description": "Ответ на запрос извлечения текста вакансии из файла",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной обработке",
                        "type": "string",
                        "example": "Vacancy text extracted successfully"
                    },
                    "data": {
                        "$ref": "#/components/schemas/VacancyTextExtractedV2"
                    }
                },
                "type": "object"
            },
            "GetInterviewLimitsResponseV2": {
                "description": "Interview calendar limits response",
                "properties": {
                    "message": {
                        "description": "Message",
                        "type": "string",
                        "example": "Interview limits retrieved successfully"
                    },
                    "data": {
                        "$ref": "#/components/schemas/InterviewLimitsV2"
                    }
                },
                "type": "object"
            },
            "GetInterviewStageResponseV2": {
                "description": "Ответ на запрос получения этапа собеседования",
                "properties": {
                    "message": {
                        "description": "Сообщение",
                        "type": "string",
                        "example": "Interview stage retrieved"
                    },
                    "data": {
                        "$ref": "#/components/schemas/InterviewStageV2"
                    }
                },
                "type": "object"
            },
            "ListInterviewStagesResponseV2": {
                "description": "Ответ на запрос списка этапов собеседований",
                "properties": {
                    "message": {
                        "description": "Сообщение",
                        "type": "string",
                        "example": "Interview stages retrieved"
                    },
                    "data": {
                        "description": "Список этапов",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/InterviewStageV2"
                        }
                    }
                },
                "type": "object"
            },
            "ListRejectionReasonsResponseV2": {
                "description": "Ответ на запрос списка причин отказа",
                "properties": {
                    "success": {
                        "type": "boolean",
                        "example": true
                    },
                    "data": {
                        "description": "Список причин",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/RejectionReasonV2"
                        }
                    },
                    "message": {
                        "description": "Сообщение",
                        "type": "string",
                        "example": "Rejection reasons retrieved successfully"
                    }
                },
                "type": "object"
            },
            "RescheduleInterviewStageResponseV2": {
                "description": "Ответ на запрос переноса этапа собеседования",
                "properties": {
                    "message": {
                        "description": "Сообщение",
                        "type": "string",
                        "example": "Interview stage rescheduled"
                    },
                    "data": {
                        "$ref": "#/components/schemas/InterviewStageV2"
                    }
                },
                "type": "object"
            },
            "UpdateInterviewStageResponseV2": {
                "description": "Ответ на запрос обновления этапа собеседования",
                "properties": {
                    "message": {
                        "description": "Сообщение",
                        "type": "string",
                        "example": "Interview stage updated"
                    },
                    "data": {
                        "$ref": "#/components/schemas/InterviewStageV2"
                    }
                },
                "type": "object"
            },
            "UpdateStageResultResponseV2": {
                "description": "Ответ на запрос обновления результата этапа",
                "properties": {
                    "message": {
                        "description": "Сообщение",
                        "type": "string",
                        "example": "Interview stage result updated"
                    },
                    "data": {
                        "$ref": "#/components/schemas/InterviewStageV2"
                    }
                },
                "type": "object"
            },
            "InterviewAnalyticsAIInsightsResponseV2": {
                "description": "AI insights response",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "AI insights generated successfully"
                    },
                    "data": {
                        "$ref": "#/components/schemas/InterviewAnalyticsAIInsightsDataV2"
                    }
                },
                "type": "object"
            },
            "InterviewAnalyticsAIInsightsDataV2": {
                "description": "AI insights data",
                "properties": {
                    "insights_markdown": {
                        "type": "string",
                        "example": "## Узкие места\n...\n"
                    }
                },
                "type": "object"
            },
            "InterviewAnalyticsCompanyConversionResponseV2": {
                "description": "Company conversion response",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Company conversion retrieved successfully"
                    },
                    "data": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/InterviewAnalyticsCompanyConversionItemV2"
                        }
                    }
                },
                "type": "object"
            },
            "InterviewAnalyticsCompanyConversionItemV2": {
                "description": "Company conversion item",
                "properties": {
                    "company": {
                        "type": "string",
                        "example": "ACME"
                    },
                    "responses": {
                        "type": "integer",
                        "example": 10
                    },
                    "interviews": {
                        "type": "integer",
                        "example": 4
                    },
                    "offers": {
                        "type": "integer",
                        "example": 1
                    },
                    "conversion": {
                        "type": "number",
                        "format": "float",
                        "example": 10
                    },
                    "avg_stages": {
                        "type": "number",
                        "format": "float",
                        "example": 4
                    },
                    "avg_salary": {
                        "type": "number",
                        "format": "float",
                        "example": 250000,
                        "nullable": true
                    },
                    "rejection_reasons": {
                        "description": "Причины отказов по компании",
                        "type": "array",
                        "items": {
                            "properties": {
                                "label": {
                                    "description": "array{label: string, count: int}> Причины отказов по компании",
                                    "type": "string",
                                    "example": "Не подошёл по опыту"
                                },
                                "count": {
                                    "description": "array{label: string, count: int}> Причины отказов по компании",
                                    "type": "integer",
                                    "example": 2
                                }
                            },
                            "type": "object"
                        }
                    }
                },
                "type": "object"
            },
            "InterviewAnalyticsFunnelResponseV2": {
                "description": "Interview funnel response",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Funnel data retrieved successfully"
                    },
                    "data": {
                        "$ref": "#/components/schemas/InterviewAnalyticsFunnelDataV2"
                    }
                },
                "type": "object"
            },
            "InterviewAnalyticsFunnelDataV2": {
                "description": "Funnel data",
                "properties": {
                    "total": {
                        "type": "integer",
                        "example": 12
                    },
                    "stages": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/InterviewAnalyticsFunnelStageV2"
                        }
                    }
                },
                "type": "object"
            },
            "InterviewAnalyticsFunnelStageV2": {
                "description": "Funnel stage",
                "properties": {
                    "name": {
                        "type": "string",
                        "example": "Отклики"
                    },
                    "count": {
                        "type": "integer",
                        "example": 10
                    },
                    "percentage": {
                        "type": "number",
                        "format": "float",
                        "example": 83.33
                    }
                },
                "type": "object"
            },
            "InterviewAnalyticsRejectionReasonsResponseV2": {
                "description": "Rejection reasons response",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Rejection reasons retrieved successfully"
                    },
                    "data": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/InterviewAnalyticsRejectionReasonItemV2"
                        }
                    }
                },
                "type": "object"
            },
            "InterviewAnalyticsRejectionReasonItemV2": {
                "description": "Rejection reason analytics item",
                "properties": {
                    "type": {
                        "type": "string",
                        "example": "dictionary"
                    },
                    "label": {
                        "type": "string",
                        "example": "Зарплатные ожидания"
                    },
                    "count": {
                        "type": "integer",
                        "example": 2
                    }
                },
                "type": "object"
            },
            "InterviewAnalyticsResumePerformanceResponseV2": {
                "description": "Resume performance response",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Resume performance retrieved successfully"
                    },
                    "data": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/InterviewAnalyticsResumePerformanceItemV2"
                        }
                    }
                },
                "type": "object"
            },
            "InterviewAnalyticsResumePerformanceItemV2": {
                "description": "Resume performance item",
                "properties": {
                    "resume_id": {
                        "type": "integer",
                        "example": 1
                    },
                    "resume_title": {
                        "type": "string",
                        "example": "PHP Developer",
                        "nullable": true
                    },
                    "stages": {
                        "type": "integer",
                        "example": 12
                    },
                    "offers": {
                        "type": "integer",
                        "example": 1
                    },
                    "conversion": {
                        "type": "number",
                        "format": "float",
                        "example": 8.33
                    }
                },
                "type": "object"
            },
            "InterviewAnalyticsSalaryResponseV2": {
                "description": "Salary analytics response",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Salary analytics retrieved successfully"
                    },
                    "data": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/InterviewAnalyticsSalaryItemV2"
                        }
                    }
                },
                "type": "object"
            },
            "InterviewAnalyticsSalaryItemV2": {
                "description": "Salary analytics item",
                "properties": {
                    "currency": {
                        "type": "string",
                        "example": "RUB"
                    },
                    "count": {
                        "type": "integer",
                        "example": 3
                    },
                    "min": {
                        "type": "number",
                        "format": "float",
                        "example": 180000
                    },
                    "max": {
                        "type": "number",
                        "format": "float",
                        "example": 300000
                    },
                    "avg": {
                        "type": "number",
                        "format": "float",
                        "example": 240000
                    }
                },
                "type": "object"
            },
            "GenerateUrlsRequestV2": {
                "description": "Запрос генерации URL поиска",
                "properties": {
                    "filters": {
                        "description": "Фильтры поиска",
                        "type": "object",
                        "example": {
                            "text": "PHP разработчик",
                            "area": "Москва",
                            "salary": {
                                "from": 100000
                            }
                        }
                    },
                    "services": {
                        "description": "Массив кодов сервисов",
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "hh",
                                "sj",
                                "rabota",
                                "yandex",
                                "linkedin"
                            ]
                        },
                        "example": [
                            "hh",
                            "sj"
                        ]
                    }
                },
                "type": "object"
            },
            "GetFiltersByServiceRequestV2": {
                "description": "Запрос получения фильтров по сервису"
            },
            "GetFiltersRequestV2": {
                "description": "Запрос получения списка фильтров"
            },
            "JobSearchGetPopularCitiesRequestV2": {
                "description": "Запрос получения популярных городов для мультипоиска",
                "properties": {
                    "service_id": {
                        "description": "ID сервиса для фильтрации",
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                    },
                    "services": {
                        "description": "Массив кодов сервисов (hh, sj, trudvsem, zarplata, rabota, yandex, linkedin)",
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "hh",
                                "sj",
                                "trudvsem",
                                "zarplata",
                                "rabota",
                                "yandex",
                                "linkedin"
                            ]
                        },
                        "example": [
                            "hh"
                        ],
                        "nullable": true
                    },
                    "limit": {
                        "description": "Количество городов",
                        "type": "integer",
                        "default": 20,
                        "maximum": 50,
                        "minimum": 1,
                        "example": 10
                    }
                },
                "type": "object"
            },
            "GetRegionRequestV2": {
                "description": "Запрос получения региона/города по ID",
                "properties": {
                    "id": {
                        "description": "ID региона/города",
                        "type": "integer",
                        "example": 1
                    },
                    "service_id": {
                        "description": "ID сервиса для получения service_value",
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "GetRegionsTreeRequestV2": {
                "description": "Запрос получения иерархического дерева регионов",
                "properties": {
                    "service_id": {
                        "description": "ID сервиса для фильтрации",
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                    },
                    "parent_id": {
                        "description": "ID родительского региона (null для корня)",
                        "type": "integer",
                        "example": null,
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "GetServicesRequestV2": {
                "description": "Запрос получения списка сервисов"
            },
            "GetSuggestsRequestV2": {
                "description": "Запрос получения подсказок (suggests)",
                "properties": {
                    "text": {
                        "description": "Текст для поиска",
                        "type": "string",
                        "example": "Москва",
                        "nullable": true
                    },
                    "service": {
                        "description": "Код сервиса",
                        "type": "string",
                        "enum": [
                            "hh",
                            "sj",
                            "trudvsem",
                            "zarplata"
                        ],
                        "example": "hh",
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "SearchRegionsRequestV2": {
                "description": "Запрос поиска регионов/городов с маппингом на сервисы",
                "properties": {
                    "q": {
                        "description": "Поисковый запрос (минимум 2 символа)",
                        "type": "string",
                        "example": "Москва",
                        "nullable": true
                    },
                    "service_id": {
                        "description": "ID сервиса для получения service_value",
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                    },
                    "services": {
                        "description": "Массив кодов сервисов (hh, sj, trudvsem, zarplata, rabota, yandex, linkedin)",
                        "type": "array",
                        "items": {
                            "type": "string",
                            "enum": [
                                "hh",
                                "sj",
                                "trudvsem",
                                "zarplata",
                                "rabota",
                                "yandex",
                                "linkedin"
                            ]
                        },
                        "example": [
                            "hh"
                        ],
                        "nullable": true
                    },
                    "type": {
                        "description": "Тип региона",
                        "type": "string",
                        "enum": [
                            "city",
                            "region",
                            "country"
                        ],
                        "example": "city",
                        "nullable": true
                    },
                    "limit": {
                        "description": "Максимум результатов",
                        "type": "integer",
                        "default": 50,
                        "maximum": 100,
                        "minimum": 1,
                        "example": 20
                    }
                },
                "type": "object"
            },
            "GenerateUrlsResponseV2": {
                "description": "Ответ на запрос генерации URL поиска",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной генерации",
                        "type": "string",
                        "example": "URLs generated"
                    },
                    "data": {
                        "description": "Данные сгенерированных URL",
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "GetFiltersByServiceResponseV2": {
                "description": "Ответ на запрос получения фильтров по сервису",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной загрузке",
                        "type": "string",
                        "example": "Filters by service retrieved"
                    },
                    "data": {
                        "description": "Данные фильтров по сервисам",
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "GetFiltersResponseV2": {
                "description": "Ответ на запрос получения списка фильтров",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной загрузке",
                        "type": "string",
                        "example": "Filters retrieved"
                    },
                    "data": {
                        "description": "Данные фильтров",
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    }
                },
                "type": "object"
            },
            "GetRegionResponseV2": {
                "description": "Ответ на запрос получения региона/города по ID",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной загрузке",
                        "type": "string",
                        "example": "Region retrieved"
                    },
                    "data": {
                        "$ref": "#/components/schemas/CityV2"
                    }
                },
                "type": "object"
            },
            "GetRegionsTreeResponseV2": {
                "description": "Ответ на запрос получения иерархического дерева регионов",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной загрузке",
                        "type": "string",
                        "example": "Regions tree retrieved"
                    },
                    "data": {
                        "description": "Массив узлов дерева регионов",
                        "type": "array",
                        "items": {
                            "properties": {
                                "id": {
                                    "type": "integer",
                                    "example": 1
                                },
                                "name": {
                                    "type": "string",
                                    "example": "Москва"
                                },
                                "type": {
                                    "type": "string",
                                    "enum": [
                                        "city",
                                        "region",
                                        "district",
                                        "country"
                                    ],
                                    "example": "city"
                                },
                                "country_code": {
                                    "type": "string",
                                    "example": "RU"
                                },
                                "has_mapping": {
                                    "type": "boolean",
                                    "example": true
                                },
                                "children_count": {
                                    "type": "integer",
                                    "example": 5
                                },
                                "is_selectable": {
                                    "type": "boolean",
                                    "example": true
                                }
                            },
                            "type": "object"
                        }
                    }
                },
                "type": "object"
            },
            "GetServicesResponseV2": {
                "description": "Ответ на запрос получения списка сервисов",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной загрузке",
                        "type": "string",
                        "example": "Services retrieved"
                    },
                    "data": {
                        "description": "Данные сервисов",
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    }
                },
                "type": "object"
            },
            "GetSuggestsResponseV2": {
                "description": "Ответ на запрос получения подсказок",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной загрузке",
                        "type": "string",
                        "example": "Suggests retrieved"
                    },
                    "data": {
                        "description": "Данные подсказок",
                        "type": "array",
                        "items": {
                            "properties": {
                                "value": {
                                    "type": "string",
                                    "example": "1"
                                },
                                "label": {
                                    "type": "string",
                                    "example": "Москва"
                                }
                            },
                            "type": "object"
                        }
                    }
                },
                "type": "object"
            },
            "SearchRegionsResponseV2": {
                "description": "Ответ на запрос поиска регионов/городов",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной загрузке",
                        "type": "string",
                        "example": "Regions retrieved"
                    },
                    "data": {
                        "description": "Массив регионов/городов",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/CityV2"
                        }
                    }
                },
                "type": "object"
            },
            "SearchSessionV2": {
                "description": "Информация о сессии мультипоиска",
                "properties": {
                    "id": {
                        "type": "integer",
                        "example": 1
                    },
                    "saved_search_id": {
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                    },
                    "status": {
                        "type": "string",
                        "enum": [
                            "pending",
                            "in_progress",
                            "completed",
                            "failed"
                        ],
                        "example": "in_progress"
                    },
                    "service_progress": {
                        "description": "Прогресс по сервисам {code: {status, count, error}}",
                        "type": "object",
                        "example": {
                            "hh": {
                                "status": "completed",
                                "count": 50,
                                "error": null
                            }
                        },
                        "additionalProperties": {
                            "properties": {
                                "status": {
                                    "type": "string",
                                    "enum": [
                                        "pending",
                                        "searching",
                                        "completed",
                                        "failed",
                                        "skipped"
                                    ]
                                },
                                "count": {
                                    "type": "integer"
                                },
                                "error": {
                                    "type": "string",
                                    "nullable": true
                                }
                            },
                            "type": "object"
                        }
                    },
                    "total_found": {
                        "type": "integer",
                        "example": 100
                    },
                    "started_at": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true
                    },
                    "completed_at": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true
                    },
                    "created_at": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true
                    },
                    "saved_search": {
                        "properties": {
                            "id": {
                                "type": "integer"
                            },
                            "name": {
                                "type": "string"
                            },
                            "color": {
                                "type": "string"
                            },
                            "icon": {
                                "type": "string"
                            }
                        },
                        "type": "object",
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "StartMultiSearchRequestV2": {
                "description": "Запрос на запуск мультипоиска вакансий",
                "properties": {
                    "saved_search_id": {
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                    },
                    "resume_id": {
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                    },
                    "limit": {
                        "type": "integer",
                        "default": 50,
                        "example": 50
                    },
                    "service_ids": {
                        "type": "array",
                        "items": {
                            "type": "integer"
                        },
                        "example": [
                            1,
                            2
                        ],
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "GetProgressResponseV2": {
                "description": "Ответ на запрос прогресса мультипоиска",
                "properties": {
                    "data": {
                        "properties": {
                            "session_id": {
                                "type": "integer",
                                "example": 1
                            },
                            "status": {
                                "type": "string",
                                "example": "in_progress"
                            },
                            "service_progress": {
                                "type": "object",
                                "additionalProperties": {
                                    "properties": {
                                        "status": {
                                            "type": "string",
                                            "enum": [
                                                "pending",
                                                "searching",
                                                "completed",
                                                "failed",
                                                "skipped"
                                            ]
                                        },
                                        "count": {
                                            "type": "integer"
                                        },
                                        "error": {
                                            "description": "Raw error message (для дебага)",
                                            "type": "string",
                                            "nullable": true
                                        },
                                        "error_category": {
                                            "description": "Категория ошибки (для UI-баннера, без raw-стектрейса)",
                                            "type": "string",
                                            "enum": [
                                                "api_blocked",
                                                "proxy_failure",
                                                "network_error",
                                                "auth_required",
                                                "disabled",
                                                "unknown"
                                            ],
                                            "nullable": true
                                        }
                                    },
                                    "type": "object"
                                }
                            },
                            "total_found": {
                                "type": "integer",
                                "example": 100
                            },
                            "completion_percentage": {
                                "type": "integer",
                                "example": 75
                            },
                            "is_completed": {
                                "type": "boolean",
                                "example": false
                            },
                            "started_at": {
                                "type": "string",
                                "format": "date-time",
                                "nullable": true
                            },
                            "completed_at": {
                                "type": "string",
                                "format": "date-time",
                                "nullable": true
                            },
                            "requires_hh_auth": {
                                "description": "HH-сервис требует (пере)авторизации — показать модалку «Подключить HeadHunter»",
                                "type": "boolean",
                                "example": false
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "GetRecentSessionsResponseV2": {
                "description": "Ответ на запрос последних сессий мультипоиска",
                "properties": {
                    "data": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/SearchSessionV2"
                        }
                    }
                },
                "type": "object"
            },
            "GetResultsResponseV2": {
                "description": "Ответ на запрос результатов мультипоиска",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Search results retrieved"
                    },
                    "data": {
                        "properties": {
                            "session": {
                                "properties": {
                                    "id": {
                                        "type": "integer"
                                    },
                                    "status": {
                                        "type": "string"
                                    },
                                    "total_found": {
                                        "type": "integer"
                                    },
                                    "service_progress": {
                                        "type": "object",
                                        "additionalProperties": {
                                            "type": "object"
                                        }
                                    }
                                },
                                "type": "object"
                            },
                            "vacancies": {
                                "type": "array",
                                "items": {
                                    "$ref": "#/components/schemas/VacancyCardV2"
                                }
                            },
                            "count": {
                                "type": "integer",
                                "example": 50
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "GetServiceAvailabilityResponseV2": {
                "description": "Service availability for multi-search",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Service availability retrieved"
                    },
                    "data": {
                        "properties": {
                            "services": {
                                "type": "array",
                                "items": {
                                    "properties": {
                                        "code": {
                                            "type": "string",
                                            "example": "hh"
                                        },
                                        "name": {
                                            "type": "string",
                                            "example": "HeadHunter"
                                        },
                                        "status": {
                                            "type": "string",
                                            "example": "available"
                                        },
                                        "remaining_percent": {
                                            "type": "integer",
                                            "example": 80
                                        }
                                    },
                                    "type": "object"
                                }
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "GetUserQuotaStatusResponseV2": {
                "description": "User API quota status for multi-search",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "User quota status retrieved"
                    },
                    "data": {
                        "properties": {
                            "quota": {
                                "properties": {
                                    "searches_limit": {
                                        "type": "integer",
                                        "example": 5
                                    },
                                    "searches_used": {
                                        "type": "integer",
                                        "example": 2
                                    },
                                    "searches_remaining": {
                                        "type": "integer",
                                        "example": 3
                                    },
                                    "enrichments_limit": {
                                        "type": "integer",
                                        "example": 100
                                    },
                                    "enrichments_used": {
                                        "type": "integer",
                                        "example": 15
                                    },
                                    "enrichments_remaining": {
                                        "type": "integer",
                                        "example": 85
                                    }
                                },
                                "type": "object"
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "StartMultiSearchResponseV2": {
                "description": "Ответ на запрос запуска мультипоиска",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Multi-service search started"
                    },
                    "data": {
                        "properties": {
                            "session_id": {
                                "type": "integer",
                                "example": 1
                            },
                            "status": {
                                "type": "string",
                                "example": "in_progress"
                            },
                            "service_progress": {
                                "type": "object",
                                "additionalProperties": {
                                    "properties": {
                                        "status": {
                                            "type": "string"
                                        },
                                        "count": {
                                            "type": "integer"
                                        },
                                        "error": {
                                            "type": "string",
                                            "nullable": true
                                        }
                                    },
                                    "type": "object"
                                }
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "CancelPaymentRequestV2": {
                "description": "Запрос отмены платежа. ID платежа передается в URL пути.",
                "properties": {
                    "id": {
                        "description": "ID платежа",
                        "type": "integer",
                        "minimum": 1,
                        "example": 1
                    }
                },
                "type": "object"
            },
            "CancelPaymentResponseV2": {
                "description": "Ответ на запрос отмены платежа",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной отмене",
                        "type": "string",
                        "example": "Платеж отменен"
                    },
                    "data": {
                        "description": "Данные отмененного платежа",
                        "properties": {
                            "id": {
                                "description": "ID платежа",
                                "type": "integer",
                                "example": 1
                            },
                            "status": {
                                "description": "Статус платежа",
                                "type": "string",
                                "example": "cancelled"
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "ApplyReferralCodeRequestV2": {
                "description": "Тело запроса применения реферального кода (v2)",
                "required": [
                    "code"
                ],
                "properties": {
                    "code": {
                        "description": "Реферальный код",
                        "type": "string",
                        "example": "Ab12Xy"
                    }
                },
                "type": "object"
            },
            "ApplyReferralCodeResponseV2": {
                "description": "Ответ v2 после применения реферального кода",
                "properties": {
                    "data": {
                        "properties": {
                            "success": {
                                "type": "boolean",
                                "example": true
                            },
                            "referrer_name": {
                                "type": "string",
                                "example": "Иван"
                            },
                            "referrer_email": {
                                "description": "Email пригласившего для контакта",
                                "type": "string",
                                "example": "ivan@example.com",
                                "nullable": true
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "GetReferralCodeResponseV2": {
                "description": "Ответ v2: реферальный код и ссылка",
                "properties": {
                    "data": {
                        "properties": {
                            "code": {
                                "type": "string",
                                "example": "Ab12Xy"
                            },
                            "url": {
                                "type": "string",
                                "example": "https://hhbro.ru/ref/Ab12Xy"
                            },
                            "is_active": {
                                "type": "boolean",
                                "example": true
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "GetReferralInfoResponseV2": {
                "description": "Публичная информация о реферальной программе (v2, без авторизации)",
                "properties": {
                    "data": {
                        "properties": {
                            "reward_percentage": {
                                "type": "integer",
                                "example": 10
                            },
                            "reward_duration_months": {
                                "type": "integer",
                                "example": 3
                            },
                            "examples": {
                                "type": "array",
                                "items": {
                                    "properties": {
                                        "label": {
                                            "type": "string",
                                            "example": "Друг зарегистрировался"
                                        },
                                        "referrer_earns": {
                                            "type": "number",
                                            "format": "float",
                                            "example": 50
                                        }
                                    },
                                    "type": "object"
                                }
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "GetReferralStatsResponseV2": {
                "description": "Статистика реферальной программы (v2)",
                "properties": {
                    "data": {
                        "properties": {
                            "total_referrals": {
                                "type": "integer",
                                "example": 5
                            },
                            "active_referrals": {
                                "type": "integer",
                                "example": 4
                            },
                            "total_rewards": {
                                "type": "number",
                                "format": "float",
                                "example": 120.5
                            },
                            "referral_code": {
                                "type": "string",
                                "example": "Ab12Xy"
                            },
                            "referral_url": {
                                "type": "string",
                                "example": "https://hhbro.ru/ref/Ab12Xy"
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "GetReferralsResponseV2": {
                "description": "Пагинированный список рефералов (v2)",
                "properties": {
                    "data": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/ReferralItemV2"
                        }
                    },
                    "meta": {
                        "properties": {
                            "current_page": {
                                "type": "integer",
                                "example": 1
                            },
                            "per_page": {
                                "type": "integer",
                                "example": 15
                            },
                            "total": {
                                "type": "integer",
                                "example": 10
                            },
                            "last_page": {
                                "type": "integer",
                                "example": 1
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "ReferralItemV2": {
                "description": "Элемент списка рефералов (v2)",
                "properties": {
                    "id": {
                        "type": "integer",
                        "example": 1
                    },
                    "referred_user_name": {
                        "type": "string",
                        "example": "Пётр"
                    },
                    "status": {
                        "type": "string",
                        "enum": [
                            "active",
                            "expired"
                        ],
                        "example": "active"
                    },
                    "reward_expires_at": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true
                    },
                    "total_rewards": {
                        "type": "number",
                        "format": "float",
                        "example": 25
                    },
                    "created_at": {
                        "type": "string",
                        "format": "date-time"
                    }
                },
                "type": "object"
            },
            "ResumeCategoryV2": {
                "description": "Категория резюме пользователя",
                "properties": {
                    "id": {
                        "description": "ID категории",
                        "type": "integer",
                        "example": 1
                    },
                    "name": {
                        "description": "Название категории",
                        "type": "string",
                        "maxLength": 100,
                        "example": "Мое резюме"
                    },
                    "color": {
                        "description": "Цвет категории (hex)",
                        "type": "string",
                        "pattern": "^#[0-9A-Fa-f]{6}$",
                        "example": "#6366F1"
                    },
                    "icon": {
                        "description": "Иконка категории",
                        "type": "string",
                        "maxLength": 50,
                        "example": "folder",
                        "nullable": true
                    },
                    "sort_order": {
                        "description": "Порядок сортировки",
                        "type": "integer",
                        "example": 0
                    },
                    "is_default": {
                        "description": "Является ли категория категорией по умолчанию",
                        "type": "boolean",
                        "example": true
                    },
                    "is_system": {
                        "description": "Является ли категория системной",
                        "type": "boolean",
                        "example": true
                    },
                    "resumes_count": {
                        "description": "Количество резюме в категории",
                        "type": "integer",
                        "example": 5
                    },
                    "created_at": {
                        "description": "Дата создания (ISO string)",
                        "type": "string",
                        "example": "2025-01-15T10:30:00Z",
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "ResumeV2": {
                "description": "Информация о резюме",
                "properties": {
                    "id": {
                        "type": "integer",
                        "example": 1
                    },
                    "category_id": {
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                    },
                    "external_resume_id": {
                        "type": "string",
                        "nullable": true
                    },
                    "source": {
                        "description": "Источник резюме: file, hh, sj, manual, generated, ai_generated, tailored_for_vacancy (под вакансию)",
                        "type": "string",
                        "enum": [
                            "file",
                            "hh",
                            "sj",
                            "manual",
                            "generated",
                            "ai_generated",
                            "tailored_for_vacancy"
                        ],
                        "example": "file"
                    },
                    "title": {
                        "type": "string",
                        "example": "Senior PHP Developer",
                        "nullable": true
                    },
                    "first_name": {
                        "type": "string",
                        "nullable": true
                    },
                    "last_name": {
                        "type": "string",
                        "nullable": true
                    },
                    "middle_name": {
                        "type": "string",
                        "nullable": true
                    },
                    "age": {
                        "type": "integer",
                        "example": 30,
                        "nullable": true
                    },
                    "gender": {
                        "type": "string",
                        "enum": [
                            "male",
                            "female"
                        ],
                        "nullable": true
                    },
                    "area": {
                        "type": "object",
                        "nullable": true
                    },
                    "about_me": {
                        "type": "string",
                        "nullable": true
                    },
                    "contacts": {
                        "type": "object",
                        "nullable": true
                    },
                    "photo_url": {
                        "type": "string",
                        "nullable": true
                    },
                    "photo_path": {
                        "type": "string",
                        "nullable": true
                    },
                    "job_search_status": {
                        "type": "string",
                        "enum": [
                            "active_search",
                            "open_to_offers",
                            "considering_offer",
                            "starting_soon",
                            "not_looking"
                        ],
                        "example": "open_to_offers"
                    },
                    "job_search_status_label": {
                        "type": "string",
                        "example": "Рассматриваю предложения"
                    },
                    "ai_cv_data": {
                        "type": "object",
                        "nullable": true
                    },
                    "ai_cv_generated_at": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true
                    },
                    "skills": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "experience": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "education": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "courses": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "languages": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "total_experience": {
                        "type": "string",
                        "nullable": true
                    },
                    "desired_salary": {
                        "type": "integer",
                        "example": 150000,
                        "nullable": true
                    },
                    "desired_salary_currency": {
                        "type": "string",
                        "enum": [
                            "RUB",
                            "USD",
                            "EUR",
                            "GBP",
                            "KZT",
                            "BYN",
                            "UAH"
                        ],
                        "nullable": true
                    },
                    "employment_types": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "work_formats": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "commute_time": {
                        "type": "string",
                        "nullable": true
                    },
                    "business_trips": {
                        "type": "string",
                        "enum": [
                            "ready",
                            "sometimes",
                            "not_ready"
                        ],
                        "nullable": true
                    },
                    "citizenship": {
                        "type": "string",
                        "nullable": true
                    },
                    "work_permit": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "has_car": {
                        "type": "boolean",
                        "nullable": true
                    },
                    "driver_license": {
                        "type": "string",
                        "nullable": true
                    },
                    "is_active": {
                        "type": "boolean",
                        "example": true
                    },
                    "vacancy_search_order": {
                        "type": "string",
                        "enum": [
                            "relevance",
                            "publication_time",
                            "salary_desc",
                            "salary_asc",
                            "distance"
                        ],
                        "example": "relevance"
                    },
                    "original_file_name": {
                        "type": "string",
                        "nullable": true
                    },
                    "original_file_path": {
                        "type": "string",
                        "nullable": true
                    },
                    "extracted_text": {
                        "type": "string",
                        "nullable": true
                    },
                    "analyzed_at": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true
                    },
                    "parsed_at": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true
                    },
                    "synced_at": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true
                    },
                    "created_at": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "updated_at": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "enhanced_from_id": {
                        "type": "integer",
                        "nullable": true
                    },
                    "is_tailored": {
                        "description": "Является ли резюме адаптированным под конкретную вакансию",
                        "type": "boolean",
                        "example": false
                    },
                    "tailored_for_vacancy_id": {
                        "description": "ID записи vacancy_history, под которую адаптировано резюме",
                        "type": "integer",
                        "nullable": true
                    },
                    "tailored_for_service_code": {
                        "description": "Код сервиса вакансии",
                        "type": "string",
                        "example": "hh",
                        "nullable": true
                    },
                    "tailored_for_external_vacancy_id": {
                        "description": "Внешний ID вакансии",
                        "type": "string",
                        "example": "12345678",
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "ErrorResponse": {
                "description": "Стандартизированный ответ об ошибке API",
                "properties": {
                    "error_code": {
                        "description": "Код ошибки (значение из ErrorCode enum)",
                        "type": "string",
                        "example": "AUTH_UNAUTHENTICATED"
                    },
                    "message_en": {
                        "description": "Сообщение об ошибке на английском языке",
                        "type": "string",
                        "example": "User is not authenticated"
                    },
                    "message_ru": {
                        "description": "Сообщение об ошибке на русском языке",
                        "type": "string",
                        "example": "Пользователь не авторизован"
                    },
                    "data": {
                        "description": "Дополнительные данные об ошибке (опционально). Может содержать детали валидации, контекст ошибки и т.д.",
                        "type": "object",
                        "example": {
                            "errors": {
                                "name": [
                                    "The name field is required."
                                ],
                                "email": [
                                    "The email must be a valid email address."
                                ]
                            }
                        },
                        "nullable": true,
                        "additionalProperties": true
                    }
                },
                "type": "object"
            },
            "AnalyzeCareerPathRequestV2": {
                "title": "Analyze Career Path Request",
                "description": "Request body for career path analysis",
                "required": [
                    "resume_id"
                ],
                "properties": {
                    "resume_id": {
                        "description": "Resume ID to analyze",
                        "type": "integer",
                        "example": 42
                    }
                },
                "type": "object"
            },
            "AnalyzeSalaryBenchmarkRequestV2": {
                "title": "Analyze Salary Benchmark Request",
                "description": "Request body for salary benchmark analysis",
                "required": [
                    "resume_id"
                ],
                "properties": {
                    "resume_id": {
                        "description": "Resume ID to analyze",
                        "type": "integer",
                        "example": 42
                    },
                    "current_salary": {
                        "description": "Current salary amount (optional)",
                        "type": "integer",
                        "example": 180000
                    },
                    "current_salary_currency": {
                        "description": "Currency for current salary (optional)",
                        "type": "string",
                        "example": "RUB"
                    }
                },
                "type": "object"
            },
            "AnalyzeSkillsGapRequestV2": {
                "title": "Analyze Skills Gap Request",
                "description": "Request body for skills gap analysis",
                "required": [
                    "resume_id",
                    "target_position"
                ],
                "properties": {
                    "resume_id": {
                        "description": "Resume ID to analyze",
                        "type": "integer",
                        "example": 42
                    },
                    "target_position": {
                        "description": "Target position for comparison",
                        "type": "string",
                        "example": "Senior PHP Developer"
                    }
                },
                "type": "object"
            },
            "CareerChatRequestV2": {
                "title": "Career Chat Request",
                "description": "Запрос на чат с карьерным коучем",
                "required": [
                    "resume_id",
                    "user_message"
                ],
                "properties": {
                    "resume_id": {
                        "description": "ID резюме",
                        "type": "integer",
                        "example": 42
                    },
                    "user_message": {
                        "description": "Сообщение пользователя",
                        "type": "string",
                        "example": "Как подготовиться к переходу на Senior?"
                    },
                    "conversation_history": {
                        "description": "История диалога (опционально)",
                        "type": "array",
                        "items": {
                            "properties": {
                                "role": {
                                    "type": "string",
                                    "example": "user"
                                },
                                "content": {
                                    "type": "string",
                                    "example": "Как подготовиться к собеседованию?"
                                }
                            },
                            "type": "object"
                        },
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "RecognizeResumeRequestV2": {
                "description": "Данные для распознавания резюме через AI",
                "properties": {
                    "text": {
                        "description": "Optional text to recognize. If not provided, uses resume extracted_text.",
                        "type": "string",
                        "maxLength": 100000,
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "UpdateJobSearchStatusRequestV2": {
                "description": "Данные для обновления статуса поиска работы",
                "properties": {
                    "status": {
                        "type": "string",
                        "enum": [
                            "active_search",
                            "open_to_offers",
                            "considering_offer",
                            "starting_soon",
                            "not_looking"
                        ],
                        "example": "open_to_offers"
                    }
                },
                "type": "object"
            },
            "UpdateResumeRequestV2": {
                "description": "Данные для обновления резюме",
                "properties": {
                    "category_id": {
                        "type": "integer",
                        "nullable": true
                    },
                    "title": {
                        "type": "string",
                        "maxLength": 255,
                        "nullable": true
                    },
                    "first_name": {
                        "type": "string",
                        "maxLength": 100,
                        "nullable": true
                    },
                    "last_name": {
                        "type": "string",
                        "maxLength": 100,
                        "nullable": true
                    },
                    "middle_name": {
                        "type": "string",
                        "maxLength": 100,
                        "nullable": true
                    },
                    "area": {
                        "type": "mixed",
                        "nullable": true
                    },
                    "age": {
                        "type": "integer",
                        "maximum": 100,
                        "minimum": 14,
                        "nullable": true
                    },
                    "gender": {
                        "type": "string",
                        "enum": [
                            "male",
                            "female"
                        ],
                        "nullable": true
                    },
                    "about_me": {
                        "type": "string",
                        "maxLength": 10000,
                        "nullable": true
                    },
                    "extracted_text": {
                        "type": "string",
                        "maxLength": 100000,
                        "nullable": true
                    },
                    "contacts": {
                        "type": "object",
                        "nullable": true
                    },
                    "skills": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        },
                        "nullable": true
                    },
                    "experience": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        },
                        "nullable": true
                    },
                    "education": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        },
                        "nullable": true
                    },
                    "courses": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        },
                        "nullable": true
                    },
                    "languages": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        },
                        "nullable": true
                    },
                    "total_experience": {
                        "type": "string",
                        "maxLength": 255,
                        "nullable": true
                    },
                    "desired_salary": {
                        "type": "integer",
                        "minimum": 0,
                        "nullable": true
                    },
                    "desired_salary_currency": {
                        "type": "string",
                        "enum": [
                            "RUB",
                            "USD",
                            "EUR",
                            "GBP",
                            "KZT",
                            "BYN",
                            "UAH"
                        ],
                        "nullable": true
                    },
                    "employment_types": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "nullable": true
                    },
                    "work_formats": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "nullable": true
                    },
                    "commute_time": {
                        "type": "string",
                        "maxLength": 50,
                        "nullable": true
                    },
                    "business_trips": {
                        "type": "string",
                        "enum": [
                            "ready",
                            "sometimes",
                            "not_ready"
                        ],
                        "nullable": true
                    },
                    "citizenship": {
                        "type": "string",
                        "maxLength": 100,
                        "nullable": true
                    },
                    "work_permit": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "nullable": true
                    },
                    "has_car": {
                        "type": "boolean",
                        "nullable": true
                    },
                    "driver_license": {
                        "type": "string",
                        "maxLength": 50,
                        "nullable": true
                    },
                    "job_search_status": {
                        "type": "string",
                        "enum": [
                            "active_search",
                            "open_to_offers",
                            "considering_offer",
                            "starting_soon",
                            "not_looking"
                        ],
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "UpdateSortOrderRequestV2": {
                "description": "Данные для обновления порядка сортировки вакансий",
                "properties": {
                    "vacancy_search_order": {
                        "type": "string",
                        "enum": [
                            "relevance",
                            "publication_time",
                            "salary_desc",
                            "salary_asc",
                            "distance"
                        ],
                        "example": "relevance"
                    }
                },
                "type": "object"
            },
            "CreateCategoryRequestV2": {
                "description": "Запрос создания категории резюме",
                "properties": {
                    "name": {
                        "description": "Название категории (max 100 chars)",
                        "type": "string",
                        "maxLength": 100,
                        "example": "Мои избранные резюме"
                    },
                    "color": {
                        "description": "Hex цвет (e.g., #6366F1)",
                        "type": "string",
                        "maxLength": 7,
                        "pattern": "^#[0-9A-Fa-f]{6}$",
                        "example": "#6366F1",
                        "nullable": true
                    },
                    "icon": {
                        "description": "Иконка (e.g., folder, briefcase)",
                        "type": "string",
                        "maxLength": 50,
                        "example": "folder",
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "MoveItemRequestV2": {
                "description": "Запрос перемещения резюме в категорию",
                "properties": {
                    "resume_id": {
                        "description": "ID резюме",
                        "type": "integer",
                        "example": 123
                    },
                    "category_id": {
                        "description": "ID категории (null для удаления из категории)",
                        "type": "integer",
                        "example": 5,
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "ReorderCategoriesRequestV2": {
                "description": "Запрос изменения порядка категорий",
                "properties": {
                    "category_ids": {
                        "description": "Массив ID категорий в новом порядке",
                        "type": "array",
                        "items": {
                            "type": "integer"
                        },
                        "example": [
                            3,
                            1,
                            2,
                            4
                        ]
                    }
                },
                "type": "object"
            },
            "UpdateCategoryRequestV2": {
                "description": "Запрос обновления категории резюме",
                "properties": {
                    "name": {
                        "description": "Название категории",
                        "type": "string",
                        "maxLength": 100,
                        "example": "Обновленное название",
                        "nullable": true
                    },
                    "color": {
                        "description": "Hex цвет",
                        "type": "string",
                        "maxLength": 7,
                        "pattern": "^#[0-9A-Fa-f]{6}$",
                        "example": "#3B82F6",
                        "nullable": true
                    },
                    "icon": {
                        "description": "Иконка",
                        "type": "string",
                        "maxLength": 50,
                        "example": "briefcase",
                        "nullable": true
                    },
                    "sort_order": {
                        "description": "Порядок сортировки",
                        "type": "integer",
                        "minimum": 0,
                        "example": 1,
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "TailorResumeToVacancyRequestV2": {
                "description": "Данные для создания резюме, адаптированного под вакансию",
                "required": [
                    "base_resume_id",
                    "service_code",
                    "external_vacancy_id"
                ],
                "properties": {
                    "base_resume_id": {
                        "description": "ID базового резюме для адаптации",
                        "type": "integer",
                        "example": 42
                    },
                    "service_code": {
                        "description": "Код сервиса вакансии (hh, sj и т.д.)",
                        "type": "string",
                        "maxLength": 50,
                        "example": "hh"
                    },
                    "external_vacancy_id": {
                        "description": "Внешний ID вакансии в сервисе",
                        "type": "string",
                        "maxLength": 255,
                        "example": "12345678"
                    }
                },
                "type": "object"
            },
            "CareerChatResponseV2": {
                "title": "Career Chat Response",
                "description": "Ответ AI карьерного коуча",
                "properties": {
                    "reply": {
                        "description": "Ответ ассистента",
                        "type": "string",
                        "example": "Сфокусируйся на развитии лидерских навыков и возьми 1-2 проекта с межфункциональным взаимодействием."
                    },
                    "message": {
                        "description": "Сообщение о статусе",
                        "type": "string",
                        "example": "Career chat response generated"
                    }
                },
                "type": "object"
            },
            "CareerPathResponseV2": {
                "title": "Career Path Response",
                "description": "Response with career path analysis",
                "properties": {
                    "data": {
                        "$ref": "#/components/schemas/CareerPathDataV2"
                    },
                    "message": {
                        "description": "Response message",
                        "type": "string",
                        "example": "Career path analysis generated"
                    },
                    "cached": {
                        "description": "Whether result was from cache",
                        "type": "boolean",
                        "example": false
                    }
                },
                "type": "object"
            },
            "CareerPathDataV2": {
                "title": "Career Path Data",
                "description": "Career path analysis details",
                "properties": {
                    "resume_id": {
                        "description": "Resume ID",
                        "type": "integer",
                        "example": 42
                    },
                    "industry": {
                        "description": "Detected industry/domain",
                        "type": "string",
                        "example": "Маркетинг"
                    },
                    "current_level": {
                        "description": "Current career level assessment",
                        "type": "string",
                        "example": "Middle"
                    },
                    "ai_impact_assessment": {
                        "$ref": "#/components/schemas/AICareerImpactV2"
                    },
                    "next_steps": {
                        "description": "Possible next career steps",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/CareerStepV2"
                        }
                    },
                    "skill_gaps_for_paths": {
                        "description": "Skill gaps for each path",
                        "type": "object",
                        "additionalProperties": {
                            "type": "array",
                            "items": {
                                "type": "string"
                            }
                        }
                    },
                    "learning_roadmap": {
                        "description": "Learning roadmap",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/LearningStepV2"
                        }
                    },
                    "salary_growth_forecast": {
                        "description": "Salary growth forecast",
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        }
                    },
                    "market_demand": {
                        "description": "Market demand for each path",
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        }
                    },
                    "analyzed_at": {
                        "description": "Analysis timestamp",
                        "type": "string",
                        "format": "date-time",
                        "example": "2026-01-11T12:00:00+00:00"
                    }
                },
                "type": "object"
            },
            "CareerStepV2": {
                "title": "Career Step",
                "description": "Possible career step",
                "properties": {
                    "title": {
                        "description": "Position title",
                        "type": "string",
                        "example": "Senior PHP Developer"
                    },
                    "description": {
                        "description": "Step description",
                        "type": "string",
                        "example": "Переход на позицию старшего разработчика"
                    },
                    "timeframe": {
                        "description": "Expected timeframe",
                        "type": "string",
                        "example": "6-12 месяцев"
                    },
                    "difficulty": {
                        "type": "string",
                        "enum": [
                            "low",
                            "medium",
                            "high"
                        ],
                        "example": "medium"
                    }
                },
                "type": "object"
            },
            "LearningStepV2": {
                "title": "Learning Step",
                "description": "Learning roadmap step",
                "properties": {
                    "skill": {
                        "description": "Skill to learn",
                        "type": "string",
                        "example": "Kubernetes"
                    },
                    "priority": {
                        "type": "string",
                        "enum": [
                            "high",
                            "medium",
                            "low"
                        ],
                        "example": "high"
                    },
                    "timeframe": {
                        "description": "Learning timeframe",
                        "type": "string",
                        "example": "2-3 месяца"
                    },
                    "resources": {
                        "description": "Learning resources",
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    }
                },
                "type": "object"
            },
            "AICareerImpactV2": {
                "title": "AI Impact Assessment",
                "description": "AI impact assessment for the profession",
                "properties": {
                    "risk_level": {
                        "type": "string",
                        "enum": [
                            "low",
                            "medium",
                            "high"
                        ],
                        "example": "medium"
                    },
                    "summary": {
                        "type": "string",
                        "example": "AI изменит рутинные задачи, но усилит спрос на стратегические навыки"
                    },
                    "automation_risks": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "ai_opportunities": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "recommended_actions": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    }
                },
                "type": "object"
            },
            "DeleteResumePhotoResponseV2": {
                "description": "Ответ на запрос удаления фото резюме",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Photo deleted successfully"
                    },
                    "data": {
                        "$ref": "#/components/schemas/ResumeV2"
                    }
                },
                "type": "object"
            },
            "DeleteResumeResponseV2": {
                "description": "Ответ на запрос удаления резюме",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Resume deleted successfully"
                    }
                },
                "type": "object"
            },
            "EnhanceResumeResponseV2": {
                "description": "Ответ на запрос улучшения резюме через AI",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Resume enhanced successfully"
                    },
                    "data": {
                        "$ref": "#/components/schemas/ResumeV2"
                    },
                    "original_resume_id": {
                        "type": "integer",
                        "example": 1
                    },
                    "title_tip": {
                        "description": "Подсказка по заголовку (если заголовок размытый — «Укажите конкретную должность…»)",
                        "type": "string",
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "GenerateAICVResponseV2": {
                "description": "Ответ на запрос генерации AI CV",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "AI CV generated successfully"
                    },
                    "data": {
                        "$ref": "#/components/schemas/ResumeV2"
                    }
                },
                "type": "object"
            },
            "GetResumeResponseV2": {
                "description": "Ответ на запрос деталей резюме",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Resume retrieved successfully"
                    },
                    "data": {
                        "$ref": "#/components/schemas/ResumeV2"
                    }
                },
                "type": "object"
            },
            "ImportResumeFromFileResponseV2": {
                "description": "Ответ на запрос загрузки резюме из файла",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Resume uploaded and parsed successfully"
                    },
                    "data": {
                        "$ref": "#/components/schemas/ResumeV2"
                    }
                },
                "type": "object"
            },
            "ListResumesResponseV2": {
                "description": "Ответ на запрос списка резюме пользователя",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Resumes retrieved successfully"
                    },
                    "data": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/ResumeV2"
                        }
                    }
                },
                "type": "object"
            },
            "RecognizeResumeResponseV2": {
                "description": "Ответ на запрос распознавания резюме через AI",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Resume recognized successfully"
                    },
                    "data": {
                        "$ref": "#/components/schemas/ResumeV2"
                    }
                },
                "type": "object"
            },
            "SalaryBenchmarkResponseV2": {
                "title": "Salary Benchmark Response",
                "description": "Response with salary benchmark analysis",
                "properties": {
                    "data": {
                        "$ref": "#/components/schemas/SalaryBenchmarkDataV2"
                    },
                    "message": {
                        "description": "Response message",
                        "type": "string",
                        "example": "Salary benchmark generated"
                    },
                    "cached": {
                        "description": "Whether result was from cache",
                        "type": "boolean",
                        "example": false
                    }
                },
                "type": "object"
            },
            "SalaryBenchmarkDataV2": {
                "title": "Salary Benchmark Data",
                "description": "Salary benchmark analysis details",
                "properties": {
                    "resume_id": {
                        "description": "Resume ID",
                        "type": "integer",
                        "example": 42
                    },
                    "current_position": {
                        "description": "Current position",
                        "type": "string",
                        "example": "Senior Developer"
                    },
                    "region": {
                        "description": "Region",
                        "type": "string",
                        "example": "Россия/СНГ"
                    },
                    "market_salary_range": {
                        "$ref": "#/components/schemas/MarketSalaryRangeV2"
                    },
                    "current_salary": {
                        "$ref": "#/components/schemas/CurrentSalaryV2"
                    },
                    "comparison": {
                        "$ref": "#/components/schemas/SalaryComparisonV2"
                    },
                    "negotiation_recommendations": {
                        "description": "Recommendations for negotiation",
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "benefits_suggestions": {
                        "description": "Benefits to request besides salary",
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "analyzed_at": {
                        "description": "Analysis timestamp",
                        "type": "string",
                        "format": "date-time",
                        "example": "2026-01-11T12:00:00+00:00"
                    }
                },
                "type": "object"
            },
            "MarketSalaryRangeV2": {
                "title": "Market Salary Range",
                "description": "Market salary range",
                "properties": {
                    "min": {
                        "description": "Minimum salary",
                        "type": "integer",
                        "example": 200000
                    },
                    "max": {
                        "description": "Maximum salary",
                        "type": "integer",
                        "example": 300000
                    },
                    "average": {
                        "description": "Average salary",
                        "type": "integer",
                        "example": 250000
                    },
                    "currency": {
                        "description": "Currency",
                        "type": "string",
                        "example": "RUB"
                    }
                },
                "type": "object"
            },
            "CurrentSalaryV2": {
                "title": "Current Salary",
                "description": "Current salary information",
                "properties": {
                    "amount": {
                        "description": "Salary amount",
                        "type": "integer",
                        "example": 180000
                    },
                    "currency": {
                        "description": "Currency",
                        "type": "string",
                        "example": "RUB"
                    }
                },
                "type": "object"
            },
            "SalaryComparisonV2": {
                "title": "Salary Comparison",
                "description": "Comparison between current salary and market range",
                "properties": {
                    "status": {
                        "type": "string",
                        "enum": [
                            "below_market",
                            "in_range",
                            "above_market"
                        ],
                        "example": "below_market"
                    },
                    "delta_amount": {
                        "description": "Difference amount",
                        "type": "integer",
                        "example": 20000
                    },
                    "delta_percent": {
                        "description": "Difference percent",
                        "type": "string",
                        "example": "+12%"
                    },
                    "comment": {
                        "description": "Comparison comment",
                        "type": "string",
                        "example": "Текущая зарплата ниже рынка"
                    }
                },
                "type": "object"
            },
            "SelectResumeResponseV2": {
                "description": "Ответ на запрос выбора резюме как активного",
                "properties": {
                    "data": {
                        "description": "Empty array (reserved for future use)",
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "example": []
                    }
                },
                "type": "object"
            },
            "SkillsGapResponseV2": {
                "title": "Skills Gap Response",
                "description": "Response with skills gap analysis",
                "properties": {
                    "data": {
                        "$ref": "#/components/schemas/SkillsGapDataV2"
                    },
                    "message": {
                        "description": "Response message",
                        "type": "string",
                        "example": "Skills gap analysis generated"
                    },
                    "cached": {
                        "description": "Whether result was from cache",
                        "type": "boolean",
                        "example": false
                    }
                },
                "type": "object"
            },
            "SkillsGapDataV2": {
                "title": "Skills Gap Data",
                "description": "Skills gap analysis details",
                "properties": {
                    "resume_id": {
                        "description": "Resume ID",
                        "type": "integer",
                        "example": 42
                    },
                    "target_position": {
                        "description": "Target position analyzed",
                        "type": "string",
                        "example": "Senior PHP Developer"
                    },
                    "critical_missing": {
                        "description": "Critical missing skills (must-have)",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/MissingSkillV2"
                        }
                    },
                    "desirable_missing": {
                        "description": "Desirable missing skills (nice-to-have)",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/MissingSkillV2"
                        }
                    },
                    "prioritized_learning": {
                        "description": "Prioritized learning plan",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/PrioritizedSkillV2"
                        }
                    },
                    "time_estimates": {
                        "description": "Time estimates per skill",
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        }
                    },
                    "salary_impact": {
                        "description": "Salary impact per skill",
                        "type": "object",
                        "additionalProperties": {
                            "type": "string"
                        }
                    },
                    "learning_resources": {
                        "description": "Learning resources",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/LearningResourceV2"
                        }
                    },
                    "learning_phases": {
                        "description": "Learning phases",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/LearningPhaseV2"
                        }
                    },
                    "quick_wins": {
                        "description": "Quick wins for 2 weeks",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/QuickWinV2"
                        }
                    },
                    "roi_analysis": {
                        "description": "ROI analysis per skill",
                        "type": "object",
                        "additionalProperties": {
                            "$ref": "#/components/schemas/SkillROIEntryV2"
                        }
                    },
                    "analyzed_at": {
                        "description": "Analysis timestamp",
                        "type": "string",
                        "format": "date-time",
                        "example": "2026-01-11T12:00:00+00:00"
                    }
                },
                "type": "object"
            },
            "MissingSkillV2": {
                "title": "Missing Skill",
                "description": "Missing skill details",
                "properties": {
                    "skill": {
                        "description": "Skill name",
                        "type": "string",
                        "example": "Kubernetes"
                    },
                    "importance": {
                        "type": "string",
                        "enum": [
                            "critical",
                            "high",
                            "medium",
                            "low"
                        ],
                        "example": "critical"
                    },
                    "reason": {
                        "description": "Why this skill is needed",
                        "type": "string",
                        "example": "Требуется в 80% вакансий"
                    }
                },
                "type": "object"
            },
            "PrioritizedSkillV2": {
                "title": "Prioritized Skill",
                "description": "Skill prioritized for learning",
                "properties": {
                    "skill": {
                        "description": "Skill name",
                        "type": "string",
                        "example": "Docker"
                    },
                    "priority": {
                        "description": "Priority rank (1 = highest)",
                        "type": "integer",
                        "example": 1
                    },
                    "impact": {
                        "type": "string",
                        "enum": [
                            "high",
                            "medium",
                            "low"
                        ],
                        "example": "high"
                    },
                    "effort": {
                        "type": "string",
                        "enum": [
                            "high",
                            "medium",
                            "low"
                        ],
                        "example": "medium"
                    },
                    "recommendation": {
                        "description": "Learning recommendation",
                        "type": "string",
                        "example": "Начните с основ контейнеризации"
                    }
                },
                "type": "object"
            },
            "LearningResourceV2": {
                "title": "Learning Resource",
                "description": "Learning resource",
                "properties": {
                    "skill": {
                        "description": "Skill name",
                        "type": "string",
                        "example": "Docker"
                    },
                    "type": {
                        "type": "string",
                        "enum": [
                            "course",
                            "book",
                            "tutorial",
                            "documentation",
                            "standard"
                        ],
                        "example": "course"
                    },
                    "title": {
                        "description": "Resource title",
                        "type": "string",
                        "example": "Docker для разработчиков"
                    },
                    "url": {
                        "description": "Resource URL",
                        "type": "string",
                        "example": "https://example.com/docker-course",
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "LearningPhaseV2": {
                "title": "Learning Phase",
                "description": "Learning phase definition",
                "properties": {
                    "phase": {
                        "type": "string",
                        "enum": [
                            "phase_1",
                            "phase_2"
                        ],
                        "example": "phase_1"
                    },
                    "timeframe": {
                        "type": "string",
                        "example": "1-2 месяца"
                    },
                    "focus": {
                        "type": "string",
                        "example": "Критические навыки для трудоустройства"
                    },
                    "skills": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    }
                },
                "type": "object"
            },
            "QuickWinV2": {
                "title": "Quick Win",
                "description": "Quick win action",
                "properties": {
                    "title": {
                        "type": "string",
                        "example": "Быстрый старт"
                    },
                    "description": {
                        "type": "string",
                        "example": "Освойте базовые SQL-запросы и обновите резюме"
                    },
                    "timeframe": {
                        "type": "string",
                        "example": "2 недели"
                    }
                },
                "type": "object"
            },
            "SkillROIEntryV2": {
                "title": "Skill ROI Entry",
                "description": "ROI metrics for a skill",
                "properties": {
                    "time_to_learn": {
                        "type": "string",
                        "example": "6-8 недель"
                    },
                    "salary_impact": {
                        "type": "string",
                        "example": "+15-20%"
                    },
                    "market_demand": {
                        "type": "string",
                        "example": "35%"
                    },
                    "difficulty": {
                        "type": "string",
                        "enum": [
                            "high",
                            "medium",
                            "low"
                        ],
                        "example": "high"
                    },
                    "roi_score": {
                        "type": "number",
                        "format": "float",
                        "example": 3.8
                    }
                },
                "type": "object"
            },
            "UpdateJobSearchStatusResponseV2": {
                "description": "Ответ на запрос обновления статуса поиска работы",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Job search status updated successfully"
                    },
                    "data": {
                        "$ref": "#/components/schemas/ResumeV2"
                    }
                },
                "type": "object"
            },
            "UpdateResumeResponseV2": {
                "description": "Ответ на запрос обновления резюме",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Resume updated successfully"
                    },
                    "data": {
                        "$ref": "#/components/schemas/ResumeV2"
                    }
                },
                "type": "object"
            },
            "UpdateSortOrderResponseV2": {
                "description": "Ответ на запрос обновления порядка сортировки вакансий",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Sort order updated successfully"
                    },
                    "data": {
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "UploadResumePhotoResponseV2": {
                "description": "Ответ на запрос загрузки фото резюме",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Photo uploaded successfully"
                    },
                    "data": {
                        "$ref": "#/components/schemas/ResumeV2"
                    }
                },
                "type": "object"
            },
            "CreateCategoryResponseV2": {
                "description": "Ответ на запрос создания категории резюме",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешном создании",
                        "type": "string",
                        "example": "Category created successfully"
                    },
                    "data": {
                        "$ref": "#/components/schemas/ResumeCategoryV2"
                    }
                },
                "type": "object"
            },
            "DeleteCategoryResponseV2": {
                "description": "Ответ на запрос удаления категории резюме",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешном удалении",
                        "type": "string",
                        "example": "Category deleted successfully"
                    }
                },
                "type": "object"
            },
            "GetCategoriesWithItemsResponseV2": {
                "description": "Ответ на запрос категорий с резюме для страницы коллекций",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной загрузке",
                        "type": "string",
                        "example": "Categories with items retrieved successfully"
                    },
                    "data": {
                        "description": "Данные категорий и резюме",
                        "properties": {
                            "categories": {
                                "description": "Массив категорий с резюме",
                                "type": "array",
                                "items": {
                                    "allOf": [
                                        {
                                            "$ref": "#/components/schemas/ResumeCategoryV2"
                                        },
                                        {
                                            "properties": {
                                                "items": {
                                                    "description": "Массив резюме в категории",
                                                    "type": "array",
                                                    "items": {
                                                        "type": "object"
                                                    }
                                                }
                                            },
                                            "type": "object"
                                        }
                                    ]
                                }
                            },
                            "uncategorized": {
                                "description": "Массив резюме без категории",
                                "type": "array",
                                "items": {
                                    "type": "object"
                                }
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "ListCategoriesResponseV2": {
                "description": "Ответ на запрос списка категорий резюме",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной загрузке",
                        "type": "string",
                        "example": "Categories retrieved successfully"
                    },
                    "data": {
                        "description": "Массив категорий резюме",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/ResumeCategoryV2"
                        }
                    }
                },
                "type": "object"
            },
            "MoveItemResponseV2": {
                "description": "Ответ на запрос перемещения резюме в категорию",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Item moved successfully"
                    },
                    "data": {
                        "description": "Данные резюме",
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "ReorderCategoriesResponseV2": {
                "description": "Ответ на запрос изменения порядка категорий",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Categories reordered successfully"
                    }
                },
                "type": "object"
            },
            "UpdateCategoryResponseV2": {
                "description": "Ответ на запрос обновления категории резюме",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешном обновлении",
                        "type": "string",
                        "example": "Category updated successfully"
                    },
                    "data": {
                        "$ref": "#/components/schemas/ResumeCategoryV2"
                    }
                },
                "type": "object"
            },
            "ResumeInfoV2": {
                "description": "Базовая информация о резюме",
                "properties": {
                    "id": {
                        "type": "integer",
                        "example": 123
                    },
                    "title": {
                        "type": "string",
                        "example": "Senior PHP Developer",
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "ResumeUpgradeResponseV2": {
                "description": "Информация об улучшении резюме",
                "properties": {
                    "id": {
                        "type": "integer",
                        "example": 1
                    },
                    "status": {
                        "type": "string",
                        "enum": [
                            "draft",
                            "saved",
                            "synced",
                            "failed"
                        ],
                        "example": "draft"
                    },
                    "status_label": {
                        "type": "string",
                        "example": "Черновик"
                    },
                    "resume_id": {
                        "type": "integer",
                        "example": 123
                    },
                    "upgraded_resume_id": {
                        "type": "integer",
                        "example": 124,
                        "nullable": true
                    },
                    "credits_spent": {
                        "type": "integer",
                        "example": 50
                    },
                    "sync_status": {
                        "type": "string",
                        "enum": [
                            "pending",
                            "synced",
                            "failed"
                        ],
                        "example": "synced",
                        "nullable": true
                    },
                    "sync_error": {
                        "type": "string",
                        "nullable": true
                    },
                    "synced_at": {
                        "type": "string",
                        "format": "date-time",
                        "nullable": true
                    },
                    "created_at": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "updated_at": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "resume": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/ResumeInfoV2"
                            }
                        ],
                        "nullable": true
                    },
                    "upgraded_resume": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/ResumeInfoV2"
                            }
                        ],
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "GetUpgradeDetailsResponseV2": {
                "description": "Ответ на запрос деталей улучшения резюме",
                "properties": {
                    "success": {
                        "type": "boolean",
                        "example": true
                    },
                    "message": {
                        "type": "string",
                        "example": "Upgrade details retrieved"
                    },
                    "data": {
                        "$ref": "#/components/schemas/ResumeUpgradeResponseV2"
                    }
                },
                "type": "object"
            },
            "GetUpgradeHistoryResponseV2": {
                "description": "Ответ на запрос истории улучшений резюме",
                "properties": {
                    "success": {
                        "type": "boolean",
                        "example": true
                    },
                    "message": {
                        "type": "string",
                        "example": "Upgrade history retrieved"
                    },
                    "data": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/ResumeUpgradeResponseV2"
                        }
                    },
                    "pagination": {
                        "properties": {
                            "current_page": {
                                "type": "integer",
                                "example": 1
                            },
                            "per_page": {
                                "type": "integer",
                                "example": 15
                            },
                            "total": {
                                "type": "integer",
                                "example": 42
                            },
                            "last_page": {
                                "type": "integer",
                                "example": 3
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "UpgradeResumeResponseV2": {
                "description": "Ответ на запрос улучшения резюме",
                "properties": {
                    "success": {
                        "type": "boolean",
                        "example": true
                    },
                    "message": {
                        "type": "string",
                        "example": "Resume upgrade started"
                    },
                    "data": {
                        "$ref": "#/components/schemas/ResumeUpgradeResponseV2"
                    }
                },
                "type": "object"
            },
            "SavedSearchV2": {
                "description": "Сохраненный поиск вакансий",
                "properties": {
                    "id": {
                        "type": "integer",
                        "example": 1
                    },
                    "name": {
                        "type": "string",
                        "example": "Backend Developer Search"
                    },
                    "source": {
                        "type": "string",
                        "enum": [
                            "local",
                            "hh_synced"
                        ],
                        "example": "local"
                    },
                    "creation_source": {
                        "type": "string",
                        "enum": [
                            "manual",
                            "vacancy_list",
                            "ai_generated"
                        ],
                        "example": "manual"
                    },
                    "category_id": {
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                    },
                    "resume_id": {
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                    },
                    "is_legacy": {
                        "type": "boolean",
                        "example": false
                    },
                    "is_multi_service": {
                        "type": "boolean",
                        "example": true
                    },
                    "is_ai_generated": {
                        "type": "boolean",
                        "example": false
                    },
                    "unified_filters": {
                        "type": "object",
                        "example": {
                            "salary_from": 100000,
                            "experience": "between3And6"
                        },
                        "nullable": true
                    },
                    "color": {
                        "type": "string",
                        "pattern": "^#[0-9A-Fa-f]{6}$",
                        "example": "#6366F1"
                    },
                    "icon": {
                        "type": "string",
                        "example": "fa-search"
                    },
                    "is_active": {
                        "type": "boolean",
                        "example": true
                    },
                    "is_starred": {
                        "type": "boolean",
                        "example": false,
                        "nullable": true
                    },
                    "last_vacancy_count": {
                        "type": "integer",
                        "example": 42,
                        "nullable": true
                    },
                    "total_runs": {
                        "type": "integer",
                        "example": 5,
                        "nullable": true
                    },
                    "last_run_at": {
                        "type": "string",
                        "format": "date-time",
                        "example": "2024-01-15T10:30:00Z",
                        "nullable": true
                    },
                    "sort_order": {
                        "type": "integer",
                        "example": 0,
                        "nullable": true
                    },
                    "category": {
                        "type": "object",
                        "nullable": true
                    },
                    "services": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "results": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "search_urls": {
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    },
                    "created_at": {
                        "type": "string",
                        "format": "date-time",
                        "example": "2024-01-15T10:30:00Z",
                        "nullable": true
                    },
                    "updated_at": {
                        "type": "string",
                        "format": "date-time",
                        "example": "2024-01-15T10:30:00Z",
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "CreateSavedSearchRequestV2": {
                "description": "Запрос создания сохраненного поиска",
                "required": [
                    "name",
                    "service_ids"
                ],
                "properties": {
                    "name": {
                        "type": "string",
                        "maxLength": 255,
                        "example": "Backend Developer Search"
                    },
                    "service_ids": {
                        "type": "array",
                        "items": {
                            "type": "integer"
                        },
                        "example": [
                            1,
                            2,
                            3
                        ]
                    },
                    "unified_filters": {
                        "type": "object",
                        "example": {
                            "salary_from": 100000,
                            "experience": "between3And6"
                        },
                        "nullable": true
                    },
                    "category_id": {
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                    },
                    "color": {
                        "type": "string",
                        "pattern": "^#[0-9A-Fa-f]{6}$",
                        "example": "#6366F1",
                        "nullable": true
                    },
                    "icon": {
                        "type": "string",
                        "maxLength": 50,
                        "example": "fa-search",
                        "nullable": true
                    },
                    "resume_id": {
                        "description": "ID резюме, по которому создан поиск (если применимо)",
                        "type": "integer",
                        "example": 1677,
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "GetFiltersCompatibilityRequestV2": {
                "description": "Запрос получения совместимости фильтров для сервисов",
                "properties": {
                    "service_ids": {
                        "type": "array",
                        "items": {
                            "type": "integer"
                        },
                        "example": [
                            1,
                            2,
                            3
                        ]
                    }
                },
                "type": "object"
            },
            "ListSavedSearchesRequestV2": {
                "description": "Запрос списка сохраненных поисков",
                "properties": {
                    "category_id": {
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                    },
                    "starred": {
                        "type": "boolean",
                        "example": false,
                        "nullable": true
                    },
                    "source": {
                        "type": "string",
                        "enum": [
                            "local",
                            "hh_synced"
                        ],
                        "example": "local",
                        "nullable": true
                    },
                    "resume_id": {
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "PreviewUrlsRequestV2": {
                "description": "Запрос получения предпросмотра URL для поиска",
                "properties": {
                    "service_ids": {
                        "type": "array",
                        "items": {
                            "type": "integer"
                        },
                        "example": [
                            1,
                            2,
                            3
                        ]
                    },
                    "unified_filters": {
                        "type": "object",
                        "example": {
                            "salary_from": 100000,
                            "experience": "between3And6"
                        },
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "ReorderSearchesRequestV2": {
                "description": "Запрос изменения порядка сохраненных поисков",
                "required": [
                    "order"
                ],
                "properties": {
                    "order": {
                        "description": "Массив [search_id => sort_order]",
                        "type": "object",
                        "example": {
                            "1": 0,
                            "2": 1,
                            "3": 2
                        }
                    }
                },
                "type": "object"
            },
            "UpdateSavedSearchRequestV2": {
                "description": "Запрос обновления сохраненного поиска",
                "properties": {
                    "name": {
                        "type": "string",
                        "maxLength": 255,
                        "example": "Backend Developer Search",
                        "nullable": true
                    },
                    "service_ids": {
                        "type": "array",
                        "items": {
                            "type": "integer"
                        },
                        "example": [
                            1,
                            2,
                            3
                        ],
                        "nullable": true
                    },
                    "unified_filters": {
                        "type": "object",
                        "example": {
                            "salary_from": 100000,
                            "experience": "between3And6"
                        },
                        "nullable": true
                    },
                    "category_id": {
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                    },
                    "color": {
                        "type": "string",
                        "pattern": "^#[0-9A-Fa-f]{6}$",
                        "example": "#6366F1",
                        "nullable": true
                    },
                    "icon": {
                        "type": "string",
                        "maxLength": 50,
                        "example": "fa-search",
                        "nullable": true
                    },
                    "is_starred": {
                        "type": "boolean",
                        "example": false,
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "UpdateSavedSearchSortOrderRequestV2": {
                "description": "Запрос обновления порядка сортировки вакансий в поиске",
                "required": [
                    "vacancy_search_order"
                ],
                "properties": {
                    "vacancy_search_order": {
                        "type": "string",
                        "enum": [
                            "relevance",
                            "publication_time",
                            "salary_desc",
                            "salary_asc",
                            "distance"
                        ],
                        "example": "relevance"
                    }
                },
                "type": "object"
            },
            "CreateSavedSearchResponseV2": {
                "description": "Ответ на запрос создания сохраненного поиска",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Поиск успешно сохранён"
                    },
                    "data": {
                        "$ref": "#/components/schemas/SavedSearchV2"
                    }
                },
                "type": "object"
            },
            "DeleteSavedSearchResponseV2": {
                "description": "Ответ на запрос удаления сохраненного поиска",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Поиск успешно удалён"
                    }
                },
                "type": "object"
            },
            "GetFiltersCompatibilityResponseV2": {
                "description": "Ответ на запрос получения совместимости фильтров для сервисов",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Filters compatibility retrieved"
                    },
                    "data": {
                        "description": "Данные совместимости фильтров",
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "GetSavedSearchResponseV2": {
                "description": "Ответ на запрос получения одного сохраненного поиска",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Saved search retrieved"
                    },
                    "data": {
                        "$ref": "#/components/schemas/SavedSearchV2"
                    }
                },
                "type": "object"
            },
            "ListSavedSearchesResponseV2": {
                "description": "Ответ на запрос списка сохраненных поисков",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Saved searches retrieved"
                    },
                    "data": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/SavedSearchV2"
                        }
                    },
                    "meta": {
                        "description": "Метаданные (total, colors, icons, sources)",
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "PreviewUrlsResponseV2": {
                "description": "Ответ на запрос получения предпросмотра URL для поиска",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Preview URLs retrieved"
                    },
                    "data": {
                        "description": "Массив URL для предпросмотра по сервисам",
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    }
                },
                "type": "object"
            },
            "ReorderSearchesResponseV2": {
                "description": "Ответ на запрос изменения порядка сохраненных поисков",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Порядок сохранён"
                    }
                },
                "type": "object"
            },
            "SelectSavedSearchResponseV2": {
                "description": "Ответ на запрос выбора сохраненного поиска как активного",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Поиск выбран как активный"
                    },
                    "data": {
                        "$ref": "#/components/schemas/SavedSearchV2"
                    }
                },
                "type": "object"
            },
            "ToggleStarredResponseV2": {
                "description": "Ответ на запрос переключения избранного статуса поиска",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Добавлено в избранное"
                    },
                    "data": {
                        "$ref": "#/components/schemas/SavedSearchV2"
                    }
                },
                "type": "object"
            },
            "UpdateSavedSearchResponseV2": {
                "description": "Ответ на запрос обновления сохраненного поиска",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Поиск успешно обновлён"
                    },
                    "data": {
                        "$ref": "#/components/schemas/SavedSearchV2"
                    }
                },
                "type": "object"
            },
            "UpdateSavedSearchSortOrderResponseV2": {
                "description": "Ответ на запрос обновления порядка сортировки вакансий в поиске",
                "properties": {
                    "message": {
                        "type": "string",
                        "example": "Порядок сортировки обновлён"
                    },
                    "data": {
                        "$ref": "#/components/schemas/SavedSearchV2"
                    }
                },
                "type": "object"
            },
            "ChangePasswordRequestV2": {
                "description": "Запрос на изменение пароля пользователя",
                "properties": {
                    "current_password": {
                        "description": "Текущий пароль",
                        "type": "string",
                        "example": "oldPassword123"
                    },
                    "new_password": {
                        "description": "Новый пароль",
                        "type": "string",
                        "minLength": 8,
                        "example": "newPassword123"
                    }
                },
                "type": "object"
            },
            "DeleteUserRequestV2": {
                "description": "Запрос удаления пользователя",
                "properties": {
                    "user_id": {
                        "description": "ID пользователя (hashed)",
                        "type": "string",
                        "example": "qmv7dk48x5b690wx"
                    }
                },
                "type": "object"
            },
            "FindUserByIdRequestV2": {
                "description": "Запрос получения пользователя по ID",
                "properties": {
                    "user_id": {
                        "description": "ID пользователя (hashed)",
                        "type": "string",
                        "example": "qmv7dk48x5b690wx"
                    }
                },
                "type": "object"
            },
            "GetDashboardStatsRequestV2": {
                "description": "Запрос получения статистики дашборда"
            },
            "GetProfileRequestV2": {
                "description": "Запрос получения профиля пользователя"
            },
            "GetSearchSettingsRequestV2": {
                "description": "Запрос получения настроек поиска"
            },
            "GetUserProfileRequestV2": {
                "description": "Запрос получения профиля текущего пользователя"
            },
            "ListUsersRequestV2": {
                "description": "Запрос списка пользователей"
            },
            "SaveSearchSettingsRequestV2": {
                "description": "Запрос на сохранение настроек поиска",
                "properties": {
                    "settings": {
                        "description": "Настройки поиска",
                        "properties": {
                            "services": {
                                "type": "array",
                                "items": {
                                    "properties": {
                                        "is_active": {
                                            "type": "boolean"
                                        },
                                        "filters": {
                                            "type": "object"
                                        }
                                    },
                                    "type": "object"
                                }
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "UpdatePasswordRequestV2": {
                "description": "Запрос обновления пароля пользователя",
                "properties": {
                    "current_password": {
                        "description": "Текущий пароль (требуется если у пользователя есть пароль)",
                        "type": "string",
                        "nullable": true
                    },
                    "new_password": {
                        "description": "Новый пароль (минимум 8 символов)",
                        "type": "string",
                        "minLength": 8
                    },
                    "new_password_confirmation": {
                        "description": "Подтверждение нового пароля",
                        "type": "string"
                    }
                },
                "type": "object"
            },
            "UpdateProfileRequestV2": {
                "description": "Запрос на обновление профиля пользователя",
                "properties": {
                    "name": {
                        "description": "Имя пользователя",
                        "type": "string",
                        "maxLength": 255,
                        "example": "Иван Иванов",
                        "nullable": true
                    },
                    "email": {
                        "description": "Email пользователя",
                        "type": "string",
                        "format": "email",
                        "maxLength": 255,
                        "example": "user@example.com",
                        "nullable": true
                    },
                    "gender": {
                        "description": "Пол пользователя",
                        "type": "string",
                        "enum": [
                            "male",
                            "female",
                            "other"
                        ],
                        "example": "male",
                        "nullable": true
                    },
                    "birth": {
                        "description": "Дата рождения",
                        "type": "string",
                        "format": "date",
                        "example": "1990-01-01",
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "UpdateUserRequestV2": {
                "description": "Запрос обновления пользователя",
                "properties": {
                    "name": {
                        "description": "Имя пользователя",
                        "type": "string",
                        "maxLength": 50,
                        "minLength": 2,
                        "example": "Иван Петров",
                        "nullable": true
                    },
                    "gender": {
                        "description": "Пол",
                        "type": "string",
                        "enum": [
                            "male",
                            "female",
                            "other"
                        ],
                        "example": "male",
                        "nullable": true
                    },
                    "birth": {
                        "description": "Дата рождения",
                        "type": "string",
                        "format": "date",
                        "example": "1990-01-15",
                        "nullable": true
                    },
                    "current_password": {
                        "description": "Текущий пароль (требуется при изменении пароля)",
                        "type": "string",
                        "nullable": true
                    },
                    "new_password": {
                        "description": "Новый пароль (минимум 8 символов)",
                        "type": "string",
                        "minLength": 8,
                        "nullable": true
                    },
                    "new_password_confirmation": {
                        "description": "Подтверждение нового пароля",
                        "type": "string",
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "ChangePasswordResponseV2": {
                "description": "Ответ на запрос изменения пароля",
                "properties": {
                    "message": {
                        "description": "Сообщение об успехе",
                        "type": "string",
                        "example": "Password changed successfully"
                    }
                },
                "type": "object"
            },
            "DeleteUserResponseV2": {
                "description": "Ответ на запрос удаления пользователя",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешном удалении",
                        "type": "string",
                        "example": "User deleted successfully"
                    }
                },
                "type": "object"
            },
            "FindUserByIdResponseV2": {
                "description": "Ответ на запрос получения пользователя по ID",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной загрузке",
                        "type": "string",
                        "example": "User retrieved"
                    },
                    "data": {
                        "description": "Данные пользователя",
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "GetDashboardStatsResponseV2": {
                "description": "Ответ на запрос статистики дашборда",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной загрузке",
                        "type": "string",
                        "example": "Dashboard stats retrieved"
                    },
                    "data": {
                        "description": "Статистика дашборда",
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "GetProfileResponseV2": {
                "description": "Ответ на запрос профиля пользователя",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной загрузке",
                        "type": "string",
                        "example": "Profile retrieved"
                    },
                    "data": {
                        "description": "Данные профиля пользователя",
                        "properties": {
                            "id": {
                                "description": "Хешированный ID пользователя",
                                "type": "string",
                                "example": "qmv7dk48x5b690wx"
                            },
                            "name": {
                                "description": "Имя пользователя",
                                "type": "string",
                                "example": "Иван Иванов"
                            },
                            "email": {
                                "description": "Email пользователя",
                                "type": "string",
                                "format": "email",
                                "example": "user@example.com"
                            },
                            "gender": {
                                "description": "Пол пользователя",
                                "type": "string",
                                "enum": [
                                    "male",
                                    "female",
                                    "unspecified"
                                ],
                                "example": "male",
                                "nullable": true
                            },
                            "birth": {
                                "description": "Дата рождения",
                                "type": "string",
                                "format": "date",
                                "example": "1990-01-01",
                                "nullable": true
                            },
                            "credits": {
                                "description": "Информация о кредитах",
                                "properties": {
                                    "balance": {
                                        "description": "Текущий баланс",
                                        "type": "integer",
                                        "example": 100
                                    },
                                    "lifetime_earned": {
                                        "description": "Всего заработано",
                                        "type": "integer",
                                        "example": 500
                                    },
                                    "lifetime_spent": {
                                        "description": "Всего потрачено",
                                        "type": "integer",
                                        "example": 400
                                    }
                                },
                                "type": "object"
                            },
                            "premium_until": {
                                "description": "Дата окончания премиум-подписки (Y-m-d)",
                                "type": "string",
                                "format": "date",
                                "example": "2026-03-10",
                                "nullable": true
                            },
                            "is_premium": {
                                "description": "Активна ли премиум-подписка (0 CR на сайте и в расширении)",
                                "type": "boolean",
                                "example": true
                            },
                            "premium_all_until": {
                                "description": "Дата окончания премиум «всё» (0 CR везде)",
                                "type": "string",
                                "format": "date",
                                "example": "2026-03-10",
                                "nullable": true
                            },
                            "is_premium_all": {
                                "description": "Активна ли премиум «всё» (0 CR на сайте, в расширении и в десктопе)",
                                "type": "boolean",
                                "example": false
                            },
                            "created_at": {
                                "description": "Дата создания",
                                "type": "string",
                                "format": "date-time",
                                "example": "2023-04-07T11:51:26.000000Z"
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "GetSearchSettingsResponseV2": {
                "description": "Ответ на запрос настроек поиска",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной загрузке",
                        "type": "string",
                        "example": "Search settings retrieved"
                    },
                    "data": {
                        "description": "Данные настроек поиска",
                        "properties": {
                            "settings": {
                                "description": "Настройки поиска",
                                "type": "object"
                            },
                            "updated_at": {
                                "description": "Дата обновления",
                                "type": "string",
                                "format": "date-time",
                                "nullable": true
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "GetUserProfileResponseV2": {
                "description": "Ответ на запрос получения профиля текущего пользователя",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной загрузке",
                        "type": "string",
                        "example": "User profile retrieved"
                    },
                    "data": {
                        "description": "Данные пользователя",
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "ListUsersResponseV2": {
                "description": "Ответ на запрос списка пользователей",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной загрузке",
                        "type": "string",
                        "example": "Users retrieved"
                    },
                    "data": {
                        "description": "Список пользователей",
                        "type": "array",
                        "items": {
                            "type": "object"
                        }
                    }
                },
                "type": "object"
            },
            "SaveSearchSettingsResponseV2": {
                "description": "Ответ на запрос сохранения настроек поиска",
                "properties": {
                    "message": {
                        "description": "Сообщение об успехе",
                        "type": "string",
                        "example": "Settings saved"
                    },
                    "data": {
                        "description": "Данные сохраненных настроек",
                        "properties": {
                            "settings": {
                                "description": "Сохраненные настройки",
                                "type": "object"
                            },
                            "updated_at": {
                                "description": "Дата обновления",
                                "type": "string",
                                "format": "date-time"
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "UpdatePasswordResponseV2": {
                "description": "Ответ на запрос обновления пароля пользователя",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешном обновлении пароля",
                        "type": "string",
                        "example": "Password updated successfully"
                    },
                    "data": {
                        "description": "Данные пользователя",
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "UpdateProfileResponseV2": {
                "description": "Ответ на запрос обновления профиля пользователя",
                "properties": {
                    "message": {
                        "description": "Сообщение об успехе",
                        "type": "string",
                        "example": "Profile updated successfully"
                    },
                    "data": {
                        "description": "Обновленные данные пользователя",
                        "properties": {
                            "id": {
                                "description": "Хешированный ID",
                                "type": "string",
                                "example": "qmv7dk48x5b690wx"
                            },
                            "name": {
                                "type": "string",
                                "example": "Иван Иванов"
                            },
                            "email": {
                                "type": "string",
                                "format": "email",
                                "example": "user@example.com"
                            },
                            "gender": {
                                "type": "string",
                                "example": "male",
                                "nullable": true
                            },
                            "birth": {
                                "type": "string",
                                "format": "date",
                                "example": "1990-01-01",
                                "nullable": true
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "UpdateUserResponseV2": {
                "description": "Ответ на запрос обновления пользователя",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешном обновлении",
                        "type": "string",
                        "example": "User updated successfully"
                    },
                    "data": {
                        "description": "Данные обновленного пользователя",
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "MatchComponentEducationV2": {
                "description": "Компонент «Образование» в прозрачной раскладке match_score (V2).",
                "required": [
                    "score",
                    "weight",
                    "match_type",
                    "explanation"
                ],
                "properties": {
                    "score": {
                        "type": "integer",
                        "maximum": 100,
                        "minimum": 0,
                        "example": 10
                    },
                    "weight": {
                        "type": "integer",
                        "maximum": 100,
                        "minimum": 0,
                        "example": 10
                    },
                    "match_type": {
                        "type": "string",
                        "enum": [
                            "exact",
                            "related",
                            "missing",
                            "unknown"
                        ],
                        "example": "related"
                    },
                    "explanation": {
                        "type": "string",
                        "example": "Специальность смежная с требуемой"
                    }
                },
                "type": "object"
            },
            "MatchComponentExperienceV2": {
                "description": "Компонент «Опыт работы» в прозрачной раскладке match_score (V2).",
                "required": [
                    "score",
                    "weight",
                    "delta_years",
                    "explanation"
                ],
                "properties": {
                    "score": {
                        "type": "integer",
                        "maximum": 100,
                        "minimum": 0,
                        "example": 15
                    },
                    "weight": {
                        "type": "integer",
                        "maximum": 100,
                        "minimum": 0,
                        "example": 20
                    },
                    "delta_years": {
                        "description": "Разница в годах (+ — больше, − — меньше)",
                        "type": "integer",
                        "example": -1
                    },
                    "explanation": {
                        "type": "string",
                        "example": "Требуют 5 лет, есть 4"
                    }
                },
                "type": "object"
            },
            "MatchComponentLocationV2": {
                "description": "Компонент «Регион» в прозрачной раскладке match_score (V2).",
                "required": [
                    "score",
                    "weight",
                    "match_type",
                    "explanation"
                ],
                "properties": {
                    "score": {
                        "type": "integer",
                        "maximum": 100,
                        "minimum": 0,
                        "example": 10
                    },
                    "weight": {
                        "type": "integer",
                        "maximum": 100,
                        "minimum": 0,
                        "example": 10
                    },
                    "match_type": {
                        "type": "string",
                        "enum": [
                            "remote",
                            "city",
                            "region",
                            "mismatch",
                            "unknown"
                        ],
                        "example": "remote"
                    },
                    "explanation": {
                        "type": "string",
                        "example": "Удалёнка подходит"
                    }
                },
                "type": "object"
            },
            "MatchComponentSalaryV2": {
                "description": "Компонент «Зарплата» в прозрачной раскладке match_score (V2).",
                "required": [
                    "score",
                    "weight",
                    "explanation"
                ],
                "properties": {
                    "score": {
                        "type": "integer",
                        "maximum": 100,
                        "minimum": 0,
                        "example": 5
                    },
                    "weight": {
                        "type": "integer",
                        "maximum": 100,
                        "minimum": 0,
                        "example": 10
                    },
                    "candidate_min": {
                        "description": "Минимальные ожидания кандидата (RUB)",
                        "type": "integer",
                        "example": 200000,
                        "nullable": true
                    },
                    "vacancy_range": {
                        "description": "Диапазон зарплаты в вакансии [from, to] (RUB)",
                        "type": "array",
                        "items": {
                            "type": "integer"
                        },
                        "example": [
                            180000,
                            250000
                        ],
                        "nullable": true
                    },
                    "explanation": {
                        "type": "string",
                        "example": "Ожидания в диапазоне вакансии"
                    }
                },
                "type": "object"
            },
            "MatchComponentSkillsV2": {
                "description": "Компонент «Навыки» в прозрачной раскладке match_score (V2).",
                "required": [
                    "score",
                    "weight",
                    "matched",
                    "missing_critical",
                    "missing_nice",
                    "explanation"
                ],
                "properties": {
                    "score": {
                        "type": "integer",
                        "maximum": 100,
                        "minimum": 0,
                        "example": 35
                    },
                    "weight": {
                        "type": "integer",
                        "maximum": 100,
                        "minimum": 0,
                        "example": 50
                    },
                    "matched": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "example": [
                            "Python",
                            "SQL"
                        ]
                    },
                    "missing_critical": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "example": [
                            "Kubernetes"
                        ]
                    },
                    "missing_nice": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "example": [
                            "Docker Compose"
                        ]
                    },
                    "explanation": {
                        "type": "string",
                        "example": "5 из 7 ключевых навыков совпадают"
                    }
                },
                "type": "object"
            },
            "MatchComponentsV2": {
                "description": "Прозрачная раскладка match_score по 5 компонентам (skills, experience, location, salary, education).",
                "required": [
                    "skills",
                    "experience",
                    "location",
                    "salary",
                    "education"
                ],
                "properties": {
                    "skills": {
                        "$ref": "#/components/schemas/MatchComponentSkillsV2"
                    },
                    "experience": {
                        "$ref": "#/components/schemas/MatchComponentExperienceV2"
                    },
                    "location": {
                        "$ref": "#/components/schemas/MatchComponentLocationV2"
                    },
                    "salary": {
                        "$ref": "#/components/schemas/MatchComponentSalaryV2"
                    },
                    "education": {
                        "$ref": "#/components/schemas/MatchComponentEducationV2"
                    }
                },
                "type": "object"
            },
            "MatchDataV2": {
                "description": "Результаты анализа соответствия резюме вакансии с прозрачной раскладкой по 5 компонентам",
                "required": [
                    "match_score",
                    "total_score",
                    "matching_skills",
                    "missing_requirements",
                    "recommendation",
                    "explanation",
                    "components"
                ],
                "properties": {
                    "vacancy_id": {
                        "type": "integer",
                        "example": 18348
                    },
                    "match_score": {
                        "description": "Общая оценка соответствия. Равна сумме components.*.score.",
                        "type": "number",
                        "format": "float",
                        "maximum": 100,
                        "minimum": 0,
                        "example": 65
                    },
                    "total_score": {
                        "description": "Алиас для match_score",
                        "type": "number",
                        "format": "float",
                        "maximum": 100,
                        "minimum": 0,
                        "example": 65
                    },
                    "matching_skills": {
                        "description": "Совпавшие навыки (дубликат components.skills.matched)",
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "example": [
                            "Python",
                            "SQL"
                        ]
                    },
                    "missing_requirements": {
                        "description": "Недостающие требования (дубликат components.skills.missing_critical)",
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "example": [
                            "Kubernetes"
                        ]
                    },
                    "recommendation": {
                        "type": "string",
                        "enum": [
                            "respond",
                            "consider",
                            "skip"
                        ],
                        "example": "consider"
                    },
                    "explanation": {
                        "description": "Краткое объяснение общей оценки",
                        "type": "string",
                        "example": "Сильный backend-стек, но не хватает Kubernetes."
                    },
                    "components": {
                        "$ref": "#/components/schemas/MatchComponentsV2"
                    },
                    "_is_provider_stub": {
                        "description": "Признак деградированного ответа AI-провайдера",
                        "type": "boolean",
                        "example": false,
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "VacancyCardListV2": {
                "description": "Список карточек вакансий с пагинацией",
                "properties": {
                    "data": {
                        "description": "Массив карточек вакансий",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/VacancyCardV2"
                        }
                    },
                    "pagination": {
                        "description": "Метаданные пагинации",
                        "properties": {
                            "current_page": {
                                "description": "Текущая страница",
                                "type": "integer",
                                "example": 1
                            },
                            "per_page": {
                                "description": "Элементов на странице",
                                "type": "integer",
                                "example": 15
                            },
                            "total": {
                                "description": "Общее количество записей",
                                "type": "integer",
                                "example": 100
                            },
                            "last_page": {
                                "description": "Номер последней страницы",
                                "type": "integer",
                                "example": 7
                            },
                            "from": {
                                "description": "Номер первой записи на странице",
                                "type": "integer",
                                "example": 1,
                                "nullable": true
                            },
                            "to": {
                                "description": "Номер последней записи на странице",
                                "type": "integer",
                                "example": 15,
                                "nullable": true
                            },
                            "has_more": {
                                "description": "Есть ли еще страницы",
                                "type": "boolean",
                                "example": true
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "VacancyCardV2": {
                "description": "Карточка вакансии с объединенными данными и флагами наличия",
                "properties": {
                    "service_code": {
                        "description": "Код сервиса (hh, sj, trudvsem, zarplata, telegram, vk_max)",
                        "type": "string",
                        "enum": [
                            "hh",
                            "sj",
                            "trudvsem",
                            "zarplata",
                            "telegram",
                            "vk_max"
                        ],
                        "example": "hh"
                    },
                    "external_vacancy_id": {
                        "description": "ID вакансии во внешнем сервисе (не пустая строка, макс. 255 символов)",
                        "type": "string",
                        "maxLength": 255,
                        "minLength": 1,
                        "example": "123456"
                    },
                    "has_data": {
                        "description": "Флаг наличия данных вакансии (true если есть запись в vacancy_data)",
                        "type": "boolean",
                        "example": true
                    },
                    "has_history": {
                        "description": "Флаг наличия истории анализа (true если есть запись в vacancy_history)",
                        "type": "boolean",
                        "example": true
                    },
                    "has_letter": {
                        "description": "Флаг наличия сопроводительного письма (true если есть запись в cover_letters)",
                        "type": "boolean",
                        "example": false
                    },
                    "is_hot": {
                        "description": "Вакансия «горячая» (опубликована ≤3 дней и высокий match score)",
                        "type": "boolean",
                        "example": false
                    },
                    "published_label": {
                        "description": "Подпись даты публикации (например «Опубликована сегодня», «Опубликована вчера»)",
                        "type": "string",
                        "example": "Опубликована сегодня",
                        "nullable": true
                    },
                    "ranking_reasons": {
                        "description": "Причины ранжирования («почему эта вакансия вверху»)",
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "example": [
                            "Высокий match по заголовку",
                            "Опубликована недавно"
                        ]
                    },
                    "stale_days": {
                        "description": "Дней с публикации (если много — вакансия давно не обновлялась)",
                        "type": "integer",
                        "example": 45,
                        "nullable": true
                    },
                    "stale_warning": {
                        "description": "Предупреждение о давно не обновлявшейся вакансии",
                        "type": "string",
                        "example": "Вакансия давно не обновлялась (45 дн.) — возможно, закрыта",
                        "nullable": true
                    },
                    "why_good_for_you": {
                        "description": "Почему вакансия вам подходит",
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "example": [
                            "Опубликована недавно"
                        ]
                    },
                    "why_you_fit": {
                        "description": "Почему вы подходите работодателю",
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "example": [
                            "Совпадение по навыкам"
                        ]
                    },
                    "possible_duplicate_of": {
                        "description": "ID «основной» вакансии во внешнем сервисе, если эта карточка — дубликат (тот же работодатель + то же название)",
                        "type": "string",
                        "example": null,
                        "nullable": true
                    },
                    "data": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/VacancyDataV2"
                            }
                        ],
                        "nullable": true,
                        "description": "Данные вакансии с внешнего сервиса"
                    },
                    "history": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/VacancyHistoryV2"
                            }
                        ],
                        "nullable": true,
                        "description": "История анализа вакансии"
                    },
                    "letter": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/CoverLetterV2"
                            }
                        ],
                        "nullable": true,
                        "description": "Сопроводительное письмо"
                    },
                    "tailored_resumes": {
                        "description": "Резюме, сгенерированные под эту вакансию (id, title)",
                        "type": "array",
                        "items": {
                            "properties": {
                                "id": {
                                    "description": "ID резюме",
                                    "type": "integer",
                                    "example": 1
                                },
                                "title": {
                                    "description": "Название резюме",
                                    "type": "string",
                                    "example": "Senior Developer",
                                    "nullable": true
                                }
                            },
                            "type": "object"
                        },
                        "example": []
                    }
                },
                "type": "object"
            },
            "VacancyDataV2": {
                "description": "Данные вакансии, полученные с внешнего сервиса",
                "properties": {
                    "service_code": {
                        "description": "Код сервиса (hh, sj, trudvsem, zarplata, telegram, vk_max)",
                        "type": "string",
                        "enum": [
                            "hh",
                            "sj",
                            "trudvsem",
                            "zarplata",
                            "telegram",
                            "vk_max"
                        ],
                        "example": "hh"
                    },
                    "external_vacancy_id": {
                        "description": "ID вакансии во внешнем сервисе (не пустая строка, макс. 255 символов)",
                        "type": "string",
                        "maxLength": 255,
                        "minLength": 1,
                        "example": "123456"
                    },
                    "is_active": {
                        "description": "Признак, что вакансия активна на сервисе",
                        "type": "boolean",
                        "example": true
                    },
                    "title": {
                        "type": "string",
                        "example": "Senior PHP Developer",
                        "nullable": true
                    },
                    "company_name": {
                        "type": "string",
                        "example": "ООО Рога и Копыта",
                        "nullable": true
                    },
                    "company_logo_url": {
                        "description": "URL логотипа компании (из работодателя, например HH logo_urls.90)",
                        "type": "string",
                        "example": "https://hh.ru/employer-logo/123.png",
                        "nullable": true
                    },
                    "salary": {
                        "description": "Информация о зарплате",
                        "type": "object",
                        "example": {
                            "from": 150000,
                            "to": 250000,
                            "currency": "RUB"
                        },
                        "nullable": true
                    },
                    "description": {
                        "description": "Описание вакансии",
                        "type": "string",
                        "example": "Мы ищем опытного PHP-разработчика...",
                        "nullable": true
                    },
                    "url": {
                        "description": "Ссылка на вакансию",
                        "type": "string",
                        "example": "https://example.com/vacancy/123",
                        "nullable": true
                    },
                    "area": {
                        "description": "Регион размещения вакансии",
                        "type": "object",
                        "nullable": true
                    },
                    "address": {
                        "description": "Адрес (город, улица, метро — когда есть в источнике)",
                        "type": "string",
                        "example": "Москва, ул. Ленина, 1, м. Охотный ряд",
                        "nullable": true
                    },
                    "experience": {
                        "description": "Требуемый опыт",
                        "type": "object",
                        "nullable": true
                    },
                    "employment": {
                        "description": "Тип занятости",
                        "type": "object",
                        "nullable": true
                    },
                    "schedule": {
                        "description": "График работы",
                        "type": "object",
                        "nullable": true
                    },
                    "key_skills": {
                        "description": "Ключевые навыки",
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "nullable": true
                    },
                    "enrichment_status": {
                        "description": "Статус обогащения (null=не начато, pending=в очереди, processing=выполняется, completed=готово, failed=ошибка)",
                        "type": "string",
                        "enum": [
                            "pending",
                            "processing",
                            "completed",
                            "failed"
                        ],
                        "example": "failed",
                        "nullable": true
                    },
                    "is_enriched": {
                        "description": "Флаг успешного обогащения (полное описание загружено)",
                        "type": "boolean",
                        "example": false
                    },
                    "can_be_analyzed": {
                        "description": "Флаг возможности AI анализа",
                        "type": "boolean",
                        "example": false
                    },
                    "reason_code": {
                        "description": "Машиночитаемый код причины недоступности обогащения/анализа",
                        "type": "string",
                        "example": "hh_api_forbidden",
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "VacancyHistoryV2": {
                "description": "История анализа вакансии для конкретного резюме",
                "properties": {
                    "id": {
                        "type": "integer",
                        "example": 101
                    },
                    "user_id": {
                        "type": "integer",
                        "example": 1
                    },
                    "resume_id": {
                        "type": "integer",
                        "example": 7
                    },
                    "vacancy_id": {
                        "type": "integer",
                        "example": 18348,
                        "nullable": true
                    },
                    "external_vacancy_id": {
                        "description": "ID вакансии во внешнем сервисе (не пустая строка, макс. 255 символов)",
                        "type": "string",
                        "maxLength": 255,
                        "minLength": 1,
                        "example": "EXT-123456"
                    },
                    "match_data": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/MatchDataV2"
                            }
                        ],
                        "nullable": true,
                        "description": "Данные соответствия вакансии и резюме",
                        "type": "object"
                    },
                    "cover_letter": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/CoverLetterV2"
                            }
                        ],
                        "nullable": true,
                        "description": "Сопроводительное письмо, связанное с анализом",
                        "type": "object"
                    },
                    "created_at": {
                        "type": "string",
                        "example": "2025-01-15T10:30:00Z"
                    },
                    "updated_at": {
                        "type": "string",
                        "example": "2025-01-16T11:00:00Z"
                    }
                },
                "type": "object"
            },
            "AnalyzeAllRequestV2": {
                "description": "Запрос массового анализа вакансий через AI",
                "properties": {
                    "vacancies": {
                        "description": "Массив вакансий для анализа",
                        "type": "array",
                        "items": {
                            "properties": {
                                "service_code": {
                                    "type": "string",
                                    "enum": [
                                        "hh",
                                        "sj",
                                        "zarplata",
                                        "trudvsem",
                                        "rabota",
                                        "yandex",
                                        "linkedin",
                                        "telegram",
                                        "vk_max"
                                    ],
                                    "example": "hh"
                                },
                                "external_vacancy_id": {
                                    "type": "string",
                                    "example": "12345678"
                                }
                            },
                            "type": "object"
                        },
                        "example": [
                            {
                                "service_code": "hh",
                                "external_vacancy_id": "12345678"
                            },
                            {
                                "service_code": "hh",
                                "external_vacancy_id": "87654321"
                            }
                        ]
                    },
                    "resume_id": {
                        "description": "ID резюме (опционально, если не указан - используется активное резюме)",
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "AnalyzeVacancyRequestV2": {
                "description": "Запрос анализа вакансии через AI",
                "properties": {
                    "service_code": {
                        "description": "Код сервиса работы",
                        "type": "string",
                        "enum": [
                            "hh",
                            "sj",
                            "zarplata",
                            "trudvsem",
                            "rabota",
                            "yandex",
                            "linkedin",
                            "telegram",
                            "vk_max"
                        ],
                        "example": "hh"
                    },
                    "external_vacancy_id": {
                        "description": "Внешний идентификатор вакансии",
                        "type": "string",
                        "example": "12345678"
                    },
                    "resume_id": {
                        "description": "ID резюме (опционально, если не указан - используется активное резюме)",
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "GenerateLetterRequestV2": {
                "description": "Запрос генерации сопроводительного письма",
                "properties": {
                    "service_code": {
                        "description": "Код сервиса работы",
                        "type": "string",
                        "enum": [
                            "hh",
                            "sj",
                            "zarplata",
                            "trudvsem",
                            "rabota",
                            "yandex",
                            "linkedin",
                            "telegram",
                            "vk_max"
                        ],
                        "example": "hh"
                    },
                    "external_vacancy_id": {
                        "description": "Внешний идентификатор вакансии",
                        "type": "string",
                        "example": "12345678"
                    },
                    "resume_id": {
                        "description": "ID резюме (опционально, если не указан - используется активное резюме)",
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "StartAnalyzeSessionRequestV2": {
                "description": "Запрос запуска асинхронной сессии анализа вакансий",
                "properties": {
                    "vacancies": {
                        "description": "Массив вакансий для анализа",
                        "type": "array",
                        "items": {
                            "properties": {
                                "service_code": {
                                    "type": "string",
                                    "enum": [
                                        "hh",
                                        "sj",
                                        "zarplata",
                                        "trudvsem",
                                        "rabota",
                                        "yandex",
                                        "linkedin",
                                        "telegram",
                                        "vk_max"
                                    ],
                                    "example": "hh"
                                },
                                "external_vacancy_id": {
                                    "type": "string",
                                    "example": "12345678"
                                }
                            },
                            "type": "object"
                        },
                        "example": [
                            {
                                "service_code": "hh",
                                "external_vacancy_id": "12345678"
                            },
                            {
                                "service_code": "hh",
                                "external_vacancy_id": "87654321"
                            }
                        ]
                    },
                    "resume_id": {
                        "description": "ID резюме (опционально, если не указан - используется активное резюме)",
                        "type": "integer",
                        "example": 1,
                        "nullable": true
                    },
                    "saved_search_id": {
                        "description": "ID сохраненного поиска (опционально)",
                        "type": "integer",
                        "example": 10,
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "GetUrlRequestV2": {
                "description": "Запрос генерации URL из фильтров",
                "properties": {
                    "service_ids": {
                        "description": "ID сервисов для генерации URL",
                        "type": "array",
                        "items": {
                            "type": "integer"
                        },
                        "example": [
                            1,
                            2
                        ]
                    },
                    "query": {
                        "description": "Текстовый запрос",
                        "type": "string",
                        "example": "php",
                        "nullable": true
                    },
                    "unified_filters": {
                        "description": "Унифицированные фильтры",
                        "type": "object",
                        "example": {
                            "area": [
                                1
                            ],
                            "salary": {
                                "from": 100000
                            }
                        }
                    }
                },
                "type": "object"
            },
            "ParseUrlRequestV2": {
                "description": "Запрос парсинга URL поиска в фильтры",
                "properties": {
                    "url": {
                        "description": "URL поиска вакансий",
                        "type": "string",
                        "example": "https://hh.ru/search/vacancy?text=php&area=1"
                    }
                },
                "type": "object"
            },
            "SearchByQueryRequestV2": {
                "description": "Запрос поиска вакансий по текстовому запросу (Elasticsearch)",
                "required": [
                    "query"
                ],
                "properties": {
                    "query": {
                        "description": "Текстовый запрос для поиска",
                        "type": "string",
                        "maxLength": 500,
                        "minLength": 2,
                        "example": "Python разработчик Москва"
                    },
                    "filters": {
                        "description": "Дополнительные фильтры",
                        "properties": {
                            "area": {
                                "description": "Регион",
                                "type": "string"
                            },
                            "salary_from": {
                                "description": "Минимальная зарплата",
                                "type": "integer"
                            },
                            "salary_to": {
                                "description": "Максимальная зарплата",
                                "type": "integer"
                            },
                            "employment_type": {
                                "description": "Тип занятости",
                                "type": "string"
                            },
                            "schedule": {
                                "description": "График работы",
                                "type": "string"
                            }
                        },
                        "type": "object"
                    },
                    "size": {
                        "description": "Количество результатов",
                        "type": "integer",
                        "default": 50
                    },
                    "from": {
                        "description": "Смещение для пагинации",
                        "type": "integer",
                        "default": 0
                    }
                },
                "type": "object"
            },
            "SearchByResumeRequestV2": {
                "description": "Тело запроса поиска вакансий по резюме (Elasticsearch)",
                "properties": {
                    "filters": {
                        "description": "Дополнительные фильтры",
                        "type": "object"
                    },
                    "size": {
                        "description": "Количество результатов",
                        "type": "integer",
                        "default": 50
                    },
                    "from": {
                        "description": "Смещение для пагинации",
                        "type": "integer",
                        "default": 0
                    },
                    "include_applied": {
                        "description": "Включить вакансии, на которые уже откликнулись",
                        "type": "boolean",
                        "default": false
                    },
                    "include_hidden": {
                        "description": "Включить скрытые вакансии",
                        "type": "boolean",
                        "default": false
                    },
                    "sort_order": {
                        "description": "Сортировка",
                        "type": "string",
                        "default": "relevance",
                        "enum": [
                            "relevance",
                            "publication_time"
                        ]
                    },
                    "exclude_stale": {
                        "description": "Исключить давно не обновлявшиеся вакансии",
                        "type": "boolean",
                        "default": false
                    }
                },
                "type": "object"
            },
            "SearchRequestV2": {
                "description": "Запрос поиска вакансий по URL или сохранённому поиску",
                "properties": {
                    "url": {
                        "description": "URL поиска (опционально, если указан saved_search_id)",
                        "type": "string",
                        "example": "https://hh.ru/search/vacancy?text=php",
                        "nullable": true
                    },
                    "saved_search_id": {
                        "description": "ID сохранённого поиска (опционально, если указан url)",
                        "type": "integer",
                        "example": 123,
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "FetchAllVacanciesRequestV2": {
                "description": "Запрос получения данных нескольких вакансий из сервисов работы",
                "properties": {
                    "vacancies": {
                        "description": "Массив объектов с данными вакансий для получения",
                        "type": "array",
                        "items": {
                            "properties": {
                                "service_code": {
                                    "description": "Код сервиса работы",
                                    "type": "string",
                                    "enum": [
                                        "hh",
                                        "sj",
                                        "zarplata",
                                        "trudvsem",
                                        "rabota",
                                        "yandex",
                                        "linkedin",
                                        "telegram",
                                        "vk_max"
                                    ],
                                    "example": "hh"
                                },
                                "external_vacancy_id": {
                                    "description": "Внешний ID вакансии из сервиса",
                                    "type": "string",
                                    "maxLength": 255,
                                    "minLength": 1,
                                    "example": "123456"
                                }
                            },
                            "type": "object"
                        },
                        "minItems": 1
                    }
                },
                "type": "object"
            },
            "FetchVacancyRequestV2": {
                "description": "Запрос получения данных вакансии из сервиса работы",
                "properties": {
                    "service_code": {
                        "description": "Код сервиса работы",
                        "type": "string",
                        "enum": [
                            "hh",
                            "sj",
                            "zarplata",
                            "trudvsem",
                            "rabota",
                            "yandex",
                            "linkedin",
                            "telegram",
                            "vk_max"
                        ],
                        "example": "hh"
                    },
                    "external_vacancy_id": {
                        "description": "Внешний ID вакансии из сервиса",
                        "type": "string",
                        "maxLength": 255,
                        "minLength": 1,
                        "example": "123456"
                    }
                },
                "type": "object"
            },
            "GetRefreshProgressRequestV2": {
                "description": "Запрос проверки прогресса обновления вакансий",
                "properties": {
                    "refresh_id": {
                        "description": "ID для отслеживания прогресса обновления (получен из асинхронного ответа refresh)",
                        "type": "string",
                        "example": "550e8400-e29b-41d4-a716-446655440000"
                    }
                },
                "type": "object"
            },
            "GetVacancyHistoryRequestV2": {
                "description": "Запрос истории вакансий пользователя",
                "properties": {
                    "resume_id": {
                        "description": "Опциональный фильтр по внутреннему ID резюме",
                        "type": "integer",
                        "example": 123,
                        "nullable": true
                    },
                    "page": {
                        "description": "Номер страницы",
                        "type": "integer",
                        "minimum": 1,
                        "example": 1
                    },
                    "per_page": {
                        "description": "Количество элементов на странице",
                        "type": "integer",
                        "maximum": 100,
                        "minimum": 1,
                        "example": 15
                    },
                    "sort_by": {
                        "description": "Поле для сортировки",
                        "type": "string",
                        "enum": [
                            "match_score",
                            "updated_at",
                            "created_at"
                        ],
                        "example": "updated_at"
                    },
                    "sort_order": {
                        "description": "Направление сортировки",
                        "type": "string",
                        "enum": [
                            "asc",
                            "desc"
                        ],
                        "example": "desc"
                    },
                    "min_match_score": {
                        "description": "Минимальный match score для фильтрации (0-100)",
                        "type": "number",
                        "format": "float",
                        "maximum": 100,
                        "minimum": 0,
                        "example": 70.5,
                        "nullable": true
                    },
                    "analyzed_from": {
                        "description": "Начальная дата анализа (формат: Y-m-d)",
                        "type": "string",
                        "format": "date",
                        "example": "2024-01-01",
                        "nullable": true
                    },
                    "analyzed_to": {
                        "description": "Конечная дата анализа (формат: Y-m-d)",
                        "type": "string",
                        "format": "date",
                        "example": "2024-12-31",
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "GetVacancyRequestV2": {
                "description": "Запрос получения деталей одной вакансии",
                "properties": {
                    "service_code": {
                        "description": "Код сервиса (hh, sj, trudvsem, zarplata, telegram, vk_max)",
                        "type": "string",
                        "enum": [
                            "hh",
                            "sj",
                            "trudvsem",
                            "zarplata",
                            "telegram",
                            "vk_max"
                        ],
                        "example": "hh"
                    },
                    "external_vacancy_id": {
                        "description": "Внешний ID вакансии из сервиса",
                        "type": "string",
                        "maxLength": 255,
                        "minLength": 1,
                        "example": "123456"
                    }
                },
                "type": "object"
            },
            "HideVacancyRequestV2": {
                "description": "Запрос скрытия вакансии",
                "properties": {
                    "service_code": {
                        "description": "Код сервиса (hh, sj, trudvsem, zarplata, telegram, vk_max)",
                        "type": "string",
                        "enum": [
                            "hh",
                            "sj",
                            "trudvsem",
                            "zarplata",
                            "telegram",
                            "vk_max"
                        ],
                        "example": "hh"
                    },
                    "external_vacancy_id": {
                        "description": "Внешний ID вакансии из сервиса",
                        "type": "string",
                        "maxLength": 255,
                        "minLength": 1,
                        "example": "123456"
                    }
                },
                "type": "object"
            },
            "ListVacanciesRequestV2": {
                "description": "Запрос списка вакансий пользователя",
                "properties": {
                    "filtered": {
                        "description": "Флаг фильтрации. Если true, возвращаются только AI-отфильтрованные вакансии (is_filtered = true)",
                        "type": "boolean",
                        "example": false
                    },
                    "saved_search_id": {
                        "description": "Опциональный фильтр по сохранённому поиску",
                        "type": "integer",
                        "example": 123,
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "RefreshVacanciesRequestV2": {
                "description": "Запрос обновления данных вакансий из сервисов работы",
                "properties": {
                    "vacancies": {
                        "description": "Массив объектов с данными вакансий для обновления",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/RefreshVacancyItemV2"
                        },
                        "maxItems": 50,
                        "minItems": 1
                    },
                    "async": {
                        "description": "Принудительно установить асинхронный режим (null = автоопределение)",
                        "type": "boolean",
                        "example": false,
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "RefreshVacancyItemV2": {
                "description": "Элемент массива вакансий для обновления",
                "required": [
                    "service_code",
                    "external_vacancy_id"
                ],
                "properties": {
                    "service_code": {
                        "description": "Код сервиса работы",
                        "type": "string",
                        "enum": [
                            "hh",
                            "sj",
                            "zarplata",
                            "trudvsem",
                            "rabota",
                            "yandex",
                            "linkedin",
                            "telegram",
                            "vk_max"
                        ],
                        "example": "hh"
                    },
                    "external_vacancy_id": {
                        "description": "Внешний ID вакансии из сервиса",
                        "type": "string",
                        "maxLength": 255,
                        "minLength": 1,
                        "example": "123456"
                    }
                },
                "type": "object"
            },
            "SyncFromClientRequestV2": {
                "description": "Запрос синхронизации вакансий с клиента: приложение передаёт данные, backend только записывает в БД (без запросов к HH)",
                "properties": {
                    "vacancies": {
                        "description": "Массив вакансий с полными данными (service_code, external_vacancy_id обязательны; остальные поля опциональны)",
                        "type": "array",
                        "items": {
                            "required": [
                                "service_code",
                                "external_vacancy_id"
                            ],
                            "properties": {
                                "service_code": {
                                    "type": "string",
                                    "enum": [
                                        "hh",
                                        "sj",
                                        "zarplata",
                                        "trudvsem",
                                        "rabota",
                                        "yandex",
                                        "linkedin",
                                        "telegram",
                                        "vk_max"
                                    ],
                                    "example": "hh"
                                },
                                "external_vacancy_id": {
                                    "type": "string",
                                    "maxLength": 255,
                                    "example": "123456"
                                },
                                "title": {
                                    "type": "string",
                                    "nullable": true
                                },
                                "description": {
                                    "type": "string",
                                    "nullable": true
                                },
                                "salary": {
                                    "type": "object",
                                    "nullable": true
                                },
                                "employer": {
                                    "type": "object",
                                    "nullable": true
                                },
                                "area": {
                                    "type": "object",
                                    "nullable": true
                                },
                                "key_skills": {
                                    "type": "array",
                                    "items": {
                                        "type": "object"
                                    },
                                    "nullable": true
                                },
                                "experience": {
                                    "type": "object",
                                    "nullable": true
                                },
                                "employment": {
                                    "type": "object",
                                    "nullable": true
                                },
                                "schedule": {
                                    "type": "object",
                                    "nullable": true
                                },
                                "url": {
                                    "type": "string",
                                    "nullable": true
                                },
                                "published_at": {
                                    "type": "string",
                                    "format": "date-time",
                                    "nullable": true
                                },
                                "company_name": {
                                    "type": "string",
                                    "nullable": true
                                }
                            },
                            "type": "object"
                        },
                        "minItems": 1
                    }
                },
                "type": "object"
            },
            "UpdateVacancyDataRequestV2": {
                "description": "Запрос обновления данных вакансии в таблице vacancy_data",
                "allOf": [
                    {
                        "$ref": "#/components/schemas/VacancyDataV2"
                    }
                ]
            },
            "AnalyzeAllResponseV2": {
                "description": "Ответ на запрос массового анализа вакансий",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешном анализе",
                        "type": "string",
                        "example": "Vacancies analyzed successfully"
                    },
                    "data": {
                        "description": "Массив VacancyCardDTO с результатами анализа",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/VacancyCardV2"
                        }
                    },
                    "stats": {
                        "description": "Статистика анализа",
                        "properties": {
                            "fetched": {
                                "description": "Количество новых анализов",
                                "type": "integer",
                                "example": 5
                            },
                            "cached": {
                                "description": "Количество анализов из кеша",
                                "type": "integer",
                                "example": 3
                            },
                            "failed": {
                                "description": "Количество неудачных анализов",
                                "type": "integer",
                                "example": 0
                            }
                        },
                        "type": "object"
                    },
                    "pagination": {
                        "description": "Информация о пагинации",
                        "properties": {
                            "current_page": {
                                "type": "integer",
                                "example": 1
                            },
                            "per_page": {
                                "type": "integer",
                                "example": 8
                            },
                            "total": {
                                "type": "integer",
                                "example": 8
                            },
                            "last_page": {
                                "type": "integer",
                                "example": 1
                            },
                            "from": {
                                "type": "integer",
                                "example": 1,
                                "nullable": true
                            },
                            "to": {
                                "type": "integer",
                                "example": 8,
                                "nullable": true
                            },
                            "has_more": {
                                "type": "boolean",
                                "example": false
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "AnalyzeVacancyResponseV2": {
                "description": "Ответ на запрос анализа вакансии",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешном анализе",
                        "type": "string",
                        "example": "Vacancy analyzed successfully"
                    },
                    "data": {
                        "$ref": "#/components/schemas/VacancyCardV2"
                    },
                    "from_cache": {
                        "description": "Флаг, указывающий что анализ был взят из кеша (vacancy_history)",
                        "type": "boolean",
                        "example": false
                    },
                    "cost": {
                        "description": "Стоимость операции в кредитах (округлено до 2 знаков после запятой, 0 если из кеша)",
                        "type": "number",
                        "format": "float",
                        "example": 1.8
                    }
                },
                "type": "object"
            },
            "GenerateLetterResponseV2": {
                "description": "Ответ на запрос генерации сопроводительного письма",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной генерации",
                        "type": "string",
                        "example": "Cover letter generated successfully"
                    },
                    "data": {
                        "$ref": "#/components/schemas/VacancyCardV2"
                    },
                    "from_cache": {
                        "description": "Флаг, указывающий что письмо было взято из кеша (vacancy_history)",
                        "type": "boolean",
                        "example": false
                    },
                    "cost": {
                        "description": "Стоимость операции в кредитах (округлено до 2 знаков после запятой, 0 если из кеша)",
                        "type": "number",
                        "format": "float",
                        "example": 10
                    }
                },
                "type": "object"
            },
            "GetAnalyzeSessionResponseV2": {
                "description": "Ответ на получение статуса сессии анализа вакансий",
                "properties": {
                    "message": {
                        "description": "Сообщение о получении статуса",
                        "type": "string",
                        "example": "Analysis session retrieved successfully"
                    },
                    "data": {
                        "description": "Состояние сессии анализа",
                        "properties": {
                            "id": {
                                "type": "integer",
                                "example": 123
                            },
                            "status": {
                                "type": "string",
                                "example": "processing"
                            },
                            "total": {
                                "type": "integer",
                                "example": 20
                            },
                            "processed": {
                                "type": "integer",
                                "example": 5
                            },
                            "succeeded": {
                                "type": "integer",
                                "example": 4
                            },
                            "cached": {
                                "type": "integer",
                                "example": 1
                            },
                            "failed": {
                                "type": "integer",
                                "example": 0
                            },
                            "progress": {
                                "type": "number",
                                "example": 25
                            },
                            "error": {
                                "type": "string",
                                "example": null,
                                "nullable": true
                            },
                            "started_at": {
                                "type": "string",
                                "example": "2026-01-23T10:00:00Z",
                                "nullable": true
                            },
                            "completed_at": {
                                "type": "string",
                                "example": null,
                                "nullable": true
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "StartAnalyzeSessionResponseV2": {
                "description": "Ответ на запуск асинхронной сессии анализа вакансий",
                "properties": {
                    "message": {
                        "description": "Сообщение о запуске сессии",
                        "type": "string",
                        "example": "Analysis session started"
                    },
                    "data": {
                        "description": "Данные созданной сессии анализа",
                        "properties": {
                            "id": {
                                "type": "integer",
                                "example": 123
                            },
                            "status": {
                                "type": "string",
                                "example": "pending"
                            },
                            "total": {
                                "type": "integer",
                                "example": 20
                            },
                            "processed": {
                                "type": "integer",
                                "example": 0
                            },
                            "succeeded": {
                                "type": "integer",
                                "example": 0
                            },
                            "cached": {
                                "type": "integer",
                                "example": 0
                            },
                            "failed": {
                                "type": "integer",
                                "example": 0
                            },
                            "progress": {
                                "type": "number",
                                "example": 0
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "GetUrlResponseV2": {
                "description": "Ответ на запрос генерации URL",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной генерации",
                        "type": "string",
                        "example": "URLs generated successfully"
                    },
                    "data": {
                        "description": "Массив URL для каждого сервиса",
                        "type": "array",
                        "items": {
                            "properties": {
                                "service_id": {
                                    "description": "ID сервиса",
                                    "type": "integer",
                                    "example": 1
                                },
                                "service_code": {
                                    "description": "Код сервиса",
                                    "type": "string",
                                    "example": "hh"
                                },
                                "service_name": {
                                    "description": "Название сервиса",
                                    "type": "string",
                                    "example": "HeadHunter"
                                },
                                "url": {
                                    "description": "URL поиска",
                                    "type": "string",
                                    "example": "https://hh.ru/search/vacancy?text=php"
                                }
                            },
                            "type": "object"
                        }
                    }
                },
                "type": "object"
            },
            "ParseUrlResponseV2": {
                "description": "Ответ на запрос парсинга URL",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешном парсинге",
                        "type": "string",
                        "example": "URL parsed successfully"
                    },
                    "data": {
                        "description": "Данные парсинга",
                        "properties": {
                            "query": {
                                "description": "Текстовый запрос из URL",
                                "type": "string",
                                "example": "php",
                                "nullable": true
                            },
                            "unified_filters": {
                                "description": "Унифицированные фильтры",
                                "type": "object",
                                "example": {
                                    "area": [
                                        1
                                    ]
                                }
                            },
                            "service_code": {
                                "description": "Код сервиса",
                                "type": "string",
                                "example": "hh",
                                "nullable": true
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "SearchResponseV2": {
                "description": "Ответ на запрос поиска вакансий",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешном поиске",
                        "type": "string",
                        "example": "Search completed successfully"
                    },
                    "data": {
                        "description": "Массив карточек вакансий",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/VacancyCardV2"
                        }
                    },
                    "pagination": {
                        "description": "Метаданные пагинации",
                        "properties": {
                            "current_page": {
                                "description": "Текущая страница",
                                "type": "integer",
                                "example": 1
                            },
                            "per_page": {
                                "description": "Элементов на странице",
                                "type": "integer",
                                "example": 15
                            },
                            "total": {
                                "description": "Общее количество записей",
                                "type": "integer",
                                "example": 100
                            },
                            "last_page": {
                                "description": "Номер последней страницы",
                                "type": "integer",
                                "example": 7
                            },
                            "from": {
                                "description": "Номер первой записи на странице",
                                "type": "integer",
                                "example": 1,
                                "nullable": true
                            },
                            "to": {
                                "description": "Номер последней записи на странице",
                                "type": "integer",
                                "example": 15,
                                "nullable": true
                            },
                            "has_more": {
                                "description": "Есть ли еще страницы",
                                "type": "boolean",
                                "example": true
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "ApplyVacancyResponseV2": {
                "description": "Ответ на запрос отклика (пометка вакансии как applied) (v2)",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешном выполнении",
                        "type": "string",
                        "example": "Vacancy marked as applied"
                    },
                    "data": {
                        "$ref": "#/components/schemas/VacancyCardV2"
                    },
                    "apply_url": {
                        "description": "URL для перехода на страницу отклика/вакансии (если применимо)",
                        "type": "string",
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "FetchAllVacanciesResponseV2": {
                "description": "Ответ на запрос получения данных нескольких вакансий",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной загрузке",
                        "type": "string",
                        "example": "Vacancies fetched successfully"
                    },
                    "data": {
                        "description": "Массив карточек вакансий",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/VacancyCardV2"
                        }
                    },
                    "stats": {
                        "description": "Статистика обработки",
                        "required": [
                            "fetched",
                            "cached",
                            "failed"
                        ],
                        "properties": {
                            "fetched": {
                                "description": "Количество вакансий, загруженных из API",
                                "type": "integer",
                                "example": 5
                            },
                            "cached": {
                                "description": "Количество вакансий, взятых из кеша",
                                "type": "integer",
                                "example": 10
                            },
                            "failed": {
                                "description": "Количество вакансий, которые не удалось загрузить",
                                "type": "integer",
                                "example": 0
                            }
                        },
                        "type": "object"
                    },
                    "pagination": {
                        "description": "Метаданные пагинации",
                        "properties": {
                            "current_page": {
                                "description": "Текущая страница",
                                "type": "integer",
                                "example": 1
                            },
                            "per_page": {
                                "description": "Элементов на странице",
                                "type": "integer",
                                "example": 15
                            },
                            "total": {
                                "description": "Общее количество записей",
                                "type": "integer",
                                "example": 100
                            },
                            "last_page": {
                                "description": "Номер последней страницы",
                                "type": "integer",
                                "example": 7
                            },
                            "from": {
                                "description": "Номер первой записи на странице",
                                "type": "integer",
                                "example": 1,
                                "nullable": true
                            },
                            "to": {
                                "description": "Номер последней записи на странице",
                                "type": "integer",
                                "example": 15,
                                "nullable": true
                            },
                            "has_more": {
                                "description": "Есть ли еще страницы",
                                "type": "boolean",
                                "example": true
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "FetchVacancyResponseV2": {
                "description": "Ответ на запрос получения данных вакансии",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной загрузке",
                        "type": "string",
                        "example": "Vacancy fetched successfully"
                    },
                    "data": {
                        "$ref": "#/components/schemas/VacancyCardV2"
                    }
                },
                "type": "object"
            },
            "GetDemoVacancyResponseV2": {
                "description": "Ответ на запрос демо-вакансии",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной загрузке",
                        "type": "string",
                        "example": "Demo vacancy retrieved successfully"
                    },
                    "data": {
                        "$ref": "#/components/schemas/VacancyCardV2"
                    }
                },
                "type": "object"
            },
            "GetEnrichmentStatusResponseV2": {
                "description": "Ответ со статусами обогащения вакансий (v2)",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешном выполнении",
                        "type": "string",
                        "example": "Enrichment statuses retrieved"
                    },
                    "data": {
                        "description": "Словарь статусов по ключу external_vacancy_id или serviceCode:externalVacancyId (зависит от клиента)",
                        "type": "object",
                        "additionalProperties": {
                            "properties": {
                                "enrichment_status": {
                                    "type": "string",
                                    "nullable": true
                                },
                                "is_enriched": {
                                    "type": "boolean"
                                },
                                "description": {
                                    "type": "string",
                                    "nullable": true
                                },
                                "preview": {
                                    "type": "string",
                                    "nullable": true
                                },
                                "fetched_at": {
                                    "type": "string",
                                    "nullable": true
                                },
                                "can_be_analyzed": {
                                    "type": "boolean"
                                }
                            },
                            "type": "object"
                        }
                    }
                },
                "type": "object"
            },
            "GetRefreshProgressResponseV2": {
                "description": "Ответ на запрос проверки прогресса обновления вакансий",
                "oneOf": [
                    {
                        "description": "Ответ когда job завершен",
                        "properties": {
                            "message": {
                                "description": "OpenAPI-схема ответа на запрос проверки прогресса обновления вакансий (V2)\n\nМожет содержать данные о прогрессе или завершенные данные в формате fetchAll.",
                                "type": "string",
                                "example": "Vacancies fetched successfully"
                            },
                            "data": {
                                "description": "Массив карточек вакансий",
                                "type": "array",
                                "items": {
                                    "$ref": "#/components/schemas/VacancyCardV2"
                                }
                            },
                            "stats": {
                                "description": "Статистика обработки",
                                "properties": {
                                    "fetched": {
                                        "type": "integer",
                                        "example": 5
                                    },
                                    "cached": {
                                        "type": "integer",
                                        "example": 10
                                    },
                                    "failed": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                },
                                "type": "object"
                            }
                        },
                        "type": "object"
                    },
                    {
                        "description": "Ответ когда job еще выполняется",
                        "properties": {
                            "message": {
                                "type": "string",
                                "example": "Refresh in progress"
                            },
                            "status": {
                                "type": "string",
                                "enum": [
                                    "queued",
                                    "processing"
                                ],
                                "example": "processing"
                            },
                            "progress": {
                                "description": "Прогресс выполнения",
                                "properties": {
                                    "total": {
                                        "type": "integer",
                                        "example": 15
                                    },
                                    "processed": {
                                        "type": "integer",
                                        "example": 10
                                    },
                                    "refreshed": {
                                        "type": "integer",
                                        "example": 5
                                    },
                                    "skipped": {
                                        "type": "integer",
                                        "example": 5
                                    },
                                    "failed": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                },
                                "type": "object"
                            }
                        },
                        "type": "object"
                    },
                    {
                        "description": "Ответ когда job упал с ошибкой",
                        "properties": {
                            "message": {
                                "type": "string",
                                "example": "Vacancy refresh failed"
                            },
                            "error": {
                                "type": "string",
                                "example": "Error message"
                            },
                            "stats": {
                                "description": "Статистика обработки до ошибки",
                                "properties": {
                                    "fetched": {
                                        "type": "integer",
                                        "example": 3
                                    },
                                    "cached": {
                                        "type": "integer",
                                        "example": 2
                                    },
                                    "failed": {
                                        "type": "integer",
                                        "example": 10
                                    }
                                },
                                "type": "object"
                            }
                        },
                        "type": "object"
                    }
                ]
            },
            "GetVacancyHistoryResponseV2": {
                "description": "Ответ на запрос истории вакансий пользователя",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной загрузке",
                        "type": "string",
                        "example": "История вакансий успешно загружена"
                    },
                    "data": {
                        "description": "Массив карточек вакансий из истории",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/VacancyCardV2"
                        }
                    },
                    "pagination": {
                        "description": "Метаданные пагинации",
                        "properties": {
                            "current_page": {
                                "description": "Текущая страница",
                                "type": "integer",
                                "example": 1
                            },
                            "per_page": {
                                "description": "Элементов на странице",
                                "type": "integer",
                                "example": 15
                            },
                            "total": {
                                "description": "Общее количество записей",
                                "type": "integer",
                                "example": 100
                            },
                            "last_page": {
                                "description": "Номер последней страницы",
                                "type": "integer",
                                "example": 7
                            },
                            "from": {
                                "description": "Номер первой записи на странице",
                                "type": "integer",
                                "example": 1,
                                "nullable": true
                            },
                            "to": {
                                "description": "Номер последней записи на странице",
                                "type": "integer",
                                "example": 15,
                                "nullable": true
                            },
                            "has_more": {
                                "description": "Есть ли еще страницы",
                                "type": "boolean",
                                "example": true
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "GetVacancyResponseV2": {
                "description": "Ответ на запрос получения деталей одной вакансии",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной загрузке",
                        "type": "string",
                        "example": "Vacancy retrieved successfully"
                    },
                    "data": {
                        "$ref": "#/components/schemas/VacancyCardV2"
                    }
                },
                "type": "object"
            },
            "HideVacancyResponseV2": {
                "description": "Ответ на запрос скрытия вакансии",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешном скрытии",
                        "type": "string",
                        "example": "Vacancy hidden successfully"
                    },
                    "data": {
                        "$ref": "#/components/schemas/VacancyCardV2"
                    }
                },
                "type": "object"
            },
            "ListVacanciesResponseV2": {
                "description": "Ответ на запрос списка вакансий пользователя",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешной загрузке",
                        "type": "string",
                        "example": "Vacancies retrieved"
                    },
                    "data": {
                        "description": "Массив карточек вакансий",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/VacancyCardV2"
                        }
                    },
                    "pagination": {
                        "description": "Метаданные пагинации",
                        "properties": {
                            "current_page": {
                                "description": "Текущая страница",
                                "type": "integer",
                                "example": 1
                            },
                            "per_page": {
                                "description": "Элементов на странице",
                                "type": "integer",
                                "example": 15
                            },
                            "total": {
                                "description": "Общее количество записей",
                                "type": "integer",
                                "example": 100
                            },
                            "last_page": {
                                "description": "Номер последней страницы",
                                "type": "integer",
                                "example": 7
                            },
                            "from": {
                                "description": "Номер первой записи на странице",
                                "type": "integer",
                                "example": 1,
                                "nullable": true
                            },
                            "to": {
                                "description": "Номер последней записи на странице",
                                "type": "integer",
                                "example": 15,
                                "nullable": true
                            },
                            "has_more": {
                                "description": "Есть ли еще страницы",
                                "type": "boolean",
                                "example": true
                            }
                        },
                        "type": "object"
                    }
                },
                "type": "object"
            },
            "RefreshVacanciesResponseV2": {
                "description": "Ответ на запрос обновления вакансий",
                "oneOf": [
                    {
                        "description": "Синхронный ответ с данными",
                        "properties": {
                            "message": {
                                "description": "OpenAPI-схема ответа на запрос обновления вакансий (V2)\n\nМожет быть синхронным (с данными) или асинхронным (с refresh_id).",
                                "type": "string",
                                "example": "Vacancies fetched successfully"
                            },
                            "async": {
                                "type": "boolean",
                                "example": false
                            },
                            "data": {
                                "description": "Массив карточек вакансий",
                                "type": "array",
                                "items": {
                                    "$ref": "#/components/schemas/VacancyCardV2"
                                }
                            },
                            "stats": {
                                "description": "Статистика обработки",
                                "properties": {
                                    "fetched": {
                                        "type": "integer",
                                        "example": 5
                                    },
                                    "cached": {
                                        "type": "integer",
                                        "example": 10
                                    },
                                    "failed": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                },
                                "type": "object"
                            }
                        },
                        "type": "object"
                    },
                    {
                        "description": "Асинхронный ответ с refresh_id",
                        "properties": {
                            "message": {
                                "type": "string",
                                "example": "Обновление запущено в фоне. Используйте refresh_id для проверки статуса."
                            },
                            "async": {
                                "type": "boolean",
                                "example": true
                            },
                            "refresh_id": {
                                "type": "string",
                                "example": "550e8400-e29b-41d4-a716-446655440000"
                            },
                            "total": {
                                "type": "integer",
                                "example": 15
                            },
                            "refresh_cost": {
                                "type": "integer",
                                "example": 1
                            }
                        },
                        "type": "object"
                    }
                ]
            },
            "SyncFromClientResponseV2": {
                "description": "Ответ после записи вакансий с клиента в БД",
                "properties": {
                    "synced_count": {
                        "description": "Количество успешно записанных вакансий",
                        "type": "integer",
                        "example": 10
                    },
                    "failed_count": {
                        "description": "Количество вакансий с ошибкой записи",
                        "type": "integer",
                        "example": 0
                    },
                    "message": {
                        "description": "Сообщение",
                        "type": "string",
                        "example": "Vacancies synced from client"
                    }
                },
                "type": "object"
            },
            "UpdateVacancyDataResponseV2": {
                "description": "Ответ на запрос обновления данных вакансии",
                "properties": {
                    "message": {
                        "description": "Сообщение об успешном обновлении",
                        "type": "string",
                        "example": "Vacancy data updated successfully"
                    },
                    "data": {
                        "$ref": "#/components/schemas/VacancyCardV2"
                    }
                },
                "type": "object"
            },
            "AnalyzeCompanyCultureFitRequestV2": {
                "title": "Analyze Company Culture Fit Request (v2)",
                "description": "Запрос на анализ культуры компании. ⚠️ ПЛАТНАЯ ОПЕРАЦИЯ: 5 CR",
                "required": [
                    "resume_id"
                ],
                "properties": {
                    "external_vacancy_id": {
                        "description": "Внешний ID вакансии (если не передан в URL)",
                        "type": "string",
                        "example": "12345678",
                        "nullable": true
                    },
                    "service_code": {
                        "description": "Код сервиса (hh, superjob)",
                        "type": "string",
                        "default": "hh",
                        "example": "hh"
                    },
                    "resume_id": {
                        "description": "ID резюме",
                        "type": "integer",
                        "example": 42
                    }
                },
                "type": "object"
            },
            "DetectRedFlagsRequestV2": {
                "title": "Detect Red Flags Request (v2)",
                "description": "Запрос на анализ красных флагов вакансии. ⚠️ ПЛАТНАЯ ОПЕРАЦИЯ: 3 CR",
                "required": [
                    "external_vacancy_id"
                ],
                "properties": {
                    "external_vacancy_id": {
                        "description": "Внешний ID вакансии",
                        "type": "string",
                        "example": "12345678"
                    },
                    "service_code": {
                        "description": "Код сервиса (hh, superjob)",
                        "type": "string",
                        "default": "hh",
                        "example": "hh"
                    }
                },
                "type": "object"
            },
            "GenerateSalaryNegotiationRequestV2": {
                "title": "Generate Salary Negotiation Request (v2)",
                "description": "Request body for salary negotiation strategy generation. ⚠️ ПЛАТНАЯ ОПЕРАЦИЯ: 10 CR",
                "required": [
                    "external_vacancy_id",
                    "resume_id"
                ],
                "properties": {
                    "external_vacancy_id": {
                        "description": "External vacancy ID",
                        "type": "string",
                        "example": "12345678"
                    },
                    "service_code": {
                        "description": "Job service code",
                        "type": "string",
                        "default": "hh",
                        "example": "hh"
                    },
                    "resume_id": {
                        "description": "Resume ID to use for personalization",
                        "type": "integer",
                        "example": 42
                    },
                    "plan_type": {
                        "description": "Plan type: basic (10 CR) or full (20 CR)",
                        "type": "string",
                        "default": "basic",
                        "enum": [
                            "basic",
                            "full"
                        ],
                        "example": "basic"
                    }
                },
                "type": "object"
            },
            "PrepareInterviewRequestV2": {
                "title": "Prepare Interview Request (v2)",
                "description": "Request body for interview preparation. ⚠️ ПЛАТНАЯ ОПЕРАЦИЯ: 15 CR",
                "required": [
                    "external_vacancy_id",
                    "resume_id"
                ],
                "properties": {
                    "external_vacancy_id": {
                        "description": "External vacancy ID",
                        "type": "string",
                        "example": "12345678"
                    },
                    "service_code": {
                        "description": "Job service code",
                        "type": "string",
                        "default": "hh",
                        "example": "hh"
                    },
                    "resume_id": {
                        "description": "Resume ID to use for personalization",
                        "type": "integer",
                        "example": 42
                    },
                    "plan_type": {
                        "description": "Plan type: basic (15 CR) or full (30 CR)",
                        "type": "string",
                        "default": "basic",
                        "enum": [
                            "basic",
                            "full"
                        ],
                        "example": "basic"
                    }
                },
                "type": "object"
            },
            "CompanyCultureFitResponseV2": {
                "title": "Company Culture Fit Response (v2)",
                "description": "Результат анализа культуры компании",
                "properties": {
                    "data": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/CompanyCultureFitAnalysisV2"
                            }
                        ],
                        "nullable": true,
                        "description": "Результат анализа"
                    },
                    "vacancy": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/VacancyCardV2"
                            }
                        ],
                        "nullable": true,
                        "description": "Карточка вакансии, для которой выполнен анализ"
                    },
                    "message": {
                        "description": "Сообщение о статусе",
                        "type": "string",
                        "example": "Company culture fit analysis completed successfully"
                    },
                    "cached": {
                        "description": "Результат из кэша (бесплатно)",
                        "type": "boolean",
                        "example": false
                    }
                },
                "type": "object"
            },
            "CompanyCultureFitAnalysisV2": {
                "title": "Company Culture Fit Analysis (v2)",
                "description": "Детальный результат анализа культуры компании",
                "properties": {
                    "service_code": {
                        "description": "Код сервиса",
                        "type": "string",
                        "example": "hh"
                    },
                    "external_vacancy_id": {
                        "description": "Внешний ID вакансии",
                        "type": "string",
                        "example": "123456"
                    },
                    "resume_id": {
                        "description": "ID резюме",
                        "type": "integer",
                        "example": 42
                    },
                    "company_culture_type": {
                        "description": "Тип культуры компании",
                        "type": "string",
                        "enum": [
                            "Startup",
                            "Corporate",
                            "Product",
                            "Agency"
                        ],
                        "example": "Startup"
                    },
                    "key_values": {
                        "description": "Ключевые ценности",
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "example": [
                            "Innovation",
                            "Autonomy",
                            "Growth"
                        ]
                    },
                    "candidate_match_score": {
                        "description": "Оценка соответствия 0-100",
                        "type": "integer",
                        "maximum": 100,
                        "minimum": 0,
                        "example": 85
                    },
                    "red_flags": {
                        "description": "Красные флаги культуры",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/CultureFlagV2"
                        }
                    },
                    "green_flags": {
                        "description": "Зелёные флаги культуры",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/CultureFlagV2"
                        }
                    },
                    "interview_questions": {
                        "description": "Вопросы для проверки культуры на собеседовании",
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "summary": {
                        "description": "Краткое резюме анализа",
                        "type": "string",
                        "example": "Компания ориентирована на рост и автономию, но возможны переработки."
                    },
                    "analyzed_at": {
                        "description": "Дата и время анализа",
                        "type": "string",
                        "format": "date-time",
                        "example": "2026-01-17T10:30:00Z"
                    }
                },
                "type": "object"
            },
            "CultureFlagV2": {
                "title": "Culture Flag (v2)",
                "description": "Флаг культуры с причиной",
                "properties": {
                    "flag": {
                        "description": "Флаг",
                        "type": "string",
                        "example": "Ненормированный рабочий день"
                    },
                    "reason": {
                        "description": "Причина",
                        "type": "string",
                        "example": "Упоминание о постоянной вовлеченности"
                    }
                },
                "type": "object"
            },
            "InterviewPrepResponseV2": {
                "title": "Interview Preparation Response (v2)",
                "description": "Response with interview preparation",
                "properties": {
                    "data": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/InterviewPrepDataV2"
                            }
                        ],
                        "nullable": true
                    },
                    "vacancy": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/VacancyCardV2"
                            }
                        ],
                        "nullable": true,
                        "description": "Карточка вакансии, для которой выполнен анализ"
                    },
                    "message": {
                        "description": "Response message",
                        "type": "string",
                        "example": "Interview preparation generated"
                    },
                    "cached": {
                        "description": "Whether result was from cache (free)",
                        "type": "boolean",
                        "example": false
                    },
                    "credits_charged": {
                        "description": "Credits charged (0 if cached)",
                        "type": "integer",
                        "example": 15
                    }
                },
                "type": "object"
            },
            "InterviewPrepDataV2": {
                "title": "Interview Preparation Data (v2)",
                "description": "Interview preparation details",
                "properties": {
                    "service_code": {
                        "description": "Service code",
                        "type": "string",
                        "example": "hh"
                    },
                    "external_vacancy_id": {
                        "description": "External vacancy ID",
                        "type": "string",
                        "example": "123456"
                    },
                    "resume_id": {
                        "description": "Resume ID",
                        "type": "integer",
                        "example": 42
                    },
                    "plan_type": {
                        "description": "Plan type used",
                        "type": "string",
                        "enum": [
                            "basic",
                            "full"
                        ],
                        "example": "basic"
                    },
                    "questions": {
                        "description": "Interview questions",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/InterviewQuestionV2"
                        }
                    },
                    "star_stories": {
                        "description": "STAR stories (full plan only)",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/StarStoryV2"
                        }
                    },
                    "questions_to_ask": {
                        "description": "Questions to ask employer",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/QuestionToAskV2"
                        }
                    },
                    "common_mistakes": {
                        "description": "Common mistakes to avoid (full plan only)",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/CommonMistakeV2"
                        }
                    },
                    "dress_code": {
                        "description": "Dress code recommendation (full plan only)",
                        "type": "string",
                        "example": "Business casual",
                        "nullable": true
                    },
                    "preparation_checklist": {
                        "description": "Preparation checklist (full plan only)",
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "example": [
                            "Изучить сайт компании",
                            "Подготовить вопросы"
                        ]
                    },
                    "analyzed_at": {
                        "description": "Preparation timestamp",
                        "type": "string",
                        "format": "date-time",
                        "example": "2026-01-11T12:00:00+00:00"
                    }
                },
                "type": "object"
            },
            "InterviewQuestionV2": {
                "title": "Interview Question (v2)",
                "description": "Interview question with guidance",
                "properties": {
                    "category": {
                        "description": "Question category",
                        "type": "string",
                        "example": "technical"
                    },
                    "question": {
                        "description": "The question",
                        "type": "string",
                        "example": "Расскажите о вашем опыте с React"
                    },
                    "why_asked": {
                        "description": "Why this is asked",
                        "type": "string",
                        "example": "Проверка технических навыков"
                    },
                    "answer_tips": {
                        "description": "Tips for answering",
                        "type": "string",
                        "example": "Приведите конкретные примеры"
                    },
                    "sample_answer": {
                        "description": "Sample answer based on resume",
                        "type": "string",
                        "example": "В моём последнем проекте..."
                    }
                },
                "type": "object"
            },
            "StarStoryV2": {
                "title": "STAR Story (v2)",
                "description": "Situation-Task-Action-Result story",
                "properties": {
                    "title": {
                        "description": "Story title",
                        "type": "string",
                        "example": "Оптимизация производительности"
                    },
                    "situation": {
                        "description": "Situation description",
                        "type": "string",
                        "example": "Сайт загружался более 5 секунд"
                    },
                    "task": {
                        "description": "Task to solve",
                        "type": "string",
                        "example": "Снизить время загрузки до 1 секунды"
                    },
                    "action": {
                        "description": "Actions taken",
                        "type": "string",
                        "example": "Внедрил lazy loading, оптимизировал запросы"
                    },
                    "result": {
                        "description": "Result achieved",
                        "type": "string",
                        "example": "Время загрузки сократилось на 80%"
                    }
                },
                "type": "object"
            },
            "QuestionToAskV2": {
                "title": "Question To Ask (v2)",
                "description": "Question candidate should ask",
                "properties": {
                    "question": {
                        "description": "The question",
                        "type": "string",
                        "example": "Какие технологии планируете внедрять?"
                    },
                    "purpose": {
                        "description": "What you learn from answer",
                        "type": "string",
                        "example": "Понять направление развития команды"
                    }
                },
                "type": "object"
            },
            "CommonMistakeV2": {
                "title": "Common Mistake (v2)",
                "description": "Common interview mistake",
                "properties": {
                    "mistake": {
                        "description": "The mistake",
                        "type": "string",
                        "example": "Говорить плохо о предыдущем работодателе"
                    },
                    "how_to_avoid": {
                        "description": "How to avoid",
                        "type": "string",
                        "example": "Фокусируйтесь на полученном опыте"
                    }
                },
                "type": "object"
            },
            "RedFlagsAnalysisResponseV2": {
                "title": "Red Flags Analysis Response (v2)",
                "description": "Результат анализа красных флагов вакансии",
                "properties": {
                    "data": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/RedFlagsAnalysisV2"
                            }
                        ],
                        "nullable": true,
                        "description": "Результат анализа"
                    },
                    "vacancy": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/VacancyCardV2"
                            }
                        ],
                        "nullable": true,
                        "description": "Карточка вакансии, для которой выполнен анализ"
                    },
                    "message": {
                        "description": "Сообщение о статусе",
                        "type": "string",
                        "example": "Red flags analysis completed successfully"
                    },
                    "cached": {
                        "description": "Результат из кэша (бесплатно)",
                        "type": "boolean",
                        "example": false
                    },
                    "credits_charged": {
                        "description": "Количество списанных кредитов (0 если из кэша)",
                        "type": "integer",
                        "example": 3
                    }
                },
                "type": "object"
            },
            "RedFlagsAnalysisV2": {
                "title": "Red Flags Analysis (v2)",
                "description": "Детальный результат анализа рисков",
                "properties": {
                    "service_code": {
                        "description": "Код сервиса",
                        "type": "string",
                        "example": "hh"
                    },
                    "external_vacancy_id": {
                        "description": "Внешний ID вакансии в сервисе",
                        "type": "string",
                        "example": "123456"
                    },
                    "risk_level": {
                        "description": "Уровень риска: low, medium, high",
                        "type": "string",
                        "enum": [
                            "low",
                            "medium",
                            "high"
                        ],
                        "example": "medium"
                    },
                    "safe_score": {
                        "description": "Оценка безопасности 0-100 (100 = безопасно)",
                        "type": "integer",
                        "maximum": 100,
                        "minimum": 0,
                        "example": 65
                    },
                    "red_flags": {
                        "description": "Список обнаруженных красных флагов",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/RedFlagV2"
                        }
                    },
                    "recommendation": {
                        "description": "Рекомендация: apply, cautious, avoid",
                        "type": "string",
                        "enum": [
                            "apply",
                            "cautious",
                            "avoid"
                        ],
                        "example": "cautious"
                    },
                    "summary": {
                        "description": "Краткое резюме анализа",
                        "type": "string",
                        "example": "Вакансия имеет средний уровень риска. Рекомендуется уточнить детали на собеседовании."
                    },
                    "analyzed_at": {
                        "description": "Дата и время анализа",
                        "type": "string",
                        "format": "date-time",
                        "example": "2026-01-10T14:30:00Z"
                    }
                },
                "type": "object"
            },
            "RedFlagV2": {
                "title": "Red Flag (v2)",
                "description": "Отдельный красный флаг",
                "properties": {
                    "type": {
                        "description": "Тип флага",
                        "type": "string",
                        "enum": [
                            "salary_mismatch",
                            "unrealistic_requirements",
                            "overload",
                            "missing_info",
                            "aggressive_tone",
                            "mlm_signs",
                            "exploitation"
                        ],
                        "example": "salary_mismatch"
                    },
                    "severity": {
                        "description": "Серьёзность: low, medium, high",
                        "type": "string",
                        "enum": [
                            "low",
                            "medium",
                            "high"
                        ],
                        "example": "high"
                    },
                    "explanation": {
                        "description": "Объяснение проблемы",
                        "type": "string",
                        "example": "Зарплатная вилка слишком широкая (50-200k)"
                    },
                    "evidence": {
                        "description": "Цитаты из вакансии как доказательство",
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "example": [
                            "Зарплата: 50 000 - 200 000 ₽"
                        ]
                    }
                },
                "type": "object"
            },
            "SalaryNegotiationResponseV2": {
                "title": "Salary Negotiation Response (v2)",
                "description": "Response with salary negotiation strategy",
                "properties": {
                    "data": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/SalaryNegotiationDataV2"
                            }
                        ],
                        "nullable": true
                    },
                    "vacancy": {
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/VacancyCardV2"
                            }
                        ],
                        "nullable": true,
                        "description": "Карточка вакансии, для которой выполнен анализ"
                    },
                    "message": {
                        "description": "Response message",
                        "type": "string",
                        "example": "Salary negotiation strategy generated"
                    },
                    "cached": {
                        "description": "Whether result was from cache (free)",
                        "type": "boolean",
                        "example": false
                    },
                    "credits_charged": {
                        "description": "Credits charged (0 if cached)",
                        "type": "integer",
                        "example": 10
                    }
                },
                "type": "object"
            },
            "SalaryNegotiationDataV2": {
                "title": "Salary Negotiation Data (v2)",
                "description": "Salary negotiation strategy details",
                "properties": {
                    "service_code": {
                        "description": "Service code",
                        "type": "string",
                        "example": "hh"
                    },
                    "external_vacancy_id": {
                        "description": "External vacancy ID",
                        "type": "string",
                        "example": "123456"
                    },
                    "resume_id": {
                        "description": "Resume ID",
                        "type": "integer",
                        "example": 42
                    },
                    "plan_type": {
                        "description": "Plan type used",
                        "type": "string",
                        "enum": [
                            "basic",
                            "full"
                        ],
                        "example": "basic"
                    },
                    "salary_range": {
                        "$ref": "#/components/schemas/SalaryRangeV2"
                    },
                    "strong_arguments": {
                        "description": "Strong arguments for negotiation",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/SalaryArgumentV2"
                        }
                    },
                    "negotiation_scripts": {
                        "description": "Ready-to-use scripts (full plan only)",
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/NegotiationScriptV2"
                        }
                    },
                    "counter_offer_tips": {
                        "description": "Tips for counter offers (full plan only)",
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "example": [
                            "Не соглашайтесь сразу",
                            "Попросите время подумать"
                        ]
                    },
                    "bonus_negotiation": {
                        "description": "Items to negotiate besides salary (full plan only)",
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "example": [
                            "ДМС",
                            "Удалённая работа",
                            "Дополнительный отпуск"
                        ]
                    },
                    "tactics": {
                        "description": "Negotiation tactics (full plan only)",
                        "properties": {
                            "employer_type": {
                                "type": "string",
                                "example": "corporation"
                            },
                            "recommended_approach": {
                                "type": "string",
                                "example": "Формальный подход"
                            }
                        },
                        "type": "object",
                        "nullable": true
                    },
                    "analyzed_at": {
                        "description": "Analysis timestamp",
                        "type": "string",
                        "format": "date-time",
                        "example": "2026-01-11T12:00:00+00:00"
                    }
                },
                "type": "object"
            },
            "SalaryRangeV2": {
                "title": "Salary Range (v2)",
                "description": "Recommended salary range",
                "properties": {
                    "minimum": {
                        "description": "Minimum acceptable salary",
                        "type": "integer",
                        "example": 150000
                    },
                    "target": {
                        "description": "Target salary",
                        "type": "integer",
                        "example": 180000
                    },
                    "maximum": {
                        "description": "Maximum to ask for",
                        "type": "integer",
                        "example": 220000
                    },
                    "currency": {
                        "description": "Currency",
                        "type": "string",
                        "example": "RUB"
                    },
                    "justification": {
                        "description": "Justification for the range",
                        "type": "string",
                        "example": "На основе 5 лет опыта и текущих рыночных ставок"
                    }
                },
                "type": "object"
            },
            "SalaryArgumentV2": {
                "title": "Salary Argument (v2)",
                "description": "Argument for salary negotiation",
                "properties": {
                    "argument": {
                        "description": "The argument text",
                        "type": "string",
                        "example": "У меня 5 лет опыта в данной области"
                    },
                    "evidence": {
                        "description": "Evidence supporting the argument",
                        "type": "string",
                        "example": "Работал над проектами X, Y, Z с измеримыми результатами"
                    }
                },
                "type": "object"
            },
            "NegotiationScriptV2": {
                "title": "Negotiation Script (v2)",
                "description": "Ready-to-use negotiation script",
                "properties": {
                    "situation": {
                        "description": "When to use this script",
                        "type": "string",
                        "example": "Когда спрашивают ожидания"
                    },
                    "script": {
                        "description": "The script text",
                        "type": "string",
                        "example": "Я ориентируюсь на диапазон 180-220 тысяч рублей, учитывая мой опыт и требования позиции"
                    }
                },
                "type": "object"
            }
        },
        "responses": {
            "UnauthorizedV2": {
                "description": "Unauthorized (missing/invalid API key)",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/ErrorResponseV2"
                        }
                    }
                }
            },
            "ForbiddenV2": {
                "description": "Forbidden (missing required scope or access denied)",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/ErrorResponseV2"
                        }
                    }
                }
            },
            "NotFoundV2": {
                "description": "Not Found",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/ErrorResponseV2"
                        }
                    }
                }
            },
            "ValidationErrorV2": {
                "description": "Validation error",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/ErrorResponseV2"
                        }
                    }
                }
            },
            "RateLimitV2": {
                "description": "Rate limit exceeded",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/ErrorResponseV2"
                        }
                    }
                }
            },
            "ServerErrorV2": {
                "description": "Internal server error",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/ErrorResponseV2"
                        }
                    }
                }
            }
        },
        "securitySchemes": {
            "bearerAuth": {
                "type": "http",
                "description": "Access token for external API v2. Use header: Authorization: Bearer {accessToken}",
                "bearerFormat": "Access token",
                "scheme": "bearer"
            }
        }
    },
    "tags": [
        {
            "name": "AI",
            "description": "AI-операции (v2)"
        },
        {
            "name": "Applications",
            "description": "Операции с откликами на вакансии (v2). Требуется API токен доступа."
        },
        {
            "name": "Authentication",
            "description": "Аутентификация (v2). Требуется personal access token из личного кабинета."
        },
        {
            "name": "Cities",
            "description": "Операции с городами (v2). Требуется API ключ."
        },
        {
            "name": "CompanyContact",
            "description": "Company contacts (v2)"
        },
        {
            "name": "Contacts",
            "description": "Contacts Hub (v2)"
        },
        {
            "name": "CoverLetters",
            "description": "Операции с сопроводительными письмами (v2). Требуется API ключ. ⚠️ Генерация — платная операция."
        },
        {
            "name": "Credits",
            "description": "Управление кредитами (v2). Требуется API ключ. ✅ Все операции бесплатны."
        },
        {
            "name": "Developer",
            "description": "Интеграция для разработчиков: документация и автогенерируемые артефакты (SDK/OpenAPI)."
        },
        {
            "name": "API Keys V2",
            "description": "Управление API ключами (v2, Bearer Token auth)"
        },
        {
            "name": "Public API",
            "description": "Публичный API (v2). Требуется API ключ."
        },
        {
            "name": "Interviews",
            "description": "Interview stages (v2)"
        },
        {
            "name": "InterviewAnalytics",
            "description": "Interview analytics (v2)"
        },
        {
            "name": "JobSearch",
            "description": "Операции мультипоиска вакансий (v2). Требуется API токен доступа."
        },
        {
            "name": "MultiSearch",
            "description": "Мультипоиск вакансий (v2). Требуется API токен доступа."
        },
        {
            "name": "Payments",
            "description": "Операции с платежами (v2). Требуется API токен доступа."
        },
        {
            "name": "Referral",
            "description": "Реферальная программа (v2). Публичный API: только info. Расширение/десктоп: code, apply, stats, referrals по API ключу."
        },
        {
            "name": "Resume Categories",
            "description": "Операции с категориями резюме пользователя (v2). Требуется API ключ."
        },
        {
            "name": "Resumes",
            "description": "Управление резюме пользователя (v2). Требуется API ключ. AI-методы платные."
        },
        {
            "name": "ResumeUpgrade",
            "description": "Операции по улучшению резюме через AI (v2). Требуется API токен доступа."
        },
        {
            "name": "SavedSearch",
            "description": "Сохраненные поиски вакансий (v2). Требуется API токен доступа."
        },
        {
            "name": "Analyze",
            "description": "AI-анализ вакансий и генерация писем (v2). Требуется API ключ. ⚠️ Платные операции."
        },
        {
            "name": "Search",
            "description": "Поиск вакансий (v2). Требуется API ключ. ✅ Все операции бесплатны."
        },
        {
            "name": "Vacancies",
            "description": "Управление вакансиями пользователя (v2). Требуется API ключ. ✅ Все операции бесплатны."
        },
        {
            "name": "VacancyAnalysis",
            "description": "AI-анализ вакансий (v2). Требуется API ключ. ⚠️ Платные операции."
        }
    ]
}