> ## 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 creació de transaccions: enviament KYT

> Envia una transacció a Didit KYT per a puntuació de risc, cribratge i Travel Rule. 1,000 transaccions al mes incloses; després, $0.001 cadascuna.



Prompt de l'API per crear una transacció
        Copia el prompt al porta-retalls



      
      

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



      
      

Enganxa a



## OpenAPI

````yaml ca/openapi-25.json POST /v3/transactions/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de verificació d'identitat. Autentica't amb la capçalera x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/transactions/:
    post:
      tags:
        - Transactions
      summary: Crea una transacció
      description: >-
        Envia una transacció per al monitoratge sincrònic de risc/AML. La
        transacció es crea com a `APPROVED`, després les teves regles (i el
        cribratge de criptomonedes, si escau) s'executen en línia i poden
        canviar l'`status` retornat a `IN_REVIEW` o `DECLINED`.
        **`transaction_id` és la teva clau d'idempotència** (màx. 128 caràcters,
        única per aplicació); reutilitzar-la retorna 400. S'emet un webhook
        `transaction.created` si la sol·licitud és satisfactòria per a
        aplicacions de producció. Les aplicacions de sandbox no es facturen i no
        emeten webhooks `transaction.created` ni `transaction.status.updated`.
        Els intercanvis de Travel Rule a sandbox sí que emeten webhooks
        `travel_rule.status.updated` amb `environment: sandbox`. Una
        transferència de Travel Rule s'emmagatzema i es retorna abans de
        contactar amb cap contrapart: `travel_rule.status` torna com a
        `AWAITING_COUNTERPARTY` (o `NOT_APPLICABLE` per sota del teu llindar,
        `UNCONFIRMED_OWNERSHIP` per a una cartera autoallotjada declarada,
        `COMPLETED` quan l'altra cartera és la teva pròpia cartera verificada) i
        `travel_rule.protocol` és null. A continuació, Didit tria la xarxa i
        envia l'intercanvi, i cada canvi d'estat posterior de la transferència,
        inclòs `COUNTERPARTY_VASP_NOT_FOUND` quan cap xarxa arriba a la
        contrapart, arriba com un webhook `travel_rule.status.updated`. Les
        teves regles es tornen a executar quan canvia la xarxa o l'estat.
      operationId: createTransaction
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                transaction_id:
                  type: string
                  description: >-
                    El teu identificador únic per a aquesta transacció (màxim
                    128 caràcters).
                  example: your-txn-2026-05-17-001
                transaction_at:
                  type: string
                  format: date-time
                  description: >-
                    Quan va tenir lloc la transacció. Per defecte pren l'hora
                    actual si s'omet.
                time_zone:
                  type: string
                  description: Identificador de zona horària IANA, p. ex. `Europe/Madrid`.
                transaction_category:
                  type: string
                  description: >-
                    Categoria de la transacció. També s'accepten àlies en
                    CamelCase (`travelRule`, `userPlatformEvent`, `gamblingBet`,
                    …); el valor emmagatzemat/retornat és en camelCase per a les
                    categories de diverses paraules.
                  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: Detalls financers principals de la transacció.
                  required:
                    - direction
                    - amount
                    - currency
                  properties:
                    direction:
                      type: string
                      description: >-
                        Direcció de la transacció relativa al subjecte.
                        Insensible a majúscules i minúscules; s'accepten
                        `in`/`out` com a àlies. Es retorna en majúscules
                        (`INBOUND`/`OUTBOUND`).
                      example: outbound
                      enum:
                        - inbound
                        - outbound
                        - in
                        - out
                    amount:
                      type: number
                      description: >-
                        Import de la transacció (fins a 18 decimals). Envia'l
                        com a cadena decimal (p. ex., `"0.123456789012345678"`)
                        quan la precisió exacta sigui important: un número JSON
                        s'analitza primer com a float binari, de manera que els
                        dígits que superin aproximadament 15 dígits
                        significatius s'arrodoneixen abans que s'emmagatzemi
                        l'import. Ha de ser zero o superior: la direcció porta
                        el signe, i un import negatiu retorna `400`.
                      example: 1500
                    currency:
                      type: string
                      description: >-
                        Codi de moneda. S'accepta qualsevol codi alfabètic ISO
                        4217 (p. ex. `EUR`, `USD`, `NGN`), així com un símbol
                        d'actiu cripto (p. ex. `BTC`). És preferible utilitzar
                        un codi actualment en circulació. No tots els codis
                        acceptats tenen tipus de canvi: quan no n'hi ha cap de
                        disponible per al codi (per exemple, la unitat de compte
                        ISO `XSU`, o un símbol cripto que Didit no cotitza), la
                        conversió automàtica falla i `preferred_currency_amount`
                        es retorna null tret que la sol·licitud hagi
                        proporcionat un `amount_in_default_currency`
                        preconvertit.
                      example: EUR
                    currency_kind:
                      type: string
                      description: Indica si la moneda és `fiat` o `crypto`.
                    amount_in_default_currency:
                      type: number
                      nullable: true
                      description: >-
                        Import preconvertit en la moneda per defecte. Si s'omet,
                        s'intenta la conversió automàtica de divises. Ha de ser
                        zero o superior.
                    default_currency:
                      type: string
                      description: >-
                        El codi de moneda per defecte per a l'import convertit.
                        Qualsevol codi ISO 4217 actualment en circulació.
                    payment_details:
                      type: string
                      nullable: true
                      description: Referència de pagament o concepte de text lliure.
                    payment_reference_id:
                      type: string
                      nullable: true
                      description: >-
                        Referència del sistema de pagament extern. Per al
                        cribratge AML del hash de transaccions cripto, envia el
                        hash de la transacció a la blockchain i proporciona
                        també `subject.payment_method.account_id` amb l'adreça
                        associada.
                    action_type:
                      type: string
                      nullable: true
                      description: >-
                        Subtipus de la transacció, p. ex. `deposit`,
                        `withdrawal`, `transfer`.
                    crypto_params:
                      type: object
                      description: >-
                        Selecció de la xarxa cripto, independent de la moneda
                        (el símbol de l'actiu). Registrar un símbol de token
                        personalitzat no garanteix la cobertura del hash de
                        transacció per al seu contracte.
                      properties:
                        crypto_chain:
                          type: string
                          description: >-
                            Xarxa real utilitzada per al cribratge. El cribratge
                            gestionat admet 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) i HBAR (Hedera). També
                            s'accepten els noms comuns de les xarxes, com per
                            exemple POLYGON o POL per a MATIC, BSC per a BNB i
                            TRON per a TRX. Especifica-ho sempre per a tokens
                            multixarxa. Quan falta per a USDT, USDC o ETH enviat
                            amb un hash de transacció 0x, Didit cerca el hash a
                            Ethereum, BNB Chain, Polygon, Base, Arbitrum i
                            Optimism i el cribra a la xarxa on es troba; si cap
                            xarxa el té, la transacció no es cribra i
                            custom_values.aml_screening_status és FAILED amb el
                            motiu a custom_values.aml_screening_error. Quan
                            falta per a USDT o USDC cribrats per cartera (sense
                            hash de transacció), una adreça de Tron es cribra a
                            Tron, una adreça de Solana a Solana, i una adreça 0x
                            a la primera d'aquestes sis xarxes on hagi enviat
                            una transacció o tingui el token, o a Ethereum si no
                            està activa a cap d'elles. La cobertura dels
                            proveïdors connectats varia; LIGHTNING requereix un
                            proveïdor connectat compatible.
                          example: BASE
                subject:
                  type: object
                  description: El subjecte (sol·licitant) de la transacció.
                  required:
                    - vendor_data
                    - full_name
                  properties:
                    entity_type:
                      type: string
                      description: 'Tipus d''entitat: `individual` o `company`.'
                    vendor_data:
                      type: string
                      description: El teu identificador intern d'usuari/empresa.
                      example: user-12345
                    full_name:
                      type: string
                      description: Nom complet del subjecte.
                      example: Maria Garcia
                    first_name:
                      type: string
                      description: Nom de pila de la persona.
                    last_name:
                      type: string
                      description: Cognom del subjecte.
                    date_of_birth:
                      type: string
                      format: date
                      description: Data de naixement (YYYY-MM-DD).
                    address:
                      type: object
                      description: Objecte d'adreça.
                      properties:
                        country:
                          type: string
                          description: >-
                            Codi de país (es recomana ISO 3166-1 alpha-3). Es
                            copia al `country_code` de la part.
                        town:
                          type: string
                        state:
                          type: string
                        street:
                          type: string
                        post_code:
                          type: string
                    institution_details:
                      type: object
                      description: >-
                        Detalls de la institució (per a subjectes
                        institucionals).
                      properties:
                        name:
                          type: string
                        code:
                          type: string
                        address:
                          type: object
                    device_context:
                      type: object
                      description: >-
                        Context del dispositiu capturat en el moment de la
                        transacció. browser_family i platform s'han d'enviar com
                        a claus explícites de primer nivell; no es deriven de
                        user_agent. L'àlies en camelCase device també s'accepta
                        a la sol·licitud.
                      properties:
                        fingerprint:
                          type: string
                          description: Petjada digital única del dispositiu.
                        persistent_device_id:
                          type: string
                          description: >-
                            Identificador de dispositiu estable entre sessions
                            (esquema d'empremta digital v2).
                        user_agent:
                          type: string
                          description: >-
                            Cadena de l'agent d'usuari del navegador o de
                            l'aplicació. Àlies en CamelCase: userAgent.
                        browser_family:
                          type: string
                          description: >-
                            Família del navegador (p. ex., Chrome, Firefox,
                            Safari). S'ha d'enviar explícitament; no es deriva
                            de user_agent. Àlies en CamelCase: browserFamily.
                        browser_version:
                          type: string
                          description: >-
                            Cadena de la versió del navegador. S'ha d'enviar
                            explícitament. Àlies en CamelCase: browserVersion.
                        platform:
                          type: string
                          description: >-
                            Identificador de plataforma (web, ios, android,
                            macos, windows, linux). S'ha d'enviar explícitament;
                            no es deriva de user_agent.
                        os_family:
                          type: string
                          description: >-
                            Família del sistema operatiu (p. ex., iOS, Android,
                            Windows). Àlies CamelCase: osFamily.
                        os_version:
                          type: string
                          description: >-
                            Cadena de la versió del sistema operatiu. Àlies
                            CamelCase: osVersion.
                        accept_language:
                          type: string
                          description: >-
                            Valor de la capçalera Accept-Language. Àlies en
                            CamelCase: acceptLang.
                        session_id:
                          type: string
                          description: >-
                            Identificador de sessió de la sessió actual de
                            l'usuari. S'emmagatzema a les metadades. Àlies en
                            camelCase: sessionId.
                        session_age_ms:
                          type: number
                          description: >-
                            Antiguitat de la sessió de l'usuari en mil·lisegons
                            en el moment de la transacció. Àlies en CamelCase:
                            sessionAgeMs.
                        network_context:
                          type: object
                          description: >-
                            Context de xarxa amb adreça IP i geolocalització.
                            També s'inclou un bloc ipInfo de nivell superior en
                            aquest objecte.
                          properties:
                            ip_address:
                              type: string
                              description: 'Adreça IP del client. Àlies CamelCase: ip.'
                            ip_country_code:
                              type: string
                              description: >-
                                País geolocalitzat de la IP (ISO 3166-1 alfa-3).
                                Àlies en CamelCase: countryCode3.
                            latitude:
                              type: number
                              description: >-
                                Latitud geogràfica de la IP. Àlies en CamelCase:
                                lat.
                            longitude:
                              type: number
                              description: >-
                                Longitud geogràfica de la IP. Àlies en
                                CamelCase: lon.
                    payment_method:
                      type: object
                      description: Mètode de pagament utilitzat pel subjecte.
                      properties:
                        method_type:
                          type: string
                          description: >-
                            Tipus de mètode de pagament: `bank_card`,
                            `bank_account`, `crypto_wallet`, `ewallet`,
                            `unhosted_wallet`, `other`.
                        account_id:
                          type: string
                          description: >-
                            Identificador de compte (p. ex., IBAN, adreça de
                            cartera). Per al cribratge de criptomonedes, ha de
                            contenir l'adreça de cartera d'aquest participant.
                            El cribratge de hash de transacció entrant requereix
                            l'adreça de dipòsit del servei/client del subjecte.
                            El cribratge sortint utilitza la cartera de
                            destinació de la contrapart. En una transferència de
                            criptomonedes a bitcoin o Lightning pot ser una
                            sol·licitud de pagament de Lightning (factura
                            BOLT11, oferta BOLT12, LNURL) o una Lightning
                            Address: Didit emmagatzema el beneficiari que s'hi
                            indica com a compte ("" quan no n'indica cap) i el
                            que diu la sol·licitud a `chain_details.lightning`
                            de la transferència de Travel Rule. Com a màxim 255
                            caràcters un cop emmagatzemat. En una transferència
                            de criptomonedes a bitcoin o Lightning pot ser una
                            sol·licitud de pagament de Lightning (factura
                            BOLT11, oferta BOLT12, LNURL) o una Lightning
                            Address: Didit emmagatzema el beneficiari que s'hi
                            indica com a compte ("" quan no n'indica cap) i el
                            que diu la sol·licitud a `chain_details.lightning`
                            de la transferència de Travel Rule. Com a màxim 255
                            caràcters un cop emmagatzemat.
                        memo:
                          type: string
                          maxLength: 256
                          description: >-
                            El destination tag o memo que forma part de la
                            cartera en una xarxa de memo (XRP, XLM, EOS, ATOM,
                            HBAR). En una única adreça d'exchange compartida,
                            cada memo és el seu propi mètode de pagament. XRP:
                            un destination tag, un nombre enter de 0 a
                            4294967295 (s'accepta un número JSON). XLM: un memo
                            de text de fins a 28 bytes, un ID de 64 bits o un
                            hash de 32 bytes en hex. EOS: fins a 256 bytes.
                            ATOM: fins a 256 caràcters. HBAR: fins a 100 bytes.
                            Les carteres de Bitcoin, EVM, Solana, Tron,
                            Litecoin, Bitcoin Cash, Dogecoin i Lightning no
                            admeten memo: incloure'n un retorna un `400`. Àlies:
                            `destinationTag` o `destination_tag`.
                        issuing_country:
                          type: string
                          description: Codi de país ISO 3166-1 alpha-3 de l'emissor.
                counterparty:
                  type: object
                  description: La contrapart de la transacció (opcional).
                  properties:
                    entity_type:
                      type: string
                      description: 'Tipus d''entitat: `individual` o `company`.'
                    vendor_data:
                      type: string
                      description: El teu identificador intern per a la contrapart.
                    full_name:
                      type: string
                      description: Nom complet de la contrapart.
                    first_name:
                      type: string
                    last_name:
                      type: string
                    date_of_birth:
                      type: string
                      format: date
                    address:
                      type: object
                      description: Objecte d'adreça amb `country` (ISO 3166-1 alfa-3).
                    institution_details:
                      type: object
                    device_context:
                      type: object
                      description: >-
                        Context del dispositiu per a la contrapart.
                        browser_family i platform s'han d'enviar com a claus
                        explícites de primer nivell; no es deriven de
                        user_agent.
                      properties:
                        fingerprint:
                          type: string
                          description: Petjada digital única del dispositiu.
                        persistent_device_id:
                          type: string
                          description: >-
                            Identificador de dispositiu estable entre sessions
                            (esquema d'empremta digital v2).
                        user_agent:
                          type: string
                          description: >-
                            Cadena de l'agent d'usuari del navegador o de
                            l'aplicació. Àlies en CamelCase: userAgent.
                        browser_family:
                          type: string
                          description: >-
                            Família del navegador (p. ex., Chrome, Firefox,
                            Safari). S'ha d'enviar explícitament; no es deriva
                            de user_agent. Àlies en CamelCase: browserFamily.
                        browser_version:
                          type: string
                          description: >-
                            Cadena de la versió del navegador. S'ha d'enviar
                            explícitament. Àlies en CamelCase: browserVersion.
                        platform:
                          type: string
                          description: >-
                            Identificador de plataforma (web, ios, android,
                            macos, windows, linux). S'ha d'enviar explícitament;
                            no es deriva de user_agent.
                        os_family:
                          type: string
                          description: >-
                            Família del sistema operatiu (p. ex., iOS, Android,
                            Windows). Àlies CamelCase: osFamily.
                        os_version:
                          type: string
                          description: >-
                            Cadena de la versió del sistema operatiu. Àlies
                            CamelCase: osVersion.
                        accept_language:
                          type: string
                          description: >-
                            Valor de la capçalera Accept-Language. Àlies en
                            CamelCase: acceptLang.
                        session_id:
                          type: string
                          description: >-
                            Identificador de sessió per a la sessió de la
                            contrapart. S'emmagatzema a les metadades. Àlies en
                            camelCase: sessionId.
                        session_age_ms:
                          type: number
                          description: >-
                            Antiguitat de la sessió de l'usuari en mil·lisegons
                            en el moment de la transacció. Àlies en CamelCase:
                            sessionAgeMs.
                        network_context:
                          type: object
                          description: >-
                            Context de xarxa amb adreça IP i geolocalització.
                            També s'inclou un bloc ipInfo de nivell superior en
                            aquest objecte.
                          properties:
                            ip_address:
                              type: string
                              description: 'Adreça IP del client. Àlies CamelCase: ip.'
                            ip_country_code:
                              type: string
                              description: >-
                                País geolocalitzat de la IP (ISO 3166-1 alfa-3).
                                Àlies en CamelCase: countryCode3.
                            latitude:
                              type: number
                              description: >-
                                Latitud geogràfica de la IP. Àlies en CamelCase:
                                lat.
                            longitude:
                              type: number
                              description: >-
                                Longitud geogràfica de la IP. Àlies en
                                CamelCase: lon.
                    payment_method:
                      type: object
                      description: >-
                        Mètode de pagament utilitzat per la contrapart. A les
                        transaccions de Travel Rule, `method_type:
                        "unhosted_wallet"` declara la cartera de la contrapart
                        com a autoallotjada: la transferència omet
                        l'encaminament cap al VASP de la contrapart, es crea
                        directament a `UNCONFIRMED_OWNERSHIP` i (quan
                        `auto_wallet_verification` està activat) es genera
                        automàticament una sessió de widget de titularitat de la
                        cartera i es retorna al bloc `action_required` de la
                        transacció.
                      properties:
                        method_type:
                          type: string
                          description: >-
                            Tipus de mètode de pagament: `bank_card`,
                            `bank_account`, `crypto_wallet`, `ewallet`,
                            `unhosted_wallet`, `other`. Fes servir
                            `unhosted_wallet` per declarar una cartera
                            autoallotjada per a la Travel Rule.
                        account_id:
                          type: string
                          description: >-
                            Identificador de compte (p. ex., IBAN o adreça de
                            cartera). En una transferència de criptomonedes a
                            bitcoin o Lightning pot ser una sol·licitud de
                            pagament de Lightning (factura BOLT11, oferta
                            BOLT12, LNURL) o una Lightning Address: Didit
                            emmagatzema el beneficiari que s'hi indica com a
                            compte ("" quan no n'indica cap) i el que diu la
                            sol·licitud a `chain_details.lightning` de la
                            transferència de Travel Rule. Com a màxim 255
                            caràcters un cop emmagatzemat. En una transferència
                            de criptomonedes a bitcoin o Lightning pot ser una
                            sol·licitud de pagament de Lightning (factura
                            BOLT11, oferta BOLT12, LNURL) o una Lightning
                            Address: Didit emmagatzema el beneficiari que s'hi
                            indica com a compte ("" quan no n'indica cap) i el
                            que diu la sol·licitud a `chain_details.lightning`
                            de la transferència de Travel Rule. Com a màxim 255
                            caràcters un cop emmagatzemat.
                        memo:
                          type: string
                          maxLength: 256
                          description: >-
                            El destination tag o memo que forma part de la
                            cartera en una xarxa de memo (XRP, XLM, EOS, ATOM,
                            HBAR). En una única adreça d'exchange compartida,
                            cada memo és el seu propi mètode de pagament. XRP:
                            un destination tag, un nombre enter de 0 a
                            4294967295 (s'accepta un número JSON). XLM: un memo
                            de text de fins a 28 bytes, un ID de 64 bits o un
                            hash de 32 bytes en hex. EOS: fins a 256 bytes.
                            ATOM: fins a 256 caràcters. HBAR: fins a 100 bytes.
                            Les carteres de Bitcoin, EVM, Solana, Tron,
                            Litecoin, Bitcoin Cash, Dogecoin i Lightning no
                            admeten memo: incloure'n un retorna un `400`. Àlies:
                            `destinationTag` o `destination_tag`.
                        issuing_country:
                          type: string
                custom_properties:
                  type: object
                  description: >-
                    Parells clau-valor arbitraris adjunts a la transacció. Cada
                    clau es pot referenciar a les condicions de les regles amb
                    la ruta de camp `custom_values.<key>`.
                  additionalProperties: true
                  example:
                    merchant_id: test
                    bank_name: test_2
                travel_rule_details:
                  type: object
                  description: >-
                    Dades de Travel Rule. Quan Travel Rule està activat i
                    transaction_category és travel_rule, Didit gestiona
                    l'intercanvi directament: ignora status, protocol, required
                    i obligations_count, i utilitza originator_data,
                    beneficiary_data i metadata. En cas contrari, Didit
                    emmagatzema aquests valors com un registre passiu de Travel
                    Rule. Mentre Travel Rule està actiu, una transferència
                    sortint igual o superior al teu llindar ha d'incloure el que
                    requereix el seu règim (TFR de la UE o Recomanació 16 del
                    GAFI), comprovat en les parts que envies: un camp absent
                    respon 400 sota `travel_rule_details.originator_data` o
                    `travel_rule_details.beneficiary_data`, per exemple "EU TFR
                    requires the originator name."
                  required:
                    - status
                  properties:
                    status:
                      type: string
                      description: >-
                        Obligatori sempre que enviïs travel_rule_details. Un
                        dels estats de transferència de la Travel Rule (per
                        exemple AWAITING_COUNTERPARTY, COMPLETED,
                        NOT_APPLICABLE); també s'accepten i es mapegen les
                        variants en minúscules i en camelCase, així com els
                        valors antics UNKNOWN, COMPLIANT, PENDING_ACTION,
                        PENDING_COUNTERPARTY, FAILED i EXEMPT. Qualsevol altre
                        valor retorna 400.
                    protocol:
                      type: string
                    required:
                      type: boolean
                    obligations_count:
                      type: integer
                    originator_data:
                      type: object
                      description: >-
                        Part ordenant, com a camps plans o com una persona IVMS
                        101. Per al teu usuari amb una verificació KYC aprovada,
                        Didit substitueix els camps que conté la verificació
                        pels valors verificats (consulta
                        `metadata.originator_provenance`). Ha de ser un objecte:
                        qualsevol altra cosa és un `400`. En una xarxa amb memo,
                        una clau `memo` indica el memo o l'etiqueta de la
                        cartera de l'ordenant.
                    beneficiary_data:
                      type: object
                      description: >-
                        Part beneficiària, com a camps plans o una persona IVMS
                        101. Ha de ser un objecte: qualsevol altra cosa és un
                        `400`. Per encaminar la transferència, Didit llegeix
                        `wallet_address` (si està buit s'omple des de
                        `counterparty.payment_method.account_id`), `chain`
                        (omplert des de
                        `transaction_details.crypto_params.crypto_chain` o la
                        `currency` quan aquesta anomena una xarxa admesa),
                        `name` (recorrent a `counterparty.full_name`),
                        `travel_address`, `counterparty_vasp_name`,
                        `counterparty_vasp_lei` i `counterparty_vasp_email`. En
                        una xarxa amb memo, `memo` indica el memo o etiqueta de
                        la cartera del beneficiari; `wallet_address` i `memo`
                        prevalen sobre el mètode de pagament de la contrapart.
                    metadata:
                      type: object
                    utxo:
                      allOf:
                        - $ref: '#/components/schemas/TravelRuleUtxo'
                      description: >-
                        Opcional, només per a cadenes UTXO (BTC, LTC, BCH,
                        DOGE). Les entrades i sortides de la transacció, a
                        partir de les quals Didit infereix la cartera de
                        l'ordenant i la sortida del beneficiari quan no les
                        declares.
                    originator:
                      type: object
                      description: >-
                        Un bloc d'ordenant IVMS 101: `originatorPersons` (una
                        `naturalPerson` o `legalPerson`; una persona jurídica fa
                        que la part sigui una empresa) i `accountNumber`
                        (adreces de cartera). S'utilitza per a `originator_data`
                        quan aquest objecte està buit. Un bloc mal format respon
                        400 identificat pel seu camí, per exemple
                        `originator.originatorPersons`.
                    beneficiary:
                      type: object
                      description: >-
                        Un bloc de beneficiari IVMS 101: `beneficiaryPersons`
                        (una `naturalPerson` o `legalPerson`; una persona
                        jurídica fa que la part sigui una empresa) i
                        `accountNumber` (adreces de cartera). S'utilitza per a
                        `beneficiary_data` quan aquest objecte està buit. Un
                        bloc mal format retorna un 400 amb la clau del seu camí,
                        per exemple `beneficiary.beneficiaryPersons`.
                    ivms101:
                      type: object
                      description: >-
                        Els blocs `originator` i `beneficiary` embolicats en un
                        sol objecte IVMS 101 (també s'accepta `IVMS101`). Els
                        blocs de nivell superior prevalen sobre els de
                        l'embolcall.
                network_snapshot:
                  type: object
                  description: Instantània precalculada del graf de xarxa.
                  properties:
                    nodes:
                      type: array
                      items:
                        type: object
                    edges:
                      type: array
                      items:
                        type: object
                    metrics:
                      type: object
                include_crypto_screening:
                  type: boolean
                  nullable: true
                  description: >-
                    Sobreescriptura per transacció per al cribratge d'analítica
                    blockchain de criptomonedes. Quan és `true`, el cribratge de
                    criptomonedes es realitza independentment del valor per
                    defecte de l'aplicació. Quan és `false`, el cribratge de
                    criptomonedes s'omet encara que estigui activat a la
                    configuració de l'aplicació. Si s'omet o és `null`,
                    s'utilitza el valor per defecte a nivell d'aplicació
                    configurat a la consola. El cribratge de criptomonedes
                    requereix `transaction_details.direction`, `currency_kind:
                    "crypto"`, una cadena/moneda i l'adreça de la cartera
                    seleccionada segons la direcció: el cribratge previ a la
                    transferència entrant utilitza
                    `counterparty.payment_method.account_id`, el cribratge per
                    hash de transacció entrant utilitza
                    `subject.payment_method.account_id`, i el cribratge sortint
                    utilitza `counterparty.payment_method.account_id`. Quan
                    `transaction_details.payment_reference_id` conté un hash de
                    transacció de blockchain, Didit realitza el cribratge de la
                    transacció i retorna l'enriquiment del resum de la
                    transacció quan estigui disponible.
              required:
                - transaction_id
                - transaction_category
                - transaction_details
                - subject
            examples:
              Minimal fiat withdrawal:
                summary: >-
                  Payload acceptable més petit per a una transferència sortint
                  de moneda fiduciària
                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: >-
                  Retirada cripto sortint a una cartera autoallotjada, cribratge
                  opcional
                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: >-
                  Transferència cripto sortint amb dades d'ordenant/beneficiari
                  de Travel Rule
                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: >-
            Transacció enviada i monitorada. El cos és el detall complet de la
            transacció (mateixa estructura que `GET
            /v3/transactions/{transaction_id}/`), reflectint els resultats de
            les regles ja aplicats.
          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: >-
            La validació ha fallat (falten camps obligatoris, `transaction_id`
            duplicat, valor d'enum desconegut, moneda no vàlida, 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: >-
            Clau d'API absent, no vàlida o revocada, o bé la clau no pot enviar
            transaccions per a aquesta aplicació. Una clau absent retorna `403`;
            una clau incorrecta, revocada o caducada retorna `401`.
          content:
            application/json:
              examples:
                Forbidden:
                  value:
                    detail: You do not have permission to perform this action.
        '409':
          description: >-
            Una altra sol·licitud amb el mateix `transaction_id` ha creat la
            transacció mentre es processava aquesta, de manera que només un dels
            dos enviaments simultanis té èxit. Llegeix la transacció existent en
            lloc de tornar-la a enviar.
          content:
            application/json:
              examples:
                Concurrent duplicate:
                  value:
                    detail: A transaction with this transaction_id already exists.
        '429':
          description: >-
            S'ha superat el límit de freqüència: les creacions de transaccions i
            la ingesta d'esdeveniments (`POST /v3/transactions/`, `POST
            /v3/events/`, `POST /v3/events/batch/`) comparteixen un pressupost
            de 600 sol·licituds per minut per clau d'API, independent de les 300
            que comparteixen la resta de sol·licituds d'escriptura. Espera els
            segons indicats a `Retry-After` i reintenta-ho.
          headers:
            Retry-After:
              description: >-
                Segons d'espera abans de reintentar, arrodonits a l'alça perquè
                el reintent caigui a la finestra següent.
              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 entrades i sortides d'una transferència UTXO (BTC, LTC, BCH, DOGE).
        Només s'admeten en aquestes xarxes: en qualsevol altra xarxa respon amb
        un `400`. A partir d'aquestes, Didit infereix la cartera de l'ordenant
        (la declarada o, si no n'hi ha, l'adreça d'entrada que més ha aportat) i
        la sortida del beneficiari (la declarada o, si no n'hi ha, l'única
        sortida que no retorna canvi a una adreça d'entrada o, si no, la sortida
        que paga l'import de la transferència). El resultat es troba a
        `chain_details` de la transferència.
      required:
        - outputs
      properties:
        inputs:
          type: array
          maxItems: 1000
          items:
            $ref: '#/components/schemas/TravelRuleUtxoEntry'
          description: >-
            Opcional. Sense entrades no s'infereix cap ordenant ni es reconeix
            cap sortida de canvi.
        outputs:
          type: array
          minItems: 1
          maxItems: 1000
          items:
            $ref: '#/components/schemas/TravelRuleUtxoEntry'
    TransactionDetail:
      type: object
      description: >-
        Registre complet de monitoratge per a una transacció, tal com el
        retornen `GET /v3/transactions/{transaction_id}/` i `POST
        /v3/transactions/`.
      properties:
        uuid:
          type: string
          format: uuid
          description: >-
            Identificador de transacció estable de Didit. Fes-lo servir com a
            `{transaction_id}` per a les crides de seguiment.
        environment:
          type: string
          enum:
            - live
            - sandbox
          description: >-
            Entorn de l'aplicació propietària de la transacció. Una transacció
            `sandbox` s'emmagatzema però mai s'avalua, se sotmet a cribratge, es
            notifica ni es factura, de manera que el seu `rule_runs` buit
            significa "no avaluada".
        transaction_number:
          type: integer
          description: >-
            Número seqüencial de transacció en l'àmbit de l'aplicació que es
            mostra a la consola (p. ex. `4123`).
        txn_id:
          type: string
          description: >-
            El `transaction_id` que has proporcionat en el moment de la creació
            (màx. 128 caràcters). Únic per aplicació.
        txn_date:
          type: string
          format: date-time
          description: >-
            Quan va tenir lloc la transacció (a partir de `transaction_at`; per
            defecte pren l'hora d'enviament).
        zone_id:
          type: string
          nullable: true
          description: >-
            Identificador de zona horària IANA proporcionat en el moment de la
            creació.
        transaction_type:
          type: string
          description: >-
            Categoria de primer nivell tal com s'emmagatzema: `finance`, `kyc`,
            `travelRule`, `userPlatformEvent`, `gamblingBet`,
            `gamblingLimitChange`, `gamblingBonusChange`, `auditTrailEvent`.
            Tingues en compte que els valors de diverses paraules es retornen en
            camelCase fins i tot quan s'envien en snake_case.
        action_type:
          type: string
          description: >-
            Subtipus dins de la categoria (p. ex. `deposit`, `withdrawal`,
            `transfer`). Per defecte pren la categoria quan no s'especifica.
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
          description: >-
            Direcció relativa al subjecte. S'emmagatzema en majúscules
            independentment de les majúscules o minúscules enviades (s'accepten
            `in`/`out`/`inbound`/`outbound` a l'entrada).
        status:
          type: string
          enum:
            - APPROVED
            - IN_REVIEW
            - DECLINED
            - AWAITING_USER
          description: >-
            Veredicte de monitoratge actual. Les transaccions es creen com a
            `APPROVED`; les regles poden canviar-les a `IN_REVIEW`/`DECLINED` de
            manera sincrònica.
        source:
          type: string
          enum:
            - LIVE
            - IMPORTED
          description: >-
            Com s'ha originat el registre: `LIVE` per a transaccions enviades a
            través de l'API o l'SDK, `IMPORTED` per a transaccions carregades
            mitjançant la importació des de la consola.
        amount:
          type: string
          description: >-
            Import de la transacció com a cadena decimal sense els zeros finals
            (p. ex., `"1500"`, `"0.5"`, `"0.123456789012345678"`). Fins a 18
            decimals.
        currency:
          type: string
          description: >-
            Codi de moneda de `amount`. S'accepta qualsevol codi alfabètic ISO
            4217 (p. ex. `EUR`, `USD`, `NGN`), així com un símbol d'actiu cripto
            (p. ex. `BTC`). És preferible utilitzar un codi actualment en
            circulació. No tots els codis acceptats tenen tipus de canvi: quan
            no n'hi ha cap de disponible per al codi (per exemple, la unitat de
            compte ISO `XSU`, o un símbol cripto que Didit no cotitza), la
            conversió automàtica falla i `preferred_currency_amount` es retorna
            null tret que la sol·licitud hagi proporcionat un
            `amount_in_default_currency` preconvertit.
        currency_type:
          type: string
          nullable: true
          description: '`fiat` o `crypto`, tal com s''ha indicat a `currency_kind`.'
        amount_in_default_currency:
          type: string
          nullable: true
          description: >-
            Import preconvertit que has proporcionat, com a cadena decimal sense
            zeros finals.
        default_currency_code:
          type: string
          nullable: true
        preferred_currency_amount:
          type: string
          nullable: true
          description: >-
            `amount` convertit a la moneda preferida de l'aplicació, quan
            estigui disponible.
        preferred_currency_code:
          type: string
          nullable: true
        payment_details:
          type: string
          nullable: true
          description: Referència de pagament o concepte de text lliure de l'enviament.
        payment_txn_id:
          type: string
          nullable: true
          description: >-
            Referència del sistema de pagament extern (p. ex. hash de la
            transacció a la blockchain) de `payment_reference_id`.
        score:
          type: integer
          description: >-
            Puntuació de risc acumulada per les regles (normalment 0–100). Com
            més alta, més risc.
        severity:
          type: string
          nullable: true
          enum:
            - UNKNOWN
            - LOW
            - MEDIUM
            - HIGH
            - CRITICAL
          description: >-
            Gravetat de risc categòrica establerta per regles/proveïdors
            (`UNKNOWN`, `LOW`, `MEDIUM`, `HIGH`, `CRITICAL`). `null` fins que
            algun element l'estableixi.
        decision_reason_code:
          type: string
          nullable: true
          description: Motiu llegible per màquina per a l'`status` actual.
        decision_reason_label:
          type: string
          nullable: true
          description: Etiqueta fàcil de llegir per a `decision_reason_code`.
        vendor_data:
          type: string
          nullable: true
          description: Còpia de conveniència del `vendor_data` del sol·licitant.
        metadata:
          type: object
          description: >-
            Instantània dels payloads de `subject` i `counterparty` tal com es
            van enviar en el moment de la creació.
        props:
          type: object
          description: >-
            Les `custom_properties` que has proporcionat en crear. Cada clau es
            pot referenciar en les condicions de les regles com a
            `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: >-
                  Si l'etiqueta és un valor predefinit de Didit o una etiqueta
                  personalitzada.
          description: Etiquetes adjuntades a la transacció (manualment o per regles).
        parties:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              role:
                type: string
                enum:
                  - APPLICANT
                  - REMITTER
                  - BENEFICIARY
                  - COUNTERPARTY
                description: >-
                  Rol de la part. L'endpoint de creació assigna `APPLICANT` (el
                  subjecte) i `COUNTERPARTY`.
              entity_type:
                type: string
                enum:
                  - individual
                  - company
                  - external
                  - unhostedWallet
              kind:
                type: string
                enum:
                  - USER
                  - BUSINESS
                  - EXTERNAL
                description: >-
                  Les parts `USER`/`BUSINESS` s'enllacen amb una entitat
                  propietat de Didit mitjançant `vendor_data`. Les parts
                  `EXTERNAL` no tenen cap entitat de Didit al darrere.
              vendor_data:
                type: string
                nullable: true
                description: El teu identificador intern d'usuari/empresa.
              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: >-
                  Codi de país de l'`address.country` enviat (normalment ISO
                  3166-1 alpha-3).
              dob:
                type: string
                format: date
                nullable: true
                description: Data de naixement a partir de la `date_of_birth` enviada.
              address:
                type: object
                description: Objecte d'adreça tal com s'ha enviat. `{}` quan s'omet.
              institution_info:
                type: object
                description: >-
                  Detalls de la institució tal com s'han enviat. `{}` si
                  s'ometen.
              device:
                type: object
                description: >-
                  Context del dispositiu normalitzat, inclòs l'enriquiment d'IP
                  del costat del servidor sota network_context (geolocalització,
                  indicadors de VPN/centre de dades) quan s'ha proporcionat una
                  IP.
                properties:
                  fingerprint:
                    type: string
                    description: Petjada digital única del dispositiu.
                  persistent_device_id:
                    type: string
                    description: >-
                      Identificador de dispositiu estable entre sessions
                      (esquema d'empremta digital v2).
                  user_agent:
                    type: string
                    description: Cadena de l'agent d'usuari del navegador o de l'aplicació.
                  browser_family:
                    type: string
                    description: Família del navegador (p. ex., Chrome, Firefox, Safari).
                  browser_version:
                    type: string
                    description: Cadena de la versió del navegador.
                  platform:
                    type: string
                    description: >-
                      Identificador de plataforma (web, ios, android, macos,
                      windows, linux).
                  os_family:
                    type: string
                    description: >-
                      Família del sistema operatiu (p. ex., iOS, Android,
                      Windows).
                  os_version:
                    type: string
                    description: Cadena de la versió del sistema operatiu.
                  accept_language:
                    type: string
                    description: Valor de la capçalera Accept-Language.
                  session_id:
                    type: string
                    description: Identificador de sessió (emmagatzemat a les metadades).
                  session_age_ms:
                    type: number
                    description: Antiguitat de la sessió en mil·lisegons.
                  network_context:
                    type: object
                    description: Context de xarxa amb adreça IP i geolocalització.
                    properties:
                      ip_address:
                        type: string
                        description: Adreça IP del client.
                      ip_country_code:
                        type: string
                        description: País geolocalitzat de la IP (ISO 3166-1 alfa-3).
                      latitude:
                        type: number
                        description: Latitud geogràfica de la IP.
                      longitude:
                        type: number
                        description: Longitud geogràfica de la IP.
              external_party_snapshot:
                type: object
                nullable: true
                description: >-
                  Còpia congelada de les dades de les parts de tipus `EXTERNAL`.
                  `null` mentre la part estigui vinculada a un usuari o una
                  empresa de Didit.
          description: Parts de la transacció (sol·licitant, contrapart).
        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 sobre `type:account_id:issuing_country`: identificador
                  estable per correlacionar la reutilització del mateix
                  instrument.
              account_id:
                type: string
                nullable: true
                description: >-
                  Identificador de compte (IBAN, adreça de cartera, token de
                  targeta, …).
              issuing_country:
                type: string
                nullable: true
              owner_kind:
                type: string
                enum:
                  - USER
                  - BUSINESS
                  - EXTERNAL
              vendor_data:
                type: string
                nullable: true
                description: El teu identificador per a l'usuari o l'empresa propietaris.
              owner_name:
                type: string
                nullable: true
              institution_info:
                type: object
              details:
                type: object
                description: Objecte `payment_method` en brut tal com s'ha enviat.
              external_owner_snapshot:
                type: object
                nullable: true
              role:
                type: string
                enum:
                  - SOURCE
                  - DESTINATION
                  - FUNDING
                  - BENEFICIARY
                description: >-
                  Com es va utilitzar aquest mètode a la transacció. L'endpoint
                  de creació assigna `SOURCE`/`DESTINATION` a partir de la
                  direcció (sortint: subject = SOURCE; entrant: subject =
                  DESTINATION).
          description: Mètodes de pagament vinculats a la transacció.
        documents:
          type: array
          description: >-
            Fitxers adjunts a la transacció des de la consola. `[]` quan no n'hi
            ha cap.
          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 descàrrega signada de curta durada; obtén-la quan
                        sigui necessari en lloc d'emmagatzemar-la.
                    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: >-
                  P. 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: >-
            Entrades del registre d'activitat (creació, notes, revisions
            manuals, canvis d'estat).
        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: >-
            Sempre buit actualment. Una alerta oberta és una transacció amb
            estat `IN_REVIEW` o `AWAITING_USER`.
        rule_runs:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              rule:
                type: string
                format: uuid
                description: UUID de la regla que s'ha executat.
              rule_title:
                type: string
              rule_description:
                type: string
                nullable: true
              rule_category:
                type: string
              matched:
                type: boolean
                description: >-
                  Si les condicions de la regla han coincidit amb aquesta
                  transacció. Només s'enregistra una execució per a les regles
                  coincidents, de manera que les avaluacions en producció sempre
                  porten `true`.
              is_test:
                type: boolean
                description: >-
                  Cert quan la regla s'ha executat en mode TEST (sense cap
                  efecte en l'estat o la puntuació).
              mode:
                type: string
                enum:
                  - ACTIVE
                  - DISABLED
                  - TEST
              severity:
                type: string
                nullable: true
              score_delta:
                type: integer
                description: Puntuació afegida per les accions `add_score` d'aquesta regla.
              status_target:
                type: string
                nullable: true
                description: Estat establert per una acció `change_status`, si n'hi ha.
              action_summary:
                type: string
                nullable: true
                description: >-
                  Resum de les accions que ha executat la regla, unides amb `; `
                  (p. ex., `score +30; change_status:IN_REVIEW;
                  add_tag:high_risk_country`). Parts: `score +N`,
                  `change_status:<STATUS>`, `add_tag:<name>`, `add_note`,
                  `add_to_list`, `open_case`. `null` quan la regla no ha
                  executat cap acció.
              metadata:
                type: object
                description: >-
                  Detall de l'avaluació: `scope_match`, `conditions[]` i
                  `aggregations[]`. Cada entrada de condició conté `field`,
                  `operator`, `expected_value`, el `current_value` llegit de la
                  transacció, `matched`, `group_index` i `group_logic`. Cada
                  entrada d'agregació (velocitat / recompte / suma) conté
                  `metric`, `field`, `operator`, `expected_value`, el
                  `computed_value` resultant de l'avaluació de l'agregat,
                  `window`, `filters`, `matched` i `sample_references`; les
                  agregacions asíncrones ajornades tenen `computed_value: null`
                  i `deferred: true`. Un grup de condicions niat és una entrada
                  de `conditions[]` amb l'`operator` `any_of` o `all_of`,
                  `field` null, i els resultats dels seus membres sota el seu
                  propi `conditions`.
              created_at:
                type: string
                format: date-time
          description: >-
            Resultats d'execució per regla: quina regla s'ha activat, amb quin
            impacte en la puntuació.
        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 de resposta del proveïdor en brut.
              created_at:
                type: string
                format: date-time
          description: >-
            Payloads en brut dels proveïdors (Cribratge AML, anàlisi de
            blockchain, etc.).
        travel_rule:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/TransactionTravelRule'
          description: >-
            Transferència o comprovació de Travel Rule. S'emplena quan s'ha
            enviat `travel_rule_details`, i també quan Travel Rule està activat
            i la transacció s'ha creat amb `transaction_category: travelRule`
            (Didit inicia l'intercanvi directament, fins i tot sense
            `travel_rule_details`). `null` quan no existeix cap transferència o
            comprovació. En una transferència entrant, els camps
            `originator_data` i `beneficiary_data` de la contrapart romanen
            emmascarats (`data_masked: true`) fins que es confirma la
            titularitat de la cartera.
        network_snapshot:
          type: object
          nullable: true
          description: >-
            Instantània del graf de transaccions/parts relacionades utilitzada
            pel motor de regles. O bé el `network_snapshot` enviat amb la
            transacció o bé el graf que Didit construeix a partir d'un cribratge
            AML de carteres satisfactori (que substitueix el que s'hagi enviat).
            `null` quan cap dels dos existeix.
          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: >-
            Sessió de correcció oferta a l'usuari quan es requereix una
            reverificació. Substituïda per `action_required`, que és el bloc
            canònic; es manté per compatibilitat amb versions anteriors.
          properties:
            session_id:
              type: string
            session_token:
              type: string
            url:
              type: string
              format: uri
            status:
              type: string
        action_required:
          type: object
          nullable: true
          description: >-
            Acció pendent de l'usuari final necessària per completar aquesta
            transacció, o null si no n'hi ha cap. Els SDK de Didit inicien
            automàticament l'acció per defecte i actualitzen la transacció quan
            finalitza. Dues variants, discriminades per `type`:
            `verification_session` (una sessió de verificació allotjada creada
            per una acció de regla) i `wallet_ownership` (una sessió de widget
            de titularitat de la cartera generada automàticament per a una
            transferència de Travel Rule que necessita un comprovant de control
            de la cartera, regulada per la configuració de Travel Rule
            `auto_wallet_verification`). Quan totes dues es podrien aplicar,
            `wallet_ownership` té prioritat perquè bloqueja l'intercanvi de
            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: >-
            Cost d'aquesta transacció: `total_price` i `items`, un per càrrec,
            cadascun amb `usage_type`, `price`, `details` i `created_at`. Un nou
            cribratge de la mateixa transacció és un element nou.
    TravelRuleUtxoEntry:
      type: object
      description: >-
        Una entrada o sortida d'una transacció UTXO, tal com la va registrar la
        cadena.
      required:
        - address
      properties:
        address:
          type: string
          maxLength: 128
        amount:
          type: string
          nullable: true
          description: >-
            Cadena decimal en la unitat pròpia de la moneda (BTC, no satoshis).
            Opcional.
          example: '0.0125'
        txid:
          type: string
          maxLength: 128
          description: Opcional. La transacció que gasta un input.
        vout:
          type: integer
          nullable: true
          minimum: 0
          description: Opcional. L'índex de la sortida que consumeix una entrada.
    TransactionTravelRule:
      type: object
      description: >-
        Una transferència Travel Rule d'una transacció, tal com la retornen `GET
        /v3/transactions/{transaction_id}/`, el `201` de `POST
        /v3/transactions/` i cada fila de `GET /v3/transactions/`. `direction`,
        `rail`, `counterparty_vasp`, `delivery`, `discovery`, `reason` i
        `next_actions` tenen la mateixa estructura que a `PATCH
        /v3/transactions/{transaction_id}/travel-rule/`, de manera que una
        lectura d'una transacció indica per què la seva transferència està
        bloquejada i què cal per fer-la avançar.
      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: >-
            Part ordenant. Per a una transferència entrant, els valors de la
            contrapart s'emmascaren fins que se'n confirmi la titularitat.
        beneficiary_data:
          type: object
          description: >-
            Part beneficiària. Per a una transferència entrant, els valors de la
            contrapart s'emmascaren fins que es confirmi la titularitat.
        name_match:
          type: object
          nullable: true
          description: >-
            La comparació de noms que ha decidit la transferència (puntuació i
            estrictesa). Null fins que se n'hagi executat una. Els noms
            comparats s'emmascaren juntament amb les parts.
        data_match:
          $ref: '#/components/schemas/TravelRuleDataMatch'
        mismatched_fields:
          type: array
          items:
            type: string
          description: >-
            Drecera per a `data_match.mismatched_fields`. Buit quan no hi ha cap
            diferència.
        data_unmasked:
          $ref: '#/components/schemas/TravelRuleDataUnmasked'
        data_masked:
          type: boolean
          description: >-
            Cert mentre les dades personals de la contrapart estiguin
            emmascarades en aquesta resposta.
        metadata:
          type: object
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
          description: A quin costat de l'intercanvi pertany aquesta transferència.
        rail:
          type: string
          nullable: true
          description: >-
            El rail pel qual s'ha enviat la transferència: `INTERNAL`, `TRP`,
            `GTR`, `TRUST`, `VERIFYVASP`, `SYGNA` o `EMAIL` (`TEST_VASP` en una
            aplicació de sandbox, quan el Didit Test VASP ha respost), o `null`
            fins que es triï un rail.
        counterparty_vasp:
          type: object
          nullable: true
          properties:
            name:
              type: string
            lei:
              type: string
            dd_score:
              type: integer
              description: >-
                Puntuació de diligència deguda de 0 a 100, on un valor més alt
                és millor. La mateixa escala que al directori de VASP.
            dd_score_breakdown:
              type: object
              description: >-
                Contribucions per component a dd_score, un objecte per component
                tal com apareix al directori de VASP (jurisdiction,
                verification, protocol, lei, history, essentials,
                responsiveness), cadascun amb {points, max, reason, detail}. {}
                fins que s'hagi avaluat la contrapart.
              additionalProperties:
                type: object
                properties:
                  points:
                    type: number
                    description: Punts atorgats per a aquest component.
                  max:
                    type: integer
                    description: Nombre màxim de punts que pot atorgar aquest component.
                  reason:
                    type: string
                    description: Codi llegible per màquina del veredicte del component.
                  detail:
                    type: string
                    description: Motiu dels punts atorgats, llegible per a humans.
            dd_assessed_at:
              type: string
              format: date-time
              nullable: true
              description: >-
                Quan es va executar per darrera vegada l'avaluació de diligència
                deguda. Null fins que s'hagi avaluat la contrapart.
          description: >-
            L'entrada del directori de la contrapart, o `null` si la
            transferència no n'enllaça cap.
        delivery:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/TravelRuleDelivery'
          description: >-
            El missatge més recent que la transferència deu a una altra part.
            `null` quan no n'ha degut cap, per exemple per sota de
            `threshold_amount` o per a una cartera autoallotjada declarada.
        discovery:
          type: array
          description: >-
            Com Didit ha cercat la contrapart, una entrada per cada pas que s'ha
            executat. Buit quan no s'ha executat cap descobriment, per exemple
            en una transferència entrant.
          items:
            $ref: '#/components/schemas/TravelRuleDiscoveryStep'
        reason:
          type: string
          description: >-
            Per què una transferència `COUNTERPARTY_VASP_NOT_FOUND` o
            `COUNTERPARTY_VASP_NOT_REACHABLE` està encallada; `""` per a
            qualsevol altre estat. Un lliurament fallit ho determina primer,
            només a `COUNTERPARTY_VASP_NOT_REACHABLE`: `email_undeliverable` (el
            proveïdor de correu ha refusat el correu electrònic de compliment i
            no queda cap adreça per provar: quan s'ha enviat, en un recordatori
            o com un rebot permanent notificat més tard) o `delivery_failed` (el
            canal que l'estava lliurant ha fallat definitivament: un canal de
            xarxa ha refusat el missatge o s'ha quedat sense reintents, un host
            d'identitat `TRP` no ha respost o l'host `TRP` de la contrapart no
            ha acceptat la consulta). En cas contrari, el rastreig de
            `discovery` ho determina: `awaiting_end_user` (cap pas ha indicat
            una contrapart a la qual Didit pugui arribar),
            `directory_match_no_route` (un pas ha indicat un VASP del directori
            que no té ruta), `picked_member_without_proven_wallet` (l'usuari
            final ha triat un client de Didit que no ha demostrat el control de
            la cartera) o `no_directory_match` quan el rastreig no dóna cap
            altre motiu. Un reenviament fa avançar la transferència, de manera
            que el motiu s'esborra. Consulta [Per què una transferència està
            encallada](/ca/transaction-monitoring/travel-rule#per-què-una-transferència-està-bloquejada).
        next_actions:
          type: array
          description: >-
            Què fa avançar la transferència; `[]` per a qualsevol estat excepte
            `COUNTERPARTY_VASP_NOT_FOUND` o `COUNTERPARTY_VASP_NOT_REACHABLE`.
            `email_undeliverable` ofereix `update_compliance_email` i després
            `resend`. `delivery_failed` ofereix `resend`. Un motiu de
            descobriment ofereix `select_counterparty_vasp`,
            `declare_self_hosted`, `add_vasp_hint` i `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 verificació allotjada per obrir per a l'usuari final.
        session_id:
          type: string
          format: uuid
          description: ID de la sessió de verificació.
        session_token:
          type: string
          description: >-
            Token de sessió, utilitzat pels SDK mòbils per iniciar el flux de
            manera nativa.
        status:
          type: string
          description: Estat de la sessió de verificació.
      required:
        - type
        - url
    TransactionWalletOwnershipAction:
      title: Wallet ownership
      type: object
      properties:
        type:
          type: string
          enum:
            - wallet_ownership
        url:
          type: string
          format: uri
          description: >-
            URL del giny allotjat de titularitat de la cartera. Obre'l en un
            navegador real; al mòbil fes servir SFSafariViewController o una
            pestanya personalitzada de Chrome, mai una webview incrustada.
        widget_session_id:
          type: string
          format: uuid
          description: ID de sessió del widget de titularitat de la cartera.
        expires_at:
          type: string
          format: date-time
          description: Quan caduca la sessió del widget.
      required:
        - type
        - url
    TravelRuleDataMatch:
      type: object
      nullable: true
      description: >-
        Comparació camp per camp de les dades de les parts de la transferència
        amb el que l'altra part sap sobre el titular de la cartera. Nomena camps
        i resultats, mai valors, de manera que continua sent llegible mentre les
        dades de la contrapart estan emmascarades. Null fins que s'executi una
        comparació.
      properties:
        matched:
          type: boolean
          description: Cert quan cap camp comparat difereix.
        mismatched_fields:
          type: array
          items:
            type: string
            enum:
              - name
              - date_of_birth
              - address
              - account
          description: Els camps que difereixen.
        fields:
          type: object
          description: >-
            Una entrada per camp comparat per al tipus d'entitat de la part
            (`name`, `date_of_birth`, `address`, `account`; una empresa no té
            `date_of_birth`).
          additionalProperties:
            type: object
            properties:
              result:
                type: string
                enum:
                  - matched
                  - mismatched
                  - not_compared
                description: >-
                  `not_compared` quan la regla és `NONE` o una de les dues parts
                  no té cap valor per al camp.
              strictness:
                type: string
                enum:
                  - NONE
                  - STRICT
                  - CONTAINS
                  - DEFAULT
                  - FUZZY
    TravelRuleDataUnmasked:
      type: object
      nullable: true
      description: >-
        Registre d'auditoria del moment en què es van desenmascarar les dades de
        la contrapart. És null mentre les dades continuïn emmascarades, així com
        per a transferències sortints.
      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: >-
            Què va confirmar la titularitat: ownership_confirmed (la teva
            confirmació mitjançant la consola o l'API), wallet_proof (una prova
            de cartera al widget, o una transferència entrant INTERNAL,
            establerta quan es crea), address_book_match (una cartera de la
            llibreta d'adreces verificada), own_verified_wallet (la pròpia
            cartera verificada del teu usuari), inquiry_approved (la teva
            aprovació d'una consulta TRP entrant o un missatge GTR o Sygna),
            known_payment_method (una cartera amb la qual el teu usuari ja ha
            pagat) o travel_address (la Travel Address per cartera que va donar
            nom a la cartera).
        actor:
          type: string
          description: >-
            Qui ho ha confirmat: el correu electrònic de l'usuari de la consola
            o l'etiqueta de la clau d'API. En blanc per a una decisió
            automàtica.
    TravelRuleDelivery:
      type: object
      description: >-
        Estat en què es troba l'últim missatge que la transferència deu a
        l'altra part. Didit contacta amb la contrapart un cop retornada la
        sol·licitud que ha creat o modificat la transferència, de manera que
        aquest objecte indica si el missatge s'ha lliurat: en cua, enviant-se,
        esperant per reintentar després d'un error, lliurat o fallit. Una
        fallada de la qual la xarxa encara es pot recuperar (sense resposta a
        temps, connexió fallida, HTTP `408`, `429` o `5xx`) es reintenta al cap
        de 30 segons, 2 minuts, 10 minuts, 30 minuts i 1 hora. Quan un primer
        missatge (`kind: SEND`) falla definitivament, perquè la xarxa l'ha
        rebutjat o perquè el sisè intent també ha fallat, la transferència passa
        a `COUNTERPARTY_VASP_NOT_REACHABLE` amb `last_error` a la seva
        `timeline`; qualsevol altre missatge que falli definitivament s'anota a
        la `timeline`. L'`status` de la transferència continua sent la font de
        referència de l'intercanvi en si.
      required:
        - kind
        - status
        - rail
        - attempts
        - last_error
        - next_attempt_at
        - delivered_at
      properties:
        kind:
          type: string
          enum:
            - SEND
            - ANSWER
            - TXID
            - CANCEL
            - POLL
          description: >-
            Què transmet el missatge. `SEND`: el primer missatge de la
            transferència a la contrapart (sortint; el canal es tria quan
            s'envia). `ANSWER`: la teva acceptació o rebuig, que es deu a la
            xarxa que ho ha sol·licitat (entrant). `TXID`: el hash de la
            transacció on-chain, un cop finalitzis la transferència. `CANCEL`:
            la cancel·lació, un cop la cancel·lis. `POLL`: una consulta d'estat
            a una xarxa que n'ofereixi una, repetida cada 5 minuts mentre la
            transferència espera la contrapart.
        status:
          type: string
          enum:
            - QUEUED
            - SENDING
            - RETRYING
            - DELIVERED
            - FAILED
          description: >-
            `QUEUED`: esperant per enviar-se. `SENDING`: hi ha un intent en
            curs. `RETRYING`: un intent ha fallat i el següent s'executarà a
            `next_attempt_at`. `DELIVERED`: l'altra part ha rebut el missatge.
            `FAILED`: l'altra part l'ha rebutjat o el darrer intent ha fallat.
        rail:
          type: string
          enum:
            - INTERNAL
            - TRP
            - GTR
            - TRUST
            - VERIFYVASP
            - SYGNA
            - EMAIL
            - ''
          description: >-
            El rail que transporta el missatge. Buit fins que Didit n'hagi triat
            un per a un primer missatge.
        attempts:
          type: integer
          minimum: 0
          description: >-
            Intents realitzats fins ara per a aquest missatge. Un missatge que
            no sigui un sondeig d'estat s'intenta com a màxim 6 vegades.
        last_error:
          type: string
          description: >-
            El tipus d'error que ha afectat l'últim intent, `""` quan no n'hi ha
            hagut cap: per exemple `email undeliverable`, `trp identity endpoint
            unreachable` o `trp transfer inquiry delivery failed`. Mai no conté
            la resposta de la contrapart mateixa, que roman al `timeline` de la
            transferència.

            Quan GTR respon amb un error, s'hi inclouen el seu propi codi
            d'estat i missatge. Els cossos de resposta no s'inclouen mai.
          example: email undeliverable
        next_attempt_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Quan s'executa el següent intent mentre el missatge està en estat
            `QUEUED` o `RETRYING`.
        delivered_at:
          type: string
          format: date-time
          nullable: true
          description: Quan l'altra part va rebre el missatge.
    TravelRuleDiscoveryStep:
      type: object
      description: >-
        Un pas de la detecció de la contrapart que Didit ha executat per a una
        transferència sortint, en l'ordre en què els ha executat. El primer pas
        que anomena un VASP amb una ruta finalitza la cadena.
      properties:
        step:
          type: string
          enum:
            - internal_address_book
            - wallet_attribution
            - network_lookup
            - customer_hint
            - end_user
          description: >-
            `internal_address_book`: un altre client de Didit que ha demostrat
            el control de la cartera de destinació. `wallet_attribution`:
            l'atribució d'analítica blockchain de la cartera. `network_lookup`:
            una xarxa que pot indicar quin VASP té l'adreça. `customer_hint`: el
            nom del VASP, LEI o jurisdicció que has enviat a `beneficiary_data`.
            `end_user`: la contrapart que l'usuari final (o tu) ha triat, o la
            sol·licitud per triar-ne una.
        outcome:
          type: string
          enum:
            - match
            - miss
            - skipped
          description: >-
            `match`: el pas ha indicat una contrapart. `miss`: s'ha executat i
            no n'ha trobat cap. `skipped`: no s'ha pogut executar, i `reason`
            n'explica el motiu.
        reason:
          type: string
          description: >-
            Motiu llegible per màquina, `""` en cas de coincidència:
            `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` o `picked_member_without_proven_wallet`.
        vasp:
          type: string
          format: uuid
          nullable: true
          description: El VASP del directori que ha indicat el pas, si n'ha indicat algun.
        rail:
          type: string
          nullable: true
          description: El rail que arriba a aquesta contrapart, quan el pas n'ha trobat un.
        at:
          type: string
          format: date-time
    TravelRuleNextAction:
      type: object
      description: >-
        Un element que fa avançar una transferència
        `COUNTERPARTY_VASP_NOT_FOUND` o `COUNTERPARTY_VASP_NOT_REACHABLE`.
        Consulta [Per què una transferència està
        bloquejada](/ca/transaction-monitoring/travel-rule#per-què-una-transferència-està-bloquejada).
      properties:
        action:
          type: string
          enum:
            - select_counterparty_vasp
            - declare_self_hosted
            - add_vasp_hint
            - update_compliance_email
            - resend
          description: >-
            `select_counterparty_vasp`: l'usuari final tria el VASP de
            destinació al widget de titularitat de la cartera, o fas un PATCH
            amb `action=beneficiary_vasp`. `declare_self_hosted`: l'usuari final
            declara que la cartera és autoallotjada al widget. `add_vasp_hint`:
            indica a Didit qui és la contrapart, amb un nom de VASP, LEI o
            Travel Address (per exemple, un `travel_address` a l'entrada de la
            llibreta d'adreces de la cartera de destinació), i després torna a
            enviar. `update_compliance_email` i `resend` són valors d'`action`
            de `PATCH /v3/transactions/{transaction_id}/travel-rule/`: torna a
            proporcionar el correu electrònic de compliment de la contrapart i
            torna a executar l'encaminament.
        url:
          type: string
          format: uri
          description: >-
            L'enllaç del widget de titularitat de la cartera, a
            `select_counterparty_vasp` i `declare_self_hosted` mentre la
            transferència té una sessió de widget oberta.
      required:
        - action
    TravelRuleChainDetails:
      type: object
      description: >-
        Com anomena la cadena de la transferència les seves dues carteres, quan
        es tracta de més d'una adreça pagant-ne una altra. Buit (`{}`) per a una
        transferència de cadena basada en comptes (EVM, Solana, Tron), on les
        dues adreces són les carteres. La coincidència, l'encaminament i la
        llibreta d'adreces llegeixen primer les carteres d'aquí.
      properties:
        chain:
          type: string
          description: >-
            Cadena canònica, p. ex. `BTC`, `XRP` o `LIGHTNING` per a una
            transferència Lightning.
        shape:
          type: string
          enum:
            - utxo
            - memo
            - lightning
        originator:
          $ref: '#/components/schemas/TravelRuleChainSide'
        beneficiary:
          $ref: '#/components/schemas/TravelRuleChainSide'
        utxo:
          type: object
          description: >-
            En una transferència UTXO: les entrades i sortides tal com s'han
            emmagatzemat (imports com a cadenes decimals) i què ha llegit Didit
            en cada sortida.
          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: Sortides que retornen el pagament a una adreça d'entrada.
            beneficiary_output_index:
              type: integer
              nullable: true
              description: >-
                La sortida que paga al beneficiari; null quan no se'n pot
                distingir cap.
        lightning:
          type: object
          description: >-
            En una transferència de Lightning: el que diu la sol·licitud de
            pagament. Sempre `kind` (`bolt11`, `bolt12_offer`, `bolt12_invoice`,
            `bolt12_invoice_request`, `lnurl`, `lightning_address`, `node_id` o
            `unknown`); una factura BOLT11 afegeix `network`, `payee_node_id`,
            `payment_hash`, `amount_msat`, `created_at` i `expires_at`; una
            cadena BOLT12 afegeix `blinded_paths` i `payee_node_id`; un LNURL o
            una Lightning Address inclou el seu `domain`. No es resol res a
            través de la xarxa: la sol·licitud només es descodifica.
          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: >-
            Inconsistències d'UTXO que val la pena revisar: l'ordenant declarat
            no és una entrada, el beneficiari declarat no és una sortida, no
            s'ha pogut distingir cap sortida de beneficiari única o la sortida
            del beneficiari paga un import diferent del que indica la
            transacció.
        not_applicable_reason:
          type: string
          enum:
            - LIGHTNING_NO_PAYEE_IDENTIFIER
            - LIGHTNING_BOLT12_BLINDED_PAYEE
            - LIGHTNING_LNURL_NAMES_NO_PAYEE
          description: >-
            En una transferència sortint de Lightning la sol·licitud de pagament
            de la qual no especifica cap beneficiari: per què la transferència
            és `NOT_APPLICABLE`. `LIGHTNING_NO_PAYEE_IDENTIFIER` (la sol·licitud
            no especifica cap node beneficiari, o no s'ha pogut descodificar),
            `LIGHTNING_BOLT12_BLINDED_PAYEE` (l'oferta amaga el seu beneficiari
            darrere de rutes cegues), `LIGHTNING_LNURL_NAMES_NO_PAYEE` (un LNURL
            especifica un servei, no un beneficiari). El mateix codi obre
            l'última entrada de la `timeline` de la transferència.
    TravelRuleChainSide:
      type: object
      description: >-
        La cartera d'una de les parts tal com Didit l'ha resolt a partir de les
        dades de la cadena.
      properties:
        address:
          type: string
          description: >-
            La cartera. En una xarxa amb memo, l'adreça clàssica (una adreça X
            d'XRP es divideix en la seva adreça clàssica i la seva etiqueta); a
            Lightning, l'ID del node del beneficiari o l'adreça Lightning.
        memo:
          type: string
          description: >-
            L'etiqueta de destinació o nota que forma part de la cartera; `""`
            quan no n'hi ha cap.
        source:
          type: string
          enum:
            - declared
            - x_address
            - largest_input
            - only_non_change_output
            - amount_match
            - invoice_payee
            - updated
          description: >-
            D'on prové la cartera: `declared` (la teva sol·licitud), `x_address`
            (desglossada d'una adreça X d'XRP), `largest_input` (l'adreça
            d'entrada UTXO que ha aportat més), `only_non_change_output`
            (l'única sortida UTXO que no és canvi), `amount_match` (l'única
            sortida UTXO que paga l'import de la transferència), `invoice_payee`
            (el beneficiari que indica una sol·licitud de pagament de
            Lightning), `updated` (establert més tard amb `action:
            update_originator_wallet`).
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La clau d'API de la teva aplicació, des de Developers -> API keys a la
        Business Console. La clau primària té accés complet. Una clau amb nom
        pot tenir l'abast limitat: cap, lectura o escriptura per recurs,
        limitada a determinats fluxos de treball o a sessions aprovades, a una
        llista d'adreces IP i a una data de caducitat. 401 significa que la clau
        és incorrecta, revocada o caducada; 403 significa que no s'ha enviat cap
        clau, que la clau no té accés a aquest recurs o acció, o que la
        sol·licitud prové d'una adreça fora de la seva llista d'IP; 404 en una
        ruta de sessió significa que la sessió està fora dels fluxos de treball
        o estats de la clau. Una clau sense accés a fitxers multimèdia rep els
        URL d'imatge, vídeo i PDF com a null, i una clau sense permís
        d'escriptura de sessions rep els enllaços de sessió i els tokens com a
        null. Consulta https://docs.didit.me/console/api-keys.

````

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