> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# Отправка транзакции через SDK: KYT на стороне клиента

> Отправка транзакции с устройства пользователя через токен SDK в Didit: автоанализ устройства и action_required для владения кошельком.



Промпт API отправки транзакции (SDK token)
        Скопировать промпт в буфер обмена



      
      

\<pre>

\`Submit a monitored transaction from an end-user device using a scoped SDK token instead of an API key. This is the wire endpoint behind the Didit SDKs' submitTransaction methods - call it directly only when not using an SDK.

Endpoint:
POST https://verification.didit.me/v1/transactions/

Authentication:
X-Transaction-Token header carrying an sdk_token minted by your backend via POST /v3/transactions/sdk-token/. No API key on the device, ever.

Payload (camelCase wire shape - each field maps onto its POST /v3/transactions/ equivalent):
\{
"txnId": "wd-2026-07-07-0042",              // -> transaction_id (required)
"type": "travelRule",                        // -> transaction_category (required)
"info": {                                    // -> transaction_details (required)
"direction": "out", "amount": "0.25", "currency": "ETH",
"currencyType": "crypto", "cryptoParams": {"crypto_chain": "ETH"}   // -> currency_kind, crypto_params
},
"subject": { "fullName": "Jane Doe" },       // externalUserId is IGNORED - identity comes from the token
"counterparty": {
"fullName": "Ana Diaz",
"paymentMethod": {"type": "unhosted_wallet", "accountId": "0x8ba1f109551bD432803012645Ac136ddd64DBA72"}  // type -> method_type; declares a self-hosted wallet
},
"travelRule": {                              // -> travel_rule_details
"status": "AWAITING_COUNTERPARTY",         // required (400 if missing); ignored when Travel Rule is enabled
"beneficiaryData": {"wallet_address": "0x8ba1f109551bD432803012645Ac136ddd64DBA72", "name": "Ana Diaz"}
},
"props": { "channel": "mobile_app" },        // -> custom_properties
"includeCryptoScreening": true
}

Three things are always decided by the token, never the payload:
\- the application the transaction is created under
\- the subject identity (token's vendor_data)
\- server-derived device context (IP, user agent) - it wins on conflict.

What to read from the response (same snake_case detail as /v3/, plus):
\- status - APPROVED | IN_REVIEW | DECLINED | AWAITING_USER.
\- travel_rule.status - the Travel Rule exchange state, when applicable.
\- action_required - when the end user must act: type "wallet_ownership" (open the url in a real browser, never a webview) or "verification_session" (launch with your Didit verification integration). null when nothing is pending.

Failure modes:
\- 401 - token missing, unknown, revoked, over max_uses, or expired ("expired" appears in the detail for expired tokens).
\- 400 - validation errors, with per-field details keyed by the canonical field names (a missing info.currency is reported as {"transaction_details": {"currency": [...]}}), including a txnId that already exists.
\- 409 - a concurrent request with the same txnId was created first.

Afterwards:
\- Re-read with GET /v1/transactions/{transaction_id}/ (same token) after the user completes an action.
\- Your backend also receives transaction.created / transaction.status.updated webhooks with the same action_required block.

Full guide: /transaction-monitoring/sdk-transaction-submission.`

\</pre>



      
      

Вставьте в



## OpenAPI

````yaml ru/openapi-25.json POST /v1/transactions/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: >-
    API верификации личности. Аутентификация выполняется с помощью заголовка
    x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v1/transactions/:
    post:
      tags:
        - Transactions
      summary: Отправить транзакцию из SDK
      description: >-
        Endpoint, предназначенный для вызова с устройства, который Didit SDK
        вызывают для отправки транзакции напрямую с устройства конечного
        пользователя. Аутентификация выполняется с помощью токена с ограниченной
        областью действия из `POST /v3/transactions/sdk-token/`, передаваемого в
        заголовке `X-Transaction-Token` вместо API-ключа; endpoint поддерживает
        CORS, поэтому браузеры могут вызывать его кросс-доменно. В payload
        используются псевдонимы в camelCase, приведённые ниже (методы SDK
        `submitTransaction` формируют его автоматически). Три гарантии на
        стороне сервера: приложение всегда берётся из токена; идентификатор
        субъекта (`externalUserId`) всегда принудительно устанавливается из
        `vendor_data` токена, поэтому поддельные значения payload игнорируются;
        аналитические данные устройства (отпечаток устройства от SDK плюс
        полученные сервером IP-адрес и user agent) привязываются к субъекту
        автоматически.
      operationId: submitTransactionFromSdk
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                txnId:
                  type: string
                  description: >-
                    Ваш уникальный идентификатор этой транзакции (сопоставляется
                    с `transaction_id`, не более 128 символов).
                  example: wd-2026-07-07-0042
                txnDate:
                  type: string
                  format: date-time
                  description: >-
                    Когда произошла транзакция (соответствует `transaction_at`).
                    По умолчанию текущее время, если значение не указано.
                zoneId:
                  type: string
                  description: >-
                    Идентификатор часового пояса IANA (сопоставляется с
                    `time_zone`), например `Europe/Madrid`.
                type:
                  type: string
                  description: >-
                    Категория транзакции (сопоставляется с
                    `transaction_category`), например `finance`, `kyc`,
                    `travelRule`, `userPlatformEvent`, `gamblingBet`.
                  example: travelRule
                info:
                  type: object
                  description: >-
                    Основные финансовые реквизиты транзакции (сопоставляются с
                    `transaction_details`).
                  required:
                    - direction
                    - amount
                    - currency
                  properties:
                    direction:
                      type: string
                      description: >-
                        Направление относительно субъекта. Регистронезависимо;
                        `in`/`out` принимаются в качестве псевдонимов.
                        Возвращается в верхнем регистре (`INBOUND`/`OUTBOUND`).
                      example: out
                    amount:
                      type: number
                      description: >-
                        Сумма транзакции (до 18 знаков после запятой). Также
                        принимается десятичная строка, и это единственный способ
                        сохранить более ~15 значащих цифр: число JSON сначала
                        парсится как двоичное число с плавающей запятой, поэтому
                        `0.123456789012345678` сохраняется как
                        `0.12345678901234568`.
                      example: 0.25
                    currency:
                      type: string
                      description: >-
                        Код валюты. Принимается любой буквенный код ISO 4217
                        (например, `EUR`, `USD`, `NGN`), а также символ
                        криптоактива (например, `BTC`). Предпочтительно
                        использовать находящийся в обращении код. Не для каждого
                        принятого кода доступен обменный курс: если для кода
                        курс отсутствует (например, расчетная единица ISO `XSU`
                        или символ криптовалюты, для которого Didit не
                        рассчитывает цену), автоматическая конвертация
                        завершается ошибкой и `preferred_currency_amount`
                        возвращается со значением null, если только в запросе не
                        был передан предварительно сконвертированный
                        `amountInDefaultCurrency`.
                      example: ETH
                    currencyType:
                      type: string
                      description: >-
                        Является ли валюта `fiat` или `crypto` (сопоставляется с
                        `currency_kind`).
                    amountInDefaultCurrency:
                      type: number
                      nullable: true
                      description: >-
                        Предварительно сконвертированная сумма в валюте по
                        умолчанию (сопоставляется с
                        `amount_in_default_currency`). Если поле опущено,
                        предпринимается попытка автоматической конвертации валют
                        (FX).
                    defaultCurrencyCode:
                      type: string
                      description: >-
                        Код валюты по умолчанию для сконвертированной суммы
                        (сопоставляется с `default_currency`). Любой находящийся
                        в обращении код ISO 4217.
                    paymentDetails:
                      type: string
                      nullable: true
                      description: >-
                        Назначение платежа или примечание в виде произвольного
                        текста (сопоставляется с `payment_details`).
                    paymentTxnId:
                      type: string
                      nullable: true
                      description: >-
                        Внешний идентификатор платежа (соответствует
                        `payment_reference_id`); ончейн-хэш транзакции для
                        криптовалютных транзакций.
                    type:
                      type: string
                      nullable: true
                      description: >-
                        Подтип транзакции (сопоставляется с `action_type`),
                        например `deposit`, `withdrawal`, `transfer`.
                    cryptoParams:
                      type: object
                      description: >-
                        Параметры, специфичные для криптовалюты, например
                        `{"crypto_chain": "ETH"}`.
                subject:
                  type: object
                  description: >-
                    Субъект (заявитель) транзакции. `externalUserId` здесь
                    игнорируется: личность субъекта всегда определяется на
                    основе `vendor_data` token.
                  required:
                    - fullName
                  properties:
                    type:
                      type: string
                      description: >-
                        Тип сущности (сопоставляется с `entity_type`):
                        `individual` (по умолчанию) или `company`.
                    externalUserId:
                      type: string
                      description: >-
                        Игнорируется для субъекта - применяется на стороне
                        сервера из `vendor_data` токена.
                    fullName:
                      type: string
                      example: Jane Doe
                    firstName:
                      type: string
                    lastName:
                      type: string
                    dob:
                      type: string
                      format: date
                      description: >-
                        Дата рождения (ГГГГ-ММ-ДД; соответствует
                        `date_of_birth`).
                    address:
                      type: object
                      description: >-
                        Объект адреса с `country` (ISO 3166-1 alpha-3), `town`,
                        `state`, `street`, `post_code`.
                    institutionInfo:
                      type: object
                      description: >-
                        Сведения об учреждении для институциональных участников
                        (соответствуют `institution_details`).
                    device:
                      type: object
                      description: >-
                        Необязательный явный контекст устройства. Объединяется с
                        автоматически собранными данными об устройстве; при
                        конфликте приоритет имеют поля, полученные сервером.
                    paymentMethod:
                      type: object
                      description: >-
                        Способ оплаты, используемый субъектом (сопоставляется с
                        `payment_method`).
                      properties:
                        type:
                          type: string
                          description: >-
                            Тип способа оплаты (сопоставляется с `method_type`),
                            например `bank_card`, `bank_account`,
                            `crypto_wallet`, `ewallet`, `unhosted_wallet`,
                            `other`.
                        accountId:
                          type: string
                          description: >-
                            Идентификатор счёта (соответствует `account_id`):
                            IBAN, цифровой отпечаток карты или адрес.
                        issuingCountry:
                          type: string
                          description: >-
                            Код страны эмитента по стандарту ISO 3166-1 alpha-3
                            (сопоставляется с `issuing_country`).
                counterparty:
                  type: object
                  description: >-
                    Контрагент транзакции (необязательно). Та же структура, что
                    и у `subject`; поле `externalUserId` имеет здесь значение.
                  properties:
                    type:
                      type: string
                      description: >-
                        Тип сущности (сопоставляется с `entity_type`):
                        `individual` или `company`.
                    externalUserId:
                      type: string
                      description: >-
                        Ваш внутренний идентификатор контрагента (сопоставляется
                        с `vendor_data`).
                    fullName:
                      type: string
                    firstName:
                      type: string
                    lastName:
                      type: string
                    dob:
                      type: string
                      format: date
                    address:
                      type: object
                    institutionInfo:
                      type: object
                    device:
                      type: object
                    paymentMethod:
                      type: object
                      description: >-
                        Способ оплаты, используемый контрагентом (сопоставляется
                        с `payment_method`). В транзакциях travelRule значение
                        `type: "unhosted_wallet"` объявляет кошелёк контрагента
                        некастодиальным: перевод пропускает маршрутизацию к VASP
                        контрагента, создаётся напрямую со статусом
                        `UNCONFIRMED_OWNERSHIP`, и (если включён
                        `auto_wallet_verification`) автоматически создаётся
                        сессия виджета подтверждения владения кошельком,
                        возвращаемая в `action_required` для запуска через SDK.
                      properties:
                        type:
                          type: string
                          description: >-
                            Тип способа оплаты (сопоставляется с `method_type`),
                            например `bank_card`, `bank_account`,
                            `crypto_wallet`, `ewallet`, `unhosted_wallet`,
                            `other`. Используйте `unhosted_wallet`, чтобы
                            объявить некастодиальный кошелёк для Travel Rule.
                        accountId:
                          type: string
                          description: >-
                            Идентификатор счёта (соответствует `account_id`):
                            IBAN, цифровой отпечаток карты или адрес.
                        issuingCountry:
                          type: string
                props:
                  type: object
                  additionalProperties: true
                  description: >-
                    Пользовательские пары «ключ-значение» (сопоставляются с
                    `custom_properties`). Каждый ключ можно использовать в
                    условиях правил как `custom_values.<key>`.
                travelRule:
                  type: object
                  description: >-
                    Детали Travel Rule (сопоставляется с `travel_rule_details`).
                    Когда Travel Rule включён для приложения, Didit игнорирует
                    любой отправленный вами `status` и управляет обменом
                    самостоятельно.
                  required:
                    - status
                  properties:
                    status:
                      type: string
                    protocol:
                      type: string
                    required:
                      type: boolean
                    obligationsCount:
                      type: integer
                    originatorData:
                      type: object
                    beneficiaryData:
                      type: object
                    metadata:
                      type: object
                includeCryptoScreening:
                  type: boolean
                  nullable: true
                  description: >-
                    Переопределение для конкретной транзакции для скрининга
                    криптовалютной блокчейн-аналитики (сопоставляется с
                    `include_crypto_screening`).
                fingerprint_v2:
                  type: object
                  description: >-
                    payload цифрового отпечатка устройства `didit-fp-v2`.
                    Внедряется SDK автоматически; актуально только при прямом
                    вызове wire API.
              required:
                - txnId
                - type
                - info
                - subject
            example:
              txnId: wd-2026-07-07-0042
              type: travelRule
              info:
                direction: out
                amount: '0.25'
                currency: ETH
                currencyType: crypto
                cryptoParams:
                  crypto_chain: ETH
              subject:
                fullName: Jane Doe
              counterparty:
                fullName: Ana Diaz
                paymentMethod:
                  type: unhosted_wallet
                  accountId: 0xBeneficiaryWallet01
              travelRule:
                status: AWAITING_COUNTERPARTY
                beneficiaryData:
                  wallet_address: 0xBeneficiaryWallet01
                  name: Ana Diaz
              includeCryptoScreening: true
      responses:
        '201':
          description: >-
            Транзакция отправлена и поставлена на мониторинг. Формат данных
            совпадает с `GET /v3/transactions/{transaction_id}/`, включая блок
            `action_required`, когда конечный пользователь должен выполнить
            дополнительное действие (SDK запускают его автоматически по
            умолчанию).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransactionDetail'
              examples:
                Wallet ownership required:
                  value:
                    uuid: 22222222-3333-4444-5555-666666666666
                    txn_id: wd-2026-07-07-0042
                    transaction_type: travelRule
                    direction: OUTBOUND
                    status: APPROVED
                    amount: '0.25'
                    currency: ETH
                    travel_rule:
                      uuid: 33333333-4444-5555-6666-777777777777
                      status: UNCONFIRMED_OWNERSHIP
                      required: true
                    action_required:
                      type: wallet_ownership
                      url: https://verify.didit.me/wallet-ownership/3s9x...urlsafe
                      widget_session_id: 77777777-8888-9999-aaaa-bbbbbbbbbbbb
                      expires_at: '2026-07-07T13:00:00Z'
        '400':
          description: >-
            Ошибка валидации (отсутствуют обязательные поля, дубликат `txnId`,
            неизвестная категория).
          content:
            application/json:
              examples:
                Missing fields:
                  value:
                    transaction_details:
                      currency:
                        - This field is required.
                Duplicate txnId:
                  value:
                    transaction_id:
                      - A transaction with this transaction_id already exists.
        '401':
          description: >-
            Токен транзакции был отклонен: отсутствует, неизвестен, отозван,
            превысил `max_uses` или его срок действия истек. Ответы с истекшим
            сроком действия токена всегда содержат слово `expired` в описании
            ошибки (detail), с помощью чего SDK отличают ошибки `expired_token`
            от `invalid_token`.
          content:
            application/json:
              examples:
                Invalid token:
                  value:
                    detail: Invalid transaction token.
                Expired token:
                  value:
                    detail: Transaction token expired.
        '409':
          description: >-
            Другой запрос с тем же `txnId` создал транзакцию во время обработки
            этого запроса, поэтому успешным оказывается только один из двух
            одновременных запросов. Прочитайте существующую транзакцию вместо
            повторной отправки.
          content:
            application/json:
              examples:
                Concurrent duplicate:
                  value:
                    detail: A transaction with this transaction_id already exists.
      security:
        - TransactionTokenAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST https://verification.didit.me/v1/transactions/ \
              -H 'X-Transaction-Token: SDK_TOKEN' -H 'Content-Type: application/json' \
              -d '{"txnId": "wd-2026-07-07-0042", "type": "travelRule", "info": {"direction": "out", "amount": "0.25", "currency": "ETH", "currencyType": "crypto"}, "subject": {"fullName": "Jane Doe"}, "counterparty": {"fullName": "Ana Diaz", "paymentMethod": {"type": "unhosted_wallet", "accountId": "0xBeneficiaryWallet01"}}, "travelRule": {"status": "AWAITING_COUNTERPARTY", "beneficiaryData": {"wallet_address": "0xBeneficiaryWallet01", "name": "Ana Diaz"}}, "includeCryptoScreening": true}'
        - lang: javascript
          label: Web SDK
          source: |-
            import { DiditSdk } from '@didit-protocol/sdk-web';

            const result = await DiditSdk.shared.submitTransaction({
              transactionToken: sdkToken,
              transaction: {
                txnId: 'wd-2026-07-07-0042',
                category: 'travelRule',
                details: { direction: 'out', amount: '0.25', currency: 'ETH', currencyType: 'crypto' },
                subject: { fullName: 'Jane Doe' },
                counterparty: { fullName: 'Ana Diaz', paymentMethod: { type: 'unhosted_wallet', accountId: '0xBeneficiaryWallet01' } },
                travelRule: { status: 'AWAITING_COUNTERPARTY', beneficiaryData: { wallet_address: '0xBeneficiaryWallet01', name: 'Ana Diaz' } },
                includeCryptoScreening: true
              },
              onActionCompleted: (refreshed) => console.log(refreshed.status)
            });
components:
  schemas:
    TransactionDetail:
      type: object
      description: >-
        Полная запись мониторинга для одной транзакции, возвращаемая `GET
        /v3/transactions/{transaction_id}/` и `POST /v3/transactions/`.
      properties:
        uuid:
          type: string
          format: uuid
          description: >-
            Стабильный идентификатор транзакции Didit. Используйте как
            `{transaction_id}` для последующих вызовов.
        environment:
          type: string
          enum:
            - live
            - sandbox
          description: >-
            Среда приложения, которому принадлежит транзакция. Транзакция в
            `sandbox` сохраняется, но никогда не оценивается, не проверяется
            скринингом, по ней не отправляются уведомления и не взимается плата,
            поэтому пустое значение `rule_runs` означает «не оценивалась».
        transaction_number:
          type: integer
          description: >-
            Порядковый номер транзакции в рамках приложения, отображаемый в
            консоли (например, `4123`).
        txn_id:
          type: string
          description: >-
            `transaction_id`, переданный вами при создании (не более 128
            символов). Уникален в рамках приложения.
        txn_date:
          type: string
          format: date-time
          description: >-
            Когда произошла транзакция (из `transaction_at`; по умолчанию
            используется время отправки).
        zone_id:
          type: string
          nullable: true
          description: Идентификатор часового пояса IANA, указанный при создании.
        transaction_type:
          type: string
          description: >-
            Категория верхнего уровня в том виде, в котором она сохранена:
            `finance`, `kyc`, `travelRule`, `userPlatformEvent`, `gamblingBet`,
            `gamblingLimitChange`, `gamblingBonusChange`, `auditTrailEvent`.
            Обратите внимание, что значения из нескольких слов возвращаются в
            camelCase, даже если они были переданы в snake_case.
        action_type:
          type: string
          description: >-
            Подтип внутри категории (например, `deposit`, `withdrawal`,
            `transfer`). Если не указан, по умолчанию совпадает с категорией.
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
          description: >-
            Направление относительно субъекта. Сохраняется в верхнем регистре
            независимо от переданного регистра (на вход принимаются
            `in`/`out`/`inbound`/`outbound`).
        status:
          type: string
          enum:
            - APPROVED
            - IN_REVIEW
            - DECLINED
            - AWAITING_USER
          description: >-
            Текущий вердикт мониторинга. Транзакции создаются со статусом
            `APPROVED`; правила могут синхронно изменить его на
            `IN_REVIEW`/`DECLINED`.
        source:
          type: string
          enum:
            - LIVE
            - IMPORTED
          description: >-
            Происхождение записи: `LIVE` для транзакций, переданных через API
            или SDK, `IMPORTED` для транзакций, загруженных через импорт в
            панели управления.
        amount:
          type: string
          description: >-
            Сумма транзакции в виде десятичной строки без завершающих нулей
            (например, `"1500"`, `"0.5"`, `"0.123456789012345678"`). До 18
            знаков после запятой.
        currency:
          type: string
          description: >-
            Код валюты для `amount`. Принимается любой буквенный код ISO 4217
            (например, `EUR`, `USD`, `NGN`), а также символ криптоактива
            (например, `BTC`). Предпочтительно использовать находящийся в
            обращении код. Не для каждого принятого кода доступен обменный курс:
            если для кода курс отсутствует (например, расчетная единица ISO
            `XSU` или символ криптовалюты, для которого Didit не рассчитывает
            цену), автоматическая конвертация завершается ошибкой и
            `preferred_currency_amount` возвращается со значением null, если
            только в запросе не был передан предварительно сконвертированный
            `amount_in_default_currency`.
        currency_type:
          type: string
          nullable: true
          description: '`fiat` или `crypto`, как передано в `currency_kind`.'
        amount_in_default_currency:
          type: string
          nullable: true
          description: >-
            Предоставленная вами предварительно сконвертированная сумма в виде
            десятичной строки с удалёнными замыкающими нулями.
        default_currency_code:
          type: string
          nullable: true
        preferred_currency_amount:
          type: string
          nullable: true
          description: >-
            Значение `amount`, конвертированное в предпочтительную валюту
            приложения, если доступно.
        preferred_currency_code:
          type: string
          nullable: true
        payment_details:
          type: string
          nullable: true
          description: >-
            Назначение платежа или примечание из отправленных данных в виде
            произвольного текста.
        payment_txn_id:
          type: string
          nullable: true
          description: >-
            Внешний идентификатор платёжной системы (например, хэш
            блокчейн-транзакции) из `payment_reference_id`.
        score:
          type: integer
          description: >-
            Оценка риска, накопленная правилами (обычно 0–100). Выше =
            рискованнее.
        severity:
          type: string
          nullable: true
          enum:
            - UNKNOWN
            - LOW
            - MEDIUM
            - HIGH
            - CRITICAL
          description: >-
            Категориальный уровень риска, установленный правилами/провайдерами
            (`UNKNOWN`, `LOW`, `MEDIUM`, `HIGH`, `CRITICAL`). `null`, пока он не
            будет задан.
        decision_reason_code:
          type: string
          nullable: true
          description: Машиночитаемая причина текущего `status`.
        decision_reason_label:
          type: string
          nullable: true
          description: Понятная метка для `decision_reason_code`.
        vendor_data:
          type: string
          nullable: true
          description: Удобная копия `vendor_data` заявителя.
        metadata:
          type: object
          description: >-
            Снимок payload `subject` и `counterparty` в том виде, в котором они
            были отправлены при создании.
        props:
          type: object
          description: >-
            Параметры `custom_properties`, переданные вами при создании. К
            каждому ключу можно обращаться в условиях правил как к
            `custom_values.<key>`.
        tags:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              name:
                type: string
              color:
                type: string
              description:
                type: string
                nullable: true
              source:
                type: string
                enum:
                  - didit
                  - custom
                description: >-
                  Является ли тег предустановленным тегом Didit или
                  пользовательским.
          description: Теги, прикрепленные к транзакции (вручную или правилами).
        parties:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              role:
                type: string
                enum:
                  - APPLICANT
                  - REMITTER
                  - BENEFICIARY
                  - COUNTERPARTY
                description: >-
                  Роль стороны. Endpoint создания присваивает `APPLICANT`
                  (субъект) и `COUNTERPARTY`.
              entity_type:
                type: string
                enum:
                  - individual
                  - company
                  - external
                  - unhostedWallet
              kind:
                type: string
                enum:
                  - USER
                  - BUSINESS
                  - EXTERNAL
                description: >-
                  Стороны с типом `USER`/`BUSINESS` связаны с сущностью в Didit
                  через `vendor_data`. У сторон с типом `EXTERNAL` связанной
                  сущности в Didit нет.
              vendor_data:
                type: string
                nullable: true
                description: Ваш внутренний идентификатор пользователя/бизнеса.
              full_name:
                type: string
                nullable: true
              first_name:
                type: string
                nullable: true
              last_name:
                type: string
                nullable: true
              country_code:
                type: string
                nullable: true
                description: >-
                  Код страны из переданного `address.country` (обычно ISO 3166-1
                  alpha-3).
              dob:
                type: string
                format: date
                nullable: true
                description: Дата рождения из переданного `date_of_birth`.
              address:
                type: object
                description: Объект адреса в отправленном виде. `{}` при отсутствии.
              institution_info:
                type: object
                description: >-
                  Сведения об учреждении в отправленном виде. `{}` при
                  отсутствии.
              device:
                type: object
                description: >-
                  Нормализованный контекст устройства, включая обогащение данных
                  об IP на стороне сервера в network_context (геолокация, флаги
                  VPN/дата-центров), если был передан IP.
                properties:
                  fingerprint:
                    type: string
                    description: Уникальный цифровой отпечаток устройства.
                  persistent_device_id:
                    type: string
                    description: >-
                      Постоянный межсессионный идентификатор устройства (схема
                      фингерпринта v2).
                  user_agent:
                    type: string
                    description: Строка user agent браузера или приложения.
                  browser_family:
                    type: string
                    description: Семейство браузеров (например, Chrome, Firefox, Safari).
                  browser_version:
                    type: string
                    description: Строка версии браузера.
                  platform:
                    type: string
                    description: >-
                      Идентификатор платформы (web, ios, android, macos,
                      windows, linux).
                  os_family:
                    type: string
                    description: >-
                      Семейство операционной системы (например, iOS, Android,
                      Windows).
                  os_version:
                    type: string
                    description: Строка версии операционной системы.
                  accept_language:
                    type: string
                    description: Значение заголовка Accept-Language.
                  session_id:
                    type: string
                    description: Идентификатор сессии (сохранённый в метаданных).
                  session_age_ms:
                    type: number
                    description: Возраст сессии в миллисекундах.
                  network_context:
                    type: object
                    description: Сетевой контекст с IP-адресом и геолокацией.
                    properties:
                      ip_address:
                        type: string
                        description: IP-адрес клиента.
                      ip_country_code:
                        type: string
                        description: Страна, определённая по IP (ISO 3166-1 alpha-3).
                      latitude:
                        type: number
                        description: Географическая широта IP-адреса.
                      longitude:
                        type: number
                        description: Географическая долгота IP-адреса.
              external_party_snapshot:
                type: object
                nullable: true
                description: >-
                  Зафиксированная копия данных стороны для сторон типа
                  `EXTERNAL`. `null`, пока сторона связана с пользователем или
                  компанией Didit.
          description: Стороны транзакции (заявитель, контрагент).
        payment_methods:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              payment_method_type:
                type: string
                enum:
                  - bank_card
                  - bank_account
                  - e_wallet
                  - crypto_wallet
                  - unhosted_wallet
                  - other
              label:
                type: string
                nullable: true
              fingerprint:
                type: string
                nullable: true
                description: >-
                  SHA-256 от `type:account_id:issuing_country` — стабильный
                  идентификатор для отслеживания повторного использования одного
                  и того же инструмента.
              account_id:
                type: string
                nullable: true
                description: Идентификатор счёта (IBAN, адрес, token карты, …).
              issuing_country:
                type: string
                nullable: true
              owner_kind:
                type: string
                enum:
                  - USER
                  - BUSINESS
                  - EXTERNAL
              vendor_data:
                type: string
                nullable: true
                description: Ваш идентификатор пользователя/компании-владельца.
              owner_name:
                type: string
                nullable: true
              institution_info:
                type: object
              details:
                type: object
                description: Необработанный объект `payment_method` в переданном виде.
              external_owner_snapshot:
                type: object
                nullable: true
              role:
                type: string
                enum:
                  - SOURCE
                  - DESTINATION
                  - FUNDING
                  - BENEFICIARY
                description: >-
                  Как этот метод использовался в транзакции. Endpoint создания
                  присваивает `SOURCE`/`DESTINATION` на основе направления
                  (исходящее: субъект = SOURCE; входящее: субъект =
                  DESTINATION).
          description: Способы оплаты, привязанные к транзакции.
        documents:
          type: array
          description: >-
            Файлы, прикреплённые к транзакции из панели управления. `[]`, если
            файлы отсутствуют.
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              label:
                type: string
                nullable: true
              note:
                type: string
                nullable: true
              uploaded_by:
                type: string
                nullable: true
              created_at:
                type: string
                format: date-time
              files:
                type: array
                items:
                  type: object
                  properties:
                    uuid:
                      type: string
                      format: uuid
                    file_url:
                      type: string
                      format: uri
                      nullable: true
                      description: >-
                        Временный подписанный URL для скачивания; запрашивайте
                        его при необходимости, а не сохраняйте.
                    original_filename:
                      type: string
                      nullable: true
                    file_size:
                      type: integer
                      nullable: true
        activities:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              activity_type:
                type: string
                description: >-
                  Например, `TRANSACTION_CREATED`, `TRANSACTION_NOTE_ADDED`,
                  `TRANSACTION_STATUS_CHANGED`.
              source:
                type: string
              status:
                type: string
                nullable: true
              title:
                type: string
                nullable: true
              description:
                type: string
                nullable: true
              metadata:
                type: object
              occurred_at:
                type: string
                format: date-time
          description: >-
            Записи журнала действий (создание, заметки, ручные проверки,
            изменения статуса).
        alerts:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              title:
                type: string
              description:
                type: string
                nullable: true
              severity:
                type: string
                enum:
                  - UNKNOWN
                  - LOW
                  - MEDIUM
                  - HIGH
                  - CRITICAL
              status:
                type: string
                enum:
                  - OPEN
                  - INVESTIGATING
                  - AWAITING_USER
                  - PENDING_SAR
                  - SAR_FILED
                  - RESOLVED
                  - DISMISSED
              source:
                type: string
                enum:
                  - RULE
                  - PROVIDER
                  - MANUAL
              metadata:
                type: object
              created_at:
                type: string
                format: date-time
              due_at:
                type: string
                format: date-time
                nullable: true
          description: >-
            В настоящее время всегда пусто. Открытое оповещение представляет
            собой транзакцию со статусом `IN_REVIEW` или `AWAITING_USER`.
        rule_runs:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              rule:
                type: string
                format: uuid
                description: UUID правила, которое сработало.
              rule_title:
                type: string
              rule_description:
                type: string
                nullable: true
              rule_category:
                type: string
              matched:
                type: boolean
                description: >-
                  Совпали ли условия правила с этой транзакцией. Запуск
                  фиксируется только для совпавших правил, поэтому при
                  непосредственной оценке всегда возвращается `true`.
              is_test:
                type: boolean
                description: >-
                  True, когда правило выполнялось в режиме TEST (без влияния на
                  статус или скоринг).
              mode:
                type: string
                enum:
                  - ACTIVE
                  - DISABLED
                  - TEST
              severity:
                type: string
                nullable: true
              score_delta:
                type: integer
                description: Оценка, добавленная действиями `add_score` этого правила.
              status_target:
                type: string
                nullable: true
                description: >-
                  Статус, установленный действием `change_status`, если оно
                  было.
              action_summary:
                type: string
                nullable: true
                description: >-
                  Сводка действий, выполненных правилом, объединенных через `; `
                  (например, `score +30; change_status:IN_REVIEW;
                  add_tag:high_risk_country`). Компоненты: `score +N`,
                  `change_status:<STATUS>`, `add_tag:<name>`, `add_note`,
                  `add_to_list`, `open_case`. `null`, если правило не выполнило
                  никаких действий.
              metadata:
                type: object
                description: >-
                  Детали оценки: `scope_match`, `conditions[]` и
                  `aggregations[]`. Каждая запись условия содержит `field`,
                  `operator`, `expected_value`, `current_value`, считанное из
                  транзакции, `matched`, `group_index` и `group_logic`. Каждая
                  запись агрегации (скорость / количество / сумма) содержит
                  `metric`, `field`, `operator`, `expected_value`,
                  `computed_value`, вычисленное для агрегата, `window`,
                  `filters`, `matched` и `sample_references`; отложенные
                  асинхронные агрегации содержат `computed_value: null` и
                  `deferred: true`. Вложенная группа условий представляет собой
                  одну запись в `conditions[]` с `operator` `any_of` или
                  `all_of`, `field` со значением null и результатами своих
                  элементов в собственном `conditions`.
              created_at:
                type: string
                format: date-time
          description: >-
            Результаты выполнения по правилам — какое правило сработало и как
            оно повлияло на скоринг.
        provider_results:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              provider:
                type: string
              result_type:
                type: string
                enum:
                  - FIAT_MONITORING
                  - WALLET_SCREENING
                  - TRANSACTION_SCREENING
                  - TRAVEL_RULE
                  - NETWORK_GRAPH
                  - CUSTOM
              status:
                type: string
              severity:
                type: string
                nullable: true
              score:
                type: integer
              summary:
                type: string
                nullable: true
              payload:
                type: object
                description: Необработанный payload ответа провайдера.
              created_at:
                type: string
                format: date-time
          description: >-
            Необработанные payload от провайдеров (AML-скрининг,
            блокчейн-аналитика и т. д.).
        travel_rule:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/TransactionTravelRule'
          description: >-
            Перевод или проверка Travel Rule. Заполняется, если были переданы
            `travel_rule_details`, а также если включён Travel Rule и транзакция
            была создана с `transaction_category: travelRule` (Didit инициирует
            обмен самостоятельно, даже без `travel_rule_details`). Имеет
            значение `null`, если перевод или проверка отсутствуют. При входящем
            переводе поля контрагента `originator_data` и `beneficiary_data`
            остаются маскированными (`data_masked: true`) до подтверждения
            владения кошельком.
        network_snapshot:
          type: object
          nullable: true
          description: >-
            Снимок графа связанных транзакций/сторон, используемый движком
            правил. Либо `network_snapshot`, переданный вместе с транзакцией,
            либо граф, который Didit строит на основе успешного AML-скрининга
            кошелька (заменяющий переданный). `null`, если нет ни того, ни
            другого.
          properties:
            uuid:
              type: string
              format: uuid
            nodes:
              type: array
              items:
                type: object
            edges:
              type: array
              items:
                type: object
            metrics:
              type: object
        remediation:
          type: object
          nullable: true
          description: >-
            Сессия устранения проблемы, предлагаемая пользователю при
            необходимости повторной верификации. Заменена на `action_required`,
            являющийся каноническим блоком; сохранена для обратной
            совместимости.
          properties:
            session_id:
              type: string
            session_token:
              type: string
            url:
              type: string
              format: uri
            status:
              type: string
        action_required:
          type: object
          nullable: true
          description: >-
            Ожидающее выполнения действие конечного пользователя, необходимое
            для завершения этой транзакции, или null, если действий нет. Didit
            SDK автоматически запускают действие по умолчанию и обновляют
            транзакцию по его завершении. Два варианта, различаемые по полю
            `type`: `verification_session` (размещённая сессия верификации,
            созданная действием правила) и `wallet_ownership` (сессия виджета
            подтверждения владения кошельком, автоматически созданная для
            перевода Travel Rule, требующего подтверждения контроля над
            кошельком; управляется настройкой Travel Rule
            `auto_wallet_verification`). Если применимы оба варианта, приоритет
            имеет `wallet_ownership`, поскольку оно блокирует обмен данными
            Travel Rule.
          oneOf:
            - $ref: '#/components/schemas/TransactionVerificationSessionAction'
            - $ref: '#/components/schemas/TransactionWalletOwnershipAction'
          discriminator:
            propertyName: type
            mapping:
              verification_session: '#/components/schemas/TransactionVerificationSessionAction'
              wallet_ownership: '#/components/schemas/TransactionWalletOwnershipAction'
        cost_breakdown:
          type: object
          nullable: true
          description: >-
            Стоимость этой транзакции: `total_price` и `items`, по одному на
            каждое списание, каждый с полями `usage_type`, `price`, `details` и
            `created_at`. Повторный скрининг той же транзакции формирует новую
            позицию.
    TransactionTravelRule:
      type: object
      description: >-
        Перевод Travel Rule для транзакции в том виде, в котором его возвращают
        `GET /v3/transactions/{transaction_id}/`, ответ `201` метода `POST
        /v3/transactions/` и каждая строка `GET /v3/transactions/`. Поля
        `direction`, `rail`, `counterparty_vasp`, `delivery`, `discovery`,
        `reason` и `next_actions` имеют ту же структуру, что и в `PATCH
        /v3/transactions/{transaction_id}/travel-rule/`, поэтому одно чтение
        транзакции объясняет, почему перевод заблокирован и что необходимо
        сделать для его продвижения.
      properties:
        uuid:
          type: string
          format: uuid
        status:
          type: string
        protocol:
          type: string
          nullable: true
        required:
          type: boolean
        obligations_count:
          type: integer
        originator_data:
          type: object
          description: >-
            Сторона-отправитель. Для входящего перевода значения контрагента
            маскируются до тех пор, пока владение не будет подтверждено.
        beneficiary_data:
          type: object
          description: >-
            Сторона-получатель. Для входящего перевода значения контрагента
            маскируются до подтверждения владения.
        name_match:
          type: object
          nullable: true
          description: >-
            Сравнение имен, на основе которого было принято решение по переводу
            (оценка и строгость). Null до выполнения проверки. Сравниваемые
            имена маскируются вместе со сторонами.
        data_match:
          $ref: '#/components/schemas/TravelRuleDataMatch'
        mismatched_fields:
          type: array
          items:
            type: string
          description: >-
            Сокращение для `data_match.mismatched_fields`. Пусто, если различий
            нет.
        data_unmasked:
          $ref: '#/components/schemas/TravelRuleDataUnmasked'
        data_masked:
          type: boolean
          description: >-
            Имеет значение true, пока персональные данные контрагента
            маскируются в этом ответе.
        metadata:
          type: object
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
          description: Какой стороной обмена является данный перевод.
        rail:
          type: string
          nullable: true
          description: >-
            Транспортная сеть (rail), через которую прошёл перевод: `INTERNAL`,
            `TRP`, `GTR`, `TRUST`, `VERIFYVASP`, `SYGNA` или `EMAIL`
            (`TEST_VASP` в приложении в песочнице, когда ответил Didit Test
            VASP), либо `null` до выбора сети.
        counterparty_vasp:
          type: object
          nullable: true
          properties:
            name:
              type: string
            lei:
              type: string
            dd_score:
              type: integer
              description: >-
                Оценка дью-дилидженс от 0 до 100, где большее значение лучше. Та
                же шкала, что и в каталоге VASP.
            dd_score_breakdown:
              type: object
              description: >-
                Вклад каждого компонента в dd_score: один объект на компонент в
                соответствии со справочником VASP (jurisdiction, verification,
                protocol, lei, history, essentials, responsiveness), каждый со
                структурой {points, max, reason, detail}. Пустой объект {}, пока
                контрагент не был оценён.
              additionalProperties:
                type: object
                properties:
                  points:
                    type: number
                    description: Баллы, начисленные за этот компонент.
                  max:
                    type: integer
                    description: >-
                      Максимальное количество баллов, которое может начислить
                      этот компонент.
                  reason:
                    type: string
                    description: Машиночитаемый код вердикта компонента.
                  detail:
                    type: string
                    description: Понятная человеку причина начисления баллов.
            dd_assessed_at:
              type: string
              format: date-time
              nullable: true
              description: >-
                Когда в последний раз проводилась оценка в рамках комплексной
                проверки. Null, пока контрагент не был оценён.
          description: >-
            Запись контрагента в каталоге или `null`, если перевод не привязан
            ни к одной.
        delivery:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/TravelRuleDelivery'
          description: >-
            Последнее сообщение, которое перевод должен отправить другой
            стороне. `null`, если отправка не требовалась, например ниже
            `threshold_amount` или для заявленного некастодиального кошелька.
        discovery:
          type: array
          description: >-
            Как Didit выполнял поиск контрагента: по одной записи на каждый
            выполненный шаг. Пусто, если поиск не выполнялся, например для
            входящего перевода.
          items:
            $ref: '#/components/schemas/TravelRuleDiscoveryStep'
        reason:
          type: string
          description: >-
            Причина, по которой перевод со статусом
            `COUNTERPARTY_VASP_NOT_FOUND` или `COUNTERPARTY_VASP_NOT_REACHABLE`
            приостановлен; `""` для любого другого статуса. Неудачная доставка
            определяет её в первую очередь и только при
            `COUNTERPARTY_VASP_NOT_REACHABLE`: `email_undeliverable` (почтовый
            провайдер отклонил комплаенс-письмо, и адресов для повторной попытки
            не осталось: при отправке, при напоминании или в виде постоянного
            сбоя доставки, о котором сообщено позже) или `delivery_failed`
            (канал доставки окончательно вышел из строя: сетевой канал отклонил
            сообщение или исчерпал лимит повторных попыток, хост идентификации
            `TRP` не ответил либо `TRP`-хост контрагента не принял запрос). В
            противном случае её определяет трассировка `discovery`:
            `awaiting_end_user` (ни на одном шаге не указан контрагент, с
            которым Didit может связаться), `directory_match_no_route` (на шаге
            указан VASP из каталога, у которого нет маршрута),
            `picked_member_without_proven_wallet` (конечный пользователь выбрал
            клиента Didit, который не подтвердил контроль над кошельком) или
            `no_directory_match`, если трассировка не возвращает иной причины.
            Повторная отправка продвигает перевод дальше, поэтому причина
            сбрасывается. См. [Почему перевод
            приостановлен](/ru/transaction-monitoring/travel-rule#почему-перевод-застрял).
        next_actions:
          type: array
          description: >-
            Действия, продвигающие перевод дальше; `[]` для любого статуса,
            кроме `COUNTERPARTY_VASP_NOT_FOUND` или
            `COUNTERPARTY_VASP_NOT_REACHABLE`. `email_undeliverable` предлагает
            `update_compliance_email`, затем `resend`. `delivery_failed`
            предлагает `resend`. Причина типа discovery предлагает
            `select_counterparty_vasp`, `declare_self_hosted`, `add_vasp_hint` и
            `resend`.
          items:
            $ref: '#/components/schemas/TravelRuleNextAction'
        chain_details:
          $ref: '#/components/schemas/TravelRuleChainDetails'
    TransactionVerificationSessionAction:
      title: Verification session
      type: object
      properties:
        type:
          type: string
          enum:
            - verification_session
        url:
          type: string
          format: uri
          description: Размещённый URL верификации для открытия конечным пользователем.
        session_id:
          type: string
          format: uuid
          description: ID сессии верификации.
        session_token:
          type: string
          description: >-
            token сессии, используемый мобильными SDK для нативного запуска
            сценария.
        status:
          type: string
          description: Статус сессии верификации.
      required:
        - type
        - url
    TransactionWalletOwnershipAction:
      title: Wallet ownership
      type: object
      properties:
        type:
          type: string
          enum:
            - wallet_ownership
        url:
          type: string
          format: uri
          description: >-
            Размещённый URL виджета подтверждения владения кошельком. Открывайте
            его в полноценном интерфейсе браузера: на мобильных устройствах
            используйте SFSafariViewController или Chrome Custom Tab, ни в коем
            случае не встроенный webview.
        widget_session_id:
          type: string
          format: uuid
          description: Идентификатор сессии виджета подтверждения владения кошельком.
        expires_at:
          type: string
          format: date-time
          description: Когда истекает срок сессии виджета.
      required:
        - type
        - url
    TravelRuleDataMatch:
      type: object
      nullable: true
      description: >-
        Сравнение по каждому полю данных стороны перевода с тем, что известно
        другой стороне о владельце кошелька. Указывает поля и результаты, но
        никогда значения, сохраняя читаемость при маскировании данных
        контрагента. Имеет значение null до запуска сравнения.
      properties:
        matched:
          type: boolean
          description: True, когда ни одно из сравниваемых полей не отличается.
        mismatched_fields:
          type: array
          items:
            type: string
            enum:
              - name
              - date_of_birth
              - address
              - account
          description: Поля, которые различаются.
        fields:
          type: object
          description: >-
            Одна запись на каждое сравниваемое поле для типа стороны (`name`,
            `date_of_birth`, `address`, `account`; у компании нет поля
            `date_of_birth`).
          additionalProperties:
            type: object
            properties:
              result:
                type: string
                enum:
                  - matched
                  - mismatched
                  - not_compared
                description: >-
                  `not_compared`, если правило имеет значение `NONE` или на
                  одной из сторон отсутствует значение для поля.
              strictness:
                type: string
                enum:
                  - NONE
                  - STRICT
                  - CONTAINS
                  - DEFAULT
                  - FUZZY
    TravelRuleDataUnmasked:
      type: object
      nullable: true
      description: >-
        Запись аудита момента, когда данные контрагента были демаскированы.
        Имеет значение null, пока данные всё ещё замаскированы, а также для
        исходящих переводов.
      properties:
        at:
          type: string
          format: date-time
        reason:
          type: string
          enum:
            - ownership_confirmed
            - wallet_proof
            - address_book_match
            - own_verified_wallet
            - inquiry_approved
            - known_payment_method
            - travel_address
          description: >-
            Что подтвердило владение: ownership_confirmed (ваше подтверждение
            через консоль или API), wallet_proof (подтверждение кошелька в
            виджете или входящий перевод INTERNAL, устанавливается при его
            создании), address_book_match (верифицированный кошелёк из адресной
            книги), own_verified_wallet (собственный верифицированный кошелёк
            вашего пользователя), inquiry_approved (ваше одобрение входящего
            TRP-запроса или сообщения GTR либо Sygna), known_payment_method
            (кошелёк, с которого ваш пользователь уже совершал оплату) или
            travel_address (Travel Address конкретного кошелька, обозначающий
            этот кошелёк).
        actor:
          type: string
          description: >-
            Кто подтвердил решение: email пользователя консоли или метка
            API-ключа. Пусто для автоматического решения.
    TravelRuleDelivery:
      type: object
      description: >-
        Текущий статус последнего сообщения, которое перевод должен отправить
        другой стороне. Didit связывается с контрагентом после возврата ответа
        на запрос, создавший или изменивший перевод, поэтому данный объект
        показывает, было ли доставлено это сообщение: в очереди, отправляется,
        ожидает повторной попытки после ошибки, доставлено или произошел сбой. В
        случае сбоя, после которого сеть еще может восстановиться (нет ответа
        вовремя, ошибка соединения, HTTP `408`, `429` или `5xx`), повторная
        попытка выполняется через 30 секунд, 2 минуты, 10 минут, 30 минут и 1
        час. Если первое сообщение (`kind: SEND`) окончательно завершается сбоем
        из-за отказа сети или неудачи шестой попытки, перевод переходит в статус
        `COUNTERPARTY_VASP_NOT_REACHABLE` с полем `last_error` в истории
        `timeline`; любое другое сообщение, окончательно завершившееся ошибкой,
        фиксируется в `timeline`. Поле `status` перевода остается
        первоисточником истины для самого обмена.
      required:
        - kind
        - status
        - rail
        - attempts
        - last_error
        - next_attempt_at
        - delivered_at
      properties:
        kind:
          type: string
          enum:
            - SEND
            - ANSWER
            - TXID
            - CANCEL
            - POLL
          description: >-
            Что содержит сообщение. `SEND`: первое сообщение перевода
            контрагенту (исходящее; канал передачи выбирается при отправке).
            `ANSWER`: ваше согласие или отклонение, направляемое запросившей
            сети (входящее). `TXID`: хеш ончейн-транзакции после завершения
            перевода. `CANCEL`: отмена после того, как вы отменили перевод.
            `POLL`: запрос статуса к сети, поддерживающей такую возможность,
            повторяемый каждые 5 минут, пока перевод ожидает ответа от
            контрагента.
        status:
          type: string
          enum:
            - QUEUED
            - SENDING
            - RETRYING
            - DELIVERED
            - FAILED
          description: >-
            `QUEUED`: ожидает отправки. `SENDING`: выполняется попытка.
            `RETRYING`: попытка завершилась неудачей, следующая запустится в
            `next_attempt_at`. `DELIVERED`: принимающая сторона приняла
            сообщение. `FAILED`: принимающая сторона отклонила его или последняя
            попытка завершилась неудачей.
        rail:
          type: string
          enum:
            - INTERNAL
            - TRP
            - GTR
            - TRUST
            - VERIFYVASP
            - SYGNA
            - EMAIL
            - ''
          description: >-
            Транспортная сеть (rail), передающая сообщение. Пусто до тех пор,
            пока Didit не выберет её для первого сообщения.
        attempts:
          type: integer
          minimum: 0
          description: >-
            Количество попыток, сделанных для этого сообщения на данный момент.
            Для сообщения, не являющегося опросом статуса, выполняется не более
            6 попыток.
        last_error:
          type: string
          description: >-
            Тип сбоя, возникшего при последней попытке, либо `""`, если сбоев не
            было: например `email undeliverable`, `trp identity endpoint
            unreachable` или `trp transfer inquiry delivery failed`. Он никогда
            не содержит собственный ответ контрагента, который сохраняется в
            `timeline` перевода.

            Когда GTR возвращает ошибку, включаются собственный код состояния и
            сообщение. Тела ответов никогда не включаются.
          example: email undeliverable
        next_attempt_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Время следующей попытки, пока сообщение находится в статусе `QUEUED`
            или `RETRYING`.
        delivered_at:
          type: string
          format: date-time
          nullable: true
          description: Время получения сообщения другой стороной.
    TravelRuleDiscoveryStep:
      type: object
      description: >-
        Один шаг поиска контрагента, выполненный Didit для исходящего перевода,
        в порядке их выполнения. Первый шаг, определяющий VASP с доступным
        маршрутом, завершает цепочку.
      properties:
        step:
          type: string
          enum:
            - internal_address_book
            - wallet_attribution
            - network_lookup
            - customer_hint
            - end_user
          description: >-
            `internal_address_book`: другой клиент Didit, подтвердивший контроль
            над кошельком назначения. `wallet_attribution`: атрибуция
            блокчейн-аналитики кошелька. `network_lookup`: сеть, способная
            определить, какой VASP управляет адресом. `customer_hint`: имя VASP,
            LEI или юрисдикция, переданные вами в `beneficiary_data`.
            `end_user`: контрагент, выбранный конечным пользователем (или вами),
            либо запрос на его выбор.
        outcome:
          type: string
          enum:
            - match
            - miss
            - skipped
          description: >-
            `match`: шаг определил контрагента. `miss`: шаг был выполнен, но
            совпадений не найдено. `skipped`: шаг не удалось выполнить, причина
            указана в `reason`.
        reason:
          type: string
          description: >-
            Машиночитаемая причина, `""` при совпадении:
            `no_proven_internal_wallet`, `attribution_disabled`,
            `already_attributed`, `no_attributed_entity`,
            `directory_match_no_route`, `gtr_address_lookup_runs_on_dispatch`,
            `no_membership`, `network_switched_off`,
            `no_network_address_lookup`, `no_directory_match`,
            `awaiting_end_user` или `picked_member_without_proven_wallet`.
        vasp:
          type: string
          format: uuid
          nullable: true
          description: VASP из каталога, указанный на данном шаге, если он был указан.
        rail:
          type: string
          nullable: true
          description: >-
            Транспортная сеть (rail), через которую достигается этот контрагент,
            если шаг её обнаружил.
        at:
          type: string
          format: date-time
    TravelRuleNextAction:
      type: object
      description: >-
        Одно действие, которое позволяет продвинуть перевод со статусом
        `COUNTERPARTY_VASP_NOT_FOUND` или `COUNTERPARTY_VASP_NOT_REACHABLE`. См.
        раздел [Почему перевод
        завис](/ru/transaction-monitoring/travel-rule#почему-перевод-застрял).
      properties:
        action:
          type: string
          enum:
            - select_counterparty_vasp
            - declare_self_hosted
            - add_vasp_hint
            - update_compliance_email
            - resend
          description: >-
            `select_counterparty_vasp`: конечный пользователь выбирает VASP
            назначения в виджете владения кошельком, либо вы отправляете PATCH с
            `action=beneficiary_vasp`. `declare_self_hosted`: конечный
            пользователь объявляет кошелёк некастодиальным в виджете.
            `add_vasp_hint`: укажите Didit, кто является контрагентом, с помощью
            названия VASP, LEI или Travel Address (например, `travel_address` в
            записи адресной книги кошелька назначения), затем повторите
            отправку. `update_compliance_email` и `resend` являются значениями
            `action` для `PATCH /v3/transactions/{transaction_id}/travel-rule/`:
            передайте адрес электронной почты комплаенс-службы контрагента
            повторно и перезапустите маршрутизацию.
        url:
          type: string
          format: uri
          description: >-
            Ссылка на виджет подтверждения владения кошельком, при
            `select_counterparty_vasp` и `declare_self_hosted`, пока у перевода
            есть открытая сессия виджета.
      required:
        - action
    TravelRuleChainDetails:
      type: object
      description: >-
        Как блокчейн перевода именует два своих кошелька, когда перевод
        выполняется не просто с одного адреса на другой. Пусто (`{}`) для
        переводов в сетях на основе аккаунтов (EVM, Solana, Tron), где эти два
        адреса и есть кошельки. Сопоставление, маршрутизация и адресная книга
        читают кошельки в первую очередь отсюда.
      properties:
        chain:
          type: string
          description: >-
            Каноническая сеть, например `BTC`, `XRP` или `LIGHTNING` для
            перевода через Lightning.
        shape:
          type: string
          enum:
            - utxo
            - memo
            - lightning
        originator:
          $ref: '#/components/schemas/TravelRuleChainSide'
        beneficiary:
          $ref: '#/components/schemas/TravelRuleChainSide'
        utxo:
          type: object
          description: >-
            Для перевода UTXO: входы и выходы в сохраненном виде (суммы в виде
            десятичных строк) и то, как именно Didit интерпретировал выходы.
          properties:
            inputs:
              type: array
              items:
                $ref: '#/components/schemas/TravelRuleUtxoEntry'
            outputs:
              type: array
              items:
                $ref: '#/components/schemas/TravelRuleUtxoEntry'
            change_output_indexes:
              type: array
              items:
                type: integer
              description: Выходы, возвращающие средства обратно на адрес входа.
            beneficiary_output_index:
              type: integer
              nullable: true
              description: >-
                Выход, выплачивающий средства получателю; null, если не удалось
                определить ни один.
        lightning:
          type: object
          description: >-
            Для перевода Lightning: содержимое платежного запроса. Всегда `kind`
            (`bolt11`, `bolt12_offer`, `bolt12_invoice`,
            `bolt12_invoice_request`, `lnurl`, `lightning_address`, `node_id`
            или `unknown`); инвойс BOLT11 добавляет `network`, `payee_node_id`,
            `payment_hash`, `amount_msat`, `created_at` и `expires_at`; строка
            BOLT12 добавляет `blinded_paths` и `payee_node_id`; LNURL или
            Lightning Address добавляет свой `domain`. По сети ничего не
            запрашивается: выполняется только декодирование запроса.
          additionalProperties: true
        warnings:
          type: array
          items:
            type: string
            enum:
              - declared_originator_not_an_input
              - declared_beneficiary_not_an_output
              - beneficiary_output_ambiguous
              - beneficiary_output_amount_differs
          description: >-
            Несоответствия UTXO, заслуживающие внимания: заявленный отправитель
            отсутствует во входах (inputs), заявленный получатель отсутствует в
            выходах (outputs), невозможно выделить единственный выход получателя
            или сумма в выходе получателя отличается от указанной в транзакции.
        not_applicable_reason:
          type: string
          enum:
            - LIGHTNING_NO_PAYEE_IDENTIFIER
            - LIGHTNING_BOLT12_BLINDED_PAYEE
            - LIGHTNING_LNURL_NAMES_NO_PAYEE
          description: >-
            Для исходящего перевода Lightning, в платежном запросе которого не
            указан получатель: причина, почему перевод имеет статус
            `NOT_APPLICABLE`. `LIGHTNING_NO_PAYEE_IDENTIFIER` (в запросе не
            указан узел получателя или запрос не удалось декодировать),
            `LIGHTNING_BOLT12_BLINDED_PAYEE` (предложение скрывает своего
            получателя за слепыми путями), `LIGHTNING_LNURL_NAMES_NO_PAYEE`
            (LNURL указывает сервис, а не получателя). Тот же код открывает
            последнюю запись `timeline` перевода.
    TravelRuleChainSide:
      type: object
      description: Кошелёк одной из сторон, определённый Didit на основе данных блокчейна.
      properties:
        address:
          type: string
          description: >-
            Кошелёк. В сетях с memo это классический адрес (XRP X-address
            разделяется на классический адрес и тег); в Lightning это
            идентификатор узла получателя или Lightning Address.
        memo:
          type: string
          description: >-
            Destination tag или memo, являющиеся частью кошелька; `""`, если
            отсутствует.
        source:
          type: string
          enum:
            - declared
            - x_address
            - largest_input
            - only_non_change_output
            - amount_match
            - invoice_payee
            - updated
          description: >-
            Откуда получен кошелёк: `declared` (ваш запрос), `x_address`
            (выделен из X-адреса XRP), `largest_input` (входной адрес UTXO с
            наибольшим вкладом), `only_non_change_output` (единственный выход
            UTXO, не являющийся сдачей), `amount_match` (единственный выход
            UTXO, выплачивающий сумму перевода), `invoice_payee` (получатель,
            указанный в платежном запросе Lightning), `updated` (установлен
            позже с помощью `action: update_originator_wallet`).
    TravelRuleUtxoEntry:
      type: object
      description: >-
        Один вход или выход UTXO-транзакции в том виде, в каком он зафиксирован
        в блокчейне.
      required:
        - address
      properties:
        address:
          type: string
          maxLength: 128
        amount:
          type: string
          nullable: true
          description: >-
            Десятичная строка в единицах самой монеты (BTC, не сатоши).
            Необязательно.
          example: '0.0125'
        txid:
          type: string
          maxLength: 128
          description: Необязательно. Транзакция, которую расходует вход (input).
        vout:
          type: integer
          nullable: true
          minimum: 0
          description: >-
            Необязательно. Индекс выхода (output index), который расходуется
            входом (input).
  securitySchemes:
    TransactionTokenAuth:
      type: apiKey
      in: header
      name: X-Transaction-Token
      description: >-
        Краткосрочный токен с ограниченной областью действия, сгенерированный
        вашим бэкендом через POST /v3/transactions/sdk-token/. Используется SDK
        Didit на endpoints /v1/transactions/, предназначенных для взаимодействия
        с устройством.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.