# Travel Rule
Travel Rule is a KYT based solution, so this part of the documentation is a supplement to the KYT documentation. Including transaction status changes and webhooks
# Outgoing transaction handling
You want to initiate a protocol to verify if you need to send a transaction to the blockchain:
- Create a transaction with the information that will be used during the protocol execution.
- The transaction may either be immediately approved or rejected based on the set rules. Alternatively, the status
could change to
onHold
. You will receive a webhook following a status change. - If the status is
onHold
, we attempt to acquire information from the counterparty using various methods, or re-scores the transaction by timeout. You will receive a webhook following any status change. - If the transaction has been approved, you can execute the transaction and patch the information gathered from the blockchain to us.
# Incoming transaction handling
The protocol is initiated by the counterparty, and an action is required from your end to process the transaction:
- A transaction has already been initiated, and a webhook notification has been sent to you.
- Enriching the transaction with missing information. Either move the transaction to an existing applicant or provide information for enrichment.
- The transaction will either be approved or rejected upon processing. In case of approval, a notification might be received from the blockchain.
# API Reference
# Create travel rule transaction
POST /resources/applicants/{applicantId}/kyt/txns/-/data
Usually, you should have an applicant ready and KYC on him performed before starting the transaction. However, if you haven't created an applicant before, you can create it as part of the transaction. To do that, you can call
POST /resources/applicants/-/kyt/txns/-/data?levelName={levelName}
This method should only be used where there is no existing applicant with the same externalUserId
that you intend to pass within an applicant
object of request body.
The new applicant will be created using provided levelName
and data from the applicant
object. If there is no suitable levelName you can omit this parameter.
We strongly suggest you to use the method with {applicantId} for any subsequent transaction to link transactions to the exact applicant and avoid duplicates,
as it will be harder to choose an applicant for the incoming transaction after.
Make sure to send a unique externalUserId
and a proper fullName
within an applicant
object to us to create fresh applicant and process transaction.
# REQUEST ARGUMENTS
Name | Type | Required | Description |
---|---|---|---|
applicantId | String | Yes | Id of applicant that have been already processed by SumSub KYC. |
#{body} | Object | Yes | An object representing transaction (see example). |
# REQUEST BODY
Name | Type | Required | Description |
---|---|---|---|
txnId | String | Yes | Transaction ID. |
info | Object | Yes | Transaction info. |
applicant | Object | Yes | Transaction participant data with mandatory applicantId (sender or remitter depending on info.direction ). |
counterparty | Object | Yes | Transaction participant data (sender or remitter depending on info.direction ). |
type | String | Yes | Transaction type - travelRule |
# info
ELEMENT ATTRIBUTES
Name | Type | Required | Description |
---|---|---|---|
direction | String | Yes | out (applicant sends to counterparty) or in (counterparty sends to applicant). |
amount | Double | Yes | Amount of sent funds. |
currencyCode | String | Yes | Currency code (USD, GBP, BTC, etc). |
cryptoChain | String | No | Crypto chain name. Mandatory for crypto tokens only. Specifies the network name to which the token at currencyCode belongs. Empty for native tokens (e.g. for BTC, ETH). For more information, see chain codes. |
paymentTxnId | String | No | Transaction ID from payment processor: blockchain, bank. |
paymentDetails | String | No | Comment with payment details. |
# applicant
ELEMENTS ATTRIBUTES
Name | Type | Required | Description |
---|---|---|---|
externalUserId | String | Yes | Transaction participant externalUserId. |
fullName | String | Yes | Participant's full name. |
type | String | Yes | Participant entity type (company or individual ). |
address | Object | No | Participant's address. Address available elements are described here. |
paymentMethod | Object | Yes | Info about payment method. |
# counterparty
ELEMENTS ATTRIBUTES
Name | Type | Required | Description |
---|---|---|---|
externalUserId | String | No | Transaction participant externalUserId. |
fullName | String | No | Participant's full name. |
type | String | No | Participant entity type (company or individual ). |
address | Object | No | Participant's address. Address available elements are described here. |
paymentMethod | Object | Yes | Info about payment method. |
# paymentMethod
ELEMENT ATTRIBUTES
Name | Type | Required | Description |
---|---|---|---|
type | String | No | Payment method type: crypto . |
accountId | String | No | Crypto wallet address |
# Example request
curl -X POST \
'https://api.sumsub.com/resources/applicants/631f268442d8290001e1eee9/kyt/txns/-/data' \
-H 'Content-Type: application/json' \
-d '{
"type": "travelRule",
"applicant": {
"type": "individual",
"paymentMethod": {
"type": "account",
"fingerprint": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"
},
"device": {
"fingerprint": "lh0g6l7jk5k",
"ipInfo": {
"ip": "87.141.63.130"
}
},
"fullName": "SVEN MAGNUS"
},
"counterparty": {
"externalUserId": "6cll13mtmogichnwghu38",
"fullName": "Jack Posek",
"type": "individual",
"paymentMethod": {
"type": "",
"fingerprint": "bc1q080rkmk3kj86pxvf5nkxecdrw6nrx3zzy9xl7q"
},
"formattedAddress": "Chauseestr. 20, 10115, Berlin, Germany",
"institutionInfo": {
"internalId": "64677eef1bd2aa487ba31e5b"
}
},
"info": {
"direction": "out",
"amount": 0.01,
"currencyCode": "BTC",
"fingerprint": "1234567777777"
},
"travelRuleMode": "sumsub",
"props": {
"customProperty": "Custom value that can be used in rules",
"dailyOutLimit": 10000
},
"txnId": "syyjtoxagbanvt0l1buwo",
"txnDate": "2023-08-22 13:27:53+0200"
}'
# Patch transaction with chain txId
PATCH /resources/kyt/txns/{txnId}/data/info
Name | Type | Required | Description |
---|---|---|---|
txnId | String | Yes | Transaction Id to be moved to specified applicant. |
#{body} | Object | Yes | An object representing transaction data that needs to be changed. |
# REQUEST BODY
Name | Type | Required | Description |
---|---|---|---|
paymentTxnId | String | No | Crypto transaction ID from the blockchain. |
# Example request
curl -X PATCH \
'https://api.sumsub.com/resources/kyt/txns/638f1e3656df2d000138bff0/data/info' \
-H 'Content-Type: application/json' \
-d '{
"paymentTxnId": "1328d8738e244eaedfc6172a1038d5c52a689ca7631ece90d7aa1742e59048a2"
}'
# Move transaction to another applicant
POST /resources/kyt/txns/{txnId}/applicantId/{applicantId}
# REQUEST ARGUMENTS
Name | Type | Required | Description |
---|---|---|---|
txnId | String | Yes | Transaction Id to be moved to specified applicant. |
applicantId | String | Yes | Applicant id of user who should own the transaction. |
# Example request
curl -X POST \
'https://api.sumsub.com/resources/kyt/txns/631f268442d8290001e1eee8/applicantId/631f268442d8290001e1eee9'
# Enriching transaction with travel rule info
PATCH /resources/kyt/txns/{txnId}/data/applicant
# REQUEST ARGUMENTS
Name | Type | Required | Description |
---|---|---|---|
txnId | String | Yes | Transaction Id to be moved to specified applicant. |
#{body} | Object | Yes | An object representing information required to complete Travel Rule exchange. |
# REQUEST BODY
Name | Type | Required | Description |
---|---|---|---|
fullName | String | Yes | Participant's full name. |
# Example request
curl -X PATCH \
'https://api.sumsub.com/resources/kyt/txns/638f1e3656df2d000138bff0/data/applicant' \
-H 'Content-Type: application/json' \
-d '{
"fullName": "John Snow"
}'
# Transaction ownership confirmation
These two methods below will allow to mark transaction confirmed/unconfirmed that it belongs to your exchange (VASP) and unmask the personal information stored in specified transaction:
POST /resources/kyt/txns/{txnId}/ownership/unconfirmed
POST /resources/kyt/txns/{txnId}/ownership/confirmed
# REQUEST ARGUMENTS
Name | Type | Required | Description |
---|---|---|---|
txnId | String | Yes | Transaction Id. |
# Example request
curl -X POST \
'https://api.sumsub.com/resources/kyt/txns/638f1e3656df2d000138bff0/ownership/confirmed'