Find specific Travel Rule transactions

Recent Requests
Log in to see full request history
TimeStatusUser Agent
Retrieving recent requests…
LoadingLoading…

Table of contents

Overview

Use this endpoint to search for and retrieve specific Travel Rule transactions using supported flexible filters and query parameters.

It helps prevent duplicate Travel Rule processing by allowing you to check whether a corresponding (mirrored) transaction already exists in the system. This is particularly useful for inbound blockchain transfers, where the originating VASP may have already created a Travel Rule message using the same solution.

Before submitting a new inbound transaction for Travel Rule processing, query the system to determine whether a record already exists. If no matching transaction is found, proceed with creating a new Travel Rule transaction.

Supported filters

You can add filters directly in the PATH segment of the request. When combined with query parameters, they help in pagination, sorting, and selective field searching. See the request examples for clarity.

The table below includes and explains the filters that are currently supported.

FieldTypeDescription
data.typeStringTransaction type. Must be travelRule, indicating transaction subject to Travel Rule requirements.
data.txnDateDate

Date and time when transactions occurred. Format (YYYY-MM-DD hh:mm:ss).

Also, the following options are available:

data.txnDate__gte — filters transactions that occurred on or after the specified date and time.

data.txnDate__lte — filters transactions that occurred on or before the specified date and time.

⚠️ The value should be URL-encoded (for example, 2025-10-07%2000%3A00%3A00), otherwise a signature mismatch may occur.

data.info.paymentTxnIdStringCrypto transaction hash identifying the transaction on the blockchain.
data.info.directionStringTransaction type. Possible values:
  • in — incoming transaction.
  • out — outgoing transaction.
data.info.currencyCodeStringCurrency code of the transaction in ISO 4217 (for fiat) or standard cryptocurrency symbol format (for example, USD, EUR, BTC, ETH).
data.info.cryptoParams.cryptoChainStringBlockchain network or chain used for crypto transactions (for example, BTC, ETH, TRX, BNB).
data.info.amountDouble

Transaction amount in the specified currencyCode.

Also, the following options are available:

data.info.amount__gte — filters transactions where the amount is greater than or equal to the specified value.

data.info.amount__lte — filters transactions where the amount is less than or equal to the specified value.

data.applicant.paymentMethod.accountIdStringCrypto wallet address or bank card number associated with the applicant.
data.counterparty.paymentMethod.accountIdStringCrypto wallet address or bank account number of the counterparty involved in the transaction.
📘

Note

The method is evolving and will support additional filters over time.

Recommended lookup flow

To locate an existing (mirrored) Travel Rule transaction, follow the lookup approach described below.

  1. Start by searching with data.info.paymentTxnId. The on-chain transaction hash is typically the most reliable and unique identifier, and in most cases, it is sufficient to find the corresponding transaction.
  2. If no results are returned—for example, if the originating VASP has not yet updated the transaction with the on-chain hash—perform a broader search using a combination of the following parameters:
    • data.type
    • data.txnDate
    • data.info.direction
    • data.info.currencyCode
    • data.info.cryptoParams.cryptoChain
    • data.info.amount
    • data.applicant.paymentMethod.accountId
    • data.counterparty.paymentMethod.accountId
👍

Tips

  • If you are unsure about the exact value of a parameter, omit it rather than guessing. Overly restrictive filters may lead to false negatives and prevent you from finding an existing Travel Rule record.
  • For data.info.amount, use the data.info.amount__gte and data.info.amount__lte operators instead of an exact match. This helps avoid false negatives caused by floating-point precision differences between systems.

Request examples

To build a valid request, mind the following:

  • Separate each filter using a semicolon (;).
  • Each filter must follow the key=value format.

The following are the examples of requests that you can use to check if a transaction has been created, and is awaiting your response by a counterparty VASP.

Query inbound transactions

The following requests check whether specific Travel Rule inbound transactions already exist.

// Checks whether a Travel Rule inbound transaction with a specific crypto hash and sender wallet already exists.

curl -X GET \
     'https://api.sumsub.com/resources/kyt/txns/query/-;data.type=travelRule;data.applicant.paymentMethod.accountId=0x611Fb08528080848Dd3439242fdfg993d18ADd95dsd;data.info.direction=in;data.info.paymentTxnId=000000000000000000013f2851d71e6ea8dfcc9151654ca4cbbbfd759122589f?order=-createdAt&limit=1' \
     -H 'accept: application/json'
// Searches Travel Rule transactions with USDT/ETH currency where amount is from '100' to '500' which happened on '2025-10-07'.

curl -X GET  \
	'https://api.sumsub.com/resources/kyt/txns/query/-;data.info.direction=in;data.info.amount__gte=100;data.info.amount__lte=500;data.info.currencyCode=USDT;data.info.cryptoParams.cryptoChain=ETH;data.txnDate__gte=2025-10-07%2000%3A00%3A00;data.txnDate__lte=2025-10-07%2023%3A59%3A59;data.type=travelRule?order=-data.txnDate&limit=1' \
-H 'accept: application/json'

Query outbound transactions

The following request checks whether a Travel Rule outbound transaction with a specific wallet address already exists.

curl -X GET \
     'https://api.sumsub.com/resources/kyt/txns/query/-;data.type=travelRule;data.info.direction=out;data.applicant.paymentMethod.accountId=1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa?order=-createdAt&limit=1' \
     -H 'accept: application/json'

Response explained

The response is a JSON file that represents the list of transactions found in accordance with the filters and parameters specified in the request.

FieldTypeDescription
itemsArray of objects

Each object corresponds to a specific transaction.

You can see the structured transaction information on the following page.

totalItemsIntegerTotal number of existing transactions matching the criteria specified in the request.

Response examples

If the request is successfully sent and processed, you will get a response like one of the following:

{
  "list": {
    "items": [
      {
        "id": "6819f6b44b2fcfce09980000",
        "counterpartyApplicantId": "6814dfa5e18b86f3c28c6000",
        "externalUserId": "9bdb40f8-ffcd-48fd-b5e9-96307e500000",
        "clientId": "Peter",
        "data": {
          "txnId": "93b54a42-bdce-4c5a-94ea-cf765fa9e000",
          "txnDate": "2025-05-06 11:47:00+0000",
          "applicant": {
            "externalUserId": "9bdb40f8-ffcd-48fd-b5e9-96307e5d6000",
            "type": "individual",
            "paymentMethod": {
              "accountId": "0x611Fb08528080123Dd3439242fdfg912318ADd12000"
            }
          },
          "counterparty": {
            "externalUserId": "level-33333628-b84d-422d-933e-7712311ed000",
            "type": "individual"
          },
          "type": "travelRule",
          "info": {
            "type": "transfer",
            "direction": "in",
            "amount": 5,
            "currencyCode": "ETH",
            "currencyType": "crypto",
            "cryptoParams": {
              "cryptoChain": ""
            },
            "amountInDefaultCurrency": 7961.783439490446,
            "defaultCurrencyCode": "EUR",
            "paymentTxnId": "000000000000000000013f2851d71e6ea8123c9151654ca4cbbb123591225000"
          }
        },
        "score": 0,
        "createdAt": "2025-05-06 11:47:00+0000",
        "travelRuleInfo": {
          "protocolName": "sns",
          "protocolAttempts": {
            "sns": "onHold"
          },
          "applicant": {
            "externalUserId": "9bdb40f8-ffcd-48fd-b5e9-96307e5d6000"
          },
          "counterparty": {
            "externalUserId": "level-33333628-b84d-422d-933e-7779011ed000"
          },
          "status": "onHold",
          "applicantVaspId": "64dce00a631b6e786efbf000",
          "counterpartyVaspId": "66f2a4c22e0e380f3a2b6000"
        },
        "mirrored": true,
        "txnInactive": false
      }
    ],
    "totalItems": 1
  }
}
{
  "list": {
    "items": [
      {
        "id": "67f416cf4146933cc3772c00",
        "applicantId": "67f416cf4146933cc3772c00",
        "externalUserId": "c9v4s10j5aexoonp113000",
        "clientId": "Peter",
        "data": {
          "txnId": "zksfizob8cv63n9ulbkjhk",
          "txnDate": "2025-04-07 18:17:51+0000",
          "applicant": {
            "externalUserId": "c9v4s10j5aexoonp113000",
            "fullName": "John Posek",
            "fullNameEn": "John Posek",
            "firstName": "John",
            "lastName": "Posek",
            "nameType": "birthName",
            "dob": "1992-05-08",
            "placeOfBirth": "Paris, France",
            "address": {
              "subStreet": "1",
              "street": "Rue de Rivoli",
              "town": "Paris",
              "postCode": "75001",
              "country": "FRA",
              "formattedAddress": "Rue de Rivoli, 10, Paris, France, 00000"
            },
            "type": "individual",
            "paymentMethod": {
              "type": "account",
              "accountId": "1A1zP1eP5QG1232DMPTfTL5SLmv7123000"
            },
            "institutionInfo": {
              "internalId": "64dce00a631b6e786efbf000"
            },
            "idDoc": {
              "number": "FR12300000",
              "country": "FRA",
              "idDocType": "PASSPORT",
              "registrationAuthority": "Ille-de-France 01"
            },
            "residenceCountry": "FRA"
          },
          "counterparty": {
            "externalUserId": "xo7vtj7bawplhugvxc000",
            "fullName": "Jack Posek",
            "fullNameEn": "John Posek",
            "firstName": "Jack",
            "lastName": "Posek",
            "nameType": "birthName",
            "dob": "1991-04-07",
            "placeOfBirth": "Berlin, Germany",
            "address": {
              "subStreet": "60",
              "street": "Chauseestr.",
              "town": "Berlin",
              "postCode": "00000",
              "country": "DEU",
              "formattedAddress": "Chauseestr., 0, Berlin, Germany, 00000"
            },
            "type": "individual",
            "paymentMethod": {
              "type": "",
              "accountId": "bc1q080rkmk3kj86123f5nkxec1236nrx31239x000"
            },
            "institutionInfo": {
              "internalId": "6601340978488d7ad23cd000"
            },
            "idDoc": {
              "number": "DE42200000",
              "country": "DEU",
              "idDocType": "PASSPORT",
              "registrationAuthority": "BerlinMitte"
            },
            "residenceCountry": "DEU"
          },
          "type": "travelRule",
          "info": {
            "type": "transfer",
            "direction": "out",
            "amount": 2,
            "currencyCode": "FTM",
            "currencyType": "crypto",
            "defaultCurrencyCode": "EUR"
          }
        },
        "score": 0,
        "createdAt": "2025-04-07 18:17:51+0000",
        "travelRuleInfo": {
          "protocolName": "sns",
          "protocolAttempts": {
            "sns": "awaitingCounterparty"
          },
          "applicant": {
            "externalUserId": "c9v4s10j5aexoonp113000",
            "fullName": "John Posek",
            "fullNameEn": "John Posek",
            "address": {
              "subStreet": "1",
              "street": "Rue de Rivoli",
              "town": "Paris",
              "postCode": "00000",
              "country": "FRA",
              "formattedAddress": "Rue de Rivoli, 0, Paris, France, 00000"
            }
          },
          "counterparty": {
            "externalUserId": "xo7vtj7bawplhugvxc000",
            "fullName": "Jack Posek",
            "fullNameEn": "John Posek",
            "address": {
              "subStreet": "60",
              "street": "Chauseestr.",
              "town": "Berlin",
              "postCode": "00000",
              "country": "DEU",
              "formattedAddress": "Chauseestr., 0, Berlin, Germany, 00000"
            }
          },
          "status": "awaitingCounterparty",
          "applicantVaspId": "64dce00a631b6e786efbf000",
          "counterpartyVaspId": "6601340978488d7ad23cd000"
        },
        "txnInactive": false
      }
    ],
    "totalItems": 190
  }
}

If the request fails (for example, incorrect data or filters provided), you will receive an HTTP response containing an error code along with a message explaining the error.

For example:

{
    "code": 400,
    "correlationId": "00000000000000000000000000000000",
    "errorCode": 0,
    "description": "Invalid parameters provided",
    "type": "com.sumsub.commons.restler.exceptions.RestDslException"
}

If no transactions matching the specified criteria are found, the response will contain an empty items array.

{
  "list": {
    "items": [],
    "totalItems": 0
  }
}
Query Params
int32
Defaults to 100
string
Language
Credentials
Header
LoadingLoading…
Response
Click Try It! to start a request and see the response here!