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

# Asociar depósito Travel Rule por API: vincular un mensaje

> Con la API de Didit, vincula un depósito entrante sin datos del ordenante al mensaje Travel Rule enviado por el VASP de origen.



Prompt de la API para emparejar un depósito Travel Rule sin emparejar
        Copiar el prompt al portapapeles



      
      

\<pre>

\`Pair an inbound deposit that still waits for originator data with the Travel Rule message the originating VASP sent for it.

Endpoint:
POST https://verification.didit.me/v3/travel-rule/unmatched/{transaction_uuid}/match/

Authentication:
Use the x-api-key header with my Didit API key. A scoped API key needs the transactions privilege.

Path parameter:
\- transaction_uuid - the transaction_id of the unmatched deposit, from GET /v3/travel-rule/unmatched/.

Request body (JSON, required):
\- transaction_id (UUID) - the transaction_id of the received Travel Rule message: a row with kind "message" from GET /v3/travel-rule/transfers/?kind=message. The transfer's own id is not found.

curl example:
curl -X POST "https://verification.didit.me/v3/travel-rule/unmatched/<DEPOSIT_TRANSACTION_ID>/match/" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"transaction_id": "<MESSAGE_TRANSACTION_ID>"}'

Response 200:
\- deposit - the deposit row after the match: it now carries the message's originator data, counterparty VASP and rail, and matched_transaction_id points to the message.
\- message - the message row, with matched_transaction_id pointing to the deposit.

Failure modes:
\- 400 - transaction_id is missing, is the deposit itself, is not a received Travel Rule message, or is for a different asset than the deposit; or the transaction in the path is not an inbound deposit.
\- 401 - invalid API key.
\- 403 - the key lacks the transactions privilege.
\- 404 - the deposit or the message does not exist or was deleted.
\- 409 - the deposit no longer waits for originator data, or the message is already matched to a deposit. Nothing changes.

Full guide: /transaction-monitoring/travel-rule.`

\</pre>



      
      

Pegar en

## Cuándo usarloÚsalo cuando un depósito obtenido mediante [Listar depósitos sin emparejar](https://docs.didit.me/es/management-api/travel-rule/list-unmatched-deposits.md) tiene un mensaje de Travel Rule recibido que le corresponde y Didit no emparejó ambos por sí solo.
El depósito toma los datos del ordenante, el VASP de la contraparte y la red del mensaje, y ambas transferencias registran el emparejamiento en sus cronologías.## Solicitud```bash theme={null}
curl -X POST "https://verification.didit.me/v3/travel-rule/unmatched/DEPOSIT_TRANSACTION_ID/match/" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"transaction_id": "MESSAGE_TRANSACTION_ID"}'
```## Notas- `transaction_uuid` en la ruta es el depósito. `transaction_id` en el cuerpo es el mensaje.
- El mensaje debe corresponder al mismo activo que el depósito.
- La llamada falla con `409` cuando cualquiera de las dos partes ya ha avanzado, y no cambia nada.
- Una transacción eliminada desde la Console responde `404`, en cualquiera de las dos partes.## Relacionado- [Listar depósitos no conciliados](https://docs.didit.me/es/management-api/travel-rule/list-unmatched-deposits.md)
- [Listar transferencias Travel Rule](https://docs.didit.me/es/management-api/travel-rule/list-transfers.md)
- [Travel Rule](https://docs.didit.me/es/transaction-monitoring/travel-rule.md)


## OpenAPI

````yaml es/openapi-25.json POST /v3/travel-rule/unmatched/{transaction_uuid}/match/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de verificación de identidad. Autentícate con el encabezado x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/travel-rule/unmatched/{transaction_uuid}/match/:
    post:
      tags:
        - Travel Rule
      summary: Vincular un depósito de Travel Rule con un mensaje recibido
      description: >-
        Empareja un depósito entrante que aún espera los datos del ordenante con
        el mensaje de Travel Rule que el VASP ordenante envió para él. El
        depósito adopta los datos del ordenante, el VASP de la contraparte y el
        canal del mensaje, y ambas transferencias registran el emparejamiento en
        sus cronologías. `transaction_uuid` es el `transaction_id` del depósito
        obtenido de `GET /v3/travel-rule/unmatched/`. `transaction_id` en el
        cuerpo es el `transaction_id` del mensaje recibido, tomado de una fila
        de `GET /v3/travel-rule/transfers/?kind=message`; con el `id` propio de
        la transferencia no se encuentra. El mensaje debe corresponder al mismo
        activo que el depósito. Un depósito o mensaje eliminado desde la Console
        responde `404`; uno que ya ha avanzado (emparejado o que ya no está en
        espera) responde `409`.
      operationId: matchUnmatchedTravelRuleDeposit
      parameters:
        - name: transaction_uuid
          in: path
          required: true
          description: El `transaction_id` del depósito no conciliado.
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleManualMatchRequest'
            example:
              transaction_id: e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24
      responses:
        '200':
          description: Ambas transferencias después de la coincidencia.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleManualMatchResponse'
              example:
                deposit:
                  id: 7d3a1c55-0b9e-4d52-8a3c-1f6e2b9d4a08
                  transaction_id: c41f9b2e-5a8d-4e0c-9f17-3b6d8a2e5c91
                  txn_id: dep-2026-10-20-0007
                  txn_date: '2026-10-19T08:41:12Z'
                  kind: deposit
                  direction: INBOUND
                  status: AWAITING_COUNTERPARTY
                  rail: TRP
                  asset: ETH
                  amount: '1.25'
                  originator_vasp: Example Counterparty VASP
                  beneficiary_vasp: Example Counterparty VASP
                  originator_wallet: '0x77ccff0cc624a53cd8b8d8703ced826710211ec7'
                  beneficiary_wallet: '0xede2d7e4f5b097e6391ab6bbcf2f47a53f4778cb'
                  originator_memo: ''
                  beneficiary_memo: ''
                  originator_wallet_type: vasp
                  beneficiary_wallet_type: vasp
                  matched_transaction_id: e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24
                  deadline_at: null
                  created_at: '2026-10-19T08:41:13Z'
                message:
                  id: 2b8e6f10-9c3a-47d1-b5e2-0a4c7d9f3e66
                  transaction_id: e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24
                  txn_id: msg-2026-10-20-0003
                  txn_date: '2026-10-19T08:41:12Z'
                  kind: message
                  direction: INBOUND
                  status: COMPLETED
                  rail: TRP
                  asset: ETH
                  amount: '1.25'
                  originator_vasp: Origin CASP SL
                  beneficiary_vasp: Example Counterparty VASP
                  originator_wallet: '0x77ccff0cc624a53cd8b8d8703ced826710211ec7'
                  beneficiary_wallet: '0xede2d7e4f5b097e6391ab6bbcf2f47a53f4778cb'
                  originator_memo: ''
                  beneficiary_memo: ''
                  originator_wallet_type: vasp
                  beneficiary_wallet_type: vasp
                  matched_transaction_id: null
                  deadline_at: '2026-10-21T08:41:13Z'
                  created_at: '2026-10-19T08:41:13Z'
        '400':
          description: >-
            Error de validación: falta `transaction_id`, es el propio depósito,
            no es un mensaje de Travel Rule recibido o corresponde a un activo
            distinto del depósito; o la transacción indicada en la ruta no es un
            depósito entrante.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
              examples:
                Error:
                  value:
                    transaction_id:
                      - >-
                        The travel rule message is for a different asset than
                        the deposit.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          description: Depósito o mensaje desconocido, o uno de ellos se eliminó.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
              example:
                detail: No TravelRuleTransfer matches the given query.
        '409':
          description: >-
            El depósito ya no está esperando los datos del ordenante, o el
            mensaje ya está asociado a un depósito.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
              examples:
                Error:
                  value:
                    detail: This deposit is no longer waiting for originator data.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.travel_rule.unmatched_deposits.match(
                "11111111-2222-3333-4444-555555555555",
                transaction_id="e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24",
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: >-
            import Didit from "@didit-protocol/sdk-node";


            // Reads DIDIT_API_KEY.

            const didit = new Didit();


            const result = await
            didit.travelRule.unmatchedDeposits.match("11111111-2222-3333-4444-555555555555",
            {
              transaction_id: "e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24",
            });

            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.UnmatchedDeposits.Match(ctx, \"11111111-2222-3333-4444-555555555555\", didit.TravelRuleManualMatchRequest{\n\tTransactionID: \"e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24\",\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.TravelRuleManualMatchRequest;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.travelRule().unmatchedDeposits().match("11111111-2222-3333-4444-555555555555",
            TravelRuleManualMatchRequest.builder()
                    .transactionId("e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24")
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: >-
            <?php


            require 'vendor/autoload.php';


            use Didit\DiditClient;


            // Reads DIDIT_API_KEY.

            $didit = new DiditClient();


            $result =
            $didit->travelRule->unmatchedDeposits->match('11111111-2222-3333-4444-555555555555',
            [
                'transaction_id' => 'e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24',
            ]);

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

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

            result = didit.travel_rule.unmatched_deposits.match(
              "11111111-2222-3333-4444-555555555555",
              transaction_id: "e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24"
            )
            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.TravelRule.UnmatchedDeposits.MatchAsync("11111111-2222-3333-4444-555555555555",
            new TravelRuleManualMatchRequest

            {
                TransactionId = "e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    TravelRuleManualMatchRequest:
      type: object
      required:
        - transaction_id
      properties:
        transaction_id:
          type: string
          format: uuid
          description: >-
            El `transaction_id` del mensaje de Travel Rule recibido (una fila
            con `kind: message`).
    TravelRuleManualMatchResponse:
      type: object
      required:
        - deposit
        - message
      properties:
        deposit:
          $ref: '#/components/schemas/TravelRuleTransferRow'
        message:
          $ref: '#/components/schemas/TravelRuleTransferRow'
    TravelRuleTransferRow:
      type: object
      description: >-
        Una transferencia de Travel Rule tal como la muestra la lista de
        transferencias: solo nombres de VASP, wallets y memos, nunca los datos
        personales del ordenante ni del beneficiario.
      properties:
        id:
          type: string
          format: uuid
          description: El id de la transferencia.
        transaction_id:
          type: string
          format: uuid
          description: La transacción de Didit a la que pertenece la transferencia.
        txn_id:
          type: string
          nullable: true
          description: >-
            Tu propio id para la transacción. Las transferencias que Didit
            registra por ti, como una transferencia entrante de Didit Test VASP,
            llevan uno generado.
        txn_date:
          type: string
          format: date-time
        kind:
          type: string
          enum:
            - withdrawal
            - deposit
            - message
          description: >-
            withdrawal: saliente. message: una transferencia entrante que un
            canal creó a partir del mensaje de una contraparte (una consulta
            TRP, el tramo entrante INTERNAL, o un mensaje de GTR, VerifyVASP o
            Sygna Bridge). deposit: cualquier otra transferencia entrante.
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
        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
        reason:
          type: string
          description: >-
            Por qué está bloqueada una transferencia
            `COUNTERPARTY_VASP_NOT_FOUND` o `COUNTERPARTY_VASP_NOT_REACHABLE`;
            es el mismo valor que el `reason` de la propia transferencia, de
            modo que la lista distingue un correo de cumplimiento rebotado de
            una contraparte sin ruta sin abrir cada transferencia. `""` para
            cualquier otro estado. Consulta [Por qué está bloqueada una
            transferencia](/es/transaction-monitoring/travel-rule#por-qué-una-transferencia-está-bloqueada).
        rail:
          type: string
          nullable: true
          enum:
            - INTERNAL
            - TRP
            - GTR
            - TRUST
            - VERIFYVASP
            - SYGNA
            - EMAIL
            - TEST_VASP
            - null
        asset:
          type: string
          description: La moneda de la transacción.
        amount:
          type: string
          description: El importe como decimal simple, por ejemplo "1.25".
        originator_vasp:
          type: string
          description: >-
            Saliente: el nombre legal de tu VASP. Entrante: el nombre de la
            contraparte, tomado de su entrada en el directorio, del miembro de
            la red de Didit, del remitente TRP, del Didit Test VASP o del nombre
            declarado en la transferencia. Vacío cuando no se conoce ninguno.
        beneficiary_vasp:
          type: string
          description: >-
            Saliente: el nombre de la contraparte, determinado de la misma
            forma. Entrante: el nombre legal de tu VASP.
        originator_wallet:
          type: string
        beneficiary_wallet:
          type: string
        originator_memo:
          type: string
          description: Memo o etiqueta de destino; vacío en las cadenas que no lo usan.
        beneficiary_memo:
          type: string
        originator_wallet_type:
          type: string
          enum:
            - vasp
            - self_hosted
            - own
          description: >-
            vasp, self_hosted (declarada sin custodia) u own (una wallet que tu
            libreta de direcciones registra como tuya). Tu propio lado es
            siempre vasp.
        beneficiary_wallet_type:
          type: string
          enum:
            - vasp
            - self_hosted
            - own
        matched_transaction_id:
          type: string
          format: uuid
          nullable: true
          description: >-
            La otra parte de un depósito que asociaste manualmente a una
            transferencia anunciada.
        deadline_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Cuándo expira la transferencia si sigue esperando a su contraparte.
            Se establece en cada transferencia que creas con `POST
            /v3/transactions/` que requiere un intercambio, saliente o entrante.
            Es null por debajo del umbral, en un pago Lightning al que no se
            aplica la Travel Rule y en las transferencias entrantes que Didit
            crea cuando una contraparte se pone en contacto contigo (una
            consulta TRP entrante, un mensaje de red o el tramo entrante
            INTERNAL).
        created_at:
          type: string
          format: date-time
  responses:
    Unauthorized:
      description: No autorizado
      content:
        application/json:
          examples:
            Invalid API Key:
              summary: Clave de API no válida
              value:
                detail: Invalid API Key.
    Forbidden:
      description: Prohibido
      content:
        application/json:
          examples:
            No Permission:
              summary: Sin permiso
              value:
                detail: You do not have permission to perform this action.
            Not Enough Credits:
              summary: Créditos insuficientes
              value:
                error: >-
                  You don't have enough credits to perform this request. Please
                  top up at https://business.didit.me
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La clave de API de tu aplicación, que encontrarás en Developers -> API
        keys en la Business Console. La clave principal tiene acceso completo.
        Una clave con nombre puede tener un alcance limitado: ninguno, lectura o
        escritura por recurso, limitada a algunos flujos o a sesiones aprobadas,
        a una lista de direcciones IP y a una fecha de caducidad. 401 significa
        que la clave es incorrecta, se revocó o expiró; 403 significa que no se
        envió ninguna clave, que la clave no tiene acceso a este recurso o
        acción, o que la solicitud provino de una dirección fuera de su lista de
        IP; 404 en una ruta de sesión significa que la sesión está fuera de los
        flujos o estados de la clave. Una clave sin acceso a contenido
        multimedia recibe las URL de imágenes, videos y PDF como null, y una
        clave sin permiso de escritura en sesiones recibe los enlaces y tokens
        de sesión como null. Consulta https://docs.didit.me/console/api-keys.

````

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