> ## 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 criação de transação: envio ao KYT

> Envie uma transação ao KYT da Didit para pontuação de risco, triagem e Travel Rule. 1,000 transações por mês incluídas, depois $0.001 cada.



Prompt da API de criação de transação
        Copiar o prompt para a área de transferência



      
      

\<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 — rate limited; back off 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>



      
      

Colar em



## OpenAPI

````yaml pt-br/openapi-25.json POST /v3/transactions/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de verificação de identidade. Autentique-se com o cabeçalho x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/transactions/:
    post:
      tags:
        - Transactions
      summary: Criar transação
      description: >-
        Envie uma transação para monitoramento síncrono de AML/risco. A
        transação é criada como `APPROVED`; em seguida, suas regras (e a triagem
        de cripto, quando aplicável) são executadas em linha e podem alterar o
        `status` retornado para `IN_REVIEW` ou `DECLINED`. **`transaction_id` é
        sua chave de idempotência** (máx. 128 caracteres, única por aplicação);
        reutilizá-la retorna 400. Um webhook `transaction.created` é disparado
        em caso de sucesso para aplicações em produção. Aplicações sandbox não
        são faturadas e não emitem webhooks `transaction.created` nem
        `transaction.status.updated`. As trocas de Travel Rule em sandbox
        emitem, sim, webhooks `travel_rule.status.updated` com `environment:
        sandbox`. Uma transferência de Travel Rule é armazenada e retornada
        antes que qualquer contraparte seja contatada: `travel_rule.status`
        volta como `AWAITING_COUNTERPARTY` (ou `NOT_APPLICABLE` abaixo do seu
        limiar, `UNCONFIRMED_OWNERSHIP` para uma carteira autocustodiada
        declarada, `COMPLETED` quando a outra carteira é a sua própria carteira
        verificada) e `travel_rule.protocol` é null. Em seguida, a Didit escolhe
        o canal e envia a troca, e cada mudança posterior de status da
        transferência, incluindo `COUNTERPARTY_VASP_NOT_FOUND` quando nenhum
        canal alcança a contraparte, chega como um webhook
        `travel_rule.status.updated`. Suas regras são executadas novamente
        quando o canal ou o status muda.
      operationId: createTransaction
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                transaction_id:
                  type: string
                  description: >-
                    Seu identificador exclusivo desta transação (no máximo 128
                    caracteres).
                  example: your-txn-2026-05-17-001
                transaction_at:
                  type: string
                  format: date-time
                  description: >-
                    Quando a transação ocorreu. Se omitido, o padrão é o momento
                    atual.
                time_zone:
                  type: string
                  description: >-
                    Identificador de fuso horário IANA, por exemplo
                    `Europe/Madrid`.
                transaction_category:
                  type: string
                  description: >-
                    Categoria da transação. Aliases em CamelCase (`travelRule`,
                    `userPlatformEvent`, `gamblingBet`, …) também são aceitos; o
                    valor armazenado e retornado fica em camelCase para
                    categorias com mais de uma palavra.
                  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: Detalhes financeiros principais da transação.
                  required:
                    - direction
                    - amount
                    - currency
                  properties:
                    direction:
                      type: string
                      description: >-
                        Direção da transação em relação ao titular. Não
                        diferencia maiúsculas de minúsculas; `in`/`out` são
                        aceitos como aliases. Retornada em maiúsculas
                        (`INBOUND`/`OUTBOUND`).
                      example: outbound
                      enum:
                        - inbound
                        - outbound
                        - in
                        - out
                    amount:
                      type: number
                      description: >-
                        Valor da transação (até 18 casas decimais). Envie-o como
                        string decimal (por exemplo, `"0.123456789012345678"`)
                        quando a precisão exata for importante: um número JSON é
                        primeiro interpretado como float binário, então os
                        dígitos além de cerca de 15 dígitos significativos são
                        arredondados antes de o valor ser armazenado. Deve ser
                        zero ou maior: a direção carrega o sinal, e um valor
                        negativo retorna `400`.
                      example: 1500
                    currency:
                      type: string
                      description: >-
                        Código da moeda. Qualquer código alfabético ISO 4217 é
                        aceito (por exemplo, `EUR`, `USD`, `NGN`), assim como o
                        símbolo de um criptoativo (por exemplo, `BTC`). Prefira
                        um código atualmente em circulação. Nem todo código
                        aceito tem uma taxa de câmbio: quando não há nenhuma
                        disponível para o código (por exemplo, a unidade
                        contábil ISO `XSU` ou um símbolo de criptoativo que a
                        Didit não precifica), a conversão automática falha e
                        `preferred_currency_amount` é retornado como null, a
                        menos que a requisição tenha fornecido um
                        `amount_in_default_currency` já convertido.
                      example: EUR
                    currency_kind:
                      type: string
                      description: Se a moeda é `fiat` ou `crypto`.
                    amount_in_default_currency:
                      type: number
                      nullable: true
                      description: >-
                        Valor já convertido na moeda padrão. Se omitido,
                        tenta-se a conversão cambial automática. Deve ser zero
                        ou maior.
                    default_currency:
                      type: string
                      description: >-
                        O código de moeda padrão para o valor convertido.
                        Qualquer código ISO 4217 atualmente em circulação.
                    payment_details:
                      type: string
                      nullable: true
                      description: Referência ou memorando de pagamento em texto livre.
                    payment_reference_id:
                      type: string
                      nullable: true
                      description: >-
                        Referência do sistema de pagamento externo. Para a
                        triagem AML de criptomoedas por hash de transação, envie
                        o hash da transação na blockchain e informe também
                        `subject.payment_method.account_id` com o endereço
                        relacionado.
                    action_type:
                      type: string
                      nullable: true
                      description: >-
                        Subtipo da transação, por exemplo `deposit`,
                        `withdrawal`, `transfer`.
                    crypto_params:
                      type: object
                      description: >-
                        Seleção da rede cripto, separada da moeda (o símbolo do
                        ativo). Registrar um símbolo de token personalizado não
                        garante cobertura de hash de transação para o respectivo
                        contrato.
                      properties:
                        crypto_chain:
                          type: string
                          description: >-
                            Rede efetivamente usada na triagem. A triagem
                            gerenciada oferece suporte a 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) e HBAR
                            (Hedera). Nomes comuns de redes também são aceitos,
                            por exemplo POLYGON ou POL para MATIC, BSC para BNB
                            e TRON para TRX. Sempre especifique este campo para
                            tokens multirrede. Quando ele estiver ausente para
                            USDT, USDC ou ETH enviados com um hash de transação
                            0x, a Didit procura o hash na Ethereum, BNB Chain,
                            Polygon, Base, Arbitrum e Optimism e faz a triagem
                            na rede onde ele for encontrado; se nenhuma rede
                            tiver o hash, a transação não passa pela triagem e
                            custom_values.aml_screening_status fica como FAILED,
                            com o motivo em custom_values.aml_screening_error.
                            Quando ele estiver ausente para USDT ou USDC triados
                            por carteira (sem hash de transação), um endereço
                            Tron é triado na Tron, um endereço Solana na Solana
                            e um endereço 0x na primeira dessas seis redes em
                            que ele tenha enviado uma transação ou detenha o
                            token, ou na Ethereum quando não estiver ativo em
                            nenhuma delas. A cobertura dos provedores conectados
                            varia; LIGHTNING exige um provedor conectado
                            compatível.
                          example: BASE
                subject:
                  type: object
                  description: O titular (solicitante) da transação.
                  required:
                    - vendor_data
                    - full_name
                  properties:
                    entity_type:
                      type: string
                      description: 'Tipo de entidade: `individual` ou `company`.'
                    vendor_data:
                      type: string
                      description: Seu identificador interno de usuário/empresa.
                      example: user-12345
                    full_name:
                      type: string
                      description: Nome completo do titular.
                      example: Maria Garcia
                    first_name:
                      type: string
                      description: Primeiro nome do titular.
                    last_name:
                      type: string
                      description: Sobrenome do titular.
                    date_of_birth:
                      type: string
                      format: date
                      description: Data de nascimento (YYYY-MM-DD).
                    address:
                      type: object
                      description: Objeto de endereço.
                      properties:
                        country:
                          type: string
                          description: >-
                            Código do país (recomenda-se ISO 3166-1 alpha-3).
                            Copiado para o `country_code` da parte.
                        town:
                          type: string
                        state:
                          type: string
                        street:
                          type: string
                        post_code:
                          type: string
                    institution_details:
                      type: object
                      description: Dados da instituição (para titulares institucionais).
                      properties:
                        name:
                          type: string
                        code:
                          type: string
                        address:
                          type: object
                    device_context:
                      type: object
                      description: >-
                        Contexto do dispositivo capturado no momento da
                        transação. browser_family e platform devem ser enviados
                        como chaves explícitas de nível superior, pois não são
                        derivados de user_agent. O alias em camelCase device
                        também é aceito na requisição.
                      properties:
                        fingerprint:
                          type: string
                          description: Impressão digital única do dispositivo.
                        persistent_device_id:
                          type: string
                          description: >-
                            Identificador estável do dispositivo entre sessões
                            (esquema de fingerprint v2).
                        user_agent:
                          type: string
                          description: >-
                            String de user agent do navegador ou do app. Alias
                            em CamelCase: userAgent.
                        browser_family:
                          type: string
                          description: >-
                            Família do navegador (por exemplo, Chrome, Firefox,
                            Safari). Deve ser enviada explicitamente: não é
                            derivada de user_agent. Alias em CamelCase:
                            browserFamily.
                        browser_version:
                          type: string
                          description: >-
                            String da versão do navegador. Deve ser enviada
                            explicitamente. Alias em CamelCase: browserVersion.
                        platform:
                          type: string
                          description: >-
                            Identificador da plataforma (web, ios, android,
                            macos, windows, linux). Deve ser enviado
                            explicitamente: ele não é derivado de user_agent.
                        os_family:
                          type: string
                          description: >-
                            Família do sistema operacional (por exemplo, iOS,
                            Android, Windows). Alias em CamelCase: osFamily.
                        os_version:
                          type: string
                          description: >-
                            String de versão do sistema operacional. Alias em
                            CamelCase: osVersion.
                        accept_language:
                          type: string
                          description: >-
                            Valor do cabeçalho Accept-Language. Alias em
                            CamelCase: acceptLang.
                        session_id:
                          type: string
                          description: >-
                            Identificador da sessão atual do usuário. Armazenado
                            nos metadados. Alias em CamelCase: sessionId.
                        session_age_ms:
                          type: number
                          description: >-
                            Duração da sessão do usuário, em milissegundos, no
                            momento da transação. Alias em camelCase:
                            sessionAgeMs.
                        network_context:
                          type: object
                          description: >-
                            Contexto de rede com endereço IP e geolocalização.
                            Um bloco ipInfo de nível superior também é
                            incorporado a este objeto.
                          properties:
                            ip_address:
                              type: string
                              description: 'Endereço IP do cliente. Alias em CamelCase: ip.'
                            ip_country_code:
                              type: string
                              description: >-
                                País do IP resolvido por geolocalização (ISO
                                3166-1 alpha-3). Alias em CamelCase:
                                countryCode3.
                            latitude:
                              type: number
                              description: >-
                                Latitude geográfica do IP. Alias em CamelCase:
                                lat.
                            longitude:
                              type: number
                              description: >-
                                Longitude geográfica do IP. Alias em CamelCase:
                                lon.
                    payment_method:
                      type: object
                      description: Meio de pagamento usado pelo titular.
                      properties:
                        method_type:
                          type: string
                          description: >-
                            Tipo de meio de pagamento: `bank_card`,
                            `bank_account`, `crypto_wallet`, `ewallet`,
                            `unhosted_wallet`, `other`.
                        account_id:
                          type: string
                          description: >-
                            Identificador da conta (por exemplo, IBAN, endereço
                            de carteira). Para triagem cripto, deve conter o
                            endereço da carteira deste participante. A triagem
                            de entrada por hash de transação exige o endereço de
                            depósito do serviço/cliente no titular. A triagem de
                            saída usa a carteira de destino na contraparte. Em
                            uma transferência cripto em bitcoin ou Lightning,
                            pode ser uma solicitação de pagamento Lightning
                            (fatura BOLT11, oferta BOLT12, LNURL) ou um
                            Lightning Address: a Didit armazena como conta o
                            recebedor que ela indica ("" quando não indica
                            nenhum) e o conteúdo da solicitação em
                            `chain_details.lightning` da transferência da Travel
                            Rule. No máximo 255 caracteres depois de armazenado.
                            Em uma transferência cripto em bitcoin ou Lightning,
                            pode ser uma solicitação de pagamento Lightning
                            (fatura BOLT11, oferta BOLT12, LNURL) ou um
                            Lightning Address: a Didit armazena como conta o
                            recebedor que ela indica ("" quando não indica
                            nenhum) e o conteúdo da solicitação em
                            `chain_details.lightning` da transferência da Travel
                            Rule. No máximo 255 caracteres depois de armazenado.
                        memo:
                          type: string
                          maxLength: 256
                          description: >-
                            A destination tag ou o memo que faz parte da
                            carteira em uma rede com memo (XRP, XLM, EOS, ATOM,
                            HBAR). Em um mesmo endereço compartilhado de
                            exchange, cada memo é um meio de pagamento próprio.
                            XRP: uma destination tag, um número inteiro de 0 a
                            4294967295 (um número JSON é aceito). XLM: um memo
                            de texto de até 28 bytes, um id de 64 bits ou um
                            hash de 32 bytes em hexadecimal. EOS: até 256 bytes.
                            ATOM: até 256 caracteres. HBAR: até 100 bytes.
                            Carteiras Bitcoin, EVM, Solana, Tron, Litecoin,
                            Bitcoin Cash, Dogecoin e Lightning não aceitam memo:
                            enviar um nelas resulta em `400`. Alias:
                            `destinationTag` ou `destination_tag`.
                        issuing_country:
                          type: string
                          description: Código ISO 3166-1 alpha-3 do país do emissor.
                counterparty:
                  type: object
                  description: A contraparte da transação (opcional).
                  properties:
                    entity_type:
                      type: string
                      description: 'Tipo de entidade: `individual` ou `company`.'
                    vendor_data:
                      type: string
                      description: Seu identificador interno para a contraparte.
                    full_name:
                      type: string
                      description: Nome completo da contraparte.
                    first_name:
                      type: string
                    last_name:
                      type: string
                    date_of_birth:
                      type: string
                      format: date
                    address:
                      type: object
                      description: Objeto de endereço com `country` (ISO 3166-1 alpha-3).
                    institution_details:
                      type: object
                    device_context:
                      type: object
                      description: >-
                        Contexto do dispositivo da contraparte. browser_family e
                        platform devem ser enviados como chaves explícitas de
                        nível superior, pois não são derivados de user_agent.
                      properties:
                        fingerprint:
                          type: string
                          description: Impressão digital única do dispositivo.
                        persistent_device_id:
                          type: string
                          description: >-
                            Identificador estável do dispositivo entre sessões
                            (esquema de fingerprint v2).
                        user_agent:
                          type: string
                          description: >-
                            String de user agent do navegador ou do app. Alias
                            em CamelCase: userAgent.
                        browser_family:
                          type: string
                          description: >-
                            Família do navegador (por exemplo, Chrome, Firefox,
                            Safari). Deve ser enviada explicitamente: não é
                            derivada de user_agent. Alias em CamelCase:
                            browserFamily.
                        browser_version:
                          type: string
                          description: >-
                            String da versão do navegador. Deve ser enviada
                            explicitamente. Alias em CamelCase: browserVersion.
                        platform:
                          type: string
                          description: >-
                            Identificador da plataforma (web, ios, android,
                            macos, windows, linux). Deve ser enviado
                            explicitamente: ele não é derivado de user_agent.
                        os_family:
                          type: string
                          description: >-
                            Família do sistema operacional (por exemplo, iOS,
                            Android, Windows). Alias em CamelCase: osFamily.
                        os_version:
                          type: string
                          description: >-
                            String de versão do sistema operacional. Alias em
                            CamelCase: osVersion.
                        accept_language:
                          type: string
                          description: >-
                            Valor do cabeçalho Accept-Language. Alias em
                            CamelCase: acceptLang.
                        session_id:
                          type: string
                          description: >-
                            Identificador da sessão da contraparte. Armazenado
                            nos metadados. Alias em CamelCase: sessionId.
                        session_age_ms:
                          type: number
                          description: >-
                            Duração da sessão do usuário, em milissegundos, no
                            momento da transação. Alias em camelCase:
                            sessionAgeMs.
                        network_context:
                          type: object
                          description: >-
                            Contexto de rede com endereço IP e geolocalização.
                            Um bloco ipInfo de nível superior também é
                            incorporado a este objeto.
                          properties:
                            ip_address:
                              type: string
                              description: 'Endereço IP do cliente. Alias em CamelCase: ip.'
                            ip_country_code:
                              type: string
                              description: >-
                                País do IP resolvido por geolocalização (ISO
                                3166-1 alpha-3). Alias em CamelCase:
                                countryCode3.
                            latitude:
                              type: number
                              description: >-
                                Latitude geográfica do IP. Alias em CamelCase:
                                lat.
                            longitude:
                              type: number
                              description: >-
                                Longitude geográfica do IP. Alias em CamelCase:
                                lon.
                    payment_method:
                      type: object
                      description: >-
                        Meio de pagamento usado pela contraparte. Em transações
                        travelRule, `method_type: "unhosted_wallet"` declara a
                        carteira da contraparte como autocustodiada: a
                        transferência ignora o roteamento para o VASP da
                        contraparte, é criada diretamente em
                        `UNCONFIRMED_OWNERSHIP` e (quando
                        `auto_wallet_verification` está ativado) uma sessão do
                        widget de propriedade da carteira é gerada
                        automaticamente e retornada no bloco `action_required`
                        da transação.
                      properties:
                        method_type:
                          type: string
                          description: >-
                            Tipo de meio de pagamento: `bank_card`,
                            `bank_account`, `crypto_wallet`, `ewallet`,
                            `unhosted_wallet`, `other`. Use `unhosted_wallet`
                            para declarar uma carteira autocustodiada para a
                            Travel Rule.
                        account_id:
                          type: string
                          description: >-
                            Identificador da conta (por exemplo, IBAN ou
                            endereço de carteira). Em uma transferência cripto
                            em bitcoin ou Lightning, pode ser uma solicitação de
                            pagamento Lightning (fatura BOLT11, oferta BOLT12,
                            LNURL) ou um Lightning Address: a Didit armazena
                            como conta o recebedor que ela indica ("" quando não
                            indica nenhum) e o conteúdo da solicitação em
                            `chain_details.lightning` da transferência da Travel
                            Rule. No máximo 255 caracteres depois de armazenado.
                            Em uma transferência cripto em bitcoin ou Lightning,
                            pode ser uma solicitação de pagamento Lightning
                            (fatura BOLT11, oferta BOLT12, LNURL) ou um
                            Lightning Address: a Didit armazena como conta o
                            recebedor que ela indica ("" quando não indica
                            nenhum) e o conteúdo da solicitação em
                            `chain_details.lightning` da transferência da Travel
                            Rule. No máximo 255 caracteres depois de armazenado.
                        memo:
                          type: string
                          maxLength: 256
                          description: >-
                            A destination tag ou o memo que faz parte da
                            carteira em uma rede com memo (XRP, XLM, EOS, ATOM,
                            HBAR). Em um mesmo endereço compartilhado de
                            exchange, cada memo é um meio de pagamento próprio.
                            XRP: uma destination tag, um número inteiro de 0 a
                            4294967295 (um número JSON é aceito). XLM: um memo
                            de texto de até 28 bytes, um id de 64 bits ou um
                            hash de 32 bytes em hexadecimal. EOS: até 256 bytes.
                            ATOM: até 256 caracteres. HBAR: até 100 bytes.
                            Carteiras Bitcoin, EVM, Solana, Tron, Litecoin,
                            Bitcoin Cash, Dogecoin e Lightning não aceitam memo:
                            enviar um nelas resulta em `400`. Alias:
                            `destinationTag` ou `destination_tag`.
                        issuing_country:
                          type: string
                custom_properties:
                  type: object
                  description: >-
                    Pares chave-valor arbitrários anexados à transação. Cada
                    chave pode ser referenciada nas condições de regra com o
                    caminho de campo `custom_values.<key>`.
                  additionalProperties: true
                  example:
                    merchant_id: test
                    bank_name: test_2
                travel_rule_details:
                  type: object
                  description: >-
                    Dados da Travel Rule. Quando a Travel Rule está ativada e
                    transaction_category é travel_rule, a própria Didit conduz a
                    troca: ela ignora status, protocol, required e
                    obligations_count e usa originator_data, beneficiary_data e
                    metadata. Caso contrário, a Didit armazena esses valores
                    como um registro passivo da Travel Rule. Enquanto a Travel
                    Rule estiver ativada, uma transferência de saída igual ou
                    superior ao seu limiar deve conter o que o respectivo regime
                    exige (EU TFR ou Recomendação 16 do FATF), verificado nos
                    lados que você envia: um campo ausente retorna 400 em
                    `travel_rule_details.originator_data` ou
                    `travel_rule_details.beneficiary_data`, por exemplo "EU TFR
                    requires the originator name."
                  required:
                    - status
                  properties:
                    status:
                      type: string
                      description: >-
                        Obrigatório sempre que você enviar travel_rule_details.
                        Um dos status de transferência da Travel Rule (por
                        exemplo AWAITING_COUNTERPARTY, COMPLETED,
                        NOT_APPLICABLE); grafias em minúsculas e em camelCase e
                        os valores legados UNKNOWN, COMPLIANT, PENDING_ACTION,
                        PENDING_COUNTERPARTY, FAILED e EXEMPT também são aceitos
                        e mapeados. Qualquer outro valor retorna 400.
                    protocol:
                      type: string
                    required:
                      type: boolean
                    obligations_count:
                      type: integer
                    originator_data:
                      type: object
                      description: >-
                        Parte remetente, como campos planos ou uma pessoa IVMS
                        101. Para o seu usuário com uma verificação KYC
                        aprovada, a Didit substitui os campos que a verificação
                        contém pelos valores verificados (consulte
                        `metadata.originator_provenance`). Deve ser um objeto:
                        qualquer outra coisa resulta em `400`. Em uma rede com
                        memo, uma chave `memo` indica o memo ou a tag da
                        carteira do remetente.
                    beneficiary_data:
                      type: object
                      description: >-
                        Parte beneficiária, como campos simples ou como uma
                        pessoa IVMS 101. Deve ser um objeto: qualquer outro
                        valor resulta em `400`. Para encaminhar a transferência,
                        a Didit lê `wallet_address` (quando vazio, é preenchido
                        a partir de `counterparty.payment_method.account_id`),
                        `chain` (preenchido a partir de
                        `transaction_details.crypto_params.crypto_chain` ou de
                        `currency`, quando esta indica uma chain compatível),
                        `name` (com fallback para `counterparty.full_name`),
                        `travel_address`, `counterparty_vasp_name`,
                        `counterparty_vasp_lei` e `counterparty_vasp_email`. Em
                        uma rede com memo, `memo` indica o memo ou a tag da
                        carteira do beneficiário; `wallet_address` e `memo` têm
                        prioridade sobre o método de pagamento da contraparte.
                    metadata:
                      type: object
                    utxo:
                      allOf:
                        - $ref: '#/components/schemas/TravelRuleUtxo'
                      description: >-
                        Opcional, apenas para blockchains UTXO (BTC, LTC, BCH,
                        DOGE). As entradas e saídas da transação, a partir das
                        quais a Didit infere a carteira do remetente e a saída
                        do beneficiário quando você não as declara.
                    originator:
                      type: object
                      description: >-
                        Um bloco de remetente IVMS 101: `originatorPersons` (um
                        `naturalPerson` ou `legalPerson`; uma pessoa jurídica
                        faz da parte uma empresa) e `accountNumber` (endereços
                        de carteira). Usado para `originator_data` quando esse
                        objeto está vazio. Um bloco malformado retorna 400
                        identificado pelo seu caminho, por exemplo
                        `originator.originatorPersons`.
                    beneficiary:
                      type: object
                      description: >-
                        Um bloco de beneficiário IVMS 101: `beneficiaryPersons`
                        (um `naturalPerson` ou `legalPerson`; uma pessoa
                        jurídica faz da parte uma empresa) e `accountNumber`
                        (endereços de carteira). Usado para `beneficiary_data`
                        quando esse objeto está vazio. Um bloco malformado
                        retorna 400 identificado pelo seu caminho, por exemplo
                        `beneficiary.beneficiaryPersons`.
                    ivms101:
                      type: object
                      description: >-
                        Os blocos `originator` e `beneficiary` agrupados em um
                        único objeto IVMS 101 (`IVMS101` também é aceito). Os
                        blocos de nível superior prevalecem sobre os do objeto
                        agrupador.
                network_snapshot:
                  type: object
                  description: Snapshot pré-calculado do grafo da rede.
                  properties:
                    nodes:
                      type: array
                      items:
                        type: object
                    edges:
                      type: array
                      items:
                        type: object
                    metrics:
                      type: object
                include_crypto_screening:
                  type: boolean
                  nullable: true
                  description: >-
                    Substituição por transação para a análise de blockchain de
                    criptoativos. Quando `true`, a análise de criptoativos é
                    realizada independentemente do padrão da aplicação. Quando
                    `false`, a análise de criptoativos é ignorada mesmo que
                    esteja ativada nas configurações da aplicação. Quando
                    omitido ou `null`, é usado o padrão da aplicação configurado
                    no Console. A análise de criptoativos exige
                    `transaction_details.direction`, `currency_kind: "crypto"`,
                    uma rede/moeda e o endereço de carteira selecionado pela
                    direção: a análise de entrada antes da transferência usa
                    `counterparty.payment_method.account_id`, a análise de
                    entrada por hash de transação usa
                    `subject.payment_method.account_id` e a análise de saída usa
                    `counterparty.payment_method.account_id`. Quando
                    `transaction_details.payment_reference_id` contém um hash de
                    transação de blockchain, a Didit realiza a análise da
                    transação e retorna o enriquecimento com o resumo da
                    transação, quando disponível.
              required:
                - transaction_id
                - transaction_category
                - transaction_details
                - subject
            examples:
              Minimal fiat withdrawal:
                summary: Menor payload aceitável para uma transferência fiat de saída
                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: >-
                  Saque de cripto para uma carteira não hospedada, com triagem
                  opcional (opt-in)
                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 de cripto de saída com dados de
                  remetente/beneficiário da 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: >-
            Transação enviada e monitorada. O corpo é o detalhe completo da
            transação (mesmo formato de `GET
            /v3/transactions/{transaction_id}/`), refletindo os resultados de
            regras já aplicados.
          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: >-
            Falha na validação (campos obrigatórios ausentes, `transaction_id`
            duplicado, valor de enum desconhecido, moeda invá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: >-
            Chave de API ausente, inválida ou revogada, ou a chave não pode
            enviar transações para esta aplicação. Uma chave ausente retorna
            `403`; uma chave incorreta, revogada ou expirada retorna `401`.
          content:
            application/json:
              examples:
                Forbidden:
                  value:
                    detail: You do not have permission to perform this action.
        '409':
          description: >-
            Outra requisição com o mesmo `transaction_id` criou a transação
            enquanto esta estava sendo processada, por isso apenas um de dois
            envios simultâneos é bem-sucedido. Consulte a transação existente em
            vez de reenviar.
          content:
            application/json:
              examples:
                Concurrent duplicate:
                  value:
                    detail: A transaction with this transaction_id already exists.
        '429':
          description: >-
            Limite de requisições excedido; aguarde e tente novamente após o
            intervalo indicado em `Retry-After`.
          content:
            application/json:
              examples:
                Throttled:
                  value:
                    detail: Request was throttled. Expected available in 30 seconds.
      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: >-
        As entradas e saídas de uma transferência UTXO (BTC, LTC, BCH, DOGE).
        Aceitas somente nessas blockchains: em qualquer outra blockchain, é
        retornado `400`. A partir delas, a Didit infere a carteira do remetente
        (a declarada; caso contrário, o endereço de entrada que mais contribuiu)
        e a saída do beneficiário (a declarada; caso contrário, a única saída
        que não devolve valor a um endereço de entrada como troco; caso
        contrário, a única saída que paga o valor da transferência). O resultado
        fica em `chain_details` da transferência.
      required:
        - outputs
      properties:
        inputs:
          type: array
          maxItems: 1000
          items:
            $ref: '#/components/schemas/TravelRuleUtxoEntry'
          description: >-
            Opcional. Sem entradas, nenhum remetente é inferido e nenhuma saída
            de troco é reconhecida.
        outputs:
          type: array
          minItems: 1
          maxItems: 1000
          items:
            $ref: '#/components/schemas/TravelRuleUtxoEntry'
    TransactionDetail:
      type: object
      description: >-
        Registro de monitoramento completo de uma transação, conforme retornado
        por `GET /v3/transactions/{transaction_id}/` e `POST /v3/transactions/`.
      properties:
        uuid:
          type: string
          format: uuid
          description: >-
            Identificador estável da transação na Didit. Use como
            `{transaction_id}` nas chamadas subsequentes.
        environment:
          type: string
          enum:
            - live
            - sandbox
          description: >-
            Ambiente da aplicação proprietária da transação. Uma transação
            `sandbox` é armazenada, mas nunca é avaliada, analisada, notificada
            ou cobrada, portanto o seu `rule_runs` vazio significa "não
            avaliada".
        transaction_number:
          type: integer
          description: >-
            Número sequencial da transação no escopo da aplicação exibido no
            Console (por exemplo, `4123`).
        txn_id:
          type: string
          description: >-
            O `transaction_id` que você informou na criação (máximo de 128
            caracteres). Único por aplicação.
        txn_date:
          type: string
          format: date-time
          description: >-
            Quando a transação ocorreu (a partir de `transaction_at`; o padrão é
            o momento do envio).
        zone_id:
          type: string
          nullable: true
          description: Identificador de fuso horário IANA informado na criação.
        transaction_type:
          type: string
          description: >-
            Categoria de nível superior, como armazenada: `finance`, `kyc`,
            `travelRule`, `userPlatformEvent`, `gamblingBet`,
            `gamblingLimitChange`, `gamblingBonusChange`, `auditTrailEvent`.
            Observe que valores com várias palavras são retornados em camelCase
            mesmo quando enviados em snake_case.
        action_type:
          type: string
          description: >-
            Subtipo dentro da categoria (por exemplo `deposit`, `withdrawal`,
            `transfer`). O padrão é a categoria quando não for informado.
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
          description: >-
            Direção em relação ao titular. Armazenada em maiúsculas,
            independentemente da caixa usada no envio
            (`in`/`out`/`inbound`/`outbound` são aceitos na entrada).
        status:
          type: string
          enum:
            - APPROVED
            - IN_REVIEW
            - DECLINED
            - AWAITING_USER
          description: >-
            Veredito de monitoramento atual. As transações são criadas como
            `APPROVED`; as regras podem alterá-las para `IN_REVIEW`/`DECLINED`
            de forma síncrona.
        source:
          type: string
          enum:
            - LIVE
            - IMPORTED
          description: >-
            Como o registro se originou: `LIVE` para transações enviadas pela
            API ou pelo SDK, `IMPORTED` para transações carregadas pela
            importação do console.
        amount:
          type: string
          description: >-
            Valor da transação como string decimal, sem zeros à direita (por
            exemplo, `"1500"`, `"0.5"`, `"0.123456789012345678"`). Até 18 casas
            decimais.
        currency:
          type: string
          description: >-
            Código da moeda de `amount`. Qualquer código alfabético ISO 4217 é
            aceito (por exemplo, `EUR`, `USD`, `NGN`), assim como um símbolo de
            ativo cripto (por exemplo, `BTC`). Prefira um código atualmente em
            circulação. Nem todo código aceito tem taxa de câmbio: quando não há
            nenhuma disponível para o código (por exemplo, a unidade contábil
            ISO `XSU` ou um símbolo cripto que a Didit não precifica), a
            conversão automática falha e `preferred_currency_amount` é retornado
            como null, a menos que a requisição tenha fornecido um
            `amount_in_default_currency` já convertido.
        currency_type:
          type: string
          nullable: true
          description: '`fiat` ou `crypto`, conforme enviado em `currency_kind`.'
        amount_in_default_currency:
          type: string
          nullable: true
          description: >-
            Valor já convertido que você informou, como string decimal sem zeros
            à direita.
        default_currency_code:
          type: string
          nullable: true
        preferred_currency_amount:
          type: string
          nullable: true
          description: >-
            `amount` convertido para a moeda preferida da aplicação, quando
            disponível.
        preferred_currency_code:
          type: string
          nullable: true
        payment_details:
          type: string
          nullable: true
          description: Referência ou memorando de pagamento em texto livre do envio.
        payment_txn_id:
          type: string
          nullable: true
          description: >-
            Referência do sistema de pagamento externo (por exemplo, hash da
            transação na blockchain) obtida de `payment_reference_id`.
        score:
          type: integer
          description: >-
            Pontuação de risco acumulada pelas regras (normalmente de 0 a 100).
            Quanto maior, mais arriscado.
        severity:
          type: string
          nullable: true
          enum:
            - UNKNOWN
            - LOW
            - MEDIUM
            - HIGH
            - CRITICAL
          description: >-
            Gravidade categórica do risco definida por regras ou provedores
            (`UNKNOWN`, `LOW`, `MEDIUM`, `HIGH`, `CRITICAL`). `null` até que
            algo a defina.
        decision_reason_code:
          type: string
          nullable: true
          description: Motivo legível por máquina do `status` atual.
        decision_reason_label:
          type: string
          nullable: true
          description: Rótulo legível de `decision_reason_code`.
        vendor_data:
          type: string
          nullable: true
          description: Cópia de conveniência do `vendor_data` do solicitante.
        metadata:
          type: object
          description: >-
            Snapshot dos payloads `subject` e `counterparty` como foram enviados
            no momento da criação.
        props:
          type: object
          description: >-
            As `custom_properties` que você informou na criação. Cada chave pode
            ser referenciada nas condições de regras como `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: Se a tag é uma predefinição da Didit ou uma tag personalizada.
          description: Tags anexadas à transação (manualmente ou por regras).
        parties:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              role:
                type: string
                enum:
                  - APPLICANT
                  - REMITTER
                  - BENEFICIARY
                  - COUNTERPARTY
                description: >-
                  Função da parte. O endpoint de criação atribui `APPLICANT` (o
                  titular) e `COUNTERPARTY`.
              entity_type:
                type: string
                enum:
                  - individual
                  - company
                  - external
                  - unhostedWallet
              kind:
                type: string
                enum:
                  - USER
                  - BUSINESS
                  - EXTERNAL
                description: >-
                  Partes `USER`/`BUSINESS` se vinculam a uma entidade da Didit
                  por meio de `vendor_data`. Partes `EXTERNAL` não têm nenhuma
                  entidade da Didit por trás.
              vendor_data:
                type: string
                nullable: true
                description: Seu identificador interno de usuário/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: >-
                  Código do país a partir do `address.country` enviado
                  (normalmente ISO 3166-1 alpha-3).
              dob:
                type: string
                format: date
                nullable: true
                description: Data de nascimento do `date_of_birth` enviado.
              address:
                type: object
                description: Objeto de endereço conforme enviado. `{}` quando omitido.
              institution_info:
                type: object
                description: Dados da instituição conforme enviados. `{}` quando omitidos.
              device:
                type: object
                description: >-
                  Contexto normalizado do dispositivo, incluindo o
                  enriquecimento de IP no servidor em network_context
                  (geolocalização, indicadores de VPN/data center) quando um IP
                  foi informado.
                properties:
                  fingerprint:
                    type: string
                    description: Impressão digital única do dispositivo.
                  persistent_device_id:
                    type: string
                    description: >-
                      Identificador estável do dispositivo entre sessões
                      (esquema de fingerprint v2).
                  user_agent:
                    type: string
                    description: String de user agent do navegador ou do app.
                  browser_family:
                    type: string
                    description: >-
                      Família do navegador (por exemplo, Chrome, Firefox,
                      Safari).
                  browser_version:
                    type: string
                    description: String da versão do navegador.
                  platform:
                    type: string
                    description: >-
                      Identificador da plataforma (web, ios, android, macos,
                      windows, linux).
                  os_family:
                    type: string
                    description: >-
                      Família do sistema operacional (por exemplo, iOS, Android,
                      Windows).
                  os_version:
                    type: string
                    description: String de versão do sistema operacional.
                  accept_language:
                    type: string
                    description: Valor do cabeçalho Accept-Language.
                  session_id:
                    type: string
                    description: Identificador da sessão (armazenado nos metadados).
                  session_age_ms:
                    type: number
                    description: Idade da sessão em milissegundos.
                  network_context:
                    type: object
                    description: Contexto de rede com endereço IP e geolocalização.
                    properties:
                      ip_address:
                        type: string
                        description: Endereço IP do cliente.
                      ip_country_code:
                        type: string
                        description: >-
                          País do IP resolvido por geolocalização (ISO 3166-1
                          alpha-3).
                      latitude:
                        type: number
                        description: Latitude geográfica do IP.
                      longitude:
                        type: number
                        description: Longitude geográfica do IP.
              external_party_snapshot:
                type: object
                nullable: true
                description: >-
                  Cópia congelada dos dados da parte para partes `EXTERNAL`.
                  `null` enquanto a parte estiver vinculada a um usuário ou
                  empresa da Didit.
          description: Partes da transação (solicitante, contraparte).
        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
                  estável para correlacionar a reutilização do mesmo
                  instrumento.
              account_id:
                type: string
                nullable: true
                description: >-
                  Identificador da conta (IBAN, endereço de carteira, token de
                  cartão, …).
              issuing_country:
                type: string
                nullable: true
              owner_kind:
                type: string
                enum:
                  - USER
                  - BUSINESS
                  - EXTERNAL
              vendor_data:
                type: string
                nullable: true
                description: Seu identificador do usuário/empresa proprietário.
              owner_name:
                type: string
                nullable: true
              institution_info:
                type: object
              details:
                type: object
                description: Objeto `payment_method` bruto, conforme enviado.
              external_owner_snapshot:
                type: object
                nullable: true
              role:
                type: string
                enum:
                  - SOURCE
                  - DESTINATION
                  - FUNDING
                  - BENEFICIARY
                description: >-
                  Como este método foi usado na transação. O endpoint de criação
                  atribui `SOURCE`/`DESTINATION` com base na direção (saída:
                  titular = SOURCE; entrada: titular = DESTINATION).
          description: Meios de pagamento vinculados à transação.
        documents:
          type: array
          description: >-
            Arquivos anexados à transação pelo console. `[]` quando não há
            nenhum.
          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 download assinada de curta duração; obtenha-a
                        quando necessário em vez de armazená-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: >-
                  Por exemplo, `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: >-
            Entradas do registro de atividades (criação, notas, revisões
            manuais, alterações de status).
        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 vazio atualmente. Um alerta aberto é uma transação com status
            `IN_REVIEW` ou `AWAITING_USER`.
        rule_runs:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              rule:
                type: string
                format: uuid
                description: UUID da regra que foi executada.
              rule_title:
                type: string
              rule_description:
                type: string
                nullable: true
              rule_category:
                type: string
              matched:
                type: boolean
                description: >-
                  Se as condições da regra corresponderam a esta transação. Uma
                  execução é registrada apenas para regras correspondidas, então
                  as avaliações em produção sempre trazem `true`.
              is_test:
                type: boolean
                description: >-
                  True quando a regra foi executada no modo TEST (sem efeito no
                  status/pontuação).
              mode:
                type: string
                enum:
                  - ACTIVE
                  - DISABLED
                  - TEST
              severity:
                type: string
                nullable: true
              score_delta:
                type: integer
                description: Pontuação adicionada pelas ações `add_score` desta regra.
              status_target:
                type: string
                nullable: true
                description: Status definido por uma ação `change_status`, se houver.
              action_summary:
                type: string
                nullable: true
                description: >-
                  Resumo das ações que a regra executou, unidas com `; ` (por
                  exemplo, `score +30; change_status:IN_REVIEW;
                  add_tag:high_risk_country`). Partes: `score +N`,
                  `change_status:<STATUS>`, `add_tag:<name>`, `add_note`,
                  `add_to_list`, `open_case`. `null` quando a regra não executou
                  nenhuma ação.
              metadata:
                type: object
                description: >-
                  Detalhe da avaliação: `scope_match`, `conditions[]` e
                  `aggregations[]`. Cada entrada de condição contém `field`,
                  `operator`, `expected_value`, o `current_value` lido da
                  transação, `matched`, `group_index` e `group_logic`. Cada
                  entrada de agregação (velocidade / contagem / soma) contém
                  `metric`, `field`, `operator`, `expected_value`, o
                  `computed_value` resultante da agregação, `window`, `filters`,
                  `matched` e `sample_references`; agregações assíncronas
                  adiadas têm `computed_value: null` e `deferred: true`. Um
                  grupo de condições aninhado é uma entrada de `conditions[]`
                  com `operator` `any_of` ou `all_of`, `field` nulo e os
                  resultados dos seus membros em seu próprio `conditions`.
              created_at:
                type: string
                format: date-time
          description: >-
            Resultados de execução por regra: qual regra foi acionada e com qual
            impacto na pontuação.
        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 bruto da resposta do provedor.
              created_at:
                type: string
                format: date-time
          description: >-
            Payloads brutos dos provedores (Análise AML, análise de blockchain
            etc.).
        travel_rule:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/TransactionTravelRule'
          description: >-
            Transferência ou verificação da Travel Rule. Preenchido quando
            `travel_rule_details` foi enviado e também quando a Travel Rule está
            ativada e a transação foi criada com `transaction_category:
            travelRule` (a própria Didit inicia a troca, mesmo sem
            `travel_rule_details`). `null` quando não existe transferência nem
            verificação. Em uma transferência de entrada, os `originator_data` e
            `beneficiary_data` da contraparte permanecem mascarados
            (`data_masked: true`) até que a propriedade da carteira seja
            confirmada.
        network_snapshot:
          type: object
          nullable: true
          description: >-
            Snapshot do grafo de transações/partes relacionadas usado pelo motor
            de regras. É o `network_snapshot` enviado com a transação ou o grafo
            que a Didit constrói a partir de uma triagem AML de carteira
            bem-sucedida (que substitui o enviado). `null` quando nenhum dos
            dois existe.
          properties:
            uuid:
              type: string
              format: uuid
            nodes:
              type: array
              items:
                type: object
            edges:
              type: array
              items:
                type: object
            metrics:
              type: object
        remediation:
          type: object
          nullable: true
          description: >-
            Sessão de correção oferecida ao usuário quando a reverificação é
            necessária. Substituída por `action_required`, que é o bloco
            canônico; mantida por compatibilidade com versões anteriores.
          properties:
            session_id:
              type: string
            session_token:
              type: string
            url:
              type: string
              format: uri
            status:
              type: string
        action_required:
          type: object
          nullable: true
          description: >-
            Ação pendente do usuário final necessária para concluir esta
            transação, ou null quando não houver nenhuma. Os SDKs da Didit
            iniciam a ação automaticamente por padrão e atualizam a transação
            quando ela termina. Há duas variantes, diferenciadas por `type`:
            `verification_session` (uma sessão de verificação hospedada criada
            por uma ação de regra) e `wallet_ownership` (uma sessão do widget de
            propriedade da carteira gerada automaticamente para uma
            transferência da Travel Rule que exige prova de controle da
            carteira, condicionada à configuração `auto_wallet_verification` da
            Travel Rule). Quando ambas puderem se aplicar, `wallet_ownership`
            tem precedência, pois bloqueia a troca da 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: >-
            Custo desta transação: `total_price` e `items`, um por cobrança,
            cada um com `usage_type`, `price`, `details` e `created_at`. Uma
            nova triagem da mesma transação gera um novo item.
    TravelRuleUtxoEntry:
      type: object
      description: >-
        Uma entrada ou saída de uma transação UTXO, conforme registrada na
        blockchain.
      required:
        - address
      properties:
        address:
          type: string
          maxLength: 128
        amount:
          type: string
          nullable: true
          description: >-
            String decimal na própria unidade da moeda (BTC, não satoshis).
            Opcional.
          example: '0.0125'
        txid:
          type: string
          maxLength: 128
          description: Opcional. A transação que uma entrada gasta.
        vout:
          type: integer
          nullable: true
          minimum: 0
          description: Opcional. O índice da saída que uma entrada gasta.
    TransactionTravelRule:
      type: object
      description: >-
        A transferência Travel Rule de uma transação, como retornada por `GET
        /v3/transactions/{transaction_id}/`, pela resposta `201` de `POST
        /v3/transactions/` e por cada linha de `GET /v3/transactions/`.
        `direction`, `rail`, `counterparty_vasp`, `delivery`, `discovery`,
        `reason` e `next_actions` têm o mesmo formato que em `PATCH
        /v3/transactions/{transaction_id}/travel-rule/`, de modo que uma única
        leitura de uma transação informa por que a transferência está travada e
        o que a faz 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: >-
            Parte remetente. Em uma transferência de entrada, os valores da
            contraparte ficam mascarados até que a propriedade seja confirmada.
        beneficiary_data:
          type: object
          description: >-
            Parte beneficiária. Em uma transferência recebida, os valores da
            contraparte ficam mascarados até que a propriedade seja confirmada.
        name_match:
          type: object
          nullable: true
          description: >-
            A comparação de nomes que decidiu a transferência (pontuação e
            rigor). Nula até que uma seja executada. Os nomes comparados são
            mascarados junto com as partes.
        data_match:
          $ref: '#/components/schemas/TravelRuleDataMatch'
        mismatched_fields:
          type: array
          items:
            type: string
          description: >-
            Atalho para `data_match.mismatched_fields`. Vazio quando nada
            difere.
        data_unmasked:
          $ref: '#/components/schemas/TravelRuleDataUnmasked'
        data_masked:
          type: boolean
          description: >-
            True enquanto os dados pessoais da contraparte estão mascarados
            nesta resposta.
        metadata:
          type: object
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
          description: De qual lado da troca está esta transferência.
        rail:
          type: string
          nullable: true
          description: >-
            O canal pelo qual a transferência passou: `INTERNAL`, `TRP`, `GTR`,
            `TRUST`, `VERIFYVASP`, `SYGNA` ou `EMAIL` (`TEST_VASP` em uma
            aplicação de sandbox, quando o Didit Test VASP respondeu), ou `null`
            até que um canal seja escolhido.
        counterparty_vasp:
          type: object
          nullable: true
          properties:
            name:
              type: string
            lei:
              type: string
            dd_score:
              type: integer
              description: >-
                Pontuação de due diligence de 0 a 100, em que valores maiores
                são melhores. Mesma escala do diretório de VASPs.
            dd_score_breakdown:
              type: object
              description: >-
                Contribuições de cada componente para o dd_score, um objeto por
                componente, como no diretório de VASPs (jurisdiction,
                verification, protocol, lei, history, essentials,
                responsiveness), cada um com {points, max, reason, detail}. {}
                até que a contraparte tenha sido avaliada.
              additionalProperties:
                type: object
                properties:
                  points:
                    type: number
                    description: Pontos atribuídos a este componente.
                  max:
                    type: integer
                    description: Pontuação máxima que este componente pode conceder.
                  reason:
                    type: string
                    description: Código legível por máquina do veredito do componente.
                  detail:
                    type: string
                    description: Motivo legível dos pontos atribuídos.
            dd_assessed_at:
              type: string
              format: date-time
              nullable: true
              description: >-
                Quando a avaliação de devida diligência foi executada pela
                última vez. Nulo até que a contraparte tenha sido avaliada.
          description: >-
            A entrada da contraparte no diretório, ou `null` quando a
            transferência não vincula nenhuma.
        delivery:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/TravelRuleDelivery'
          description: >-
            A mensagem mais recente que a transferência deve a outra parte.
            `null` quando não deveu nenhuma, por exemplo abaixo de
            `threshold_amount` ou para uma carteira autocustodiada declarada.
        discovery:
          type: array
          description: >-
            Como a Didit procurou a contraparte, com uma entrada por etapa
            executada. Vazio quando nenhuma descoberta foi executada, por
            exemplo, em uma transferência de entrada.
          items:
            $ref: '#/components/schemas/TravelRuleDiscoveryStep'
        reason:
          type: string
          description: >-
            Motivo pelo qual uma transferência `COUNTERPARTY_VASP_NOT_FOUND` ou
            `COUNTERPARTY_VASP_NOT_REACHABLE` está parada; `""` para qualquer
            outro status. Uma falha de entrega decide primeiro, apenas em
            `COUNTERPARTY_VASP_NOT_REACHABLE`: `email_undeliverable` (o provedor
            de e-mail recusou o e-mail de conformidade e não resta nenhum
            endereço para tentar: no envio, em um lembrete ou como uma devolução
            permanente informada depois) ou `delivery_failed` (o canal que fazia
            a entrega falhou definitivamente: um canal de rede recusou a
            mensagem ou esgotou as novas tentativas, um host de identidade `TRP`
            não respondeu ou o host `TRP` da contraparte não aceitou a
            consulta). Caso contrário, o rastro de `discovery` decide:
            `awaiting_end_user` (nenhuma etapa indicou uma contraparte que a
            Didit consiga alcançar), `directory_match_no_route` (uma etapa
            indicou um VASP do diretório que não tem rota),
            `picked_member_without_proven_wallet` (o usuário final escolheu um
            cliente da Didit que não comprovou o controle da carteira) ou
            `no_directory_match` quando o rastro não indica nenhum outro motivo.
            Um reenvio faz a transferência avançar, e o motivo é então limpo.
            Veja [Por que uma transferência está
            parada](/pt-br/transaction-monitoring/travel-rule#por-que-uma-transferência-fica-travada).
        next_actions:
          type: array
          description: >-
            O que faz a transferência avançar; `[]` para qualquer status que não
            seja `COUNTERPARTY_VASP_NOT_FOUND` ou
            `COUNTERPARTY_VASP_NOT_REACHABLE`. `email_undeliverable` oferece
            `update_compliance_email` e depois `resend`. `delivery_failed`
            oferece `resend`. Um motivo de descoberta oferece
            `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 de verificação hospedada a ser aberta para o usuário final.
        session_id:
          type: string
          format: uuid
          description: ID da sessão de verificação.
        session_token:
          type: string
          description: >-
            Token da sessão, usado pelos SDKs móveis para iniciar o fluxo de
            forma nativa.
        status:
          type: string
          description: Status da sessão de verificação.
      required:
        - type
        - url
    TransactionWalletOwnershipAction:
      title: Wallet ownership
      type: object
      properties:
        type:
          type: string
          enum:
            - wallet_ownership
        url:
          type: string
          format: uri
          description: >-
            URL do widget hospedado de comprovação de propriedade da carteira.
            Abra-a em um navegador real: no celular, use SFSafariViewController
            ou uma Chrome Custom Tab, nunca um webview incorporado.
        widget_session_id:
          type: string
          format: uuid
          description: ID da sessão do widget de propriedade da carteira.
        expires_at:
          type: string
          format: date-time
          description: Quando a sessão do widget expira.
      required:
        - type
        - url
    TravelRuleDataMatch:
      type: object
      nullable: true
      description: >-
        Comparação campo a campo entre os dados das partes da transferência e o
        que o outro lado sabe sobre o titular da carteira. Ela indica campos e
        resultados, nunca valores, por isso continua legível enquanto os dados
        da contraparte estão mascarados. Nulo até que uma comparação seja
        executada.
      properties:
        matched:
          type: boolean
          description: True quando nenhum campo comparado é diferente.
        mismatched_fields:
          type: array
          items:
            type: string
            enum:
              - name
              - date_of_birth
              - address
              - account
          description: Os campos que diferem.
        fields:
          type: object
          description: >-
            Uma entrada por campo comparado para o tipo de entidade da parte
            (`name`, `date_of_birth`, `address`, `account`; uma empresa não tem
            `date_of_birth`).
          additionalProperties:
            type: object
            properties:
              result:
                type: string
                enum:
                  - matched
                  - mismatched
                  - not_compared
                description: >-
                  `not_compared` quando a regra é `NONE` ou um dos lados não tem
                  valor para o campo.
              strictness:
                type: string
                enum:
                  - NONE
                  - STRICT
                  - CONTAINS
                  - DEFAULT
                  - FUZZY
    TravelRuleDataUnmasked:
      type: object
      nullable: true
      description: >-
        Registro de auditoria do momento em que os dados da contraparte foram
        desmascarados. É nulo enquanto os dados ainda estão mascarados e em
        transferências de saída.
      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: >-
            O que confirmou a propriedade: ownership_confirmed (sua confirmação
            pelo console ou pela API), wallet_proof (uma prova de carteira no
            widget ou uma transferência de entrada INTERNAL, definida quando é
            criada), address_book_match (uma carteira verificada do catálogo de
            endereços), own_verified_wallet (a carteira verificada do próprio
            usuário), inquiry_approved (sua aprovação de uma consulta TRP de
            entrada ou de uma mensagem GTR ou Sygna), known_payment_method (uma
            carteira com a qual seu usuário já pagou) ou travel_address (o
            travel address por carteira identificou a carteira).
        actor:
          type: string
          description: >-
            Quem confirmou: o e-mail do usuário do console ou o rótulo da chave
            de API. Em branco para uma decisão automática.
    TravelRuleDelivery:
      type: object
      description: >-
        Situação da mensagem mais recente que a transferência deve à outra
        parte. A Didit contata a contraparte depois que a requisição que criou
        ou alterou a transferência retorna, então este objeto indica se essa
        mensagem foi entregue: na fila, em envio, aguardando nova tentativa após
        um erro, entregue ou com falha. Uma falha da qual a rede ainda pode se
        recuperar (sem resposta a tempo, falha de conexão, HTTP `408`, `429` ou
        `5xx`) é tentada novamente após 30 segundos, 2 minutos, 10 minutos, 30
        minutos e 1 hora. Quando uma primeira mensagem (`kind: SEND`) falha
        definitivamente, porque a rede a recusou ou porque a sexta tentativa
        também falhou, a transferência passa para
        `COUNTERPARTY_VASP_NOT_REACHABLE` com `last_error` em sua `timeline`;
        qualquer outra mensagem que falhe definitivamente é registrada na
        `timeline`. O `status` da transferência continua sendo a fonte da
        verdade sobre a troca em si.
      required:
        - kind
        - status
        - rail
        - attempts
        - last_error
        - next_attempt_at
        - delivered_at
      properties:
        kind:
          type: string
          enum:
            - SEND
            - ANSWER
            - TXID
            - CANCEL
            - POLL
          description: >-
            O que a mensagem transporta. `SEND`: a primeira mensagem da
            transferência para a contraparte (de saída; o canal é escolhido no
            momento do envio). `ANSWER`: sua aceitação ou recusa, devida à rede
            que fez a solicitação (de entrada). `TXID`: o hash da transação
            on-chain, depois que você conclui a transferência. `CANCEL`: o
            cancelamento, depois que você cancela a transferência. `POLL`: uma
            consulta de status a uma rede que oferece esse recurso, repetida a
            cada 5 minutos enquanto a transferência aguarda a contraparte.
        status:
          type: string
          enum:
            - QUEUED
            - SENDING
            - RETRYING
            - DELIVERED
            - FAILED
          description: >-
            `QUEUED`: aguardando envio. `SENDING`: uma tentativa está em
            andamento. `RETRYING`: uma tentativa falhou e a próxima será
            executada em `next_attempt_at`. `DELIVERED`: o outro lado recebeu a
            mensagem. `FAILED`: o outro lado a recusou, ou a última tentativa
            falhou.
        rail:
          type: string
          enum:
            - INTERNAL
            - TRP
            - GTR
            - TRUST
            - VERIFYVASP
            - SYGNA
            - EMAIL
            - ''
          description: >-
            O canal que transporta a mensagem. Fica vazio até que a Didit
            escolha um para uma primeira mensagem.
        attempts:
          type: integer
          minimum: 0
          description: >-
            Tentativas feitas até agora para esta mensagem. Uma mensagem que não
            seja uma consulta de status é tentada no máximo 6 vezes.
        last_error:
          type: string
          description: >-
            O tipo de falha que a última tentativa encontrou, `""` quando não
            houve nenhuma: por exemplo `email undeliverable`, `trp identity
            endpoint unreachable` ou `trp transfer inquiry delivery failed`.
            Nunca inclui a resposta da própria contraparte, que fica na
            `timeline` da transferência.

            Quando o GTR responde com um erro, o código de status e a mensagem
            dele são incluídos. Os corpos de resposta nunca são incluídos.
          example: email undeliverable
        next_attempt_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Quando a próxima tentativa é executada enquanto a mensagem está
            `QUEUED` ou `RETRYING`.
        delivered_at:
          type: string
          format: date-time
          nullable: true
          description: Quando o outro lado recebeu a mensagem.
    TravelRuleDiscoveryStep:
      type: object
      description: >-
        Uma etapa da descoberta de contraparte que a Didit executou para uma
        transferência de saída, na ordem em que as executou. A primeira etapa
        que identifica um VASP com rota encerra a cadeia.
      properties:
        step:
          type: string
          enum:
            - internal_address_book
            - wallet_attribution
            - network_lookup
            - customer_hint
            - end_user
          description: >-
            `internal_address_book`: outro cliente da Didit que comprovou o
            controle da carteira de destino. `wallet_attribution`: a atribuição
            da carteira feita por análise de blockchain. `network_lookup`: uma
            rede capaz de informar qual VASP detém o endereço. `customer_hint`:
            o nome do VASP, o LEI ou a jurisdição que você enviou em
            `beneficiary_data`. `end_user`: a contraparte que o usuário final
            (ou você) escolheu, ou o pedido para escolher uma.
        outcome:
          type: string
          enum:
            - match
            - miss
            - skipped
          description: >-
            `match`: a etapa identificou uma contraparte. `miss`: ela foi
            executada e não encontrou nenhuma. `skipped`: ela não pôde ser
            executada, e `reason` informa o motivo.
        reason:
          type: string
          description: >-
            Motivo legível por máquina, `""` quando há correspondê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` ou `picked_member_without_proven_wallet`.
        vasp:
          type: string
          format: uuid
          nullable: true
          description: O VASP do diretório indicado pela etapa, quando ela indicou um.
        rail:
          type: string
          nullable: true
          description: O canal que alcança essa contraparte, quando a etapa encontrou um.
        at:
          type: string
          format: date-time
    TravelRuleNextAction:
      type: object
      description: >-
        Algo que faz avançar uma transferência `COUNTERPARTY_VASP_NOT_FOUND` ou
        `COUNTERPARTY_VASP_NOT_REACHABLE`. Consulte [Por que uma transferência
        está
        parada](/pt-br/transaction-monitoring/travel-rule#por-que-uma-transferência-fica-travada).
      properties:
        action:
          type: string
          enum:
            - select_counterparty_vasp
            - declare_self_hosted
            - add_vasp_hint
            - update_compliance_email
            - resend
          description: >-
            `select_counterparty_vasp`: o usuário final escolhe o VASP de
            destino no widget de propriedade da carteira, ou você faz um PATCH
            com `action=beneficiary_vasp`. `declare_self_hosted`: o usuário
            final declara no widget que a carteira é autocustodiada.
            `add_vasp_hint`: informe à Didit quem é a contraparte, com um nome
            de VASP, um LEI ou um travel address (por exemplo, um
            `travel_address` na entrada do catálogo de endereços da carteira de
            destino) e depois reenvie. `update_compliance_email` e `resend` são
            valores de `action` de `PATCH
            /v3/transactions/{transaction_id}/travel-rule/`: informe novamente o
            e-mail de conformidade da contraparte e execute o roteamento outra
            vez.
        url:
          type: string
          format: uri
          description: >-
            O link do widget de propriedade da carteira, em
            `select_counterparty_vasp` e `declare_self_hosted`, enquanto a
            transferência tiver uma sessão de widget aberta.
      required:
        - action
    TravelRuleChainDetails:
      type: object
      description: >-
        Como a blockchain da transferência identifica suas duas carteiras,
        quando isso vai além de um endereço pagando a outro. Vazio (`{}`) para
        uma transferência em blockchain baseada em contas (EVM, Solana, Tron),
        em que os dois endereços são as próprias carteiras. A correspondência, o
        roteamento e o catálogo de endereços leem as carteiras primeiro a partir
        daqui.
      properties:
        chain:
          type: string
          description: >-
            Blockchain canônica, por exemplo, `BTC`, `XRP` ou `LIGHTNING` para
            uma transferência Lightning.
        shape:
          type: string
          enum:
            - utxo
            - memo
            - lightning
        originator:
          $ref: '#/components/schemas/TravelRuleChainSide'
        beneficiary:
          $ref: '#/components/schemas/TravelRuleChainSide'
        utxo:
          type: object
          description: >-
            Em uma transferência UTXO: as entradas e saídas conforme armazenadas
            (valores como strings decimais) e como a Didit interpretou cada
            saída.
          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: Saídas que pagam de volta a um endereço de entrada.
            beneficiary_output_index:
              type: integer
              nullable: true
              description: >-
                A saída que paga o beneficiário; null quando nenhuma pôde ser
                distinguida.
        lightning:
          type: object
          description: >-
            Em uma transferência Lightning: o que a requisição de pagamento
            informa. Sempre `kind` (`bolt11`, `bolt12_offer`, `bolt12_invoice`,
            `bolt12_invoice_request`, `lnurl`, `lightning_address`, `node_id` ou
            `unknown`); uma fatura BOLT11 acrescenta `network`, `payee_node_id`,
            `payment_hash`, `amount_msat`, `created_at` e `expires_at`; uma
            string BOLT12, `blinded_paths` e `payee_node_id`; uma LNURL ou um
            Lightning Address, o respectivo `domain`. Nada é resolvido pela
            rede: a requisição é apenas decodificada.
          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ências de UTXO que merecem atenção: o remetente declarado
            não é uma entrada, o beneficiário declarado não é uma saída, não foi
            possível distinguir uma única saída do beneficiário, ou a saída do
            beneficiário paga um valor diferente do informado na transação.
        not_applicable_reason:
          type: string
          enum:
            - LIGHTNING_NO_PAYEE_IDENTIFIER
            - LIGHTNING_BOLT12_BLINDED_PAYEE
            - LIGHTNING_LNURL_NAMES_NO_PAYEE
          description: >-
            Em uma transferência Lightning de saída cuja requisição de pagamento
            não indica nenhum beneficiário: o motivo pelo qual a transferência é
            `NOT_APPLICABLE`. `LIGHTNING_NO_PAYEE_IDENTIFIER` (a requisição não
            indica nenhum nó beneficiário ou não pôde ser decodificada),
            `LIGHTNING_BOLT12_BLINDED_PAYEE` (a oferta oculta o beneficiário
            atrás de blinded paths), `LIGHTNING_LNURL_NAMES_NO_PAYEE` (uma LNURL
            indica um serviço, não um beneficiário). O mesmo código abre a
            última entrada de `timeline` da transferência.
    TravelRuleChainSide:
      type: object
      description: >-
        A carteira de uma das partes, conforme a Didit a resolveu a partir dos
        dados da blockchain.
      properties:
        address:
          type: string
          description: >-
            A carteira. Em uma rede com memo, o endereço clássico (um X-address
            da XRP é dividido em endereço clássico e tag); na Lightning, o ID do
            nó do beneficiário ou o Lightning Address.
        memo:
          type: string
          description: >-
            A destination tag ou o memo que faz parte da carteira; `""` para
            nenhum.
        source:
          type: string
          enum:
            - declared
            - x_address
            - largest_input
            - only_non_change_output
            - amount_match
            - invoice_payee
            - updated
          description: >-
            Origem da carteira: `declared` (sua requisição), `x_address`
            (extraída de um X-address do XRP), `largest_input` (o endereço de
            entrada UTXO que mais contribuiu), `only_non_change_output` (a única
            saída UTXO que não é troco), `amount_match` (a única saída UTXO que
            paga o valor da transferência), `invoice_payee` (o beneficiário
            indicado em uma solicitação de pagamento Lightning), `updated`
            (definida posteriormente com `action: update_originator_wallet`).
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Chave de API da sua aplicação, em Developers -> API keys no Business
        Console. A chave principal tem acesso total. Uma chave nomeada pode ter
        escopo restrito: nenhum acesso, leitura ou escrita por recurso, limitada
        a alguns fluxos ou a sessões aprovadas, a uma lista de endereços IP e a
        uma data de validade. 401 significa que a chave está errada, revogada ou
        expirada; 403 significa que nenhuma chave foi enviada, que a chave não
        tem acesso a este recurso ou ação, ou que a requisição veio de um
        endereço fora da sua lista de IPs; 404 em uma rota de sessão significa
        que a sessão está fora dos fluxos ou status da chave. Uma chave sem
        acesso a mídia recebe URLs de imagem, vídeo e PDF como null, e uma chave
        sem permissão de escrita em sessões recebe links e tokens de sessão como
        null. Consulte https://docs.didit.me/console/api-keys.

````

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