> ## 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: registrar transferència entrant (sunrise)

> Registra dades de Travel Rule per a un dipòsit cripto ja liquidat on-chain abans de cap intercanvi: el flux sunrise posterior al dipòsit de Didit.



Prompt de l'API per registrar una transferència entrant de Sunrise
        Copia el prompt al porta-retalls



      
      

\<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>



      
      

Enganxa a



## OpenAPI

````yaml ca/openapi-25.json POST /v3/travel-rule/inbound/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de verificació d'identitat. Autentica't amb la capçalera x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/travel-rule/inbound/:
    post:
      tags:
        - Travel Rule
      summary: Registra una transferència entrant posterior al dipòsit (sunrise)
      description: >-
        Registra dades de Travel Rule per a un dipòsit cripto que ja s'ha
        liquidat on-chain abans que es produís cap intercanvi. Crea una
        transacció travelRule entrant (o reutilitza un dipòsit no reclamat) i
        resol la transferència respecte a la llibreta d'adreces de la teva
        cartera. Per a una transacció acabada de crear, Didit envia primer
        transaction.created i després els webhooks 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: >-
            Ja s'havia registrat una transferència per a aquest txid i
            wallet_address; es retorna l'existent sense canvis (created és
            false).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleInboundResponse'
        '201':
          description: >-
            S'ha registrat una nova transferència Travel Rule, en una nova
            transacció entrant o en un dipòsit no reclamat existent (created és
            cert).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleInboundResponse'
        '400':
          description: >-
            Falta un camp obligatori (`chain`, `txid`, `wallet_address`,
            `amount`, `currency`), `originating_vasp.lei` no és un LEI vàlid,
            `originating_vasp.travel_address` no és una Travel Address vàlida,
            un memo, una X-address o un `utxo` que la cadena no pot admetre, o
            `originator_data` / `beneficiary_data` que no és un objecte.
          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: >-
            Cadena en què s'ha liquidat el dipòsit, per exemple `ETH`.
            S'emmagatzema en minúscules i es compara sense distingir majúscules
            de minúscules amb les entrades de la llibreta d'adreces de carteres,
            així que fes servir el mateix token de cadena allà.
          maxLength: 32
        txid:
          type: string
          description: >-
            Hash de la transacció on-chain. Desduplicat juntament amb
            wallet_address.
          maxLength: 128
        wallet_address:
          type: string
          description: >-
            La cartera de destinació on has rebut el dipòsit. Una X-address
            d'XRP es divideix en la seva adreça clàssica i l'etiqueta.
          maxLength: 128
        amount:
          type: string
          description: >-
            Import del dipòsit com a cadena decimal, zero o superior, amb fins a
            18 xifres decimals.
        currency:
          type: string
          description: Actiu del dipòsit, p. ex. "USDC".
          maxLength: 16
        originator_data:
          type: object
          description: >-
            Detalls de l'ordenant proporcionats pel VASP emissor, si es
            coneixen, com a objecte pla com ara `{"name": "..."}`. Didit en
            llegeix name (o full_name), first_name, last_name i vendor_data.
          additionalProperties: true
        beneficiary_data:
          type: object
          description: >-
            Detalls del beneficiari (el teu client), com a objecte pla com ara
            `{"name": "..."}`. Didit compara el nom amb el holder_name de
            l'entrada coincident de la llibreta d'adreces, i estableix
            wallet_address i chain a partir de la sol·licitud.
          additionalProperties: true
        originating_vasp:
          type: object
          description: >-
            Descripció opcional del VASP emissor. Es manté només en aquesta
            transferència (`metadata.originating_vasp`, i el VASP ordenant de la
            transferència a GET /v3/travel-rule/transfers/); mai crea, edita ni
            enllaça una entrada compartida del directori de VASP.
          properties:
            name:
              type: string
              maxLength: 255
            lei:
              type: string
              maxLength: 20
              description: Opcional. Un LEI ISO 17442 vàlid de 20 caràcters, o buit.
            travel_address:
              type: string
              description: >-
                La Travel Address del remitent, registrada en aquesta
                transferència.
              maxLength: 512
        memo:
          type: string
          maxLength: 256
          description: >-
            Opcional. L'etiqueta de destinació o memo del dipòsit en una xarxa
            basada en memos: en una adreça de dipòsit compartida és el que
            permet distingir els teus clients, i es fa coincidir l'entrada de la
            llibreta d'adreces corresponent a aquest memo. XRP: una etiqueta de
            destinació, un nombre enter de 0 a 4294967295 (s'accepta un número
            JSON). XLM: un memo de text de fins a 28 bytes, un ID de 64 bits o
            un hash de 32 bytes en hex. EOS: fins a 256 bytes. ATOM: fins a 256
            caràcters. HBAR: fins a 100 bytes. Les carteres de Bitcoin, EVM,
            Solana, Tron, Litecoin, Bitcoin Cash, Dogecoin i Lightning no
            admeten memo: incloure'n un retorna un `400`. Àlies:
            `destinationTag` o `destination_tag`.
        utxo:
          allOf:
            - $ref: '#/components/schemas/TravelRuleUtxo'
          description: >-
            Opcional, només per a cadenes UTXO. Les entrades i sortides de la
            transacció de dipòsit: la cartera del remitent és la declarada a
            `originator_data.wallet_address`; en cas contrari, l'entrada més
            gran.
    TravelRuleInboundResponse:
      type: object
      properties:
        transaction_id:
          type: string
          format: uuid
          description: UUID de transacció de Didit per al dipòsit entrant.
        txn_id:
          type: string
          description: >-
            txn_id de la transacció entrant: generat per Didit quan Didit ha
            creat la transacció, o el teu propi quan s'ha reutilitzat un dipòsit
            no reclamat.
        created:
          type: boolean
          description: >-
            true quan aquesta crida ha registrat la transferència (HTTP 201);
            false quan ja existia una transferència per al mateix txid i
            wallet_address (HTTP 200).
        travel_rule:
          $ref: '#/components/schemas/TravelRuleTransferDetail'
    TravelRuleUtxo:
      type: object
      description: >-
        Les entrades i sortides d'una transferència UTXO (BTC, LTC, BCH, DOGE).
        Només s'admeten en aquestes xarxes: en qualsevol altra xarxa respon amb
        un `400`. A partir d'aquestes, Didit infereix la cartera de l'ordenant
        (la declarada o, si no n'hi ha, l'adreça d'entrada que més ha aportat) i
        la sortida del beneficiari (la declarada o, si no n'hi ha, l'única
        sortida que no retorna canvi a una adreça d'entrada o, si no, la sortida
        que paga l'import de la transferència). El resultat es troba a
        `chain_details` de la transferència.
      required:
        - outputs
      properties:
        inputs:
          type: array
          maxItems: 1000
          items:
            $ref: '#/components/schemas/TravelRuleUtxoEntry'
          description: >-
            Opcional. Sense entrades no s'infereix cap ordenant ni es reconeix
            cap sortida de canvi.
        outputs:
          type: array
          minItems: 1
          maxItems: 1000
          items:
            $ref: '#/components/schemas/TravelRuleUtxoEntry'
    TravelRuleTransferDetail:
      type: object
      description: >-
        Objecte de transferència complet retornat pels endpoints de confirmació
        de titularitat i de finalització/cancel·lació. Mentre la titularitat de
        la cartera d'una transferència entrant no estigui confirmada, els camps
        `originator_data` i `beneficiary_data` de la contrapart es retornen
        emmascarats (es manté la primera lletra de cada paraula; la cartera, la
        cadena i l'encaminament del VASP continuen sent llegibles) i
        `data_masked` és 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: >-
            El rail pel qual s'ha encaminat la transferència, o null quan no se
            n'ha seleccionat cap (per exemple, per sota del llindar, una cartera
            autoallotjada de la contrapart, un registre posterior al dipòsit o
            cap contrapart accessible). INTERNAL significa que ambdues parts són
            aplicacions de Didit; EMAIL significa que s'ha contactat amb la
            contrapart mitjançant un enllaç de recollida enviat per correu
            electrònic. TEST_VASP significa que el Didit Test VASP ha respost a
            la transferència de sandbox. A través de GTR, VERIFYVASP i SYGNA,
            Didit llegeix la resposta de la contrapart a partir de la resposta
            de la xarxa o fent-ne un sondeig cada 5 minuts. TRUST només envia,
            de manera que una transferència TRUST roman en AWAITING_COUNTERPARTY
            fins que caduca. Un rail de xarxa només s'utilitza quan has
            connectat la teva pròpia afiliació a aquesta xarxa. Es tria després
            que la creació de la transacció retorni, de manera que és null en
            aquesta resposta.
        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: >-
                  La comparació de noms que aquesta entrada ha decidit, al
                  costat de `detail`. Absent en les entrades que no han comparat
                  cap nom.
              reason:
                type: string
                description: >-
                  Present només a l'entrada d'una transició causada per un
                  lliurament fallit: `email_undeliverable` o `delivery_failed`,
                  el valor que informa el camp `reason` de la transferència.
        counterparty_vasp:
          type: object
          nullable: true
          properties:
            name:
              type: string
            lei:
              type: string
            dd_score:
              type: integer
              description: >-
                Puntuació de diligència deguda de 0 a 100, on un valor més alt
                és millor. La mateixa escala que al directori de VASP.
            dd_score_breakdown:
              type: object
              description: >-
                Contribucions per component a dd_score, un objecte per component
                tal com apareix al directori de VASP (jurisdiction,
                verification, protocol, lei, history, essentials,
                responsiveness), cadascun amb {points, max, reason, detail}. {}
                fins que s'hagi avaluat la contrapart.
              additionalProperties:
                type: object
                properties:
                  points:
                    type: number
                    description: Punts atorgats per a aquest component.
                  max:
                    type: integer
                    description: Nombre màxim de punts que pot atorgar aquest component.
                  reason:
                    type: string
                    description: Codi llegible per màquina del veredicte del component.
                  detail:
                    type: string
                    description: Motiu dels punts atorgats, llegible per a humans.
            dd_assessed_at:
              type: string
              format: date-time
              nullable: true
              description: >-
                Quan es va executar per darrera vegada l'avaluació de diligència
                deguda. Null fins que s'hagi avaluat la contrapart.
        originator_data:
          type: object
          description: >-
            Part ordenant. Per a una transferència entrant, els valors de la
            contrapart s'emmascaren fins que se'n confirmi la titularitat.
        beneficiary_data:
          type: object
          description: >-
            Part beneficiària. Per a una transferència entrant, els valors de la
            contrapart s'emmascaren fins que es confirmi la titularitat.
        name_match:
          allOf:
            - $ref: '#/components/schemas/TravelRuleNameMatch'
          nullable: true
          description: >-
            La comparació de noms que ha decidit la transferència, o null fins
            que se n'hagi executat una. Mentre les parts estan emmascarades, i a
            la còpia de l'altre client d'un intercanvi INTERNAL,
            `transfer_name`, `compared_name`, `matched_names` i
            `mismatched_names` s'oculten. `score` i `matched` poden discrepar:
            `matched` segueix l'estrictesa, `score` és la similitud dels dos
            noms complets.
        data_match:
          $ref: '#/components/schemas/TravelRuleDataMatch'
        mismatched_fields:
          type: array
          items:
            type: string
          description: >-
            Drecera per a `data_match.mismatched_fields`. Buit quan no hi ha cap
            diferència.
        data_unmasked:
          $ref: '#/components/schemas/TravelRuleDataUnmasked'
        data_masked:
          type: boolean
          description: >-
            Cert mentre les dades personals de la contrapart estiguin
            emmascarades en aquesta resposta.
        created_at:
          type: string
          format: date-time
        delivery:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/TravelRuleDelivery'
          description: >-
            Estat en què es troba l'últim missatge que aquesta transferència deu
            a l'altra part. És nul quan la transferència mai no n'ha degut cap
            (per exemple, per sota de `threshold_amount`, una cartera
            autoallotjada declarada o un registre de sunrise).
        discovery:
          type: array
          description: >-
            Com Didit ha cercat la contrapart, una entrada per cada pas que s'ha
            executat. Buit quan no s'ha executat cap descobriment, per exemple
            en una transferència entrant.
          items:
            $ref: '#/components/schemas/TravelRuleDiscoveryStep'
        reason:
          type: string
          description: >-
            Per què una transferència `COUNTERPARTY_VASP_NOT_FOUND` o
            `COUNTERPARTY_VASP_NOT_REACHABLE` està encallada; `""` per a
            qualsevol altre estat. Un lliurament fallit ho determina primer,
            només a `COUNTERPARTY_VASP_NOT_REACHABLE`: `email_undeliverable` (el
            proveïdor de correu ha refusat el correu electrònic de compliment i
            no queda cap adreça per provar: quan s'ha enviat, en un recordatori
            o com un rebot permanent notificat més tard) o `delivery_failed` (el
            canal que l'estava lliurant ha fallat definitivament: un canal de
            xarxa ha refusat el missatge o s'ha quedat sense reintents, un host
            d'identitat `TRP` no ha respost o l'host `TRP` de la contrapart no
            ha acceptat la consulta). En cas contrari, el rastreig de
            `discovery` ho determina: `awaiting_end_user` (cap pas ha indicat
            una contrapart a la qual Didit pugui arribar),
            `directory_match_no_route` (un pas ha indicat un VASP del directori
            que no té ruta), `picked_member_without_proven_wallet` (l'usuari
            final ha triat un client de Didit que no ha demostrat el control de
            la cartera) o `no_directory_match` quan el rastreig no dóna cap
            altre motiu. Un reenviament fa avançar la transferència, de manera
            que el motiu s'esborra. Consulta [Per què una transferència està
            encallada](/ca/transaction-monitoring/travel-rule#per-què-una-transferència-està-bloquejada).
        next_actions:
          type: array
          description: >-
            Què fa avançar la transferència; `[]` per a qualsevol estat excepte
            `COUNTERPARTY_VASP_NOT_FOUND` o `COUNTERPARTY_VASP_NOT_REACHABLE`.
            `email_undeliverable` ofereix `update_compliance_email` i després
            `resend`. `delivery_failed` ofereix `resend`. Un motiu de
            descobriment ofereix `select_counterparty_vasp`,
            `declare_self_hosted`, `add_vasp_hint` i `resend`.
          items:
            $ref: '#/components/schemas/TravelRuleNextAction'
        chain_details:
          $ref: '#/components/schemas/TravelRuleChainDetails'
    TravelRuleUtxoEntry:
      type: object
      description: >-
        Una entrada o sortida d'una transacció UTXO, tal com la va registrar la
        cadena.
      required:
        - address
      properties:
        address:
          type: string
          maxLength: 128
        amount:
          type: string
          nullable: true
          description: >-
            Cadena decimal en la unitat pròpia de la moneda (BTC, no satoshis).
            Opcional.
          example: '0.0125'
        txid:
          type: string
          maxLength: 128
          description: Opcional. La transacció que gasta un input.
        vout:
          type: integer
          nullable: true
          minimum: 0
          description: Opcional. L'índex de la sortida que consumeix una entrada.
    TravelRuleNameMatch:
      type: object
      nullable: true
      description: >-
        La comparació de noms que ha decidit la transferència, o null fins que
        se n'hagi executat una. Mentre les parts estan emmascarades, i a la
        còpia de l'altre client d'un intercanvi INTERNAL, `transfer_name`,
        `compared_name`, `matched_names` i `mismatched_names` s'oculten. `score`
        i `matched` poden discrepar: `matched` segueix l'estrictesa, `score` és
        la similitud dels dos noms complets.
      properties:
        score:
          type: integer
          minimum: 0
          maximum: 100
          description: >-
            Similitud dels dos noms complets, de 0 a 100. 0 quan algun dels noms
            està en blanc.
        matched:
          type: boolean
          description: >-
            Si els noms compleixen `strictness`. El resultat de la transferència
            segueix `data_match`, que compara cada camp, de manera que una
            transferència pot ser COUNTERPARTY_MISMATCHED_DATA mentre això sigui
            cert.
        method:
          type: string
          enum:
            - none
            - exact_token
            - token_subset
            - token_containment
            - sequence_ratio
          description: >-
            Com s'ha decidit `matched`: cap (`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: el titular registrat per a la cartera.
            counterparty_vasp: el nom que la contrapart ha indicat a la pàgina
            de resposta per correu electrònic, o la resposta del VASP de prova
            de Didit a sandbox.
        transfer_name:
          type: string
          description: El nom que figura a la transferència.
        compared_name:
          type: string
          description: El nom amb què s'ha comparat.
        matched_names:
          type: array
          items:
            type: string
          description: Paraules de `transfer_name` trobades a `compared_name`.
        mismatched_names:
          type: array
          items:
            type: string
          description: >-
            Paraules de `transfer_name` que falten a `compared_name` i, tot
            seguit, paraules de `compared_name` que falten a `transfer_name`.
    TravelRuleDataMatch:
      type: object
      nullable: true
      description: >-
        Comparació camp per camp de les dades de les parts de la transferència
        amb el que l'altra part sap sobre el titular de la cartera. Nomena camps
        i resultats, mai valors, de manera que continua sent llegible mentre les
        dades de la contrapart estan emmascarades. Null fins que s'executi una
        comparació.
      properties:
        matched:
          type: boolean
          description: Cert quan cap camp comparat difereix.
        mismatched_fields:
          type: array
          items:
            type: string
            enum:
              - name
              - date_of_birth
              - address
              - account
          description: Els camps que difereixen.
        fields:
          type: object
          description: >-
            Una entrada per camp comparat per al tipus d'entitat de la part
            (`name`, `date_of_birth`, `address`, `account`; una empresa no té
            `date_of_birth`).
          additionalProperties:
            type: object
            properties:
              result:
                type: string
                enum:
                  - matched
                  - mismatched
                  - not_compared
                description: >-
                  `not_compared` quan la regla és `NONE` o una de les dues parts
                  no té cap valor per al camp.
              strictness:
                type: string
                enum:
                  - NONE
                  - STRICT
                  - CONTAINS
                  - DEFAULT
                  - FUZZY
    TravelRuleDataUnmasked:
      type: object
      nullable: true
      description: >-
        Registre d'auditoria del moment en què es van desenmascarar les dades de
        la contrapart. És null mentre les dades continuïn emmascarades, així com
        per a transferències sortints.
      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: >-
            Què va confirmar la titularitat: ownership_confirmed (la teva
            confirmació mitjançant la consola o l'API), wallet_proof (una prova
            de cartera al widget, o una transferència entrant INTERNAL,
            establerta quan es crea), address_book_match (una cartera de la
            llibreta d'adreces verificada), own_verified_wallet (la pròpia
            cartera verificada del teu usuari), inquiry_approved (la teva
            aprovació d'una consulta TRP entrant o un missatge GTR o Sygna),
            known_payment_method (una cartera amb la qual el teu usuari ja ha
            pagat) o travel_address (la Travel Address per cartera que va donar
            nom a la cartera).
        actor:
          type: string
          description: >-
            Qui ho ha confirmat: el correu electrònic de l'usuari de la consola
            o l'etiqueta de la clau d'API. En blanc per a una decisió
            automàtica.
    TravelRuleDelivery:
      type: object
      description: >-
        Estat en què es troba l'últim missatge que la transferència deu a
        l'altra part. Didit contacta amb la contrapart un cop retornada la
        sol·licitud que ha creat o modificat la transferència, de manera que
        aquest objecte indica si el missatge s'ha lliurat: en cua, enviant-se,
        esperant per reintentar després d'un error, lliurat o fallit. Una
        fallada de la qual la xarxa encara es pot recuperar (sense resposta a
        temps, connexió fallida, HTTP `408`, `429` o `5xx`) es reintenta al cap
        de 30 segons, 2 minuts, 10 minuts, 30 minuts i 1 hora. Quan un primer
        missatge (`kind: SEND`) falla definitivament, perquè la xarxa l'ha
        rebutjat o perquè el sisè intent també ha fallat, la transferència passa
        a `COUNTERPARTY_VASP_NOT_REACHABLE` amb `last_error` a la seva
        `timeline`; qualsevol altre missatge que falli definitivament s'anota a
        la `timeline`. L'`status` de la transferència continua sent la font de
        referència de l'intercanvi en si.
      required:
        - kind
        - status
        - rail
        - attempts
        - last_error
        - next_attempt_at
        - delivered_at
      properties:
        kind:
          type: string
          enum:
            - SEND
            - ANSWER
            - TXID
            - CANCEL
            - POLL
          description: >-
            Què transmet el missatge. `SEND`: el primer missatge de la
            transferència a la contrapart (sortint; el canal es tria quan
            s'envia). `ANSWER`: la teva acceptació o rebuig, que es deu a la
            xarxa que ho ha sol·licitat (entrant). `TXID`: el hash de la
            transacció on-chain, un cop finalitzis la transferència. `CANCEL`:
            la cancel·lació, un cop la cancel·lis. `POLL`: una consulta d'estat
            a una xarxa que n'ofereixi una, repetida cada 5 minuts mentre la
            transferència espera la contrapart.
        status:
          type: string
          enum:
            - QUEUED
            - SENDING
            - RETRYING
            - DELIVERED
            - FAILED
          description: >-
            `QUEUED`: esperant per enviar-se. `SENDING`: hi ha un intent en
            curs. `RETRYING`: un intent ha fallat i el següent s'executarà a
            `next_attempt_at`. `DELIVERED`: l'altra part ha rebut el missatge.
            `FAILED`: l'altra part l'ha rebutjat o el darrer intent ha fallat.
        rail:
          type: string
          enum:
            - INTERNAL
            - TRP
            - GTR
            - TRUST
            - VERIFYVASP
            - SYGNA
            - EMAIL
            - ''
          description: >-
            El rail que transporta el missatge. Buit fins que Didit n'hagi triat
            un per a un primer missatge.
        attempts:
          type: integer
          minimum: 0
          description: >-
            Intents realitzats fins ara per a aquest missatge. Un missatge que
            no sigui un sondeig d'estat s'intenta com a màxim 6 vegades.
        last_error:
          type: string
          description: >-
            El tipus d'error que ha afectat l'últim intent, `""` quan no n'hi ha
            hagut cap: per exemple `email undeliverable`, `trp identity endpoint
            unreachable` o `trp transfer inquiry delivery failed`. Mai no conté
            la resposta de la contrapart mateixa, que roman al `timeline` de la
            transferència.

            Quan GTR respon amb un error, s'hi inclouen el seu propi codi
            d'estat i missatge. Els cossos de resposta no s'inclouen mai.
          example: email undeliverable
        next_attempt_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Quan s'executa el següent intent mentre el missatge està en estat
            `QUEUED` o `RETRYING`.
        delivered_at:
          type: string
          format: date-time
          nullable: true
          description: Quan l'altra part va rebre el missatge.
    TravelRuleDiscoveryStep:
      type: object
      description: >-
        Un pas de la detecció de la contrapart que Didit ha executat per a una
        transferència sortint, en l'ordre en què els ha executat. El primer pas
        que anomena un VASP amb una ruta finalitza la cadena.
      properties:
        step:
          type: string
          enum:
            - internal_address_book
            - wallet_attribution
            - network_lookup
            - customer_hint
            - end_user
          description: >-
            `internal_address_book`: un altre client de Didit que ha demostrat
            el control de la cartera de destinació. `wallet_attribution`:
            l'atribució d'analítica blockchain de la cartera. `network_lookup`:
            una xarxa que pot indicar quin VASP té l'adreça. `customer_hint`: el
            nom del VASP, LEI o jurisdicció que has enviat a `beneficiary_data`.
            `end_user`: la contrapart que l'usuari final (o tu) ha triat, o la
            sol·licitud per triar-ne una.
        outcome:
          type: string
          enum:
            - match
            - miss
            - skipped
          description: >-
            `match`: el pas ha indicat una contrapart. `miss`: s'ha executat i
            no n'ha trobat cap. `skipped`: no s'ha pogut executar, i `reason`
            n'explica el motiu.
        reason:
          type: string
          description: >-
            Motiu llegible per màquina, `""` en cas de coincidència:
            `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: El VASP del directori que ha indicat el pas, si n'ha indicat algun.
        rail:
          type: string
          nullable: true
          description: El rail que arriba a aquesta contrapart, quan el pas n'ha trobat un.
        at:
          type: string
          format: date-time
    TravelRuleNextAction:
      type: object
      description: >-
        Un element que fa avançar una transferència
        `COUNTERPARTY_VASP_NOT_FOUND` o `COUNTERPARTY_VASP_NOT_REACHABLE`.
        Consulta [Per què una transferència està
        bloquejada](/ca/transaction-monitoring/travel-rule#per-què-una-transferència-està-bloquejada).
      properties:
        action:
          type: string
          enum:
            - select_counterparty_vasp
            - declare_self_hosted
            - add_vasp_hint
            - update_compliance_email
            - resend
          description: >-
            `select_counterparty_vasp`: l'usuari final tria el VASP de
            destinació al widget de titularitat de la cartera, o fas un PATCH
            amb `action=beneficiary_vasp`. `declare_self_hosted`: l'usuari final
            declara que la cartera és autoallotjada al widget. `add_vasp_hint`:
            indica a Didit qui és la contrapart, amb un nom de VASP, LEI o
            Travel Address (per exemple, un `travel_address` a l'entrada de la
            llibreta d'adreces de la cartera de destinació), i després torna a
            enviar. `update_compliance_email` i `resend` són valors d'`action`
            de `PATCH /v3/transactions/{transaction_id}/travel-rule/`: torna a
            proporcionar el correu electrònic de compliment de la contrapart i
            torna a executar l'encaminament.
        url:
          type: string
          format: uri
          description: >-
            L'enllaç del widget de titularitat de la cartera, a
            `select_counterparty_vasp` i `declare_self_hosted` mentre la
            transferència té una sessió de widget oberta.
      required:
        - action
    TravelRuleChainDetails:
      type: object
      description: >-
        Com anomena la cadena de la transferència les seves dues carteres, quan
        es tracta de més d'una adreça pagant-ne una altra. Buit (`{}`) per a una
        transferència de cadena basada en comptes (EVM, Solana, Tron), on les
        dues adreces són les carteres. La coincidència, l'encaminament i la
        llibreta d'adreces llegeixen primer les carteres d'aquí.
      properties:
        chain:
          type: string
          description: >-
            Cadena canònica, p. ex. `BTC`, `XRP` o `LIGHTNING` per a una
            transferència Lightning.
        shape:
          type: string
          enum:
            - utxo
            - memo
            - lightning
        originator:
          $ref: '#/components/schemas/TravelRuleChainSide'
        beneficiary:
          $ref: '#/components/schemas/TravelRuleChainSide'
        utxo:
          type: object
          description: >-
            En una transferència UTXO: les entrades i sortides tal com s'han
            emmagatzemat (imports com a cadenes decimals) i què ha llegit Didit
            en cada sortida.
          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: Sortides que retornen el pagament a una adreça d'entrada.
            beneficiary_output_index:
              type: integer
              nullable: true
              description: >-
                La sortida que paga al beneficiari; null quan no se'n pot
                distingir cap.
        lightning:
          type: object
          description: >-
            En una transferència de Lightning: el que diu la sol·licitud de
            pagament. Sempre `kind` (`bolt11`, `bolt12_offer`, `bolt12_invoice`,
            `bolt12_invoice_request`, `lnurl`, `lightning_address`, `node_id` o
            `unknown`); una factura BOLT11 afegeix `network`, `payee_node_id`,
            `payment_hash`, `amount_msat`, `created_at` i `expires_at`; una
            cadena BOLT12 afegeix `blinded_paths` i `payee_node_id`; un LNURL o
            una Lightning Address inclou el seu `domain`. No es resol res a
            través de la xarxa: la sol·licitud només es descodifica.
          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: >-
            Inconsistències d'UTXO que val la pena revisar: l'ordenant declarat
            no és una entrada, el beneficiari declarat no és una sortida, no
            s'ha pogut distingir cap sortida de beneficiari única o la sortida
            del beneficiari paga un import diferent del que indica la
            transacció.
        not_applicable_reason:
          type: string
          enum:
            - LIGHTNING_NO_PAYEE_IDENTIFIER
            - LIGHTNING_BOLT12_BLINDED_PAYEE
            - LIGHTNING_LNURL_NAMES_NO_PAYEE
          description: >-
            En una transferència sortint de Lightning la sol·licitud de pagament
            de la qual no especifica cap beneficiari: per què la transferència
            és `NOT_APPLICABLE`. `LIGHTNING_NO_PAYEE_IDENTIFIER` (la sol·licitud
            no especifica cap node beneficiari, o no s'ha pogut descodificar),
            `LIGHTNING_BOLT12_BLINDED_PAYEE` (l'oferta amaga el seu beneficiari
            darrere de rutes cegues), `LIGHTNING_LNURL_NAMES_NO_PAYEE` (un LNURL
            especifica un servei, no un beneficiari). El mateix codi obre
            l'última entrada de la `timeline` de la transferència.
    TravelRuleChainSide:
      type: object
      description: >-
        La cartera d'una de les parts tal com Didit l'ha resolt a partir de les
        dades de la cadena.
      properties:
        address:
          type: string
          description: >-
            La cartera. En una xarxa amb memo, l'adreça clàssica (una adreça X
            d'XRP es divideix en la seva adreça clàssica i la seva etiqueta); a
            Lightning, l'ID del node del beneficiari o l'adreça Lightning.
        memo:
          type: string
          description: >-
            L'etiqueta de destinació o nota que forma part de la cartera; `""`
            quan no n'hi ha cap.
        source:
          type: string
          enum:
            - declared
            - x_address
            - largest_input
            - only_non_change_output
            - amount_match
            - invoice_payee
            - updated
          description: >-
            D'on prové la cartera: `declared` (la teva sol·licitud), `x_address`
            (desglossada d'una adreça X d'XRP), `largest_input` (l'adreça
            d'entrada UTXO que ha aportat més), `only_non_change_output`
            (l'única sortida UTXO que no és canvi), `amount_match` (l'única
            sortida UTXO que paga l'import de la transferència), `invoice_payee`
            (el beneficiari que indica una sol·licitud de pagament de
            Lightning), `updated` (establert més tard amb `action:
            update_originator_wallet`).
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La clau d'API de la teva aplicació, des de Developers -> API keys a la
        Business Console. La clau primària té accés complet. Una clau amb nom
        pot tenir l'abast limitat: cap, lectura o escriptura per recurs,
        limitada a determinats fluxos de treball o a sessions aprovades, a una
        llista d'adreces IP i a una data de caducitat. 401 significa que la clau
        és incorrecta, revocada o caducada; 403 significa que no s'ha enviat cap
        clau, que la clau no té accés a aquest recurs o acció, o que la
        sol·licitud prové d'una adreça fora de la seva llista d'IP; 404 en una
        ruta de sessió significa que la sessió està fora dels fluxos de treball
        o estats de la clau. Una clau sense accés a fitxers multimèdia rep els
        URL d'imatge, vídeo i PDF com a null, i una clau sense permís
        d'escriptura de sessions rep els enllaços de sessió i els tokens com a
        null. Consulta https://docs.didit.me/console/api-keys.

````

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