{"openapi":"3.0.0","paths":{"/v1/oauth/token":{"post":{"description":"OAuth 2.0 Client Credentials. Полученный токен передаётся в заголовке `Authorization: Bearer <access_token>` во всех остальных запросах.","operationId":"AuthController_issueToken","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenRequestDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponseDto"}}}},"401":{"description":"client_id или client_secret не распознаны"}},"summary":"Получить access token","tags":["Аутентификация"]}},"/v1/webhooks/deliveries":{"get":{"operationId":"WebhooksController_listDeliveries","parameters":[{"name":"pa_order_id","required":true,"in":"query","schema":{"example":"PA-ORD-2026-A1B2C3D4","type":"string"}}],"responses":{"200":{"description":""}},"summary":"История доставки вебхуков по поручению","tags":["Вебхуки"]}},"/v1/webhooks/dead-letters":{"get":{"description":"Вебхуки, исчерпавшие все попытки доставки. Требуют ручного разбора или повтора.","operationId":"WebhooksController_listDeadLetters","parameters":[],"responses":{"200":{"description":""}},"summary":"Недоставленные вебхуки (DLQ)","tags":["Вебхуки"]}},"/v1/webhooks/deliveries/{eventId}/replay":{"post":{"operationId":"WebhooksController_replay","parameters":[{"name":"eventId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"202":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"summary":"Повторить доставку вебхука вручную","tags":["Вебхуки"]}},"/v1/orders":{"post":{"description":"Первый шаг интеграции: ЦСО передаёт поручение клиента в работу ПА. Поручение создаётся в статусе DRAFT. Повторный вызов с тем же `order_id` возвращает исходное поручение и не создаёт дубль.","operationId":"OrdersController_create","parameters":[{"name":"Idempotency-Key","in":"header","description":"Уникальный ключ запроса. Ответ кэшируется на 24 часа.","required":true,"schema":{"type":"string","example":"idmp_728_001"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrderDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrderResponseDto"}}}},"404":{"description":"Поручение не найдено","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}},"409":{"description":"Idempotency-Key переиспользован","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}},"422":{"description":"Партнёр не зарегистрирован или не заполнены обязательные для сценария поля","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}}},"security":[{"bearer":[]}],"summary":"Создать поручение","tags":["Поручения"]},"get":{"operationId":"OrdersController_list","parameters":[{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["DRAFT","IN_PROGRESS","PENDING_DOCS","FX_FIXED","AWAITING_PAYMENT","CLIENT_PAID","FX_EXECUTED","PARTNER_PAID","COMPLETED","REJECTED","EXPIRED","REFUND_INITIATED","REFUNDED"]}},{"name":"scenario","required":false,"in":"query","schema":{"type":"string","enum":["INVOICE","PAYMENT_LINK"]}},{"name":"partner_id","required":false,"in":"query","schema":{"example":"PARTNER-777","type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":20,"example":20,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"minimum":0,"default":0,"example":0,"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderListResponseDto"}}}},"404":{"description":"Поручение не найдено","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}}},"security":[{"bearer":[]}],"summary":"Список поручений","tags":["Поручения"]}},"/v1/orders/{paOrderId}":{"get":{"description":"Полное состояние поручения: статус, курс, реквизиты для оплаты, документы.","operationId":"OrdersController_findOne","parameters":[{"name":"paOrderId","required":true,"in":"path","description":"Идентификатор поручения, выданный ПА","schema":{"example":"PA-ORD-2026-A1B2C3D4","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponseDto"}}}},"404":{"description":"Поручение не найдено","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}}},"security":[{"bearer":[]}],"summary":"Получить поручение","tags":["Поручения"]}},"/v1/orders/{paOrderId}/events":{"get":{"description":"Append-only история статусных переходов. Источник истины при разборе инцидентов.","operationId":"OrdersController_listEvents","parameters":[{"name":"paOrderId","required":true,"in":"path","description":"Идентификатор поручения, выданный ПА","schema":{"example":"PA-ORD-2026-A1B2C3D4","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OrderEventDto"}}}}},"404":{"description":"Поручение не найдено","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}}},"security":[{"bearer":[]}],"summary":"Журнал событий поручения","tags":["Поручения"]}},"/v1/orders/{paOrderId}/assign":{"patch":{"description":"DRAFT | PENDING_DOCS -> IN_PROGRESS. Запускает SLA-таймер по дедлайну поручения.","operationId":"OrdersController_assign","parameters":[{"name":"paOrderId","required":true,"in":"path","description":"Идентификатор поручения, выданный ПА","schema":{"example":"PA-ORD-2026-A1B2C3D4","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignOrderDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponseDto"}}}},"404":{"description":"Поручение не найдено","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}},"409":{"description":"Недопустимый переход статуса","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}}},"security":[{"bearer":[]}],"summary":"Взять поручение в работу","tags":["Поручения"]}},"/v1/orders/{paOrderId}/request-docs":{"post":{"description":"IN_PROGRESS -> PENDING_DOCS. ЦСО получает вебхук со списком требуемых документов.","operationId":"OrdersController_requestDocs","parameters":[{"name":"paOrderId","required":true,"in":"path","description":"Идентификатор поручения, выданный ПА","schema":{"example":"PA-ORD-2026-A1B2C3D4","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestDocsDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponseDto"}}}},"404":{"description":"Поручение не найдено","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}}},"security":[{"bearer":[]}],"summary":"Запросить недостающие документы","tags":["Поручения"]}},"/v1/orders/{paOrderId}/documents":{"post":{"description":"Добавляет документ к поручению. Если поручение ждало документы (PENDING_DOCS), оно автоматически возвращается в IN_PROGRESS.","operationId":"OrdersController_attachDocument","parameters":[{"name":"paOrderId","required":true,"in":"path","description":"Идентификатор поручения, выданный ПА","schema":{"example":"PA-ORD-2026-A1B2C3D4","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadDocumentDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponseDto"}}}},"404":{"description":"Поручение не найдено","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}}},"security":[{"bearer":[]}],"summary":"Приложить документ","tags":["Поручения"]}},"/v1/orders/{paOrderId}/payment-details":{"post":{"description":"IN_PROGRESS -> FX_FIXED -> AWAITING_PAYMENT за один вызов. Возвращает рублёвые реквизиты с УИН (или платёжную ссылку), которые ЦСО передаёт клиенту. Курс действует 24 часа: если оплата не поступит, поручение уйдёт в EXPIRED.","operationId":"OrdersController_generatePaymentDetails","parameters":[{"name":"paOrderId","required":true,"in":"path","description":"Идентификатор поручения, выданный ПА","schema":{"example":"PA-ORD-2026-A1B2C3D4","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentDetailsRequestDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponseDto"}}}},"404":{"description":"Поручение не найдено","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}},"422":{"description":"Валюта не поддерживается","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}}},"security":[{"bearer":[]}],"summary":"Зафиксировать курс и выдать реквизиты для оплаты","tags":["Поручения"]}},"/v1/orders/{paOrderId}/complete":{"post":{"description":"PARTNER_PAID -> COMPLETED. Вызывается после подтверждения оказания услуги.","operationId":"OrdersController_complete","parameters":[{"name":"paOrderId","required":true,"in":"path","description":"Идентификатор поручения, выданный ПА","schema":{"example":"PA-ORD-2026-A1B2C3D4","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteOrderDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponseDto"}}}},"404":{"description":"Поручение не найдено","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}}},"security":[{"bearer":[]}],"summary":"Закрыть поручение","tags":["Поручения"]}},"/v1/orders/{paOrderId}/cancel":{"patch":{"description":"Доступно до поступления оплаты клиента. Переводит поручение в REJECTED.","operationId":"OrdersController_cancel","parameters":[{"name":"paOrderId","required":true,"in":"path","description":"Идентификатор поручения, выданный ПА","schema":{"example":"PA-ORD-2026-A1B2C3D4","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelOrderDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponseDto"}}}},"404":{"description":"Поручение не найдено","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}},"409":{"description":"Оплата уже поступила — используйте возврат","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}}},"security":[{"bearer":[]}],"summary":"Отменить поручение","tags":["Поручения"]}},"/v1/orders/{paOrderId}/refund":{"post":{"description":"Доступно после поступления оплаты клиента. Проходит REFUND_INITIATED -> REFUNDED. Порядок учёта курсовой разницы согласуется отдельно.","operationId":"OrdersController_refund","parameters":[{"name":"paOrderId","required":true,"in":"path","description":"Идентификатор поручения, выданный ПА","schema":{"example":"PA-ORD-2026-A1B2C3D4","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefundOrderDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponseDto"}}}},"404":{"description":"Поручение не найдено","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}}},"security":[{"bearer":[]}],"summary":"Инициировать возврат","tags":["Поручения"]}},"/v1/callbacks/bank/statement":{"post":{"description":"Банк присылает строку выписки. ПА сверяет УИН и сумму, переводит поручение в CLIENT_PAID и сразу запускает конвертацию и выплату партнёру. Повторная доставка того же события идемпотентна.","operationId":"CallbacksController_bankStatement","parameters":[{"name":"X-PA-Timestamp","in":"header","description":"Unix-время подписи. Допустимое расхождение — 5 минут.","required":true,"schema":{"type":"string","example":"1785235500"}},{"name":"X-PA-Signature","in":"header","description":"sha256=<hex> — HMAC-SHA256 от строки `${timestamp}.${raw_body}`","required":true,"schema":{"type":"string","example":"sha256=8f7d3a1b2c4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BankStatementCallbackDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponseDto"}}}},"401":{"description":"Подпись не прошла проверку","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}}},"summary":"Поступление рублей от клиента","tags":["Входящие вебхуки"]}},"/v1/callbacks/partner/service-confirmed":{"post":{"description":"PARTNER_PAID -> COMPLETED. Завершающий шаг обоих сценариев.","operationId":"CallbacksController_serviceConfirmed","parameters":[{"name":"X-PA-Timestamp","in":"header","description":"Unix-время подписи. Допустимое расхождение — 5 минут.","required":true,"schema":{"type":"string","example":"1785235500"}},{"name":"X-PA-Signature","in":"header","description":"sha256=<hex> — HMAC-SHA256 от строки `${timestamp}.${raw_body}`","required":true,"schema":{"type":"string","example":"sha256=8f7d3a1b2c4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerServiceConfirmedDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponseDto"}}}},"401":{"description":"Подпись не прошла проверку","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}}},"summary":"Партнёр подтвердил оказание услуги","tags":["Входящие вебхуки"]}},"/v1/callbacks/partner/documents":{"post":{"description":"Ваучер, чек или подтверждение брони. Документ попадает в поручение и в вебхук ЦСО.","operationId":"CallbacksController_attachDocument","parameters":[{"name":"X-PA-Timestamp","in":"header","description":"Unix-время подписи. Допустимое расхождение — 5 минут.","required":true,"schema":{"type":"string","example":"1785235500"}},{"name":"X-PA-Signature","in":"header","description":"sha256=<hex> — HMAC-SHA256 от строки `${timestamp}.${raw_body}`","required":true,"schema":{"type":"string","example":"sha256=8f7d3a1b2c4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerDocumentDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponseDto"}}}},"401":{"description":"Подпись не прошла проверку","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}}},"summary":"Партнёр приложил документ","tags":["Входящие вебхуки"]}},"/v1/sandbox/partners":{"get":{"description":"Идентификаторы партнёров, доступные в sandbox, и поддерживаемые ими сценарии.","operationId":"SandboxController_listPartners","parameters":[],"responses":{"200":{"description":""}},"summary":"Демо-партнёры","tags":["Sandbox"]}},"/v1/sandbox/orders/{paOrderId}/simulate-client-payment":{"post":{"description":"Заменяет вебхук банковской выписки: поручение переходит в CLIENT_PAID, после чего автоматически выполняются конвертация и выплата партнёру. Если сумма не передана, берётся ожидаемая сумма поручения.","operationId":"SandboxController_simulateClientPayment","parameters":[{"name":"paOrderId","required":true,"in":"path","schema":{"example":"PA-ORD-2026-A1B2C3D4","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimulatePaymentDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponseDto"}}}}},"summary":"Сымитировать оплату клиента","tags":["Sandbox"]}},"/v1/sandbox/orders/{paOrderId}/simulate-service-confirmation":{"post":{"description":"Заменяет вебхук партнёра: PARTNER_PAID -> COMPLETED.","operationId":"SandboxController_simulateServiceConfirmation","parameters":[{"name":"paOrderId","required":true,"in":"path","schema":{"example":"PA-ORD-2026-A1B2C3D4","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponseDto"}}}}},"summary":"Сымитировать подтверждение услуги партнёром","tags":["Sandbox"]}},"/v1/sandbox/sign":{"post":{"description":"Возвращает заголовки X-PA-Signature и X-PA-Timestamp для указанного тела и роли отправителя. Нужен, чтобы отладить отправку входящих вебхуков в ПА.","operationId":"SandboxController_signPayload","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignPayloadDto"}}}},"responses":{"200":{"description":""}},"summary":"Подписать произвольное тело","tags":["Sandbox"]}},"/v1/sandbox/webhook-sink":{"post":{"description":"Укажите этот адрес в поле callback_url при создании поручения, чтобы увидеть все события ПА через GET /v1/sandbox/webhook-sink.","operationId":"SandboxController_captureWebhook","parameters":[],"responses":{"200":{"description":""}},"summary":"Приёмник вебхуков для отладки","tags":["Sandbox"]},"get":{"operationId":"SandboxController_listCaptured","parameters":[{"name":"limit","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Показать полученные вебхуки","tags":["Sandbox"]},"delete":{"operationId":"SandboxController_clearCaptured","parameters":[],"responses":{"200":{"description":""}},"summary":"Очистить приёмник вебхуков","tags":["Sandbox"]}},"/v1/health":{"get":{"operationId":"HealthController_check","parameters":[],"responses":{"200":{"description":""}},"summary":"Проверка доступности сервиса","tags":["Служебные"]}},"/v1/admin/auth/login":{"post":{"operationId":"AdminController_login","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminLoginDto"}}}},"responses":{"200":{"description":""}},"summary":"Вход в Ops Admin","tags":["Admin"]}},"/v1/admin/auth/logout":{"post":{"operationId":"AdminController_logout","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"tags":["Admin"]}},"/v1/admin/auth/me":{"get":{"operationId":"AdminController_me","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Admin"]}},"/v1/admin/metrics/overview":{"get":{"operationId":"AdminController_overview","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Admin"]}},"/v1/admin/orders":{"get":{"operationId":"AdminController_listOrders","parameters":[{"name":"status","required":false,"in":"query","schema":{"type":"string"}},{"name":"scenario","required":false,"in":"query","schema":{"type":"string"}},{"name":"partner_id","required":false,"in":"query","schema":{"type":"string"}},{"name":"offset","required":false,"in":"query","schema":{}},{"name":"limit","required":false,"in":"query","schema":{}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Admin"]}},"/v1/admin/orders/{paOrderId}":{"get":{"operationId":"AdminController_getOrder","parameters":[{"name":"paOrderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponseDto"}}}}},"security":[{"bearer":[]}],"tags":["Admin"]}},"/v1/admin/orders/{paOrderId}/events":{"get":{"operationId":"AdminController_orderEvents","parameters":[{"name":"paOrderId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Admin"]}},"/v1/admin/orders/{paOrderId}/assign":{"patch":{"operationId":"AdminController_assign","parameters":[{"name":"paOrderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminActionDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponseDto"}}}}},"security":[{"bearer":[]}],"tags":["Admin"]}},"/v1/admin/orders/{paOrderId}/cancel":{"post":{"operationId":"AdminController_cancel","parameters":[{"name":"paOrderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminActionDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponseDto"}}}}},"security":[{"bearer":[]}],"tags":["Admin"]}},"/v1/admin/orders/{paOrderId}/refund":{"post":{"operationId":"AdminController_refund","parameters":[{"name":"paOrderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminActionDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponseDto"}}}}},"security":[{"bearer":[]}],"tags":["Admin"]}},"/v1/admin/orders/{paOrderId}/payment-details":{"post":{"operationId":"AdminController_paymentDetails","parameters":[{"name":"paOrderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminPaymentDetailsDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Зафиксировать курс и выдать рублёвые реквизиты","tags":["Admin"]}},"/v1/admin/orders/{paOrderId}/request-docs":{"post":{"operationId":"AdminController_requestDocs","parameters":[{"name":"paOrderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminRequestDocsDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Запросить недостающие документы у ЦСО","tags":["Admin"]}},"/v1/admin/orders/{paOrderId}/complete":{"post":{"operationId":"AdminController_complete","parameters":[{"name":"paOrderId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminActionDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderResponseDto"}}}}},"security":[{"bearer":[]}],"summary":"Закрыть поручение после ваучера / подтверждения услуги","tags":["Admin"]}},"/v1/admin/webhooks/dead-letters":{"get":{"operationId":"AdminController_deadLetters","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Admin"]}},"/v1/admin/webhooks/recent":{"get":{"operationId":"AdminController_recentWebhooks","parameters":[{"name":"limit","required":false,"in":"query","schema":{}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Admin"]}},"/v1/admin/webhooks/deliveries/{eventId}/replay":{"post":{"operationId":"AdminController_replay","parameters":[{"name":"eventId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"202":{"description":""}},"security":[{"bearer":[]}],"tags":["Admin"]}},"/v1/admin/partners":{"get":{"operationId":"AdminController_listPartners","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Admin"]}},"/v1/admin/partners/{partnerId}":{"patch":{"operationId":"AdminController_patchPartner","parameters":[{"name":"partnerId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerPatchDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Admin"]}},"/v1/admin/fx/board":{"get":{"operationId":"AdminController_fxBoard","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Доска курсов: база, наценка, эффективный курс","tags":["Admin"]}},"/v1/admin/fx/rates":{"put":{"operationId":"AdminController_setFxRates","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FxRatesPatchDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Массовая установка базовых курсов","tags":["Admin"]}},"/v1/admin/fx/rates/{currency}":{"put":{"operationId":"AdminController_upsertFxRate","parameters":[{"name":"currency","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FxRateUpsertDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Admin"]},"delete":{"operationId":"AdminController_removeFxRate","parameters":[{"name":"currency","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Admin"]}},"/v1/admin/fx/preview":{"get":{"operationId":"AdminController_fxPreview","parameters":[{"name":"amount","required":false,"in":"query","schema":{}},{"name":"currency","required":false,"in":"query","schema":{}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Калькулятор: сумма в валюте → RUB + комиссия","tags":["Admin"]}},"/v1/admin/fx/exposures":{"get":{"operationId":"AdminController_fxExposures","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Открытая FX-позиция: поручения с зафиксированным курсом","tags":["Admin"]}},"/v1/admin/pricing":{"get":{"operationId":"AdminController_getPricing","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"bearer":[]}],"tags":["Admin"]},"patch":{"operationId":"AdminController_patchPricing","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PricingPatchDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"bearer":[]}],"tags":["Admin"]}},"/v1/admin/requisites":{"get":{"operationId":"AdminController_getRequisites","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"bearer":[]}],"tags":["Admin"]},"patch":{"operationId":"AdminController_patchRequisites","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequisitesPatchDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"bearer":[]}],"tags":["Admin"]}},"/v1/admin/rate-limits":{"get":{"operationId":"AdminController_getRateLimits","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Admin"]},"patch":{"operationId":"AdminController_patchRateLimits","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitsPatchDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"bearer":[]}],"tags":["Admin"]}},"/v1/admin/webhook-ops":{"get":{"operationId":"AdminController_getWebhookOps","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"bearer":[]}],"tags":["Admin"]},"patch":{"operationId":"AdminController_patchWebhookOps","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookOpsPatchDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"bearer":[]}],"tags":["Admin"]}},"/v1/admin/api-clients":{"get":{"operationId":"AdminController_listApiClients","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Admin"]}},"/v1/admin/ops-config/audit":{"get":{"operationId":"AdminController_opsConfigAudit","parameters":[{"name":"limit","required":false,"in":"query","schema":{}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Admin"]}},"/v1/admin/flags":{"get":{"operationId":"AdminController_getFlags","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"bearer":[]}],"tags":["Admin"]},"patch":{"operationId":"AdminController_patchFlags","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlagsPatchDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"bearer":[]}],"tags":["Admin"]}},"/v1/admin/flags/audit":{"get":{"operationId":"AdminController_flagsAudit","parameters":[{"name":"limit","required":false,"in":"query","schema":{}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Admin"]}},"/v1/admin/logs":{"get":{"operationId":"AdminController_getLogs","parameters":[{"name":"level","required":false,"in":"query","schema":{"type":"string"}},{"name":"q","required":false,"in":"query","schema":{"type":"string"}},{"name":"pa_order_id","required":false,"in":"query","schema":{"type":"string"}},{"name":"request_id","required":false,"in":"query","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Admin"]},"delete":{"operationId":"AdminController_clearLogs","parameters":[],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"tags":["Admin"]}},"/v1/admin/system":{"get":{"operationId":"AdminController_system","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["Admin"]}}},"info":{"title":"Payment Agent API","description":"\nAPI Платежного Агента (ПА) для оплаты услуг зарубежных партнёров консьерж-сервиса.\n\nПА принимает рубли от клиента на свой расчётный счёт и рассчитывается с зарубежным\nпартнёром в его валюте. Интеграция закрывает два сценария:\n\n- **INVOICE (8.1)** — партнёр выставил инвойс, ПА платит по SWIFT MT103.\n- **PAYMENT_LINK (8.2)** — у партнёра платёжная форма или ссылка, ПА оплачивает\n  иностранной картой на стороне партнёра.\n\n### С чего начать\n\n1. Получите access token: `POST /v1/oauth/token`.\n2. Создайте поручение: `POST /v1/orders` с заголовком `Idempotency-Key`.\n3. Возьмите его в работу и получите рублёвые реквизиты:\n   `PATCH /v1/orders/{id}/assign`, затем `POST /v1/orders/{id}/payment-details`.\n4. Дождитесь событий на свой `callback_url` — от `AWAITING_PAYMENT` до `COMPLETED`.\n\nДля отладки без реального банка используйте контур `/v1/sandbox`: он умеет\nимитировать оплату клиента, подтверждение услуги партнёром и принимать вебхуки.\n\n### Подпись вебхуков\n\nКаждый исходящий вебхук подписан: заголовок `X-PA-Signature: sha256=<hex>` содержит\nHMAC-SHA256 от строки `${X-PA-Timestamp}.${raw_body}`. Проверяйте подпись и\nрасхождение времени не более 5 минут.\n\n### Ошибки\n\nВсе ошибки возвращаются единым телом: `{ \"error\": { \"code\", \"message\", \"details\", \"request_id\", \"timestamp\" } }`.\nОриентируйтесь на `code`, а не на текст сообщения.\n","version":"1.0.0","contact":{}},"tags":[{"name":"Аутентификация","description":"Получение access token"},{"name":"Поручения","description":"Жизненный цикл поручения: от создания до закрытия"},{"name":"Входящие вебхуки","description":"События от банка-нерезидента и партнёров в адрес ПА"},{"name":"Вебхуки","description":"Наблюдаемость доставки исходящих событий"},{"name":"Sandbox","description":"Инструменты отладки интеграции"},{"name":"Служебные","description":"Health-check"}],"servers":[{"url":"https://api.meafdev.ru","description":"Текущее окружение"},{"url":"https://api.meafcoop.com","description":"Production"}],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http","description":"Access token из POST /v1/oauth/token"},"apiKey":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Статический ключ (fallback)"}},"schemas":{"TokenRequestDto":{"type":"object","properties":{"grant_type":{"type":"string","enum":["client_credentials"],"example":"client_credentials"},"client_id":{"type":"string","minLength":1,"example":"cso-sandbox","description":"Идентификатор клиента, выданный ПА"},"client_secret":{"type":"string","minLength":1,"example":"sk_test_51H9xQ2LkNvBcXwZaRtYuIoPq","description":"Секрет клиента"}},"required":["grant_type","client_id","client_secret"]},"TokenResponseDto":{"type":"object","properties":{"access_token":{"type":"string","example":"pat_9f2c1a7b4e5d6f8a0b1c2d3e4f5a6b7c"},"token_type":{"type":"string","example":"Bearer"},"expires_in":{"type":"number","example":3600,"description":"Время жизни токена в секундах"},"scope":{"type":"string","example":"orders:read orders:write"}},"required":["access_token","token_type","expires_in","scope"]},"ApiErrorBody":{"type":"object","properties":{"code":{"type":"string","example":"INVALID_STATUS_TRANSITION","description":"Машиночитаемый код ошибки"},"message":{"type":"string","example":"Переход AWAITING_PAYMENT -> COMPLETED не разрешён статусной моделью"},"details":{"type":"object","description":"Контекст ошибки: список невалидных полей, допустимые статусы и т.п.","additionalProperties":true},"request_id":{"type":"string","example":"req_0f6b2c1e-7d3a-4f21-9a0b-1c2d3e4f5a6b"},"timestamp":{"type":"string","example":"2026-07-28T10:35:00.000Z"}},"required":["code","message","request_id","timestamp"]},"ApiErrorResponse":{"type":"object","properties":{"error":{"$ref":"#/components/schemas/ApiErrorBody"}},"required":["error"]},"OrderClientDto":{"type":"object","properties":{"client_id":{"type":"string","minLength":1,"maxLength":64,"example":"BANK-CLI-998877","description":"Идентификатор клиента на стороне ЦСО"},"name":{"type":"string","maxLength":255,"example":"Иванов Иван Иванович","description":"ФИО клиента. Хранится в зашифрованном виде (AES-256-GCM), в ответах маскируется."},"phone":{"type":"string","maxLength":32,"example":"+79991234455","description":"Телефон клиента. Хранится в зашифрованном виде, в ответах маскируется."}},"required":["client_id"]},"OrderServiceDto":{"type":"object","properties":{"type":{"type":"string","minLength":1,"maxLength":64,"example":"hotel_booking","description":"Тип услуги консьержа"},"country":{"type":"string","pattern":"^[A-Z]{2}$","example":"IT","description":"Страна оказания услуги, ISO 3166-1 alpha-2"},"amount_local":{"type":"number","minimum":1,"example":1500,"description":"Сумма услуги в валюте партнёра"},"currency_local":{"type":"string","pattern":"^[A-Z]{3}$","example":"EUR","description":"Валюта партнёра, ISO 4217"},"partner_id":{"type":"string","minLength":1,"example":"PARTNER-777","description":"Идентификатор партнёра. Для INVOICE может быть новым: тогда передайте блок partner с реквизитами — ПА заведёт карточку."},"meta":{"type":"object","additionalProperties":true,"description":"Произвольные параметры услуги: даты заезда, номер рейса, состав брони","example":{"check_in":"2026-08-15","check_out":"2026-08-20","guests":2}}},"required":["type","country","amount_local","currency_local","partner_id"]},"OrderInvoiceDto":{"type":"object","properties":{"invoice_id":{"type":"string","minLength":1,"example":"INV-P-001"},"file_url":{"type":"string","format":"uri","example":"https://cso.bank.ru/docs/inv001.pdf"},"file_hash_sha256":{"type":"string","pattern":"^[a-fA-F0-9]{64}$","example":"a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90","description":"SHA-256 файла инвойса для контроля целостности"},"due_date":{"type":"string","example":"2026-08-01"}},"required":["invoice_id","file_url"]},"PartnerDetailsDto":{"type":"object","properties":{"legal_name":{"type":"string","minLength":1,"maxLength":255,"example":"Grand Hotel Roma S.r.l.","description":"Юридическое / торговое имя"},"iban":{"type":"string","minLength":15,"maxLength":34,"example":"DE89370400440532013000","description":"IBAN для SWIFT-выплаты"},"swift_bic":{"type":"string","minLength":8,"maxLength":11,"example":"COBADEFFXXX","description":"SWIFT/BIC"},"country":{"type":"string","pattern":"^[A-Z]{2}$","example":"IT","description":"Страна партнёра, ISO 3166-1 alpha-2. Если не передана — берётся service.country"},"webhook_url":{"type":"string","format":"uri","example":"https://partner-777.example.com/v1/pa/webhook","description":"Опциональный webhook партнёра"}},"required":["legal_name","iban","swift_bic"]},"CreateOrderDto":{"type":"object","properties":{"order_id":{"type":"string","minLength":3,"maxLength":64,"example":"CSO-2026-728-88421","description":"Номер поручения на стороне ЦСО"},"scenario":{"enum":["INVOICE","PAYMENT_LINK"],"type":"string","example":"INVOICE","description":"INVOICE — партнёр выставил инвойс, оплата уходит по SWIFT (сценарий 8.1). PAYMENT_LINK — оплата на платёжной форме партнёра (сценарий 8.2)."},"client":{"$ref":"#/components/schemas/OrderClientDto"},"service":{"$ref":"#/components/schemas/OrderServiceDto"},"invoice":{"description":"Обязателен для сценария INVOICE.","allOf":[{"$ref":"#/components/schemas/OrderInvoiceDto"}]},"partner":{"description":"Реквизиты получателя для сценария INVOICE. Если partner_id неизвестен ПА — партнёр создаётся автоматически. Если партнёр уже есть — реквизиты обновляются.","allOf":[{"$ref":"#/components/schemas/PartnerDetailsDto"}]},"payment_link":{"type":"string","format":"uri","example":"https://partner-301.example.com/pay/8f3a2b1c","description":"Ссылка на платёжную форму партнёра. Обязательна для сценария PAYMENT_LINK."},"deadline":{"type":"string","example":"2026-07-29T12:00:00Z","description":"Крайний срок исполнения поручения"},"callback_url":{"type":"string","format":"uri","example":"https://cso.bank.ru/webhook/pa-events","description":"Адрес, на который ПА отправляет события по поручению"}},"required":["order_id","scenario","client","service","deadline","callback_url"]},"CreateOrderResponseDto":{"type":"object","properties":{"pa_order_id":{"type":"string","example":"PA-ORD-2026-A1B2C3D4"},"status":{"enum":["DRAFT","IN_PROGRESS","PENDING_DOCS","FX_FIXED","AWAITING_PAYMENT","CLIENT_PAID","FX_EXECUTED","PARTNER_PAID","COMPLETED","REJECTED","EXPIRED","REFUND_INITIATED","REFUNDED"],"type":"string","example":"DRAFT"},"created_at":{"type":"string","example":"2026-07-28T10:30:00.000Z"},"expires_at":{"type":"string","example":"2026-07-29T10:30:00.000Z"}},"required":["pa_order_id","status","created_at","expires_at"]},"OrderClientViewDto":{"type":"object","properties":{"client_id":{"type":"string","example":"BANK-CLI-998877"},"name_masked":{"type":"string","example":"Иванов И.И."},"phone_masked":{"type":"string","example":"+7 *** *** 44 55"}},"required":["client_id"]},"OrderServiceViewDto":{"type":"object","properties":{"type":{"type":"string","example":"hotel_booking"},"country":{"type":"string","example":"IT"},"partner_id":{"type":"string","example":"PARTNER-777"},"meta":{"type":"object","additionalProperties":true,"example":{"check_in":"2026-08-15","check_out":"2026-08-20"}}},"required":["type","country","partner_id"]},"OrderFxDto":{"type":"object","properties":{"rate":{"type":"number","example":97.35,"description":"Курс валюта -> RUB с наценкой ПА"},"fixed_at":{"type":"string","example":"2026-07-28T10:35:00.000Z"},"expires_at":{"type":"string","example":"2026-07-29T10:35:00.000Z","description":"После этого момента курс недействителен, поручение уходит в EXPIRED"}},"required":["rate","fixed_at","expires_at"]},"PaymentDetailsDto":{"type":"object","properties":{"type":{"type":"string","enum":["bank_transfer","payment_link"],"example":"bank_transfer"},"recipient_name":{"type":"string","example":"ООО \"Платежный Агент\""},"inn":{"type":"string","example":"7701234567"},"account":{"type":"string","example":"40702810100000001234"},"bank_bik":{"type":"string","example":"044525225"},"bank_name":{"type":"string","example":"ПАО СБЕРБАНК"},"purpose":{"type":"string","example":"Оплата по поручению CSO-2026-728-88421. НДС не облагается."},"uin":{"type":"string","example":"CSO72888421","description":"УИН. Обязателен в назначении платежа — по нему идёт автосверка выписки."},"url":{"type":"string","example":"http://localhost:3000/pay/PA-ORD-2026-A1B2C3D4?uin=CSO72888421","description":"Платёжная ссылка, если запрошен тип payment_link"},"received_at":{"type":"string","example":"2026-07-28T11:05:00.000Z"},"amount_received_rub":{"type":"number","example":146025}},"required":["type","recipient_name","inn","account","bank_bik","bank_name","purpose","uin"]},"PaymentOutDto":{"type":"object","properties":{"type":{"type":"string","enum":["swift","card"],"example":"swift"},"swift_ref":{"type":"string","example":"SWIFT-2026-ABCD1234"},"iban_to":{"type":"string","example":"DE89370400440532013000"},"partner_payment_url":{"type":"string","example":"https://partner-301.example.com/pay/8f3a2b1c","description":"Форма партнёра, на которой прошла оплата (сценарий 8.2)"},"amount_sent":{"type":"number","example":1500},"currency_sent":{"type":"string","example":"EUR"},"fee":{"type":"number","example":35,"description":"Комиссия банка-корреспондента"},"value_date":{"type":"string","example":"2026-07-29"},"receipt_url":{"type":"string","example":"https://pa-docs.example.com/swift/SWIFT-2026-ABCD1234.pdf"},"auth_code":{"type":"string","example":"482913","description":"Код авторизации карты (сценарий 8.2)"}},"required":["type"]},"OrderCommissionDto":{"type":"object","properties":{"rate_percent":{"type":"number","example":2.5},"amount_rub":{"type":"number","example":3650.63},"vat_included":{"type":"boolean","example":false}},"required":["rate_percent","amount_rub","vat_included"]},"OrderDocumentDto":{"type":"object","properties":{"id":{"type":"string","example":"doc_3f9a1c2b8d7e6f50"},"document_type":{"enum":["INVOICE","ADDITIONAL_CONTRACT","PASSPORT","SWIFT_CONFIRMATION","PAYMENT_RECEIPT","SERVICE_VOUCHER","OTHER"],"type":"string","example":"INVOICE"},"file_name":{"type":"string","example":"inv001.pdf"},"url":{"type":"string","example":"https://cso.bank.ru/docs/inv001.pdf"},"sha256":{"type":"string","example":"a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90"},"uploaded_by":{"type":"string","example":"cso:cso-sandbox"},"created_at":{"type":"string","example":"2026-07-28T10:30:00.000Z"}},"required":["id","document_type","file_name","url","uploaded_by","created_at"]},"OrderResponseDto":{"type":"object","properties":{"pa_order_id":{"type":"string","example":"PA-ORD-2026-A1B2C3D4"},"cso_order_id":{"type":"string","example":"CSO-2026-728-88421"},"scenario":{"enum":["INVOICE","PAYMENT_LINK"],"type":"string","example":"INVOICE"},"status":{"enum":["DRAFT","IN_PROGRESS","PENDING_DOCS","FX_FIXED","AWAITING_PAYMENT","CLIENT_PAID","FX_EXECUTED","PARTNER_PAID","COMPLETED","REJECTED","EXPIRED","REFUND_INITIATED","REFUNDED"],"type":"string","example":"AWAITING_PAYMENT"},"client":{"$ref":"#/components/schemas/OrderClientViewDto"},"service":{"$ref":"#/components/schemas/OrderServiceViewDto"},"amount_local":{"type":"number","example":1500},"currency_local":{"type":"string","example":"EUR"},"fx":{"$ref":"#/components/schemas/OrderFxDto"},"amount_rub":{"type":"number","example":146025,"description":"Сумма к оплате клиентом в рублях"},"payment_details":{"$ref":"#/components/schemas/PaymentDetailsDto"},"payment_out":{"$ref":"#/components/schemas/PaymentOutDto"},"commission":{"$ref":"#/components/schemas/OrderCommissionDto"},"documents":{"type":"array","items":{"$ref":"#/components/schemas/OrderDocumentDto"}},"requested_documents":{"example":["passport_scan"],"description":"Запрошенные ПА документы","type":"array","items":{"type":"string"}},"rejection_reason":{"type":"string","example":"Клиент отказался от брони"},"deadline":{"type":"string","example":"2026-07-29T12:00:00.000Z"},"expires_at":{"type":"string","example":"2026-07-29T10:30:00.000Z"},"created_at":{"type":"string","example":"2026-07-28T10:30:00.000Z"},"updated_at":{"type":"string","example":"2026-07-28T10:35:00.000Z"}},"required":["pa_order_id","cso_order_id","scenario","status","client","service","amount_local","currency_local","documents","deadline","expires_at","created_at","updated_at"]},"OrderListResponseDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/OrderResponseDto"}},"total":{"type":"number","example":42},"limit":{"type":"number","example":20},"offset":{"type":"number","example":0}},"required":["items","total","limit","offset"]},"OrderEventDto":{"type":"object","properties":{"event_id":{"type":"string","example":"evt_a1b2c3d4e5f60718"},"event_type":{"type":"string","example":"order.status_changed"},"status_from":{"enum":["DRAFT","IN_PROGRESS","PENDING_DOCS","FX_FIXED","AWAITING_PAYMENT","CLIENT_PAID","FX_EXECUTED","PARTNER_PAID","COMPLETED","REJECTED","EXPIRED","REFUND_INITIATED","REFUNDED"],"type":"string","example":"FX_FIXED"},"status_to":{"enum":["DRAFT","IN_PROGRESS","PENDING_DOCS","FX_FIXED","AWAITING_PAYMENT","CLIENT_PAID","FX_EXECUTED","PARTNER_PAID","COMPLETED","REJECTED","EXPIRED","REFUND_INITIATED","REFUNDED"],"type":"string","example":"AWAITING_PAYMENT"},"actor":{"type":"string","example":"cso:cso-sandbox"},"payload":{"type":"object","additionalProperties":true},"created_at":{"type":"string","example":"2026-07-28T10:35:00.000Z"}},"required":["event_id","event_type","actor","created_at"]},"AssignOrderDto":{"type":"object","properties":{"assignee":{"type":"string","maxLength":64,"example":"operator-14","description":"Кто берёт поручение в работу. По умолчанию — идентификатор вызывающего клиента."}}},"RequestDocsDto":{"type":"object","properties":{"required_documents":{"minItems":1,"example":["passport_scan","booking_confirmation"],"description":"Список недостающих документов","type":"array","items":{"type":"string"}},"comment":{"type":"string","maxLength":1000,"example":"Нужен разворот паспорта гостя для брони"}},"required":["required_documents"]},"UploadDocumentDto":{"type":"object","properties":{"document_type":{"enum":["INVOICE","ADDITIONAL_CONTRACT","PASSPORT","SWIFT_CONFIRMATION","PAYMENT_RECEIPT","SERVICE_VOUCHER","OTHER"],"type":"string","example":"ADDITIONAL_CONTRACT"},"file_name":{"type":"string","minLength":1,"maxLength":255,"example":"dogovor.pdf"},"file_url":{"type":"string","format":"uri","example":"https://cso.bank.ru/docs/dogovor.pdf"},"sha256":{"type":"string","pattern":"^[a-fA-F0-9]{64}$","example":"d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3"}},"required":["document_type","file_name","file_url"]},"PaymentDetailsRequestDto":{"type":"object","properties":{"type":{"enum":["bank_transfer","payment_link"],"type":"string","description":"Способ приёма рублей от клиента. По умолчанию bank_transfer для INVOICE и payment_link для PAYMENT_LINK."}}},"CompleteOrderDto":{"type":"object","properties":{"comment":{"type":"string","maxLength":500,"example":"Услуга оказана, ваучер выдан"}}},"CancelOrderDto":{"type":"object","properties":{"reason":{"type":"string","minLength":3,"maxLength":500,"example":"Клиент отказался от брони"}},"required":["reason"]},"RefundOrderDto":{"type":"object","properties":{"reason":{"type":"string","minLength":3,"maxLength":500,"example":"Партнёр не смог оказать услугу"}},"required":["reason"]},"BankStatementCallbackDto":{"type":"object","properties":{"uin":{"type":"string","minLength":1,"maxLength":25,"example":"CSO72888421","description":"УИН из назначения платежа"},"amount_rub":{"type":"number","minimum":1,"example":146025,"description":"Сумма поступления в рублях"},"received_at":{"type":"string","example":"2026-07-28T11:05:00Z"},"statement_ref":{"type":"string","example":"ST-2026-07-28-0001","description":"Идентификатор строки выписки"}},"required":["uin","amount_rub"]},"PartnerServiceConfirmedDto":{"type":"object","properties":{"pa_order_id":{"type":"string","minLength":1,"example":"PA-ORD-2026-A1B2C3D4"},"comment":{"type":"string","maxLength":500,"example":"Бронь подтверждена, ваучер отправлен гостю"}},"required":["pa_order_id"]},"PartnerDocumentDto":{"type":"object","properties":{"pa_order_id":{"type":"string","minLength":1,"example":"PA-ORD-2026-A1B2C3D4"},"document_type":{"enum":["INVOICE","ADDITIONAL_CONTRACT","PASSPORT","SWIFT_CONFIRMATION","PAYMENT_RECEIPT","SERVICE_VOUCHER","OTHER"],"type":"string","example":"SERVICE_VOUCHER"},"file_name":{"type":"string","minLength":1,"example":"voucher-88421.pdf"},"file_url":{"type":"string","format":"uri","example":"https://partner-777.example.com/docs/voucher-88421.pdf"},"sha256":{"type":"string","pattern":"^[a-fA-F0-9]{64}$","example":"d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3"}},"required":["pa_order_id","document_type","file_name","file_url"]},"SimulatePaymentDto":{"type":"object","properties":{"amount_rub":{"type":"number","minimum":1,"example":146025,"description":"Сумма поступления. По умолчанию — ожидаемая сумма поручения в рублях."}}},"SignPayloadDto":{"type":"object","properties":{"source":{"enum":["bank","partner"],"type":"string","example":"bank"},"body":{"type":"object","additionalProperties":true,"description":"Тело запроса, которое будет подписано","example":{"uin":"CSO72888421","amount_rub":146025}}},"required":["source","body"]},"AdminLoginDto":{"type":"object","properties":{}},"AdminActionDto":{"type":"object","properties":{}},"AdminPaymentDetailsDto":{"type":"object","properties":{}},"AdminRequestDocsDto":{"type":"object","properties":{}},"PartnerPatchDto":{"type":"object","properties":{}},"FxRatesPatchDto":{"type":"object","properties":{}},"FxRateUpsertDto":{"type":"object","properties":{}},"PricingPatchDto":{"type":"object","properties":{}},"RequisitesPatchDto":{"type":"object","properties":{}},"RateLimitsPatchDto":{"type":"object","properties":{}},"WebhookOpsPatchDto":{"type":"object","properties":{}},"FlagsPatchDto":{"type":"object","properties":{}}}}}