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

# API Travel Rule : associer un dépôt à un message

> Associez un dépôt entrant en attente de données de l'donneur d'ordre au message Travel Rule envoyé par le VASP d'origine avec Didit.



Prompt d'API pour apparier un dépôt Travel Rule non apparié
        Copier le prompt dans le presse-papiers



      
      

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



      
      

Coller dans

## Quand l'utiliserUtilisez-la lorsqu'un dépôt issu de [Lister les dépôts non appariés](https://docs.didit.me/fr/management-api/travel-rule/list-unmatched-deposits.md) possède un message Travel Rule reçu qui lui correspond et que Didit n'a pas réussi à associer les deux de lui-même.
Le dépôt reprend les données du donneur d'ordre, le VASP de la contrepartie et le rail, et les deux transferts enregistrent l'appariement dans leur historique.## Requête```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"}'
```## Remarques- `transaction_uuid` dans le chemin désigne le dépôt. `transaction_id` dans le corps désigne le message.
- Le message doit concerner le même actif que le dépôt.
- L'appel échoue avec `409` lorsque l'un des deux éléments a déjà évolué, et il ne modifie rien.
- Une transaction supprimée depuis la Console renvoie `404`, de l'un ou l'autre côté.## Voir aussi- [Lister les dépôts non appariés](https://docs.didit.me/fr/management-api/travel-rule/list-unmatched-deposits.md)
- [Lister les transferts Travel Rule](https://docs.didit.me/fr/management-api/travel-rule/list-transfers.md)
- [Travel Rule](https://docs.didit.me/fr/transaction-monitoring/travel-rule.md)


## OpenAPI

````yaml fr/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 vérification d'identité. Authentifiez-vous avec l'en-tête x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/travel-rule/unmatched/{transaction_uuid}/match/:
    post:
      tags:
        - Travel Rule
      summary: Faire correspondre un dépôt Travel Rule à un message reçu
      description: >-
        Associez un dépôt entrant toujours en attente des données du donneur
        d'ordre au message Travel Rule que le VASP donneur d'ordre a envoyé pour
        celui-ci. Le dépôt prend les données de donneur d'ordre, le VASP de
        contrepartie et le rail du message, et les deux transferts enregistrent
        la correspondance sur leur chronologie. `transaction_uuid` correspond au
        `transaction_id` du dépôt obtenu via `GET /v3/travel-rule/unmatched/`.
        Le champ `transaction_id` dans le corps de la requête est le
        `transaction_id` du message reçu, provenant d'une ligne de `GET
        /v3/travel-rule/transfers/?kind=message` ; l'`id` propre du transfert
        n'est pas trouvé. Le message doit concerner le même actif que le dépôt.
        Un dépôt ou un message supprimé depuis la Console renvoie `404` ; un
        élément déjà traité (associé ou qui n'est plus en attente) renvoie
        `409`.
      operationId: matchUnmatchedTravelRuleDeposit
      parameters:
        - name: transaction_uuid
          in: path
          required: true
          description: Le `transaction_id` du dépôt non rapproché.
          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: Les deux transferts après la correspondance.
          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: >-
            Erreur de validation : `transaction_id` est manquant, correspond au
            dépôt lui-même, n'est pas un message Travel Rule reçu, ou concerne
            un actif différent de celui du dépôt ; ou la transaction indiquée
            dans le chemin n'est pas un dépôt entrant.
          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: Dépôt ou message inconnu, ou l'un d'eux a été supprimé.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
              example:
                detail: No TravelRuleTransfer matches the given query.
        '409':
          description: >-
            Le dépôt n'est plus en attente des données du donneur d'ordre, ou le
            message est déjà associé à un dépôt.
          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: >-
            Le `transaction_id` du message Travel Rule reçu (une ligne avec
            `kind: message`).
    TravelRuleManualMatchResponse:
      type: object
      required:
        - deposit
        - message
      properties:
        deposit:
          $ref: '#/components/schemas/TravelRuleTransferRow'
        message:
          $ref: '#/components/schemas/TravelRuleTransferRow'
    TravelRuleTransferRow:
      type: object
      description: >-
        Un transfert Travel Rule tel que la liste des transferts l'affiche :
        noms des VASP, portefeuilles et mémos uniquement, jamais les données
        personnelles du donneur d'ordre ou du bénéficiaire.
      properties:
        id:
          type: string
          format: uuid
          description: L'identifiant du transfert.
        transaction_id:
          type: string
          format: uuid
          description: La transaction Didit à laquelle appartient le transfert.
        txn_id:
          type: string
          nullable: true
          description: >-
            Votre propre identifiant pour la transaction. Les transferts que
            Didit enregistre pour vous, comme un transfert entrant Didit Test
            VASP, en portent un généré automatiquement.
        txn_date:
          type: string
          format: date-time
        kind:
          type: string
          enum:
            - withdrawal
            - deposit
            - message
          description: "withdrawal\_: sortant. message\_: un transfert entrant qu'un canal a créé à partir du message d'une contrepartie (une demande TRP, la partie entrante INTERNAL, ou un message GTR, VerifyVASP ou Sygna Bridge). deposit\_: tout autre transfert entrant."
        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: >-
            Raison pour laquelle un transfert `COUNTERPARTY_VASP_NOT_FOUND` ou
            `COUNTERPARTY_VASP_NOT_REACHABLE` est bloqué, identique à la valeur
            `reason` du transfert lui-même, afin que la liste permette de
            distinguer un e-mail de conformité rejeté d'une contrepartie sans
            routage sans avoir à ouvrir chaque transfert. `""` pour tout autre
            statut. Voir [Pourquoi un transfert est
            bloqué](/fr/transaction-monitoring/travel-rule#pourquoi-un-transfert-est-bloqué).
        rail:
          type: string
          nullable: true
          enum:
            - INTERNAL
            - TRP
            - GTR
            - TRUST
            - VERIFYVASP
            - SYGNA
            - EMAIL
            - TEST_VASP
            - null
        asset:
          type: string
          description: La devise de la transaction.
        amount:
          type: string
          description: Le montant sous forme décimale simple, par exemple "1.25".
        originator_vasp:
          type: string
          description: >-
            Sortant : la dénomination sociale de votre VASP. Entrant : le nom de
            la contrepartie, issu de son entrée dans l'annuaire, du membre du
            réseau Didit, de l'expéditeur TRP, du VASP de test Didit ou du nom
            déclaré par le transfert. Vide si aucun n'est connu.
        beneficiary_vasp:
          type: string
          description: >-
            Sortant : le nom de la contrepartie, déterminé de la même façon.
            Entrant : la dénomination sociale de votre VASP.
        originator_wallet:
          type: string
        beneficiary_wallet:
          type: string
        originator_memo:
          type: string
          description: >-
            Mémo ou balise de destination, vide sur les blockchains qui n'en ont
            pas.
        beneficiary_memo:
          type: string
        originator_wallet_type:
          type: string
          enum:
            - vasp
            - self_hosted
            - own
          description: >-
            vasp, self_hosted (déclaré non hébergé) ou own (un portefeuille que
            votre carnet d'adresses enregistre comme le vôtre). Votre propre
            côté est toujours vasp.
        beneficiary_wallet_type:
          type: string
          enum:
            - vasp
            - self_hosted
            - own
        matched_transaction_id:
          type: string
          format: uuid
          nullable: true
          description: >-
            L'autre contrepartie d'un dépôt que vous avez associé manuellement à
            un transfert annoncé.
        deadline_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Date et heure auxquelles le transfert expire s'il est toujours en
            attente de sa contrepartie. Défini sur chaque transfert créé avec
            `POST /v3/transactions/` nécessitant un échange, sortant ou entrant.
            Vaut null en dessous du seuil, sur un paiement Lightning auquel la
            Travel Rule ne s'applique pas, et sur les transferts entrants que
            Didit crée lorsqu'une contrepartie vous contacte (une demande TRP
            entrante, un message réseau ou la branche entrante INTERNAL).
        created_at:
          type: string
          format: date-time
  responses:
    Unauthorized:
      description: Non autorisé
      content:
        application/json:
          examples:
            Invalid API Key:
              summary: Clé API non valide
              value:
                detail: Invalid API Key.
    Forbidden:
      description: Interdit
      content:
        application/json:
          examples:
            No Permission:
              summary: Aucune autorisation
              value:
                detail: You do not have permission to perform this action.
            Not Enough Credits:
              summary: Crédits insuffisants
              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 clé API de votre application, issue de Développeurs -> Clés API dans
        la Business Console. La clé principale dispose d'un accès complet. Une
        clé nommée peut être restreinte : aucun, lecture ou écriture par
        ressource, limitée à certains workflows ou aux sessions approuvées, à
        une liste d'adresses IP et à une date d'expiration. 401 signifie que la
        clé est incorrecte, révoquée ou expirée ; 403 signifie qu'aucune clé n'a
        été envoyée, que la clé n'a pas accès à cette ressource ou action, ou
        que la requête provient d'une adresse hors de sa liste d'IP ; 404 sur
        une route de session signifie que la session est hors des workflows ou
        des statuts de la clé. Une clé sans accès aux médias reçoit les URL
        d'images, de vidéos et de PDF à null, et une clé sans accès en écriture
        aux sessions reçoit les liens et tokens de session à null. Voir
        https://docs.didit.me/console/api-keys.

````

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