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

# Sandbox da Travel Rule: guia de testes com o Test VASP

> Na sandbox da Didit, teste a Travel Rule com o Test VASP: aceite, recusa, nome divergente, inacessível, timeout e carteira autocustodiada.

Uma aplicação de sandbox troca dados de Travel Rule com uma única contraparte: o **Didit Test VASP**, um VASP de teste integrado à plataforma. Ele responde a cada transferência da forma que você pedir, pelo mesmo código que lida com uma contraparte real, para que você possa acompanhar cada status, entrada da linha do tempo e webhook de uma troca antes de entrar em produção.

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

## Antes de começar

1. Use a chave de API de uma aplicação de **sandbox**. Aplicações de produção nunca se conectam ao VASP de teste.
2. Ative a Travel Rule com uma razão social:

```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, inscreva um destino do webhook em `travel_rule.status.updated`. O sandbox entrega esse evento, marcado com `"environment": "sandbox"`.

## O Didit Test VASP

`GET /v1/sandbox/scenarios/` retorna o perfil do VASP de teste e todos os cenários no objeto `travel_rule`, para que seus testes possam ler os valores de gatilho em vez de fixá-los no código:

| Campo | Valor |
| - | - |
| `legal_name` | `Didit Test VASP` |
| `lei` | `DIDITESTVASP00000001`, bem-formado, mas não registrado |
| `jurisdiction` | `GB` |
| `compliance_email` | Um endereço no domínio `didit.test`, para o qual nunca são enviados e-mails |
| `travel_address` | Um Travel Address em um host `.test`, nunca acessível |
| `network_codes` | Códigos de teste que nunca são discados |
| `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 de Travel Rule, e nenhum resultado no sandbox demonstra que uma contraparte ou rede real pode ser alcançada.

## Cenários de saída

Toda transação `travelRule` de saída de uma aplicação de sandbox que precisa de uma troca de informações vai para o VASP de teste. Escolha o resultado pelo endereço da carteira do beneficiário (maiúsculas e minúsculas não importam) ou por um nome de beneficiário no formato `Didit Test VASP <suffix>`; a carteira prevalece quando ambos sã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 próprio usuário e uma cuja carteira da contraparte você declarou como autocustodiada. Um VASP de contraparte que você ou seu usuário final escolheu manualmente no diretório é avaliado pelas rotas que uma aplicação de produção teria: quando a entrada dele tem uma rota (um endpoint `TRP` verificado, uma rede pela qual sua aplicação envia ou um contato 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 em uma aplicação de produção.

| Cenário | Sufixo do nome | Carteira (ETH) | Termina em |
| - | - | - | - |
| `accept` | nenhum | `0xc00c4cd93ff83953ce3347b33656d68ab8f35cfb` | `COMPLETED`, depois `FINISHED` quando você informa `payment_txn_id` |
| `decline` | `Decline` | `0x7694c5b0213859ef409107853a36ff7c85835f18` | `COUNTERPARTY_VASP_GENERAL_DECLINE` |
| `name_mismatch` | `Name Mismatch` | `0x501b7a0886e31f516aaf54fa99107d2377bd2d3e` | `COUNTERPARTY_MISMATCHED_DATA`, conforme sua regra de nome (com `NONE`, é concluída) |
| `not_reachable` | `Not Reachable` | `0xf0e986c1a1c3ae41629bf5cdcee0a67dd1eb0cce` | `COUNTERPARTY_VASP_NOT_REACHABLE` após o cronograma real de novas tentativas (30 segundos, depois 2, 10, 30 e 60 minutos, cerca de uma hora e 45 minutos no total), e então pode ser reenviada |
| `timeout` | `Timeout` | `0xb63a1b1d4bee82d109332187cbf5b657eb7da498` | `EXPIRED` na primeira verificação após o prazo de um minuto, ou seja, em cerca de 15 minutos; em seguida, seu `timeout_outcome` é aplicado |
| `self_hosted` | `Self Hosted` | `0x33dcc2a7e69cf965f7f4eaf6ba657bcb078a2b65` | `UNCONFIRMED_OWNERSHIP`, depois `COMPLETED` quando a prova de propriedade da carteira é registrada |

```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 o VASP beneficiário. Acompanhe-a pelos webhooks `travel_rule.status.updated` ou consulte `GET /v3/transactions/{transaction_id}/`.

* **`name_mismatch`** compara o nome do beneficiário que você enviou com o nome do titular informado pelo VASP de teste, conforme 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é você defini-las). A transferência e a entrada da linha do tempo que determinou esse resultado trazem `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 a coloca em `COUNTERPARTY_VASP_NOT_REACHABLE`. Envie `{"action": "resend"}` em seguida para executá-la novamente.
* **`self_hosted`** recebe do VASP de teste a resposta de que a carteira é autocustodiada. Registre a prova com o [widget de propriedade de carteira](https://docs.didit.me/pt-br/transaction-monitoring/wallet-ownership-widget.md) (gerado para você enquanto `auto_wallet_verification` estiver ativado) ou com [`POST .../travel-rule/ownership/`](https://docs.didit.me/pt-br/management-api/travel-rule/confirm-ownership) e `{"confirmed": true}`: a carteira é adicionada ao seu catálogo de endereços com o nome do beneficiário, e a correspondência de nome determina o resultado da transferência. Uma correspondência a conclui e marca a carteira como verificada; `{"confirmed": false}` a recusa.

## Transferências recebidas do VASP de teste

Para testar o lado receptor, peça ao VASP de teste que envie uma transferência para você com `POST /v3/travel-rule/test-vasp/inbound/`. Indique uma das carteiras do [catálogo de endereços](https://docs.didit.me/pt-br/transaction-monitoring/travel-rule.md#catálogo-de-endereços-de-carteiras) da sua própria aplicação: a transferência é decidida pelo mesmo caminho de entrada de uma transferência real, com base no seu catálogo 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 próprio catálogo de endereços: qualquer outra carteira é registrada como `ON_HOLD`. |
| `scenario` | `accept` (padrão): o VASP de teste indica o próprio titular da carteira. `name_mismatch`: ele indica alguém cujo nome não corresponde ao de nenhum titular. |
| `chain`, `amount`, `currency` | Opcionais. Padrão `ETH`, `1` e `ETH`. |
| `reference` | Opcional, até 128 caracteres. Enviar a mesma `reference` novamente retorna a primeira resposta (`201`) e não registra nada novo. |

A resposta `201` traz `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 valor de `scenario` recebe `400` e uma aplicação com a Travel Rule desativada recebe `409`.

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

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

Um depósito que você mesmo informa com `POST /v3/transactions/` não foi enviado pelo VASP de teste: ele permanece em `AWAITING_COUNTERPARTY` aguardando o VASP remetente, e sua linha do tempo indica o endpoint acima. Ele não dispara nenhum webhook até expirar após `confirmation_timeout_hours`. [`POST /v3/travel-rule/inbound/`](https://docs.didit.me/pt-br/management-api/travel-rule/register-inbound) continua liquidando um registro posterior ao depósito com base no seu catálogo de endereços, como em uma aplicação de produção.

## Webhooks no sandbox

`travel_rule.status.updated` é disparado para aplicações de sandbox a cada mudança de status, com `"environment": "sandbox"`. Uma transferência à qual o VASP de teste respondeu também traz `rail: "TEST_VASP"`, `test_vasp: true` e `test_vasp_scenario`. O restante do sandbox continua se comportando como descrito em [Monitoramento de transações no sandbox](https://docs.didit.me/pt-br/integration/sandbox-testing.md#monitoramento-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 associação a uma rede ou o host TRP público da Didit funciona. Nenhum deles é contatado.
* Que suas credenciais de rede são válidas. Uma associação conectada é comprovada pela sua primeira troca em produção.
* As rotas do [diretório](https://docs.didit.me/pt-br/transaction-monitoring/travel-rule.md#diretório) de VASPs reais: em uma aplicação de sandbox, toda rota aparece como `unavailable` com `reason: sandbox_application`, e toda linha como `reachable: false`.

Consulte [Redes da Travel Rule](https://docs.didit.me/pt-br/transaction-monitoring/travel-rule-networks.md) para saber o alcance de cada rail em produção hoje.


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