> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# API de création de transaction : soumission KYT

> Soumettez une transaction à Didit KYT pour scoring de risque, filtrage et Travel Rule. 1,000 transactions par mois incluses, puis $0.001 chacune.



Prompt de l'API de création de transaction
        Copier le prompt dans le presse-papiers



      
      

\<pre>

\`Submit a transaction for Didit monitoring through the Management API.

Endpoint:
POST https://verification.didit.me/v3/transactions/

Authentication:
Use the x-api-key header with my Didit API key.

Goal:
\- Submit a transaction for KYT (transaction monitoring). Didit runs the configured rules engine, blockchain analytics, and AML screening synchronously and returns the verdict in the response. The full detail (parties, rule runs, provider results, remediation links) is also returned.
\- A Travel Rule transfer is stored in the same call, but Didit contacts the counterparty after the response: travel_rule.status comes back AWAITING_COUNTERPARTY (or NOT_APPLICABLE, UNCONFIRMED_OWNERSHIP, or COMPLETED for your own verified wallet) with travel_rule.protocol null, and every later status change, including COUNTERPARTY_VASP_NOT_FOUND, arrives as a travel_rule.status.updated webhook. Your rules run again when the rail or the status changes.

When to call:
\- At payment authorization, before fanning out funds, to decide allow / hold / decline based on status, score, severity.
\- On post-trade events (gambling bets, audit-trail events, KYC events) for long-running monitoring without a per-transaction decision.
\- On crypto deposits / withdrawals — set transaction_details.currency_kind = "crypto" and provide the relevant wallet address in payment_method.account_id.
\- For Travel Rule, set transaction_category = "travel_rule" and include travel_rule_details (alias travelRule).
travel_rule_details.status is required (400 if missing); when Travel Rule is enabled, Didit runs the exchange and ignores the status you send, and otherwise Didit records the transfer passively with that status.
When the subject is a user with an approved Didit KYC verification and Travel Rule is on, Didit replaces the originator_data fields the verification holds with the verified values (metadata.originator_provenance says which); otherwise it sends originator_data as you provide it, so build it from the identity you verified.
beneficiary_data carries the beneficiary (name, wallet_address, chain) and any routing hints (travel_address, counterparty_vasp_lei, counterparty_vasp_name, counterparty_vasp_email).
If beneficiary_data.chain is empty, Didit takes transaction_details.crypto_params.crypto_chain, else custom_properties.crypto_chain, else the currency, uppercases it, and sets it only when it is a chain Didit recognises (for example ETH or BTC).
\- Chain shapes: on XRP, XLM, EOS, ATOM and HBAR send the destination tag or memo as payment_method.memo (or beneficiary_data.memo); on BTC, LTC, BCH and DOGE send the transaction's inputs and outputs as travel_rule_details.utxo; on bitcoin or Lightning, payment_method.account_id may be a Lightning payment request or Lightning Address. What Didit resolved is on travel_rule.chain_details (see /transaction-monitoring/travel-rule#chain-shapes).

Identifiers:
\- transaction_id (alias txnId) is YOUR identifier (max 128 chars), unique per application.
It becomes txn_id on subsequent calls.
Reusing a transaction_id that already exists returns 400 {"transaction_id": ["A transaction with this transaction_id already exists."]}, and when two identical requests race each other the loser gets 409.
Neither response returns the existing transaction, so to retry safely, treat a 400 or 409 for a duplicate id as already created and look the transaction up instead of resubmitting: GET /v3/transactions/{uuid}/ with the Didit uuid from the first response, or with the transaction_id (the Didit uuid) that the transaction.created webhook carries next to your txn_id.
GET does not accept your txn_id. Sandbox applications do not receive transaction.created or transaction.status.updated, so save the Didit uuid from the create response. Sandbox Travel Rule exchanges do emit travel_rule.status.updated with environment: sandbox.
\- The returned uuid is Didit's stable identifier — use it in GET /v3/transactions/{transaction_id}/.

Linking to entities:
\- subject.vendor_data (and optionally counterparty.vendor_data) are your internal user/business identifiers. They link the transaction to the long-lived User / Business entity assembled from prior verification sessions. Use the SAME vendor_data you supplied when creating the KYC session.

Minimum request body (application/json):
\{
"transaction_id": "your-txn-2026-05-17-001",
"transaction_category": "finance",   // finance | kyc | travel_rule | user_event | audit_trail_event | gambling_bet | gambling_limit_change | gambling_bonus_change
"transaction_details": {
"direction": "outbound",            // "inbound" | "outbound"
"amount": 1500,                     // number or decimal string, up to 18 decimal places (string for exact precision); never negative, because direction carries the sign
"currency": "EUR",                  // any ISO 4217 code (EUR, USD, NGN, ...) or a crypto symbol
"currency_kind": "fiat",            // "fiat" | "crypto" (optional)
"action_type": "withdrawal"         // optional, e.g. deposit/withdrawal/transfer
},
"subject": {                          // APPLICANT party
"entity_type": "individual",        // "individual" | "company"
"vendor_data": "user-12345",        // required
"full_name": "Maria Garcia",        // required
"address": { "country": "ESP" }     // optional
},
"counterparty": { ... },              // optional COUNTERPARTY party (same shape as subject)
"transaction_at": "2026-05-17T08:42:00Z",  // optional, defaults to now
"travel_rule_details": { "status": "AWAITING_COUNTERPARTY", ... }   // optional, for crypto Travel Rule; status is required inside it
}

Currency codes:
\- currency has no enum. Any ISO 4217 alphabetic code (EUR, USD, NGN, ...) and any crypto asset symbol (BTC, ETH, ...) are accepted and stored exactly as you send them, up to 10 characters.
\- Prefer a currently-circulating code. Not every accepted code has an exchange rate: withdrawn currencies and accounting units such as XDR are often still quoted, but when Didit has no rate for the code you send (for example the ISO accounting unit XSU, or a crypto symbol Didit does not price), automatic conversion to your base currency fails and preferred_currency_amount comes back null. A pre-converted amount_in_default_currency is always used as sent when present, so supply it for any code you are not sure has a rate.
\- Set currency_kind = "crypto" for on-chain amounts. The kind gates the transaction's own crypto AML screening: without currency_kind = "crypto" that regular screening step is skipped and no screening fee is estimated or charged for it, even with monitoring enabled or include_crypto_screening = true. Travel Rule attribution is a separate path: on a production application with Travel Rule and VASP attribution enabled, an outbound transaction_category = "travel_rule" request whose beneficiary wallet and chain cannot be reached over any rail triggers a VASP attribution wallet screening, and that screening is billed at the wallet screening price whatever currency_kind is or is not set. The kind does not change the stored decimal scale: up to 18 decimal places are kept either way, but only when amount arrives as a decimal string ("0.123456789012345678"). A JSON number is parsed as a binary float first, so anything beyond about 15 significant digits is rounded before it is stored (0.123456789012345678 is stored as 0.12345678901234568). The kind also decides how the amount is rendered in the transaction PDF. Crypto amounts render with up to 8 decimal places, fiat amounts with their ISO 4217 minor unit (2 for most currencies). Without the kind, RON, MNT and GEL are rendered as fiat because each is both a token and an ISO 4217 currency, so a small token amount can show as 0 in the report.
The VASP attribution screening is skipped when the transaction's own crypto screening already screened that wallet: Didit reuses that result and charges nothing extra.

Example call:
curl -X POST "https://verification.didit.me/v3/transactions/" \
-H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{
"transaction_id": "your-txn-2026-05-17-001",
"transaction_category": "finance",
"transaction_details": {"direction":"outbound","amount":1500,"currency":"EUR","action_type":"withdrawal"},
"subject": {"entity_type":"individual","vendor_data":"user-12345","full_name":"Maria Garcia"}
}'

What to read from the response:
\- uuid — Didit transaction id, use for GET /v3/transactions/{transaction_id}/.
\- status - APPROVED | IN_REVIEW | DECLINED | AWAITING_USER (live verdict; at creation, AWAITING_USER comes from a rule action).
\- score (0–100, higher = riskier) and severity (LOW | MEDIUM | HIGH | CRITICAL).
\- decision_reason_code / decision_reason_label — machine + human verdict reason.
\- parties (role APPLICANT for the subject, COUNTERPARTY for the counterparty; kind USER, BUSINESS or EXTERNAL), cost_breakdown, rule_runs, provider_results (crypto screening results) and network_snapshot.
\- travel_rule - the Travel Rule transfer (status, protocol, required, originator_data, beneficiary_data, direction, rail, counterparty_vasp, delivery, discovery, reason, next_actions), or null; action_required - a pending wallet-ownership or verification step, or null.
reason and next_actions say why a COUNTERPARTY_VASP_NOT_FOUND or COUNTERPARTY_VASP_NOT_REACHABLE transfer is stuck and what moves it on (for example email_undeliverable: update_compliance_email, then resend); they are "" and [] for any other status.

Webhooks:
\- transaction.created fires after this call succeeds.
\- For a travel_rule transaction, travel_rule.status.updated fires for each Travel Rule transition, after transaction.created. Each webhook is delivered and retried on its own, so key on transaction_id rather than on arrival order.
\- transaction.status.updated fires whenever the verdict changes (manual review, async screening, rule re-runs). Subscribe a destination via POST /v3/webhook/destinations/.

Failure modes:
\- 400 - duplicate transaction_id, missing required field (including travel_rule_details.status), an unknown travel_rule_details.status ("Invalid travel rule status: ..."), invalid direction/category enum, or malformed party object.
\- 409 - a concurrent request with the same transaction_id was created first.
\- 403 - missing x-api-key (a wrong, revoked or expired key gets 401), or a key without permission for this action; the body is a { "detail": "..." } envelope.
\- 403 - the organization's balance cannot cover the fees this request would charge: { "detail": "...", "code": "insufficient_credits" }, and nothing is created.
\- 429 - more than 600 ingestion requests per minute for this API key (transaction and event ingestion share this budget, apart from the 300 of every other write); wait Retry-After seconds and retry.

Side effects:
\- Creates the transaction record and runs the synchronous rules + screening pipeline.
\- Links the transaction to the User / Business entity that shares the subject.vendor_data.
\- An outbound travel_rule transaction is billed once, at creation, on one line. It pays the Travel Rule fee ($0.02) when Travel Rule is on and Didit starts an exchange for it (amount at or above threshold_amount, including a transfer to a self-hosted wallet or to the user's own verified wallet). Otherwise it is billed as transaction monitoring (included in the plan's monthly transaction allowance, $0.001 each beyond it): below threshold_amount, a Lightning payment the Travel Rule does not apply to, or data recorded while Travel Rule is disabled. A resend never charges again.
\- An inbound travel_rule transaction pays no base fee, an application that joined Travel Rule free pays none on outbound transactions until it turns outbound billing on, and sandbox applications are never charged.
\- Crypto screening, when it runs, adds the Wallet Verification & Screening charge.

For the full integration shape, see /integration/integration-prompt.`

\</pre>



      
      

Coller dans



## OpenAPI

````yaml fr/openapi-25.json POST /v3/transactions/
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/transactions/:
    post:
      tags:
        - Transactions
      summary: Créer une transaction
      description: >-
        Soumettez une transaction pour une surveillance synchrone AML/de risque.
        La transaction est créée avec le statut `APPROVED`, puis vos règles (et
        le filtrage crypto, le cas échéant) s'exécutent en ligne et peuvent
        faire passer le `status` renvoyé à `IN_REVIEW` ou `DECLINED`.
        **`transaction_id` est votre clé d'idempotence** (max. 128 caractères,
        unique par application) ; le réutiliser renvoie 400. Un webhook
        `transaction.created` est envoyé en cas de succès pour les applications
        en production. Les applications sandbox ne sont pas facturées et
        n'émettent pas de webhooks `transaction.created` ou
        `transaction.status.updated`. Les échanges Travel Rule en sandbox
        émettent des webhooks `travel_rule.status.updated` avec `environment:
        sandbox`. Un transfert Travel Rule est stocké et renvoyé avant que toute
        contrepartie ne soit contactée : `travel_rule.status` renvoie
        `AWAITING_COUNTERPARTY` (ou `NOT_APPLICABLE` en dessous de votre seuil,
        `UNCONFIRMED_OWNERSHIP` pour un portefeuille auto-hébergé déclaré,
        `COMPLETED` lorsque l'autre portefeuille est votre propre portefeuille
        vérifié) et `travel_rule.protocol` est nul. Didit choisit ensuite le
        canal et envoie l'échange, et chaque changement de statut ultérieur du
        transfert, y compris `COUNTERPARTY_VASP_NOT_FOUND` lorsqu'aucun canal
        n'atteint la contrepartie, arrive sous la forme d'un webhook
        `travel_rule.status.updated`. Vos règles s'exécutent à nouveau lorsque
        le canal ou le statut change.
      operationId: createTransaction
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                transaction_id:
                  type: string
                  description: >-
                    Votre identifiant unique pour cette transaction (128
                    caractères maximum).
                  example: your-txn-2026-05-17-001
                transaction_at:
                  type: string
                  format: date-time
                  description: >-
                    Date et heure auxquelles la transaction a eu lieu. Prend par
                    défaut l'heure actuelle si omis.
                time_zone:
                  type: string
                  description: >-
                    Identifiant de fuseau horaire IANA, par exemple
                    `Europe/Madrid`.
                transaction_category:
                  type: string
                  description: >-
                    Catégorie de la transaction. Les alias en CamelCase
                    (`travelRule`, `userPlatformEvent`, `gamblingBet`, …) sont
                    également acceptés ; la valeur stockée/renvoyée est en
                    camelCase pour les catégories composées de plusieurs mots.
                  example: finance
                  enum:
                    - finance
                    - kyc
                    - travel_rule
                    - user_event
                    - audit_trail_event
                    - gambling_bet
                    - gambling_limit_change
                    - gambling_bonus_change
                    - travelRule
                transaction_details:
                  type: object
                  description: Détails financiers principaux de la transaction.
                  required:
                    - direction
                    - amount
                    - currency
                  properties:
                    direction:
                      type: string
                      description: >-
                        Direction de la transaction par rapport au sujet.
                        Insensible à la casse ; `in`/`out` sont acceptés comme
                        alias. Renvoyée en majuscules (`INBOUND`/`OUTBOUND`).
                      example: outbound
                      enum:
                        - inbound
                        - outbound
                        - in
                        - out
                    amount:
                      type: number
                      description: >-
                        Montant de la transaction (jusqu'à 18 décimales).
                        Envoyez-le sous forme de chaîne décimale (par ex.
                        `"0.123456789012345678"`) lorsque la précision exacte
                        importe : un nombre JSON est d'abord analysé comme un
                        flottant binaire, donc les chiffres au-delà d'environ 15
                        chiffres significatifs sont arrondis avant que le
                        montant ne soit stocké. Doit être supérieur ou égal à
                        zéro : la direction porte le signe, et un montant
                        négatif renvoie `400`.
                      example: 1500
                    currency:
                      type: string
                      description: >-
                        Code devise. 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`.
                      example: EUR
                    currency_kind:
                      type: string
                      description: Indique si la devise est `fiat` ou `crypto`.
                    amount_in_default_currency:
                      type: number
                      nullable: true
                      description: >-
                        Montant pré-converti dans la devise par défaut. S'il est
                        omis, une conversion de change automatique est tentée.
                        Doit être supérieur ou égal à zéro.
                    default_currency:
                      type: string
                      description: >-
                        Le code de devise par défaut pour le montant converti.
                        Tout code ISO 4217 actuellement en circulation.
                    payment_details:
                      type: string
                      nullable: true
                      description: Référence ou mémo de paiement en texte libre.
                    payment_reference_id:
                      type: string
                      nullable: true
                      description: >-
                        Référence du système de paiement externe. Pour le
                        filtrage AML par hachage de transaction crypto, envoyez
                        le hachage de transaction blockchain et fournissez
                        également `subject.payment_method.account_id` avec
                        l'adresse associée.
                    action_type:
                      type: string
                      nullable: true
                      description: >-
                        Sous-type de la transaction, par exemple `deposit`,
                        `withdrawal`, `transfer`.
                    crypto_params:
                      type: object
                      description: >-
                        Sélection du réseau crypto, distincte de la devise (le
                        symbole de l'actif). L'enregistrement d'un symbole de
                        token personnalisé ne garantit pas la couverture du hash
                        de transaction pour son contrat.
                      properties:
                        crypto_chain:
                          type: string
                          description: "Réseau effectif utilisé pour le filtrage. Le filtrage géré prend en charge BTC, ETH, LTC, XRP, BCH, DOGE, TRX, SOL, MATIC, BNB, BASE (Base), OP (Optimism), ARB (Arbitrum One), AVAX (Avalanche C-Chain), ADA (Cardano), XLM (Stellar) et HBAR (Hedera). Les noms usuels de réseau sont également acceptés, par exemple POLYGON ou POL pour MATIC, BSC pour BNB et TRON pour TRX. Spécifiez-le systématiquement pour les tokens multi-réseaux. En son absence pour USDT, USDC ou ETH transmis avec un hachage de transaction en 0x, Didit recherche le hachage sur Ethereum, BNB Chain, Polygon, Base, Arbitrum et Optimism, puis le filtre sur le réseau où il est trouvé\_; si aucun réseau ne le contient, la transaction n'est pas filtrée et custom_values.aml_screening_status prend la valeur FAILED avec le motif dans custom_values.aml_screening_error. En son absence pour USDT ou USDC filtrés par portefeuille (sans hachage de transaction), une adresse Tron est filtrée sur Tron, une adresse Solana sur Solana, et une adresse en 0x sur le premier de ces six réseaux où elle a émis une transaction ou détient le token, ou sur Ethereum si elle n'est active sur aucun d'entre eux. La couverture des fournisseurs connectés varie\_; LIGHTNING nécessite un fournisseur connecté compatible."
                          example: BASE
                subject:
                  type: object
                  description: L'objet (demandeur) de la transaction.
                  required:
                    - vendor_data
                    - full_name
                  properties:
                    entity_type:
                      type: string
                      description: 'Type d''entité : `individual` ou `company`.'
                    vendor_data:
                      type: string
                      description: Votre identifiant interne d'utilisateur/entreprise.
                      example: user-12345
                    full_name:
                      type: string
                      description: Nom complet du sujet.
                      example: Maria Garcia
                    first_name:
                      type: string
                      description: Prénom du sujet.
                    last_name:
                      type: string
                      description: Nom de famille de la personne concernée.
                    date_of_birth:
                      type: string
                      format: date
                      description: Date de naissance (YYYY-MM-DD).
                    address:
                      type: object
                      description: Objet d'adresse.
                      properties:
                        country:
                          type: string
                          description: >-
                            Code pays (ISO 3166-1 alpha-3 recommandé). Copié
                            dans le `country_code` de la partie.
                        town:
                          type: string
                        state:
                          type: string
                        street:
                          type: string
                        post_code:
                          type: string
                    institution_details:
                      type: object
                      description: >-
                        Informations sur l'établissement (pour les sujets
                        institutionnels).
                      properties:
                        name:
                          type: string
                        code:
                          type: string
                        address:
                          type: object
                    device_context:
                      type: object
                      description: >-
                        Contexte de l'appareil capturé au moment de la
                        transaction. browser_family et platform doivent être
                        envoyés sous forme de clés de premier niveau explicites
                        — ils ne sont pas dérivés de user_agent. L'alias
                        camelCase device est également accepté dans la requête.
                      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. Alias en CamelCase : userAgent.
                        browser_family:
                          type: string
                          description: >-
                            Famille du navigateur (ex. Chrome, Firefox, Safari).
                            Doit être envoyée explicitement — elle n'est pas
                            déduite de user_agent. Alias en CamelCase :
                            browserFamily.
                        browser_version:
                          type: string
                          description: >-
                            Chaîne de version du navigateur. Doit être envoyée
                            explicitement. Alias en CamelCase : browserVersion.
                        platform:
                          type: string
                          description: >-
                            Identifiant de plateforme (web, ios, android, macos,
                            windows, linux). Doit être envoyé explicitement — il
                            n'est pas déduit de user_agent.
                        os_family:
                          type: string
                          description: "Famille de système d'exploitation (par exemple iOS, Android, Windows). Alias CamelCase\_: osFamily."
                        os_version:
                          type: string
                          description: "Chaîne de version du système d'exploitation. Alias CamelCase\_: osVersion."
                        accept_language:
                          type: string
                          description: >-
                            Valeur de l'en-tête Accept-Language. Alias CamelCase
                            : acceptLang.
                        session_id:
                          type: string
                          description: >-
                            Identifiant de session de la session actuelle de
                            l'utilisateur. Stocké dans les métadonnées. Alias
                            CamelCase : sessionId.
                        session_age_ms:
                          type: number
                          description: "Âge de la session utilisateur en millisecondes au moment de la transaction. Alias CamelCase\_: sessionAgeMs."
                        network_context:
                          type: object
                          description: >-
                            Contexte réseau avec adresse IP et géolocalisation.
                            Un bloc ipInfo de premier niveau est également
                            intégré dans cet objet.
                          properties:
                            ip_address:
                              type: string
                              description: 'Adresse du client. Alias CamelCase : ip.'
                            ip_country_code:
                              type: string
                              description: >-
                                Pays déterminé par géolocalisation de l'IP (ISO
                                3166-1 alpha-3). Alias CamelCase : countryCode3.
                            latitude:
                              type: number
                              description: >-
                                Latitude géographique de l'IP. Alias CamelCase :
                                lat.
                            longitude:
                              type: number
                              description: >-
                                Longitude géographique de l'IP. Alias CamelCase
                                : lon.
                    payment_method:
                      type: object
                      description: Moyen de paiement utilisé par le sujet.
                      properties:
                        method_type:
                          type: string
                          description: >-
                            Type de moyen de paiement : `bank_card`,
                            `bank_account`, `crypto_wallet`, `ewallet`,
                            `unhosted_wallet`, `other`.
                        account_id:
                          type: string
                          description: "Identifiant de compte (par exemple IBAN, adresse de portefeuille). Pour le filtrage crypto, ce champ doit contenir l'adresse de portefeuille de ce participant. Le filtrage entrant des hachages de transaction nécessite l'adresse de dépôt du service/client sur le sujet. Le filtrage sortant utilise le portefeuille de destination sur la contrepartie. Pour un transfert crypto sur bitcoin ou Lightning, il peut s'agir d'une demande de paiement Lightning (facture BOLT11, offre BOLT12, LNURL) ou d'une Lightning Address\_: Didit stocke le bénéficiaire qu'elle désigne en tant que compte (\"\" lorsqu'aucun n'est désigné) et le contenu de la demande dans `chain_details.lightning` du transfert Travel Rule. Au maximum 255 caractères une fois stocké. Pour un transfert crypto sur bitcoin ou Lightning, il peut s'agir d'une demande de paiement Lightning (facture BOLT11, offre BOLT12, LNURL) ou d'une Lightning Address\_: Didit stocke le bénéficiaire qu'elle désigne en tant que compte (\"\" lorsqu'aucun n'est désigné) et le contenu de la demande dans `chain_details.lightning` du transfert Travel Rule. Au maximum 255 caractères une fois stocké."
                        memo:
                          type: string
                          maxLength: 256
                          description: >-
                            Le tag de destination ou le mémo qui fait partie du
                            portefeuille sur un réseau à mémo (XRP, XLM, EOS,
                            ATOM, HBAR). Sur une adresse d'échange partagée,
                            chaque mémo constitue sa propre méthode de paiement.
                            XRP : un tag de destination, un nombre entier de 0 à
                            4294967295 (un nombre JSON est accepté). XLM : un
                            mémo texte 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 pas de mémo : en
                            renseigner un renvoie une erreur `400`. Alias :
                            `destinationTag` ou `destination_tag`.
                        issuing_country:
                          type: string
                          description: Code pays ISO 3166-1 alpha-3 de l'émetteur.
                counterparty:
                  type: object
                  description: La contrepartie de la transaction (facultatif).
                  properties:
                    entity_type:
                      type: string
                      description: 'Type d''entité : `individual` ou `company`.'
                    vendor_data:
                      type: string
                      description: Votre identifiant interne pour la contrepartie.
                    full_name:
                      type: string
                      description: Nom complet de la contrepartie.
                    first_name:
                      type: string
                    last_name:
                      type: string
                    date_of_birth:
                      type: string
                      format: date
                    address:
                      type: object
                      description: Objet d'adresse avec `country` (ISO 3166-1 alpha-3).
                    institution_details:
                      type: object
                    device_context:
                      type: object
                      description: >-
                        Contexte de l'appareil pour la contrepartie.
                        browser_family et platform doivent être envoyés sous
                        forme de clés de premier niveau explicites — ils ne sont
                        pas dérivés de user_agent.
                      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. Alias en CamelCase : userAgent.
                        browser_family:
                          type: string
                          description: >-
                            Famille du navigateur (ex. Chrome, Firefox, Safari).
                            Doit être envoyée explicitement — elle n'est pas
                            déduite de user_agent. Alias en CamelCase :
                            browserFamily.
                        browser_version:
                          type: string
                          description: >-
                            Chaîne de version du navigateur. Doit être envoyée
                            explicitement. Alias en CamelCase : browserVersion.
                        platform:
                          type: string
                          description: >-
                            Identifiant de plateforme (web, ios, android, macos,
                            windows, linux). Doit être envoyé explicitement — il
                            n'est pas déduit de user_agent.
                        os_family:
                          type: string
                          description: "Famille de système d'exploitation (par exemple iOS, Android, Windows). Alias CamelCase\_: osFamily."
                        os_version:
                          type: string
                          description: "Chaîne de version du système d'exploitation. Alias CamelCase\_: osVersion."
                        accept_language:
                          type: string
                          description: >-
                            Valeur de l'en-tête Accept-Language. Alias CamelCase
                            : acceptLang.
                        session_id:
                          type: string
                          description: >-
                            Identifiant de session pour la session de la
                            contrepartie. Stocké dans les métadonnées. Alias
                            CamelCase : sessionId.
                        session_age_ms:
                          type: number
                          description: "Âge de la session utilisateur en millisecondes au moment de la transaction. Alias CamelCase\_: sessionAgeMs."
                        network_context:
                          type: object
                          description: >-
                            Contexte réseau avec adresse IP et géolocalisation.
                            Un bloc ipInfo de premier niveau est également
                            intégré dans cet objet.
                          properties:
                            ip_address:
                              type: string
                              description: 'Adresse du client. Alias CamelCase : ip.'
                            ip_country_code:
                              type: string
                              description: >-
                                Pays déterminé par géolocalisation de l'IP (ISO
                                3166-1 alpha-3). Alias CamelCase : countryCode3.
                            latitude:
                              type: number
                              description: >-
                                Latitude géographique de l'IP. Alias CamelCase :
                                lat.
                            longitude:
                              type: number
                              description: >-
                                Longitude géographique de l'IP. Alias CamelCase
                                : lon.
                    payment_method:
                      type: object
                      description: >-
                        Moyen de paiement utilisé par la contrepartie. Sur les
                        transactions travelRule, `method_type:
                        "unhosted_wallet"` déclare le portefeuille de la
                        contrepartie comme auto-hébergé : le transfert ignore le
                        routage VASP-contrepartie, est créé directement sous
                        `UNCONFIRMED_OWNERSHIP`, et (lorsque
                        `auto_wallet_verification` est activé) une session de
                        widget de propriété de portefeuille est générée
                        automatiquement et renvoyée dans le bloc
                        `action_required` de la transaction.
                      properties:
                        method_type:
                          type: string
                          description: >-
                            Type de moyen de paiement : `bank_card`,
                            `bank_account`, `crypto_wallet`, `ewallet`,
                            `unhosted_wallet`, `other`. Utilisez
                            `unhosted_wallet` pour déclarer un portefeuille
                            auto-hébergé pour la Travel Rule.
                        account_id:
                          type: string
                          description: >-
                            Identifiant de compte (par exemple IBAN ou adresse
                            de portefeuille). Pour un transfert crypto sur
                            bitcoin ou Lightning, il peut s'agir d'une demande
                            de paiement Lightning (facture BOLT11, offre BOLT12,
                            LNURL) ou d'une Lightning Address : Didit stocke le
                            bénéficiaire qu'elle désigne en tant que compte (""
                            lorsqu'aucun n'est désigné) et le contenu de la
                            demande dans `chain_details.lightning` du transfert
                            Travel Rule. Au maximum 255 caractères une fois
                            stocké. Pour un transfert crypto sur bitcoin ou
                            Lightning, il peut s'agir d'une demande de paiement
                            Lightning (facture BOLT11, offre BOLT12, LNURL) ou
                            d'une Lightning Address : Didit stocke le
                            bénéficiaire qu'elle désigne en tant que compte (""
                            lorsqu'aucun n'est désigné) et le contenu de la
                            demande dans `chain_details.lightning` du transfert
                            Travel Rule. Au maximum 255 caractères une fois
                            stocké.
                        memo:
                          type: string
                          maxLength: 256
                          description: >-
                            Le tag de destination ou le mémo qui fait partie du
                            portefeuille sur un réseau à mémo (XRP, XLM, EOS,
                            ATOM, HBAR). Sur une adresse d'échange partagée,
                            chaque mémo constitue sa propre méthode de paiement.
                            XRP : un tag de destination, un nombre entier de 0 à
                            4294967295 (un nombre JSON est accepté). XLM : un
                            mémo texte 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 pas de mémo : en
                            renseigner un renvoie une erreur `400`. Alias :
                            `destinationTag` ou `destination_tag`.
                        issuing_country:
                          type: string
                custom_properties:
                  type: object
                  description: >-
                    Paires clé-valeur arbitraires associées à la transaction.
                    Chaque clé peut être référencée dans les conditions de
                    règles avec le chemin de champ `custom_values.<key>`.
                  additionalProperties: true
                  example:
                    merchant_id: test
                    bank_name: test_2
                travel_rule_details:
                  type: object
                  description: >-
                    Données Travel Rule. Lorsque la Travel Rule est activée et
                    que transaction_category est travel_rule, Didit gère
                    l'échange lui-même : il ignore status, protocol, required
                    ainsi que obligations_count, et utilise originator_data,
                    beneficiary_data et metadata. Sinon, Didit stocke ces
                    valeurs en tant qu'enregistrement Travel Rule passif. Tant
                    que la Travel Rule est activée, un transfert sortant
                    supérieur ou égal à votre seuil doit comporter les
                    informations requises par son régime (TFR de l'UE ou
                    Recommandation 16 du GAFI), vérifiées sur les volets que
                    vous transmettez : un champ manquant renvoie une erreur 400
                    sous `travel_rule_details.originator_data` ou
                    `travel_rule_details.beneficiary_data`, par exemple « Le TFR
                    de l'UE exige le nom du donneur d'ordre. »
                  required:
                    - status
                  properties:
                    status:
                      type: string
                      description: >-
                        Requis dès que vous envoyez travel_rule_details. L'un
                        des statuts de transfert Travel Rule (par exemple
                        AWAITING_COUNTERPARTY, COMPLETED, NOT_APPLICABLE) ; les
                        graphies en minuscules et camelCase ainsi que les
                        valeurs héritées UNKNOWN, COMPLIANT, PENDING_ACTION,
                        PENDING_COUNTERPARTY, FAILED et EXEMPT sont également
                        acceptées et mises en correspondance. Toute autre valeur
                        renvoie 400.
                    protocol:
                      type: string
                    required:
                      type: boolean
                    obligations_count:
                      type: integer
                    originator_data:
                      type: object
                      description: >-
                        Partie donneuse d'ordre, sous forme de champs plats ou
                        d'une personne IVMS 101. Pour votre utilisateur
                        disposant d'une vérification KYC approuvée, Didit
                        remplace les champs contenus dans la vérification par
                        les valeurs vérifiées (voir
                        `metadata.originator_provenance`). Il doit s'agir d'un
                        objet : toute autre valeur renvoie une erreur `400`. Sur
                        un réseau à memo, une clé `memo` indique le memo ou le
                        tag du portefeuille du donneur d'ordre.
                    beneficiary_data:
                      type: object
                      description: >-
                        Partie bénéficiaire, sous forme de champs plats ou d'une
                        personne IVMS 101. Il doit s'agir d'un objet : tout
                        autre type entraîne une erreur `400`. Pour acheminer le
                        transfert, Didit lit `wallet_address` (une valeur vide
                        est complétée à partir de
                        `counterparty.payment_method.account_id`), `chain`
                        (complété à partir de
                        `transaction_details.crypto_params.crypto_chain` ou de
                        `currency` lorsque celle-ci désigne une blockchain prise
                        en charge), `name` (en se rabattant sur
                        `counterparty.full_name`), `travel_address`,
                        `counterparty_vasp_name`, `counterparty_vasp_lei` et
                        `counterparty_vasp_email`. Sur un réseau à mémo, `memo`
                        désigne le mémo ou le tag du portefeuille bénéficiaire ;
                        `wallet_address` et `memo` l'emportent sur le moyen de
                        paiement de la contrepartie.
                    metadata:
                      type: object
                    utxo:
                      allOf:
                        - $ref: '#/components/schemas/TravelRuleUtxo'
                      description: >-
                        Optionnel, blockchains UTXO uniquement (BTC, LTC, BCH,
                        DOGE). Les entrées et sorties de la transaction, à
                        partir desquelles Didit déduit le portefeuille du
                        donneur d'ordre et la sortie du bénéficiaire lorsque
                        vous ne les déclarez pas.
                    originator:
                      type: object
                      description: >-
                        Un bloc de donneur d'ordre IVMS 101 :
                        `originatorPersons` (une `naturalPerson` ou
                        `legalPerson` ; une personne morale fait de la partie
                        une entreprise) et `accountNumber` (adresses de
                        portefeuille). Utilisé pour `originator_data` lorsque
                        cet objet est vide. Un bloc malformé renvoie 400 indexé
                        par son chemin, par exemple
                        `originator.originatorPersons`.
                    beneficiary:
                      type: object
                      description: >-
                        Un bloc de bénéficiaire IVMS 101 : `beneficiaryPersons`
                        (une `naturalPerson` ou `legalPerson` ; une personne
                        morale fait de la partie une entreprise) et
                        `accountNumber` (adresses de portefeuille). Utilisé pour
                        `beneficiary_data` lorsque cet objet est vide. Un bloc
                        malformé renvoie 400 indexé par son chemin, par exemple
                        `beneficiary.beneficiaryPersons`.
                    ivms101:
                      type: object
                      description: >-
                        Les blocs `originator` et `beneficiary` encapsulés dans
                        un seul objet IVMS 101 (`IVMS101` est également
                        accepté). Les blocs de premier niveau prévalent sur ceux
                        du conteneur.
                network_snapshot:
                  type: object
                  description: Instantané précalculé du graphe de réseau.
                  properties:
                    nodes:
                      type: array
                      items:
                        type: object
                    edges:
                      type: array
                      items:
                        type: object
                    metrics:
                      type: object
                include_crypto_screening:
                  type: boolean
                  nullable: true
                  description: "Remplacement par transaction pour le filtrage par analyse de la blockchain crypto. Lorsqu'il vaut `true`, le filtrage crypto est effectué quelle que soit la valeur par défaut de l'application. Lorsqu'il vaut `false`, le filtrage crypto est ignoré même s'il est activé dans les paramètres de l'application. Lorsqu'il est omis ou défini sur `null`, la valeur par défaut au niveau de l'application configurée dans la Console est utilisée. Le filtrage crypto nécessite `transaction_details.direction`, `currency_kind: \"crypto\"`, une chaîne ou une devise, ainsi que l'adresse de portefeuille sélectionnée par le sens de la transaction\_: le filtrage entrant pré-transfert utilise `counterparty.payment_method.account_id`, le filtrage entrant par hash de transaction utilise `subject.payment_method.account_id`, et le filtrage sortant utilise `counterparty.payment_method.account_id`. Lorsque `transaction_details.payment_reference_id` contient un hash de transaction de blockchain, Didit effectue le filtrage de la transaction et renvoie l'enrichissement du résumé de la transaction lorsqu'il est disponible."
              required:
                - transaction_id
                - transaction_category
                - transaction_details
                - subject
            examples:
              Minimal fiat withdrawal:
                summary: >-
                  Payload minimal acceptable pour un virement sortant en monnaie
                  fiduciaire
                value:
                  transaction_id: your-txn-2026-05-17-001
                  transaction_category: finance
                  transaction_details:
                    direction: outbound
                    amount: 1500
                    currency: EUR
                    action_type: withdrawal
                  subject:
                    entity_type: individual
                    vendor_data: user-12345
                    full_name: Maria Garcia
              Crypto outbound with screening:
                summary: >-
                  Retrait de crypto sortant vers un portefeuille auto-hébergé,
                  filtrage optionnel
                value:
                  transaction_id: your-txn-2026-05-17-002
                  transaction_category: finance
                  include_crypto_screening: true
                  transaction_details:
                    direction: outbound
                    amount: 0.5
                    currency: BTC
                    currency_kind: crypto
                    amount_in_default_currency: 32500
                    default_currency: USD
                    action_type: withdrawal
                  subject:
                    entity_type: individual
                    vendor_data: user-12345
                    full_name: Maria Garcia
                    payment_method:
                      method_type: crypto_wallet
                      account_id: bc1qexampleexchangewalletaddressxyz
                      issuing_country: ESP
                  counterparty:
                    entity_type: individual
                    payment_method:
                      method_type: unhosted_wallet
                      account_id: bc1qexampleexternalwalletaddressabc
              Travel Rule transfer:
                summary: >-
                  Transfert de crypto sortant avec données Travel Rule du
                  donneur d'ordre/bénéficiaire
                value:
                  transaction_id: your-txn-2026-05-17-003
                  transaction_category: travel_rule
                  transaction_details:
                    direction: outbound
                    amount: 25000
                    currency: USDT
                    currency_kind: crypto
                    action_type: transfer
                  subject:
                    entity_type: individual
                    vendor_data: user-12345
                    full_name: Maria Garcia
                    date_of_birth: '1992-03-14'
                    address:
                      country: ESP
                      town: Madrid
                      street: Calle Mayor 1
                      post_code: '28013'
                  counterparty:
                    entity_type: individual
                    full_name: John Beneficiary
                    institution_details:
                      name: Beneficiary VASP, Inc.
                      code: BVASP-US
                  travel_rule_details:
                    status: AWAITING_COUNTERPARTY
                    protocol: IVMS101
                    required: true
                    originator_data:
                      name: Maria Garcia
                    beneficiary_data:
                      name: John Beneficiary
      responses:
        '201':
          description: >-
            Transaction soumise et surveillée. Le corps contient l'ensemble des
            détails de la transaction (même structure que `GET
            /v3/transactions/{transaction_id}/`), reflétant les résultats des
            règles déjà appliquées.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransactionDetail'
              examples:
                Approved with no rule hits:
                  value:
                    uuid: abcdef12-3456-4890-abcd-ef1234567890
                    environment: live
                    transaction_number: 4123
                    txn_id: your-txn-2026-05-17-001
                    txn_date: '2026-05-17T08:42:00Z'
                    zone_id: Europe/Madrid
                    transaction_type: finance
                    action_type: withdrawal
                    direction: OUTBOUND
                    status: APPROVED
                    source: LIVE
                    amount: '1500'
                    currency: EUR
                    currency_type: fiat
                    amount_in_default_currency: '1620.45'
                    default_currency_code: USD
                    preferred_currency_amount: '1620.45'
                    preferred_currency_code: USD
                    payment_details: Withdrawal to crypto wallet
                    payment_txn_id: null
                    score: 0
                    severity: null
                    decision_reason_code: null
                    decision_reason_label: null
                    vendor_data: user-12345
                    metadata:
                      subject:
                        entity_type: individual
                        vendor_data: user-12345
                        full_name: Maria Garcia
                        address: {}
                        institution_details: {}
                        device_context: {}
                      counterparty: {}
                    props: {}
                    tags: []
                    parties:
                      - uuid: b1111111-2222-4333-8444-555555555555
                        role: APPLICANT
                        entity_type: individual
                        kind: USER
                        vendor_data: user-12345
                        full_name: Maria Garcia
                        first_name: null
                        last_name: null
                        country_code: null
                        dob: null
                        address: {}
                        institution_info: {}
                        device: {}
                        external_party_snapshot: null
                    payment_methods: []
                    documents: []
                    activities:
                      - uuid: d4e5f6a7-8901-4bcd-9ef0-123456789abc
                        activity_type: TRANSACTION_CREATED
                        source: TRANSACTION
                        status: APPROVED
                        title: withdrawal
                        description: Transaction recorded.
                        metadata: {}
                        occurred_at: '2026-05-17T08:42:11Z'
                    alerts: []
                    rule_runs: []
                    provider_results: []
                    travel_rule: null
                    network_snapshot: null
                    remediation: null
                    action_required: null
                    cost_breakdown: null
                Flagged for review:
                  value:
                    uuid: abcdef12-3456-4890-abcd-ef1234567891
                    environment: live
                    transaction_number: 4124
                    txn_id: your-txn-2026-05-17-002
                    txn_date: '2026-05-17T08:42:00Z'
                    zone_id: Europe/Madrid
                    transaction_type: finance
                    action_type: withdrawal
                    direction: OUTBOUND
                    status: IN_REVIEW
                    source: LIVE
                    amount: '0.5'
                    currency: BTC
                    currency_type: crypto
                    amount_in_default_currency: '32500'
                    default_currency_code: USD
                    preferred_currency_amount: '32500'
                    preferred_currency_code: USD
                    payment_details: Withdrawal to crypto wallet
                    payment_txn_id: null
                    score: 78
                    severity: HIGH
                    decision_reason_code: WALLET_HIGH_RISK
                    decision_reason_label: Destination wallet flagged as high risk
                    vendor_data: user-12345
                    metadata:
                      subject:
                        entity_type: individual
                        vendor_data: user-12345
                        full_name: Maria Garcia
                        address: {}
                        institution_details: {}
                        device_context: {}
                      counterparty: {}
                    props:
                      order_id: ord-9988
                    tags: []
                    parties:
                      - uuid: b1111111-2222-4333-8444-555555555555
                        role: APPLICANT
                        entity_type: individual
                        kind: USER
                        vendor_data: user-12345
                        full_name: Maria Garcia
                        first_name: null
                        last_name: null
                        country_code: null
                        dob: null
                        address: {}
                        institution_info: {}
                        device: {}
                        external_party_snapshot: null
                    payment_methods: []
                    documents: []
                    activities: []
                    alerts:
                      - uuid: a7b8c9d0-1234-4abc-9def-567890abcdef
                        title: Destination wallet flagged as high risk
                        description: Provider risk score exceeded the configured threshold.
                        severity: HIGH
                        status: OPEN
                        source: RULE
                        metadata: {}
                        created_at: '2026-05-17T08:42:12Z'
                        due_at: null
                    rule_runs:
                      - uuid: e5f6a7b8-9012-4cde-af01-23456789abcd
                        rule: f6a7b8c9-0123-4def-b012-3456789abcde
                        rule_title: High-risk wallet screening
                        rule_description: null
                        rule_category: crypto
                        matched: true
                        is_test: false
                        mode: ACTIVE
                        severity: HIGH
                        score_delta: 78
                        status_target: IN_REVIEW
                        action_summary: score +78; change_status:IN_REVIEW
                        metadata: {}
                        created_at: '2026-05-17T08:42:12Z'
                    provider_results: []
                    travel_rule: null
                    network_snapshot: null
                    remediation: null
                    action_required: null
                    cost_breakdown: null
        '400':
          description: >-
            Échec de validation (champs obligatoires manquants, `transaction_id`
            en doublon, valeur d'énumération inconnue, devise non valide, etc.).
          content:
            application/json:
              examples:
                Missing required field:
                  value:
                    transaction_details:
                      amount:
                        - This field is required.
                Duplicate transaction_id:
                  value:
                    transaction_id:
                      - A transaction with this transaction_id already exists.
                Invalid category:
                  value:
                    non_field_errors:
                      - Unsupported transaction category.
                Missing subject identity:
                  value:
                    subject:
                      - subject.vendor_data and subject.full_name are required.
                Blocklisted participant:
                  value:
                    vendor_data:
                      - >-
                        The individual 'user-12345' is in the blocklist and
                        cannot participate in transactions.
        '403':
          description: >-
            Clé API manquante, invalide ou révoquée, ou la clé ne peut pas
            soumettre de transactions pour cette application. Une clé manquante
            renvoie `403` ; une clé incorrecte, révoquée ou expirée renvoie
            `401`.
          content:
            application/json:
              examples:
                Forbidden:
                  value:
                    detail: You do not have permission to perform this action.
        '409':
          description: >-
            Une autre requête avec le même `transaction_id` a créé la
            transaction pendant le traitement de celle-ci, de sorte qu'une seule
            des deux soumissions simultanées réussit. Lisez la transaction
            existante au lieu de la soumettre à nouveau.
          content:
            application/json:
              examples:
                Concurrent duplicate:
                  value:
                    detail: A transaction with this transaction_id already exists.
        '429':
          description: >-
            Limite de débit dépassée : les créations de transactions et
            l'ingestion d'événements (`POST /v3/transactions/`, `POST
            /v3/events/`, `POST /v3/events/batch/`) partagent un quota de 600
            requêtes par minute par clé API, distinct des 300 requêtes partagées
            par toutes les autres requêtes d'écriture. Attendez `Retry-After`
            secondes, puis réessayez.
          headers:
            Retry-After:
              description: >-
                Secondes à attendre avant de réessayer, arrondies à l'unité
                supérieure pour que la tentative se fasse dans la fenêtre
                suivante.
              schema:
                type: integer
                minimum: 1
                example: 30
          content:
            application/json:
              examples:
                Throttled:
                  value:
                    detail: >-
                      Ingestion rate limit exceeded. You can make up to 600
                      requests per minute.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST 'https://verification.didit.me/v3/transactions/' \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "transaction_id": "your-txn-2026-05-17-001",
                "transaction_category": "finance",
                "transaction_details": {
                  "direction": "outbound",
                  "amount": 1500,
                  "currency": "EUR",
                  "action_type": "withdrawal"
                },
                "subject": {
                  "entity_type": "individual",
                  "vendor_data": "user-12345",
                  "full_name": "Maria Garcia"
                }
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.transactions.create(
                transaction_id="your-txn-2026-05-17-001",
                transaction_category="finance",
                transaction_details={
                    "direction": "outbound",
                    "amount": 1500.0,
                    "currency": "EUR",
                    "action_type": "withdrawal",
                },
                subject={
                    "entity_type": "individual",
                    "vendor_data": "user-12345",
                    "full_name": "Maria Garcia",
                },
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit from "@didit-protocol/sdk-node";

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

            const result = await didit.transactions.create({
              transaction_id: "your-txn-2026-05-17-001",
              transaction_category: "finance",
              transaction_details: {
                direction: "outbound",
                amount: 1500.0,
                currency: "EUR",
                action_type: "withdrawal",
              },
              subject: {
                entity_type: "individual",
                vendor_data: "user-12345",
                full_name: "Maria Garcia",
              },
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.Create(ctx, didit.TransactionsCreateParams{\n\tTransactionID:       \"your-txn-2026-05-17-001\",\n\tTransactionCategory: \"finance\",\n\tTransactionDetails: didit.TransactionsCreateParamsTransactionDetails{\n\t\tDirection:  \"outbound\",\n\t\tAmount:     1500.0,\n\t\tCurrency:   \"EUR\",\n\t\tActionType: didit.String(\"withdrawal\"),\n\t},\n\tSubject: didit.TransactionsCreateParamsSubject{\n\t\tEntityType: didit.String(\"individual\"),\n\t\tVendorData: \"user-12345\",\n\t\tFullName:   \"Maria Garcia\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import me.didit.Didit;

            import me.didit.types.TransactionsCreateParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.transactions().create(TransactionsCreateParams.builder()
                    .transactionId("your-txn-2026-05-17-001")
                    .transactionCategory(TransactionsCreateParams.TransactionCategory.of("finance"))
                    .transactionDetails(TransactionsCreateParams.TransactionDetails.builder()
                            .direction(TransactionsCreateParams.TransactionDetails.Direction.of("outbound"))
                            .amount(1500.0)
                            .currency("EUR")
                            .actionType("withdrawal")
                            .build())
                    .subject(TransactionsCreateParams.Subject.builder()
                            .entityType("individual")
                            .vendorData("user-12345")
                            .fullName("Maria Garcia")
                            .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->transactions->create([
                'transaction_id' => 'your-txn-2026-05-17-001',
                'transaction_category' => 'finance',
                'transaction_details' => [
                    'direction' => 'outbound',
                    'amount' => 1500.0,
                    'currency' => 'EUR',
                    'action_type' => 'withdrawal',
                ],
                'subject' => [
                    'entity_type' => 'individual',
                    'vendor_data' => 'user-12345',
                    'full_name' => 'Maria Garcia',
                ],
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.transactions.create(
              transaction_id: "your-txn-2026-05-17-001",
              transaction_category: "finance",
              transaction_details: {
                direction: "outbound",
                amount: 1500.0,
                currency: "EUR",
                action_type: "withdrawal",
              },
              subject: {
                entity_type: "individual",
                vendor_data: "user-12345",
                full_name: "Maria Garcia",
              }
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.Transactions.CreateAsync(new
            TransactionsCreateParams

            {
                TransactionId = "your-txn-2026-05-17-001",
                TransactionCategory = "finance",
                TransactionDetails = new()
                {
                    Direction = "outbound",
                    Amount = 1500.0,
                    Currency = "EUR",
                    ActionType = "withdrawal",
                },
                Subject = new()
                {
                    EntityType = "individual",
                    VendorData = "user-12345",
                    FullName = "Maria Garcia",
                },
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    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'
    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.
    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.
    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`).
  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.