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

# Invia transazione dall'SDK: KYT lato client

> Didit: invia transazioni monitorate dal dispositivo con token SDK, con analisi dispositivo e IP automatica e action_required sul wallet.



Prompt API per l'invio della transazione (token SDK)
        Copia il prompt negli appunti



      
      

\<pre>

\`Submit a monitored transaction from an end-user device using a scoped SDK token instead of an API key. This is the wire endpoint behind the Didit SDKs' submitTransaction methods - call it directly only when not using an SDK.

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

Authentication:
X-Transaction-Token header carrying an sdk_token minted by your backend via POST /v3/transactions/sdk-token/. No API key on the device, ever.

Payload (camelCase wire shape - each field maps onto its POST /v3/transactions/ equivalent):
\{
"txnId": "wd-2026-07-07-0042",              // -> transaction_id (required)
"type": "travelRule",                        // -> transaction_category (required)
"info": {                                    // -> transaction_details (required)
"direction": "out", "amount": "0.25", "currency": "ETH",
"currencyType": "crypto", "cryptoParams": {"crypto_chain": "ETH"}   // -> currency_kind, crypto_params
},
"subject": { "fullName": "Jane Doe" },       // externalUserId is IGNORED - identity comes from the token
"counterparty": {
"fullName": "Ana Diaz",
"paymentMethod": {"type": "unhosted_wallet", "accountId": "0x8ba1f109551bD432803012645Ac136ddd64DBA72"}  // type -> method_type; declares a self-hosted wallet
},
"travelRule": {                              // -> travel_rule_details
"status": "AWAITING_COUNTERPARTY",         // required (400 if missing); ignored when Travel Rule is enabled
"beneficiaryData": {"wallet_address": "0x8ba1f109551bD432803012645Ac136ddd64DBA72", "name": "Ana Diaz"}
},
"props": { "channel": "mobile_app" },        // -> custom_properties
"includeCryptoScreening": true
}

Three things are always decided by the token, never the payload:
\- the application the transaction is created under
\- the subject identity (token's vendor_data)
\- server-derived device context (IP, user agent) - it wins on conflict.

What to read from the response (same snake_case detail as /v3/, plus):
\- status - APPROVED | IN_REVIEW | DECLINED | AWAITING_USER.
\- travel_rule.status - the Travel Rule exchange state, when applicable.
\- action_required - when the end user must act: type "wallet_ownership" (open the url in a real browser, never a webview) or "verification_session" (launch with your Didit verification integration). null when nothing is pending.

Failure modes:
\- 401 - token missing, unknown, revoked, over max_uses, or expired ("expired" appears in the detail for expired tokens).
\- 400 - validation errors, with per-field details keyed by the canonical field names (a missing info.currency is reported as {"transaction_details": {"currency": [...]}}), including a txnId that already exists.
\- 409 - a concurrent request with the same txnId was created first.

Afterwards:
\- Re-read with GET /v1/transactions/{transaction_id}/ (same token) after the user completes an action.
\- Your backend also receives transaction.created / transaction.status.updated webhooks with the same action_required block.

Full guide: /transaction-monitoring/sdk-transaction-submission.`

\</pre>



      
      

Incolla in



## OpenAPI

````yaml it/openapi-25.json POST /v1/transactions/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API di verifica dell'identità. Autenticati con l'intestazione x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v1/transactions/:
    post:
      tags:
        - Transactions
      summary: Invia una transazione da un SDK
      description: >-
        Endpoint lato dispositivo chiamato dagli SDK di Didit per inviare una
        transazione direttamente dal dispositivo dell'utente finale.
        L'autenticazione avviene tramite un token con ambito generato da `POST
        /v3/transactions/sdk-token/` inviato nell'intestazione
        `X-Transaction-Token` al posto di una chiave API, e l'endpoint è
        abilitato a CORS in modo che i browser possano chiamarlo in modalità
        cross-origin. Il payload utilizza gli alias di trasmissione in camelCase
        mostrati di seguito (i metodi `submitTransaction` dell'SDK lo compongono
        automaticamente). Tre garanzie lato server: l'applicazione viene sempre
        ricavata dal token; l'identità del soggetto (`externalUserId`) è sempre
        imposta a partire dal `vendor_data` del token, ignorando quindi i valori
        spoofati nel payload; e la device intelligence (il fingerprint del
        dispositivo dell'SDK oltre a IP e user agent derivati dal server) viene
        allegata automaticamente al soggetto.
      operationId: submitTransactionFromSdk
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                txnId:
                  type: string
                  description: >-
                    Il tuo identificatore univoco per questa transazione
                    (corrisponde a `transaction_id`, massimo 128 caratteri).
                  example: wd-2026-07-07-0042
                txnDate:
                  type: string
                  format: date-time
                  description: >-
                    Quando è avvenuta la transazione (corrisponde a
                    `transaction_at`). Se omesso, il valore predefinito è
                    adesso.
                zoneId:
                  type: string
                  description: >-
                    Identificatore di fuso orario IANA (mappato a `time_zone`),
                    ad es. `Europe/Madrid`.
                type:
                  type: string
                  description: >-
                    Categoria della transazione (corrisponde a
                    `transaction_category`), es. `finance`, `kyc`, `travelRule`,
                    `userPlatformEvent`, `gamblingBet`.
                  example: travelRule
                info:
                  type: object
                  description: >-
                    Dettagli finanziari principali della transazione (mappati su
                    `transaction_details`).
                  required:
                    - direction
                    - amount
                    - currency
                  properties:
                    direction:
                      type: string
                      description: >-
                        Direzione rispetto al soggetto. Non fa distinzione tra
                        maiuscole e minuscole; `in`/`out` sono accettati come
                        alias. Restituito in maiuscolo (`INBOUND`/`OUTBOUND`).
                      example: out
                    amount:
                      type: number
                      description: >-
                        Importo della transazione (fino a 18 cifre decimali).
                        Viene accettata anche una stringa decimale, ed è l'unico
                        modo per preservare più di circa 15 cifre significative:
                        un numero JSON viene prima analizzato come float
                        binario, quindi `0.123456789012345678` viene memorizzato
                        come `0.12345678901234568`.
                      example: 0.25
                    currency:
                      type: string
                      description: >-
                        Codice valuta. Viene accettato qualsiasi codice
                        alfabetico ISO 4217 (ad es. `EUR`, `USD`, `NGN`), così
                        come il simbolo di un asset crypto (ad es. `BTC`). È
                        preferibile utilizzare un codice attualmente in
                        circolazione. Non tutti i codici accettati hanno un
                        tasso di cambio: quando non ne è disponibile alcuno per
                        il codice (ad esempio l'unità di conto ISO `XSU` o un
                        simbolo crypto di cui Didit non calcola il prezzo), la
                        conversione automatica non riesce e
                        `preferred_currency_amount` viene restituito null a meno
                        che la richiesta non abbia fornito un
                        `amountInDefaultCurrency` pre-convertito.
                      example: ETH
                    currencyType:
                      type: string
                      description: >-
                        Indica se la valuta è `fiat` o `crypto` (corrisponde a
                        `currency_kind`).
                    amountInDefaultCurrency:
                      type: number
                      nullable: true
                      description: >-
                        Importo pre-convertito nella valuta predefinita
                        (corrisponde a `amount_in_default_currency`). Se omesso,
                        viene tentata la conversione valutaria automatica.
                    defaultCurrencyCode:
                      type: string
                      description: >-
                        Il codice valuta predefinito per l'importo convertito
                        (mappato su `default_currency`). Qualsiasi codice ISO
                        4217 attualmente in circolazione.
                    paymentDetails:
                      type: string
                      nullable: true
                      description: >-
                        Riferimento di pagamento o promemoria in formato testo
                        libero (corrisponde a `payment_details`).
                    paymentTxnId:
                      type: string
                      nullable: true
                      description: >-
                        Riferimento di pagamento esterno (mappato su
                        `payment_reference_id`); l'hash della transazione
                        on-chain per le transazioni crypto.
                    type:
                      type: string
                      nullable: true
                      description: >-
                        Sottotipo della transazione (mappato su `action_type`),
                        ad es. `deposit`, `withdrawal`, `transfer`.
                    cryptoParams:
                      type: object
                      description: >-
                        Parametri specifici per le crypto, ad es.
                        `{"crypto_chain": "ETH"}`.
                subject:
                  type: object
                  description: >-
                    Il soggetto (richiedente) della transazione.
                    `externalUserId` viene ignorato qui: l'identità del soggetto
                    viene sempre vincolata in base a `vendor_data` del token.
                  required:
                    - fullName
                  properties:
                    type:
                      type: string
                      description: >-
                        Tipo di entità (mappato su `entity_type`): `individual`
                        (predefinito) o `company`.
                    externalUserId:
                      type: string
                      description: >-
                        Ignorato sul soggetto: applicato lato server a partire
                        dai `vendor_data` del token.
                    fullName:
                      type: string
                      example: Jane Doe
                    firstName:
                      type: string
                    lastName:
                      type: string
                    dob:
                      type: string
                      format: date
                      description: >-
                        Data di nascita (YYYY-MM-DD; corrisponde a
                        `date_of_birth`).
                    address:
                      type: object
                      description: >-
                        Oggetto indirizzo con `country` (ISO 3166-1 alpha-3),
                        `town`, `state`, `street`, `post_code`.
                    institutionInfo:
                      type: object
                      description: >-
                        Dettagli dell'istituto per partecipanti istituzionali
                        (corrisponde a `institution_details`).
                    device:
                      type: object
                      description: >-
                        Contesto esplicito del dispositivo opzionale. Viene
                        unito alle informazioni sul dispositivo acquisite
                        automaticamente; in caso di conflitto, prevalgono i
                        campi ricavati dal server.
                    paymentMethod:
                      type: object
                      description: >-
                        Metodo di pagamento usato dal soggetto (mappato su
                        `payment_method`).
                      properties:
                        type:
                          type: string
                          description: >-
                            Tipo di metodo di pagamento (mappato su
                            `method_type`), ad es. `bank_card`, `bank_account`,
                            `crypto_wallet`, `ewallet`, `unhosted_wallet`,
                            `other`.
                        accountId:
                          type: string
                          description: >-
                            Identificativo dell'account (mappato su
                            `account_id`): IBAN, impronta digitale della carta o
                            indirizzo.
                        issuingCountry:
                          type: string
                          description: >-
                            Codice paese ISO 3166-1 alpha-3 dell'emittente
                            (corrisponde a `issuing_country`).
                counterparty:
                  type: object
                  description: >-
                    La controparte della transazione (opzionale). Stessa
                    struttura di `subject`; in questo contesto `externalUserId`
                    è rilevante.
                  properties:
                    type:
                      type: string
                      description: >-
                        Tipo di entità (mappato su `entity_type`): `individual`
                        o `company`.
                    externalUserId:
                      type: string
                      description: >-
                        Il tuo identificatore interno per la controparte
                        (corrisponde a `vendor_data`).
                    fullName:
                      type: string
                    firstName:
                      type: string
                    lastName:
                      type: string
                    dob:
                      type: string
                      format: date
                    address:
                      type: object
                    institutionInfo:
                      type: object
                    device:
                      type: object
                    paymentMethod:
                      type: object
                      description: >-
                        Metodo di pagamento usato dalla controparte (mappato su
                        `payment_method`). Nelle transazioni travelRule, `type:
                        "unhosted_wallet"` dichiara il wallet della controparte
                        come in autocustodia: il trasferimento salta
                        l'instradamento verso il VASP della controparte, viene
                        creato direttamente in `UNCONFIRMED_OWNERSHIP` e (quando
                        `auto_wallet_verification` è abilitato) viene generata
                        automaticamente una sessione del widget di proprietà del
                        wallet restituita in `action_required` in modo che l'SDK
                        possa avviarla.
                      properties:
                        type:
                          type: string
                          description: >-
                            Tipologia di metodo di pagamento (mappata su
                            `method_type`), ad es. `bank_card`, `bank_account`,
                            `crypto_wallet`, `ewallet`, `unhosted_wallet`,
                            `other`. Usa `unhosted_wallet` per dichiarare un
                            wallet in autocustodia per la Travel Rule.
                        accountId:
                          type: string
                          description: >-
                            Identificativo dell'account (mappato su
                            `account_id`): IBAN, impronta digitale della carta o
                            indirizzo.
                        issuingCountry:
                          type: string
                props:
                  type: object
                  additionalProperties: true
                  description: >-
                    Coppie chiave-valore personalizzate (mappate su
                    `custom_properties`). Ciascuna chiave può essere
                    referenziata nelle condizioni delle regole come
                    `custom_values.<key>`.
                travelRule:
                  type: object
                  description: >-
                    Dettagli Travel Rule (corrisponde a `travel_rule_details`).
                    Quando Travel Rule è abilitata per l'applicazione, Didit
                    ignora qualsiasi `status` inviato e gestisce direttamente lo
                    scambio.
                  required:
                    - status
                  properties:
                    status:
                      type: string
                    protocol:
                      type: string
                    required:
                      type: boolean
                    obligationsCount:
                      type: integer
                    originatorData:
                      type: object
                    beneficiaryData:
                      type: object
                    metadata:
                      type: object
                includeCryptoScreening:
                  type: boolean
                  nullable: true
                  description: >-
                    Sostituzione per transazione per lo screening di analisi
                    della blockchain crypto (corrisponde a
                    `include_crypto_screening`).
                fingerprint_v2:
                  type: object
                  description: >-
                    Il payload del fingerprint del dispositivo `didit-fp-v2`.
                    Iniettato automaticamente dagli SDK; rilevante solo quando
                    si chiama direttamente l'API wire.
              required:
                - txnId
                - type
                - info
                - subject
            example:
              txnId: wd-2026-07-07-0042
              type: travelRule
              info:
                direction: out
                amount: '0.25'
                currency: ETH
                currencyType: crypto
                cryptoParams:
                  crypto_chain: ETH
              subject:
                fullName: Jane Doe
              counterparty:
                fullName: Ana Diaz
                paymentMethod:
                  type: unhosted_wallet
                  accountId: 0xBeneficiaryWallet01
              travelRule:
                status: AWAITING_COUNTERPARTY
                beneficiaryData:
                  wallet_address: 0xBeneficiaryWallet01
                  name: Ana Diaz
              includeCryptoScreening: true
      responses:
        '201':
          description: >-
            Transazione inviata e monitorata. Stessa struttura di dettaglio di
            `GET /v3/transactions/{transaction_id}/`, incluso il blocco
            `action_required` quando l'utente finale deve completare un'azione
            successiva (gli SDK la avviano automaticamente per impostazione
            predefinita).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransactionDetail'
              examples:
                Wallet ownership required:
                  value:
                    uuid: 22222222-3333-4444-5555-666666666666
                    txn_id: wd-2026-07-07-0042
                    transaction_type: travelRule
                    direction: OUTBOUND
                    status: APPROVED
                    amount: '0.25'
                    currency: ETH
                    travel_rule:
                      uuid: 33333333-4444-5555-6666-777777777777
                      status: UNCONFIRMED_OWNERSHIP
                      required: true
                    action_required:
                      type: wallet_ownership
                      url: https://verify.didit.me/wallet-ownership/3s9x...urlsafe
                      widget_session_id: 77777777-8888-9999-aaaa-bbbbbbbbbbbb
                      expires_at: '2026-07-07T13:00:00Z'
        '400':
          description: >-
            Validazione non riuscita (campi obbligatori mancanti, `txnId`
            duplicato, categoria sconosciuta).
          content:
            application/json:
              examples:
                Missing fields:
                  value:
                    transaction_details:
                      currency:
                        - This field is required.
                Duplicate txnId:
                  value:
                    transaction_id:
                      - A transaction with this transaction_id already exists.
        '401':
          description: >-
            Il token di transazione è stato rifiutato: mancante, sconosciuto,
            revocato, superiore al relativo `max_uses` o scaduto. Le risposte
            per token scaduto contengono sempre la parola `expired` nei
            dettagli, consentendo agli SDK di distinguere gli errori
            `expired_token` da `invalid_token`.
          content:
            application/json:
              examples:
                Invalid token:
                  value:
                    detail: Invalid transaction token.
                Expired token:
                  value:
                    detail: Transaction token expired.
        '409':
          description: >-
            Un'altra richiesta con lo stesso `txnId` ha creato la transazione
            mentre questa era in fase di elaborazione, quindi solo uno dei due
            invii simultanei ha esito positivo. Leggi la transazione esistente
            invece di inviarla nuovamente.
          content:
            application/json:
              examples:
                Concurrent duplicate:
                  value:
                    detail: A transaction with this transaction_id already exists.
      security:
        - TransactionTokenAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST https://verification.didit.me/v1/transactions/ \
              -H 'X-Transaction-Token: SDK_TOKEN' -H 'Content-Type: application/json' \
              -d '{"txnId": "wd-2026-07-07-0042", "type": "travelRule", "info": {"direction": "out", "amount": "0.25", "currency": "ETH", "currencyType": "crypto"}, "subject": {"fullName": "Jane Doe"}, "counterparty": {"fullName": "Ana Diaz", "paymentMethod": {"type": "unhosted_wallet", "accountId": "0xBeneficiaryWallet01"}}, "travelRule": {"status": "AWAITING_COUNTERPARTY", "beneficiaryData": {"wallet_address": "0xBeneficiaryWallet01", "name": "Ana Diaz"}}, "includeCryptoScreening": true}'
        - lang: javascript
          label: Web SDK
          source: |-
            import { DiditSdk } from '@didit-protocol/sdk-web';

            const result = await DiditSdk.shared.submitTransaction({
              transactionToken: sdkToken,
              transaction: {
                txnId: 'wd-2026-07-07-0042',
                category: 'travelRule',
                details: { direction: 'out', amount: '0.25', currency: 'ETH', currencyType: 'crypto' },
                subject: { fullName: 'Jane Doe' },
                counterparty: { fullName: 'Ana Diaz', paymentMethod: { type: 'unhosted_wallet', accountId: '0xBeneficiaryWallet01' } },
                travelRule: { status: 'AWAITING_COUNTERPARTY', beneficiaryData: { wallet_address: '0xBeneficiaryWallet01', name: 'Ana Diaz' } },
                includeCryptoScreening: true
              },
              onActionCompleted: (refreshed) => console.log(refreshed.status)
            });
components:
  schemas:
    TransactionDetail:
      type: object
      description: >-
        Record di monitoraggio completo per una transazione, come restituito da
        `GET /v3/transactions/{transaction_id}/` e `POST /v3/transactions/`.
      properties:
        uuid:
          type: string
          format: uuid
          description: >-
            Identificativo della transazione stabile di Didit. Utilizzalo come
            `{transaction_id}` per le chiamate successive.
        environment:
          type: string
          enum:
            - live
            - sandbox
          description: >-
            Ambiente dell'applicazione proprietaria della transazione. Una
            transazione in `sandbox` viene archiviata ma non viene mai valutata,
            sottoposta a screening, notificata o fatturata; pertanto, il valore
            vuoto di `rule_runs` indica "non valutata".
        transaction_number:
          type: integer
          description: >-
            Numero sequenziale della transazione con ambito limitato
            all'applicazione mostrato nella Console (es. `4123`).
        txn_id:
          type: string
          description: >-
            Il `transaction_id` fornito al momento della creazione (max 128
            caratteri). Univoco per applicazione.
        txn_date:
          type: string
          format: date-time
          description: >-
            Quando è avvenuta la transazione (da `transaction_at`; il valore
            predefinito è il momento dell'invio).
        zone_id:
          type: string
          nullable: true
          description: >-
            Identificatore di fuso orario IANA fornito al momento della
            creazione.
        transaction_type:
          type: string
          description: >-
            Categoria di primo livello così come memorizzata: `finance`, `kyc`,
            `travelRule`, `userPlatformEvent`, `gamblingBet`,
            `gamblingLimitChange`, `gamblingBonusChange`, `auditTrailEvent`.
            Nota che i valori composti da più parole vengono restituiti in
            camelCase anche se inviati in snake_case.
        action_type:
          type: string
          description: >-
            Sottotipo all'interno della categoria (ad es. `deposit`,
            `withdrawal`, `transfer`). Se non specificato, il valore predefinito
            coincide con la categoria.
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
          description: >-
            Direzione rispetto al soggetto. Memorizzato in maiuscolo
            indipendentemente dal formato inviato
            (`in`/`out`/`inbound`/`outbound` sono accettati in input).
        status:
          type: string
          enum:
            - APPROVED
            - IN_REVIEW
            - DECLINED
            - AWAITING_USER
          description: >-
            Verdetto di monitoraggio attuale. Le transazioni vengono create come
            `APPROVED`; le regole possono modificarle in `IN_REVIEW`/`DECLINED`
            in modo sincrono.
        source:
          type: string
          enum:
            - LIVE
            - IMPORTED
          description: >-
            In che modo ha avuto origine il record: `LIVE` per le transazioni
            inviate tramite API o SDK, `IMPORTED` per le transazioni caricate
            tramite l'importazione da console.
        amount:
          type: string
          description: >-
            Importo della transazione come stringa decimale senza zeri finali
            (es. `"1500"`, `"0.5"`, `"0.123456789012345678"`). Fino a 18 cifre
            decimali.
        currency:
          type: string
          description: >-
            Codice valuta di `amount`. Viene accettato qualsiasi codice
            alfabetico ISO 4217 (ad es. `EUR`, `USD`, `NGN`), così come il
            simbolo di un asset crypto (ad es. `BTC`). È preferibile utilizzare
            un codice attualmente in circolazione. Non tutti i codici accettati
            hanno un tasso di cambio: quando non ne è disponibile alcuno per il
            codice (ad esempio l'unità di conto ISO `XSU` o un simbolo crypto di
            cui Didit non calcola il prezzo), la conversione automatica non
            riesce e `preferred_currency_amount` viene restituito null a meno
            che la richiesta non abbia fornito un `amount_in_default_currency`
            pre-convertito.
        currency_type:
          type: string
          nullable: true
          description: '`fiat` o `crypto`, come inviato in `currency_kind`.'
        amount_in_default_currency:
          type: string
          nullable: true
          description: >-
            Importo pre-convertito fornito dall'utente, come stringa decimale
            priva di zeri finali.
        default_currency_code:
          type: string
          nullable: true
        preferred_currency_amount:
          type: string
          nullable: true
          description: >-
            `amount` convertito nella valuta preferita dell'applicazione, se
            disponibile.
        preferred_currency_code:
          type: string
          nullable: true
        payment_details:
          type: string
          nullable: true
          description: >-
            Riferimento di pagamento o promemoria in formato testo libero
            derivante dall'invio.
        payment_txn_id:
          type: string
          nullable: true
          description: >-
            Riferimento del sistema di pagamento esterno (ad es. hash della
            transazione blockchain) da `payment_reference_id`.
        score:
          type: integer
          description: >-
            Punteggio di rischio accumulato dalle regole (in genere 0–100). Più
            alto = più rischioso.
        severity:
          type: string
          nullable: true
          enum:
            - UNKNOWN
            - LOW
            - MEDIUM
            - HIGH
            - CRITICAL
          description: >-
            Gravità categoriale del rischio impostata da regole/provider
            (`UNKNOWN`, `LOW`, `MEDIUM`, `HIGH`, `CRITICAL`). `null` finché non
            viene impostata.
        decision_reason_code:
          type: string
          nullable: true
          description: Motivo leggibile dalla macchina per il `status` attuale.
        decision_reason_label:
          type: string
          nullable: true
          description: Etichetta di facile lettura per `decision_reason_code`.
        vendor_data:
          type: string
          nullable: true
          description: Copia per comodità di `vendor_data` del richiedente.
        metadata:
          type: object
          description: >-
            Istantanea dei payload di `subject` e `counterparty` così come
            inviati al momento della creazione.
        props:
          type: object
          description: >-
            Le `custom_properties` fornite al momento della creazione. Ciascuna
            chiave è accessibile nelle condizioni delle regole come
            `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: Indica se il tag è predefinito da Didit o personalizzato.
          description: Tag associati alla transazione (manualmente o tramite regole).
        parties:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              role:
                type: string
                enum:
                  - APPLICANT
                  - REMITTER
                  - BENEFICIARY
                  - COUNTERPARTY
                description: >-
                  Ruolo della parte. L'endpoint di creazione assegna `APPLICANT`
                  (il soggetto) e `COUNTERPARTY`.
              entity_type:
                type: string
                enum:
                  - individual
                  - company
                  - external
                  - unhostedWallet
              kind:
                type: string
                enum:
                  - USER
                  - BUSINESS
                  - EXTERNAL
                description: >-
                  Le parti `USER`/`BUSINESS` rimandano a un'entità di Didit
                  tramite `vendor_data`. Le parti `EXTERNAL` non hanno alcuna
                  entità Didit associata.
              vendor_data:
                type: string
                nullable: true
                description: Il tuo identificatore interno utente/azienda.
              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: >-
                  Codice del paese ricavato dal valore `address.country` inviato
                  (in genere ISO 3166-1 alpha-3).
              dob:
                type: string
                format: date
                nullable: true
                description: Data di nascita dal valore `date_of_birth` inviato.
              address:
                type: object
                description: Oggetto indirizzo così come inviato. `{}` se omesso.
              institution_info:
                type: object
                description: Dettagli dell'istituto così come inviati. `{}` se omessi.
              device:
                type: object
                description: >-
                  Contesto del dispositivo normalizzato, compreso
                  l'arricchimento IP lato server sotto network_context
                  (geolocalizzazione, flag VPN/data center) se è stato fornito
                  un indirizzo IP.
                properties:
                  fingerprint:
                    type: string
                    description: Impronta digitale univoca del dispositivo.
                  persistent_device_id:
                    type: string
                    description: >-
                      Identificatore stabile del dispositivo tra sessioni
                      diverse (schema di fingerprint v2).
                  user_agent:
                    type: string
                    description: Stringa user agent del browser o dell'app.
                  browser_family:
                    type: string
                    description: Famiglia del browser (es. Chrome, Firefox, Safari).
                  browser_version:
                    type: string
                    description: Stringa della versione del browser.
                  platform:
                    type: string
                    description: >-
                      Identificatore della piattaforma (web, ios, android,
                      macos, windows, linux).
                  os_family:
                    type: string
                    description: >-
                      Famiglia del sistema operativo (ad es. iOS, Android,
                      Windows).
                  os_version:
                    type: string
                    description: Stringa della versione del sistema operativo.
                  accept_language:
                    type: string
                    description: Valore dell'intestazione Accept-Language.
                  session_id:
                    type: string
                    description: Identificatore della sessione (archiviato nei metadati).
                  session_age_ms:
                    type: number
                    description: Età della sessione in millisecondi.
                  network_context:
                    type: object
                    description: Contesto di rete con indirizzo IP e geolocalizzazione.
                    properties:
                      ip_address:
                        type: string
                        description: Indirizzo IP del client.
                      ip_country_code:
                        type: string
                        description: Paese geolocalizzato dell'IP (ISO 3166-1 alpha-3).
                      latitude:
                        type: number
                        description: Latitudine geografica dell'IP.
                      longitude:
                        type: number
                        description: Longitudine geografica dell'IP.
              external_party_snapshot:
                type: object
                nullable: true
                description: >-
                  Copia congelata dei dati della parte per le parti `EXTERNAL`.
                  `null` finché la parte è collegata a un utente o a un'azienda
                  Didit.
          description: Parti della transazione (richiedente, controparte).
        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 su `type:account_id:issuing_country` — identificatore
                  stabile per correlare il riutilizzo dello stesso strumento.
              account_id:
                type: string
                nullable: true
                description: >-
                  Identificativo dell'account (IBAN, indirizzo, token della
                  carta, …).
              issuing_country:
                type: string
                nullable: true
              owner_kind:
                type: string
                enum:
                  - USER
                  - BUSINESS
                  - EXTERNAL
              vendor_data:
                type: string
                nullable: true
                description: Il tuo identificatore per l'utente o l'azienda proprietari.
              owner_name:
                type: string
                nullable: true
              institution_info:
                type: object
              details:
                type: object
                description: Oggetto `payment_method` non elaborato così come inviato.
              external_owner_snapshot:
                type: object
                nullable: true
              role:
                type: string
                enum:
                  - SOURCE
                  - DESTINATION
                  - FUNDING
                  - BENEFICIARY
                description: >-
                  Come è stato utilizzato questo metodo nella transazione.
                  L'endpoint di creazione assegna `SOURCE`/`DESTINATION` in base
                  alla direzione (in uscita: soggetto = SOURCE; in entrata:
                  soggetto = DESTINATION).
          description: Metodi di pagamento collegati alla transazione.
        documents:
          type: array
          description: >-
            File allegati alla transazione dalla console. `[]` se non ce ne
            sono.
          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 di download firmato di breve durata; recuperalo
                        quando necessario invece di memorizzarlo.
                    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: >-
                  Ad es. `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: >-
            Voci del registro delle attività (creazione, note, revisioni
            manuali, modifiche di stato).
        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: >-
            Attualmente sempre vuoto. Un alert aperto è una transazione con
            stato `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 della regola eseguita.
              rule_title:
                type: string
              rule_description:
                type: string
                nullable: true
              rule_category:
                type: string
              matched:
                type: boolean
                description: >-
                  Indica se le condizioni della regola corrispondevano a questa
                  transazione. L'esecuzione viene registrata solo per le regole
                  soddisfatte, pertanto le valutazioni in tempo reale riportano
                  sempre `true`.
              is_test:
                type: boolean
                description: >-
                  True quando la regola è stata eseguita in modalità TEST
                  (nessun effetto su stato/punteggio).
              mode:
                type: string
                enum:
                  - ACTIVE
                  - DISABLED
                  - TEST
              severity:
                type: string
                nullable: true
              score_delta:
                type: integer
                description: Punteggio aggiunto dalle azioni `add_score` di questa regola.
              status_target:
                type: string
                nullable: true
                description: Stato impostato da un'azione `change_status`, se presente.
              action_summary:
                type: string
                nullable: true
                description: >-
                  Riepilogo delle azioni eseguite dalla regola, unite con `; `
                  (ad es. `score +30; change_status:IN_REVIEW;
                  add_tag:high_risk_country`). Componenti: `score +N`,
                  `change_status:<STATUS>`, `add_tag:<name>`, `add_note`,
                  `add_to_list`, `open_case`. `null` quando la regola non ha
                  eseguito alcuna azione.
              metadata:
                type: object
                description: >-
                  Dettaglio di valutazione: `scope_match`, `conditions[]` e
                  `aggregations[]`. Ogni voce di condizione include `field`,
                  `operator`, `expected_value`, il `current_value` letto dalla
                  transazione, `matched`, `group_index` e `group_logic`. Ogni
                  voce di aggregazione (frequenza / conteggio / somma) include
                  `metric`, `field`, `operator`, `expected_value`, il
                  `computed_value` a cui è stata valutata l'aggregazione,
                  `window`, `filters`, `matched` e `sample_references`; le
                  aggregazioni asincrone differite hanno `computed_value: null`
                  e `deferred: true`. Un gruppo di condizioni nidificato è una
                  voce `conditions[]` con `operator` `any_of` o `all_of`,
                  `field` null e i risultati dei relativi membri all'interno del
                  proprio `conditions`.
              created_at:
                type: string
                format: date-time
          description: >-
            Risultati dell'esecuzione per regola: quale regola è scattata, con
            quale impatto sul punteggio.
        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 di risposta del provider non elaborato.
              created_at:
                type: string
                format: date-time
          description: >-
            Payload non elaborati del provider (screening AML, analisi
            blockchain, ecc.).
        travel_rule:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/TransactionTravelRule'
          description: >-
            Trasferimento o controllo Travel Rule. Valorizzato quando
            `travel_rule_details` è stato inviato e anche quando Travel Rule è
            abilitata e la transazione è stata creata con `transaction_category:
            travelRule` (Didit avvia lo scambio direttamente, anche senza
            `travel_rule_details`). `null` quando non esiste alcun trasferimento
            o controllo. In un trasferimento in entrata, `originator_data` e
            `beneficiary_data` della controparte rimangono mascherati
            (`data_masked: true`) finché non viene confermato l'assetto
            proprietario del wallet.
        network_snapshot:
          type: object
          nullable: true
          description: >-
            Snapshot del grafo delle transazioni/parti correlate utilizzato dal
            motore di regole. È il `network_snapshot` inviato con la transazione
            oppure il grafo che Didit crea da uno Screening AML del wallet
            riuscito (che sostituisce quello inviato). `null` quando nessuno dei
            due è presente.
          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: >-
            Sessione di remediation offerta all'utente quando è richiesta una
            nuova verifica. Sostituita da `action_required`, che costituisce il
            blocco canonico; mantenuta per retrocompatibilità.
          properties:
            session_id:
              type: string
            session_token:
              type: string
            url:
              type: string
              format: uri
            status:
              type: string
        action_required:
          type: object
          nullable: true
          description: >-
            Azione richiesta all'utente finale e ancora in sospeso per
            completare questa transazione, oppure null quando non ce n'è alcuna.
            Gli SDK di Didit avviano automaticamente l'azione per impostazione
            predefinita e aggiornano la transazione al termine. Due varianti,
            distinte da `type`: `verification_session` (una sessione di verifica
            ospitata creata da un'azione di una regola) e `wallet_ownership`
            (una sessione del widget di proprietà del wallet generata
            automaticamente per un trasferimento Travel Rule che richiede la
            prova di controllo del wallet, regolata dall'impostazione Travel
            Rule `auto_wallet_verification`). Quando potrebbero essere applicate
            entrambe, `wallet_ownership` ha la precedenza perché blocca lo
            scambio 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: >-
            Costo di questa transazione: `total_price` e `items`, uno per ogni
            addebito, ciascuno con `usage_type`, `price`, `details` e
            `created_at`. Un nuovo screening della stessa transazione
            costituisce una nuova voce.
    TransactionTravelRule:
      type: object
      description: >-
        Il trasferimento Travel Rule di una transazione, come restituito da `GET
        /v3/transactions/{transaction_id}/`, dal `201` di `POST
        /v3/transactions/` e da ciascuna riga di `GET /v3/transactions/`.
        `direction`, `rail`, `counterparty_vasp`, `delivery`, `discovery`,
        `reason` e `next_actions` hanno la stessa struttura di `PATCH
        /v3/transactions/{transaction_id}/travel-rule/`, quindi una singola
        lettura di una transazione indica perché il suo trasferimento è bloccato
        e cosa consente di farlo avanzare.
      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: >-
            Soggetto ordinante. Per un trasferimento in entrata, i valori della
            controparte sono oscurati fino alla conferma dell'assetto
            proprietario.
        beneficiary_data:
          type: object
          description: >-
            Parte beneficiaria. Per un trasferimento in entrata i valori della
            controparte sono mascherati fino a quando non viene confermato
            l'assetto proprietario.
        name_match:
          type: object
          nullable: true
          description: >-
            Il confronto dei nomi che ha determinato il trasferimento (punteggio
            e livello di rigore). Null fino all'esecuzione. I nomi confrontati
            vengono oscurati insieme alle parti.
        data_match:
          $ref: '#/components/schemas/TravelRuleDataMatch'
        mismatched_fields:
          type: array
          items:
            type: string
          description: >-
            Scorciatoia per `data_match.mismatched_fields`. Vuoto quando non ci
            sono differenze.
        data_unmasked:
          $ref: '#/components/schemas/TravelRuleDataUnmasked'
        data_masked:
          type: boolean
          description: >-
            True mentre i dati personali della controparte sono mascherati in
            questa risposta.
        metadata:
          type: object
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
          description: Quale lato dello scambio rappresenta questo trasferimento.
        rail:
          type: string
          nullable: true
          description: >-
            Il canale (rail) utilizzato per il trasferimento: `INTERNAL`, `TRP`,
            `GTR`, `TRUST`, `VERIFYVASP`, `SYGNA` o `EMAIL` (`TEST_VASP` su
            un'applicazione sandbox, quando il Didit Test VASP ha risposto),
            oppure `null` finché non viene scelto un canale.
        counterparty_vasp:
          type: object
          nullable: true
          properties:
            name:
              type: string
            lei:
              type: string
            dd_score:
              type: integer
              description: >-
                Punteggio di due diligence da 0 a 100, dove un valore più alto è
                migliore. Stessa scala utilizzata nella directory dei VASP.
            dd_score_breakdown:
              type: object
              description: >-
                Contributi per componente a dd_score, un oggetto per componente
                come nella directory VASP (giurisdizione, verifica, protocollo,
                lei, cronologia, elementi essenziali, reattività), ciascuno con
                {points, max, reason, detail}. {} finché la controparte non è
                stata valutata.
              additionalProperties:
                type: object
                properties:
                  points:
                    type: number
                    description: Punti assegnati per questo componente.
                  max:
                    type: integer
                    description: Punti massimi che questo componente può assegnare.
                  reason:
                    type: string
                    description: Codice leggibile dalla macchina dell'esito del componente.
                  detail:
                    type: string
                    description: Motivo leggibile dall'utente per i punti assegnati.
            dd_assessed_at:
              type: string
              format: date-time
              nullable: true
              description: >-
                Data e ora dell'ultima esecuzione della valutazione di adeguata
                verifica. Null finché la controparte non è stata valutata.
          description: >-
            La voce di directory della controparte, oppure `null` se il
            trasferimento non ne collega alcuna.
        delivery:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/TravelRuleDelivery'
          description: >-
            Il messaggio più recente che il trasferimento deve a un'altra parte.
            `null` quando non ne ha dovuti, ad esempio al di sotto di
            `threshold_amount` o per un wallet in autocustodia dichiarato.
        discovery:
          type: array
          description: >-
            Modalità con cui Didit ha cercato la controparte, una voce per ogni
            passaggio eseguito. Vuoto se non è stata eseguita alcuna ricerca, ad
            esempio per un trasferimento in entrata.
          items:
            $ref: '#/components/schemas/TravelRuleDiscoveryStep'
        reason:
          type: string
          description: >-
            Il motivo per cui un trasferimento `COUNTERPARTY_VASP_NOT_FOUND` o
            `COUNTERPARTY_VASP_NOT_REACHABLE` è bloccato; `""` per qualsiasi
            altro stato. Una consegna non riuscita lo determina per prima, solo
            su `COUNTERPARTY_VASP_NOT_REACHABLE`: `email_undeliverable` (il
            provider di posta ha rifiutato l'email di compliance e non è rimasto
            alcun indirizzo da provare: quando è stata inviata, in un promemoria
            o come bounce permanente segnalato successivamente) o
            `delivery_failed` (il canale che effettuava la consegna è fallito
            definitivamente: un canale di rete ha rifiutato il messaggio o ha
            esaurito i tentativi, un host di identità `TRP` non ha risposto o
            l'host `TRP` della controparte non ha accettato la richiesta).
            Altrimenti lo determina la traccia di `discovery`:
            `awaiting_end_user` (nessun passaggio ha indicato una controparte
            raggiungibile da Didit), `directory_match_no_route` (un passaggio ha
            indicato un VASP della directory privo di rotta),
            `picked_member_without_proven_wallet` (l'utente finale ha scelto un
            cliente Didit che non ha dimostrato il controllo del wallet) o
            `no_directory_match` quando la traccia non fornisce altri motivi. Un
            nuovo invio fa avanzare il trasferimento, quindi il motivo viene
            azzerato. Consulta [Perché un trasferimento è
            bloccato](/it/transaction-monitoring/travel-rule#perché-un-trasferimento-è-bloccato).
        next_actions:
          type: array
          description: >-
            Cosa fa procedere il trasferimento; `[]` per qualsiasi stato tranne
            `COUNTERPARTY_VASP_NOT_FOUND` o `COUNTERPARTY_VASP_NOT_REACHABLE`.
            `email_undeliverable` propone `update_compliance_email`, poi
            `resend`. `delivery_failed` propone `resend`. Un motivo di discovery
            propone `select_counterparty_vasp`, `declare_self_hosted`,
            `add_vasp_hint` e `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 di verifica ospitato da aprire per l'utente finale.
        session_id:
          type: string
          format: uuid
          description: ID della sessione di verifica.
        session_token:
          type: string
          description: >-
            Token di sessione, utilizzato dagli SDK per dispositivi mobili per
            avviare il flusso in modo nativo.
        status:
          type: string
          description: Stato della sessione di verifica.
      required:
        - type
        - url
    TransactionWalletOwnershipAction:
      title: Wallet ownership
      type: object
      properties:
        type:
          type: string
          enum:
            - wallet_ownership
        url:
          type: string
          format: uri
          description: >-
            URL del widget ospitato per la titolarità del wallet. Aprilo in una
            vera interfaccia browser: su mobile usa SFSafariViewController o un
            Chrome Custom Tab, mai una webview integrata.
        widget_session_id:
          type: string
          format: uuid
          description: ID di sessione del widget di titolarità del wallet.
        expires_at:
          type: string
          format: date-time
          description: Quando scade la sessione del widget.
      required:
        - type
        - url
    TravelRuleDataMatch:
      type: object
      nullable: true
      description: >-
        Confronto campo per campo tra i dati della parte del trasferimento e ciò
        che l'altra parte sa sul titolare del wallet. Riporta i nomi dei campi e
        i risultati, mai i valori, in modo che rimanga leggibile mentre i dati
        della controparte sono oscurati. Null finché non viene eseguito un
        confronto.
      properties:
        matched:
          type: boolean
          description: True quando nessun campo confrontato differisce.
        mismatched_fields:
          type: array
          items:
            type: string
            enum:
              - name
              - date_of_birth
              - address
              - account
          description: I campi che differiscono.
        fields:
          type: object
          description: >-
            Una voce per ciascun campo confrontato per il tipo di entità della
            parte (`name`, `date_of_birth`, `address`, `account`; un'azienda non
            ha `date_of_birth`).
          additionalProperties:
            type: object
            properties:
              result:
                type: string
                enum:
                  - matched
                  - mismatched
                  - not_compared
                description: >-
                  `not_compared` quando la regola è `NONE` o una delle due parti
                  non ha un valore per il campo.
              strictness:
                type: string
                enum:
                  - NONE
                  - STRICT
                  - CONTAINS
                  - DEFAULT
                  - FUZZY
    TravelRuleDataUnmasked:
      type: object
      nullable: true
      description: >-
        Registro di audit del momento in cui i dati della controparte sono stati
        smascherati. Null finché i dati sono ancora mascherati e per i
        trasferimenti in uscita.
      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: >-
            Cosa ha confermato l'assetto proprietario: ownership_confirmed (la
            tua conferma tramite la console o l'API), wallet_proof (una prova
            del wallet nel widget o un trasferimento in entrata INTERNAL,
            impostato al momento della creazione), address_book_match (un wallet
            verificato nella rubrica), own_verified_wallet (il wallet verificato
            del tuo utente), inquiry_approved (la tua approvazione di una
            richiesta TRP in entrata o di un messaggio GTR o Sygna),
            known_payment_method (un wallet con cui il tuo utente ha già pagato)
            o travel_address (il Travel Address associato al wallet ha
            denominato il wallet).
        actor:
          type: string
          description: >-
            Chi l'ha confermata: l'email dell'utente della console o l'etichetta
            della chiave API. Vuoto per una decisione automatica.
    TravelRuleDelivery:
      type: object
      description: >-
        Lo stato dell'ultimo messaggio dovuto dal trasferimento alla
        controparte. Didit contatta la controparte dopo la restituzione della
        richiesta che ha creato o modificato il trasferimento, quindi questo
        oggetto indica se tale messaggio è andato a buon fine: in coda, in fase
        di invio, in attesa di un nuovo tentativo dopo un errore, consegnato o
        non riuscito. In caso di errore da cui la rete può ancora riprendersi
        (nessuna risposta in tempo, connessione non riuscita, HTTP `408`, `429`
        o `5xx`), viene effettuato un nuovo tentativo dopo 30 secondi, 2 minuti,
        10 minuti, 30 minuti e 1 ora. Quando un primo messaggio (`kind: SEND`)
        fallisce definitivamente, perché la rete lo ha rifiutato o anche il
        sesto tentativo non è riuscito, il trasferimento passa a
        `COUNTERPARTY_VASP_NOT_REACHABLE` con `last_error` nella sua `timeline`;
        qualsiasi altro messaggio che fallisce definitivamente viene annotato
        nella `timeline`. Lo `status` del trasferimento rimane l'unica fonte di
        verità per lo scambio stesso.
      required:
        - kind
        - status
        - rail
        - attempts
        - last_error
        - next_attempt_at
        - delivered_at
      properties:
        kind:
          type: string
          enum:
            - SEND
            - ANSWER
            - TXID
            - CANCEL
            - POLL
          description: >-
            Cosa trasporta il messaggio. `SEND`: il primo messaggio del
            trasferimento verso la controparte (in uscita; il canale viene
            scelto al momento dell'invio). `ANSWER`: la tua accettazione o
            rifiuto, dovuta alla rete che ha effettuato la richiesta (in
            entrata). `TXID`: l'hash della transazione on-chain, dopo aver
            completato il trasferimento. `CANCEL`: l'annullamento, dopo averlo
            cancellato. `POLL`: una richiesta di stato verso una rete che la
            supporta, ripetuta ogni 5 minuti mentre il trasferimento è in attesa
            della controparte.
        status:
          type: string
          enum:
            - QUEUED
            - SENDING
            - RETRYING
            - DELIVERED
            - FAILED
          description: >-
            `QUEUED`: in attesa di invio. `SENDING`: tentativo in corso.
            `RETRYING`: un tentativo non è riuscito e il prossimo verrà eseguito
            alle `next_attempt_at`. `DELIVERED`: l'altra parte ha ricevuto il
            messaggio. `FAILED`: l'altra parte lo ha rifiutato o l'ultimo
            tentativo non è riuscito.
        rail:
          type: string
          enum:
            - INTERNAL
            - TRP
            - GTR
            - TRUST
            - VERIFYVASP
            - SYGNA
            - EMAIL
            - ''
          description: >-
            Il canale (rail) che trasporta il messaggio. Vuoto finché Didit non
            ne sceglie uno per un primo messaggio.
        attempts:
          type: integer
          minimum: 0
          description: >-
            Tentativi effettuati finora per questo messaggio. Per un messaggio
            che non è un polling di stato vengono effettuati al massimo 6
            tentativi.
        last_error:
          type: string
          description: >-
            Il tipo di errore riscontrato nell'ultimo tentativo, `""` se non ce
            ne sono stati: ad esempio `email undeliverable`, `trp identity
            endpoint unreachable` o `trp transfer inquiry delivery failed`. Non
            contiene mai la risposta della controparte stessa, che rimane nella
            `timeline` del trasferimento.

            Quando GTR risponde con un errore, vengono inclusi il codice di
            stato e il messaggio restituiti. I corpi della risposta non vengono
            mai inclusi.
          example: email undeliverable
        next_attempt_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Quando verrà eseguito il prossimo tentativo mentre il messaggio è in
            stato `QUEUED` o `RETRYING`.
        delivered_at:
          type: string
          format: date-time
          nullable: true
          description: Quando l'altra parte ha preso in carico il messaggio.
    TravelRuleDiscoveryStep:
      type: object
      description: >-
        Un passaggio del rilevamento della controparte eseguito da Didit per un
        trasferimento in uscita, nell'ordine in cui è stato eseguito. Il primo
        passaggio che identifica un VASP con un percorso conclude la catena.
      properties:
        step:
          type: string
          enum:
            - internal_address_book
            - wallet_attribution
            - network_lookup
            - customer_hint
            - end_user
          description: >-
            `internal_address_book`: un altro cliente Didit che ha dimostrato il
            controllo del wallet di destinazione. `wallet_attribution`:
            l'attribuzione di analisi blockchain del wallet. `network_lookup`:
            una rete in grado di indicare quale VASP detiene l'indirizzo.
            `customer_hint`: il nome del VASP, LEI o la giurisdizione che hai
            inviato in `beneficiary_data`. `end_user`: la controparte scelta
            dall'utente finale (o da te), oppure la richiesta di sceglierne una.
        outcome:
          type: string
          enum:
            - match
            - miss
            - skipped
          description: >-
            `match`: il passaggio ha indicato una controparte. `miss`: è stato
            eseguito e non ne ha trovata nessuna. `skipped`: non è stato
            possibile eseguirlo e `reason` ne indica il motivo.
        reason:
          type: string
          description: >-
            Motivo leggibile dalla macchina, `""` in caso di corrispondenza:
            `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: >-
            Il VASP della directory indicato dal passaggio, qualora ne abbia
            indicato uno.
        rail:
          type: string
          nullable: true
          description: >-
            Il canale (rail) che raggiunge tale controparte, quando il passaggio
            ne ha trovato uno.
        at:
          type: string
          format: date-time
    TravelRuleNextAction:
      type: object
      description: >-
        Un elemento che consente di far progredire un trasferimento bloccato
        nello stato `COUNTERPARTY_VASP_NOT_FOUND` o
        `COUNTERPARTY_VASP_NOT_REACHABLE`. Consulta [Perché un trasferimento è
        bloccato](/it/transaction-monitoring/travel-rule#perché-un-trasferimento-è-bloccato).
      properties:
        action:
          type: string
          enum:
            - select_counterparty_vasp
            - declare_self_hosted
            - add_vasp_hint
            - update_compliance_email
            - resend
          description: >-
            `select_counterparty_vasp`: l'utente finale seleziona il VASP di
            destinazione nel widget di titolarità del wallet, oppure invii una
            richiesta PATCH con `action=beneficiary_vasp`.
            `declare_self_hosted`: l'utente finale dichiara che il wallet è in
            autocustodia nel widget. `add_vasp_hint`: indica a Didit chi è la
            controparte specificando nome del VASP, LEI o Travel Address (ad
            esempio un `travel_address` nella voce della rubrica del wallet di
            destinazione), quindi invia nuovamente. `update_compliance_email` e
            `resend` sono valori di `action` per `PATCH
            /v3/transactions/{transaction_id}/travel-rule/`: fornisci nuovamente
            l'email di compliance della controparte ed esegui nuovamente
            l'instradamento.
        url:
          type: string
          format: uri
          description: >-
            Il link al widget di verifica della proprietà del wallet, su
            `select_counterparty_vasp` e `declare_self_hosted` mentre il
            trasferimento ha una sessione widget aperta.
      required:
        - action
    TravelRuleChainDetails:
      type: object
      description: >-
        In che modo la blockchain del trasferimento identifica i suoi due
        wallet, quando si tratta di più di un indirizzo che ne paga un altro.
        Vuoto (`{}`) per un trasferimento su blockchain basata su account (EVM,
        Solana, Tron), dove i due indirizzi corrispondono ai wallet. La
        corrispondenza, l'instradamento e la rubrica leggono innanzitutto i
        wallet da qui.
      properties:
        chain:
          type: string
          description: >-
            Rete blockchain canonica, ad es. `BTC`, `XRP` o `LIGHTNING` per un
            trasferimento Lightning.
        shape:
          type: string
          enum:
            - utxo
            - memo
            - lightning
        originator:
          $ref: '#/components/schemas/TravelRuleChainSide'
        beneficiary:
          $ref: '#/components/schemas/TravelRuleChainSide'
        utxo:
          type: object
          description: >-
            Su un trasferimento UTXO: gli input e gli output come memorizzati
            (importi come stringhe decimali) e quali output Didit ha
            interpretato come cosa.
          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: Output che rimborsano un indirizzo di input.
            beneficiary_output_index:
              type: integer
              nullable: true
              description: >-
                L'output che paga il beneficiario; null quando non è stato
                possibile distinguerne alcuno.
        lightning:
          type: object
          description: >-
            Su un trasferimento Lightning: ciò che indica la richiesta di
            pagamento. Sempre `kind` (`bolt11`, `bolt12_offer`,
            `bolt12_invoice`, `bolt12_invoice_request`, `lnurl`,
            `lightning_address`, `node_id` o `unknown`); una fattura BOLT11
            aggiunge `network`, `payee_node_id`, `payment_hash`, `amount_msat`,
            `created_at` e `expires_at`; una stringa BOLT12 `blinded_paths` e
            `payee_node_id`; un LNURL o un Lightning Address il suo `domain`.
            Nulla viene risolto sulla rete: la richiesta viene solo
            decodificata.
          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: >-
            Incongruenze UTXO da esaminare: l'ordinante dichiarato non è un
            input, il beneficiario dichiarato non è un output, non è stato
            possibile distinguere un singolo output del beneficiario, oppure
            l'output del beneficiario corrisponde a un importo diverso rispetto
            a quello indicato nella transazione.
        not_applicable_reason:
          type: string
          enum:
            - LIGHTNING_NO_PAYEE_IDENTIFIER
            - LIGHTNING_BOLT12_BLINDED_PAYEE
            - LIGHTNING_LNURL_NAMES_NO_PAYEE
          description: >-
            Su un trasferimento Lightning in uscita la cui richiesta di
            pagamento non indica alcun beneficiario: perché il trasferimento è
            `NOT_APPLICABLE`. `LIGHTNING_NO_PAYEE_IDENTIFIER` (la richiesta non
            indica alcun nodo beneficiario o non è stato possibile
            decodificarla), `LIGHTNING_BOLT12_BLINDED_PAYEE` (l'offerta nasconde
            il proprio beneficiario dietro percorsi ciechi),
            `LIGHTNING_LNURL_NAMES_NO_PAYEE` (un LNURL indica un servizio, non
            un beneficiario). Lo stesso codice apre l'ultima voce `timeline` del
            trasferimento.
    TravelRuleChainSide:
      type: object
      description: >-
        Il wallet di una delle parti, così come Didit lo ha risolto a partire
        dai dati della blockchain.
      properties:
        address:
          type: string
          description: >-
            Il wallet. Su una rete con memo l'indirizzo classico (un X-address
            XRP viene suddiviso nel relativo indirizzo classico e tag); su
            Lightning l'ID del nodo del beneficiario o il Lightning Address.
        memo:
          type: string
          description: Il destination tag o memo che fa parte del wallet; `""` se assente.
        source:
          type: string
          enum:
            - declared
            - x_address
            - largest_input
            - only_non_change_output
            - amount_match
            - invoice_payee
            - updated
          description: >-
            Origine del wallet: `declared` (la tua richiesta), `x_address`
            (estratto da un X-address XRP), `largest_input` (l'indirizzo di
            input UTXO che ha contribuito maggiormente),
            `only_non_change_output` (l'unico output UTXO non di resto),
            `amount_match` (l'unico output UTXO che paga l'importo del
            trasferimento), `invoice_payee` (il beneficiario indicato in una
            richiesta di pagamento Lightning), `updated` (impostato
            successivamente con `action: update_originator_wallet`).
    TravelRuleUtxoEntry:
      type: object
      description: >-
        Un input o output di una transazione UTXO, così come registrato dalla
        blockchain.
      required:
        - address
      properties:
        address:
          type: string
          maxLength: 128
        amount:
          type: string
          nullable: true
          description: >-
            Stringa decimale nell'unità propria della moneta (BTC, non satoshi).
            Facoltativo.
          example: '0.0125'
        txid:
          type: string
          maxLength: 128
          description: Opzionale. La transazione utilizzata da un input.
        vout:
          type: integer
          nullable: true
          minimum: 0
          description: Opzionale. L'indice di output speso da un input.
  securitySchemes:
    TransactionTokenAuth:
      type: apiKey
      in: header
      name: X-Transaction-Token
      description: >-
        Token con ambito limitato di breve durata generato dal tuo backend
        tramite POST /v3/transactions/sdk-token/. Utilizzato dagli SDK Didit
        sugli endpoint /v1/transactions/ esposti ai dispositivi.

````

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