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

# Travel Rule: API Sunrise per trasferimenti in entrata

> Registra i dati Travel Rule per un deposito crypto già regolato on-chain prima di qualsiasi scambio: il flusso Sunrise post-deposito con Didit.



Prompt dell'API per registrare un trasferimento in entrata Sunrise
        Copia il prompt negli appunti



      
      

\<pre>

\`Register Travel Rule data for a crypto deposit that settled on-chain BEFORE any exchange took place - because the sending VASP was unreachable at the time (the sunrise problem), or when backfilling historical deposits.

Endpoint:
POST https://verification.didit.me/v3/travel-rule/inbound/

Authentication:
Use the x-api-key header with my Didit API key. You are the beneficiary VASP.

Request body (application/json):
\{
"chain": "ETH",                        // required; stored lowercased and matched case-insensitively against your address-book entries' chain
"txid": "0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060",   // dedupe key: same txid + wallet_address returns the existing transfer
"wallet_address": "0x8ba1f109551bD432803012645Ac136ddd64DBA72",   // an XRP X-address is split into its classic address and tag
"memo": "",                              // optional destination tag or memo: on a shared deposit address it names your customer
"amount": "500.00",
"currency": "USDC",
"originator_data": { "name": "Origin CASP SL" },      // flat originator details from the sender, if known (name or full_name, first_name, last_name, vendor_data)
"beneficiary_data": { "name": "Ana Diaz" },           // flat beneficiary details (your customer); name is matched against the entry's holder_name
"originating_vasp": { "name": "Origin CASP SL", "lei": "984500ABCDEF12345634", "travel_address": "taHg7hkTmJ4mTpdQxn61H9cyx6RreB2jrDHeB3pkioRRBgKQaSAGUzp73FVsmEXXJVxdAuCCWiBEFMkcB4MCtcyjnpbyEbTeSHwym394NMS7ev" },  // optional sender identity
"utxo": { "inputs": [ { "address": "bc1q...", "amount": "0.5" } ], "outputs": [ { "address": "bc1q...", "amount": "0.25" } ] }  // optional, BTC/LTC/BCH/DOGE only
}

Behavior:
\- Creates an inbound travelRule transaction (or reuses an unclaimed recorded deposit) and resolves it against your wallet address book, by the address and its memo (an entry with exactly that memo first, else one for the whole address; a deposit without a memo never reaches an entry that has one):
\- no matching entry -> ON_HOLD
\- entry exists, ownership unproven -> UNCONFIRMED_OWNERSHIP
\- name does not match the entry's holder_name -> COUNTERPARTY_MISMATCHED_DATA
\- verified entry + name match -> COMPLETED then immediately FINISHED (the deposit already settled).
\- The address-book match is chain-scoped: an entry matches when its chain equals the request chain (case-insensitive) or the entry's chain is blank, and "ethereum" does not match "ETH".
\- Resolve ON_HOLD (and UNCONFIRMED_OWNERSHIP) with POST /v3/transactions/{transaction_id}/travel-rule/ownership/.
\{"confirmed": true} registers or verifies the wallet entry and runs the name match; {"confirmed": false} declines the transfer.
ON_HOLD does not change the transaction status by itself; only a rule that acts on the Travel Rule status changes it (for example the opt-in library preset travel-rule-pending-action sets AWAITING_USER).
\- Naming originating_vasp keeps the sender's identity on this transfer (metadata.originating_vasp, and the transfer's originator VASP in GET /v3/travel-rule/transfers/); it never creates or changes a shared VASP directory entry.
originating_vasp.lei must be a valid 20-character LEI (ISO 17442) or blank, and originating_vasp.travel_address must be a valid travel address or blank.
An inbound TRP inquiry does not create or change its sender's directory entry either.
\- Webhooks: when a new transaction was created, transaction.created is sent first and travel_rule.status.updated follows for each status transition.
Each webhook is delivered and retried on its own, so do not rely on arrival order; key on transaction_id.
\- Billing: there is no base fee.
A newly created deposit is screened and charged the Wallet Verification & Screening rate only when crypto monitoring is enabled and chain is one Didit can screen (btc, eth, sol, trx, matic, bnb, ltc, xrp, bch, doge, or their full names such as bitcoin or ethereum).
Sandbox applications are never charged.
\- utxo: the sender's wallet is originator_data.wallet_address when you declare it, else the input address that contributed the most. The result is on travel_rule.chain_details.

What to read from the response:
\- transaction_id - the Didit transaction uuid, used in /v3/transactions/{transaction_id}/ calls.
\- txn_id - tr-in-{first 80 characters of txid}-{12 hex characters} for a new transaction, or the existing txn_id of a reused recorded deposit.
\- created - true (201) when this call registered the deposit, false (200) when the same txid + wallet_address was already registered.
\- travel_rule - the full transfer object: uuid, status, direction, rail, protocol, ivms_version, required, ownership_confirmed, deadline_at, timeline, counterparty_vasp, originator_data, beneficiary_data, delivery, discovery, reason, next_actions, created_at.
beneficiary_data includes the wallet_address and the lowercased chain.
originator_data and beneficiary_data stay masked in the response (data_masked: true) until wallet ownership is confirmed.
\- travel_rule.status - the resolved state (see above).

Failure modes:
\- 400 - a missing required field (chain, txid, wallet_address, amount, currency), an invalid originating_vasp.lei, or an invalid travel address ("Invalid travel address.").
\- 403 - missing x-api-key (a wrong, revoked or expired key gets 401).

Full guide: /transaction-monitoring/travel-rule#after-deposit-sunrise-registration.`

\</pre>



      
      

Incolla in



## OpenAPI

````yaml it/openapi-25.json POST /v3/travel-rule/inbound/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API di verifica dell'identità. Autenticati con l'intestazione x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/travel-rule/inbound/:
    post:
      tags:
        - Travel Rule
      summary: Registra un trasferimento in entrata successivo al deposito (sunrise)
      description: >-
        Registra i dati della Travel Rule per un deposito in criptovalute già
        regolato on-chain prima che avvenisse qualsiasi scambio. Crea una
        transazione travelRule in entrata (o riutilizza un deposito non
        riscattato) e riconcilia il trasferimento con la rubrica dei tuoi
        indirizzi wallet. Per una transazione appena creata, Didit invia prima
        transaction.created e successivamente i webhook
        travel_rule.status.updated.
      operationId: registerTravelRuleInbound
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleInboundRequest'
            example:
              chain: ETH
              txid: 0xdeposit-hash
              wallet_address: 0xYourDepositWallet
              amount: '500.00'
              currency: USDC
              originator_data:
                name: Origin CASP SL
              beneficiary_data:
                name: Ana Diaz
              originating_vasp:
                name: Origin CASP SL
                lei: ''
                travel_address: >-
                  ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC
      responses:
        '200':
          description: >-
            Un trasferimento per questo txid e wallet_address era già
            registrato; quello esistente viene restituito invariato (created è
            false).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleInboundResponse'
        '201':
          description: >-
            È stato registrato un nuovo trasferimento Travel Rule, su una nuova
            transazione in entrata o su un deposito esistente non reclamato
            (created è true).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleInboundResponse'
        '400':
          description: >-
            Un campo obbligatorio (`chain`, `txid`, `wallet_address`, `amount`,
            `currency`) è mancante, `originating_vasp.lei` non è un LEI valido,
            `originating_vasp.travel_address` non è un Travel Address valido, un
            memo, un X-address o un `utxo` che la rete non può supportare,
            oppure `originator_data` / `beneficiary_data` non è un oggetto.
          content:
            application/json:
              examples:
                Missing field:
                  value:
                    txid:
                      - This field is required.
                Invalid LEI:
                  value:
                    originating_vasp:
                      lei:
                        - >-
                          Invalid LEI: expected 20 alphanumeric characters (ISO
                          17442).
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST https://verification.didit.me/v3/travel-rule/inbound/ \
              -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \
              -d '{"chain":"ETH","txid":"0xdeposit-hash","wallet_address":"0xYourDepositWallet","amount":"500.00","currency":"USDC"}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.travel_rule.register_inbound(
                chain="ETH",
                txid="0xdeposit-hash",
                wallet_address="0xYourDepositWallet",
                amount="500.00",
                currency="USDC",
                originator_data={"name": "Origin CASP SL"},
                beneficiary_data={"name": "Ana Diaz"},
                originating_vasp={
                    "name": "Origin CASP SL",
                    "lei": "",
                    "travel_address": "ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC",
                },
            )
            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.travelRule.registerInbound({
              chain: "ETH",
              txid: "0xdeposit-hash",
              wallet_address: "0xYourDepositWallet",
              amount: "500.00",
              currency: "USDC",
              originator_data: { name: "Origin CASP SL" },
              beneficiary_data: { name: "Ana Diaz" },
              originating_vasp: {
                name: "Origin CASP SL",
                lei: "",
                travel_address: "ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC",
              },
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.RegisterInbound(ctx, didit.TravelRuleInboundRequest{\n\tChain:           \"ETH\",\n\tTxid:            \"0xdeposit-hash\",\n\tWalletAddress:   \"0xYourDepositWallet\",\n\tAmount:          \"500.00\",\n\tCurrency:        \"USDC\",\n\tOriginatorData:  didit.Some(map[string]any{\"name\": \"Origin CASP SL\"}),\n\tBeneficiaryData: didit.Some(map[string]any{\"name\": \"Ana Diaz\"}),\n\tOriginatingVASP: didit.Some(didit.TravelRuleInboundRequestOriginatingVASP{\n\t\tName:          didit.String(\"Origin CASP SL\"),\n\t\tLei:           didit.String(\"\"),\n\t\tTravelAddress: didit.String(\"ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC\"),\n\t}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import java.util.Map;

            import me.didit.Didit;

            import me.didit.types.TravelRuleInboundRequest;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.travelRule().registerInbound(TravelRuleInboundRequest.builder()
                    .chain("ETH")
                    .txid("0xdeposit-hash")
                    .walletAddress("0xYourDepositWallet")
                    .amount("500.00")
                    .currency("USDC")
                    .originatorData(Map.of("name", "Origin CASP SL"))
                    .beneficiaryData(Map.of("name", "Ana Diaz"))
                    .originatingVasp(TravelRuleInboundRequest.OriginatingVasp.builder()
                            .name("Origin CASP SL")
                            .lei("")
                            .travelAddress("ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC")
                            .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->travelRule->registerInbound([
                'chain' => 'ETH',
                'txid' => '0xdeposit-hash',
                'wallet_address' => '0xYourDepositWallet',
                'amount' => '500.00',
                'currency' => 'USDC',
                'originator_data' => ['name' => 'Origin CASP SL'],
                'beneficiary_data' => ['name' => 'Ana Diaz'],
                'originating_vasp' => [
                    'name' => 'Origin CASP SL',
                    'lei' => '',
                    'travel_address' => 'ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC',
                ],
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.travel_rule.register_inbound(
              chain: "ETH",
              txid: "0xdeposit-hash",
              wallet_address: "0xYourDepositWallet",
              amount: "500.00",
              currency: "USDC",
              originator_data: { name: "Origin CASP SL" },
              beneficiary_data: { name: "Ana Diaz" },
              originating_vasp: {
                name: "Origin CASP SL",
                lei: "",
                travel_address: "ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC",
              }
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Collections.Generic;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.TravelRule.RegisterInboundAsync(new
            TravelRuleInboundRequest

            {
                Chain = "ETH",
                Txid = "0xdeposit-hash",
                WalletAddress = "0xYourDepositWallet",
                Amount = "500.00",
                Currency = "USDC",
                OriginatorData = new Dictionary<string, object> { ["name"] = "Origin CASP SL" },
                BeneficiaryData = new Dictionary<string, object> { ["name"] = "Ana Diaz" },
                OriginatingVasp = new TravelRuleInboundRequestOriginatingVasp
                {
                    Name = "Origin CASP SL",
                    Lei = "",
                    TravelAddress = "ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC",
                },
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    TravelRuleInboundRequest:
      type: object
      required:
        - chain
        - txid
        - wallet_address
        - amount
        - currency
      properties:
        chain:
          type: string
          description: >-
            Chain su cui è stato regolato il deposito, ad esempio `ETH`.
            Memorizzata in minuscolo e confrontata senza distinzione tra
            maiuscole e minuscole con le voci della tua rubrica dei wallet,
            quindi usa lo stesso token di chain anche lì.
          maxLength: 32
        txid:
          type: string
          description: >-
            Hash della transazione on-chain. Deduplicato insieme a
            wallet_address.
          maxLength: 128
        wallet_address:
          type: string
          description: >-
            Il wallet di destinazione su cui hai ricevuto il deposito. Un
            X-address XRP viene suddiviso nel relativo indirizzo classico e tag.
          maxLength: 128
        amount:
          type: string
          description: >-
            Importo del deposito come stringa decimale, pari a zero o superiore,
            con un massimo di 18 cifre decimali.
        currency:
          type: string
          description: Asset di deposito, ad es. "USDC".
          maxLength: 16
        originator_data:
          type: object
          description: >-
            Dettagli dell'ordinante forniti dal VASP mittente, se noti, sotto
            forma di oggetto piatto come `{"name": "..."}`. Didit legge da esso
            name (o full_name), first_name, last_name e vendor_data.
          additionalProperties: true
        beneficiary_data:
          type: object
          description: >-
            Dettagli del beneficiario (il tuo cliente), come oggetto piatto ad
            esempio `{"name": "..."}`. Didit confronta name con holder_name
            della voce corrispondente nella rubrica e imposta wallet_address e
            chain a partire dalla richiesta.
          additionalProperties: true
        originating_vasp:
          type: object
          description: >-
            Descrizione opzionale del VASP mittente. Rimane solo su questo
            trasferimento (`metadata.originating_vasp`, e il VASP ordinante del
            trasferimento in GET /v3/travel-rule/transfers/); non crea, modifica
            o collega mai una voce condivisa della directory VASP.
          properties:
            name:
              type: string
              maxLength: 255
            lei:
              type: string
              maxLength: 20
              description: >-
                Opzionale. Un LEI ISO 17442 valido di 20 caratteri, oppure
                vuoto.
            travel_address:
              type: string
              description: >-
                Il Travel Address del mittente, registrato su questo
                trasferimento.
              maxLength: 512
        memo:
          type: string
          maxLength: 256
          description: >-
            Opzionale. Il destination tag o memo del deposito su una rete con
            memo: su un indirizzo di deposito condiviso è ciò che distingue i
            tuoi clienti, e viene associata la voce della rubrica corrispondente
            a quel memo. XRP: un destination tag, un numero intero da 0 a
            4294967295 (è accettato un numero JSON). XLM: un memo testuale fino
            a 28 byte, un ID a 64 bit o un hash a 32 byte in formato
            esadecimale. EOS: fino a 256 byte. ATOM: fino a 256 caratteri. HBAR:
            fino a 100 byte. I wallet Bitcoin, EVM, Solana, Tron, Litecoin,
            Bitcoin Cash, Dogecoin e Lightning non accettano memo: inserirne uno
            restituisce un `400`. Alias: `destinationTag` o `destination_tag`.
        utxo:
          allOf:
            - $ref: '#/components/schemas/TravelRuleUtxo'
          description: >-
            Opzionale, solo per blockchain UTXO. Gli input e gli output della
            transazione di deposito: il wallet del mittente è il
            `originator_data.wallet_address` dichiarato, altrimenti l'input
            maggiore.
    TravelRuleInboundResponse:
      type: object
      properties:
        transaction_id:
          type: string
          format: uuid
          description: UUID della transazione Didit per il deposito in entrata.
        txn_id:
          type: string
          description: >-
            txn_id della transazione in entrata: generato da Didit quando Didit
            ha creato la transazione, oppure il tuo quando è stato riutilizzato
            un deposito non reclamato.
        created:
          type: boolean
          description: >-
            true quando questa chiamata ha registrato il trasferimento (HTTP
            201); false quando esisteva già un trasferimento per gli stessi txid
            e wallet_address (HTTP 200).
        travel_rule:
          $ref: '#/components/schemas/TravelRuleTransferDetail'
    TravelRuleUtxo:
      type: object
      description: >-
        Gli input e gli output di un trasferimento UTXO (BTC, LTC, BCH, DOGE).
        Accettati solo su queste blockchain: su qualsiasi altra blockchain
        restituisce `400`. Da essi Didit deduce il wallet dell'ordinante (quello
        dichiarato, altrimenti l'indirizzo di input che ha contribuito di più) e
        l'output del beneficiario (quello dichiarato, altrimenti l'unico output
        che non restituisce il resto a un indirizzo di input, altrimenti
        l'output che paga l'importo del trasferimento). Il risultato si trova in
        `chain_details` del trasferimento.
      required:
        - outputs
      properties:
        inputs:
          type: array
          maxItems: 1000
          items:
            $ref: '#/components/schemas/TravelRuleUtxoEntry'
          description: >-
            Opzionale. Senza input non viene dedotto alcun ordinante e non viene
            riconosciuto alcun output di resto.
        outputs:
          type: array
          minItems: 1
          maxItems: 1000
          items:
            $ref: '#/components/schemas/TravelRuleUtxoEntry'
    TravelRuleTransferDetail:
      type: object
      description: >-
        Oggetto di trasferimento completo restituito dagli endpoint di conferma
        della titolarità e di completamento/annullamento. Finché la titolarità
        del wallet di un trasferimento in entrata non è confermata, i campi
        `originator_data` e `beneficiary_data` della controparte vengono
        restituiti mascherati (viene mantenuta la prima lettera di ogni parola;
        il wallet, la chain e l'instradamento VASP rimangono leggibili) e
        `data_masked` è true.
      properties:
        uuid:
          type: string
          format: uuid
        status:
          type: string
          enum:
            - AWAITING_COUNTERPARTY
            - ON_HOLD
            - COMPLETED
            - FINISHED
            - CANCELLED
            - EXPIRED
            - COUNTERPARTY_MISMATCHED_DATA
            - COUNTERPARTY_VASP_NOT_FOUND
            - COUNTERPARTY_VASP_NOT_REACHABLE
            - UNCONFIRMED_OWNERSHIP
            - COUNTERPARTY_VASP_GENERAL_DECLINE
            - NOT_ENOUGH_COUNTERPARTY_DATA
            - NOT_APPLICABLE
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
        rail:
          type: string
          nullable: true
          enum:
            - INTERNAL
            - TRP
            - GTR
            - TRUST
            - VERIFYVASP
            - SYGNA
            - EMAIL
            - TEST_VASP
            - null
          description: >-
            Il canale (rail) su cui è stato instradato il trasferimento, o null
            quando non è stato selezionato alcun canale (ad esempio sotto la
            soglia, un wallet della controparte in autocustodia, una
            registrazione post-deposito o nessuna controparte raggiungibile).
            INTERNAL indica che entrambe le parti sono applicazioni Didit; EMAIL
            indica che la controparte è stata raggiunta tramite un link di
            ritiro inviato via email. TEST_VASP indica che il Didit Test VASP ha
            risposto al trasferimento sandbox. Tramite GTR, VERIFYVASP e SYGNA,
            Didit legge la risposta della controparte dalla risposta della rete
            o effettuando un polling ogni 5 minuti. TRUST invia soltanto, quindi
            un trasferimento TRUST rimane AWAITING_COUNTERPARTY fino alla
            scadenza. Un canale di rete viene utilizzato solo dopo aver
            collegato la propria iscrizione per tale rete. Viene scelto dopo che
            la creazione della transazione ha restituito risposta, quindi è null
            in tale risposta.
        protocol:
          type: string
          nullable: true
        ivms_version:
          type: string
          example: ivms101.2023
        required:
          type: boolean
        ownership_confirmed:
          type: boolean
          nullable: true
        deadline_at:
          type: string
          format: date-time
          nullable: true
        timeline:
          type: array
          items:
            type: object
            properties:
              status:
                type: string
              at:
                type: string
                format: date-time
              detail:
                type: string
              name_match:
                allOf:
                  - $ref: '#/components/schemas/TravelRuleNameMatch'
                nullable: true
                description: >-
                  Il confronto dei nomi che ha determinato questa voce, accanto
                  a `detail`. Assente nelle voci che non hanno confrontato alcun
                  nome.
              reason:
                type: string
                description: >-
                  Presente solo sulla voce di una transizione causata da una
                  mancata consegna: `email_undeliverable` o `delivery_failed`,
                  il valore riportato da `reason` del trasferimento.
        counterparty_vasp:
          type: object
          nullable: true
          properties:
            name:
              type: string
            lei:
              type: string
            dd_score:
              type: integer
              description: >-
                Punteggio di due diligence da 0 a 100, dove un valore più alto è
                migliore. Stessa scala utilizzata nella directory dei VASP.
            dd_score_breakdown:
              type: object
              description: >-
                Contributi per componente a dd_score, un oggetto per componente
                come nella directory VASP (giurisdizione, verifica, protocollo,
                lei, cronologia, elementi essenziali, reattività), ciascuno con
                {points, max, reason, detail}. {} finché la controparte non è
                stata valutata.
              additionalProperties:
                type: object
                properties:
                  points:
                    type: number
                    description: Punti assegnati per questo componente.
                  max:
                    type: integer
                    description: Punti massimi che questo componente può assegnare.
                  reason:
                    type: string
                    description: Codice leggibile dalla macchina dell'esito del componente.
                  detail:
                    type: string
                    description: Motivo leggibile dall'utente per i punti assegnati.
            dd_assessed_at:
              type: string
              format: date-time
              nullable: true
              description: >-
                Data e ora dell'ultima esecuzione della valutazione di adeguata
                verifica. Null finché la controparte non è stata valutata.
        originator_data:
          type: object
          description: >-
            Soggetto ordinante. Per un trasferimento in entrata, i valori della
            controparte sono oscurati fino alla conferma dell'assetto
            proprietario.
        beneficiary_data:
          type: object
          description: >-
            Parte beneficiaria. Per un trasferimento in entrata i valori della
            controparte sono mascherati fino a quando non viene confermato
            l'assetto proprietario.
        name_match:
          allOf:
            - $ref: '#/components/schemas/TravelRuleNameMatch'
          nullable: true
          description: >-
            Il confronto dei nomi che ha determinato il trasferimento, o null
            fino all'esecuzione. Mentre le parti sono oscurate, e sulla copia
            dell'altro cliente di uno scambio INTERNAL, `transfer_name`,
            `compared_name`, `matched_names` e `mismatched_names` rimangono
            nascosti. `score` e `matched` possono discordare: `matched` segue il
            livello di rigore, `score` è la somiglianza dei due nomi completi.
        data_match:
          $ref: '#/components/schemas/TravelRuleDataMatch'
        mismatched_fields:
          type: array
          items:
            type: string
          description: >-
            Scorciatoia per `data_match.mismatched_fields`. Vuoto quando non ci
            sono differenze.
        data_unmasked:
          $ref: '#/components/schemas/TravelRuleDataUnmasked'
        data_masked:
          type: boolean
          description: >-
            True mentre i dati personali della controparte sono mascherati in
            questa risposta.
        created_at:
          type: string
          format: date-time
        delivery:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/TravelRuleDelivery'
          description: >-
            Lo stato dell'ultimo messaggio dovuto da questo trasferimento alla
            controparte. Null quando il trasferimento non ha mai dovuto inviarne
            uno (ad esempio al di sotto di `threshold_amount`, un wallet in
            autocustodia dichiarato o una registrazione sunrise).
        discovery:
          type: array
          description: >-
            Modalità con cui Didit ha cercato la controparte, una voce per ogni
            passaggio eseguito. Vuoto se non è stata eseguita alcuna ricerca, ad
            esempio per un trasferimento in entrata.
          items:
            $ref: '#/components/schemas/TravelRuleDiscoveryStep'
        reason:
          type: string
          description: >-
            Il motivo per cui un trasferimento `COUNTERPARTY_VASP_NOT_FOUND` o
            `COUNTERPARTY_VASP_NOT_REACHABLE` è bloccato; `""` per qualsiasi
            altro stato. Una consegna non riuscita lo determina per prima, solo
            su `COUNTERPARTY_VASP_NOT_REACHABLE`: `email_undeliverable` (il
            provider di posta ha rifiutato l'email di compliance e non è rimasto
            alcun indirizzo da provare: quando è stata inviata, in un promemoria
            o come bounce permanente segnalato successivamente) o
            `delivery_failed` (il canale che effettuava la consegna è fallito
            definitivamente: un canale di rete ha rifiutato il messaggio o ha
            esaurito i tentativi, un host di identità `TRP` non ha risposto o
            l'host `TRP` della controparte non ha accettato la richiesta).
            Altrimenti lo determina la traccia di `discovery`:
            `awaiting_end_user` (nessun passaggio ha indicato una controparte
            raggiungibile da Didit), `directory_match_no_route` (un passaggio ha
            indicato un VASP della directory privo di rotta),
            `picked_member_without_proven_wallet` (l'utente finale ha scelto un
            cliente Didit che non ha dimostrato il controllo del wallet) o
            `no_directory_match` quando la traccia non fornisce altri motivi. Un
            nuovo invio fa avanzare il trasferimento, quindi il motivo viene
            azzerato. Consulta [Perché un trasferimento è
            bloccato](/it/transaction-monitoring/travel-rule#perché-un-trasferimento-è-bloccato).
        next_actions:
          type: array
          description: >-
            Cosa fa procedere il trasferimento; `[]` per qualsiasi stato tranne
            `COUNTERPARTY_VASP_NOT_FOUND` o `COUNTERPARTY_VASP_NOT_REACHABLE`.
            `email_undeliverable` propone `update_compliance_email`, poi
            `resend`. `delivery_failed` propone `resend`. Un motivo di discovery
            propone `select_counterparty_vasp`, `declare_self_hosted`,
            `add_vasp_hint` e `resend`.
          items:
            $ref: '#/components/schemas/TravelRuleNextAction'
        chain_details:
          $ref: '#/components/schemas/TravelRuleChainDetails'
    TravelRuleUtxoEntry:
      type: object
      description: >-
        Un input o output di una transazione UTXO, così come registrato dalla
        blockchain.
      required:
        - address
      properties:
        address:
          type: string
          maxLength: 128
        amount:
          type: string
          nullable: true
          description: >-
            Stringa decimale nell'unità propria della moneta (BTC, non satoshi).
            Facoltativo.
          example: '0.0125'
        txid:
          type: string
          maxLength: 128
          description: Opzionale. La transazione utilizzata da un input.
        vout:
          type: integer
          nullable: true
          minimum: 0
          description: Opzionale. L'indice di output speso da un input.
    TravelRuleNameMatch:
      type: object
      nullable: true
      description: >-
        Il confronto dei nomi che ha determinato il trasferimento, o null fino
        all'esecuzione. Mentre le parti sono oscurate, e sulla copia dell'altro
        cliente di uno scambio INTERNAL, `transfer_name`, `compared_name`,
        `matched_names` e `mismatched_names` rimangono nascosti. `score` e
        `matched` possono discordare: `matched` segue il livello di rigore,
        `score` è la somiglianza dei due nomi completi.
      properties:
        score:
          type: integer
          minimum: 0
          maximum: 100
          description: >-
            Somiglianza dei due nomi completi, da 0 a 100. 0 quando uno dei due
            nomi è vuoto.
        matched:
          type: boolean
          description: >-
            Indica se i nomi soddisfano `strictness`. L'esito del trasferimento
            segue `data_match`, che confronta ogni campo, pertanto un
            trasferimento può essere COUNTERPARTY_MISMATCHED_DATA anche quando
            questo valore è true.
        method:
          type: string
          enum:
            - none
            - exact_token
            - token_subset
            - token_containment
            - sequence_ratio
          description: >-
            Modalità con cui è stato determinato `matched`: nessuno (`NONE`),
            exact_token (`STRICT`), token_subset (`DEFAULT`), token_containment
            (`CONTAINS`) o sequence_ratio (`FUZZY`).
        strictness:
          type: string
          enum:
            - NONE
            - STRICT
            - CONTAINS
            - DEFAULT
            - FUZZY
        compared_with:
          type: string
          enum:
            - wallet_holder
            - counterparty_vasp
          description: >-
            wallet_holder: il titolare registrato per il wallet.
            counterparty_vasp: il nome indicato dalla controparte nella pagina
            di risposta via email, o la risposta di Didit Test VASP in sandbox.
        transfer_name:
          type: string
          description: Il nome sul trasferimento.
        compared_name:
          type: string
          description: Il nome con cui è stato confrontato.
        matched_names:
          type: array
          items:
            type: string
          description: Parole di `transfer_name` trovate in `compared_name`.
        mismatched_names:
          type: array
          items:
            type: string
          description: >-
            Parole di `transfer_name` mancanti da `compared_name`, seguite dalle
            parole di `compared_name` mancanti da `transfer_name`.
    TravelRuleDataMatch:
      type: object
      nullable: true
      description: >-
        Confronto campo per campo tra i dati della parte del trasferimento e ciò
        che l'altra parte sa sul titolare del wallet. Riporta i nomi dei campi e
        i risultati, mai i valori, in modo che rimanga leggibile mentre i dati
        della controparte sono oscurati. Null finché non viene eseguito un
        confronto.
      properties:
        matched:
          type: boolean
          description: True quando nessun campo confrontato differisce.
        mismatched_fields:
          type: array
          items:
            type: string
            enum:
              - name
              - date_of_birth
              - address
              - account
          description: I campi che differiscono.
        fields:
          type: object
          description: >-
            Una voce per ciascun campo confrontato per il tipo di entità della
            parte (`name`, `date_of_birth`, `address`, `account`; un'azienda non
            ha `date_of_birth`).
          additionalProperties:
            type: object
            properties:
              result:
                type: string
                enum:
                  - matched
                  - mismatched
                  - not_compared
                description: >-
                  `not_compared` quando la regola è `NONE` o una delle due parti
                  non ha un valore per il campo.
              strictness:
                type: string
                enum:
                  - NONE
                  - STRICT
                  - CONTAINS
                  - DEFAULT
                  - FUZZY
    TravelRuleDataUnmasked:
      type: object
      nullable: true
      description: >-
        Registro di audit del momento in cui i dati della controparte sono stati
        smascherati. Null finché i dati sono ancora mascherati e per i
        trasferimenti in uscita.
      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: >-
            Cosa ha confermato l'assetto proprietario: ownership_confirmed (la
            tua conferma tramite la console o l'API), wallet_proof (una prova
            del wallet nel widget o un trasferimento in entrata INTERNAL,
            impostato al momento della creazione), address_book_match (un wallet
            verificato nella rubrica), own_verified_wallet (il wallet verificato
            del tuo utente), inquiry_approved (la tua approvazione di una
            richiesta TRP in entrata o di un messaggio GTR o Sygna),
            known_payment_method (un wallet con cui il tuo utente ha già pagato)
            o travel_address (il Travel Address associato al wallet ha
            denominato il wallet).
        actor:
          type: string
          description: >-
            Chi l'ha confermata: l'email dell'utente della console o l'etichetta
            della chiave API. Vuoto per una decisione automatica.
    TravelRuleDelivery:
      type: object
      description: >-
        Lo stato dell'ultimo messaggio dovuto dal trasferimento alla
        controparte. Didit contatta la controparte dopo la restituzione della
        richiesta che ha creato o modificato il trasferimento, quindi questo
        oggetto indica se tale messaggio è andato a buon fine: in coda, in fase
        di invio, in attesa di un nuovo tentativo dopo un errore, consegnato o
        non riuscito. In caso di errore da cui la rete può ancora riprendersi
        (nessuna risposta in tempo, connessione non riuscita, HTTP `408`, `429`
        o `5xx`), viene effettuato un nuovo tentativo dopo 30 secondi, 2 minuti,
        10 minuti, 30 minuti e 1 ora. Quando un primo messaggio (`kind: SEND`)
        fallisce definitivamente, perché la rete lo ha rifiutato o anche il
        sesto tentativo non è riuscito, il trasferimento passa a
        `COUNTERPARTY_VASP_NOT_REACHABLE` con `last_error` nella sua `timeline`;
        qualsiasi altro messaggio che fallisce definitivamente viene annotato
        nella `timeline`. Lo `status` del trasferimento rimane l'unica fonte di
        verità per lo scambio stesso.
      required:
        - kind
        - status
        - rail
        - attempts
        - last_error
        - next_attempt_at
        - delivered_at
      properties:
        kind:
          type: string
          enum:
            - SEND
            - ANSWER
            - TXID
            - CANCEL
            - POLL
          description: >-
            Cosa trasporta il messaggio. `SEND`: il primo messaggio del
            trasferimento verso la controparte (in uscita; il canale viene
            scelto al momento dell'invio). `ANSWER`: la tua accettazione o
            rifiuto, dovuta alla rete che ha effettuato la richiesta (in
            entrata). `TXID`: l'hash della transazione on-chain, dopo aver
            completato il trasferimento. `CANCEL`: l'annullamento, dopo averlo
            cancellato. `POLL`: una richiesta di stato verso una rete che la
            supporta, ripetuta ogni 5 minuti mentre il trasferimento è in attesa
            della controparte.
        status:
          type: string
          enum:
            - QUEUED
            - SENDING
            - RETRYING
            - DELIVERED
            - FAILED
          description: >-
            `QUEUED`: in attesa di invio. `SENDING`: tentativo in corso.
            `RETRYING`: un tentativo non è riuscito e il prossimo verrà eseguito
            alle `next_attempt_at`. `DELIVERED`: l'altra parte ha ricevuto il
            messaggio. `FAILED`: l'altra parte lo ha rifiutato o l'ultimo
            tentativo non è riuscito.
        rail:
          type: string
          enum:
            - INTERNAL
            - TRP
            - GTR
            - TRUST
            - VERIFYVASP
            - SYGNA
            - EMAIL
            - ''
          description: >-
            Il canale (rail) che trasporta il messaggio. Vuoto finché Didit non
            ne sceglie uno per un primo messaggio.
        attempts:
          type: integer
          minimum: 0
          description: >-
            Tentativi effettuati finora per questo messaggio. Per un messaggio
            che non è un polling di stato vengono effettuati al massimo 6
            tentativi.
        last_error:
          type: string
          description: >-
            Il tipo di errore riscontrato nell'ultimo tentativo, `""` se non ce
            ne sono stati: ad esempio `email undeliverable`, `trp identity
            endpoint unreachable` o `trp transfer inquiry delivery failed`. Non
            contiene mai la risposta della controparte stessa, che rimane nella
            `timeline` del trasferimento.

            Quando GTR risponde con un errore, vengono inclusi il codice di
            stato e il messaggio restituiti. I corpi della risposta non vengono
            mai inclusi.
          example: email undeliverable
        next_attempt_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Quando verrà eseguito il prossimo tentativo mentre il messaggio è in
            stato `QUEUED` o `RETRYING`.
        delivered_at:
          type: string
          format: date-time
          nullable: true
          description: Quando l'altra parte ha preso in carico il messaggio.
    TravelRuleDiscoveryStep:
      type: object
      description: >-
        Un passaggio del rilevamento della controparte eseguito da Didit per un
        trasferimento in uscita, nell'ordine in cui è stato eseguito. Il primo
        passaggio che identifica un VASP con un percorso conclude la catena.
      properties:
        step:
          type: string
          enum:
            - internal_address_book
            - wallet_attribution
            - network_lookup
            - customer_hint
            - end_user
          description: >-
            `internal_address_book`: un altro cliente Didit che ha dimostrato il
            controllo del wallet di destinazione. `wallet_attribution`:
            l'attribuzione di analisi blockchain del wallet. `network_lookup`:
            una rete in grado di indicare quale VASP detiene l'indirizzo.
            `customer_hint`: il nome del VASP, LEI o la giurisdizione che hai
            inviato in `beneficiary_data`. `end_user`: la controparte scelta
            dall'utente finale (o da te), oppure la richiesta di sceglierne una.
        outcome:
          type: string
          enum:
            - match
            - miss
            - skipped
          description: >-
            `match`: il passaggio ha indicato una controparte. `miss`: è stato
            eseguito e non ne ha trovata nessuna. `skipped`: non è stato
            possibile eseguirlo e `reason` ne indica il motivo.
        reason:
          type: string
          description: >-
            Motivo leggibile dalla macchina, `""` in caso di corrispondenza:
            `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` o `picked_member_without_proven_wallet`.
        vasp:
          type: string
          format: uuid
          nullable: true
          description: >-
            Il VASP della directory indicato dal passaggio, qualora ne abbia
            indicato uno.
        rail:
          type: string
          nullable: true
          description: >-
            Il canale (rail) che raggiunge tale controparte, quando il passaggio
            ne ha trovato uno.
        at:
          type: string
          format: date-time
    TravelRuleNextAction:
      type: object
      description: >-
        Un elemento che consente di far progredire un trasferimento bloccato
        nello stato `COUNTERPARTY_VASP_NOT_FOUND` o
        `COUNTERPARTY_VASP_NOT_REACHABLE`. Consulta [Perché un trasferimento è
        bloccato](/it/transaction-monitoring/travel-rule#perché-un-trasferimento-è-bloccato).
      properties:
        action:
          type: string
          enum:
            - select_counterparty_vasp
            - declare_self_hosted
            - add_vasp_hint
            - update_compliance_email
            - resend
          description: >-
            `select_counterparty_vasp`: l'utente finale seleziona il VASP di
            destinazione nel widget di titolarità del wallet, oppure invii una
            richiesta PATCH con `action=beneficiary_vasp`.
            `declare_self_hosted`: l'utente finale dichiara che il wallet è in
            autocustodia nel widget. `add_vasp_hint`: indica a Didit chi è la
            controparte specificando nome del VASP, LEI o Travel Address (ad
            esempio un `travel_address` nella voce della rubrica del wallet di
            destinazione), quindi invia nuovamente. `update_compliance_email` e
            `resend` sono valori di `action` per `PATCH
            /v3/transactions/{transaction_id}/travel-rule/`: fornisci nuovamente
            l'email di compliance della controparte ed esegui nuovamente
            l'instradamento.
        url:
          type: string
          format: uri
          description: >-
            Il link al widget di verifica della proprietà del wallet, su
            `select_counterparty_vasp` e `declare_self_hosted` mentre il
            trasferimento ha una sessione widget aperta.
      required:
        - action
    TravelRuleChainDetails:
      type: object
      description: >-
        In che modo la blockchain del trasferimento identifica i suoi due
        wallet, quando si tratta di più di un indirizzo che ne paga un altro.
        Vuoto (`{}`) per un trasferimento su blockchain basata su account (EVM,
        Solana, Tron), dove i due indirizzi corrispondono ai wallet. La
        corrispondenza, l'instradamento e la rubrica leggono innanzitutto i
        wallet da qui.
      properties:
        chain:
          type: string
          description: >-
            Rete blockchain canonica, ad es. `BTC`, `XRP` o `LIGHTNING` per un
            trasferimento Lightning.
        shape:
          type: string
          enum:
            - utxo
            - memo
            - lightning
        originator:
          $ref: '#/components/schemas/TravelRuleChainSide'
        beneficiary:
          $ref: '#/components/schemas/TravelRuleChainSide'
        utxo:
          type: object
          description: >-
            Su un trasferimento UTXO: gli input e gli output come memorizzati
            (importi come stringhe decimali) e quali output Didit ha
            interpretato come cosa.
          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: Output che rimborsano un indirizzo di input.
            beneficiary_output_index:
              type: integer
              nullable: true
              description: >-
                L'output che paga il beneficiario; null quando non è stato
                possibile distinguerne alcuno.
        lightning:
          type: object
          description: >-
            Su un trasferimento Lightning: ciò che indica la richiesta di
            pagamento. Sempre `kind` (`bolt11`, `bolt12_offer`,
            `bolt12_invoice`, `bolt12_invoice_request`, `lnurl`,
            `lightning_address`, `node_id` o `unknown`); una fattura BOLT11
            aggiunge `network`, `payee_node_id`, `payment_hash`, `amount_msat`,
            `created_at` e `expires_at`; una stringa BOLT12 `blinded_paths` e
            `payee_node_id`; un LNURL o un Lightning Address il suo `domain`.
            Nulla viene risolto sulla rete: la richiesta viene solo
            decodificata.
          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: >-
            Incongruenze UTXO da esaminare: l'ordinante dichiarato non è un
            input, il beneficiario dichiarato non è un output, non è stato
            possibile distinguere un singolo output del beneficiario, oppure
            l'output del beneficiario corrisponde a un importo diverso rispetto
            a quello indicato nella transazione.
        not_applicable_reason:
          type: string
          enum:
            - LIGHTNING_NO_PAYEE_IDENTIFIER
            - LIGHTNING_BOLT12_BLINDED_PAYEE
            - LIGHTNING_LNURL_NAMES_NO_PAYEE
          description: >-
            Su un trasferimento Lightning in uscita la cui richiesta di
            pagamento non indica alcun beneficiario: perché il trasferimento è
            `NOT_APPLICABLE`. `LIGHTNING_NO_PAYEE_IDENTIFIER` (la richiesta non
            indica alcun nodo beneficiario o non è stato possibile
            decodificarla), `LIGHTNING_BOLT12_BLINDED_PAYEE` (l'offerta nasconde
            il proprio beneficiario dietro percorsi ciechi),
            `LIGHTNING_LNURL_NAMES_NO_PAYEE` (un LNURL indica un servizio, non
            un beneficiario). Lo stesso codice apre l'ultima voce `timeline` del
            trasferimento.
    TravelRuleChainSide:
      type: object
      description: >-
        Il wallet di una delle parti, così come Didit lo ha risolto a partire
        dai dati della blockchain.
      properties:
        address:
          type: string
          description: >-
            Il wallet. Su una rete con memo l'indirizzo classico (un X-address
            XRP viene suddiviso nel relativo indirizzo classico e tag); su
            Lightning l'ID del nodo del beneficiario o il Lightning Address.
        memo:
          type: string
          description: Il destination tag o memo che fa parte del wallet; `""` se assente.
        source:
          type: string
          enum:
            - declared
            - x_address
            - largest_input
            - only_non_change_output
            - amount_match
            - invoice_payee
            - updated
          description: >-
            Origine del wallet: `declared` (la tua richiesta), `x_address`
            (estratto da un X-address XRP), `largest_input` (l'indirizzo di
            input UTXO che ha contribuito maggiormente),
            `only_non_change_output` (l'unico output UTXO non di resto),
            `amount_match` (l'unico output UTXO che paga l'importo del
            trasferimento), `invoice_payee` (il beneficiario indicato in una
            richiesta di pagamento Lightning), `updated` (impostato
            successivamente con `action: update_originator_wallet`).
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La chiave API della tua applicazione, da Developers -> API keys nella
        Business Console. La chiave primaria ha accesso completo. Una chiave con
        nome può avere un ambito definito: nessuno, lettura o scrittura per
        risorsa, limitata ad alcuni workflow o a sessioni approvate, a un elenco
        di indirizzi IP e a una data di scadenza. 401 indica che la chiave è
        errata, revocata o scaduta; 403 indica che non è stata inviata alcuna
        chiave, che la chiave non ha accesso a questa risorsa o azione, oppure
        che la richiesta proviene da un indirizzo non incluso nel suo elenco IP;
        404 su una route di sessione indica che la sessione non rientra nei
        workflow o negli stati previsti dalla chiave. Una chiave senza accesso
        ai media riceve gli URL di immagini, video e PDF come null, e una chiave
        senza permessi di scrittura sulle sessioni riceve link e token di
        sessione come null. Consulta https://docs.didit.me/console/api-keys.

````

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