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

# Récupérer une transaction via SDK : KYT côté client

> Didit : relisez une transaction surveillée depuis l'appareil avec le même token SDK (statut, Travel Rule, action_required en attente).

Prompt de l'API de récupération d'une transaction (token SDK)
Copier le prompt dans le presse-papiers

<pre>
  \`Re-read a transaction from an end-user device using the same scoped SDK token that submitted it. The Didit SDKs call this automatically after a launched action flow completes or its window closes; call it yourself when handling flows manually.

  Endpoint:
  GET [https://verification.didit.me/v1/transactions/\{transaction\_id}/](https://verification.didit.me/v1/transactions/\{transaction_id}/)

  Authentication:
  X-Transaction-Token header with the sdk\_token used at submission (still within TTL). {transaction_id} is the Didit transaction uuid returned at creation.

  When to call:

  * After the user finishes (or abandons) a wallet-ownership or verification flow, to pick up the refreshed status.
  * To poll status and action\_required while the token is valid, instead of depending on any single event or notification.

  What to read from the response:

  * status - APPROVED | IN\_REVIEW | DECLINED | AWAITING\_USER.
  * travel\_rule.status - the Travel Rule exchange state (COMPLETED means the exchange concluded; the transfer can settle).
  * action\_required - null once the pending action is resolved; otherwise the same block returned at submission.

  Failure modes:

  * 401 - token missing, unknown, revoked, over max\_uses, or expired ("expired" appears in the detail).
  * 404 - the transaction does not belong to the token's application, or it was submitted for a different end user (another vendor\_data) than the token's.

  From your backend, GET /v3/transactions/{transaction_id}/ (x-api-key) returns the same record without any token constraints.

  Full guide: /transaction-monitoring/sdk-transaction-submission.\`
</pre>

Coller dans


## OpenAPI

````yaml fr/openapi-25.json GET /v1/transactions/{transaction_id}/
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:
  /v1/transactions/{transaction_id}/:
    get:
      tags:
        - Transactions
      summary: Obtenir une transaction depuis un SDK
      description: >-
        Endpoint de lecture orienté appareil, authentifié avec le même
        `X-Transaction-Token` utilisé pour la soumission. Les SDK l'interrogent
        périodiquement après l'exécution d'un flux d'action lancé
        automatiquement ou après la fermeture de sa fenêtre, afin que l'état
        final ne dépende jamais d'une seule notification. Renvoie les mêmes
        détails de transaction que la réponse de soumission, y compris le bloc
        `action_required` actuel (`null` une fois l'action résolue).
      operationId: getTransactionFromSdk
      parameters:
        - name: transaction_id
          in: path
          required: true
          description: >-
            UUID de transaction stable attribué par Didit (le `uuid` de la
            réponse de soumission, **et non** votre `txnId`).
          schema:
            type: string
            format: uuid
          example: 22222222-3333-4444-5555-666666666666
      responses:
        '200':
          description: >-
            Le détail complet de la transaction, y compris `action_required`
            (`null` une fois l'action en attente résolue).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransactionDetail'
        '401':
          description: >-
            Le token de transaction a été rejeté : manquant, inconnu, révoqué,
            dépassant son `max_uses`, ou expiré.
          content:
            application/json:
              examples:
                Expired token:
                  value:
                    detail: Transaction token expired.
        '404':
          description: >-
            Aucune transaction avec cet UUID n'existe pour l'application du
            token, ou le segment de chemin n'est pas un UUID valide.
          content:
            application/json:
              examples:
                Not found:
                  value:
                    detail: Not found.
      security:
        - TransactionTokenAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X GET
            'https://verification.didit.me/v1/transactions/22222222-3333-4444-5555-666666666666/'
            \
              -H 'X-Transaction-Token: SDK_TOKEN'
components:
  schemas:
    TransactionDetail:
      type: object
      description: >-
        Enregistrement de surveillance complet pour une transaction, tel que
        renvoyé par `GET /v3/transactions/{transaction_id}/` et `POST
        /v3/transactions/`.
      properties:
        uuid:
          type: string
          format: uuid
          description: >-
            Identifiant de transaction stable attribué par Didit. À utiliser
            comme `{transaction_id}` pour les appels de suivi.
        environment:
          type: string
          enum:
            - live
            - sandbox
          description: >-
            Environnement de l'application propriétaire de la transaction. Une
            transaction `sandbox` est enregistrée mais n'est jamais évaluée,
            filtrée, notifiée ou facturée, de sorte que son `rule_runs` vide
            signifie « non évaluée ».
        transaction_number:
          type: integer
          description: >-
            Numéro de transaction séquentiel propre à l'application affiché dans
            la console (ex. `4123`).
        txn_id:
          type: string
          description: >-
            Le `transaction_id` que vous avez fourni lors de la création (128
            caractères max.). Unique par application.
        txn_date:
          type: string
          format: date-time
          description: >-
            Date et heure auxquelles la transaction a eu lieu (à partir de
            `transaction_at` ; par défaut, la date de soumission).
        zone_id:
          type: string
          nullable: true
          description: Identifiant de fuseau horaire IANA fourni au moment de la création.
        transaction_type:
          type: string
          description: >-
            Catégorie de premier niveau telle que stockée : `finance`, `kyc`,
            `travelRule`, `userPlatformEvent`, `gamblingBet`,
            `gamblingLimitChange`, `gamblingBonusChange`, `auditTrailEvent`.
            Notez que les valeurs composées de plusieurs mots sont renvoyées en
            camelCase même lorsqu'elles ont été transmises en snake_case.
        action_type:
          type: string
          description: >-
            Sous-type au sein de la catégorie (par exemple `deposit`,
            `withdrawal`, `transfer`). Correspond par défaut à la catégorie s'il
            n'est pas fourni.
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
          description: >-
            Direction relative au sujet. Stockée en majuscules quelle que soit
            la casse fournie (`in`/`out`/`inbound`/`outbound` sont acceptés en
            entrée).
        status:
          type: string
          enum:
            - APPROVED
            - IN_REVIEW
            - DECLINED
            - AWAITING_USER
          description: >-
            Verdict actuel de la surveillance. Les transactions sont créées avec
            le statut `APPROVED` ; les règles peuvent les faire basculer vers
            `IN_REVIEW`/`DECLINED` de manière synchrone.
        source:
          type: string
          enum:
            - LIVE
            - IMPORTED
          description: >-
            Origine de l'enregistrement : `LIVE` pour les transactions soumises
            via l'API ou le SDK, `IMPORTED` pour les transactions chargées via
            l'import de la console.
        amount:
          type: string
          description: >-
            Montant de la transaction sous forme de chaîne décimale sans les
            zéros de fin (par ex. `"1500"`, `"0.5"`, `"0.123456789012345678"`).
            Jusqu'à 18 décimales.
        currency:
          type: string
          description: >-
            Code devise de `amount`. Tout code alphabétique ISO 4217 est accepté
            (par ex. `EUR`, `USD`, `NGN`), ainsi qu'un symbole d'actif crypto
            (par ex. `BTC`). Privilégiez un code actuellement en circulation.
            Tous les codes acceptés ne disposent pas d'un taux de change :
            lorsqu'aucun taux n'est disponible pour le code (par exemple l'unité
            de compte ISO `XSU`, ou un symbole crypto dont Didit n'établit pas
            le prix), la conversion automatique échoue et
            `preferred_currency_amount` est retourné nul, sauf si la requête a
            fourni un montant pré-converti `amount_in_default_currency`.
        currency_type:
          type: string
          nullable: true
          description: '`fiat` ou `crypto`, selon la valeur fournie dans `currency_kind`.'
        amount_in_default_currency:
          type: string
          nullable: true
          description: >-
            Montant pré-converti que vous avez fourni, sous forme de chaîne
            décimale sans les zéros de fin.
        default_currency_code:
          type: string
          nullable: true
        preferred_currency_amount:
          type: string
          nullable: true
          description: >-
            `amount` converti dans la devise préférée de l'application,
            lorsqu'il est disponible.
        preferred_currency_code:
          type: string
          nullable: true
        payment_details:
          type: string
          nullable: true
          description: Référence ou mémo de paiement en texte libre issu de la soumission.
        payment_txn_id:
          type: string
          nullable: true
          description: >-
            Référence du système de paiement externe (par ex. hachage de
            transaction blockchain) issue de `payment_reference_id`.
        score:
          type: integer
          description: >-
            Score de risque cumulé par les règles (généralement 0–100). Plus il
            est élevé, plus le risque est grand.
        severity:
          type: string
          nullable: true
          enum:
            - UNKNOWN
            - LOW
            - MEDIUM
            - HIGH
            - CRITICAL
          description: >-
            Gravité catégorielle du risque définie par les règles/fournisseurs
            (`UNKNOWN`, `LOW`, `MEDIUM`, `HIGH`, `CRITICAL`). `null` jusqu'à ce
            qu'un élément la définisse.
        decision_reason_code:
          type: string
          nullable: true
          description: Raison lisible par machine pour le `status` actuel.
        decision_reason_label:
          type: string
          nullable: true
          description: Libellé lisible par l'humain pour `decision_reason_code`.
        vendor_data:
          type: string
          nullable: true
          description: Copie de commodité des `vendor_data` du demandeur.
        metadata:
          type: object
          description: >-
            Instantané des payloads `subject` et `counterparty` tels qu'ils ont
            été soumis au moment de la création.
        props:
          type: object
          description: >-
            Les `custom_properties` fournies lors de la création. Chaque clé est
            accessible dans les conditions de règles sous la forme
            `custom_values.<key>`.
        tags:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              name:
                type: string
              color:
                type: string
              description:
                type: string
                nullable: true
              source:
                type: string
                enum:
                  - didit
                  - custom
                description: >-
                  Indique si le tag est un préréglage Didit ou un tag
                  personnalisé.
          description: Tags associés à la transaction (manuellement ou par des règles).
        parties:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              role:
                type: string
                enum:
                  - APPLICANT
                  - REMITTER
                  - BENEFICIARY
                  - COUNTERPARTY
                description: >-
                  Rôle de la partie. L'endpoint de création attribue `APPLICANT`
                  (le sujet) et `COUNTERPARTY`.
              entity_type:
                type: string
                enum:
                  - individual
                  - company
                  - external
                  - unhostedWallet
              kind:
                type: string
                enum:
                  - USER
                  - BUSINESS
                  - EXTERNAL
                description: >-
                  Les parties `USER`/`BUSINESS` renvoient à une entité
                  appartenant à Didit via `vendor_data`. Les parties `EXTERNAL`
                  n'ont aucune entité Didit derrière elles.
              vendor_data:
                type: string
                nullable: true
                description: Votre identifiant interne d'utilisateur/entreprise.
              full_name:
                type: string
                nullable: true
              first_name:
                type: string
                nullable: true
              last_name:
                type: string
                nullable: true
              country_code:
                type: string
                nullable: true
                description: >-
                  Code pays issu de `address.country` fourni (généralement ISO
                  3166-1 alpha-3).
              dob:
                type: string
                format: date
                nullable: true
                description: Date de naissance issue du `date_of_birth` soumis.
              address:
                type: object
                description: Objet d'adresse tel qu'il a été soumis. `{}` s'il est omis.
              institution_info:
                type: object
                description: >-
                  Informations sur l'établissement telles que soumises. `{}`
                  lorsqu'elles sont omises.
              device:
                type: object
                description: >-
                  Contexte d'appareil normalisé, incluant l'enrichissement de
                  l'IP côté serveur sous network_context (géolocalisation,
                  indicateurs VPN/centre de données) lorsqu'une adresse IP a été
                  fournie.
                properties:
                  fingerprint:
                    type: string
                    description: Empreinte unique de l'appareil.
                  persistent_device_id:
                    type: string
                    description: >-
                      Identifiant stable de l'appareil entre les sessions
                      (schéma d'empreinte v2).
                  user_agent:
                    type: string
                    description: >-
                      Chaîne de l'agent utilisateur du navigateur ou de
                      l'application.
                  browser_family:
                    type: string
                    description: Famille du navigateur (ex. Chrome, Firefox, Safari).
                  browser_version:
                    type: string
                    description: Chaîne de version du navigateur.
                  platform:
                    type: string
                    description: >-
                      Identifiant de plateforme (web, ios, android, macos,
                      windows, linux).
                  os_family:
                    type: string
                    description: >-
                      Famille de système d'exploitation (par exemple iOS,
                      Android, Windows).
                  os_version:
                    type: string
                    description: Chaîne de version du système d'exploitation.
                  accept_language:
                    type: string
                    description: Valeur de l'en-tête Accept-Language.
                  session_id:
                    type: string
                    description: Identifiant de session (stocké dans les métadonnées).
                  session_age_ms:
                    type: number
                    description: Âge de la session en millisecondes.
                  network_context:
                    type: object
                    description: Contexte réseau avec adresse IP et géolocalisation.
                    properties:
                      ip_address:
                        type: string
                        description: Adresse du client.
                      ip_country_code:
                        type: string
                        description: >-
                          Pays déterminé par géolocalisation de l'IP (ISO 3166-1
                          alpha-3).
                      latitude:
                        type: number
                        description: Latitude géographique de l'IP.
                      longitude:
                        type: number
                        description: Longitude géographique de l'IP.
              external_party_snapshot:
                type: object
                nullable: true
                description: >-
                  Copie figée des données de la partie pour les parties
                  `EXTERNAL`. `null` tant que la partie est liée à un
                  utilisateur ou une entreprise Didit.
          description: Parties à la transaction (demandeur, contrepartie).
        payment_methods:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              payment_method_type:
                type: string
                enum:
                  - bank_card
                  - bank_account
                  - e_wallet
                  - crypto_wallet
                  - unhosted_wallet
                  - other
              label:
                type: string
                nullable: true
              fingerprint:
                type: string
                nullable: true
                description: >-
                  SHA-256 sur `type:account_id:issuing_country` — identifiant
                  stable pour corréler la réutilisation d'un même instrument.
              account_id:
                type: string
                nullable: true
                description: >-
                  Identifiant de compte (IBAN, adresse de portefeuille, token de
                  carte, …).
              issuing_country:
                type: string
                nullable: true
              owner_kind:
                type: string
                enum:
                  - USER
                  - BUSINESS
                  - EXTERNAL
              vendor_data:
                type: string
                nullable: true
                description: >-
                  Votre identifiant pour l'utilisateur/l'entreprise
                  propriétaire.
              owner_name:
                type: string
                nullable: true
              institution_info:
                type: object
              details:
                type: object
                description: Objet `payment_method` brut tel que soumis.
              external_owner_snapshot:
                type: object
                nullable: true
              role:
                type: string
                enum:
                  - SOURCE
                  - DESTINATION
                  - FUNDING
                  - BENEFICIARY
                description: >-
                  Manière dont cette méthode a été utilisée dans la transaction.
                  L'endpoint de création attribue `SOURCE`/`DESTINATION` à
                  partir de la direction (sortante : sujet = SOURCE ; entrante :
                  sujet = DESTINATION).
          description: Moyens de paiement associés à la transaction.
        documents:
          type: array
          description: >-
            Fichiers joints à la transaction depuis la console. `[]` s'il n'y en
            a aucun.
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              label:
                type: string
                nullable: true
              note:
                type: string
                nullable: true
              uploaded_by:
                type: string
                nullable: true
              created_at:
                type: string
                format: date-time
              files:
                type: array
                items:
                  type: object
                  properties:
                    uuid:
                      type: string
                      format: uuid
                    file_url:
                      type: string
                      format: uri
                      nullable: true
                      description: >-
                        URL de téléchargement signée de courte durée ;
                        récupérez-la en cas de besoin plutôt que de la stocker.
                    original_filename:
                      type: string
                      nullable: true
                    file_size:
                      type: integer
                      nullable: true
        activities:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              activity_type:
                type: string
                description: >-
                  Par ex. `TRANSACTION_CREATED`, `TRANSACTION_NOTE_ADDED`,
                  `TRANSACTION_STATUS_CHANGED`.
              source:
                type: string
              status:
                type: string
                nullable: true
              title:
                type: string
                nullable: true
              description:
                type: string
                nullable: true
              metadata:
                type: object
              occurred_at:
                type: string
                format: date-time
          description: >-
            Entrées du journal d'activité (création, notes, examens manuels,
            changements de statut).
        alerts:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              title:
                type: string
              description:
                type: string
                nullable: true
              severity:
                type: string
                enum:
                  - UNKNOWN
                  - LOW
                  - MEDIUM
                  - HIGH
                  - CRITICAL
              status:
                type: string
                enum:
                  - OPEN
                  - INVESTIGATING
                  - AWAITING_USER
                  - PENDING_SAR
                  - SAR_FILED
                  - RESOLVED
                  - DISMISSED
              source:
                type: string
                enum:
                  - RULE
                  - PROVIDER
                  - MANUAL
              metadata:
                type: object
              created_at:
                type: string
                format: date-time
              due_at:
                type: string
                format: date-time
                nullable: true
          description: >-
            Toujours vide aujourd'hui. Une alerte ouverte est une transaction
            avec le statut `IN_REVIEW` ou `AWAITING_USER`.
        rule_runs:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              rule:
                type: string
                format: uuid
                description: UUID de la règle exécutée.
              rule_title:
                type: string
              rule_description:
                type: string
                nullable: true
              rule_category:
                type: string
              matched:
                type: boolean
                description: >-
                  Indique si les conditions de la règle correspondaient à cette
                  transaction. Une exécution n'est enregistrée que pour les
                  règles correspondantes, de sorte que les évaluations en
                  production portent toujours la valeur `true`.
              is_test:
                type: boolean
                description: >-
                  Vrai lorsque la règle a été exécutée en mode TEST (aucun effet
                  sur le statut/score).
              mode:
                type: string
                enum:
                  - ACTIVE
                  - DISABLED
                  - TEST
              severity:
                type: string
                nullable: true
              score_delta:
                type: integer
                description: Score ajouté par les actions `add_score` de cette règle.
              status_target:
                type: string
                nullable: true
                description: Statut défini par une action `change_status`, le cas échéant.
              action_summary:
                type: string
                nullable: true
                description: >-
                  Résumé des actions exécutées par la règle, séparées par `; `
                  (par ex. `score +30; change_status:IN_REVIEW;
                  add_tag:high_risk_country`). Parties : `score +N`,
                  `change_status:<STATUS>`, `add_tag:<name>`, `add_note`,
                  `add_to_list`, `open_case`. `null` lorsque la règle n'a
                  exécuté aucune action.
              metadata:
                type: object
                description: >-
                  Détail de l'évaluation : `scope_match`, `conditions[]` et
                  `aggregations[]`. Chaque entrée de condition contient `field`,
                  `operator`, `expected_value`, la `current_value` lue à partir
                  de la transaction, `matched`, `group_index` et `group_logic`.
                  Chaque entrée d'agrégation (vélocité / décompte / somme)
                  contient `metric`, `field`, `operator`, `expected_value`, la
                  `computed_value` obtenue par l'agrégat, `window`, `filters`,
                  `matched` et `sample_references` ; les agrégations asynchrones
                  différées ont `computed_value: null` et `deferred: true`. Un
                  groupe de conditions imbriqué est une entrée `conditions[]`
                  avec l'`operator` `any_of` ou `all_of`, `field` défini sur
                  null, et les résultats de ses membres sous ses propres
                  `conditions`.
              created_at:
                type: string
                format: date-time
          description: >-
            Résultats d'exécution par règle — quelle règle s'est déclenchée,
            avec quel impact sur le score.
        provider_results:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              provider:
                type: string
              result_type:
                type: string
                enum:
                  - FIAT_MONITORING
                  - WALLET_SCREENING
                  - TRANSACTION_SCREENING
                  - TRAVEL_RULE
                  - NETWORK_GRAPH
                  - CUSTOM
              status:
                type: string
              severity:
                type: string
                nullable: true
              score:
                type: integer
              summary:
                type: string
                nullable: true
              payload:
                type: object
                description: Payload brut de la réponse du fournisseur.
              created_at:
                type: string
                format: date-time
          description: >-
            Payloads bruts des fournisseurs (filtrage AML, analyse blockchain,
            etc.).
        travel_rule:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/TransactionTravelRule'
          description: >-
            Transfert ou vérification Travel Rule. Renseigné lorsque
            `travel_rule_details` a été soumis, et également lorsque la Travel
            Rule est activée et que la transaction a été créée avec
            `transaction_category: travelRule` (Didit initie lui-même l'échange,
            même sans `travel_rule_details`). `null` lorsqu'aucun transfert ou
            vérification n'existe. Lors d'un transfert entrant, les champs
            `originator_data` et `beneficiary_data` de la contrepartie restent
            masqués (`data_masked: true`) jusqu'à ce que la détention du
            portefeuille soit confirmée.
        network_snapshot:
          type: object
          nullable: true
          description: >-
            Instantané du graphe des transactions/parties liées utilisé par le
            moteur de règles. Il s'agit soit du `network_snapshot` soumis avec
            la transaction, soit du graphe que Didit génère à partir d'un
            filtrage AML des portefeuilles réussi (qui remplace un graphe
            soumis). `null` si aucun des deux n'existe.
          properties:
            uuid:
              type: string
              format: uuid
            nodes:
              type: array
              items:
                type: object
            edges:
              type: array
              items:
                type: object
            metrics:
              type: object
        remediation:
          type: object
          nullable: true
          description: >-
            Session de remédiation proposée à l'utilisateur lorsqu'une
            revérification est requise. Remplacée par `action_required`, qui est
            le bloc canonique ; conservée à des fins de rétrocompatibilité.
          properties:
            session_id:
              type: string
            session_token:
              type: string
            url:
              type: string
              format: uri
            status:
              type: string
        action_required:
          type: object
          nullable: true
          description: >-
            Action de l'utilisateur final en attente, requise pour terminer
            cette transaction, ou null lorsqu'il n'y en a aucune. Les SDK Didit
            lancent automatiquement l'action par défaut et actualisent la
            transaction lorsqu'elle se termine. Deux variantes, différenciées
            par `type` : `verification_session` (une session de vérification
            hébergée créée par une action de règle) et `wallet_ownership` (une
            session de widget de propriété de portefeuille générée
            automatiquement pour un transfert Travel Rule nécessitant une preuve
            de contrôle du portefeuille, conditionnée par le paramètre Travel
            Rule `auto_wallet_verification`). Lorsque les deux pourraient
            s'appliquer, `wallet_ownership` prévaut car elle bloque l'échange
            Travel Rule.
          oneOf:
            - $ref: '#/components/schemas/TransactionVerificationSessionAction'
            - $ref: '#/components/schemas/TransactionWalletOwnershipAction'
          discriminator:
            propertyName: type
            mapping:
              verification_session: '#/components/schemas/TransactionVerificationSessionAction'
              wallet_ownership: '#/components/schemas/TransactionWalletOwnershipAction'
        cost_breakdown:
          type: object
          nullable: true
          description: >-
            Coût de cette transaction : `total_price` et `items`, un pour chaque
            frais facturé, chacun avec `usage_type`, `price`, `details` et
            `created_at`. Un nouveau filtrage de la même transaction constitue
            un nouvel élément.
    TransactionTravelRule:
      type: object
      description: >-
        Le transfert Travel Rule d'une transaction, tel que renvoyé par `GET
        /v3/transactions/{transaction_id}/`, le `201` de `POST
        /v3/transactions/` et chaque ligne de `GET /v3/transactions/`.
        `direction`, `rail`, `counterparty_vasp`, `delivery`, `discovery`,
        `reason` et `next_actions` ont le même format que sur `PATCH
        /v3/transactions/{transaction_id}/travel-rule/`, de sorte qu'une seule
        lecture d'une transaction indique pourquoi son transfert est bloqué et
        ce qui permet de le faire avancer.
      properties:
        uuid:
          type: string
          format: uuid
        status:
          type: string
        protocol:
          type: string
          nullable: true
        required:
          type: boolean
        obligations_count:
          type: integer
        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:
          type: object
          nullable: true
          description: >-
            La comparaison de noms qui a déterminé le transfert (score et niveau
            d'exigence). Null tant qu'aucune comparaison n'a été exécutée. Les
            noms comparés sont masqués en même temps que les parties.
        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.
        metadata:
          type: object
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
          description: De quel côté de l'échange se situe ce transfert.
        rail:
          type: string
          nullable: true
          description: "Le canal par lequel le transfert est passé\_: `INTERNAL`, `TRP`, `GTR`, `TRUST`, `VERIFYVASP`, `SYGNA` ou `EMAIL` (`TEST_VASP` sur une application sandbox, lorsque le VASP de test Didit a répondu), ou `null` jusqu'à ce qu'un canal soit choisi."
        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.
          description: >-
            L'entrée d'annuaire de la contrepartie, ou `null` lorsque le
            transfert n'en associe aucune.
        delivery:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/TravelRuleDelivery'
          description: >-
            Le message le plus récent que le transfert doit à une autre partie.
            `null` lorsqu'aucun message n'était dû, par exemple en dessous de
            `threshold_amount` ou pour un portefeuille auto-hébergé déclaré.
        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'
    TransactionVerificationSessionAction:
      title: Verification session
      type: object
      properties:
        type:
          type: string
          enum:
            - verification_session
        url:
          type: string
          format: uri
          description: URL de vérification hébergée à ouvrir pour l'utilisateur final.
        session_id:
          type: string
          format: uuid
          description: Identifiant de la session de vérification.
        session_token:
          type: string
          description: >-
            Token de session, utilisé par les SDK mobiles pour lancer le flux
            nativement.
        status:
          type: string
          description: Statut de la session de vérification.
      required:
        - type
        - url
    TransactionWalletOwnershipAction:
      title: Wallet ownership
      type: object
      properties:
        type:
          type: string
          enum:
            - wallet_ownership
        url:
          type: string
          format: uri
          description: >-
            URL hébergée du widget de preuve de possession du portefeuille.
            Ouvrez-la dans une véritable interface de navigateur - sur mobile,
            utilisez SFSafariViewController ou un Chrome Custom Tab, jamais une
            webview intégrée.
        widget_session_id:
          type: string
          format: uuid
          description: ID de session du widget de propriété de portefeuille.
        expires_at:
          type: string
          format: date-time
          description: Date et heure auxquelles la session du widget expire.
      required:
        - type
        - url
    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`).
    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.
  securitySchemes:
    TransactionTokenAuth:
      type: apiKey
      in: header
      name: X-Transaction-Token
      description: >-
        Token restreint de courte durée généré par votre backend via POST
        /v3/transactions/sdk-token/. Utilisé par les SDK Didit sur les endpoints
        /v1/transactions/ côté appareil.

````

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