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

# Submeter Transação via SDK: KYT do Lado do Cliente

> Submeta transações monitorizadas com um token SDK da Didit: análise de dispositivo automática e action_required para carteiras.



Prompt da API: submeter transação (token SDK)
        Copiar o prompt para a área de transferência



      
      

\<pre>

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

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

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

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

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

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

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

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

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

\</pre>



      
      

Colar em



## OpenAPI

````yaml pt/openapi-25.json POST /v1/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:
  /v1/transactions/:
    post:
      tags:
        - Transactions
      summary: Submeter uma transação a partir de um SDK
      description: >-
        Endpoint virado para o dispositivo que os SDKs da Didit chamam para
        submeter uma transação diretamente a partir do dispositivo do utilizador
        final. A autenticação é um token com âmbito de `POST
        /v3/transactions/sdk-token/` enviado no cabeçalho `X-Transaction-Token`
        em vez de uma chave de API, e o endpoint tem CORS ativado para que os
        navegadores possam chamá-lo entre origens. O payload utiliza os aliases
        de transmissão camelCase mostrados abaixo (os métodos
        `submitTransaction` do SDK constroem-no por si). Três garantias do lado
        do servidor: a aplicação é sempre obtida a partir do token; a identidade
        do sujeito (`externalUserId`) é sempre aplicada a partir de
        `vendor_data` do token, pelo que valores de payload falsificados são
        ignorados; e a inteligência de dispositivos (a impressão digital do
        dispositivo do SDK mais o IP e o agente do utilizador derivados pelo
        servidor) é associada ao sujeito automaticamente.
      operationId: submitTransactionFromSdk
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                txnId:
                  type: string
                  description: >-
                    O seu identificador exclusivo para esta transação (mapeia
                    para `transaction_id`, máx. 128 carateres).
                  example: wd-2026-07-07-0042
                txnDate:
                  type: string
                  format: date-time
                  description: >-
                    Quando a transação ocorreu (mapeia para `transaction_at`). O
                    padrão é o momento atual se omitido.
                zoneId:
                  type: string
                  description: >-
                    Identificador de fuso horário IANA (mapeia para
                    `time_zone`), ex.: `Europe/Madrid`.
                type:
                  type: string
                  description: >-
                    Categoria da transação (mapeia para `transaction_category`),
                    por exemplo, `finance`, `kyc`, `travelRule`,
                    `userPlatformEvent`, `gamblingBet`.
                  example: travelRule
                info:
                  type: object
                  description: >-
                    Detalhes financeiros principais da transação (mapeia para
                    `transaction_details`).
                  required:
                    - direction
                    - amount
                    - currency
                  properties:
                    direction:
                      type: string
                      description: >-
                        Direçã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: out
                    amount:
                      type: number
                      description: >-
                        Montante da transação (até 18 casas decimais). Também é
                        aceite uma string decimal e é a única forma de preservar
                        mais de cerca de 15 dígitos significativos: um número
                        JSON é analisado primeiro como um float binário, pelo
                        que `0.123456789012345678` é armazenado como
                        `0.12345678901234568`.
                      example: 0.25
                    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 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 `amountInDefaultCurrency` pré-convertido.
                      example: ETH
                    currencyType:
                      type: string
                      description: >-
                        Indica se a moeda é `fiat` ou `crypto` (associa-se a
                        `currency_kind`).
                    amountInDefaultCurrency:
                      type: number
                      nullable: true
                      description: >-
                        Montante pré-convertido na moeda padrão (mapeia para
                        `amount_in_default_currency`). Se omitido, é tentada a
                        conversão cambial automática.
                    defaultCurrencyCode:
                      type: string
                      description: >-
                        O código de moeda predefinido para o montante convertido
                        (mapeia para `default_currency`). Qualquer código ISO
                        4217 atualmente em circulação.
                    paymentDetails:
                      type: string
                      nullable: true
                      description: >-
                        Referência ou memorando de pagamento em texto livre
                        (associa-se a `payment_details`).
                    paymentTxnId:
                      type: string
                      nullable: true
                      description: >-
                        Referência de pagamento externa (mapeia para
                        `payment_reference_id`); o hash da transação on-chain
                        para transações de criptomoeda.
                    type:
                      type: string
                      nullable: true
                      description: >-
                        Subtipo da transação (mapeia para `action_type`), p. ex.
                        `deposit`, `withdrawal`, `transfer`.
                    cryptoParams:
                      type: object
                      description: >-
                        Parâmetros específicos de criptomoeda, por exemplo,
                        `{"crypto_chain": "ETH"}`.
                subject:
                  type: object
                  description: >-
                    O sujeito (requerente) da transação. `externalUserId` é
                    ignorado aqui: a identidade do sujeito é sempre imposta a
                    partir de `vendor_data` do token.
                  required:
                    - fullName
                  properties:
                    type:
                      type: string
                      description: >-
                        Tipo de entidade (mapeia para `entity_type`):
                        `individual` (por predefinição) ou `company`.
                    externalUserId:
                      type: string
                      description: >-
                        Ignorado no sujeito - aplicado no lado do servidor a
                        partir do `vendor_data` do token.
                    fullName:
                      type: string
                      example: Jane Doe
                    firstName:
                      type: string
                    lastName:
                      type: string
                    dob:
                      type: string
                      format: date
                      description: >-
                        Data de nascimento (YYYY-MM-DD; mapeia para
                        `date_of_birth`).
                    address:
                      type: object
                      description: >-
                        Objeto de morada com `country` (ISO 3166-1 alfa-3),
                        `town`, `state`, `street`, `post_code`.
                    institutionInfo:
                      type: object
                      description: >-
                        Detalhes da instituição para participantes
                        institucionais (mapeia para `institution_details`).
                    device:
                      type: object
                      description: >-
                        Contexto de dispositivo explícito opcional. Combinado
                        com as informações de dispositivo recolhidas
                        automaticamente; os campos derivados do servidor
                        prevalecem em caso de conflito.
                    paymentMethod:
                      type: object
                      description: >-
                        Método de pagamento utilizado pelo sujeito (mapeia para
                        `payment_method`).
                      properties:
                        type:
                          type: string
                          description: >-
                            Tipo de método de pagamento (mapeia para
                            `method_type`), por exemplo, `bank_card`,
                            `bank_account`, `crypto_wallet`, `ewallet`,
                            `unhosted_wallet`, `other`.
                        accountId:
                          type: string
                          description: >-
                            Identificador de conta (mapeia para `account_id`):
                            IBAN, impressão digital do cartão ou endereço de
                            carteira.
                        issuingCountry:
                          type: string
                          description: >-
                            Código de país ISO 3166-1 alfa-3 do emissor (mapeia
                            para `issuing_country`).
                counterparty:
                  type: object
                  description: >-
                    A contraparte da transação (opcional). Mesma estrutura que
                    `subject`; `externalUserId` tem relevância aqui.
                  properties:
                    type:
                      type: string
                      description: >-
                        Tipo de entidade (mapeia para `entity_type`):
                        `individual` ou `company`.
                    externalUserId:
                      type: string
                      description: >-
                        O seu identificador interno para a contraparte (mapeia
                        para `vendor_data`).
                    fullName:
                      type: string
                    firstName:
                      type: string
                    lastName:
                      type: string
                    dob:
                      type: string
                      format: date
                    address:
                      type: object
                    institutionInfo:
                      type: object
                    device:
                      type: object
                    paymentMethod:
                      type: object
                      description: >-
                        Método de pagamento utilizado pela contraparte (mapeia
                        para `payment_method`). Em transações de travelRule,
                        `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 é criada
                        automaticamente e devolvida em `action_required` para
                        que o SDK a possa iniciar.
                      properties:
                        type:
                          type: string
                          description: >-
                            Tipo de método de pagamento (mapeia para
                            `method_type`), por exemplo, `bank_card`,
                            `bank_account`, `crypto_wallet`, `ewallet`,
                            `unhosted_wallet`, `other`. Utilize
                            `unhosted_wallet` para declarar uma carteira
                            autocustodiada para a Travel Rule.
                        accountId:
                          type: string
                          description: >-
                            Identificador de conta (mapeia para `account_id`):
                            IBAN, impressão digital do cartão ou endereço de
                            carteira.
                        issuingCountry:
                          type: string
                props:
                  type: object
                  additionalProperties: true
                  description: >-
                    Pares chave-valor personalizados (mapeia para
                    `custom_properties`). Cada chave pode ser referenciada em
                    condições de regras como `custom_values.<key>`.
                travelRule:
                  type: object
                  description: >-
                    Detalhes da Travel Rule (mapeia para `travel_rule_details`).
                    Quando a Travel Rule está ativada para a aplicação, a Didit
                    ignora qualquer `status` que envie e gere a troca por si
                    própria.
                  required:
                    - status
                  properties:
                    status:
                      type: string
                    protocol:
                      type: string
                    required:
                      type: boolean
                    obligationsCount:
                      type: integer
                    originatorData:
                      type: object
                    beneficiaryData:
                      type: object
                    metadata:
                      type: object
                includeCryptoScreening:
                  type: boolean
                  nullable: true
                  description: >-
                    Substituição por transação para a triagem de análise de
                    blockchain de criptoativos (mapeia para
                    `include_crypto_screening`).
                fingerprint_v2:
                  type: object
                  description: >-
                    O payload de impressão digital do dispositivo `didit-fp-v2`.
                    Injetado automaticamente pelos SDKs; apenas relevante ao
                    chamar diretamente a wire API.
              required:
                - txnId
                - type
                - info
                - subject
            example:
              txnId: wd-2026-07-07-0042
              type: travelRule
              info:
                direction: out
                amount: '0.25'
                currency: ETH
                currencyType: crypto
                cryptoParams:
                  crypto_chain: ETH
              subject:
                fullName: Jane Doe
              counterparty:
                fullName: Ana Diaz
                paymentMethod:
                  type: unhosted_wallet
                  accountId: 0xBeneficiaryWallet01
              travelRule:
                status: AWAITING_COUNTERPARTY
                beneficiaryData:
                  wallet_address: 0xBeneficiaryWallet01
                  name: Ana Diaz
              includeCryptoScreening: true
      responses:
        '201':
          description: >-
            Transação submetida e monitorizada. Mesma estrutura de detalhes de
            `GET /v3/transactions/{transaction_id}/`, incluindo o bloco
            `action_required` quando o utilizador final tem de concluir uma ação
            de seguimento (os SDKs iniciam-na automaticamente por predefinição).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransactionDetail'
              examples:
                Wallet ownership required:
                  value:
                    uuid: 22222222-3333-4444-5555-666666666666
                    txn_id: wd-2026-07-07-0042
                    transaction_type: travelRule
                    direction: OUTBOUND
                    status: APPROVED
                    amount: '0.25'
                    currency: ETH
                    travel_rule:
                      uuid: 33333333-4444-5555-6666-777777777777
                      status: UNCONFIRMED_OWNERSHIP
                      required: true
                    action_required:
                      type: wallet_ownership
                      url: https://verify.didit.me/wallet-ownership/3s9x...urlsafe
                      widget_session_id: 77777777-8888-9999-aaaa-bbbbbbbbbbbb
                      expires_at: '2026-07-07T13:00:00Z'
        '400':
          description: >-
            A validação falhou (campos obrigatórios em falta, `txnId` duplicado,
            categoria desconhecida).
          content:
            application/json:
              examples:
                Missing fields:
                  value:
                    transaction_details:
                      currency:
                        - This field is required.
                Duplicate txnId:
                  value:
                    transaction_id:
                      - A transaction with this transaction_id already exists.
        '401':
          description: >-
            O token de transação foi rejeitado: em falta, desconhecido,
            revogado, excedeu o respetivo `max_uses` ou expirou. As respostas de
            token expirado contêm sempre a palavra `expired` nos detalhes, sendo
            assim que os SDKs distinguem os erros `expired_token` de
            `invalid_token`.
          content:
            application/json:
              examples:
                Invalid token:
                  value:
                    detail: Invalid transaction token.
                Expired token:
                  value:
                    detail: Transaction token expired.
        '409':
          description: >-
            Outro pedido com o mesmo `txnId` 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.
      security:
        - TransactionTokenAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST https://verification.didit.me/v1/transactions/ \
              -H 'X-Transaction-Token: SDK_TOKEN' -H 'Content-Type: application/json' \
              -d '{"txnId": "wd-2026-07-07-0042", "type": "travelRule", "info": {"direction": "out", "amount": "0.25", "currency": "ETH", "currencyType": "crypto"}, "subject": {"fullName": "Jane Doe"}, "counterparty": {"fullName": "Ana Diaz", "paymentMethod": {"type": "unhosted_wallet", "accountId": "0xBeneficiaryWallet01"}}, "travelRule": {"status": "AWAITING_COUNTERPARTY", "beneficiaryData": {"wallet_address": "0xBeneficiaryWallet01", "name": "Ana Diaz"}}, "includeCryptoScreening": true}'
        - lang: javascript
          label: Web SDK
          source: |-
            import { DiditSdk } from '@didit-protocol/sdk-web';

            const result = await DiditSdk.shared.submitTransaction({
              transactionToken: sdkToken,
              transaction: {
                txnId: 'wd-2026-07-07-0042',
                category: 'travelRule',
                details: { direction: 'out', amount: '0.25', currency: 'ETH', currencyType: 'crypto' },
                subject: { fullName: 'Jane Doe' },
                counterparty: { fullName: 'Ana Diaz', paymentMethod: { type: 'unhosted_wallet', accountId: '0xBeneficiaryWallet01' } },
                travelRule: { status: 'AWAITING_COUNTERPARTY', beneficiaryData: { wallet_address: '0xBeneficiaryWallet01', name: 'Ana Diaz' } },
                includeCryptoScreening: true
              },
              onActionCompleted: (refreshed) => console.log(refreshed.status)
            });
components:
  schemas:
    TransactionDetail:
      type: object
      description: >-
        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.
    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`).
    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.
  securitySchemes:
    TransactionTokenAuth:
      type: apiKey
      in: header
      name: X-Transaction-Token
      description: >-
        Token de curta duração com âmbito restrito gerado pelo seu backend
        através de POST /v3/transactions/sdk-token/. Utilizado pelos SDKs da
        Didit nos endpoints /v1/transactions/ direcionados ao dispositivo.

````

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