> ## 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.

# API создания транзакций: отправка в KYT

> Отправляйте транзакции в Didit KYT для оценки риска, скрининга и Travel Rule. 1,000 транзакций в месяц включено, далее $0.001 за каждую.



Промпт для API создания транзакции
        Скопировать промпт в буфер обмена



      
      

\<pre>

\`Submit a transaction for Didit monitoring through the Management API.

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

Authentication:
Use the x-api-key header with my Didit API key.

Goal:
\- Submit a transaction for KYT (transaction monitoring). Didit runs the configured rules engine, blockchain analytics, and AML screening synchronously and returns the verdict in the response. The full detail (parties, rule runs, provider results, remediation links) is also returned.
\- A Travel Rule transfer is stored in the same call, but Didit contacts the counterparty after the response: travel_rule.status comes back AWAITING_COUNTERPARTY (or NOT_APPLICABLE, UNCONFIRMED_OWNERSHIP, or COMPLETED for your own verified wallet) with travel_rule.protocol null, and every later status change, including COUNTERPARTY_VASP_NOT_FOUND, arrives as a travel_rule.status.updated webhook. Your rules run again when the rail or the status changes.

When to call:
\- At payment authorization, before fanning out funds, to decide allow / hold / decline based on status, score, severity.
\- On post-trade events (gambling bets, audit-trail events, KYC events) for long-running monitoring without a per-transaction decision.
\- On crypto deposits / withdrawals — set transaction_details.currency_kind = "crypto" and provide the relevant wallet address in payment_method.account_id.
\- For Travel Rule, set transaction_category = "travel_rule" and include travel_rule_details (alias travelRule).
travel_rule_details.status is required (400 if missing); when Travel Rule is enabled, Didit runs the exchange and ignores the status you send, and otherwise Didit records the transfer passively with that status.
When the subject is a user with an approved Didit KYC verification and Travel Rule is on, Didit replaces the originator_data fields the verification holds with the verified values (metadata.originator_provenance says which); otherwise it sends originator_data as you provide it, so build it from the identity you verified.
beneficiary_data carries the beneficiary (name, wallet_address, chain) and any routing hints (travel_address, counterparty_vasp_lei, counterparty_vasp_name, counterparty_vasp_email).
If beneficiary_data.chain is empty, Didit takes transaction_details.crypto_params.crypto_chain, else custom_properties.crypto_chain, else the currency, uppercases it, and sets it only when it is a chain Didit recognises (for example ETH or BTC).
\- Chain shapes: on XRP, XLM, EOS, ATOM and HBAR send the destination tag or memo as payment_method.memo (or beneficiary_data.memo); on BTC, LTC, BCH and DOGE send the transaction's inputs and outputs as travel_rule_details.utxo; on bitcoin or Lightning, payment_method.account_id may be a Lightning payment request or Lightning Address. What Didit resolved is on travel_rule.chain_details (see /transaction-monitoring/travel-rule#chain-shapes).

Identifiers:
\- transaction_id (alias txnId) is YOUR identifier (max 128 chars), unique per application.
It becomes txn_id on subsequent calls.
Reusing a transaction_id that already exists returns 400 {"transaction_id": ["A transaction with this transaction_id already exists."]}, and when two identical requests race each other the loser gets 409.
Neither response returns the existing transaction, so to retry safely, treat a 400 or 409 for a duplicate id as already created and look the transaction up instead of resubmitting: GET /v3/transactions/{uuid}/ with the Didit uuid from the first response, or with the transaction_id (the Didit uuid) that the transaction.created webhook carries next to your txn_id.
GET does not accept your txn_id. Sandbox applications do not receive transaction.created or transaction.status.updated, so save the Didit uuid from the create response. Sandbox Travel Rule exchanges do emit travel_rule.status.updated with environment: sandbox.
\- The returned uuid is Didit's stable identifier — use it in GET /v3/transactions/{transaction_id}/.

Linking to entities:
\- subject.vendor_data (and optionally counterparty.vendor_data) are your internal user/business identifiers. They link the transaction to the long-lived User / Business entity assembled from prior verification sessions. Use the SAME vendor_data you supplied when creating the KYC session.

Minimum request body (application/json):
\{
"transaction_id": "your-txn-2026-05-17-001",
"transaction_category": "finance",   // finance | kyc | travel_rule | user_event | audit_trail_event | gambling_bet | gambling_limit_change | gambling_bonus_change
"transaction_details": {
"direction": "outbound",            // "inbound" | "outbound"
"amount": 1500,                     // number or decimal string, up to 18 decimal places (string for exact precision); never negative, because direction carries the sign
"currency": "EUR",                  // any ISO 4217 code (EUR, USD, NGN, ...) or a crypto symbol
"currency_kind": "fiat",            // "fiat" | "crypto" (optional)
"action_type": "withdrawal"         // optional, e.g. deposit/withdrawal/transfer
},
"subject": {                          // APPLICANT party
"entity_type": "individual",        // "individual" | "company"
"vendor_data": "user-12345",        // required
"full_name": "Maria Garcia",        // required
"address": { "country": "ESP" }     // optional
},
"counterparty": { ... },              // optional COUNTERPARTY party (same shape as subject)
"transaction_at": "2026-05-17T08:42:00Z",  // optional, defaults to now
"travel_rule_details": { "status": "AWAITING_COUNTERPARTY", ... }   // optional, for crypto Travel Rule; status is required inside it
}

Currency codes:
\- currency has no enum. Any ISO 4217 alphabetic code (EUR, USD, NGN, ...) and any crypto asset symbol (BTC, ETH, ...) are accepted and stored exactly as you send them, up to 10 characters.
\- Prefer a currently-circulating code. Not every accepted code has an exchange rate: withdrawn currencies and accounting units such as XDR are often still quoted, but when Didit has no rate for the code you send (for example the ISO accounting unit XSU, or a crypto symbol Didit does not price), automatic conversion to your base currency fails and preferred_currency_amount comes back null. A pre-converted amount_in_default_currency is always used as sent when present, so supply it for any code you are not sure has a rate.
\- Set currency_kind = "crypto" for on-chain amounts. The kind gates the transaction's own crypto AML screening: without currency_kind = "crypto" that regular screening step is skipped and no screening fee is estimated or charged for it, even with monitoring enabled or include_crypto_screening = true. Travel Rule attribution is a separate path: on a production application with Travel Rule and VASP attribution enabled, an outbound transaction_category = "travel_rule" request whose beneficiary wallet and chain cannot be reached over any rail triggers a VASP attribution wallet screening, and that screening is billed at the wallet screening price whatever currency_kind is or is not set. The kind does not change the stored decimal scale: up to 18 decimal places are kept either way, but only when amount arrives as a decimal string ("0.123456789012345678"). A JSON number is parsed as a binary float first, so anything beyond about 15 significant digits is rounded before it is stored (0.123456789012345678 is stored as 0.12345678901234568). The kind also decides how the amount is rendered in the transaction PDF. Crypto amounts render with up to 8 decimal places, fiat amounts with their ISO 4217 minor unit (2 for most currencies). Without the kind, RON, MNT and GEL are rendered as fiat because each is both a token and an ISO 4217 currency, so a small token amount can show as 0 in the report.
The VASP attribution screening is skipped when the transaction's own crypto screening already screened that wallet: Didit reuses that result and charges nothing extra.

Example call:
curl -X POST "https://verification.didit.me/v3/transactions/" \
-H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{
"transaction_id": "your-txn-2026-05-17-001",
"transaction_category": "finance",
"transaction_details": {"direction":"outbound","amount":1500,"currency":"EUR","action_type":"withdrawal"},
"subject": {"entity_type":"individual","vendor_data":"user-12345","full_name":"Maria Garcia"}
}'

What to read from the response:
\- uuid — Didit transaction id, use for GET /v3/transactions/{transaction_id}/.
\- status - APPROVED | IN_REVIEW | DECLINED | AWAITING_USER (live verdict; at creation, AWAITING_USER comes from a rule action).
\- score (0–100, higher = riskier) and severity (LOW | MEDIUM | HIGH | CRITICAL).
\- decision_reason_code / decision_reason_label — machine + human verdict reason.
\- parties (role APPLICANT for the subject, COUNTERPARTY for the counterparty; kind USER, BUSINESS or EXTERNAL), cost_breakdown, rule_runs, provider_results (crypto screening results) and network_snapshot.
\- travel_rule - the Travel Rule transfer (status, protocol, required, originator_data, beneficiary_data, direction, rail, counterparty_vasp, delivery, discovery, reason, next_actions), or null; action_required - a pending wallet-ownership or verification step, or null.
reason and next_actions say why a COUNTERPARTY_VASP_NOT_FOUND or COUNTERPARTY_VASP_NOT_REACHABLE transfer is stuck and what moves it on (for example email_undeliverable: update_compliance_email, then resend); they are "" and [] for any other status.

Webhooks:
\- transaction.created fires after this call succeeds.
\- For a travel_rule transaction, travel_rule.status.updated fires for each Travel Rule transition, after transaction.created. Each webhook is delivered and retried on its own, so key on transaction_id rather than on arrival order.
\- transaction.status.updated fires whenever the verdict changes (manual review, async screening, rule re-runs). Subscribe a destination via POST /v3/webhook/destinations/.

Failure modes:
\- 400 - duplicate transaction_id, missing required field (including travel_rule_details.status), an unknown travel_rule_details.status ("Invalid travel rule status: ..."), invalid direction/category enum, or malformed party object.
\- 409 - a concurrent request with the same transaction_id was created first.
\- 403 - missing x-api-key (a wrong, revoked or expired key gets 401), or a key without permission for this action; the body is a { "detail": "..." } envelope.
\- 403 - the organization's balance cannot cover the fees this request would charge: { "detail": "...", "code": "insufficient_credits" }, and nothing is created.
\- 429 - more than 600 ingestion requests per minute for this API key (transaction and event ingestion share this budget, apart from the 300 of every other write); wait Retry-After seconds and retry.

Side effects:
\- Creates the transaction record and runs the synchronous rules + screening pipeline.
\- Links the transaction to the User / Business entity that shares the subject.vendor_data.
\- An outbound travel_rule transaction is billed once, at creation, on one line. It pays the Travel Rule fee ($0.02) when Travel Rule is on and Didit starts an exchange for it (amount at or above threshold_amount, including a transfer to a self-hosted wallet or to the user's own verified wallet). Otherwise it is billed as transaction monitoring (included in the plan's monthly transaction allowance, $0.001 each beyond it): below threshold_amount, a Lightning payment the Travel Rule does not apply to, or data recorded while Travel Rule is disabled. A resend never charges again.
\- An inbound travel_rule transaction pays no base fee, an application that joined Travel Rule free pays none on outbound transactions until it turns outbound billing on, and sandbox applications are never charged.
\- Crypto screening, when it runs, adds the Wallet Verification & Screening charge.

For the full integration shape, see /integration/integration-prompt.`

\</pre>



      
      

Вставьте в



## OpenAPI

````yaml ru/openapi-25.json POST /v3/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:
  /v3/transactions/:
    post:
      tags:
        - Transactions
      summary: Создать транзакцию
      description: >-
        Отправьте транзакцию для синхронного AML/риск-мониторинга. Транзакция
        создается со статусом `APPROVED`, затем ваши правила (и криптоскрининг,
        если применимо) выполняются синхронно и могут изменить возвращаемый
        `status` на `IN_REVIEW` или `DECLINED`. **`transaction_id` является
        вашим ключом идемпотентности** (макс. 128 символов, уникальный для
        каждого приложения); его повторное использование возвращает 400. При
        успешном выполнении для продакшн-приложений отправляется webhook
        `transaction.created`. За приложения в песочнице плата не взимается, и
        они не отправляют webhook `transaction.created` или
        `transaction.status.updated`. Обмены в рамках Travel Rule в песочнице
        отправляют webhook `travel_rule.status.updated` со значением
        `environment: sandbox`. Перевод Travel Rule сохраняется и возвращается
        до обращения к какому-либо контрагенту: `travel_rule.status`
        возвращается как `AWAITING_COUNTERPARTY` (или `NOT_APPLICABLE` ниже
        вашего порога, `UNCONFIRMED_OWNERSHIP` для заявленного некастодиального
        кошелька, `COMPLETED`, когда второй кошелёк является вашим собственным
        проверенным кошельком), а `travel_rule.protocol` имеет значение null.
        Затем Didit выбирает канал и отправляет обмен, а каждое последующее
        изменение статуса перевода, включая `COUNTERPARTY_VASP_NOT_FOUND`, когда
        ни один канал не может связаться с контрагентом, поступает в виде
        webhook `travel_rule.status.updated`. Ваши правила выполняются повторно
        при изменении канала или статуса.
      operationId: createTransaction
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                transaction_id:
                  type: string
                  description: >-
                    Ваш уникальный идентификатор этой транзакции (не более 128
                    символов).
                  example: your-txn-2026-05-17-001
                transaction_at:
                  type: string
                  format: date-time
                  description: >-
                    Когда произошла транзакция. По умолчанию текущее время, если
                    значение не указано.
                time_zone:
                  type: string
                  description: Идентификатор часового пояса IANA, например `Europe/Madrid`.
                transaction_category:
                  type: string
                  description: >-
                    Категория транзакции. Псевдонимы в CamelCase (`travelRule`,
                    `userPlatformEvent`, `gamblingBet`, …) также принимаются;
                    сохраняемое/возвращаемое значение приводится к camelCase для
                    категорий из нескольких слов.
                  example: finance
                  enum:
                    - finance
                    - kyc
                    - travel_rule
                    - user_event
                    - audit_trail_event
                    - gambling_bet
                    - gambling_limit_change
                    - gambling_bonus_change
                    - travelRule
                transaction_details:
                  type: object
                  description: Основные финансовые реквизиты транзакции.
                  required:
                    - direction
                    - amount
                    - currency
                  properties:
                    direction:
                      type: string
                      description: >-
                        Направление транзакции относительно субъекта.
                        Регистронезависимо; `in`/`out` принимаются в качестве
                        псевдонимов. Возвращается в верхнем регистре
                        (`INBOUND`/`OUTBOUND`).
                      example: outbound
                      enum:
                        - inbound
                        - outbound
                        - in
                        - out
                    amount:
                      type: number
                      description: >-
                        Сумма транзакции (до 18 знаков после запятой).
                        Отправляйте её в виде десятичной строки (например,
                        `"0.123456789012345678"`), если важна точность: число
                        JSON сначала парсится как двоичное число с плавающей
                        запятой, поэтому цифры сверх примерно 15 значащих знаков
                        округляются до сохранения суммы. Должна быть нулём или
                        больше: знак определяется направлением, а отрицательная
                        сумма возвращает `400`.
                      example: 1500
                    currency:
                      type: string
                      description: >-
                        Код валюты. Принимается любой буквенный код ISO 4217
                        (например, `EUR`, `USD`, `NGN`), а также символ
                        криптоактива (например, `BTC`). Предпочтительно
                        использовать находящийся в обращении код. Не для каждого
                        принятого кода доступен обменный курс: если для кода
                        курс отсутствует (например, расчетная единица ISO `XSU`
                        или символ криптовалюты, для которого Didit не
                        рассчитывает цену), автоматическая конвертация
                        завершается ошибкой и `preferred_currency_amount`
                        возвращается со значением null, если только в запросе не
                        был передан предварительно сконвертированный
                        `amount_in_default_currency`.
                      example: EUR
                    currency_kind:
                      type: string
                      description: Является ли валюта `fiat` или `crypto`.
                    amount_in_default_currency:
                      type: number
                      nullable: true
                      description: >-
                        Предварительно сконвертированная сумма в валюте по
                        умолчанию. Если поле опущено, предпринимается попытка
                        автоматической конвертации валют (FX). Должна быть нулём
                        или больше.
                    default_currency:
                      type: string
                      description: >-
                        Код валюты по умолчанию для сконвертированной суммы.
                        Любой находящийся в обращении код ISO 4217.
                    payment_details:
                      type: string
                      nullable: true
                      description: >-
                        Назначение платежа или примечание в виде произвольного
                        текста.
                    payment_reference_id:
                      type: string
                      nullable: true
                      description: >-
                        Внешний идентификатор платёжной системы. Для
                        AML-скрининга криптовалютных транзакций по хэшу
                        транзакции отправьте хэш блокчейн-транзакции, а также
                        укажите связанный адрес в
                        `subject.payment_method.account_id`.
                    action_type:
                      type: string
                      nullable: true
                      description: >-
                        Подтип транзакции, например `deposit`, `withdrawal`,
                        `transfer`.
                    crypto_params:
                      type: object
                      description: >-
                        Выбор криптосети, отдельно от валюты (символа актива).
                        Указание пользовательского символа токена не гарантирует
                        покрытие хеша транзакции для его контракта.
                      properties:
                        crypto_chain:
                          type: string
                          description: >-
                            Фактическая сеть, использованная для скрининга.
                            Управляемый скрининг поддерживает BTC, ETH, LTC,
                            XRP, BCH, DOGE, TRX, SOL, MATIC, BNB, BASE (Base),
                            OP (Optimism), ARB (Arbitrum One), AVAX (Avalanche
                            C-Chain), ADA (Cardano), XLM (Stellar) и HBAR
                            (Hedera). Также принимаются распространённые
                            названия сетей, например POLYGON или POL для MATIC,
                            BSC для BNB и TRON для TRX. Всегда указывайте это
                            поле для токенов, работающих в нескольких сетях.
                            Если оно отсутствует для USDT, USDC или ETH,
                            переданных с 0x-хешем транзакции, Didit ищет этот
                            хеш в Ethereum, BNB Chain, Polygon, Base, Arbitrum и
                            Optimism и выполняет скрининг в той сети, где он
                            найден; если транзакция не найдена ни в одной сети,
                            скрининг транзакции не выполняется, а
                            custom_values.aml_screening_status принимает
                            значение FAILED с причиной в
                            custom_values.aml_screening_error. Если оно
                            отсутствует для USDT или USDC, проверяемых по
                            кошельку (без хеша транзакции), адрес Tron
                            проверяется в Tron, адрес Solana проверяется в
                            Solana, а 0x-адрес проверяется в первой из этих
                            шести сетей, где он отправлял транзакцию или хранит
                            токен, либо в Ethereum, если он не активен ни в
                            одной из них. Покрытие подключённых провайдеров
                            различается; для LIGHTNING требуется поддерживаемый
                            подключённый провайдер.
                          example: BASE
                subject:
                  type: object
                  description: Субъект (заявитель) транзакции.
                  required:
                    - vendor_data
                    - full_name
                  properties:
                    entity_type:
                      type: string
                      description: 'Тип сущности: `individual` или `company`.'
                    vendor_data:
                      type: string
                      description: Ваш внутренний идентификатор пользователя/бизнеса.
                      example: user-12345
                    full_name:
                      type: string
                      description: Полное имя субъекта.
                      example: Maria Garcia
                    first_name:
                      type: string
                      description: Имя субъекта.
                    last_name:
                      type: string
                      description: Фамилия субъекта.
                    date_of_birth:
                      type: string
                      format: date
                      description: Дата рождения (ГГГГ-ММ-ДД).
                    address:
                      type: object
                      description: Объект адреса.
                      properties:
                        country:
                          type: string
                          description: >-
                            Код страны (рекомендуется ISO 3166-1 alpha-3).
                            Копируется в `country_code` стороны.
                        town:
                          type: string
                        state:
                          type: string
                        street:
                          type: string
                        post_code:
                          type: string
                    institution_details:
                      type: object
                      description: >-
                        Сведения об учреждении (для институциональных
                        субъектов).
                      properties:
                        name:
                          type: string
                        code:
                          type: string
                        address:
                          type: object
                    device_context:
                      type: object
                      description: >-
                        Контекст устройства, зафиксированный в момент
                        транзакции. browser_family и platform должны
                        передаваться как явные ключи верхнего уровня — они не
                        извлекаются из user_agent. В запросе также
                        поддерживается псевдоним в camelCase device.
                      properties:
                        fingerprint:
                          type: string
                          description: Уникальный цифровой отпечаток устройства.
                        persistent_device_id:
                          type: string
                          description: >-
                            Постоянный межсессионный идентификатор устройства
                            (схема фингерпринта v2).
                        user_agent:
                          type: string
                          description: >-
                            Строка user agent браузера или приложения. Псевдоним
                            в CamelCase: userAgent.
                        browser_family:
                          type: string
                          description: >-
                            Семейство браузеров (например, Chrome, Firefox,
                            Safari). Должно передаваться явно — оно не
                            извлекается из user_agent. Псевдоним в CamelCase:
                            browserFamily.
                        browser_version:
                          type: string
                          description: >-
                            Строка версии браузера. Должна передаваться явно.
                            Псевдоним в CamelCase: browserVersion.
                        platform:
                          type: string
                          description: >-
                            Идентификатор платформы (web, ios, android, macos,
                            windows, linux). Должен передаваться явно — он не
                            извлекается из user_agent.
                        os_family:
                          type: string
                          description: >-
                            Семейство операционной системы (например, iOS,
                            Android, Windows). Псевдоним в CamelCase: osFamily.
                        os_version:
                          type: string
                          description: >-
                            Строка версии операционной системы. Псевдоним в
                            CamelCase: osVersion.
                        accept_language:
                          type: string
                          description: >-
                            Значение заголовка Accept-Language. Псевдоним в
                            CamelCase: acceptLang.
                        session_id:
                          type: string
                          description: >-
                            Идентификатор текущей сессии пользователя.
                            Сохраняется в метаданных. Псевдоним в CamelCase:
                            sessionId.
                        session_age_ms:
                          type: number
                          description: >-
                            Возраст сессии пользователя в миллисекундах на
                            момент транзакции. Псевдоним в camelCase:
                            sessionAgeMs.
                        network_context:
                          type: object
                          description: >-
                            Сетевой контекст с IP-адресом и геолокацией. Блок
                            ipInfo верхнего уровня также включён в этот объект.
                          properties:
                            ip_address:
                              type: string
                              description: 'IP-адрес клиента. Псевдоним в CamelCase: ip.'
                            ip_country_code:
                              type: string
                              description: >-
                                Страна, определённая по IP (ISO 3166-1 alpha-3).
                                Псевдоним в CamelCase: countryCode3.
                            latitude:
                              type: number
                              description: >-
                                Географическая широта IP-адреса. Псевдоним в
                                CamelCase: lat.
                            longitude:
                              type: number
                              description: >-
                                Географическая долгота IP-адреса. Псевдоним в
                                CamelCase: lon.
                    payment_method:
                      type: object
                      description: Способ оплаты, используемый субъектом.
                      properties:
                        method_type:
                          type: string
                          description: >-
                            Тип способа оплаты: `bank_card`, `bank_account`,
                            `crypto_wallet`, `ewallet`, `unhosted_wallet`,
                            `other`.
                        account_id:
                          type: string
                          description: >-
                            Идентификатор счёта (например, IBAN, адрес). Для
                            криптовалютного скрининга это поле должно содержать
                            адрес данного участника. Для входящего скрининга по
                            хешу транзакции требуется депозитный адрес
                            сервиса/клиента у субъекта. Для исходящего скрининга
                            используется адрес назначения у контрагента. При
                            криптовалютном переводе в сети bitcoin или Lightning
                            это может быть платёжный запрос Lightning (инвойс
                            BOLT11, предложение BOLT12, LNURL) или Lightning
                            Address: Didit сохраняет указанного в нём получателя
                            в качестве счёта ("", если получатель не указан), а
                            также данные запроса в поле
                            `chain_details.lightning` перевода Travel Rule. Не
                            более 255 символов после сохранения. При
                            криптовалютном переводе в сети bitcoin или Lightning
                            это может быть платёжный запрос Lightning (инвойс
                            BOLT11, предложение BOLT12, LNURL) или Lightning
                            Address: Didit сохраняет указанного в нём получателя
                            в качестве счёта ("", если получатель не указан), а
                            также данные запроса в поле
                            `chain_details.lightning` перевода Travel Rule. Не
                            более 255 символов после сохранения.
                        memo:
                          type: string
                          maxLength: 256
                          description: >-
                            Destination tag или memo, являющиеся частью кошелька
                            в сети с поддержкой memo (XRP, XLM, EOS, ATOM,
                            HBAR). На одном общем адресе биржи каждое memo
                            представляет собой отдельный способ оплаты. XRP:
                            destination tag, целое число от 0 до 4294967295
                            (принимается число JSON). XLM: текстовое memo длиной
                            до 28 байт, 64-битный id или 32-байтный хеш в
                            шестнадцатеричном виде. EOS: до 256 байт. ATOM: до
                            256 символов. HBAR: до 100 байт. Кошельки Bitcoin,
                            EVM, Solana, Tron, Litecoin, Bitcoin Cash, Dogecoin
                            и Lightning не поддерживают memo: их передача
                            приведёт к ошибке `400`. Псевдоним: `destinationTag`
                            или `destination_tag`.
                        issuing_country:
                          type: string
                          description: Код страны эмитента по стандарту ISO 3166-1 alpha-3.
                counterparty:
                  type: object
                  description: Контрагент транзакции (необязательно).
                  properties:
                    entity_type:
                      type: string
                      description: 'Тип сущности: `individual` или `company`.'
                    vendor_data:
                      type: string
                      description: Ваш внутренний идентификатор контрагента.
                    full_name:
                      type: string
                      description: Полное имя контрагента.
                    first_name:
                      type: string
                    last_name:
                      type: string
                    date_of_birth:
                      type: string
                      format: date
                    address:
                      type: object
                      description: Объект адреса с `country` (ISO 3166-1 alpha-3).
                    institution_details:
                      type: object
                    device_context:
                      type: object
                      description: >-
                        Контекст устройства для контрагента. browser_family и
                        platform должны передаваться как явные ключи верхнего
                        уровня — они не определяются из user_agent.
                      properties:
                        fingerprint:
                          type: string
                          description: Уникальный цифровой отпечаток устройства.
                        persistent_device_id:
                          type: string
                          description: >-
                            Постоянный межсессионный идентификатор устройства
                            (схема фингерпринта v2).
                        user_agent:
                          type: string
                          description: >-
                            Строка user agent браузера или приложения. Псевдоним
                            в CamelCase: userAgent.
                        browser_family:
                          type: string
                          description: >-
                            Семейство браузеров (например, Chrome, Firefox,
                            Safari). Должно передаваться явно — оно не
                            извлекается из user_agent. Псевдоним в CamelCase:
                            browserFamily.
                        browser_version:
                          type: string
                          description: >-
                            Строка версии браузера. Должна передаваться явно.
                            Псевдоним в CamelCase: browserVersion.
                        platform:
                          type: string
                          description: >-
                            Идентификатор платформы (web, ios, android, macos,
                            windows, linux). Должен передаваться явно — он не
                            извлекается из user_agent.
                        os_family:
                          type: string
                          description: >-
                            Семейство операционной системы (например, iOS,
                            Android, Windows). Псевдоним в CamelCase: osFamily.
                        os_version:
                          type: string
                          description: >-
                            Строка версии операционной системы. Псевдоним в
                            CamelCase: osVersion.
                        accept_language:
                          type: string
                          description: >-
                            Значение заголовка Accept-Language. Псевдоним в
                            CamelCase: acceptLang.
                        session_id:
                          type: string
                          description: >-
                            Идентификатор сессии контрагента. Сохраняется в
                            метаданных. Псевдоним в CamelCase: sessionId.
                        session_age_ms:
                          type: number
                          description: >-
                            Возраст сессии пользователя в миллисекундах на
                            момент транзакции. Псевдоним в camelCase:
                            sessionAgeMs.
                        network_context:
                          type: object
                          description: >-
                            Сетевой контекст с IP-адресом и геолокацией. Блок
                            ipInfo верхнего уровня также включён в этот объект.
                          properties:
                            ip_address:
                              type: string
                              description: 'IP-адрес клиента. Псевдоним в CamelCase: ip.'
                            ip_country_code:
                              type: string
                              description: >-
                                Страна, определённая по IP (ISO 3166-1 alpha-3).
                                Псевдоним в CamelCase: countryCode3.
                            latitude:
                              type: number
                              description: >-
                                Географическая широта IP-адреса. Псевдоним в
                                CamelCase: lat.
                            longitude:
                              type: number
                              description: >-
                                Географическая долгота IP-адреса. Псевдоним в
                                CamelCase: lon.
                    payment_method:
                      type: object
                      description: >-
                        Способ оплаты, используемый контрагентом. В транзакциях
                        travelRule значение `method_type: "unhosted_wallet"`
                        объявляет кошелёк контрагента некастодиальным: перевод
                        пропускает маршрутизацию к VASP контрагента, создаётся
                        напрямую со статусом `UNCONFIRMED_OWNERSHIP`, и (если
                        включён `auto_wallet_verification`) автоматически
                        создаётся сессия виджета подтверждения владения
                        кошельком, возвращаемая в блоке `action_required`
                        транзакции.
                      properties:
                        method_type:
                          type: string
                          description: >-
                            Тип способа оплаты: `bank_card`, `bank_account`,
                            `crypto_wallet`, `ewallet`, `unhosted_wallet`,
                            `other`. Используйте `unhosted_wallet`, чтобы
                            объявить некастодиальный кошелёк для Travel Rule.
                        account_id:
                          type: string
                          description: >-
                            Идентификатор счёта (например, IBAN или адрес). При
                            криптовалютном переводе в сети bitcoin или Lightning
                            это может быть платёжный запрос Lightning (инвойс
                            BOLT11, предложение BOLT12, LNURL) или Lightning
                            Address: Didit сохраняет указанного в нём получателя
                            в качестве счёта ("", если получатель не указан), а
                            также данные запроса в поле
                            `chain_details.lightning` перевода Travel Rule. Не
                            более 255 символов после сохранения. При
                            криптовалютном переводе в сети bitcoin или Lightning
                            это может быть платёжный запрос Lightning (инвойс
                            BOLT11, предложение BOLT12, LNURL) или Lightning
                            Address: Didit сохраняет указанного в нём получателя
                            в качестве счёта ("", если получатель не указан), а
                            также данные запроса в поле
                            `chain_details.lightning` перевода Travel Rule. Не
                            более 255 символов после сохранения.
                        memo:
                          type: string
                          maxLength: 256
                          description: >-
                            Destination tag или memo, являющиеся частью кошелька
                            в сети с поддержкой memo (XRP, XLM, EOS, ATOM,
                            HBAR). На одном общем адресе биржи каждое memo
                            представляет собой отдельный способ оплаты. XRP:
                            destination tag, целое число от 0 до 4294967295
                            (принимается число JSON). XLM: текстовое memo длиной
                            до 28 байт, 64-битный id или 32-байтный хеш в
                            шестнадцатеричном виде. EOS: до 256 байт. ATOM: до
                            256 символов. HBAR: до 100 байт. Кошельки Bitcoin,
                            EVM, Solana, Tron, Litecoin, Bitcoin Cash, Dogecoin
                            и Lightning не поддерживают memo: их передача
                            приведёт к ошибке `400`. Псевдоним: `destinationTag`
                            или `destination_tag`.
                        issuing_country:
                          type: string
                custom_properties:
                  type: object
                  description: >-
                    Произвольные пары ключ-значение, прикреплённые к транзакции.
                    На каждый ключ можно ссылаться в условиях правил по пути к
                    полю `custom_values.<key>`.
                  additionalProperties: true
                  example:
                    merchant_id: test
                    bank_name: test_2
                travel_rule_details:
                  type: object
                  description: >-
                    Данные Travel Rule. Когда Travel Rule включён и
                    transaction_category имеет значение travel_rule, Didit
                    выполняет обмен данными самостоятельно: статус, протокол,
                    required и obligations_count игнорируются, а используются
                    originator_data, beneficiary_data и metadata. В противном
                    случае Didit сохраняет эти значения как пассивную запись
                    Travel Rule. Пока включён Travel Rule, исходящий перевод на
                    сумму, равную или превышающую ваш порог, должен содержать
                    сведения, требуемые применимым режимом (EU TFR или
                    Рекомендация 16 ФАТФ/FATF), проверяемые для отправляемых
                    вами сторон: при отсутствии обязательного поля возвращается
                    ответ 400 в `travel_rule_details.originator_data` или
                    `travel_rule_details.beneficiary_data`, например «EU TFR
                    requires the originator name».
                  required:
                    - status
                  properties:
                    status:
                      type: string
                      description: >-
                        Обязательно при передаче travel_rule_details. Один из
                        статусов перевода Travel Rule (например,
                        AWAITING_COUNTERPARTY, COMPLETED, NOT_APPLICABLE); также
                        принимаются и сопоставляются написания в нижнем регистре
                        и camelCase, а также устаревшие значения UNKNOWN,
                        COMPLIANT, PENDING_ACTION, PENDING_COUNTERPARTY, FAILED
                        и EXEMPT. Любое другое значение возвращает 400.
                    protocol:
                      type: string
                    required:
                      type: boolean
                    obligations_count:
                      type: integer
                    originator_data:
                      type: object
                      description: >-
                        Сторона-отправитель в виде плоских полей или одного лица
                        формата IVMS 101. Для вашего пользователя с одобренной
                        верификацией KYC Didit заменяет поля, содержащиеся в
                        верификации, проверенными значениями (см.
                        `metadata.originator_provenance`). Это должен быть
                        объект: любое другое значение вызовет `400`. В сетях с
                        memo ключ `memo` указывает memo или tag кошелька
                        отправителя.
                    beneficiary_data:
                      type: object
                      description: >-
                        Сторона-получатель в виде плоских полей или одного лица
                        в формате IVMS 101. Должна быть объектом: любое другое
                        значение вызовет ошибку `400`. Для маршрутизации
                        перевода Didit считывает `wallet_address` (пустое
                        значение заполняется из
                        `counterparty.payment_method.account_id`), `chain`
                        (заполняется из
                        `transaction_details.crypto_params.crypto_chain` или
                        `currency`, если в ней указана поддерживаемая сеть),
                        `name` (с откатом к `counterparty.full_name`),
                        `travel_address`, `counterparty_vasp_name`,
                        `counterparty_vasp_lei` и `counterparty_vasp_email`. В
                        сети с memo `memo` указывает memo или тег кошелька
                        получателя; `wallet_address` и `memo` имеют приоритет
                        над методом оплаты контрагента.
                    metadata:
                      type: object
                    utxo:
                      allOf:
                        - $ref: '#/components/schemas/TravelRuleUtxo'
                      description: >-
                        Необязательно, только для сетей UTXO (BTC, LTC, BCH,
                        DOGE). Входы и выходы транзакции, по которым Didit
                        определяет кошелёк отправителя и выход получателя, если
                        вы не указали их явно.
                    originator:
                      type: object
                      description: >-
                        Блок отправителя IVMS 101: `originatorPersons` (одно
                        `naturalPerson` или `legalPerson`; юридическое лицо
                        делает сторону компанией) и `accountNumber` (адреса
                        кошельков). Используется для `originator_data`, когда
                        этот объект пуст. Некорректно сформированный блок
                        возвращает 400 с указанием пути ошибки, например
                        `originator.originatorPersons`.
                    beneficiary:
                      type: object
                      description: >-
                        Блок получателя IVMS 101: `beneficiaryPersons` (одно
                        `naturalPerson` или `legalPerson`; юридическое лицо
                        делает сторону компанией) и `accountNumber` (адреса
                        кошельков). Используется для `beneficiary_data`, когда
                        этот объект пуст. Некорректно сформированный блок
                        возвращает 400 с указанием пути ошибки, например
                        `beneficiary.beneficiaryPersons`.
                    ivms101:
                      type: object
                      description: >-
                        Блоки `originator` и `beneficiary`, обёрнутые в один
                        объект IVMS 101 (также принимается `IVMS101`). Блоки
                        верхнего уровня имеют приоритет над блоками в обёртке.
                network_snapshot:
                  type: object
                  description: Предварительно вычисленный снимок графа сети.
                  properties:
                    nodes:
                      type: array
                      items:
                        type: object
                    edges:
                      type: array
                      items:
                        type: object
                    metrics:
                      type: object
                include_crypto_screening:
                  type: boolean
                  nullable: true
                  description: >-
                    Переопределение для конкретной транзакции для скрининга
                    криптовалютной блокчейн-аналитики. Если `true`, скрининг
                    криптовалют выполняется независимо от настроек приложения по
                    умолчанию. Если `false`, скрининг криптовалют пропускается,
                    даже если он включён в настройках приложения. Если опущено
                    или `null`, используется значение по умолчанию на уровне
                    приложения, настроенное в Console. Для скрининга криптовалют
                    требуются `transaction_details.direction`, `currency_kind:
                    "crypto"`, сеть/валюта, а также адрес кошелька, определяемый
                    направлением: при скрининге входящих транзакций до перевода
                    используется `counterparty.payment_method.account_id`, при
                    скрининге входящих транзакций по хешу транзакции
                    используется `subject.payment_method.account_id`, а при
                    скрининге исходящих транзакций используется
                    `counterparty.payment_method.account_id`. Если
                    `transaction_details.payment_reference_id` содержит хеш
                    транзакции в блокчейне, Didit выполняет скрининг транзакций
                    и возвращает обогащённую сводку по транзакции при её
                    наличии.
              required:
                - transaction_id
                - transaction_category
                - transaction_details
                - subject
            examples:
              Minimal fiat withdrawal:
                summary: Минимально допустимый payload для исходящего фиатного перевода
                value:
                  transaction_id: your-txn-2026-05-17-001
                  transaction_category: finance
                  transaction_details:
                    direction: outbound
                    amount: 1500
                    currency: EUR
                    action_type: withdrawal
                  subject:
                    entity_type: individual
                    vendor_data: user-12345
                    full_name: Maria Garcia
              Crypto outbound with screening:
                summary: >-
                  Исходящий вывод криптовалюты на некастодиальный кошелёк,
                  опциональный скрининг
                value:
                  transaction_id: your-txn-2026-05-17-002
                  transaction_category: finance
                  include_crypto_screening: true
                  transaction_details:
                    direction: outbound
                    amount: 0.5
                    currency: BTC
                    currency_kind: crypto
                    amount_in_default_currency: 32500
                    default_currency: USD
                    action_type: withdrawal
                  subject:
                    entity_type: individual
                    vendor_data: user-12345
                    full_name: Maria Garcia
                    payment_method:
                      method_type: crypto_wallet
                      account_id: bc1qexampleexchangewalletaddressxyz
                      issuing_country: ESP
                  counterparty:
                    entity_type: individual
                    payment_method:
                      method_type: unhosted_wallet
                      account_id: bc1qexampleexternalwalletaddressabc
              Travel Rule transfer:
                summary: >-
                  Исходящий криптовалютный перевод с данными
                  отправителя/получателя по Travel Rule
                value:
                  transaction_id: your-txn-2026-05-17-003
                  transaction_category: travel_rule
                  transaction_details:
                    direction: outbound
                    amount: 25000
                    currency: USDT
                    currency_kind: crypto
                    action_type: transfer
                  subject:
                    entity_type: individual
                    vendor_data: user-12345
                    full_name: Maria Garcia
                    date_of_birth: '1992-03-14'
                    address:
                      country: ESP
                      town: Madrid
                      street: Calle Mayor 1
                      post_code: '28013'
                  counterparty:
                    entity_type: individual
                    full_name: John Beneficiary
                    institution_details:
                      name: Beneficiary VASP, Inc.
                      code: BVASP-US
                  travel_rule_details:
                    status: AWAITING_COUNTERPARTY
                    protocol: IVMS101
                    required: true
                    originator_data:
                      name: Maria Garcia
                    beneficiary_data:
                      name: John Beneficiary
      responses:
        '201':
          description: >-
            Транзакция отправлена и поставлена на мониторинг. Тело содержит
            полную информацию о транзакции (тот же формат, что и в `GET
            /v3/transactions/{transaction_id}/`), отражая все уже применённые
            результаты правил.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransactionDetail'
              examples:
                Approved with no rule hits:
                  value:
                    uuid: abcdef12-3456-4890-abcd-ef1234567890
                    environment: live
                    transaction_number: 4123
                    txn_id: your-txn-2026-05-17-001
                    txn_date: '2026-05-17T08:42:00Z'
                    zone_id: Europe/Madrid
                    transaction_type: finance
                    action_type: withdrawal
                    direction: OUTBOUND
                    status: APPROVED
                    source: LIVE
                    amount: '1500'
                    currency: EUR
                    currency_type: fiat
                    amount_in_default_currency: '1620.45'
                    default_currency_code: USD
                    preferred_currency_amount: '1620.45'
                    preferred_currency_code: USD
                    payment_details: Withdrawal to crypto wallet
                    payment_txn_id: null
                    score: 0
                    severity: null
                    decision_reason_code: null
                    decision_reason_label: null
                    vendor_data: user-12345
                    metadata:
                      subject:
                        entity_type: individual
                        vendor_data: user-12345
                        full_name: Maria Garcia
                        address: {}
                        institution_details: {}
                        device_context: {}
                      counterparty: {}
                    props: {}
                    tags: []
                    parties:
                      - uuid: b1111111-2222-4333-8444-555555555555
                        role: APPLICANT
                        entity_type: individual
                        kind: USER
                        vendor_data: user-12345
                        full_name: Maria Garcia
                        first_name: null
                        last_name: null
                        country_code: null
                        dob: null
                        address: {}
                        institution_info: {}
                        device: {}
                        external_party_snapshot: null
                    payment_methods: []
                    documents: []
                    activities:
                      - uuid: d4e5f6a7-8901-4bcd-9ef0-123456789abc
                        activity_type: TRANSACTION_CREATED
                        source: TRANSACTION
                        status: APPROVED
                        title: withdrawal
                        description: Transaction recorded.
                        metadata: {}
                        occurred_at: '2026-05-17T08:42:11Z'
                    alerts: []
                    rule_runs: []
                    provider_results: []
                    travel_rule: null
                    network_snapshot: null
                    remediation: null
                    action_required: null
                    cost_breakdown: null
                Flagged for review:
                  value:
                    uuid: abcdef12-3456-4890-abcd-ef1234567891
                    environment: live
                    transaction_number: 4124
                    txn_id: your-txn-2026-05-17-002
                    txn_date: '2026-05-17T08:42:00Z'
                    zone_id: Europe/Madrid
                    transaction_type: finance
                    action_type: withdrawal
                    direction: OUTBOUND
                    status: IN_REVIEW
                    source: LIVE
                    amount: '0.5'
                    currency: BTC
                    currency_type: crypto
                    amount_in_default_currency: '32500'
                    default_currency_code: USD
                    preferred_currency_amount: '32500'
                    preferred_currency_code: USD
                    payment_details: Withdrawal to crypto wallet
                    payment_txn_id: null
                    score: 78
                    severity: HIGH
                    decision_reason_code: WALLET_HIGH_RISK
                    decision_reason_label: Destination wallet flagged as high risk
                    vendor_data: user-12345
                    metadata:
                      subject:
                        entity_type: individual
                        vendor_data: user-12345
                        full_name: Maria Garcia
                        address: {}
                        institution_details: {}
                        device_context: {}
                      counterparty: {}
                    props:
                      order_id: ord-9988
                    tags: []
                    parties:
                      - uuid: b1111111-2222-4333-8444-555555555555
                        role: APPLICANT
                        entity_type: individual
                        kind: USER
                        vendor_data: user-12345
                        full_name: Maria Garcia
                        first_name: null
                        last_name: null
                        country_code: null
                        dob: null
                        address: {}
                        institution_info: {}
                        device: {}
                        external_party_snapshot: null
                    payment_methods: []
                    documents: []
                    activities: []
                    alerts:
                      - uuid: a7b8c9d0-1234-4abc-9def-567890abcdef
                        title: Destination wallet flagged as high risk
                        description: Provider risk score exceeded the configured threshold.
                        severity: HIGH
                        status: OPEN
                        source: RULE
                        metadata: {}
                        created_at: '2026-05-17T08:42:12Z'
                        due_at: null
                    rule_runs:
                      - uuid: e5f6a7b8-9012-4cde-af01-23456789abcd
                        rule: f6a7b8c9-0123-4def-b012-3456789abcde
                        rule_title: High-risk wallet screening
                        rule_description: null
                        rule_category: crypto
                        matched: true
                        is_test: false
                        mode: ACTIVE
                        severity: HIGH
                        score_delta: 78
                        status_target: IN_REVIEW
                        action_summary: score +78; change_status:IN_REVIEW
                        metadata: {}
                        created_at: '2026-05-17T08:42:12Z'
                    provider_results: []
                    travel_rule: null
                    network_snapshot: null
                    remediation: null
                    action_required: null
                    cost_breakdown: null
        '400':
          description: >-
            Ошибка валидации (отсутствуют обязательные поля, дубликат
            `transaction_id`, неизвестное значение enum, недопустимая валюта и
            т. д.).
          content:
            application/json:
              examples:
                Missing required field:
                  value:
                    transaction_details:
                      amount:
                        - This field is required.
                Duplicate transaction_id:
                  value:
                    transaction_id:
                      - A transaction with this transaction_id already exists.
                Invalid category:
                  value:
                    non_field_errors:
                      - Unsupported transaction category.
                Missing subject identity:
                  value:
                    subject:
                      - subject.vendor_data and subject.full_name are required.
                Blocklisted participant:
                  value:
                    vendor_data:
                      - >-
                        The individual 'user-12345' is in the blocklist and
                        cannot participate in transactions.
        '403':
          description: >-
            Отсутствующий, недействительный или отозванный API-ключ, либо у
            ключа нет прав на отправку транзакций для этого приложения. При
            отсутствии ключа возвращается `403`; при неверном, отозванном или
            истекшем ключе возвращается `401`.
          content:
            application/json:
              examples:
                Forbidden:
                  value:
                    detail: You do not have permission to perform this action.
        '409':
          description: >-
            Другой запрос с тем же `transaction_id` создал транзакцию во время
            обработки этого запроса, поэтому успешным оказывается только один из
            двух одновременных запросов. Прочитайте существующую транзакцию
            вместо повторной отправки.
          content:
            application/json:
              examples:
                Concurrent duplicate:
                  value:
                    detail: A transaction with this transaction_id already exists.
        '429':
          description: >-
            Лимит запросов превышен: создание транзакций и приём событий (`POST
            /v3/transactions/`, `POST /v3/events/`, `POST /v3/events/batch/`)
            разделяют лимит в 600 запросов в минуту на один API-ключ, отдельно
            от лимита в 300 запросов для всех остальных запросов на запись.
            Подождите `Retry-After` секунд, затем повторите попытку.
          headers:
            Retry-After:
              description: >-
                Количество секунд ожидания перед повторной попыткой, округлённое
                в большую сторону, чтобы повторный запрос попал в следующее
                окно.
              schema:
                type: integer
                minimum: 1
                example: 30
          content:
            application/json:
              examples:
                Throttled:
                  value:
                    detail: >-
                      Ingestion rate limit exceeded. You can make up to 600
                      requests per minute.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST 'https://verification.didit.me/v3/transactions/' \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "transaction_id": "your-txn-2026-05-17-001",
                "transaction_category": "finance",
                "transaction_details": {
                  "direction": "outbound",
                  "amount": 1500,
                  "currency": "EUR",
                  "action_type": "withdrawal"
                },
                "subject": {
                  "entity_type": "individual",
                  "vendor_data": "user-12345",
                  "full_name": "Maria Garcia"
                }
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.transactions.create(
                transaction_id="your-txn-2026-05-17-001",
                transaction_category="finance",
                transaction_details={
                    "direction": "outbound",
                    "amount": 1500.0,
                    "currency": "EUR",
                    "action_type": "withdrawal",
                },
                subject={
                    "entity_type": "individual",
                    "vendor_data": "user-12345",
                    "full_name": "Maria Garcia",
                },
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit from "@didit-protocol/sdk-node";

            // Reads DIDIT_API_KEY.
            const didit = new Didit();

            const result = await didit.transactions.create({
              transaction_id: "your-txn-2026-05-17-001",
              transaction_category: "finance",
              transaction_details: {
                direction: "outbound",
                amount: 1500.0,
                currency: "EUR",
                action_type: "withdrawal",
              },
              subject: {
                entity_type: "individual",
                vendor_data: "user-12345",
                full_name: "Maria Garcia",
              },
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.Create(ctx, didit.TransactionsCreateParams{\n\tTransactionID:       \"your-txn-2026-05-17-001\",\n\tTransactionCategory: \"finance\",\n\tTransactionDetails: didit.TransactionsCreateParamsTransactionDetails{\n\t\tDirection:  \"outbound\",\n\t\tAmount:     1500.0,\n\t\tCurrency:   \"EUR\",\n\t\tActionType: didit.String(\"withdrawal\"),\n\t},\n\tSubject: didit.TransactionsCreateParamsSubject{\n\t\tEntityType: didit.String(\"individual\"),\n\t\tVendorData: \"user-12345\",\n\t\tFullName:   \"Maria Garcia\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import me.didit.Didit;

            import me.didit.types.TransactionsCreateParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.transactions().create(TransactionsCreateParams.builder()
                    .transactionId("your-txn-2026-05-17-001")
                    .transactionCategory(TransactionsCreateParams.TransactionCategory.of("finance"))
                    .transactionDetails(TransactionsCreateParams.TransactionDetails.builder()
                            .direction(TransactionsCreateParams.TransactionDetails.Direction.of("outbound"))
                            .amount(1500.0)
                            .currency("EUR")
                            .actionType("withdrawal")
                            .build())
                    .subject(TransactionsCreateParams.Subject.builder()
                            .entityType("individual")
                            .vendorData("user-12345")
                            .fullName("Maria Garcia")
                            .build())
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

            // Reads DIDIT_API_KEY.
            $didit = new DiditClient();

            $result = $didit->transactions->create([
                'transaction_id' => 'your-txn-2026-05-17-001',
                'transaction_category' => 'finance',
                'transaction_details' => [
                    'direction' => 'outbound',
                    'amount' => 1500.0,
                    'currency' => 'EUR',
                    'action_type' => 'withdrawal',
                ],
                'subject' => [
                    'entity_type' => 'individual',
                    'vendor_data' => 'user-12345',
                    'full_name' => 'Maria Garcia',
                ],
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Reads DIDIT_API_KEY.
            didit = Didit::Client.new

            result = didit.transactions.create(
              transaction_id: "your-txn-2026-05-17-001",
              transaction_category: "finance",
              transaction_details: {
                direction: "outbound",
                amount: 1500.0,
                currency: "EUR",
                action_type: "withdrawal",
              },
              subject: {
                entity_type: "individual",
                vendor_data: "user-12345",
                full_name: "Maria Garcia",
              }
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.Transactions.CreateAsync(new
            TransactionsCreateParams

            {
                TransactionId = "your-txn-2026-05-17-001",
                TransactionCategory = "finance",
                TransactionDetails = new()
                {
                    Direction = "outbound",
                    Amount = 1500.0,
                    Currency = "EUR",
                    ActionType = "withdrawal",
                },
                Subject = new()
                {
                    EntityType = "individual",
                    VendorData = "user-12345",
                    FullName = "Maria Garcia",
                },
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    TravelRuleUtxo:
      type: object
      description: >-
        Входы и выходы UTXO-перевода (BTC, LTC, BCH, DOGE). Принимаются только
        для этих сетей: для любой другой сети возвращается `400`. На их основе
        Didit определяет кошелёк отправителя (заявленный, иначе входной адрес с
        наибольшим вкладом) и выход получателя (заявленный, иначе единственный
        выход, который не возвращает сдачу на входной адрес, иначе выход,
        выплачивающий сумму перевода). Результат находится в `chain_details`
        перевода.
      required:
        - outputs
      properties:
        inputs:
          type: array
          maxItems: 1000
          items:
            $ref: '#/components/schemas/TravelRuleUtxoEntry'
          description: >-
            Необязательно. Без входов (inputs) отправитель не определяется, а
            выход со сдачей (change output) не распознается.
        outputs:
          type: array
          minItems: 1
          maxItems: 1000
          items:
            $ref: '#/components/schemas/TravelRuleUtxoEntry'
    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`. Повторный скрининг той же транзакции формирует новую
            позицию.
    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).
    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`).
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        API-ключ вашего приложения из раздела «Разработчикам» -> «API-ключи» в
        Business Console. Основной ключ имеет полный доступ. Именованный ключ
        может иметь ограниченную область действия: без доступа, чтение или
        запись для каждого ресурса, ограничение определенными сценариями или
        одобренными сессиями, списком IP-адресов и сроком действия. 401
        означает, что ключ неверен, отозван или его срок действия истек; 403
        означает, что ключ не был передан, у ключа нет доступа к этому ресурсу
        или действию, либо запрос поступил с адреса вне его списка IP-адресов;
        404 на маршруте сессии означает, что сессия не входит в сценарии или
        статусы ключа. Ключ без доступа к медиа получает URL изображений, видео
        и PDF как null, а ключ без прав на запись сессий получает ссылки на
        сессии и токены как null. См. https://docs.didit.me/console/api-keys.

````

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