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

# AML по депозиту: получить результат скрина

> Получить AML-данные депозита (source-of-funds) по его uuid или по вашему order_id, понять поведение hold

Когда платформа принимает депозит, она автоматически прогоняет **AML-скрин source-of-funds** —
проверку адреса **отправителя** входящей транзакции на риск (санкции, миксеры, скам, даркнет и т.п.).
Эти эндпоинты отдают результат уже выполненного скрина по существующему депозиту — по его `uuid`
(из ответа на создание депозита) **или** по вашему `order_id`.

<Note>
  Это **read-only** выдача результата. Сам скрин запускает платформа автоматически при обнаружении
  входящей транзакции — отдельно ничего вызывать не нужно. Чтобы проскринить произвольный адрес или
  транзакцию по запросу, используйте [AML-скрин адресов](/aml/overview).
</Note>

Аутентификация — та же HMAC-подпись, что и у депозитов (см. [Аутентификация](/authentication)).
Ответы — в конверте `{ "ok": true, "data": ... }`. Если AML не лицензирован на инстансе, эндпоинты
вернут `403` с кодом `LICENSE_REQUIRED`.

## Эндпоинты

| Метод | Путь                                            | Идентификация        |
| ----- | ----------------------------------------------- | -------------------- |
| `GET` | `/v1/public/deposits/{uuid}/aml`                | по `uuid` депозита   |
| `GET` | `/v1/public/deposits/by-order-id/{orderId}/aml` | по вашему `order_id` |

Оба варианта возвращают одинаковую структуру. Запросы скоупятся по вашему сайту — чужой депозит
вернёт `404` (существование чужих данных не раскрывается).

<Note>
  Если AML на инстансе **выключен**, входящая транзакция ещё **не замечена**, или сеть/валюта **не
  поддерживается** провайдером — вернётся валидный ответ с `amlStatus: "not_checked"` и `null` в полях
  оценки. Это **не** значит «чисто» — это значит «оценки нет». Поле `checkState` отражает жизненный
  цикл самого запроса к провайдеру.
</Note>

***

## Получить AML депозита

<RequestExample>
  ```bash по uuid theme={null}
  curl https://wallet.your-exchange.com/v1/public/deposits/8f3a1c2e-5b6d-4e7f-9a0b-1c2d3e4f5a6b/aml \
    -H "X-Api-Id: pk_live_a1b2c3d4" \
    -H "X-Timestamp: 1781524800" \
    -H "X-Signature: 9f1c2b3a4d5e6f70819a2b3c4d5e6f70819a2b3c4d5e6f70819a2b3c4d5e6f70"
  ```

  ```bash по order_id theme={null}
  curl https://wallet.your-exchange.com/v1/public/deposits/by-order-id/order_2026_000123/aml \
    -H "X-Api-Id: pk_live_a1b2c3d4" \
    -H "X-Timestamp: 1781524800" \
    -H "X-Signature: 819a2b3c4d5e6f70819a2b3c4d5e6f70819a2b3c4d5e6f70819a2b3c4d5e6f70"
  ```

  ```javascript Node.js theme={null}
  const uuid = "8f3a1c2e-5b6d-4e7f-9a0b-1c2d3e4f5a6b";
  const res = await fetch(
    `${BASE_URL}/v1/public/deposits/${uuid}/aml`,
    { headers: signedHeaders() }, // GET → пустое тело → message = "<ts>."
  );
  const { ok, data } = await res.json();

  if (data.amlStatus === "hold") {
    // средства задержаны платформой, ждут ручного решения оператора — не выдавайте клиенту
  }
  ```
</RequestExample>

<ResponseExample>
  ```json 200 OK theme={null}
  {
    "ok": true,
    "data": {
      "uuid": "8f3a1c2e-5b6d-4e7f-9a0b-1c2d3e4f5a6b",
      "orderId": "order_2026_000123",
      "assetCode": "USDT_TRC20",
      "network": "TRON",
      "senderAddress": "TKh9xY2bV8cE3fG4hJ5kL6mN7pQ8rS9tU",
      "amlStatus": "passed",
      "checkState": "success",
      "riskScore": "12.50",
      "riskLevel": "low",
      "decision": "pass",
      "provider": "getblock",
      "topSignal": "exchange",
      "signals": { "exchange": 0.8, "p2p": 0.1 },
      "reportUrl": "https://provider.example/report/0f1c8b2a",
      "shareUrl": null,
      "checkedAt": "2026-06-18T12:00:03.000Z",
      "manualAction": null,
      "manualActionAt": null,
      "manualActionReason": null
    }
  }
  ```

  ```json 200 OK (не проверялся) theme={null}
  {
    "ok": true,
    "data": {
      "uuid": "8f3a1c2e-5b6d-4e7f-9a0b-1c2d3e4f5a6b",
      "orderId": "order_2026_000123",
      "assetCode": "USDT_TON",
      "network": "TON",
      "senderAddress": null,
      "amlStatus": "not_checked",
      "checkState": null,
      "riskScore": null,
      "riskLevel": null,
      "decision": null,
      "provider": null,
      "topSignal": null,
      "signals": null,
      "reportUrl": null,
      "shareUrl": null,
      "checkedAt": null,
      "manualAction": null,
      "manualActionAt": null,
      "manualActionReason": null
    }
  }
  ```
</ResponseExample>

### Поля ответа

<ResponseField name="uuid" type="string">UUID депозита (тот же, что в `GET /v1/public/deposits/{uuid}`).</ResponseField>
<ResponseField name="orderId" type="string">Ваш `order_id`, переданный при создании депозита.</ResponseField>
<ResponseField name="assetCode" type="string">Код актива депозита (например `USDT_TRC20`).</ResponseField>
<ResponseField name="network" type="string">Код сети депозита.</ResponseField>
<ResponseField name="senderAddress" type="string | null">Адрес отправителя входящей транзакции — именно он проходит скрин. `null`, пока транзакция не замечена.</ResponseField>
<ResponseField name="amlStatus" type="string">Итоговый AML-статус депозита: `not_checked`, `passed`, `flagged`, `hold`, `rejected`. См. ниже.</ResponseField>
<ResponseField name="checkState" type="string | null">Состояние запроса к провайдеру: `pending`, `success`, `failed`, `error`, `skipped`. `null`, если проверки не было.</ResponseField>
<ResponseField name="riskScore" type="string | null">Риск-скор `0`–`100` строкой. `null`, если проверки не было.</ResponseField>
<ResponseField name="riskLevel" type="string | null">`low`, `medium`, `high`, `severe`. См. [Уровни риска](/aml/risk-levels).</ResponseField>
<ResponseField name="decision" type="string | null">Решение скрина: `pass`, `flag`, `block`.</ResponseField>
<ResponseField name="provider" type="string | null">Код AML-провайдера, выполнившего скрин.</ResponseField>
<ResponseField name="topSignal" type="string | null">Категория риска с максимальным весом (например `mixer`, `sanctions`, `scam`, `darknet`).</ResponseField>
<ResponseField name="signals" type="object | null">Карта категорий риска и их весов `0..1`. `null`, если провайдер их не вернул.</ResponseField>
<ResponseField name="reportUrl" type="string | null">Ссылка на полный отчёт провайдера, если доступна.</ResponseField>
<ResponseField name="shareUrl" type="string | null">Публичная share-ссылка на отчёт, если доступна.</ResponseField>
<ResponseField name="checkedAt" type="string | null">Когда выполнен скрин (ISO-8601). `null`, если проверки не было.</ResponseField>
<ResponseField name="manualAction" type="string | null">Ручное действие оператора над задержанным депозитом: `release` (разрешить свип) или `quarantine_now`. `null`, если оператор ещё не вмешивался.</ResponseField>
<ResponseField name="manualActionAt" type="string | null">Когда применено ручное действие (ISO-8601).</ResponseField>
<ResponseField name="manualActionReason" type="string | null">Комментарий оператора к ручному действию.</ResponseField>

***

## Итоговый статус депозита (`amlStatus`)

`amlStatus` — это решение платформы по депозиту в целом. Оно выводится из `decision` скрина по
настроенной оператором политике (пороги риска и действия).

| `amlStatus`   | Что значит                                                                    | Влияние на депозит                                                            |
| ------------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| `not_checked` | Скрина не было: AML выключен, tx ещё не замечена или валюта не поддерживается | Депозит обрабатывается штатно. Это не оценка «чисто»                          |
| `passed`      | Скрин пройден, риск ниже порогов                                              | Депозит обрабатывается штатно                                                 |
| `flagged`     | Помечен как подозрительный, но не заблокирован                                | Депозит обрабатывается, но требует вашего внимания и/или ручного разбора      |
| `hold`        | Заблокирован: средства задержаны, ждут ручного решения оператора              | Свип не выполняется до решения оператора. Не выдавайте средства/обмен клиенту |
| `rejected`    | Отклонён                                                                      | Депозит не зачисляется                                                        |

## Поведение при высоком риске (hold)

Когда скрин возвращает `decision: "block"` (риск выше блок-порога **или** обнаружен критичный сигнал
уровня `severe` — например санкции), платформа по умолчанию переводит депозит в `amlStatus: "hold"`:

* средства **не сметаются** (sweep) на системные кошельки до явного решения оператора;
* оператор в Админке принимает решение — оно отражается в полях `manualAction` / `manualActionAt` /
  `manualActionReason`:
  * `release` — снять блокировку и разрешить обычный свип;
  * `quarantine_now` — увести средства на отдельный карантинный кошелёк.

<Warning>
  `amlStatus: "hold"` — сигнал вашей CMS **не выдавать** клиенту средства/услугу по этому депозиту, пока
  статус не сменится. Конкретные пороги и действие при блокировке (`hold` или сразу карантин) настраивает
  оператор, в том числе индивидуально по валюте.
</Warning>

Категория `flag` (риск между warn- и block-порогом) по умолчанию не блокирует депозит и даёт
`amlStatus: "flagged"`, но оператор может настроить более строгое действие для конкретной валюты.

***

## Частые ошибки

| HTTP  | `error.code`                           | Когда возникает                                            | Что делать                             |
| ----- | -------------------------------------- | ---------------------------------------------------------- | -------------------------------------- |
| `403` | `LICENSE_REQUIRED`                     | AML не лицензирован на инстансе                            | Включить фичу AML на стороне оператора |
| `404` | `DEPOSIT_NOT_FOUND`                    | Нет депозита с таким `uuid`/`order_id` или он чужого сайта | Проверьте идентификатор                |
| `401` | `INVALID_SIGNATURE` / `TIMESTAMP_SKEW` | Подпись не сошлась или часы разъехались                    | См. [Аутентификация](/authentication)  |
| `429` | `RATE_LIMITED`                         | Превышен per-site лимит                                    | См. [Rate limits](/rate-limits)        |

## Частые вопросы

<AccordionGroup>
  <Accordion title="Когда появляется senderAddress?">
    `senderAddress` заполняется, когда платформа увидела входящую блокчейн-транзакцию депозита. До этого
    момента (и пока tx не подтверждена) он будет `null`, а `amlStatus` — `not_checked`.
  </Accordion>

  <Accordion title="Нужно ли мне самому запускать скрин депозита?">
    Нет. Скрин адреса отправителя выполняется автоматически при приёме депозита (если AML включён и сеть
    поддерживается). Эти эндпоинты только отдают готовый результат.
  </Accordion>

  <Accordion title="checkState = skipped — это плохо?">
    Это значит, что валюта/сеть не поддерживается провайдером, поэтому скрин пропущен. Оценки риска нет —
    трактуйте как «не проверено», а не как «чисто».
  </Accordion>

  <Accordion title="Как узнать о смене amlStatus, не опрашивая постоянно?">
    Используйте вебхуки депозита: статусные изменения приходят на ваш `callback_url`. Деталь AML затем
    читайте этими эндпоинтами. Подробнее про депозиты — [Депозиты](/deposits/overview).
  </Accordion>
</AccordionGroup>
