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

# Criar Transação API: Submissão KYT

> Submeta uma transação à Didit KYT 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 para criar uma 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 - more than 600 ingestion requests per minute for this API key (transaction and event ingestion share this budget, apart from the 300 of every other write); wait Retry-After seconds and retry.

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

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

\</pre>



      
      

Colar em



## OpenAPI

````yaml pt/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: >-
        Submeta uma transação para monitorização síncrona de AML/risco. A
        transação é criada como `APPROVED`, executando-se de seguida as suas
        regras (e a triagem de criptoativos, quando aplicável) em linha, podendo
        alterar o `status` devolvido para `IN_REVIEW` ou `DECLINED`.
        **`transaction_id` é a sua chave de idempotência** (máx. 128 carateres,
        único por aplicação); reutilizá-lo devolve 400. Um webhook
        `transaction.created` é enviado em caso de sucesso para aplicações em
        produção. As aplicações em sandbox não são faturadas e não emitem
        webhooks `transaction.created` nem `transaction.status.updated`. As
        trocas Travel Rule em sandbox emitem webhooks
        `travel_rule.status.updated` com `environment: sandbox`. Uma
        transferência Travel Rule é armazenada e devolvida antes de qualquer
        contraparte ser contactada: `travel_rule.status` é devolvido 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. A Didit escolhe então a via e envia a
        troca, e cada alteração posterior de estado da transferência, incluindo
        `COUNTERPARTY_VASP_NOT_FOUND` quando nenhuma via alcança a contraparte,
        chega como um webhook `travel_rule.status.updated`. As suas regras são
        executadas novamente quando a via ou o estado se alteram.
      operationId: createTransaction
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                transaction_id:
                  type: string
                  description: >-
                    O seu identificador exclusivo para esta transação (máx. 128
                    carateres).
                  example: your-txn-2026-05-17-001
                transaction_at:
                  type: string
                  format: date-time
                  description: >-
                    Quando a transação ocorreu. O padrão é o momento atual se
                    omitido.
                time_zone:
                  type: string
                  description: 'Identificador de fuso horário IANA, ex.: `Europe/Madrid`.'
                transaction_category:
                  type: string
                  description: >-
                    Categoria da transação. Aliases em CamelCase (`travelRule`,
                    `userPlatformEvent`, `gamblingBet`, …) também são aceites; o
                    valor armazenado/devolvido é camelCase para categorias
                    compostas por várias palavras.
                  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 sujeito. Insensível a
                        maiúsculas/minúsculas; `in`/`out` são aceites como
                        pseudónimos. Devolvida em maiúsculas
                        (`INBOUND`/`OUTBOUND`).
                      example: outbound
                      enum:
                        - inbound
                        - outbound
                        - in
                        - out
                    amount:
                      type: number
                      description: >-
                        Montante da transação (até 18 casas decimais). Envie-o
                        como uma string decimal (por exemplo,
                        `"0.123456789012345678"`) quando a precisão exata for
                        importante: um número JSON é analisado primeiro como um
                        float binário, pelo que os dígitos além de cerca de 15
                        dígitos significativos são arredondados antes de o
                        montante ser armazenado. Deve ser igual ou superior a
                        zero: a direção indica o sinal e um montante negativo
                        devolve `400`.
                      example: 1500
                    currency:
                      type: string
                      description: >-
                        Código de moeda. Qualquer código alfabético ISO 4217 é
                        aceite (por exemplo, `EUR`, `USD`, `NGN`), bem como um
                        símbolo de criptoativo (por exemplo, `BTC`). Dê
                        preferência a um código atualmente em circulação. Nem
                        todos os códigos aceites têm uma taxa de câmbio: quando
                        nenhuma estiver disponível para o código (por exemplo, a
                        unidade contabilística ISO `XSU`, ou um símbolo
                        criptográfico que a Didit não precifique), a conversão
                        automática falha e `preferred_currency_amount` é
                        devolvido como null, a menos que o pedido tenha
                        fornecido um `amount_in_default_currency`
                        pré-convertido.
                      example: EUR
                    currency_kind:
                      type: string
                      description: Indica se a moeda é `fiat` ou `crypto`.
                    amount_in_default_currency:
                      type: number
                      nullable: true
                      description: >-
                        Montante pré-convertido na moeda padrão. Se omitido, é
                        tentada a conversão cambial automática. Deve ser zero ou
                        superior.
                    default_currency:
                      type: string
                      description: >-
                        O código de moeda predefinido para o montante
                        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 externa do sistema de pagamento. Para triagem
                        de hash de transação cripto no âmbito de AML, envie o
                        hash da transação na blockchain e forneça também
                        `subject.payment_method.account_id` com o endereço
                        relacionado.
                    action_type:
                      type: string
                      nullable: true
                      description: >-
                        Subtipo da transação, p. ex. `deposit`, `withdrawal`,
                        `transfer`.
                    crypto_params:
                      type: object
                      description: >-
                        Seleção da rede de criptomoeda, separada da moeda (o
                        símbolo do ativo). Registar um símbolo de token
                        personalizado não garante a cobertura de hashes de
                        transação para o respetivo contrato.
                      properties:
                        crypto_chain:
                          type: string
                          description: >-
                            Rede real utilizada para a triagem. A triagem gerida
                            suporta 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 aceites, por exemplo
                            POLYGON ou POL para MATIC, BSC para BNB e TRON para
                            TRX. Especifique sempre isto para tokens multirrede.
                            Quando estiver em falta para USDT, USDC ou ETH
                            enviados com um hash de transação 0x, o Didit
                            pesquisa o hash em Ethereum, BNB Chain, Polygon,
                            Base, Arbitrum e Optimism e faz a triagem na rede
                            onde for encontrado; se nenhuma rede o tiver, a
                            transação não é submetida a triagem e
                            custom_values.aml_screening_status fica FAILED com o
                            motivo em custom_values.aml_screening_error. Quando
                            estiver em falta para USDT ou USDC submetidos a
                            triagem por carteira (sem hash de transação), um
                            endereço Tron é submetido a triagem na Tron, um
                            endereço Solana na Solana e um endereço 0x na
                            primeira dessas seis redes onde tenha enviado uma
                            transação ou detenha o token, ou na Ethereum quando
                            não estiver ativo em nenhuma delas. A cobertura de
                            fornecedores associados varia; LIGHTNING requer um
                            fornecedor associado suportado.
                          example: BASE
                subject:
                  type: object
                  description: O sujeito (requerente) 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: O seu identificador interno de utilizador/empresa.
                      example: user-12345
                    full_name:
                      type: string
                      description: Nome completo do sujeito.
                      example: Maria Garcia
                    first_name:
                      type: string
                      description: Primeiro nome do sujeito.
                    last_name:
                      type: string
                      description: Apelido do sujeito.
                    date_of_birth:
                      type: string
                      format: date
                      description: Data de nascimento (YYYY-MM-DD).
                    address:
                      type: object
                      description: Objeto de morada.
                      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: Detalhes da instituição (para sujeitos 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 têm de ser enviados
                        como chaves explícitas de nível superior — não são
                        derivados de user_agent. O alias em camelCase device
                        também é aceite no pedido.
                      properties:
                        fingerprint:
                          type: string
                          description: Impressão digital única do dispositivo.
                        persistent_device_id:
                          type: string
                          description: >-
                            Identificador estável de dispositivo entre sessões
                            (esquema de fingerprint v2).
                        user_agent:
                          type: string
                          description: >-
                            Cadeia de caracteres do agente do utilizador do
                            navegador ou da aplicação. 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: >-
                            Cadeia de caracteres 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). Tem de ser enviado
                            explicitamente — não é derivado de user_agent.
                        os_family:
                          type: string
                          description: >-
                            Família do sistema operativo (por exemplo, iOS,
                            Android, Windows). Alias CamelCase: osFamily.
                        os_version:
                          type: string
                          description: >-
                            String da versão do sistema operativo. Alias
                            CamelCase: osVersion.
                        accept_language:
                          type: string
                          description: >-
                            Valor do cabeçalho Accept-Language. Alias em
                            CamelCase: acceptLang.
                        session_id:
                          type: string
                          description: >-
                            Identificador de sessão da sessão atual do
                            utilizador. Guardado nos metadados. Alias CamelCase:
                            sessionId.
                        session_age_ms:
                          type: number
                          description: >-
                            Idade da sessão do utilizador 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 é integrado
                            neste objeto.
                          properties:
                            ip_address:
                              type: string
                              description: 'Endereço IP do cliente. Alias CamelCase: ip.'
                            ip_country_code:
                              type: string
                              description: >-
                                País determinado por geolocalização do IP (ISO
                                3166-1 alfa-3). Alias 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: Método de pagamento utilizado pelo sujeito.
                      properties:
                        method_type:
                          type: string
                          description: >-
                            Tipo de método de pagamento: `bank_card`,
                            `bank_account`, `crypto_wallet`, `ewallet`,
                            `unhosted_wallet`, `other`.
                        account_id:
                          type: string
                          description: >-
                            Identificador de conta (por exemplo, IBAN, endereço
                            de carteira). Para triagem de criptomoedas, deve
                            conter o endereço de carteira para este
                            participante. A triagem de hash de transações de
                            entrada requer o endereço de depósito do
                            serviço/cliente associado ao sujeito. A triagem de
                            saída utiliza a carteira de destino na contraparte.
                            Numa transferência de criptomoedas em bitcoin ou
                            Lightning, pode ser um pedido de pagamento Lightning
                            (fatura BOLT11, oferta BOLT12, LNURL) ou um
                            Lightning Address: a Didit armazena o beneficiário
                            indicado como a conta ("" quando não indica nenhum)
                            e o conteúdo do pedido em `chain_details.lightning`
                            da transferência Travel Rule. No máximo 255
                            carateres após armazenamento. Numa transferência de
                            criptomoedas em bitcoin ou Lightning, pode ser um
                            pedido de pagamento Lightning (fatura BOLT11, oferta
                            BOLT12, LNURL) ou um Lightning Address: a Didit
                            armazena o beneficiário indicado como a conta (""
                            quando não indica nenhum) e o conteúdo do pedido em
                            `chain_details.lightning` da transferência Travel
                            Rule. No máximo 255 carateres após armazenamento.
                        memo:
                          type: string
                          maxLength: 256
                          description: >-
                            A tag ou memo de destino que faz parte da carteira
                            numa rede baseada em memo (XRP, XLM, EOS, ATOM,
                            HBAR). Num único endereço de exchange partilhado,
                            cada memo constitui o seu próprio método de
                            pagamento. XRP: uma tag de destino, um número
                            inteiro de 0 a 4294967295 (é aceite um número em
                            formato JSON). XLM: um memo de texto com até 28
                            bytes, um id de 64 bits ou um hash de 32 bytes em
                            hexadecimal. EOS: até 256 bytes. ATOM: até 256
                            carateres. HBAR: até 100 bytes. As carteiras de
                            Bitcoin, EVM, Solana, Tron, Litecoin, Bitcoin Cash,
                            Dogecoin e Lightning não aceitam memo: caso seja
                            fornecido um, é devolvido um erro `400`. Alias:
                            `destinationTag` ou `destination_tag`.
                        issuing_country:
                          type: string
                          description: Código de país ISO 3166-1 alfa-3 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: O 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 morada com `country` (ISO 3166-1 alfa-3).
                    institution_details:
                      type: object
                    device_context:
                      type: object
                      description: >-
                        Contexto do dispositivo para a contraparte.
                        browser_family e platform têm de ser enviados como
                        chaves explícitas de nível superior — 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 de dispositivo entre sessões
                            (esquema de fingerprint v2).
                        user_agent:
                          type: string
                          description: >-
                            Cadeia de caracteres do agente do utilizador do
                            navegador ou da aplicação. 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: >-
                            Cadeia de caracteres 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). Tem de ser enviado
                            explicitamente — não é derivado de user_agent.
                        os_family:
                          type: string
                          description: >-
                            Família do sistema operativo (por exemplo, iOS,
                            Android, Windows). Alias CamelCase: osFamily.
                        os_version:
                          type: string
                          description: >-
                            String da versão do sistema operativo. Alias
                            CamelCase: osVersion.
                        accept_language:
                          type: string
                          description: >-
                            Valor do cabeçalho Accept-Language. Alias em
                            CamelCase: acceptLang.
                        session_id:
                          type: string
                          description: >-
                            Identificador de sessão para a sessão da
                            contraparte. Guardado nos metadados. Alias
                            CamelCase: sessionId.
                        session_age_ms:
                          type: number
                          description: >-
                            Idade da sessão do utilizador 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 é integrado
                            neste objeto.
                          properties:
                            ip_address:
                              type: string
                              description: 'Endereço IP do cliente. Alias CamelCase: ip.'
                            ip_country_code:
                              type: string
                              description: >-
                                País determinado por geolocalização do IP (ISO
                                3166-1 alfa-3). Alias 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: >-
                        Método de pagamento utilizado pela contraparte. Em
                        transações de travelRule, `method_type:
                        "unhosted_wallet"` declara a carteira da contraparte
                        como autocustodiada: a transferência ignora o
                        encaminhamento VASP da contraparte, é criada diretamente
                        em `UNCONFIRMED_OWNERSHIP` e (quando
                        `auto_wallet_verification` está ativado) uma sessão de
                        widget de propriedade da carteira é gerada
                        automaticamente e devolvida no bloco `action_required`
                        da transação.
                      properties:
                        method_type:
                          type: string
                          description: >-
                            Tipo de método de pagamento: `bank_card`,
                            `bank_account`, `crypto_wallet`, `ewallet`,
                            `unhosted_wallet`, `other`. Utilize
                            `unhosted_wallet` para declarar uma carteira
                            autocustodiada para a Travel Rule.
                        account_id:
                          type: string
                          description: >-
                            Identificador de conta (por exemplo, IBAN ou
                            endereço de carteira). Numa transferência de cripto
                            em bitcoin ou Lightning, pode ser um pedido de
                            pagamento Lightning (fatura BOLT11, oferta BOLT12,
                            LNURL) ou um Lightning Address: a Didit armazena o
                            beneficiário indicado como a conta ("" quando não
                            indica nenhum) e o conteúdo do pedido em
                            `chain_details.lightning` da transferência Travel
                            Rule. No máximo 255 carateres após armazenamento.
                            Numa transferência de cripto em bitcoin ou
                            Lightning, pode ser um pedido de pagamento Lightning
                            (fatura BOLT11, oferta BOLT12, LNURL) ou um
                            Lightning Address: a Didit armazena o beneficiário
                            indicado como a conta ("" quando não indica nenhum)
                            e o conteúdo do pedido em `chain_details.lightning`
                            da transferência Travel Rule. No máximo 255
                            carateres após armazenamento.
                        memo:
                          type: string
                          maxLength: 256
                          description: >-
                            A tag ou memo de destino que faz parte da carteira
                            numa rede baseada em memo (XRP, XLM, EOS, ATOM,
                            HBAR). Num único endereço de exchange partilhado,
                            cada memo constitui o seu próprio método de
                            pagamento. XRP: uma tag de destino, um número
                            inteiro de 0 a 4294967295 (é aceite um número em
                            formato JSON). XLM: um memo de texto com até 28
                            bytes, um id de 64 bits ou um hash de 32 bytes em
                            hexadecimal. EOS: até 256 bytes. ATOM: até 256
                            carateres. HBAR: até 100 bytes. As carteiras de
                            Bitcoin, EVM, Solana, Tron, Litecoin, Bitcoin Cash,
                            Dogecoin e Lightning não aceitam memo: caso seja
                            fornecido um, é devolvido um erro `400`. Alias:
                            `destinationTag` ou `destination_tag`.
                        issuing_country:
                          type: string
                custom_properties:
                  type: object
                  description: >-
                    Pares chave-valor arbitrários associados à transação. Cada
                    chave pode ser referenciada nas condições das regras através
                    do 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 Didit executa a troca
                    por si própria: ignora status, protocol, required e
                    obligations_count, e utiliza originator_data,
                    beneficiary_data e metadata. Caso contrário, a Didit
                    armazena estes valores como um registo passivo da Travel
                    Rule. Enquanto a Travel Rule estiver ativada, uma
                    transferência de saída igual ou superior ao seu limiar deve
                    incluir o que o respetivo regime exige (EU TFR ou
                    Recomendação 16 do GAFI), verificado nas partes que enviar:
                    um campo em falta responde com 400 sob
                    `travel_rule_details.originator_data` ou
                    `travel_rule_details.beneficiary_data`, por exemplo "O EU
                    TFR exige o nome do ordenante."
                  required:
                    - status
                  properties:
                    status:
                      type: string
                      description: >-
                        Obrigatório sempre que enviar travel_rule_details. Um
                        dos estados de transferência da Travel Rule (por
                        exemplo, AWAITING_COUNTERPARTY, COMPLETED,
                        NOT_APPLICABLE); grafias em minúsculas e camelCase e os
                        valores legados UNKNOWN, COMPLIANT, PENDING_ACTION,
                        PENDING_COUNTERPARTY, FAILED e EXEMPT também são aceites
                        e mapeados. Qualquer outro valor devolve 400.
                    protocol:
                      type: string
                    required:
                      type: boolean
                    obligations_count:
                      type: integer
                    originator_data:
                      type: object
                      description: >-
                        Parte ordenante, como campos simples ou uma pessoa IVMS
                        101. Para o seu utilizador com uma verificação de 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 num `400`. Numa rede com
                        memo, uma chave `memo` indica o memo ou tag da carteira
                        do ordenante.
                    beneficiary_data:
                      type: object
                      description: >-
                        Parte beneficiária, como campos simples ou uma pessoa
                        IVMS 101. Deve ser um objeto: qualquer outra coisa
                        resulta num `400`. Para encaminhar a transferência, a
                        Didit lê `wallet_address` (um campo vazio é preenchido a
                        partir de `counterparty.payment_method.account_id`),
                        `chain` (preenchido a partir de
                        `transaction_details.crypto_params.crypto_chain` ou da
                        `currency` quando esta indica uma rede suportada),
                        `name` (recorrendo a `counterparty.full_name`),
                        `travel_address`, `counterparty_vasp_name`,
                        `counterparty_vasp_lei` e `counterparty_vasp_email`.
                        Numa rede com memo, `memo` indica o memo ou tag da
                        carteira do beneficiário; `wallet_address` e `memo`
                        sobrepõem-se ao método de pagamento da contraparte.
                    metadata:
                      type: object
                    utxo:
                      allOf:
                        - $ref: '#/components/schemas/TravelRuleUtxo'
                      description: >-
                        Opcional, apenas para cadeias UTXO (BTC, LTC, BCH,
                        DOGE). As entradas e saídas da transação, a partir das
                        quais a Didit deduz a carteira do ordenante e a saída do
                        beneficiário quando não as declarar.
                    originator:
                      type: object
                      description: >-
                        Um bloco de ordenante IVMS 101: `originatorPersons` (uma
                        `naturalPerson` ou `legalPerson`; uma pessoa coletiva
                        torna a parte uma empresa) e `accountNumber` (endereços
                        de carteira). Utilizado para `originator_data` quando
                        esse objeto está vazio. Um bloco malformado responde com
                        400 identificado pelo seu caminho, por exemplo
                        `originator.originatorPersons`.
                    beneficiary:
                      type: object
                      description: >-
                        Um bloco de beneficiário IVMS 101: `beneficiaryPersons`
                        (uma `naturalPerson` ou `legalPerson`; uma pessoa
                        coletiva torna a parte uma empresa) e `accountNumber`
                        (endereços de carteira). Utilizado para
                        `beneficiary_data` quando esse objeto está vazio. Um
                        bloco malformado responde com 400 identificado pelo seu
                        caminho, por exemplo `beneficiary.beneficiaryPersons`.
                    ivms101:
                      type: object
                      description: >-
                        Os blocos `originator` e `beneficiary` encapsulados num
                        único objeto IVMS 101 (`IVMS101` também é aceite). Os
                        blocos de nível superior prevalecem sobre os do
                        encapsulamento.
                network_snapshot:
                  type: object
                  description: Instantâneo pré-computado do grafo de 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 triagem de análise de
                    blockchain de criptoativos. Quando `true`, a triagem de
                    criptoativos é realizada independentemente do valor
                    predefinido da aplicação. Quando `false`, a triagem de
                    criptoativos é ignorada mesmo que esteja ativada nas
                    definições da aplicação. Quando omitido ou `null`, é
                    utilizado o valor predefinido ao nível da aplicação
                    configurado na Console. A triagem de criptoativos requer
                    `transaction_details.direction`, `currency_kind: "crypto"`,
                    uma blockchain/moeda e o endereço de carteira selecionado
                    pela direção: a triagem pré-transferência de entrada utiliza
                    `counterparty.payment_method.account_id`, a triagem de hash
                    de transação de entrada utiliza
                    `subject.payment_method.account_id` e a triagem de saída
                    utiliza `counterparty.payment_method.account_id`. Quando
                    `transaction_details.payment_reference_id` contém um hash de
                    transação de blockchain, a Didit realiza a triagem de
                    transação e devolve o enriquecimento do 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 de saída
                  fiduciária
                value:
                  transaction_id: your-txn-2026-05-17-001
                  transaction_category: finance
                  transaction_details:
                    direction: outbound
                    amount: 1500
                    currency: EUR
                    action_type: withdrawal
                  subject:
                    entity_type: individual
                    vendor_data: user-12345
                    full_name: Maria Garcia
              Crypto outbound with screening:
                summary: >-
                  Levantamento de criptoativos de saída para uma carteira
                  autocustodiada, triagem opcional
                value:
                  transaction_id: your-txn-2026-05-17-002
                  transaction_category: finance
                  include_crypto_screening: true
                  transaction_details:
                    direction: outbound
                    amount: 0.5
                    currency: BTC
                    currency_kind: crypto
                    amount_in_default_currency: 32500
                    default_currency: USD
                    action_type: withdrawal
                  subject:
                    entity_type: individual
                    vendor_data: user-12345
                    full_name: Maria Garcia
                    payment_method:
                      method_type: crypto_wallet
                      account_id: bc1qexampleexchangewalletaddressxyz
                      issuing_country: ESP
                  counterparty:
                    entity_type: individual
                    payment_method:
                      method_type: unhosted_wallet
                      account_id: bc1qexampleexternalwalletaddressabc
              Travel Rule transfer:
                summary: >-
                  Transferência de criptoativos de saída com dados do
                  ordenante/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 submetida e monitorizada. O corpo contém os detalhes
            completos da transação (mesma estrutura de `GET
            /v3/transactions/{transaction_id}/`), refletindo quaisquer
            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: >-
            A validação falhou (campos obrigatórios em falta, `transaction_id`
            duplicado, valor de enumeração 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 em falta, inválida ou revogada, ou a chave não pode
            submeter transações para esta aplicação. Uma chave em falta devolve
            `403`; uma chave incorreta, revogada ou expirada devolve `401`.
          content:
            application/json:
              examples:
                Forbidden:
                  value:
                    detail: You do not have permission to perform this action.
        '409':
          description: >-
            Outro pedido com o mesmo `transaction_id` criou a transação enquanto
            este estava a ser processado, pelo que apenas uma de duas submissões
            simultâneas tem êxito. Consulte a transação existente em vez de
            submeter novamente.
          content:
            application/json:
              examples:
                Concurrent duplicate:
                  value:
                    detail: A transaction with this transaction_id already exists.
        '429':
          description: >-
            Limite de pedidos excedido: a criação de transações e a ingestão de
            eventos (`POST /v3/transactions/`, `POST /v3/events/`, `POST
            /v3/events/batch/`) partilham um orçamento de 600 pedidos por minuto
            por chave de API, separado dos 300 partilhados por todos os outros
            pedidos de escrita. Aguarde `Retry-After` segundos e, em seguida,
            tente novamente.
          headers:
            Retry-After:
              description: >-
                Segundos a aguardar antes de tentar novamente, arredondados para
                cima para que a nova tentativa ocorra na janela seguinte.
              schema:
                type: integer
                minimum: 1
                example: 30
          content:
            application/json:
              examples:
                Throttled:
                  value:
                    detail: >-
                      Ingestion rate limit exceeded. You can make up to 600
                      requests per minute.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST 'https://verification.didit.me/v3/transactions/' \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "transaction_id": "your-txn-2026-05-17-001",
                "transaction_category": "finance",
                "transaction_details": {
                  "direction": "outbound",
                  "amount": 1500,
                  "currency": "EUR",
                  "action_type": "withdrawal"
                },
                "subject": {
                  "entity_type": "individual",
                  "vendor_data": "user-12345",
                  "full_name": "Maria Garcia"
                }
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

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

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

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

            import me.didit.types.TransactionsCreateParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.transactions().create(TransactionsCreateParams.builder()
                    .transactionId("your-txn-2026-05-17-001")
                    .transactionCategory(TransactionsCreateParams.TransactionCategory.of("finance"))
                    .transactionDetails(TransactionsCreateParams.TransactionDetails.builder()
                            .direction(TransactionsCreateParams.TransactionDetails.Direction.of("outbound"))
                            .amount(1500.0)
                            .currency("EUR")
                            .actionType("withdrawal")
                            .build())
                    .subject(TransactionsCreateParams.Subject.builder()
                            .entityType("individual")
                            .vendorData("user-12345")
                            .fullName("Maria Garcia")
                            .build())
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

            // Reads DIDIT_API_KEY.
            $didit = new DiditClient();

            $result = $didit->transactions->create([
                'transaction_id' => 'your-txn-2026-05-17-001',
                'transaction_category' => 'finance',
                'transaction_details' => [
                    'direction' => 'outbound',
                    'amount' => 1500.0,
                    'currency' => 'EUR',
                    'action_type' => 'withdrawal',
                ],
                'subject' => [
                    'entity_type' => 'individual',
                    'vendor_data' => 'user-12345',
                    'full_name' => 'Maria Garcia',
                ],
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

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

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


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

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

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    TravelRuleUtxo:
      type: object
      description: >-
        As entradas e saídas de uma transferência UTXO (BTC, LTC, BCH, DOGE). Só
        são aceites nestas blockchains: em qualquer outra blockchain devolve um
        erro `400`. A partir delas, a Didit deduz a carteira do ordenante (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 troco a um endereço de entrada, caso contrário a única saída que
        paga o montante da transferência). O resultado encontra-se em
        `chain_details` da transferência.
      required:
        - outputs
      properties:
        inputs:
          type: array
          maxItems: 1000
          items:
            $ref: '#/components/schemas/TravelRuleUtxoEntry'
          description: >-
            Opcional. Sem inputs, nenhum ordenante é inferido e nenhum output de
            troco é reconhecido.
        outputs:
          type: array
          minItems: 1
          maxItems: 1000
          items:
            $ref: '#/components/schemas/TravelRuleUtxoEntry'
    TransactionDetail:
      type: object
      description: >-
        Registo completo de monitorização de uma transação, conforme retornado
        por `GET /v3/transactions/{transaction_id}/` e `POST /v3/transactions/`.
      properties:
        uuid:
          type: string
          format: uuid
          description: >-
            Identificador de transação estável da Didit. Utilize como
            `{transaction_id}` para chamadas de seguimento.
        environment:
          type: string
          enum:
            - live
            - sandbox
          description: >-
            Ambiente da aplicação proprietária da transação. Uma transação em
            `sandbox` é armazenada, mas nunca avaliada, sujeita a triagem,
            notificada ou faturada, pelo que o seu `rule_runs` vazio significa
            "não avaliada".
        transaction_number:
          type: integer
          description: >-
            Número sequencial da transação no âmbito da aplicação apresentado na
            Consola (ex.: `4123`).
        txn_id:
          type: string
          description: >-
            O `transaction_id` que indicou no momento da criação (máx. 128
            carateres). Ú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 é
            a hora de submissão).
        zone_id:
          type: string
          nullable: true
          description: Identificador de fuso horário IANA fornecido no momento da criação.
        transaction_type:
          type: string
          description: >-
            Categoria de nível superior tal como armazenada: `finance`, `kyc`,
            `travelRule`, `userPlatformEvent`, `gamblingBet`,
            `gamblingLimitChange`, `gamblingBonusChange`, `auditTrailEvent`.
            Tenha em atenção que os valores com várias palavras são devolvidos
            em camelCase, mesmo quando enviados em snake_case.
        action_type:
          type: string
          description: >-
            Subtipo dentro da categoria (p. ex. `deposit`, `withdrawal`,
            `transfer`). É predefinido como a categoria quando não é fornecido.
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
          description: >-
            Direção em relação ao sujeito. Armazenada em maiúsculas
            independentemente da capitalização submetida
            (`in`/`out`/`inbound`/`outbound` são aceites na entrada).
        status:
          type: string
          enum:
            - APPROVED
            - IN_REVIEW
            - DECLINED
            - AWAITING_USER
          description: >-
            Veredito atual de monitorização. As transações são criadas como
            `APPROVED`; as regras podem alterá-las sincronamente para
            `IN_REVIEW`/`DECLINED`.
        source:
          type: string
          enum:
            - LIVE
            - IMPORTED
          description: >-
            Como o registo teve origem: `LIVE` para transações submetidas
            através da API ou SDK, `IMPORTED` para transações carregadas através
            da importação da consola.
        amount:
          type: string
          description: >-
            Montante da transação como uma string decimal sem zeros à direita
            (por exemplo, `"1500"`, `"0.5"`, `"0.123456789012345678"`). Até 18
            casas decimais.
        currency:
          type: string
          description: >-
            Código de moeda de `amount`. Qualquer código alfabético ISO 4217 é
            aceite (por exemplo, `EUR`, `USD`, `NGN`), bem como um símbolo de
            ativo criptográfico (por exemplo, `BTC`). Dê preferência a um código
            atualmente em circulação. Nem todos os códigos aceites têm uma taxa
            de câmbio: quando nenhuma estiver disponível para o código (por
            exemplo, a unidade contabilística ISO `XSU`, ou um símbolo
            criptográfico que a Didit não precifique), a conversão automática
            falha e `preferred_currency_amount` é devolvido a null, a menos que
            o pedido tenha fornecido um `amount_in_default_currency`
            pré-convertido.
        currency_type:
          type: string
          nullable: true
          description: '`fiat` ou `crypto`, conforme submetido em `currency_kind`.'
        amount_in_default_currency:
          type: string
          nullable: true
          description: >-
            Montante pré-convertido fornecido por si, como uma cadeia 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 proveniente do
            envio.
        payment_txn_id:
          type: string
          nullable: true
          description: >-
            Referência externa do sistema de pagamento (por exemplo, hash de
            transação na blockchain) a partir de `payment_reference_id`.
        score:
          type: integer
          description: >-
            Pontuação de risco acumulada por regras (normalmente 0–100). Mais
            alta = maior risco.
        severity:
          type: string
          nullable: true
          enum:
            - UNKNOWN
            - LOW
            - MEDIUM
            - HIGH
            - CRITICAL
          description: >-
            Gravidade de risco categórica definida por regras/fornecedores
            (`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 para o `status` atual.
        decision_reason_label:
          type: string
          nullable: true
          description: Rótulo legível para `decision_reason_code`.
        vendor_data:
          type: string
          nullable: true
          description: Cópia de conveniência dos `vendor_data` do requerente.
        metadata:
          type: object
          description: >-
            Instantâneo dos payloads de `subject` e `counterparty` conforme
            enviados no momento da criação.
        props:
          type: object
          description: >-
            As `custom_properties` que forneceu no momento da criação. Cada
            chave pode ser referenciada nas condições das 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 etiqueta é uma predefinição da Didit ou uma etiqueta
                  personalizada.
          description: Etiquetas associadas à 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
                  sujeito) e `COUNTERPARTY`.
              entity_type:
                type: string
                enum:
                  - individual
                  - company
                  - external
                  - unhostedWallet
              kind:
                type: string
                enum:
                  - USER
                  - BUSINESS
                  - EXTERNAL
                description: >-
                  As partes `USER`/`BUSINESS` ligam-se a uma entidade detida
                  pela Didit através de `vendor_data`. As partes `EXTERNAL` não
                  têm nenhuma entidade Didit associada.
              vendor_data:
                type: string
                nullable: true
                description: O seu identificador interno de utilizador/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` submetido
                  (normalmente ISO 3166-1 alpha-3).
              dob:
                type: string
                format: date
                nullable: true
                description: Data de nascimento a partir do `date_of_birth` submetido.
              address:
                type: object
                description: Objeto de morada conforme submetido. `{}` quando omitido.
              institution_info:
                type: object
                description: >-
                  Detalhes da instituição conforme submetidos. `{}` quando
                  omitidos.
              device:
                type: object
                description: >-
                  Contexto de dispositivo normalizado, incluindo enriquecimento
                  de IP do lado do servidor sob network_context (geolocalização,
                  flags de VPN/centro de dados) quando foi fornecido um IP.
                properties:
                  fingerprint:
                    type: string
                    description: Impressão digital única do dispositivo.
                  persistent_device_id:
                    type: string
                    description: >-
                      Identificador estável de dispositivo entre sessões
                      (esquema de fingerprint v2).
                  user_agent:
                    type: string
                    description: >-
                      Cadeia de caracteres do agente do utilizador do navegador
                      ou da aplicação.
                  browser_family:
                    type: string
                    description: >-
                      Família do navegador (por exemplo, Chrome, Firefox,
                      Safari).
                  browser_version:
                    type: string
                    description: Cadeia de caracteres 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 operativo (por exemplo, iOS, Android,
                      Windows).
                  os_version:
                    type: string
                    description: String da versão do sistema operativo.
                  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 determinado por geolocalização do IP (ISO 3166-1
                          alfa-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 associada a um utilizador ou
                  empresa Didit.
          description: Partes da transação (requerente, 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 de 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: O seu identificador para o utilizador/empresa proprietário.
              owner_name:
                type: string
                nullable: true
              institution_info:
                type: object
              details:
                type: object
                description: Objeto `payment_method` em bruto conforme submetido.
              external_owner_snapshot:
                type: object
                nullable: true
              role:
                type: string
                enum:
                  - SOURCE
                  - DESTINATION
                  - FUNDING
                  - BENEFICIARY
                description: >-
                  Como este método foi utilizado na transação. O endpoint de
                  criação atribui `SOURCE`/`DESTINATION` a partir do sentido
                  (saída: sujeito = SOURCE; entrada: sujeito = DESTINATION).
          description: Métodos de pagamento associados à transação.
        documents:
          type: array
          description: >-
            Ficheiros anexados à transação a partir da consola. `[]` quando não
            existem ficheiros.
          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 transferência assinado de curta duração;
                        obtenha-o quando necessário em vez de o guardar.
                    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 registo de atividade (criação, notas, revisões manuais,
            alterações de estado).
        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 em aberto é uma transação com o
            estado `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 só é registada para regras correspondentes, pelo que
                  as avaliações em tempo real contêm sempre `true`.
              is_test:
                type: boolean
                description: >-
                  True quando a regra foi executada no modo TEST (sem efeito no
                  estado/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: Estado 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 inclui `field`,
                  `operator`, `expected_value`, o `current_value` lido a partir
                  da transação, `matched`, `group_index` e `group_logic`. Cada
                  entrada de agregação (velocidade / contagem / soma) inclui
                  `metric`, `field`, `operator`, `expected_value`, o
                  `computed_value` resultante da avaliação do agregado,
                  `window`, `filters`, `matched` e `sample_references`; as
                  agregações assíncronas diferidas 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`
                  null e os resultados dos seus membros sob as suas próprias
                  `conditions`.
              created_at:
                type: string
                format: date-time
          description: >-
            Resultados da execução por regra — que regra foi acionada, com que
            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 de resposta em bruto do fornecedor.
              created_at:
                type: string
                format: date-time
          description: >-
            Payloads em bruto do fornecedor (triagem 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 submetido, e também quando a Travel Rule
            está ativada e a transação foi criada com `transaction_category:
            travelRule` (a Didit inicia a troca por si própria, mesmo sem
            `travel_rule_details`). `null` quando não existe qualquer
            transferência ou verificação. Numa transferência de entrada, os
            dados `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: >-
            Instantâneo do grafo de transações/partes relacionadas utilizado
            pelo motor de regras. Corresponde ao `network_snapshot` submetido
            com a transação ou ao grafo que a Didit gera a partir de uma triagem
            AML de carteiras bem-sucedida (o qual substitui o submetido). `null`
            quando nenhum deles 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 remediação oferecida ao utilizador quando é necessária
            reverificação. Substituída por `action_required`, que é o bloco
            canónico; mantida para retrocompatibilidade.
          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 utilizador final necessária para concluir esta
            transação, ou null quando não houver nenhuma. Os SDKs da Didit
            iniciam automaticamente a ação por predefinição e atualizam a
            transação quando esta termina. Duas variantes, distinguidas por
            `type`: `verification_session` (uma sessão de verificação alojada
            criada por uma ação de regra) e `wallet_ownership` (uma sessão de
            widget de propriedade da carteira criada automaticamente para uma
            transferência da Travel Rule que necessita de comprovativo de
            controlo da carteira, condicionada pela definição da Travel Rule
            `auto_wallet_verification`). Quando ambas se podem aplicar,
            `wallet_ownership` tem precedência porque 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 constitui um novo item.
    TravelRuleUtxoEntry:
      type: object
      description: >-
        Uma entrada ou saída de uma transação UTXO, tal como a blockchain a
        registou.
      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 um input gasta.
        vout:
          type: integer
          nullable: true
          minimum: 0
          description: Opcional. O índice do output que é gasto por um input.
    TransactionTravelRule:
      type: object
      description: >-
        A transferência de Travel Rule de uma transação, tal como `GET
        /v3/transactions/{transaction_id}/`, o `201` de `POST /v3/transactions/`
        e cada linha de `GET /v3/transactions/` a devolvem. `direction`, `rail`,
        `counterparty_vasp`, `delivery`, `discovery`, `reason` e `next_actions`
        têm o mesmo formato que em `PATCH
        /v3/transactions/{transaction_id}/travel-rule/`, para que uma leitura de
        uma transação indique por que motivo a transferência está retida e o que
        fazer para prosseguir.
      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 ordenante. Para uma transferência de entrada, os valores da
            contraparte são ocultados até que a propriedade seja confirmada.
        beneficiary_data:
          type: object
          description: >-
            Parte beneficiária. Para uma transferência de entrada, os valores da
            contraparte são ocultados 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). Nulo até que uma seja executada. Os nomes comparados são
            mascarados em conjunto 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: >-
            Verdadeiro enquanto os dados pessoais da contraparte estiverem
            mascarados nesta resposta.
        metadata:
          type: object
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
          description: A que lado da troca pertence esta transferência.
        rail:
          type: string
          nullable: true
          description: >-
            O canal através do qual a transferência ocorreu: `INTERNAL`, `TRP`,
            `GTR`, `TRUST`, `VERIFYVASP`, `SYGNA` ou `EMAIL` (`TEST_VASP` numa
            aplicação 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 diligência devida de 0 a 100, onde quanto mais
                alto, melhor. Mesma escala que no diretório VASP.
            dd_score_breakdown:
              type: object
              description: >-
                Contribuições por componente para dd_score, um objeto por
                componente como no diretório VASP (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: Pontos máximos que este componente pode atribuir.
                  reason:
                    type: string
                    description: Código legível por máquina do veredito do componente.
                  detail:
                    type: string
                    description: Motivo legível por humanos para os pontos atribuídos.
            dd_assessed_at:
              type: string
              format: date-time
              nullable: true
              description: >-
                Quando a avaliação de diligência devida foi executada pela
                última vez. Nulo até que a contraparte tenha sido avaliada.
          description: >-
            O registo de diretório da contraparte, ou `null` quando a
            transferência não associa nenhum.
        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 deve nenhuma, por exemplo abaixo de
            `threshold_amount` ou para uma carteira autocustodiada declarada.
        discovery:
          type: array
          description: >-
            Como a Didit procurou a contraparte, uma entrada por passo
            executado. Vazio quando não foi executada qualquer deteção, por
            exemplo, numa transferência recebida.
          items:
            $ref: '#/components/schemas/TravelRuleDiscoveryStep'
        reason:
          type: string
          description: >-
            O motivo pelo qual uma transferência `COUNTERPARTY_VASP_NOT_FOUND`
            ou `COUNTERPARTY_VASP_NOT_REACHABLE` está bloqueada; `""` para
            qualquer outro estado. Uma falha na entrega determina-o primeiro,
            apenas em `COUNTERPARTY_VASP_NOT_REACHABLE`: `email_undeliverable`
            (o fornecedor de e-mail recusou o e-mail de conformidade e não resta
            nenhum endereço para tentar: quando foi enviado, num lembrete ou
            como uma devolução permanente comunicada posteriormente) ou
            `delivery_failed` (o canal que estava a efetuar a entrega falhou
            definitivamente: um canal de rede recusou a mensagem ou esgotou as
            tentativas, um host de identidade `TRP` não respondeu, ou o host
            `TRP` da contraparte não aceitou a consulta). Caso contrário, o
            rastreio de `discovery` determina-o: `awaiting_end_user` (nenhum
            passo identificou uma contraparte que a Didit consiga contactar),
            `directory_match_no_route` (um passo identificou um VASP de
            diretório que não tem rota), `picked_member_without_proven_wallet`
            (o utilizador final escolheu um cliente Didit que não comprovou o
            controlo da carteira), ou `no_directory_match` quando o rastreio não
            fornece outro motivo. Um novo envio faz avançar a transferência,
            pelo que o motivo é limpo. Consulte [Por que motivo uma
            transferência está
            bloqueada](/pt/transaction-monitoring/travel-rule#por-que-motivo-uma-transferência-está-bloqueada).
        next_actions:
          type: array
          description: >-
            O que faz a transferência avançar; `[]` para qualquer estado exceto
            `COUNTERPARTY_VASP_NOT_FOUND` ou `COUNTERPARTY_VASP_NOT_REACHABLE`.
            `email_undeliverable` disponibiliza `update_compliance_email` e, em
            seguida, `resend`. `delivery_failed` disponibiliza `resend`. Um
            motivo de descoberta disponibiliza `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 alojado a abrir para o utilizador final.
        session_id:
          type: string
          format: uuid
          description: ID da sessão de verificação.
        session_token:
          type: string
          description: >-
            Token de sessão, utilizado pelos SDKs móveis para iniciar o fluxo
            nativamente.
        status:
          type: string
          description: Estado 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 alojado de propriedade de carteira. Abra-o num
            navegador real - em dispositivos móveis, utilize
            SFSafariViewController ou um Chrome Custom Tab, nunca uma webview
            incorporada.
        widget_session_id:
          type: string
          format: uuid
          description: ID de 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 dos dados das partes da transferência com o que
        a outra parte sabe sobre o titular da carteira. Indica campos e
        resultados, nunca valores, para que permaneça legível enquanto os dados
        da contraparte estiverem mascarados. Null até que uma comparação tenha
        sido executada.
      properties:
        matched:
          type: boolean
          description: True quando nenhum campo comparado difere.
        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: >-
        Registo de auditoria do momento em que os dados da contraparte foram
        desmascarados. Nulo enquanto os dados ainda estiverem mascarados e para
        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 (a sua
            confirmação através da consola ou da 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 livro de endereços), own_verified_wallet (a carteira
            própria verificada do seu utilizador), inquiry_approved (a sua
            aprovação de um pedido TRP de entrada ou de uma mensagem GTR ou
            Sygna), known_payment_method (uma carteira com a qual o seu
            utilizador já pagou) ou travel_address (o Travel Address por
            carteira que nomeou a carteira).
        actor:
          type: string
          description: >-
            Quem o confirmou: o e-mail do utilizador da consola ou a etiqueta da
            chave de API. Em branco para uma decisão automática.
    TravelRuleDelivery:
      type: object
      description: >-
        O estado em que se encontra a mensagem mais recente que a transferência
        deve à outra parte. A Didit contacta a contraparte após o pedido que
        criou ou alterou a transferência ter retornado, pelo que este objeto
        indica se essa mensagem chegou ao destino: em fila, a ser enviada, a
        aguardar nova tentativa após um erro, entregue ou com falha. Uma falha
        da qual a rede ainda possa recuperar (sem resposta a tempo, ligação
        falhada, 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 a sexta tentativa também falhou, a transferência transita
        para `COUNTERPARTY_VASP_NOT_REACHABLE` com `last_error` na sua
        `timeline`; qualquer outra mensagem que falhe definitivamente é anotada
        na `timeline`. O `status` da transferência permanece a fonte da verdade
        para o intercâmbio 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
            quando é enviada). `ANSWER`: a sua aceitação ou recusa, devida à
            rede requerente (de entrada). `TXID`: o hash da transação on-chain,
            após concluir a transferência. `CANCEL`: o cancelamento, após
            cancelá-la. `POLL`: uma consulta de estado a uma rede que o
            disponibilize, repetida a cada 5 minutos enquanto a transferência
            aguarda a contraparte.
        status:
          type: string
          enum:
            - QUEUED
            - SENDING
            - RETRYING
            - DELIVERED
            - FAILED
          description: >-
            `QUEUED`: a aguardar envio. `SENDING`: tentativa em curso.
            `RETRYING`: uma tentativa falhou e a próxima será executada em
            `next_attempt_at`. `DELIVERED`: o outro lado aceitou a mensagem.
            `FAILED`: o outro lado recusou-a, ou a última tentativa falhou.
        rail:
          type: string
          enum:
            - INTERNAL
            - TRP
            - GTR
            - TRUST
            - VERIFYVASP
            - SYGNA
            - EMAIL
            - ''
          description: >-
            O canal que transporta a mensagem. Vazio até que a Didit escolha um
            para uma primeira mensagem.
        attempts:
          type: integer
          minimum: 0
          description: >-
            Tentativas efetuadas até ao momento para esta mensagem. Uma mensagem
            que não seja uma sondagem de estado é tentada no máximo 6 vezes.
        last_error:
          type: string
          description: >-
            O tipo de falha ocorrida na última tentativa, `""` se não tiver
            ocorrido nenhuma: por exemplo `email undeliverable`, `trp identity
            endpoint unreachable` ou `trp transfer inquiry delivery failed`.
            Nunca inclui a resposta da própria contraparte, que permanece na
            `timeline` da transferência.

            Quando a GTR responde com um erro, o respetivo código de estado e
            mensagem 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 estiver
            em `QUEUED` ou `RETRYING`.
        delivered_at:
          type: string
          format: date-time
          nullable: true
          description: Quando a outra parte recebeu a mensagem.
    TravelRuleDiscoveryStep:
      type: object
      description: >-
        Um passo da deteção de contraparte que a Didit executou para uma
        transferência de saída, na ordem em que foram executados. O primeiro
        passo que identifique um VASP com uma rota termina 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 provou o
            controlo da carteira de destino. `wallet_attribution`: a atribuição
            da carteira na análise de blockchain. `network_lookup`: uma rede que
            pode indicar qual VASP detém o endereço. `customer_hint`: o nome do
            VASP, LEI ou jurisdição que enviou em `beneficiary_data`.
            `end_user`: a contraparte que o utilizador final (ou você) escolheu,
            ou o pedido para escolher uma.
        outcome:
          type: string
          enum:
            - match
            - miss
            - skipped
          description: >-
            `match`: o passo indicou uma contraparte. `miss`: foi executado e
            não encontrou nenhuma. `skipped`: não pôde ser executado, e `reason`
            indica o motivo.
        reason:
          type: string
          description: >-
            Motivo legível por máquina, `""` numa 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 pelo passo, quando este tiver indicado
            um.
        rail:
          type: string
          nullable: true
          description: O canal que alcança essa contraparte, quando o passo encontrou um.
        at:
          type: string
          format: date-time
    TravelRuleNextAction:
      type: object
      description: >-
        Um elemento que faz avançar uma transferência com
        `COUNTERPARTY_VASP_NOT_FOUND` ou `COUNTERPARTY_VASP_NOT_REACHABLE`.
        Consulte [Por que motivo uma transferência está
        bloqueada](/pt/transaction-monitoring/travel-rule#por-que-motivo-uma-transferência-está-bloqueada).
      properties:
        action:
          type: string
          enum:
            - select_counterparty_vasp
            - declare_self_hosted
            - add_vasp_hint
            - update_compliance_email
            - resend
          description: >-
            `select_counterparty_vasp`: o utilizador final escolhe o VASP de
            destino no widget de titularidade da carteira, ou você envia um
            PATCH com `action=beneficiary_vasp`. `declare_self_hosted`: o
            utilizador final declara a carteira como autocustodiada no widget.
            `add_vasp_hint`: indique à Didit quem é a contraparte, com um nome
            de VASP, LEI ou Travel Address (por exemplo, um `travel_address` na
            entrada do livro de endereços da carteira de destino) e, em seguida,
            reenvie. `update_compliance_email` e `resend` são valores de
            `action` de `PATCH /v3/transactions/{transaction_id}/travel-rule/`:
            forneça novamente o e-mail de conformidade da contraparte e execute
            o encaminhamento outra vez.
        url:
          type: string
          format: uri
          description: >-
            A ligação do widget de titularidade da carteira, em
            `select_counterparty_vasp` e `declare_self_hosted` enquanto a
            transferência tem uma sessão do widget aberta.
      required:
        - action
    TravelRuleChainDetails:
      type: object
      description: >-
        Como a blockchain da transferência designa as suas duas carteiras,
        quando se trata de mais do que um endereço a pagar a outro. Vazio (`{}`)
        para uma transferência numa blockchain baseada em contas (EVM, Solana,
        Tron), onde os dois endereços são as carteiras. A correspondência, o
        encaminhamento e o livro de endereços leem primeiro as carteiras 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: >-
            Numa transferência UTXO: as entradas e saídas conforme armazenadas
            (quantias como cadeias decimais) e quais saídas a Didit interpretou
            como o quê.
          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 ao beneficiário; null quando não foi possível
                distingui-la.
        lightning:
          type: object
          description: >-
            Numa transferência Lightning: o conteúdo do pedido de pagamento.
            Sempre `kind` (`bolt11`, `bolt12_offer`, `bolt12_invoice`,
            `bolt12_invoice_request`, `lnurl`, `lightning_address`, `node_id` ou
            `unknown`); uma fatura BOLT11 adiciona `network`, `payee_node_id`,
            `payment_hash`, `amount_msat`, `created_at` e `expires_at`; uma
            cadeia BOLT12 adiciona `blinded_paths` e `payee_node_id`; um LNURL
            ou um Lightning Address adiciona o seu `domain`. Nada é resolvido
            através da rede: o pedido é apenas descodificado.
          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 ordenante declarado
            não é uma entrada, o beneficiário declarado não é uma saída, nenhuma
            saída individual de beneficiário pôde ser identificada ou a saída do
            beneficiário paga um montante diferente do indicado na transação.
        not_applicable_reason:
          type: string
          enum:
            - LIGHTNING_NO_PAYEE_IDENTIFIER
            - LIGHTNING_BOLT12_BLINDED_PAYEE
            - LIGHTNING_LNURL_NAMES_NO_PAYEE
          description: >-
            Numa transferência Lightning de saída cujo pedido de pagamento não
            indique um beneficiário: o motivo pelo qual a transferência é
            `NOT_APPLICABLE`. `LIGHTNING_NO_PAYEE_IDENTIFIER` (o pedido não
            indica o nó do beneficiário ou não pôde ser descodificado),
            `LIGHTNING_BOLT12_BLINDED_PAYEE` (a oferta oculta o seu beneficiário
            através de caminhos ocultos), `LIGHTNING_LNURL_NAMES_NO_PAYEE` (um
            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. Numa rede memo, o endereço clássico (um endereço X do
            XRP é dividido no seu endereço clássico e na respetiva etiqueta); na
            Lightning, o ID do nó do beneficiário ou o Lightning Address.
        memo:
          type: string
          description: >-
            A tag ou memo de destino que faz parte da carteira; `""` quando não
            existe nenhum memo.
        source:
          type: string
          enum:
            - declared
            - x_address
            - largest_input
            - only_non_change_output
            - amount_match
            - invoice_payee
            - updated
          description: >-
            Origem da carteira: `declared` (o seu pedido), `x_address` (dividido
            a partir de um X-address de 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 montante da transferência), `invoice_payee` (o beneficiário
            indicado por um pedido de pagamento Lightning), `updated` (definido
            posteriormente com `action: update_originator_wallet`).
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        A chave de API da sua aplicação, a partir de Programadores -> Chaves de
        API na Business Console. A chave principal tem acesso total. Uma chave
        nomeada pode ter o âmbito definido: nenhum, 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á
        incorreta, 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 o
        pedido veio de um endereço fora da sua lista de IP; 404 numa rota de
        sessão significa que a sessão está fora dos fluxos ou estados da chave.
        Uma chave sem acesso a multimédia recebe URLs de imagens, vídeos e PDFs
        como nulos, e uma chave sem permissão de escrita em sessões recebe
        ligações de sessão e tokens como nulos. Consulte
        https://docs.didit.me/console/api-keys.

````

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