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

# Схема ответа KYT: справочник по payload транзакции

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

Эта страница описывает полный payload, который возвращают `POST /v3/transactions/` и `GET /v3/transactions/{transaction_id}/`. Оба эндпоинта возвращают один и тот же объект `TransactionDetail`. В [справочнике API](https://docs.didit.me/ru/management-api/transactions/get.md) приведена схема по каждому полю, а на этой странице она разобрана по шагам.

## Структура верхнего уровня

```json theme={null}
{
  "uuid": "abcdef12-3456-4890-abcd-ef1234567890",
  "environment": "live",
  "transaction_number": 4123,
  "txn_id": "tx-0001",
  "txn_date": "2026-04-16T12:00:00Z",
  "zone_id": "Europe/Madrid",
  "transaction_type": "finance",
  "action_type": "withdrawal",
  "direction": "OUTBOUND",
  "status": "IN_REVIEW",
  "source": "LIVE",
  "amount": "12500",
  "currency": "EUR",
  "currency_type": "fiat",
  "amount_in_default_currency": null,
  "default_currency_code": null,
  "preferred_currency_amount": "13520.75",
  "preferred_currency_code": "USD",
  "payment_details": "Withdrawal to bank account",
  "payment_txn_id": null,
  "score": 65,
  "severity": "MEDIUM",
  "decision_reason_code": "rule_score_threshold",
  "decision_reason_label": "Score above review threshold",
  "vendor_data": "user-42",
  "metadata": { "subject": { ... }, "counterparty": { ... } },
  "props": { "order_id": "ORD-7891" },
  "tags": [ ... ],
  "parties": [ ... ],
  "payment_methods": [ ... ],
  "documents": [ ... ],
  "activities": [ ... ],
  "alerts": [],
  "rule_runs": [ ... ],
  "provider_results": [ ... ],
  "travel_rule": { ... } | null,
  "network_snapshot": { ... } | null,
  "remediation": { ... } | null,
  "action_required": { ... } | null,
  "cost_breakdown": { ... } | null
}
```

Два идентификатора описывают одну и ту же транзакцию. `uuid` является стабильным идентификатором Didit и передаётся в пути `GET /v3/transactions/{transaction_id}/`. Значение `txn_id` совпадает с `transaction_id`, который вы передали при создании. `transaction_number` указывает на последовательный номер в рамках приложения, который отображается в консоли.

Субъект и контрагент, которых вы передали, не возвращаются как ключи верхнего уровня. Они представлены элементами массива `parties` и различаются по `role`. Поле `vendor_data` на верхнем уровне является удобной копией `vendor_data` заявителя.

## Ключевые поля

### Финансовые поля

* `amount` / `currency` – сумма транзакции в том виде, в каком она передана. `amount` – это десятичная строка без завершающих нулей (`"1500"`, `"0.5"`), с не более чем 18 знаками после запятой.
* `currency_type` – `fiat` или `crypto`, как передано в `currency_kind`; `null`, если не указано.
* `amount_in_default_currency` / `default_currency_code` – предварительно сконвертированная сумма, которую вы передали в запросе, возвращается обратно; `null`, если вы её не отправляли.
* `preferred_currency_amount` / `preferred_currency_code` – `amount`, сконвертированная в предпочтительную валюту вашего приложения. `null`, если для `currency` нет курса обмена и вы не передали `amount_in_default_currency`.
* `payment_details` / `payment_txn_id` – свободный текстовый идентификатор платежа и внешний платёжный идентификатор (например, хеш транзакции в блокчейне) из запроса.

### Поля статуса

* `status` – `APPROVED`, `IN_REVIEW`, `DECLINED`, `AWAITING_USER`. Транзакции создаются со статусом `APPROVED`; правила могут менять его синхронно.
* `score` – целочисленная оценка риска, накопленная правилами. Чем выше значение, тем выше риск.
* `severity` – `UNKNOWN`, `LOW`, `MEDIUM`, `HIGH`, `CRITICAL` или `null`, пока правило или провайдер не установит значение.
* `decision_reason_code` / `decision_reason_label` – структурированная и понятная человеку причина текущего статуса.
* `environment` – `live` или `sandbox`, из приложения, которому принадлежит транзакция. Транзакция в `sandbox` сохраняется, но никогда не оценивается, поэтому пустой `rule_runs` означает «не оценивалась», а не «ничего не сработало». См. [Мониторинг транзакций в песочнице](https://docs.didit.me/ru/integration/sandbox-testing.md#мониторинг-транзакций-в-песочнице).
* `source` – `LIVE` для транзакций, переданных через API или SDK, `IMPORTED` для транзакций, загруженных через импорт CSV в консоли.

### Стороны

Каждая сторона транзакции представлена записью в `parties`. Эндпоинт создания записывает субъекта как `APPLICANT`, а необязательного контрагента как `COUNTERPARTY`; перечисление `role` также включает `REMITTER` и `BENEFICIARY`. Все записи имеют одинаковую структуру.

```json theme={null}
"parties": [
  {
    "uuid": "b1111111-2222-4333-8444-555555555555",
    "role": "APPLICANT",
    "entity_type": "individual",
    "kind": "USER",
    "vendor_data": "user-42",
    "full_name": "John Doe",
    "first_name": "John",
    "last_name": "Doe",
    "country_code": "USA",
    "dob": "1990-01-01",
    "address": { "line_1": "...", "city": "...", "country": "USA" },
    "institution_info": { "name": "...", "country_code": "..." },
    "device": {
      "fingerprint": "...",
      "persistent_device_id": "...",
      "user_agent": "...",
      "browser_family": "Chrome",
      "browser_version": "131.0",
      "platform": "web",
      "os_family": "Windows",
      "os_version": "10.0",
      "accept_language": "en-US,en;q=0.9",
      "session_id": "...",
      "session_age_ms": 84000,
      "metadata": {
        "accept_language": "en-US,en;q=0.9",
        "session_id": "...",
        "session_age_ms": 84000
      },
      "network_context": {
        "ip_address": "203.0.113.5",
        "ip_country": "United States",
        "ip_country_code": "US",
        "ip_state": "California",
        "ip_city": "San Francisco",
        "latitude": 37.7749,
        "longitude": -122.4194,
        "isp": "Example ISP",
        "organization": "Example Org",
        "is_vpn_or_tor": false,
        "is_data_center": false,
        "time_zone": "America/Los_Angeles",
        "time_zone_offset": "-0700",
        "asn_number": 64496,
        "asn_organization": "Example ISP",
        "connection_type": "isp",
        "carrier": null,
        "proxy_type": null
      }
    },
    "external_party_snapshot": null
  },
  {
    "uuid": "c2222222-3333-4444-8555-666666666666",
    "role": "COUNTERPARTY",
    "entity_type": "company",
    "kind": "EXTERNAL",
    "vendor_data": null,
    "full_name": "Acme Supplier",
    "first_name": null,
    "last_name": null,
    "country_code": "GBR",
    "dob": null,
    "address": {},
    "institution_info": {},
    "device": {},
    "external_party_snapshot": { "full_name": "Acme Supplier", "country": "GBR", "...": "..." }
  }
]
```

* `role` – `APPLICANT`, `COUNTERPARTY`, `REMITTER`, `BENEFICIARY`. Используйте фильтр по этому полю, чтобы найти субъекта.
* `entity_type` – `individual`, `company`, `external`, `unhostedWallet`, как передано.
* `kind` – `USER` или `BUSINESS`, если сторона связана с пользователем или бизнесом Didit через `vendor_data`; в остальных случаях `EXTERNAL`.
* `country_code` / `dob` – из переданных `address.country` и `date_of_birth`.
* `address` / `institution_info` – объекты в том виде, в каком они переданы; `{}`, если они не указаны.
* `external_party_snapshot` – зафиксированная копия данных стороны для сторон `EXTERNAL`; `null`, пока сторона связана с пользователем или бизнесом Didit.

#### `device`

`device` – это `device_context`, который вы передали для этой стороны, приведённый к snake\_case, с серверным обогащением данных об IP. Это `{}`, если в запросе не было контекста устройства, поэтому считайте каждый ключ необязательным.

| Ключ | Описание |
| - | - |
| `fingerprint`, `persistent_device_id` | Идентификаторы устройства, как переданы. |
| `user_agent`, `browser_family`, `browser_version`, `platform`, `os_family`, `os_version` | Атрибуты браузера и ОС, как переданы. `browser_family` и `platform` никогда не вычисляются из `user_agent`. |
| `accept_language`, `session_id`, `session_age_ms` | Атрибуты сессии, как переданы. Они также дублируются в `device.metadata` под теми же именами: именно туда их записывает путь через SDK. |
| `metadata` | Присутствует, если в запросе был объект `metadata` или любой из трёх атрибутов сессии. |
| `network_context` | Сетевой контекст, см. ниже. Отсутствует, если IP или сетевые данные не передавались. |

Отдельного объекта обогащения нет. Если у стороны был публичный `network_context.ip_address`, Didit определяет его прямо в процессе обработки и записывает [обогащённые поля](https://docs.didit.me/ru/transaction-monitoring/ip-enrichment.md#обогащённые-поля) в тот же объект `network_context`, заполняя только те ключи, которые вы не передали. Ключи, для которых резолвер вернул пустое значение, опускаются, поэтому полностью обогащённый `network_context` содержит четыре переданных ключа (`ip_address`, `ip_country_code`, `latitude`, `longitude`) и те из `ip_country`, `ip_state`, `ip_city`, `isp`, `organization`, `is_vpn_or_tor`, `is_data_center`, `time_zone`, `time_zone_offset`, `asn_number`, `asn_organization`, `connection_type`, `carrier` и `proxy_type`, которые были определены. `is_vpn_or_tor` и `is_data_center` всегда присутствуют после успешного определения.

Обогащение пропускается, и `network_context` возвращается ровно в том виде, в каком был передан, если IP отсутствует или не маршрутизируется, если приложение работает в песочнице или если определить данные не удалось. `ip_country_code` – это код ISO 3166-1 alpha-2, если Didit его определил, и значение, которое вы передали, в остальных случаях; условия правил приводят обе формы к единому виду перед сравнением.

### Платёжные методы

```json theme={null}
"payment_methods": [
  {
    "uuid": "...",
    "payment_method_type": "bank_account",
    "label": null,
    "fingerprint": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
    "account_id": "DE89370400440532013000",
    "issuing_country": "DE",
    "owner_kind": "USER",
    "vendor_data": "user-42",
    "owner_name": "John Doe",
    "institution_info": {},
    "details": { "method_type": "bank_account", "account_id": "DE89370400440532013000", "issuing_country": "DE" },
    "external_owner_snapshot": null,
    "role": "SOURCE"
  }
]
```

* `role` – `SOURCE`, `DESTINATION`, `FUNDING`, `BENEFICIARY`. Эндпоинт создания присваивает `SOURCE` / `DESTINATION` на основе `direction`: в исходящей транзакции платёжный метод субъекта получает `SOURCE`, а контрагента – `DESTINATION`; во входящей транзакции роли меняются местами.
* `payment_method_type` – `bank_card`, `bank_account`, `e_wallet`, `crypto_wallet`, `unhosted_wallet`, `other`.
* `fingerprint` – SHA-256 от `type:account_id:issuing_country`, стабильный для всех транзакций, поэтому вы можете отслеживать повторное использование одного и того же инструмента. `null`, если `account_id` не был передан.
* `owner_kind` / `vendor_data` / `owner_name` – владелец инструмента, с той же схемой `USER` / `BUSINESS` / `EXTERNAL`, что и у сторон.
* `details` – исходный объект `payment_method`, как передан.

### Запуски правил

```json theme={null}
"rule_runs": [
  {
    "uuid": "...",
    "rule": "f6a7b8c9-0123-4def-b012-3456789abcde",
    "rule_title": "High-value outbound",
    "rule_description": null,
    "rule_category": "finance",
    "matched": true,
    "is_test": false,
    "mode": "ACTIVE",
    "severity": "MEDIUM",
    "score_delta": 30,
    "status_target": null,
    "action_summary": "score +30",
    "metadata": {
      "scope_match": true,
      "conditions": [
        {
          "field": "amount",
          "operator": "gt",
          "expected_value": "10000",
          "current_value": "12500",
          "matched": true,
          "group_index": null,
          "group_logic": "AND",
          "field_source": null
        }
      ],
      "aggregations": []
    },
    "created_at": "2026-04-16T12:00:01Z"
  },
  {
    "uuid": "...",
    "rule": "...",
    "rule_title": "High-risk jurisdiction counterparty",
    "rule_description": null,
    "rule_category": "finance",
    "matched": true,
    "is_test": false,
    "mode": "ACTIVE",
    "severity": "HIGH",
    "score_delta": 35,
    "status_target": "IN_REVIEW",
    "action_summary": "score +35; change_status:IN_REVIEW; add_tag:high_risk_country",
    "metadata": { "scope_match": true, "conditions": [ ... ], "aggregations": [] },
    "created_at": "2026-04-16T12:00:01Z"
  }
]
```

* `rule` – UUID правила, которое запустилось; `rule_title`, `rule_description`, `rule_category` копируются из него.
* `matched` – запуск записывается только тогда, когда условия правила совпали, поэтому у боевых оценок всегда `matched: true`. Правила, которые были оценены без совпадения, не оставляют записи. Демонстрационные данные могут содержать строки с `matched: false`.
* `is_test` / `mode` – `true` и `TEST`, когда правило запущено в тестовом режиме; тестовый запуск записывается, но не влияет на `status`, `score` или `severity`.
* `score_delta` / `status_target` / `severity` – вклад этого запуска. `status_target` задаётся, когда выполнилось действие `change_status` или когда добавленная оценка пересекла [порог](https://docs.didit.me/ru/transaction-monitoring/risk-scoring.md).
* `action_summary` – строка с перечнем действий, выполненных правилом, объединённых через `; ` (`score +30`, `change_status:IN_REVIEW`, `add_tag:<name>`, `add_note`, `add_to_list`, `open_case`); `null`, если правило не выполнило ни одного действия.
* `metadata` – подробности оценки: `scope_match`, а также `conditions[]` и `aggregations[]`. В этих двух списках используются разные ключи значений:
  * `conditions[]` – одна запись на каждое условие с полями `field`, `operator`, `expected_value`, `current_value` (значение, прочитанное из транзакции), `matched`, `group_index` и `group_logic`. `field_source` всегда `null` для запусков правил транзакций; он классифицируется только для [событий мониторинга](https://docs.didit.me/ru/transaction-monitoring/events.md).
  * `aggregations[]` – одна запись на каждую агрегацию по частоте, количеству или сумме с полями `metric`, `field`, `operator`, `expected_value`, `computed_value` (вычисленное агрегацией значение), `window`, `filters`, `matched` и `sample_references`. Агрегации, которые можно вычислить только асинхронно, содержат `computed_value: null` и `deferred: true`.

### Оповещения

`alerts` сейчас всегда пустой массив.
Открытое оповещение означает удерживаемую транзакцию, поэтому смотрите `status` (`IN_REVIEW` или `AWAITING_USER`). См. [Оповещения](https://docs.didit.me/ru/transaction-monitoring/alerts.md).

### Активность

Журнал активности транзакции: создание, заметки, ручные проверки и изменения статуса.

```json theme={null}
"activities": [
  {
    "uuid": "...",
    "activity_type": "TRANSACTION_CREATED",
    "source": "TRANSACTION",
    "status": "APPROVED",
    "title": "withdrawal",
    "description": null,
    "metadata": { "action_type": "withdrawal", "direction": "OUTBOUND", "amount": "12500", "currency": "EUR" },
    "occurred_at": "2026-04-16T12:00:00Z"
  }
]
```

Заметки аналитика появляются здесь как записи `TRANSACTION_NOTE_ADDED`. Отдельного массива `notes` нет.

### Документы

Файлы, прикреплённые к транзакции в консоли. `[]`, если файлов нет.

```json theme={null}
"documents": [
  {
    "uuid": "...",
    "label": "Invoice",
    "note": null,
    "uploaded_by": "...",
    "created_at": "2026-04-16T12:05:00Z",
    "files": [
      { "uuid": "...", "file_url": "https://...", "original_filename": "invoice.pdf", "file_size": 48213 }
    ]
  }
]
```

Поле `file_url` содержит подписанный URL с коротким сроком действия: получайте его по мере необходимости, а не сохраняйте.

### Результаты провайдеров

Результаты внешних провайдеров (скрининг хеша транзакции, скрининг кошельков, мониторинг фиатных операций, скрининг санкций).

```json theme={null}
"provider_results": [
  {
    "uuid": "...",
    "result_type": "TRANSACTION_SCREENING",
    "provider": "merklescience",
    "status": "SCREENED",
    "severity": "HIGH",
    "score": 82,
    "summary": "Merkle Science risk: High (4/5). Dominant risk: stolen_funds. Driven by: 50% direct incoming exposure to Theft / Hack (Stolen Funds)",
    "payload": {
      "provider": "merklescience",
      "screening_type": "TRANSACTION_SCREENING",
      "transaction_hash": "0x...",
      "wallet_address": null,
      "blockchain": "ETH",
      "block_timestamp": "2026-04-01T00:07:11Z",
      "total_value_usd": 2942.31,
      "fee_usd": 0.09,
      "transaction_flows": [
        {
          "flow_type": "token",
          "from_address": "0x...",
          "to_address": "0x...",
          "amount": 72.83039728,
          "amount_usd": 235.97,
          "currency": "UNI",
          "token_name": "Uniswap",
          "token_address": "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984",
          "transaction_hash": "0x...",
          "block_timestamp": "2026-04-01T00:07:11Z",
          "index": 460,
          "success": true,
          "metadata": {
            "provider": "blockscout",
            "token_type": "ERC-20",
            "token_icon_url": "https://...",
            "token_reputation": "ok",
            "token_holders_count": "410093",
            "from": {
              "label": "ravaga.eth",
              "tags": [{ "name": "Beacon Depositor", "type": "generic" }]
            },
            "to": {
              "label": "AirSwap: Spender",
              "is_contract": true,
              "is_verified": true
            }
          }
        }
      ],
      "source_of_funds": [
        {
          "category": "stolen_funds",
          "entity_name": "Stolen Funds",
          "entity_type": "Theft",
          "entity_subtype": "Hack",
          "exposure_direction": "incoming",
          "exposure_type": "direct",
          "is_direct": true,
          "amount_usd": 1471.16,
          "percentage": 50,
          "country": ""
        }
      ],
      "destination_of_funds": [],
      "counterparty_connections": [],
      "sanctions_hit": false,
      "risk_factors": [
        {
          "source": "exposure",
          "category": "stolen_funds",
          "label": "Theft / Hack",
          "entity_name": "Stolen Funds",
          "direction": "incoming",
          "exposure_type": "direct",
          "amount_usd": 1471.16,
          "percentage": 50,
          "is_high_risk": true,
          "description": "50% direct incoming exposure to Theft / Hack (Stolen Funds)"
        }
      ],
      "raw_response": { "...": "provider-specific details" }
    },
    "created_at": "2026-04-16T12:00:02Z"
  }
]
```

`result_type`: `FIAT_MONITORING`, `WALLET_SCREENING`, `TRANSACTION_SCREENING`, `TRAVEL_RULE`, `NETWORK_GRAPH`, `CUSTOM`.

`payload.risk_factors` — ранжированное объяснение `score`: что привело к вердикту, сначала факторы высокого риска, затем по объёму переведённых средств. Высокий `score` без записи `is_high_risk` означает, что провайдер оценил субъект по собственной модели подверженности риску, не сообщив о совпадении с санкционным списком или атрибутированной сущностью; `summary` указывает на это прямо. Справочник по полям: [Факторы риска](https://docs.didit.me/ru/transaction-monitoring/wallet-screening.md#факторы-риска). Результаты, проверенные до появления этого поля, не содержат этот ключ.

Для скрининга хешей криптотранзакций `transaction_flows` заполняется, когда доступно обогащение данными из блокчейна. Оно нормализует активность в сети, чтобы консоль могла отобразить и обзор транзакции, и граф визуализации по одному и тому же ответу.

Поддерживаемые источники обогащения:

* Цепочки EVM используют Blockscout для нормализации основной транзакции, внутренних вызовов и переводов токенов.
* Bitcoin использует mempool.space для нормализации входов и выходов транзакции.
* Solana использует Helius для нормализации переводов нативного SOL, переводов токенов SPL и доступного контекста событий NFT.

Каждый элемент `transaction_flows[]` содержит стабильные нормализованные поля (`flow_type`, `from_address`, `to_address`, `amount`, `amount_usd`, `currency`, `token_name`, `token_address`, `transaction_hash`, `block_timestamp`, `index`, `success`) и специфичные для провайдера `metadata`.

Типичные примеры `metadata`:

```json theme={null}
{
  "provider": "blockscout",
  "decoded_method_call": "swap(string aggregatorId, address tokenFrom, uint256 amount, bytes data)",
  "block_number": 23141214,
  "gas_used": "171843",
  "fee_native": 0.000342317619518133,
  "token_icon_url": "https://...",
  "token_reputation": "ok"
}
```

```json theme={null}
{
  "provider": "mempool",
  "role": "input",
  "previous_txid": "4c0c...",
  "previous_vout": 0,
  "scriptpubkey_type": "v0_p2wpkh",
  "fee_btc": 0.00000322,
  "block_height": 943130
}
```

```json theme={null}
{
  "provider": "helius",
  "source": "MAGIC_EDEN",
  "type": "NFT_BID",
  "description": "Wallet bid 2.5 SOL on an NFT.",
  "slot": 136658192,
  "fee_sol": 0.000005,
  "nft_event": {
    "type": "NFT_BID",
    "source": "MAGIC_EDEN",
    "nft_mints": ["3bUW..."]
  }
}
```

`metadata` дополняет данные и зависит от провайдера. Не создавайте критичные интеграции, которые требуют наличия каждого ключа для каждой сети.

### Travel Rule

`null`, если у транзакции нет перевода или проверки по Travel Rule. Поле заполняется, когда вы отправляете `travel_rule_details`, а также когда [Travel Rule](https://docs.didit.me/ru/transaction-monitoring/travel-rule.md) включён для приложения и транзакция создана с `transaction_category: "travelRule"`. В этом случае Didit сам инициирует обмен, с `travel_rule_details` или без них, и отражает его `status` здесь. Читайте это поле, а не запрос, который вы отправили.
При входящем переводе `originator_data` и `beneficiary_data` контрагента остаются замаскированными (`data_masked: true`), пока владение кошельком не подтверждено (см. [Замаскированные данные контрагента](https://docs.didit.me/ru/transaction-monitoring/travel-rule.md#маскирование-данных-контрагента)).

```json theme={null}
"travel_rule": {
  "uuid": "...",
  "status": "COMPLETED",
  "required": true,
  "protocol": "TRP",
  "obligations_count": 2,
  "originator_data": { "name": "...", "wallet_address": "..." },
  "beneficiary_data": { "name": "...", "wallet_address": "..." },
  "metadata": {},
  "direction": "OUTBOUND",
  "rail": "TRP",
  "counterparty_vasp": null,
  "delivery": {
    "kind": "SEND",
    "status": "DELIVERED",
    "rail": "TRP",
    "attempts": 1,
    "last_error": "",
    "next_attempt_at": null,
    "delivered_at": "..."
  },
  "discovery": [ ... ],
  "reason": "",
  "next_actions": []
}
```

`direction`, `rail`, `counterparty_vasp`, `delivery`, `discovery`, `reason` и `next_actions` имеют ту же структуру, что и в endpoint переводов.
`reason` и `next_actions` объясняют, почему перевод со статусом `COUNTERPARTY_VASP_NOT_FOUND` или `COUNTERPARTY_VASP_NOT_REACHABLE` застрял и что позволяет продолжить его обработку. Для любых других статусов они равны `""` и `[]`. См. [Почему перевод застрял](https://docs.didit.me/ru/transaction-monitoring/travel-rule.md#почему-перевод-застрял).
Каждая строка в [`GET /v3/transactions/`](https://docs.didit.me/ru/management-api/transactions/list) содержит тот же блок.

См. [Travel Rule](https://docs.didit.me/ru/transaction-monitoring/travel-rule.md).

### Снимок сети

Сохранённый граф целиком, а не ссылка на него. Он приходит из одного из двух источников:

* `network_snapshot`, который вы отправили вместе с транзакцией, или
* граф, который Didit строит, когда [AML-скрининг кошельков](https://docs.didit.me/ru/transaction-monitoring/aml-screening.md) успешно завершается для криптотранзакции, даже если запрос не содержал `network_snapshot`. Граф, построенный при скрининге, заменяет отправленный, а асинхронный повторный скрининг его обновляет.

`null`, если нет ни одного из них:

```json theme={null}
"network_snapshot": {
  "uuid": "...",
  "nodes": [ ... ],
  "edges": [ ... ],
  "metrics": { }
}
```

Страница транзакции в консоли отображает тот же граф.

### Теги, metadata, props

* `tags[]`: прикреплённые теги (по действию правила или аналитиком): `{ "uuid", "name", "color", "description", "source" }`, где `source` равен `didit` для предустановленного тега и `custom` для вашего тега.
* `metadata`: снимок payload-ов `subject` и `counterparty` в точности таком виде, в каком вы их отправили при создании, под этими двумя ключами.
* `props`: `custom_properties`, которые вы передали при создании. Каждый ключ можно использовать в условиях правил как `custom_values.<key>`.

### Устранение нарушения

Когда правило переводит транзакцию в `AWAITING_USER`, Didit создаёт связанную сессию верификации и возвращает её в двух полях:

* `remediation`: связанная сессия `{ "session_id", "session_token", "url", "status" }`. Поле остаётся заполненным на протяжении всей жизни транзакции, поэтому вы всегда видите, чем закончилось действие пользователя.
* `action_required`: действие, которое пользователь должен выполнить прямо сейчас, или `null`, когда больше нет ожидающих действий: `{ "type": "verification_session", "url", "session_id", "session_token", "status" }`. Перенаправьте пользователя на `url` или передайте `session_token` в SDK Didit. Действия Travel Rule с подтверждением владения кошельком используют `{ "type": "wallet_ownership", "url", "widget_session_id", "expires_at" }` и имеют приоритет, если применимы оба варианта. Когда действие с подтверждением кошелька ожидает выполнения, а контрагент перевода не найден, тот же блок также содержит `reason` и `next_actions` (см. [поиск контрагента](https://docs.didit.me/ru/transaction-monitoring/travel-rule.md#поиск-контрагента)).

Те же два поля передаются в payload-ах webhook-событий `transaction.created` и `transaction.status.updated` (`action_required`). См. [webhook](https://docs.didit.me/ru/transaction-monitoring/webhooks.md).

### Разбивка стоимости

`null`, пока для транзакции не выполнялась ни одна тарифицируемая функция. Иначе `{ "total_price", "items": [ { "usage_type", "price", "details" } ] }`, по одному элементу на каждую тарифицируемую функцию (скрининг, обогащение и так далее).

## Конвертация валют

`preferred_currency_amount` представляет собой значение `amount`, пересчитанное в предпочтительную валюту вашего приложения по среднерыночному курсу, если только вы не передали `amount_in_default_currency`. В этом случае используется уже пересчитанное значение из этого поля. Условия правил для `amount` сравнивают исходную сумму. Если нужен единый порог для всех валют, используйте `preferred_currency_amount` в условиях.

## Следующие шаги

> [card] [Отправка транзакций](https://docs.didit.me/ru/transaction-monitoring/transactions.md)
>
> Полная схема запроса.

> [card] [Статусы](https://docs.didit.me/ru/transaction-monitoring/statuses.md)
>
> Что означает каждый статус.

> [card] [Скоринг риска](https://docs.didit.me/ru/transaction-monitoring/risk-scoring.md)
>
> Как вычисляется оценка.


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