Test outbound data exchange in Sandbox

Submit an outbound Travel Rule transaction and trigger deterministic statuses by varying the transaction data.

Before running outbound Sandbox Travel Rule tests, make sure that you have the following set up correctly:

How outbound Sandbox testing works

When you submit a Travel Rule transaction in Sandbox:

  1. You create an outbound transaction with the pre-defined wallet addresses, asset values, and VASP identifiers, as described in the Test VASP transaction data table.
  2. Sumsub routes the transaction through a deterministic test scenario.
  3. System returns the expected Travel Rule status for that scenario.

In most cases, the outcome depends on:

  • Wallet address.
  • Asset and chain.
  • Beneficiary name.
  • Whether the counterparty is marked as hosted or unhosted.
  • Whether a specific test VASP identifier is provided.

Recommended testing workflow

Use this order when validating your integration:

  1. Test a successful completed scenario.
  2. Test awaitingCounterparty.
  3. Test unconfirmedOwnership.
  4. Test counterpartyVaspNotReachable.
  5. Test counterpartyVaspNotFound.
  6. Test awaitingCounterparty -> expired.
  7. Test completed -> finished.
  8. Test completed -> cancelled.

This sequence lets you verify basic success handling first, then intermediate states, then fallback and timeout states, and finally post-completion terminal transitions.

Scenario summary

The following sections show the information that will be used for the test VASP based on the expected status or type of transaction.

completed

Use this scenario to verify that the test VASP can complete the Travel Rule exchange successfully.

Test VASP data

Expected status

What this tests

Address

0x7DF6AF1C17AC9F86F8B3FBBC25253B8B5DF2F3A1


Asset

ETH


Beneficiary data

John Smith


Beneficiary VASP

Sumsub test Vasp
completed
  • Normal successful Travel Rule exchange
  • Your ability to receive and process the successful outcome
{
  "txnId": "txn id",
  "type": "travelRule",
  "applicant": {
    // applicant's data
  },
  "counterparty": {
    "externalUserId": "91nmqhhnnbacvstj7b",
    "fullName": "John Smith", // Required
    "type": "individual",
    "dob": "1991-04-07",
    "residenceCountry": "DEU",
    "paymentMethod": {
      "accountId": "0x7DF6AF1C17AC9F86F8B3FBBC25253B8B5DF2F3A1" // Required
    },
    "institutionInfo": {
      "internalId": "66f6f954abba073927d11155"  // Required
    }
  },
  "info": {
    "direction": "out",
    "amount": 0.01,
    "currencyCode": "ETH",
    "currencyType": "crypto"
  }
}

awaitingCounterparty

Use this scenario to verify that your integration handles a pending counterparty state.

📘

Note

Disable the rule Travel Rule: Wallet does not belong to the counterparty VASP if you want to observe awaitingCounterparty instead of an automatic decline.

Test VASP data

Expected status

What this tests

Address

0x5BB23977B6E52A7C79BCC5E55F1655B7A69C7622-12345


Asset

ETH


Beneficiary data

Any name


Beneficiary VASP

Sumsub test Vasp
awaitingCounterparty
  • Intermediate waiting state
  • Your handling of pending Travel Rule transactions
{
  "txnId": "txn id",
  "type": "travelRule",
  "applicant": {
    // applicant's data
  },
  "counterparty": {
    "externalUserId": "91nmqhhnnbacvstj7b",
    "fullName": "Any name",
    "type": "individual",
    "dob": "1991-04-07",
    "residenceCountry": "DEU",
    "paymentMethod": {
      "accountId": "0x5BB23977B6E52A7C79BCC5E55F1655B7A69C7622-12345" // Required
    },
    "institutionInfo": {
      "internalId": "66f6f954abba073927d11155"  // Reqiered
    }
  },
  "info": {
    "direction": "out",
    "amount": 0.01,
    "currencyCode": "ETH",
    "currencyType": "crypto"
  }
}

unconfirmedOwnership

Use this scenario to verify that the test VASP rejects wallet ownership.

Test VASP data

Expected status

What this tests

Address

0X7B1E4CFE1659FB2FF41E70C89BC03A92895C76FE


Asset

ETH


Beneficiary data

Any name


Beneficiary VASP

Sumsub test Vasp
unconfirmedOwnership
  • Branch where the counterparty says the wallet does not belong to them
  • Your handling of a declined ownership result
{
  "txnId": "txn id",
  "type": "travelRule",
  "applicant": {
    // applicant's data
  },
  "counterparty": {
    "externalUserId": "91nmqhhnnbacvstj7b",
    "fullName": "Any name",
    "type": "individual",
    "dob": "1991-04-07",
    "residenceCountry": "DEU",
    "paymentMethod": {
      "accountId": "0X7B1E4CFE1659FB2FF41E70C89BC03A92895C76FE" // Reqiered
    },
    "institutionInfo": {
      "internalId": "66f6f954abba073927d11155"  // Reqiered
    }
  },
  "info": {
    "direction": "out",
    "amount": 0.01,
    "currencyCode": "ETH",
    "currencyType": "crypto"
  }
}

counterpartyVaspNotReachable

Use this scenario to verify the fallback path for an identified but unreachable VASP.

Test VASP data

Expected status

What this tests

Address

Empty


Asset

Empty


Beneficiary data

Empty


Beneficiary VASP

Sumsub test not reachable VASP


Beneficiary VASP ID

683584cd36898664230ee173
counterpartyVaspNotReachable
  • Fallback branch for an identified but unsupported or unreachable counterparty
{
  "txnId": "txn id",
  "type": "travelRule",
  "applicant": {
    // applicant's data
  },
  "counterparty": {
    "externalUserId": "91nmqhhnnbacvstj7b",
    "fullName": "Any name",
    "type": "individual",
    "dob": "1991-04-07",
    "residenceCountry": "DEU",
    "paymentMethod": {
      "accountId": "any" 
    },
    "institutionInfo": {
      "internalId": "683584cd36898664230ee173"  // Required
    }
  },
  "info": {
    "direction": "out",
    "amount": 0.01,
    "currencyCode": "ETH",
    "currencyType": "crypto"
  }
}

counterpartyVaspNotFound

Use this scenario to verify what happens when the counterparty cannot be identified.

Test VASP data

Expected status

What this tests

Address

Empty


Asset

Empty


Beneficiary data

Empty


Beneficiary VASP

Empty
counterpartyVaspNotFound
  • Branch where the transaction is treated as unhosted or unattributed.
{
  "txnId": "txn id",
  "type": "travelRule",
  "applicant": {
    // applicant's data
  },
  "counterparty": {
    "externalUserId": "91nmqhhnnbacvstj7b",
    "fullName": "Any name",
    "type": "individual",
    "dob": "1991-04-07",
    "residenceCountry": "DEU",
    "paymentMethod": {
      "accountId": "any",
      "type" : "unhostedWallet", // Required
    },
  },
  "info": {
    "direction": "out",
    "amount": 0.01,
    "currencyCode": "ETH",
    "currencyType": "crypto"
  }
}

awaitingCounterparty → expired

Use this scenario to verify timeout handling.

📘

Note

  • Configure the confirmation timeout in Sandbox.
  • Make sure the transaction can first enter the awaitingCounterparty status.

Test VASP data

Expected status

What this tests

Address

0x5BB23977B6E52A7C79BCC5E55F1655B7A69C7622


Asset

ETH


Beneficiary data

Any name


Beneficiary VASP

Sumsub test Vasp
awaitingCounterparty
->
expired
  • Your timeout handling logic
  • Transition from pending to terminal timeout state
📘

Note

To test this VASP data exchange, use the example provided here.

completed → finished

Use this scenario to verify the final blockchain-link step.

📘

Note

Make sure to enrich the completed transaction with any blockchain transaction ID.

Test VASP data

Expected status

What this tests

Address

0x5BB23977B6E52A7C79BCC5E55F1655B7A69C7622-TEST


Asset

ETH


Beneficiary data

Any name


Beneficiary VASP

Blank field for the VASP name
completed
->
finished
  • Post-completion update flow
  • Transition from completed to finished.
📘

Note

To test this VASP data exchange, use the example provided here.

completed → canceled

Use this scenario to verify cancellation after a completed Travel Rule exchange.

📘

Note

Cancel the transaction instead of enriching it with a blockchain transaction ID.

Test VASP data

Expected status

What this tests

Address

bc1q080rkmk3kj86pxvf5nkxecdrw6nrx3zzy9xl7q


Asset

BTC


Beneficiary data

Any name


Beneficiary VASP

Blank field for the VASP name
completed
->
canceled
  • Terminal cancellation path
  • Difference between finished and cancelled
📘

Note

To test this VASP data exchange, use the example provided here.