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

# Activar transferència entrant de prova VASP (API)

> Només sandbox: el VASP de prova de Didit envia una transferència entrant de Travel Rule a la teva app i prova el flux de decisió i titularitat.



Indicació de l'API per activar una transferència VASP entrant de prova
        Copia el prompt al porta-retalls



      
      

\<pre>

\`Make the Didit Test VASP send my sandbox application an inbound Travel Rule transfer, to exercise the receiving side of an exchange before going live.

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

Authentication:
Use the x-api-key header with my SANDBOX application's API key. A live application receives 400.

Request body (application/json):
\{
"beneficiary_wallet_address": "0xYourSandboxWallet",  // required: the destination wallet address
"scenario": "accept",                                // optional: accept (default) or name_mismatch
"chain": "ETH",                                      // optional
"amount": "1",                                       // optional, decimal string
"currency": "ETH",                                   // optional
"reference": "demo-001"                              // optional: repeat calls with it return the first transfer
}

Behavior:
\- The transfer is decided by the same logic a real inbound transfer runs, against my wallet address book: a verified wallet with the holder's name completes, an unverified wallet waits for ownership, a wallet with no matching address book entry is booked ON_HOLD, and name_mismatch ends as COUNTERPARTY_MISMATCHED_DATA.
\- Nothing leaves Didit. travel_rule.status.updated webhooks fire with environment "sandbox", test_vasp true and the scenario name.

What to read from the response:
\- transaction_id, txn_id - the booked inbound transaction.
\- travel_rule_status and detail - how my application decided it.
\- travel_rule - the full transfer.

Full guide: /transaction-monitoring/travel-rule#testing-without-network-credentials.`

\</pre>



      
      

Enganxa a



## OpenAPI

````yaml ca/openapi-25.json POST /v3/travel-rule/test-vasp/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/test-vasp/inbound/:
    post:
      tags:
        - Travel Rule
      summary: Activar una transferència entrant des del Test VASP de Didit (sandbox)
      description: >-
        Només per a aplicacions de sandbox. El VASP de prova de Didit envia a la
        teva aplicació una transferència entrant de Travel Rule, de manera que
        pots provar d'extrem a extrem la part receptora d'un intercanvi abans de
        passar a producció. La transferència es registra i es decideix amb la
        mateixa lògica amb què una transferència entrant real d'una xarxa
        s'executa contra la teva llibreta d'adreces de carteres, de manera que
        la safata d'entrada, la decisió i el flux de titularitat de la cartera
        es comporten com en producció. Res no surt de Didit. Una aplicació en
        producció rep un 400. Torna a enviar la mateixa `reference` per obtenir
        la transferència que ha registrat la primera crida en lloc d'una de
        segona.
      operationId: triggerTravelRuleTestVaspInbound
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleTestVaspInboundRequest'
            example:
              beneficiary_wallet_address: 0xYourSandboxWallet
              scenario: accept
              amount: '1'
              reference: demo-001
      responses:
        '201':
          description: >-
            La transferència entrant s'ha registrat i s'ha pres una decisió. Si
            es repeteix amb la mateixa `reference`, es retorna el mateix cos.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleTestVaspInboundResponse'
        '400':
          description: >-
            Cos no vàlid, un `scenario` desconegut o no admès, o bé l'aplicació
            és una aplicació de producció.
          content:
            application/json:
              schema:
                type: object
        '409':
          description: >-
            La transferència no s'ha pogut registrar, per exemple perquè Travel
            Rule no està habilitat per a l'aplicació.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X POST
            https://verification.didit.me/v3/travel-rule/test-vasp/inbound/ \
              -H 'x-api-key: YOUR_SANDBOX_API_KEY' -H 'Content-Type: application/json' \
              -d '{"beneficiary_wallet_address":"0xYourSandboxWallet","scenario":"accept","reference":"demo-001"}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.transactions.travel_rule.trigger_test_vasp_inbound(
                beneficiary_wallet_address="0xYourSandboxWallet",
                scenario="accept",
                amount="1",
                reference="demo-001",
            )
            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.triggerTestVaspInbound({
              beneficiary_wallet_address: "0xYourSandboxWallet",
              scenario: "accept",
              amount: "1",
              reference: "demo-001",
            });

            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.TriggerTestVASPInbound(ctx, didit.TravelRuleTestVASPInboundRequest{\n\tBeneficiaryWalletAddress: \"0xYourSandboxWallet\",\n\tScenario:                 didit.Some(didit.TravelRuleTestVASPInboundRequestScenario(\"accept\")),\n\tAmount:                   didit.String(\"1\"),\n\tReference:                didit.String(\"demo-001\"),\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.TravelRuleTestVaspInboundRequest;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.transactions().travelRule().triggerTestVaspInbound(TravelRuleTestVaspInboundRequest.builder()
                    .beneficiaryWalletAddress("0xYourSandboxWallet")
                    .scenario(TravelRuleTestVaspInboundRequest.Scenario.of("accept"))
                    .amount("1")
                    .reference("demo-001")
                    .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->triggerTestVaspInbound([
                'beneficiary_wallet_address' => '0xYourSandboxWallet',
                'scenario' => 'accept',
                'amount' => '1',
                'reference' => 'demo-001',
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.transactions.travel_rule.trigger_test_vasp_inbound(
              beneficiary_wallet_address: "0xYourSandboxWallet",
              scenario: "accept",
              amount: "1",
              reference: "demo-001"
            )
            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.TriggerTestVaspInboundAsync(new
            TravelRuleTestVaspInboundRequest

            {
                BeneficiaryWalletAddress = "0xYourSandboxWallet",
                Scenario = new TravelRuleTestVaspInboundRequestScenario("accept"),
                Amount = "1",
                Reference = "demo-001",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    TravelRuleTestVaspInboundRequest:
      type: object
      required:
        - beneficiary_wallet_address
      properties:
        beneficiary_wallet_address:
          type: string
          description: >-
            L'adreça de destinació. El Didit Test VASP hi fa l'enviament,
            contrastada amb la teva llibreta d'adreces a la blockchain de
            l'actiu. Una cartera sense cap entrada coincident s'accepta i la
            transacció entrant es registra com a ON_HOLD.
        scenario:
          type: string
          enum:
            - accept
            - name_mismatch
          default: accept
          description: >-
            Què declara el Didit Test VASP que és el beneficiari. `accept`
            declara el nom del mateix titular; `name_mismatch` declara un nom
            amb el qual cap titular està d'acord. La decisió en si sempre és
            teva.
        chain:
          type: string
          default: ETH
          description: Cadena de l'actiu.
        amount:
          type: string
          default: '1'
          description: Import com a cadena decimal.
        currency:
          type: string
          default: ETH
          description: Codi de l'actiu.
        reference:
          type: string
          description: >-
            Clau d'idempotència opcional. Si es repeteix amb el mateix valor,
            retorna la transferència que la primera crida va registrar.
    TravelRuleTestVaspInboundResponse:
      type: object
      properties:
        transaction_id:
          type: string
          format: uuid
          description: UUID de transacció de Didit de la transferència entrant.
        txn_id:
          type: string
          description: txn_id generat per Didit.
        scenario:
          type: string
          description: L'escenari que s'ha executat.
        travel_rule_status:
          type: string
          description: L'estat en què s'ha resolt la decisió de la teva aplicació.
        detail:
          type: string
          description: Per què la transferència s'ha resolt amb aquest estat.
        test_vasp:
          type: boolean
          description: 'Sempre true: el remitent ha estat el VASP de proves de Didit.'
        travel_rule:
          $ref: '#/components/schemas/TravelRuleTransferDetail'
    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.