---
title: "Identify who holds a destination wallet"
method: POST
path: "/customers/{customer_id}/destination-identifications"
tags: ["Customers"]
---

# Identify who holds a destination wallet

`POST /customers/{customer_id}/destination-identifications`

## Request

- Base URL: `https://developers.ozav.io/v2`
- URL: `https://developers.ozav.io/v2/customers/{customer_id}/destination-identifications`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

Records who holds a wallet the customer sent crypto to: the customer's own self-hosted wallet (with the ownership attestation), or the customer's account at an exchange. OZAV asks for it with a `requirement.due` webhook (`reason: destination_unidentified`) and a `documents_due` item with `purpose: travel_rule`; answering closes that item. You can also send it before being asked. The identification applies to every send of the customer to the same wallet. It does not allow or block any send.

## Path parameters

- `customer_id` string, required

## Request body

- DestinationIdentificationRequest: Who holds a destination wallet the customer sent crypto to. The vocabulary is the one of `TravelRule.beneficiary`: `self_custodied` is the customer's own wallet, `external` is the customer's account at an exchange.
  - `chain` string, required: The network of the address, with the name the send used (e.g. `tron`, `ethereum`, `solana`). Any other spelling is refused with `422`, because it would never match the send.
  - `address` string, required: The destination address. EVM addresses are matched case-insensitively.
  - `wallet_type` 'self_custodied' | 'external', required: `self_custodied` - the customer's own wallet (holds the keys). `external` - the customer's account at an exchange.
  - `wallet_attested_ownership_at` string, date-time: Required with `self_custodied` - when the customer attested owning the wallet. Must not be in the future.
  - `exchange` object: Required with `external` - the exchange where the customer has the account.
    - `name` string, required: Legal or trade name of the exchange.
    - `lei` string: The exchange's Legal Entity Identifier, when known.

## Response `201`

The identification, as recorded.

- DestinationIdentification: A destination wallet identified for a customer. It applies to every send of that customer to the same `chain` and `address`, past and future. Posting again for the same wallet records a new identification; the latest one applies. It does not allow or block any send.
  - `object` 'destination_identification', required: Resource type discriminator; always `destination_identification`.
  - `customer_id` string, required: The `ozav_cus_` id of the customer.
  - `chain` string, required: The network, lowercase.
  - `address` string, required: The address as stored (EVM in lowercase).
  - `wallet_type` 'self_custodied' | 'external', required: Who holds the wallet.
  - `wallet_attested_ownership_at` string, date-time, nullable: Present with `self_custodied`.
  - `exchange` object: Present with `external`.
    - `name` string, nullable: Name of the exchange.
    - `lei` string, nullable: LEI of the exchange, when given.
  - `declared_at` string, date-time, nullable, required: When the identification was recorded.
  - `requirement_satisfied` boolean: Only on the create response - `true` when it answered an open `destination_unidentified` item of the customer.

## Other responses

- `401`: Missing or invalid API key.
- `403`: The organization lacks the entitlement (code ENTITLEMENT_REQUIRED) or the key lacks the scope (code INSUFFICIENT_SCOPE). On money-moving requests (POST /transfers, POST /wallets/{wallet_id}/transfers) a compliance hold on the customer answers with code COMPLIANCE_HOLD: the hold is reviewed and lifted on OZAV's side; retrying does not clear it. When the only hold is a pause until pending onboarding documents are received, a withdrawal answers CUSTOMER_DOCUMENTS_PENDING instead: send what `requirements` on GET /customers/{id} lists; OZAV lifts the pause after reviewing it. On OZAV Services (live without the platform's KYB), any API outside decisions, screenings, lists and self-custody wallets answers with code PRODUCTION_NOT_ACTIVATED.
- `404`: The resource does not exist, is not visible to the caller, or the id was malformed for this position (see "Resource ids" under Errors). These share one status; `code` and `message` tell them apart.
- `422`: The request is well-formed but cannot be fulfilled - e.g. a `rail` that is not served (see `Rail.x-ozav-rail-availability`).

---

[API](https://skmtc.dev/ozav/apis/ozav-api.md) - [All operations](https://skmtc.dev/ozav/apis/ozav-api/llms.txt) - [OpenAPI document](https://skmtc.dev/ozav/apis/ozav-api/revisions/4133dc2109d7?raw)
