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

# Enregistrer un transfert entrant Sunrise : Travel Rule

> Enregistrez les données Travel Rule d'un dépôt crypto déjà réglé on-chain avant tout échange, via le flux sunrise post-dépôt de Didit.



Prompt de l'API d'enregistrement d'un transfert Sunrise entrant
        Copier le prompt dans le presse-papiers



      
      

\<pre>

\`Register Travel Rule data for a crypto deposit that settled on-chain BEFORE any exchange took place - because the sending VASP was unreachable at the time (the sunrise problem), or when backfilling historical deposits.

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

Authentication:
Use the x-api-key header with my Didit API key. You are the beneficiary VASP.

Request body (application/json):
\{
"chain": "ETH",                        // required; stored lowercased and matched case-insensitively against your address-book entries' chain
"txid": "0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060",   // dedupe key: same txid + wallet_address returns the existing transfer
"wallet_address": "0x8ba1f109551bD432803012645Ac136ddd64DBA72",   // an XRP X-address is split into its classic address and tag
"memo": "",                              // optional destination tag or memo: on a shared deposit address it names your customer
"amount": "500.00",
"currency": "USDC",
"originator_data": { "name": "Origin CASP SL" },      // flat originator details from the sender, if known (name or full_name, first_name, last_name, vendor_data)
"beneficiary_data": { "name": "Ana Diaz" },           // flat beneficiary details (your customer); name is matched against the entry's holder_name
"originating_vasp": { "name": "Origin CASP SL", "lei": "984500ABCDEF12345634", "travel_address": "taHg7hkTmJ4mTpdQxn61H9cyx6RreB2jrDHeB3pkioRRBgKQaSAGUzp73FVsmEXXJVxdAuCCWiBEFMkcB4MCtcyjnpbyEbTeSHwym394NMS7ev" },  // optional sender identity
"utxo": { "inputs": [ { "address": "bc1q...", "amount": "0.5" } ], "outputs": [ { "address": "bc1q...", "amount": "0.25" } ] }  // optional, BTC/LTC/BCH/DOGE only
}

Behavior:
\- Creates an inbound travelRule transaction (or reuses an unclaimed recorded deposit) and resolves it against your wallet address book, by the address and its memo (an entry with exactly that memo first, else one for the whole address; a deposit without a memo never reaches an entry that has one):
\- no matching entry -> ON_HOLD
\- entry exists, ownership unproven -> UNCONFIRMED_OWNERSHIP
\- name does not match the entry's holder_name -> COUNTERPARTY_MISMATCHED_DATA
\- verified entry + name match -> COMPLETED then immediately FINISHED (the deposit already settled).
\- The address-book match is chain-scoped: an entry matches when its chain equals the request chain (case-insensitive) or the entry's chain is blank, and "ethereum" does not match "ETH".
\- Resolve ON_HOLD (and UNCONFIRMED_OWNERSHIP) with POST /v3/transactions/{transaction_id}/travel-rule/ownership/.
\{"confirmed": true} registers or verifies the wallet entry and runs the name match; {"confirmed": false} declines the transfer.
ON_HOLD does not change the transaction status by itself; only a rule that acts on the Travel Rule status changes it (for example the opt-in library preset travel-rule-pending-action sets AWAITING_USER).
\- Naming originating_vasp keeps the sender's identity on this transfer (metadata.originating_vasp, and the transfer's originator VASP in GET /v3/travel-rule/transfers/); it never creates or changes a shared VASP directory entry.
originating_vasp.lei must be a valid 20-character LEI (ISO 17442) or blank, and originating_vasp.travel_address must be a valid travel address or blank.
An inbound TRP inquiry does not create or change its sender's directory entry either.
\- Webhooks: when a new transaction was created, transaction.created is sent first and travel_rule.status.updated follows for each status transition.
Each webhook is delivered and retried on its own, so do not rely on arrival order; key on transaction_id.
\- Billing: there is no base fee.
A newly created deposit is screened and charged the Wallet Verification & Screening rate only when crypto monitoring is enabled and chain is one Didit can screen (btc, eth, sol, trx, matic, bnb, ltc, xrp, bch, doge, or their full names such as bitcoin or ethereum).
Sandbox applications are never charged.
\- utxo: the sender's wallet is originator_data.wallet_address when you declare it, else the input address that contributed the most. The result is on travel_rule.chain_details.

What to read from the response:
\- transaction_id - the Didit transaction uuid, used in /v3/transactions/{transaction_id}/ calls.
\- txn_id - tr-in-{first 80 characters of txid}-{12 hex characters} for a new transaction, or the existing txn_id of a reused recorded deposit.
\- created - true (201) when this call registered the deposit, false (200) when the same txid + wallet_address was already registered.
\- travel_rule - the full transfer object: uuid, status, direction, rail, protocol, ivms_version, required, ownership_confirmed, deadline_at, timeline, counterparty_vasp, originator_data, beneficiary_data, delivery, discovery, reason, next_actions, created_at.
beneficiary_data includes the wallet_address and the lowercased chain.
originator_data and beneficiary_data stay masked in the response (data_masked: true) until wallet ownership is confirmed.
\- travel_rule.status - the resolved state (see above).

Failure modes:
\- 400 - a missing required field (chain, txid, wallet_address, amount, currency), an invalid originating_vasp.lei, or an invalid travel address ("Invalid travel address.").
\- 403 - missing x-api-key (a wrong, revoked or expired key gets 401).

Full guide: /transaction-monitoring/travel-rule#after-deposit-sunrise-registration.`

\</pre>



      
      

Coller dans



## OpenAPI

````yaml fr/openapi-25.json POST /v3/travel-rule/inbound/
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/inbound/:
    post:
      tags:
        - Travel Rule
      summary: Enregistrer un transfert entrant après dépôt (sunrise)
      description: >-
        Enregistrer les données Travel Rule pour un dépôt crypto déjà réglé
        on-chain avant tout échange. Crée une transaction travelRule entrante
        (ou réutilise un dépôt non réclamé) et rapproche le transfert de votre
        carnet d'adresses de portefeuilles. Pour une transaction nouvellement
        créée, Didit envoie d'abord transaction.created, suivi des webhooks
        travel_rule.status.updated.
      operationId: registerTravelRuleInbound
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleInboundRequest'
            example:
              chain: ETH
              txid: 0xdeposit-hash
              wallet_address: 0xYourDepositWallet
              amount: '500.00'
              currency: USDC
              originator_data:
                name: Origin CASP SL
              beneficiary_data:
                name: Ana Diaz
              originating_vasp:
                name: Origin CASP SL
                lei: ''
                travel_address: >-
                  ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC
      responses:
        '200':
          description: >-
            Un transfert pour ce txid et cette adresse était déjà enregistré ;
            l'existant est renvoyé inchangé (created vaut false).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleInboundResponse'
        '201':
          description: >-
            Un nouveau transfert Travel Rule a été enregistré, sur une nouvelle
            transaction entrante ou sur un dépôt non réclamé existant (created
            vaut true).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleInboundResponse'
        '400':
          description: >-
            Un champ obligatoire (`chain`, `txid`, `wallet_address`, `amount`,
            `currency`) est manquant, `originating_vasp.lei` n'est pas un LEI
            valide, `originating_vasp.travel_address` n'est pas une Travel
            Address valide, un mémo, une X-address ou un `utxo` que la
            blockchain ne peut pas porter, ou `originator_data` /
            `beneficiary_data` n'est pas un objet.
          content:
            application/json:
              examples:
                Missing field:
                  value:
                    txid:
                      - This field is required.
                Invalid LEI:
                  value:
                    originating_vasp:
                      lei:
                        - >-
                          Invalid LEI: expected 20 alphanumeric characters (ISO
                          17442).
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST https://verification.didit.me/v3/travel-rule/inbound/ \
              -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \
              -d '{"chain":"ETH","txid":"0xdeposit-hash","wallet_address":"0xYourDepositWallet","amount":"500.00","currency":"USDC"}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.travel_rule.register_inbound(
                chain="ETH",
                txid="0xdeposit-hash",
                wallet_address="0xYourDepositWallet",
                amount="500.00",
                currency="USDC",
                originator_data={"name": "Origin CASP SL"},
                beneficiary_data={"name": "Ana Diaz"},
                originating_vasp={
                    "name": "Origin CASP SL",
                    "lei": "",
                    "travel_address": "ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC",
                },
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit from "@didit-protocol/sdk-node";

            // Reads DIDIT_API_KEY.
            const didit = new Didit();

            const result = await didit.travelRule.registerInbound({
              chain: "ETH",
              txid: "0xdeposit-hash",
              wallet_address: "0xYourDepositWallet",
              amount: "500.00",
              currency: "USDC",
              originator_data: { name: "Origin CASP SL" },
              beneficiary_data: { name: "Ana Diaz" },
              originating_vasp: {
                name: "Origin CASP SL",
                lei: "",
                travel_address: "ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC",
              },
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.RegisterInbound(ctx, didit.TravelRuleInboundRequest{\n\tChain:           \"ETH\",\n\tTxid:            \"0xdeposit-hash\",\n\tWalletAddress:   \"0xYourDepositWallet\",\n\tAmount:          \"500.00\",\n\tCurrency:        \"USDC\",\n\tOriginatorData:  didit.Some(map[string]any{\"name\": \"Origin CASP SL\"}),\n\tBeneficiaryData: didit.Some(map[string]any{\"name\": \"Ana Diaz\"}),\n\tOriginatingVASP: didit.Some(didit.TravelRuleInboundRequestOriginatingVASP{\n\t\tName:          didit.String(\"Origin CASP SL\"),\n\t\tLei:           didit.String(\"\"),\n\t\tTravelAddress: didit.String(\"ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC\"),\n\t}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import java.util.Map;

            import me.didit.Didit;

            import me.didit.types.TravelRuleInboundRequest;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.travelRule().registerInbound(TravelRuleInboundRequest.builder()
                    .chain("ETH")
                    .txid("0xdeposit-hash")
                    .walletAddress("0xYourDepositWallet")
                    .amount("500.00")
                    .currency("USDC")
                    .originatorData(Map.of("name", "Origin CASP SL"))
                    .beneficiaryData(Map.of("name", "Ana Diaz"))
                    .originatingVasp(TravelRuleInboundRequest.OriginatingVasp.builder()
                            .name("Origin CASP SL")
                            .lei("")
                            .travelAddress("ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC")
                            .build())
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

            // Reads DIDIT_API_KEY.
            $didit = new DiditClient();

            $result = $didit->travelRule->registerInbound([
                'chain' => 'ETH',
                'txid' => '0xdeposit-hash',
                'wallet_address' => '0xYourDepositWallet',
                'amount' => '500.00',
                'currency' => 'USDC',
                'originator_data' => ['name' => 'Origin CASP SL'],
                'beneficiary_data' => ['name' => 'Ana Diaz'],
                'originating_vasp' => [
                    'name' => 'Origin CASP SL',
                    'lei' => '',
                    'travel_address' => 'ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC',
                ],
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.travel_rule.register_inbound(
              chain: "ETH",
              txid: "0xdeposit-hash",
              wallet_address: "0xYourDepositWallet",
              amount: "500.00",
              currency: "USDC",
              originator_data: { name: "Origin CASP SL" },
              beneficiary_data: { name: "Ana Diaz" },
              originating_vasp: {
                name: "Origin CASP SL",
                lei: "",
                travel_address: "ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC",
              }
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Collections.Generic;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.TravelRule.RegisterInboundAsync(new
            TravelRuleInboundRequest

            {
                Chain = "ETH",
                Txid = "0xdeposit-hash",
                WalletAddress = "0xYourDepositWallet",
                Amount = "500.00",
                Currency = "USDC",
                OriginatorData = new Dictionary<string, object> { ["name"] = "Origin CASP SL" },
                BeneficiaryData = new Dictionary<string, object> { ["name"] = "Ana Diaz" },
                OriginatingVasp = new TravelRuleInboundRequestOriginatingVasp
                {
                    Name = "Origin CASP SL",
                    Lei = "",
                    TravelAddress = "ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC",
                },
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    TravelRuleInboundRequest:
      type: object
      required:
        - chain
        - txid
        - wallet_address
        - amount
        - currency
      properties:
        chain:
          type: string
          description: >-
            Blockchain sur laquelle le dépôt a été réglé, par exemple `ETH`.
            Stocké en minuscules et comparé sans distinction de casse avec les
            entrées de votre carnet d'adresses de portefeuilles, utilisez donc
            le même token de blockchain ici.
          maxLength: 32
        txid:
          type: string
          description: Hash de transaction on-chain. Dédupliqué avec wallet_address.
          maxLength: 128
        wallet_address:
          type: string
          description: >-
            Le portefeuille de destination sur lequel vous avez reçu le dépôt.
            Une adresse X XRP est séparée en son adresse classique et son tag.
          maxLength: 128
        amount:
          type: string
          description: >-
            Montant du dépôt sous forme de chaîne décimale, supérieur ou égal à
            zéro, avec jusqu'à 18 décimales.
        currency:
          type: string
          description: Actif de dépôt, par ex. « USDC ».
          maxLength: 16
        originator_data:
          type: object
          description: >-
            Informations sur le donneur d'ordre transmises par le VASP émetteur,
            si elles sont connues, sous forme d'objet plat tel que `{"name":
            "..."}`. Didit y lit name (ou full_name), first_name, last_name et
            vendor_data.
          additionalProperties: true
        beneficiary_data:
          type: object
          description: >-
            Détails du bénéficiaire (votre client), sous la forme d'un objet
            plat tel que `{"name": "..."}`. Didit compare le nom avec le
            holder_name de l'entrée correspondante du carnet d'adresses, et
            définit wallet_address et chain à partir de la requête.
          additionalProperties: true
        originating_vasp:
          type: object
          description: "Description optionnelle du VASP expéditeur. Elle reste uniquement associée à ce transfert (`metadata.originating_vasp`, ainsi que le VASP donneur d'ordre du transfert dans GET /v3/travel-rule/transfers/)\_; elle ne crée, ne modifie ni ne lie jamais une entrée de l'annuaire partagé des VASP."
          properties:
            name:
              type: string
              maxLength: 255
            lei:
              type: string
              maxLength: 20
              description: Optionnel. Un LEI ISO 17442 valide de 20 caractères, ou vide.
            travel_address:
              type: string
              description: La Travel Address de l'expéditeur, enregistrée sur ce transfert.
              maxLength: 512
        memo:
          type: string
          maxLength: 256
          description: "Optionnel. Le tag de destination ou memo du dépôt sur un réseau à memo\_: sur une adresse de dépôt partagée, c'est ce qui distingue vos clients, et l'entrée du carnet d'adresses correspondant à ce memo est mise en correspondance. XRP\_: un tag de destination, un nombre entier de 0 à 4294967295 (un nombre JSON est accepté). XLM\_: un memo textuel jusqu'à 28 octets, un identifiant 64 bits ou un hachage de 32 octets en hexadécimal. EOS\_: jusqu'à 256 octets. ATOM\_: jusqu'à 256 caractères. HBAR\_: jusqu'à 100 octets. Les portefeuilles Bitcoin, EVM, Solana, Tron, Litecoin, Bitcoin Cash, Dogecoin et Lightning n'acceptent aucun memo\_: en indiquer un renvoie un `400`. Alias\_: `destinationTag` ou `destination_tag`."
        utxo:
          allOf:
            - $ref: '#/components/schemas/TravelRuleUtxo'
          description: "Optionnel, blockchains UTXO uniquement. Les entrées et sorties de la transaction de dépôt\_: le portefeuille de l'expéditeur est le `originator_data.wallet_address` déclaré, sinon l'entrée la plus importante."
    TravelRuleInboundResponse:
      type: object
      properties:
        transaction_id:
          type: string
          format: uuid
          description: UUID de transaction Didit pour le dépôt entrant.
        txn_id:
          type: string
          description: >-
            txn_id de la transaction entrante : généré par Didit lorsque Didit a
            créé la transaction, ou le vôtre lorsqu'un dépôt non réclamé a été
            réutilisé.
        created:
          type: boolean
          description: >-
            true lorsque cet appel a enregistré le transfert (HTTP 201) ; false
            lorsqu'un transfert pour le même txid et la même wallet_address
            existait déjà (HTTP 200).
        travel_rule:
          $ref: '#/components/schemas/TravelRuleTransferDetail'
    TravelRuleUtxo:
      type: object
      description: >-
        Les entrées et sorties d'un transfert UTXO (BTC, LTC, BCH, DOGE).
        Uniquement accepté sur ces blockchains : sur toute autre blockchain,
        cela génère un `400`. À partir de celles-ci, Didit déduit le
        portefeuille du donneur d'ordre (celui déclaré, sinon l'adresse d'entrée
        ayant le plus contribué) et la sortie du bénéficiaire (celle déclarée,
        sinon la seule sortie qui ne rembourse pas une adresse d'entrée en tant
        que monnaie rendue, sinon la sortie réglant le montant du transfert). Le
        résultat figure sur le `chain_details` du transfert.
      required:
        - outputs
      properties:
        inputs:
          type: array
          maxItems: 1000
          items:
            $ref: '#/components/schemas/TravelRuleUtxoEntry'
          description: >-
            Facultatif. Sans entrées, aucun donneur d'ordre n'est déduit et
            aucune sortie de change n'est reconnue.
        outputs:
          type: array
          minItems: 1
          maxItems: 1000
          items:
            $ref: '#/components/schemas/TravelRuleUtxoEntry'
    TravelRuleTransferDetail:
      type: object
      description: >-
        Objet de transfert complet renvoyé par les endpoints de confirmation
        d'actionnariat et de finalisation/annulation. Tant que l'actionnariat du
        portefeuille d'un transfert entrant n'est pas confirmé, les champs
        `originator_data` et `beneficiary_data` de la contrepartie sont renvoyés
        masqués (la première lettre de chaque mot est conservée ; le
        portefeuille, la blockchain et le routage VASP restent lisibles) et
        `data_masked` est à 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: >-
            Le réseau sur lequel le transfert a été acheminé, ou null
            lorsqu'aucun réseau n'a été sélectionné (par exemple en dessous du
            seuil, un portefeuille de contrepartie auto-hébergé, un
            enregistrement après dépôt ou aucune contrepartie joignable).
            INTERNAL signifie que les deux parties sont des applications Didit ;
            EMAIL signifie que la contrepartie a été jointe via un lien de
            récupération envoyé par e-mail. TEST_VASP signifie que le VASP de
            test Didit a répondu au transfert sandbox. Sur GTR, VERIFYVASP et
            SYGNA, Didit lit la réponse de la contrepartie à partir de la
            réponse du réseau ou en l'interrogeant toutes les 5 minutes. TRUST
            effectue uniquement des envois, de sorte qu'un transfert TRUST reste
            à l'état AWAITING_COUNTERPARTY jusqu'à son expiration. Un canal de
            réseau n'est utilisé que si vous avez connecté votre propre adhésion
            à ce réseau. Il est choisi après le retour de la création de la
            transaction, il est donc null dans cette réponse.
        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 comparaison de noms déterminée par cette entrée, à côté de
                  `detail`. Absente pour les entrées qui n'ont comparé aucun
                  nom.
              reason:
                type: string
                description: >-
                  Présent uniquement sur l'entrée d'une transition provoquée par
                  un échec de livraison : `email_undeliverable` ou
                  `delivery_failed`, la valeur indiquée par le `reason` du
                  transfert.
        counterparty_vasp:
          type: object
          nullable: true
          properties:
            name:
              type: string
            lei:
              type: string
            dd_score:
              type: integer
              description: >-
                Score de due diligence de 0 à 100, où une valeur plus élevée est
                meilleure. Même échelle que dans l'annuaire des VASP.
            dd_score_breakdown:
              type: object
              description: >-
                Contributions par composant au dd_score, un objet par composant
                comme dans le répertoire VASP (jurisdiction, verification,
                protocol, lei, history, essentials, responsiveness), chacun
                comprenant {points, max, reason, detail}. {} jusqu'à ce que la
                contrepartie ait été évaluée.
              additionalProperties:
                type: object
                properties:
                  points:
                    type: number
                    description: Points attribués pour ce composant.
                  max:
                    type: integer
                    description: Nombre maximal de points que ce composant peut attribuer.
                  reason:
                    type: string
                    description: Code lisible par machine du verdict du composant.
                  detail:
                    type: string
                    description: >-
                      Raison lisible par l'utilisateur pour les points
                      attribués.
            dd_assessed_at:
              type: string
              format: date-time
              nullable: true
              description: >-
                Date et heure de la dernière évaluation de diligence
                raisonnable. Null tant que la contrepartie n'a pas été évaluée.
        originator_data:
          type: object
          description: >-
            Partie du donneur d'ordre. Pour un transfert entrant, les valeurs de
            la contrepartie sont masquées jusqu'à ce que l'actionnariat soit
            confirmé.
        beneficiary_data:
          type: object
          description: >-
            Partie bénéficiaire. Pour un transfert entrant, les valeurs de la
            contrepartie sont masquées jusqu'à confirmation de la propriété.
        name_match:
          allOf:
            - $ref: '#/components/schemas/TravelRuleNameMatch'
          nullable: true
          description: "La comparaison de noms qui a déterminé le transfert, ou null tant qu'aucune n'a été exécutée. Lorsque les parties sont masquées, ainsi que sur la copie de l'autre client d'un échange INTERNAL, `transfer_name`, `compared_name`, `matched_names` et `mismatched_names` sont masqués. `score` et `matched` peuvent différer\_: `matched` suit le niveau d'exigence, `score` correspond à la similarité entre les deux noms complets."
        data_match:
          $ref: '#/components/schemas/TravelRuleDataMatch'
        mismatched_fields:
          type: array
          items:
            type: string
          description: >-
            Raccourci pour `data_match.mismatched_fields`. Vide lorsque rien ne
            diffère.
        data_unmasked:
          $ref: '#/components/schemas/TravelRuleDataUnmasked'
        data_masked:
          type: boolean
          description: >-
            Vrai tant que les données personnelles de la contrepartie sont
            masquées dans cette réponse.
        created_at:
          type: string
          format: date-time
        delivery:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/TravelRuleDelivery'
          description: >-
            État d'acheminement du dernier message que ce transfert doit à
            l'autre partie. Vaut null lorsque le transfert n'a jamais dû en
            envoyer un (par exemple en dessous de `threshold_amount`, pour un
            portefeuille auto-hébergé déclaré ou un enregistrement sunrise).
        discovery:
          type: array
          description: >-
            Manière dont Didit a recherché la contrepartie, une entrée par étape
            exécutée. Vide lorsqu'aucune recherche n'a été effectuée, par
            exemple lors d'un transfert entrant.
          items:
            $ref: '#/components/schemas/TravelRuleDiscoveryStep'
        reason:
          type: string
          description: "Raison pour laquelle un transfert `COUNTERPARTY_VASP_NOT_FOUND` ou `COUNTERPARTY_VASP_NOT_REACHABLE` est bloqué\_; `\"\"` pour tout autre statut. Un échec de livraison la détermine en premier, sur `COUNTERPARTY_VASP_NOT_REACHABLE` uniquement\_: `email_undeliverable` (le fournisseur de messagerie a refusé l'e-mail de conformité et il ne reste aucune adresse à essayer\_: lors de son envoi, lors d'un rappel ou sous la forme d'un rejet permanent signalé ultérieurement) ou `delivery_failed` (le canal assurant la livraison a définitivement échoué\_: un canal réseau a refusé le message ou a épuisé ses tentatives, un hôte d'identité `TRP` n'a pas répondu, ou l'hôte `TRP` de la contrepartie n'a pas accepté la demande). Sinon, la trace `discovery` la détermine\_: `awaiting_end_user` (aucune étape n'a désigné de contrepartie que Didit peut joindre), `directory_match_no_route` (une étape a désigné un VASP de l'annuaire qui ne dispose d'aucun routage), `picked_member_without_proven_wallet` (l'utilisateur final a choisi un client Didit qui n'a pas prouvé le contrôle du portefeuille) ou `no_directory_match` lorsque la trace ne donne aucune autre raison. Un nouvel envoi fait progresser le transfert, ce qui efface le motif. Voir [Pourquoi un transfert est bloqué](/fr/transaction-monitoring/travel-rule#pourquoi-un-transfert-est-bloqué)."
        next_actions:
          type: array
          description: >-
            Ce qui permet de faire avancer le transfert ; `[]` pour tout statut
            autre que `COUNTERPARTY_VASP_NOT_FOUND` ou
            `COUNTERPARTY_VASP_NOT_REACHABLE`. `email_undeliverable` propose
            `update_compliance_email`, puis `resend`. `delivery_failed` propose
            `resend`. Un motif lié à la découverte propose
            `select_counterparty_vasp`, `declare_self_hosted`, `add_vasp_hint`
            et `resend`.
          items:
            $ref: '#/components/schemas/TravelRuleNextAction'
        chain_details:
          $ref: '#/components/schemas/TravelRuleChainDetails'
    TravelRuleUtxoEntry:
      type: object
      description: >-
        Une entrée ou une sortie d'une transaction UTXO, telle qu'enregistrée
        par la blockchain.
      required:
        - address
      properties:
        address:
          type: string
          maxLength: 128
        amount:
          type: string
          nullable: true
          description: >-
            Chaîne décimale dans l'unité propre à la crypto-monnaie (BTC, et non
            en satoshis). Facultatif.
          example: '0.0125'
        txid:
          type: string
          maxLength: 128
          description: Facultatif. La transaction dépensée par une entrée.
        vout:
          type: integer
          nullable: true
          minimum: 0
          description: Facultatif. L'index de sortie dépensé par une entrée.
    TravelRuleNameMatch:
      type: object
      nullable: true
      description: "La comparaison de noms qui a déterminé le transfert, ou null tant qu'aucune n'a été exécutée. Lorsque les parties sont masquées, ainsi que sur la copie de l'autre client d'un échange INTERNAL, `transfer_name`, `compared_name`, `matched_names` et `mismatched_names` sont masqués. `score` et `matched` peuvent différer\_: `matched` suit le niveau d'exigence, `score` correspond à la similarité entre les deux noms complets."
      properties:
        score:
          type: integer
          minimum: 0
          maximum: 100
          description: >-
            Similarité des deux noms complets, de 0 à 100. 0 si l'un des deux
            noms est vide.
        matched:
          type: boolean
          description: >-
            Indique si les noms satisfont à `strictness`. L'issue du transfert
            dépend de `data_match`, qui compare chaque champ ; un transfert peut
            donc être COUNTERPARTY_MISMATCHED_DATA alors que cette valeur est
            vraie.
        method:
          type: string
          enum:
            - none
            - exact_token
            - token_subset
            - token_containment
            - sequence_ratio
          description: >-
            Manière dont `matched` a été déterminé : none (`NONE`), exact_token
            (`STRICT`), token_subset (`DEFAULT`), token_containment (`CONTAINS`)
            ou sequence_ratio (`FUZZY`).
        strictness:
          type: string
          enum:
            - NONE
            - STRICT
            - CONTAINS
            - DEFAULT
            - FUZZY
        compared_with:
          type: string
          enum:
            - wallet_holder
            - counterparty_vasp
          description: >-
            wallet_holder : le titulaire enregistré pour le portefeuille.
            counterparty_vasp : le nom fourni par la contrepartie sur la page de
            réponse par e-mail, ou la réponse du VASP de test Didit dans le
            sandbox.
        transfer_name:
          type: string
          description: Le nom figurant sur le transfert.
        compared_name:
          type: string
          description: Le nom avec lequel il a été comparé.
        matched_names:
          type: array
          items:
            type: string
          description: Mots de `transfer_name` trouvés dans `compared_name`.
        mismatched_names:
          type: array
          items:
            type: string
          description: >-
            Mots de `transfer_name` absents de `compared_name`, puis mots de
            `compared_name` absents de `transfer_name`.
    TravelRuleDataMatch:
      type: object
      nullable: true
      description: >-
        Comparaison champ par champ des données des parties au transfert avec ce
        que l'autre partie sait du détenteur du portefeuille. Elle nomme les
        champs et les résultats, jamais les valeurs, afin de rester lisible
        pendant que les données de la contrepartie sont masquées. Null jusqu'à
        ce qu'une comparaison ait été exécutée.
      properties:
        matched:
          type: boolean
          description: Vrai lorsqu'aucun champ comparé ne diffère.
        mismatched_fields:
          type: array
          items:
            type: string
            enum:
              - name
              - date_of_birth
              - address
              - account
          description: Les champs qui diffèrent.
        fields:
          type: object
          description: >-
            Une entrée par champ comparé pour le type d'entité de la partie
            (`name`, `date_of_birth`, `address`, `account` ; une entreprise n'a
            pas de `date_of_birth`).
          additionalProperties:
            type: object
            properties:
              result:
                type: string
                enum:
                  - matched
                  - mismatched
                  - not_compared
                description: >-
                  `not_compared` lorsque la règle est `NONE` ou que l'un des
                  deux côtés ne comporte aucune valeur pour le champ.
              strictness:
                type: string
                enum:
                  - NONE
                  - STRICT
                  - CONTAINS
                  - DEFAULT
                  - FUZZY
    TravelRuleDataUnmasked:
      type: object
      nullable: true
      description: >-
        Enregistrement d'audit du moment où les données de la contrepartie ont
        été démasquées. Null tant que les données sont encore masquées, ainsi
        que pour les transferts sortants.
      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: >-
            Ce qui a confirmé la propriété : ownership_confirmed (votre
            confirmation via la console ou l'API), wallet_proof (une preuve de
            portefeuille dans le widget, ou un transfert entrant INTERNAL,
            défini lors de sa création), address_book_match (un portefeuille
            vérifié du carnet d'adresses), own_verified_wallet (le portefeuille
            vérifié propre à votre utilisateur), inquiry_approved (votre
            approbation d'une demande TRP entrante ou d'un message GTR ou
            Sygna), known_payment_method (un portefeuille avec lequel votre
            utilisateur a déjà payé) ou travel_address (la Travel Address par
            portefeuille qui a nommé le portefeuille).
        actor:
          type: string
          description: >-
            Qui l'a confirmé : l'e-mail de l'utilisateur de la console ou le
            libellé de la clé API. Laissé vide pour une décision automatique.
    TravelRuleDelivery:
      type: object
      description: >-
        État d'acheminement du dernier message que le transfert doit à l'autre
        partie. Didit contacte la contrepartie après le retour de la requête
        ayant créé ou modifié le transfert ; cet objet indique donc si ce
        message a abouti : en file d'attente, en cours d'envoi, en attente de
        nouvelle tentative après une erreur, livré ou échoué. Une défaillance
        dont le réseau peut encore se remettre (absence de réponse dans les
        délais, échec de connexion, HTTP `408`, `429` ou `5xx`) fait l'objet
        d'une nouvelle tentative après 30 secondes, 2 minutes, 10 minutes, 30
        minutes et 1 heure. Lorsqu'un premier message (`kind: SEND`) échoue
        définitivement, parce que le réseau l'a refusé ou que la sixième
        tentative a également échoué, le transfert passe à
        `COUNTERPARTY_VASP_NOT_REACHABLE` avec `last_error` dans sa `timeline` ;
        tout autre message échouant définitivement est consigné dans la
        `timeline`. Le `status` du transfert demeure la source de vérité pour
        l'échange lui-même.
      required:
        - kind
        - status
        - rail
        - attempts
        - last_error
        - next_attempt_at
        - delivered_at
      properties:
        kind:
          type: string
          enum:
            - SEND
            - ANSWER
            - TXID
            - CANCEL
            - POLL
          description: >-
            Ce que transporte le message. `SEND` : le premier message du
            transfert destiné à la contrepartie (sortant ; le réseau est choisi
            lors de son envoi). `ANSWER` : votre acceptation ou votre refus, dû
            au réseau qui en a fait la demande (entrant). `TXID` : le hash de
            transaction on-chain, une fois que vous avez terminé le transfert.
            `CANCEL` : l'annulation, une fois que vous l'avez annulé. `POLL` :
            une requête de statut adressée à un réseau qui en propose une,
            répétée toutes les 5 minutes pendant que le transfert est en attente
            de la contrepartie.
        status:
          type: string
          enum:
            - QUEUED
            - SENDING
            - RETRYING
            - DELIVERED
            - FAILED
          description: >-
            `QUEUED` : en attente d'envoi. `SENDING` : une tentative est en
            cours. `RETRYING` : une tentative a échoué et la suivante
            s'exécutera à `next_attempt_at`. `DELIVERED` : l'autre partie a reçu
            le message. `FAILED` : l'autre partie l'a refusé, ou la dernière
            tentative a échoué.
        rail:
          type: string
          enum:
            - INTERNAL
            - TRP
            - GTR
            - TRUST
            - VERIFYVASP
            - SYGNA
            - EMAIL
            - ''
          description: >-
            Le canal qui achemine le message. Vide jusqu'à ce que Didit en ait
            choisi un pour un premier message.
        attempts:
          type: integer
          minimum: 0
          description: >-
            Tentatives effectuées jusqu'à présent pour ce message. Un message
            qui n'est pas un sondage d'état fait l'objet de 6 tentatives au
            maximum.
        last_error:
          type: string
          description: >-
            Le type d'échec rencontré lors de la dernière tentative, `""`
            lorsqu'il n'y en a eu aucun : par exemple `email undeliverable`,
            `trp identity endpoint unreachable` ou `trp transfer inquiry
            delivery failed`. Il ne contient jamais la propre réponse de la
            contrepartie, qui reste sur la `timeline` du transfert.

            Lorsque GTR répond par une erreur, son propre code d'état et son
            message sont inclus. Les corps de réponse ne sont jamais inclus.
          example: email undeliverable
        next_attempt_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Moment où la prochaine tentative s'exécute lorsque le message est
            `QUEUED` ou `RETRYING`.
        delivered_at:
          type: string
          format: date-time
          nullable: true
          description: Moment où l'autre partie a pris en charge le message.
    TravelRuleDiscoveryStep:
      type: object
      description: >-
        Une étape de la découverte de contrepartie exécutée par Didit pour un
        transfert sortant, dans l'ordre où elles ont été exécutées. La première
        étape qui désigne un VASP disposant d'une route met fin à la chaîne.
      properties:
        step:
          type: string
          enum:
            - internal_address_book
            - wallet_attribution
            - network_lookup
            - customer_hint
            - end_user
          description: >-
            `internal_address_book` : un autre client Didit ayant prouvé le
            contrôle du portefeuille de destination. `wallet_attribution` :
            l'attribution d'analyse blockchain du portefeuille. `network_lookup`
            : un réseau capable d'indiquer quel VASP détient l'adresse.
            `customer_hint` : le nom du VASP, le LEI ou la juridiction que vous
            avez indiqués dans `beneficiary_data`. `end_user` : la contrepartie
            choisie par l'utilisateur final (ou par vous), ou la demande d'en
            sélectionner une.
        outcome:
          type: string
          enum:
            - match
            - miss
            - skipped
          description: >-
            `match` : l'étape a identifié une contrepartie. `miss` : elle s'est
            exécutée et n'en a trouvé aucune. `skipped` : elle n'a pas pu
            s'exécuter, et `reason` en indique la raison.
        reason:
          type: string
          description: >-
            Raison lisible par machine, `""` en cas de correspondance :
            `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` ou `picked_member_without_proven_wallet`.
        vasp:
          type: string
          format: uuid
          nullable: true
          description: >-
            Le VASP de l'annuaire désigné par l'étape, lorsqu'elle en a désigné
            un.
        rail:
          type: string
          nullable: true
          description: >-
            Le canal qui permet d'atteindre cette contrepartie, lorsque l'étape
            en a trouvé un.
        at:
          type: string
          format: date-time
    TravelRuleNextAction:
      type: object
      description: >-
        Un élément permettant de faire avancer un transfert au statut
        `COUNTERPARTY_VASP_NOT_FOUND` ou `COUNTERPARTY_VASP_NOT_REACHABLE`.
        Consultez [Pourquoi un transfert est
        bloqué](/fr/transaction-monitoring/travel-rule#pourquoi-un-transfert-est-bloqué).
      properties:
        action:
          type: string
          enum:
            - select_counterparty_vasp
            - declare_self_hosted
            - add_vasp_hint
            - update_compliance_email
            - resend
          description: >-
            `select_counterparty_vasp` : l'utilisateur final choisit le VASP de
            destination dans le widget de possession de portefeuille, ou vous
            effectuez un PATCH avec `action=beneficiary_vasp`.
            `declare_self_hosted` : l'utilisateur final déclare le portefeuille
            comme auto-hébergé dans le widget. `add_vasp_hint` : indiquez à
            Didit qui est la contrepartie, avec un nom de VASP, un LEI ou une
            Travel Address (par exemple une `travel_address` sur l'entrée du
            carnet d'adresses du portefeuille de destination), puis renvoyez.
            `update_compliance_email` et `resend` sont des valeurs de `action`
            pour `PATCH /v3/transactions/{transaction_id}/travel-rule/` :
            fournissez à nouveau l'e-mail de conformité de la contrepartie, et
            relancez le routage.
        url:
          type: string
          format: uri
          description: >-
            Le lien du widget de propriété du portefeuille, pour
            `select_counterparty_vasp` et `declare_self_hosted` tant que le
            transfert a une session de widget ouverte.
      required:
        - action
    TravelRuleChainDetails:
      type: object
      description: >-
        Manière dont la blockchain du transfert nomme ses deux portefeuilles,
        lorsque plus d'une adresse en paie une autre. Vide (`{}`) pour un
        transfert sur une blockchain basée sur des comptes (EVM, Solana, Tron),
        où les deux adresses sont les portefeuilles. La correspondance, le
        routage et le carnet d'adresses lisent d'abord les portefeuilles ici.
      properties:
        chain:
          type: string
          description: >-
            Blockchain canonique, par ex. `BTC`, `XRP`, ou `LIGHTNING` pour un
            transfert Lightning.
        shape:
          type: string
          enum:
            - utxo
            - memo
            - lightning
        originator:
          $ref: '#/components/schemas/TravelRuleChainSide'
        beneficiary:
          $ref: '#/components/schemas/TravelRuleChainSide'
        utxo:
          type: object
          description: >-
            Sur un transfert UTXO : les entrées et sorties telles
            qu'enregistrées (montants sous forme de chaînes décimales) et la
            manière dont Didit a interprété chaque sortie.
          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: Sorties qui remboursent une adresse d'entrée.
            beneficiary_output_index:
              type: integer
              nullable: true
              description: "La sortie qui paie le bénéficiaire\_; null lorsqu'aucune n'a pu être distinguée."
        lightning:
          type: object
          description: >-
            Sur un transfert Lightning : ce qu'indique la demande de paiement.
            Toujours `kind` (`bolt11`, `bolt12_offer`, `bolt12_invoice`,
            `bolt12_invoice_request`, `lnurl`, `lightning_address`, `node_id` ou
            `unknown`) ; une facture BOLT11 ajoute `network`, `payee_node_id`,
            `payment_hash`, `amount_msat`, `created_at` et `expires_at` ; une
            chaîne BOLT12 ajoute `blinded_paths` et `payee_node_id` ; un LNURL
            ou une adresse Lightning ajoute son `domain`. Rien n'est résolu sur
            le réseau : la requête est uniquement décodée.
          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: >-
            Incohérences UTXO nécessitant une vérification : le donneur d'ordre
            déclaré n'est pas une entrée, le bénéficiaire déclaré n'est pas une
            sortie, aucune sortie de bénéficiaire unique n'a pu être distinguée,
            ou la sortie du bénéficiaire paie un montant différent de celui
            indiqué par la transaction.
        not_applicable_reason:
          type: string
          enum:
            - LIGHTNING_NO_PAYEE_IDENTIFIER
            - LIGHTNING_BOLT12_BLINDED_PAYEE
            - LIGHTNING_LNURL_NAMES_NO_PAYEE
          description: >-
            Sur un transfert Lightning sortant dont la demande de paiement ne
            mentionne aucun bénéficiaire : pourquoi le transfert est
            `NOT_APPLICABLE`. `LIGHTNING_NO_PAYEE_IDENTIFIER` (la demande ne
            mentionne aucun nœud bénéficiaire ou n'a pas pu être décodée),
            `LIGHTNING_BOLT12_BLINDED_PAYEE` (l'offre dissimule son bénéficiaire
            derrière des chemins aveugles), `LIGHTNING_LNURL_NAMES_NO_PAYEE` (un
            LNURL désigne un service, pas un bénéficiaire). Le même code ouvre
            la dernière entrée de la `timeline` du transfert.
    TravelRuleChainSide:
      type: object
      description: >-
        Le portefeuille de l'une des parties, tel que Didit l'a résolu à partir
        des données de la blockchain.
      properties:
        address:
          type: string
          description: >-
            Le portefeuille. Sur un réseau à mémo, l'adresse classique (une
            X-address XRP est divisée en son adresse classique et son tag) ; sur
            Lightning, l'identifiant du nœud du bénéficiaire ou la Lightning
            Address.
        memo:
          type: string
          description: >-
            Le tag de destination ou mémo faisant partie du portefeuille ; `""`
            en l'absence de mémo.
        source:
          type: string
          enum:
            - declared
            - x_address
            - largest_input
            - only_non_change_output
            - amount_match
            - invoice_payee
            - updated
          description: >-
            Origine du portefeuille : `declared` (votre requête), `x_address`
            (dérivée d'une adresse X XRP), `largest_input` (l'adresse d'entrée
            UTXO ayant le plus contribué), `only_non_change_output` (la seule
            sortie UTXO qui n'est pas de la monnaie rendue), `amount_match`
            (l'unique sortie UTXO payant le montant du transfert),
            `invoice_payee` (le bénéficiaire désigné par une demande de paiement
            Lightning), `updated` (défini ultérieurement avec `action:
            update_originator_wallet`).
  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.