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

# Teste da Travel Rule em sandbox

> Teste todos os resultados da Travel Rule no sandbox da Didit contra o VASP de teste: aceitação, recusa, nome incompatível, timeout e carteiras.

Uma aplicação sandbox troca dados da Travel Rule com uma única contraparte: o **Didit Test VASP**, um VASP de teste integrado na plataforma. Responde a cada transferência da forma que lhe indicar, através do mesmo código que trata uma contraparte real, para que possa acompanhar cada estado, entrada da cronologia e webhook de uma troca antes de passar para produção.

Nada do que envia no sandbox sai da Didit. Nenhuma rede, destinatário de e-mail ou outro cliente da Didit é alguma vez contactado, e nada é cobrado.

## Antes de começar

1. Use a chave de API de uma aplicação **sandbox**. As aplicações de produção nunca chegam ao VASP de teste.
2. Ative a Travel Rule com um nome legal:

```bash theme={null}
curl -X PUT https://verification.didit.me/v3/travel-rule/settings/ \
  -H "x-api-key: YOUR_SANDBOX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"is_enabled": true, "legal_name": "Example CASP Sandbox"}'
```

3. Opcionalmente, subscreva um destino de webhook para `travel_rule.status.updated`. O sandbox envia-o, marcado com `"environment": "sandbox"`.

## O VASP de teste da Didit

`GET /v1/sandbox/scenarios/` devolve o perfil do VASP de teste e todos os cenários do seu objeto `travel_rule`, para que os seus testes leiam os valores de acionamento em vez de os fixarem no código:

| Campo | Valor |
| - | - |
| `legal_name` | `Didit Test VASP` |
| `lei` | `DIDITESTVASP00000001`, bem formado mas não registado |
| `jurisdiction` | `GB` |
| `compliance_email` | Um endereço sob `didit.test`, nunca enviado por e-mail |
| `travel_address` | Um travel address sob um host `.test`, nunca contactável |
| `network_codes` | Códigos de teste que nunca são marcados |
| `default_scenario` | `accept` |
| `inbound_scenarios` | `["accept", "name_mismatch"]` |

Todos os valores são dados de teste. O VASP de teste não é membro de nenhuma rede da Travel Rule, e nenhum resultado no sandbox mostra que uma contraparte ou rede real pode ser contactada.

## Cenários de saída

Todas as transações `travelRule` de saída de uma aplicação sandbox que precise de uma troca são encaminhadas para o VASP de teste. Escolha o resultado através do endereço de carteira do beneficiário (as maiúsculas e minúsculas não importam) ou através de um nome de beneficiário no formato `Didit Test VASP <suffix>`; a carteira prevalece quando ambos estão definidos. Sem nenhum dos dois, ou com um sufixo que a tabela não lista, a transferência é concluída (`accept`).

Uma transferência que não precisa de troca nunca chega ao VASP de teste: uma abaixo do seu `threshold_amount`, uma para a carteira verificada do seu utilizador e uma cuja carteira da contraparte tenha sido declarada por si como autocustodiada. Um VASP de contraparte que escolheu manualmente no diretório, por si ou pelo seu utilizador final, é avaliado pelas rotas que uma aplicação de produção usaria: quando a entrada tem uma (um endpoint `TRP` verificado, uma rede pela qual a sua aplicação envia ou um contacto de conformidade), a transferência vai para o VASP de teste; quando não tem nenhuma, a transferência termina em `COUNTERPARTY_VASP_NOT_FOUND`, como aconteceria numa aplicação de produção.

| Cenário | Sufixo do nome | Carteira (ETH) | Termina em |
| - | - | - | - |
| `accept` | nenhum | `0xc00c4cd93ff83953ce3347b33656d68ab8f35cfb` | `COMPLETED`, depois `FINISHED` assim que indicar `payment_txn_id` |
| `decline` | `Decline` | `0x7694c5b0213859ef409107853a36ff7c85835f18` | `COUNTERPARTY_VASP_GENERAL_DECLINE` |
| `name_mismatch` | `Name Mismatch` | `0x501b7a0886e31f516aaf54fa99107d2377bd2d3e` | `COUNTERPARTY_MISMATCHED_DATA`, na sua regra de nome (com `NONE` é concluída) |
| `not_reachable` | `Not Reachable` | `0xf0e986c1a1c3ae41629bf5cdcee0a67dd1eb0cce` | `COUNTERPARTY_VASP_NOT_REACHABLE` após o calendário real de novas tentativas (30 segundos, depois 2, 10, 30 e 60 minutos, cerca de uma hora e 45 minutos no total), depois reenviável |
| `timeout` | `Timeout` | `0xb63a1b1d4bee82d109332187cbf5b657eb7da498` | `EXPIRED` na primeira verificação de atraso após o prazo de um minuto, portanto em cerca de 15 minutos; depois aplica-se o seu `timeout_outcome` |
| `self_hosted` | `Self Hosted` | `0x33dcc2a7e69cf965f7f4eaf6ba657bcb078a2b65` | `UNCONFIRMED_OWNERSHIP`, depois `COMPLETED` assim que a prova de propriedade da carteira for registada |

```bash theme={null}
curl -X POST https://verification.didit.me/v3/transactions/ \
  -H "x-api-key: YOUR_SANDBOX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "transaction_id": "sbx-tr-accept-001",
    "transaction_category": "travelRule",
    "transaction_details": {
      "direction": "outbound",
      "action_type": "transfer",
      "amount": "0.25",
      "currency": "ETH",
      "currency_kind": "crypto"
    },
    "subject": { "entity_type": "individual", "vendor_data": "user-042", "full_name": "Jane Doe" },
    "travel_rule_details": {
      "status": "AWAITING_COUNTERPARTY",
      "beneficiary_data": {
        "wallet_address": "0xc00c4cd93ff83953ce3347b33656d68ab8f35cfb",
        "name": "Carlos Ruiz"
      }
    }
  }'
```

O `rail` da transferência é `TEST_VASP`, e a lista de transferências indica `Didit Test VASP` como VASP beneficiário. Acompanhe-a nos webhooks `travel_rule.status.updated` ou leia `GET /v3/transactions/{transaction_id}/`.

* **`name_mismatch`** compara o nome do beneficiário que enviou com o nome do titular que o VASP de teste devolve, segundo a sua regra de nome para o tipo de entidade do beneficiário (`matching_rules.individual.name` ou `matching_rules.company.name`, que seguem `name_matching_strictness` até os definir). A transferência e a entrada da cronologia que a decidiu incluem `name_match` (com `compared_with: "counterparty_vasp"`) e `data_match` com `mismatched_fields: ["name"]`.
* **`not_reachable`** mantém a transferência em `AWAITING_COUNTERPARTY` enquanto tenta novamente, com `delivery.status` `RETRYING` e `last_error` `test VASP is not answering`, e depois passa-a para `COUNTERPARTY_VASP_NOT_REACHABLE`. Envie `{"action": "resend"}` depois para a executar novamente.
* **`self_hosted`** faz com que o VASP de teste responda que a carteira é autocustodiada. Registe a prova com o [widget de verificação de propriedade da carteira](https://docs.didit.me/pt/transaction-monitoring/wallet-ownership-widget.md) (criado para si enquanto `auto_wallet_verification` estiver ativo) ou com [`POST .../travel-rule/ownership/`](https://docs.didit.me/pt/management-api/travel-rule/confirm-ownership) com `{"confirmed": true}`: a carteira é adicionada à sua agenda de endereços em nome do beneficiário, e a correspondência de nomes decide a transferência. Uma correspondência conclui-a e marca a carteira como verificada; `{"confirmed": false}` recusa-a.

## Transferências recebidas do VASP de teste

Para testar o lado de receção, peça ao VASP de teste que lhe envie uma transferência com `POST /v3/travel-rule/test-vasp/inbound/`. Indique uma das carteiras do [livro de endereços](https://docs.didit.me/pt/transaction-monitoring/travel-rule.md#livro-de-endereços-de-carteiras) da sua aplicação: a transferência é decidida pelo mesmo caminho de entrada que uma real, com base no seu livro de endereços, no seu modo de propriedade e nas suas regras de nome.

```bash theme={null}
curl -X POST https://verification.didit.me/v3/travel-rule/test-vasp/inbound/ \
  -H "x-api-key: YOUR_SANDBOX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "beneficiary_wallet_address": "0xYourDepositWallet",
    "scenario": "accept",
    "reference": "sbx-inbound-001"
  }'
```

| Campo | Descrição |
| - | - |
| `beneficiary_wallet_address` | Obrigatório, até 128 caracteres. Use uma das carteiras do seu livro de endereços: qualquer outra carteira fica registada como `ON_HOLD`. |
| `scenario` | `accept` (predefinido): o VASP de teste indica o titular da carteira. `name_mismatch`: indica alguém com quem nenhum titular concorda. |
| `chain`, `amount`, `currency` | Opcionais. Predefinidos: `ETH`, `1` e `ETH`. |
| `reference` | Opcional, até 128 caracteres. Enviar de novo o mesmo `reference` devolve a primeira resposta (`201`) e não regista nada de novo. |

A resposta `201` inclui `transaction_id`, `txn_id`, `scenario`, `travel_rule_status`, `detail`, `test_vasp: true` e a transferência `travel_rule`. Uma aplicação de produção recebe `400` (`"The Didit Test VASP is only available on sandbox applications."`), outro `scenario` recebe `400`, e uma aplicação com a Travel Rule desativada recebe `409`.

| A sua entrada de carteira | `accept` | `name_mismatch` |
| - | - | - |
| Nenhuma nessa cadeia | `ON_HOLD` | `ON_HOLD` |
| Propriedade não comprovada para o seu [modo de propriedade](https://docs.didit.me/pt/transaction-monitoring/travel-rule.md#modos-de-validação-de-propriedade) | `UNCONFIRMED_OWNERSHIP` | `UNCONFIRMED_OWNERSHIP` |
| Verificada | `COMPLETED` com `inbound_auto_accept` ativo, caso contrário `ON_HOLD` | `COUNTERPARTY_MISMATCHED_DATA` (com a regra de nome `NONE`, como `accept`) |

Decida uma transferência que esteja a aguardar através de [`POST .../travel-rule/ownership/`](https://docs.didit.me/pt/management-api/travel-rule/confirm-ownership), como faria com uma real: `{"confirmed": true}` conclui-a e `{"confirmed": false}` recusa-a.

Um depósito que você próprio reporta com `POST /v3/transactions/` não é uma transferência enviada pelo VASP de teste: fica `AWAITING_COUNTERPARTY` à espera do seu VASP de origem, e a cronologia indica o endpoint acima. Não dispara nenhum webhook até expirar após `confirmation_timeout_hours`. [`POST /v3/travel-rule/inbound/`](https://docs.didit.me/pt/management-api/travel-rule/register-inbound) continua a liquidar um registo posterior ao depósito contra o seu livro de endereços, como numa aplicação de produção.

## Webhooks no sandbox

`travel_rule.status.updated` é enviado para aplicações sandbox em cada alteração de estado, com `"environment": "sandbox"`. Uma transferência a que o VASP de teste respondeu inclui também `rail: "TEST_VASP"`, `test_vasp: true` e `test_vasp_scenario`. O resto do sandbox continua a comportar-se como descrito em [Monitorização de transações no sandbox](https://docs.didit.me/pt/integration/sandbox-testing.md#monitorização-de-transações-no-sandbox): as regras não são avaliadas, `transaction.created` e `transaction.status.updated` não são enviados, e nada é faturado.

## O que o sandbox não comprova

* Que uma contraparte real, uma adesão a uma rede ou o servidor TRP público da Didit funciona. Nenhum deles é contactado.
* Que as suas credenciais de rede são válidas. Uma adesão ligada só é comprovada pela primeira troca em produção.
* As rotas do [diretório](https://docs.didit.me/pt/transaction-monitoring/travel-rule.md#diretório) de VASPs reais: numa aplicação sandbox, cada rota aparece como `unavailable` com `reason: sandbox_application`, e cada linha com `reachable: false`.

Veja [Redes de Travel Rule](https://docs.didit.me/pt/transaction-monitoring/travel-rule-networks.md) para saber o que cada rail alcança atualmente em produção.


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