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

# Confirmar titularitat de cartera: API Travel Rule

> Confirma o rebutja, amb Didit, que el teu client controla la cartera beneficiària d'una transferència Travel Rule entrant en UNCONFIRMED_OWNERSHIP.



Prompt de l'API de confirmació de la titularitat de la cartera
        Copia el prompt al porta-retalls



      
      

\<pre>

\`Confirm or deny wallet ownership on a Travel Rule transfer waiting on the beneficiary side - typically the beneficiary leg of an INTERNAL-rail transfer whose wallet address book entry has not been ownership-verified yet, a transfer whose counterparty wallet was declared self-hosted (counterparty.payment_method.method_type: "unhosted_wallet"), an inbound transfer in ON_HOLD, or an inbound TRP inquiry a compliance officer resolves by hand.

Endpoint:
POST https://verification.didit.me/v3/transactions/{transaction_id}/travel-rule/ownership/

Authentication:
Use the x-api-key header with my Didit API key. {transaction_id} is the Didit transaction uuid of the transfer your own application holds: on an INTERNAL-rail transfer that is your (beneficiary) side; on a declared self-hosted wallet it is the transaction you created, outbound or inbound.

Request body:
\{"confirmed": true}   or   {"confirmed": false}
Optionally {"confirmed": true, "wallet_address": "0x..."} - the payment address to return to the counterparty on an inbound TRP transfer.
On a declared self-hosted wallet transfer with no counterparty wallet on it, "wallet_address" supplies the wallet to verify; if neither the transfer nor the request names one, the request is rejected with 400.

Accepted states (anything else -> 409 "Transfer is not awaiting ownership confirmation."):
\- UNCONFIRMED_OWNERSHIP, in either direction.
\- ON_HOLD on an inbound transfer.
\- UNCONFIRMED_OWNERSHIP, ON_HOLD or COUNTERPARTY_MISMATCHED_DATA on an inbound TRP transfer.

Behavior on a transfer Didit created itself (INTERNAL rail, sunrise registration, declared self-hosted wallet):
\- confirmed: true - marks the matching wallet address book entry ownership-verified, then runs the beneficiary name match on both sides: COMPLETED on a pass, COUNTERPARTY_MISMATCHED_DATA on a fail.
An inbound transfer whose deposit already settled then moves on to FINISHED.
\- confirmed: true on a declared self-hosted wallet - records that the customer verified who controls the counterparty wallet and completes the transfer (COMPLETED), outbound or inbound; an inbound deposit whose on-chain hash is already known moves on to FINISHED. The wallet is the counterparty's: the destination of a withdrawal, the originator's source wallet of a deposit. If it is not in the wallet address book yet, it is added as ownership-verified under the counterparty's name; if the book already holds it under a different holder name, the transfer goes to COUNTERPARTY_MISMATCHED_DATA.
\- confirmed: false - moves both sides of the transfer to COUNTERPARTY_VASP_GENERAL_DECLINE.
\- Resolving an inbound ON_HOLD with no matching entry, or confirming a declared self-hosted wallet, creates the entry from the transfer's wallet address and marks it verified.

Behavior on an inbound TRP transfer (answering the counterparty's inquiry):
\- confirmed: true - needs a payment address, taken from the request's wallet_address, then the matched entry, then beneficiary_data.wallet_address.
Didit creates or verifies the entry, posts the inquiry-resolution callback to the counterparty, sets ownership_confirmed and moves the transfer to COMPLETED.
\- confirmed: false - posts a declined resolution and moves the transfer to COUNTERPARTY_VASP_GENERAL_DECLINE.

Transfers a network delivered (GTR or Sygna Bridge):
\- An inbound transfer that waits for your review (UNCONFIRMED_OWNERSHIP, ON_HOLD or COUNTERPARTY_MISMATCHED_DATA) is decided here: confirmed: true approves it (send wallet_address when the transfer names none), confirmed: false declines it. Didit answers the network after the response, with retries; the response's delivery field shows that answer.
\- VerifyVASP takes its answer when it asks, so a VerifyVASP transfer that would need your review is declined at once and cannot be decided here.
\- Receiving over a network is switched on by Didit per network, and none is switched on today.

What to read from the response:
\- The full transfer object. originator_data/beneficiary_data stay masked on inbound transfers (data_masked: true) until ownership is confirmed; data_unmasked then records when, why and by whom. data_match and mismatched_fields name the fields that differ after a mismatch.

Alternative: instead of this API call, send the end customer through the hosted wallet-ownership widget (POST /v3/travel-rule/widget-session/) and let them prove control cryptographically.

Failure modes:
\- 400 - on an inbound TRP approval with no payment address available: {"wallet_address": ["wallet_address is required to approve."]}.
\- 409 - the transfer is not in one of the accepted states, no entry in your wallet address book matches the transfer's wallet address (an inbound TRP approval, and an inbound ON_HOLD transfer that carries beneficiary_data.wallet_address, and a declared self-hosted wallet, create the missing entry instead), an INTERNAL transfer from another Didit customer needs a control proof (signed message or test deposit) first, or a network transfer was already answered over its network (a VerifyVASP transfer, or a GTR or Sygna Bridge transfer already decided).
\- 502 - the counterparty's TRP inquiry-resolution callback could not be delivered; the transfer keeps its current status.
\- 404 - unknown transaction or no Travel Rule transfer attached.

Full guide: /transaction-monitoring/travel-rule#confirming-wallet-ownership.`

\</pre>



      
      

Enganxa a

## Carteres autoallotjadesQuan la cartera de la contrapart s'ha declarat autoallotjada (`counterparty.payment_method.method_type: "unhosted_wallet"`), la transferència queda en espera en l'estat `UNCONFIRMED_OWNERSHIP`.
Si crides aquest endpoint amb `confirmed: true`, registres que el teu client ha verificat qui controla aquesta cartera i completes la transferència (`COMPLETED`), tant per a les retirades sortints com per als dipòsits entrants.
Un dipòsit entrant amb un hash on-chain ja conegut passa a `FINISHED`.La cartera verificada és la de la contrapart: el destí d'una retirada sortint, o l'origen (la cartera de l'ordenant) d'un dipòsit entrant.
Didit l'afegeix a la llibreta d'adreces com a cartera amb la titularitat verificada, a nom de la contrapart, i es compara amb el nom de la contrapart (l'ordenant, en cas d'un dipòsit).
Si la llibreta d'adreces ja conté aquesta cartera amb un nom de titular diferent, la transferència passa a `COUNTERPARTY_MISMATCHED_DATA`.Si la transferència no indica cap cartera de la contrapart, passa `wallet_address` al cos de la sol·licitud.
Quan ni la transferència ni la sol·licitud aporten una adreça, la sol·licitud es rebutja amb `400`.`confirmed: false` rebutja la transferència (`COUNTERPARTY_VASP_GENERAL_DECLINE`).


## OpenAPI

````yaml ca/openapi-25.json POST /v3/transactions/{transaction_id}/travel-rule/ownership/
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/transactions/{transaction_id}/travel-rule/ownership/:
    post:
      tags:
        - Travel Rule
      summary: Confirmar o denegar la titularitat de la cartera
      description: >-
        Resol una transferència que espera la titularitat de la cartera:
        crida-la des del teu costat de la transferència quan estigui en
        UNCONFIRMED_OWNERSHIP, o quan sigui una transferència entrant en
        ON_HOLD. Confirmar marca l'entrada coincident de la llibreta d'adreces
        de carteres com a titularitat verificada (per a una transferència
        entrant en ON_HOLD sense entrada, Didit en crea una a partir de
        beneficiary_data.wallet_address) i executa la coincidència del nom del
        beneficiari a ambdós costats de la transferència; denegar rebutja ambdós
        costats. Una transferència entrant el dipòsit de la qual ja s'ha
        liquidat passa a FINISHED quan la coincidència és satisfactòria. Quan la
        cartera de la contrapart s'ha declarat com a autoallotjada
        (counterparty.payment_method.method_type: unhosted_wallet), confirmar
        registra que el client ha verificat qui controla aquesta cartera i
        completa la transferència (COMPLETED) en ambdues direccions, o a
        FINISHED per a un dipòsit entrant el hash on-chain del qual ja es
        coneix. La cartera verificada és la de la contrapart: la destinació
        d'una retirada sortint, o l'origen (la cartera de l'ordenant) d'un
        dipòsit entrant. Si encara no és a la teva llibreta d'adreces de
        carteres, Didit l'afegeix amb la titularitat verificada sota el nom de
        la contrapart; si la llibreta ja la conté sota un nom de titular
        diferent, la transferència passa a COUNTERPARTY_MISMATCHED_DATA. Per a
        una transferència TRP entrant en UNCONFIRMED_OWNERSHIP, ON_HOLD o
        COUNTERPARTY_MISMATCHED_DATA, Didit envia la teva decisió al VASP
        ordenant: aprovar retorna l'adreça de pagament (wallet_address, o
        l'adreça de l'entrada coincident) i mou la transferència a COMPLETED, i
        denegar la rebutja. La mateixa crida també decideix una transferència
        entrant enviada per una contrapart de GTR o Sygna Bridge que espera la
        teva revisió (`UNCONFIRMED_OWNERSHIP`, `ON_HOLD` o
        `COUNTERPARTY_MISMATCHED_DATA`): `confirmed: true` l'aprova (passa
        `wallet_address` quan la transferència no n'indiqui cap) i `confirmed:
        false` la rebutja, i es respon a la xarxa després de la resposta, amb
        reintents. VerifyVASP obté la seva resposta quan la demana, de manera
        que una transferència de VerifyVASP que necessités la teva revisió es
        rebutja a l'instant i no es pot decidir més endavant.
      operationId: confirmTravelRuleOwnership
      parameters:
        - name: transaction_id
          in: path
          required: true
          description: >-
            UUID estable de Didit de la transacció que la teva aplicació manté
            per a aquesta transferència: la transacció del costat del
            beneficiari en una transferència per rail INTERNAL, o la transacció
            que has creat (sortint o entrant) quan la cartera de la contrapart
            es va declarar autoallotjada.
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleOwnershipConfirmRequest'
            example:
              confirmed: true
      responses:
        '200':
          description: >-
            La transferència actualitzada. Per a una transferència entrant, les
            dades originator_data/beneficiary_data de la contrapart es mantenen
            emmascarades (`data_masked: true`) fins que es confirma la
            titularitat; després, `data_unmasked` registra quan, per què i per
            qui.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleTransferDetail'
        '400':
          description: >-
            Error de validació: falta confirmed, una aprovació TRP entrant no té
            wallet_address ni cap adreça alternativa a la qual recórrer, o
            `confirmed: true` en una transferència declarada de cartera
            autoallotjada que no especifica cap cartera de contrapart i no s'ha
            enviat cap `wallet_address`.
          content:
            application/json:
              examples:
                No payment address:
                  value:
                    wallet_address:
                      - wallet_address is required to approve.
        '404':
          description: >-
            Transacció desconeguda, o la transacció no té cap transferència de
            Travel Rule.
        '409':
          description: >-
            La transferència no està pendent de confirmació de titularitat, cap
            entrada de la llibreta d'adreces de carteres no coincideix amb la
            seva cartera de la contrapart, una transferència INTERNAL d'un altre
            client de Didit requereix una prova de control (un missatge signat o
            un dipòsit de prova) abans de poder-se confirmar, o ja s'ha respost
            a una transferència de xarxa a través de la seva xarxa (una
            transferència VerifyVASP, o una transferència GTR o Sygna Bridge
            sobre la qual tu o Didit ja heu decidit).
          content:
            application/json:
              examples:
                Not awaiting confirmation:
                  value:
                    detail: Transfer is not awaiting ownership confirmation.
                No matching address book entry:
                  value:
                    detail: wallet address entry no longer available
        '502':
          description: >-
            Només per a transferències TRP entrants: Didit no ha pogut lliurar
            la teva decisió al VASP ordenant, de manera que l'estat de la
            transferència no canvia.
          content:
            application/json:
              examples:
                Callback not delivered:
                  value:
                    detail: >-
                      Counterparty inquiry-resolution callback could not be
                      delivered.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X POST
            https://verification.didit.me/v3/transactions/{transaction_id}/travel-rule/ownership/
            \
              -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \
              -d '{"confirmed": true}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.transactions.travel_rule.confirm_ownership(
                "11111111-2222-3333-4444-555555555555",
                confirmed=True,
            )
            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.transactions.travelRule.confirmOwnership("11111111-2222-3333-4444-555555555555",
            {
              confirmed: true,
            });

            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.TravelRule.ConfirmOwnership(ctx, \"11111111-2222-3333-4444-555555555555\", didit.TravelRuleOwnershipConfirmRequest{\n\tConfirmed: true,\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import me.didit.Didit;

            import me.didit.types.TravelRuleOwnershipConfirmRequest;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.transactions().travelRule().confirmOwnership("11111111-2222-3333-4444-555555555555",
            TravelRuleOwnershipConfirmRequest.builder()
                    .confirmed(true)
                    .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->transactions->travelRule->confirmOwnership('11111111-2222-3333-4444-555555555555',
            [
                'confirmed' => true,
            ]);

            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.transactions.travel_rule.confirm_ownership(
              "11111111-2222-3333-4444-555555555555",
              confirmed: true
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await
            client.Transactions.TravelRule.ConfirmOwnershipAsync("11111111-2222-3333-4444-555555555555",
            new TravelRuleOwnershipConfirmRequest

            {
                Confirmed = true,
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    TravelRuleOwnershipConfirmRequest:
      type: object
      required:
        - confirmed
      properties:
        confirmed:
          type: boolean
          description: true per confirmar la titularitat, false per denegar-la.
        wallet_address:
          type: string
          default: ''
          description: >-
            Transferències TRP entrants: l'adreça de pagament que Didit retorna
            al VASP ordenant quan aproves. Per defecte és l'adreça de l'entrada
            coincident de la llibreta d'adreces, i després
            beneficiary_data.wallet_address. En una transferència declarada amb
            cartera autoallotjada que no especifica cap cartera de la
            contrapart, la cartera de la qual has verificat la titularitat;
            sense aquesta, la sol·licitud es rebutja amb un 400. S'ignora per a
            altres transferències.
    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'
    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`).
    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.
  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.