Skip to main content

Transactions

The Transactions API allows you to create, read, update, and delete Travel Rule transactions for crypto asset transfers. These endpoints enable full lifecycle management of Travel Rule compliance data.

Create Transaction

Create a new Travel Rule transaction for crypto asset transfers. Provide comprehensive originator and beneficiary information along with blockchain details to ensure compliance with FATF, MiCA, and other regulations.

Create Transaction is dispatched through Shufti's main verification endpoint by including a travel_rule block in the request body. The type field selects the Travel Rule operation - transaction is the default and may be omitted.

Endpoint

POST {{BASE_URL}}/
note

This is the same / endpoint used by other Shufti verification services. Authenticate using Basic Auth with your client_id and secret_key (or an Access Token), exactly as described in Get Started - Authentication.

Request Body

The Travel Rule transaction payload is sent as a travel_rule block inside the standard Shufti verification envelope (reference, callback_url, etc.).

create-transaction-request
{
"reference": "sp-tr-txn-001",
"callback_url": "https://webhook.site/your-unique-id",
"travel_rule": {
"type": "transaction",
"direction": "OUTGOING",
"asset": "BTC",
"amount": 0.875,
"blockchain_info": {
"blockchain": "bitcoin",
"transaction_hash": "b3c4d5e6f7a8b9c0d1e2f3456789abcdef0123456789abcdef0123456789abcd",
"origin": "1FfmbHfnpaZjKFvyi1okTjJJusN455paPH",
"destination": "bc1q8g9w8rj9h0w0v3n9z6q6h4j5y7x9c2f8r4d3pq",
"destination_type": "CUSTODIAL"
},
"vasp_info": {
"beneficiary_vasp_name": "Global Digital Assets Exchange Ltd",
"beneficiary_vasp_email": "[email protected]",
"beneficiary_vasp_extra_info": "Regulated VASP registered in the US."
},
"originator": {
"type": "NATURAL",
"name": "Michael Thompson",
"account_number": "GB-TRX-458721",
"address": "221 Baker Street, London",
"country": "GB",
"national_identificator_type": "PAS",
"national_identificator": "GBR458721963",
"customer_number": "CUS-GB-102938",
"date_of_birth": "20-06-1987",
"place_of_birth": "Manchester"
},
"beneficiary": {
"type": "NATURAL",
"name": "Daniel Carter",
"account_number": "US-TRX-785412",
"country": "US",
"national_identificator_type": "IDC",
"national_identificator": "USA874512369",
"customer_number": "CUS-US-564738"
}
}
}

Travel Rule Service Type

ParameterRequiredTypeDescription
travel_rule.typeNostringTravel Rule operation type. Accepts transaction (default) or wallet_verification. Omit to default to transaction.

General Parameters

ParameterRequiredTypeDescription
travel_rule.directionYesstringTransaction direction: OUTGOING or INCOMING.
travel_rule.assetYesstringCryptocurrency asset code (e.g., BTC, ETH, USDT).
travel_rule.amountYesnumberAmount of asset transferred in the specified cryptocurrency.

Blockchain Parameters

ParameterRequiredTypeDescription
travel_rule.blockchain_info.blockchainYesstringBlockchain network name (e.g., Bitcoin, Ethereum).
travel_rule.blockchain_info.transaction_hashYesstringThe on-chain transaction hash.
travel_rule.blockchain_info.originYesstringOriginating wallet address.
travel_rule.blockchain_info.destinationYesstringDestination wallet address.
travel_rule.blockchain_info.destination_typeYesstringDestination wallet type: CUSTODIAL or NON_CUSTODIAL.

VASP Parameters

ParameterRequiredTypeDescription
travel_rule.vasp_info.beneficiary_vasp_nameYesstringName of the receiving VASP.
travel_rule.vasp_info.beneficiary_vasp_emailYesstringEmail for the receiving VASP's compliance team.
travel_rule.vasp_info.beneficiary_vasp_extra_infoNostringAdditional VASP info (LEI, license number, etc.).

Originator Parameters

ParameterRequiredTypeDescription
travel_rule.originator.typeYesstringEntity type: NATURAL (person) or LEGAL (company/organization).
travel_rule.originator.nameYesstringFull name of the originator.
travel_rule.originator.account_numberYesstringWallet address or account identifier.
travel_rule.originator.addressYes*stringPhysical address. Required for NATURAL type persons.
travel_rule.originator.countryYesstringISO 3166-1 alpha-2 country code (e.g., US, GB, DE).
travel_rule.originator.national_identificator_typeYesstringType of national ID. See National Identificator Types.
travel_rule.originator.national_identificatorYesstringNational identification number.
travel_rule.originator.customer_numberYesstringInternal customer reference number used by your VASP.
travel_rule.originator.date_of_birthYes*stringDate of birth in DD-MM-YYYY format. Required for NATURAL.
travel_rule.originator.place_of_birthYes*stringPlace of birth (city, country). Required for NATURAL.
note

Fields marked Yes* are required only for NATURAL type persons.

Beneficiary Parameters

ParameterRequiredTypeDescription
travel_rule.beneficiary.typeYesstringEntity type: NATURAL (person) or LEGAL (company/organization).
travel_rule.beneficiary.nameYesstringFull name of the beneficiary.
travel_rule.beneficiary.account_numberYesstringWallet address or account identifier.
travel_rule.beneficiary.countryYesstringISO 3166-1 alpha-2 country code.
travel_rule.beneficiary.national_identificator_typeYesstringType of national ID. See National Identificator Types.
travel_rule.beneficiary.national_identificatorYesstringNational identification number.
travel_rule.beneficiary.customer_numberYesstringInternal customer reference number used by your VASP.

National Identificator Types

CodeDescription
PASSPORT (or PAS)Passport number
IDCIdentity card number
ALNAlien registration number
DRVDriver's license number
RAIRegistration authority identifier
FINForeign investment identity number
TAX (or TXN)Tax identification number
SSNSocial security number
LEILegal entity identifier
OTHOther identification type

Response

The transaction is created and screened asynchronously, so POST / returns the standard Shufti envelope with event: request.pending immediately. The screening outcome is delivered later to your callback_url as a signed verification.accepted / verification.declined callback — see Responses › Callbacks.

create-transaction-response
{
"reference": "sp-tr-txn-001",
"event": "request.pending",
"email": null,
"country": null
}
note

Creation is asynchronous — POST / returns request.pending immediately, and customer_unique_id is echoed when you supply it. The full transaction object (with _id, status, parties, etc.) is retrieved from the Read and Transaction Detail endpoints; its fields are described below.

Transaction Object (returned by Read / Transaction Detail)

ParameterDescription
_idUnique identifier of the transaction.
referenceYour own reference from the create request, attached by Shufti for correlation.
directionTransaction direction: INCOMING or OUTGOING.
assetCryptocurrency asset code (e.g., BTC, ETH).
amountTransaction amount in the specified asset.
statusCurrent status: PENDING, FAILED, CANCELLED, DELIVERED, CONFIRMED, or DECLINED.
status_reasoningExplanation for status change. Null unless DECLINED.
created_atTimestamp in RFC 2822 format.
warningsArray of warnings or validation messages.
travel_rule_message_sourceSource reference for the Travel Rule message.
identified_tenantAdditional tenant/organization information.
blockchain_infoBlockchain-specific details (blockchain, hash, origin, destination, type).
vasp_infoCounterparty VASP details (name, email, extra info).
originatorOriginator data (mirrors request parameters).
beneficiaryBeneficiary data (mirrors request parameters).

Read Transactions

Retrieve Travel Rule transactions with filtering, search, and pagination. Fetch all transactions, filter by status, search by criteria, and retrieve detailed information for compliance reporting.

Endpoint

GET {{BASE_URL}}/travel-rule/transaction/read

Query Parameters

All parameters are optional. Without parameters, the endpoint returns the first 25 transactions.

ParameterRequiredTypeDescription
pageNointegerPage number for pagination. Defaults to 1.
per_pageNointegerResults per page. Defaults to 25, maximum 100.
searchNostringSearch by transaction _id, customer name, or account number, or by your own reference.
start_dateNostringStart date in DD-MM-YYYY format.
end_dateNostringEnd date in DD-MM-YYYY format.
statuses[]NoarrayFilter by status: PENDING, FAILED, CANCELLED, DELIVERED, CONFIRMED, DECLINED. Repeat parameter for multiple values.
directionNostringFilter by direction: INCOMING or OUTGOING.

Response

Returns a transactions array and pagination metadata.

read-transactions-response
{
"error": false,
"status": "SUCCESS",
"message": "Transaction fetched successfully",
"data": {
"transactions": [ ],
"pagination": {
"page": 1,
"per_page": 25,
"total_count": 2,
"total_pages": 1,
"has_next": false,
"has_prev": false
}
}
}

Pagination Fields

ParameterDescription
data.pagination.pageCurrent page number.
data.pagination.per_pageResults per page.
data.pagination.total_countTotal number of matching transactions.
data.pagination.total_pagesTotal pages available.
data.pagination.has_nextBoolean: whether a next page exists.
data.pagination.has_prevBoolean: whether a previous page exists.

Transaction Detail

Retrieve detailed information for a specific Travel Rule transaction by its unique identifier. Ownership of the transaction is verified before the data is returned.

Endpoint

GET {{BASE_URL}}/travel-rule/transaction/detail

Query Parameters

You must provide the transaction identifier using either transaction_id (preferred) or search as a fallback.

ParameterRequiredTypeDescription
transaction_idYes*stringThe unique _id of the transaction to retrieve. Preferred parameter.
searchYes*stringAlternative parameter accepting the transaction _id. Used as a fallback when transaction_id is not provided.
note

At least one of transaction_id or search must be provided. If both are omitted (or empty), the request fails with 422 and an error message: transaction_id is required.

Sample Request

GET {{BASE_URL}}/travel-rule/transaction/detail?transaction_id=TRANSACTION_ID

The response structure is identical to Read Transactions, with the transactions array containing exactly one transaction.


Update Transaction

Update the status of an existing Travel Rule transaction. This endpoint can only update transactions with INCOMING direction.

caution

This endpoint can only update transactions with INCOMING direction. Attempting to update an OUTGOING transaction will result in an error.

Endpoint

POST {{BASE_URL}}/travel-rule/transaction/update

Request Parameters

ParameterRequiredTypeDescription
transaction_idYesstringUnique identifier of the transaction to update.
statusYesstringNew status: DELIVERED, CONFIRMED, or DECLINED.
status_reasoningConditionalstringRequired when status is DECLINED. Provide clear reasoning.

Updatable Statuses

StatusDescriptionReasoning Required
DELIVEREDTransaction successfully delivered to counterparty VASP.No
CONFIRMEDTransaction confirmed and accepted by counterparty.No
DECLINEDTransaction declined/rejected by counterparty.Yes

Sample: Confirm Transaction

confirm-transaction
{
"transaction_id": "695798278f0a2bda14017663",
"status": "CONFIRMED"
}

Sample: Decline Transaction

decline-transaction
{
"transaction_id": "695cb01826ae544d2f497410",
"status": "DECLINED",
"status_reasoning": "Beneficiary failed AML screening - sanctioned entity"
}
caution

When declining a transaction, you must provide status_reasoning with a clear explanation. Omitting reasoning for DECLINED status will result in an error.

Response

Returns the complete updated transaction object (same shape as Read) with message: "Transaction status updated successfully".

update-transaction-response
{
"error": false,
"status": "SUCCESS",
"message": "Transaction status updated successfully",
"data": {
"_id": "695798278f0a2bda14017663",
"status": "CONFIRMED",
"status_reasoning": null,
"direction": "INCOMING"
}
}

Delete Transaction

Permanently delete a Travel Rule transaction from the system.

danger

Deletion is permanent and irreversible. This may impact compliance audit trails. Use with caution.

Endpoint

POST {{BASE_URL}}/travel-rule/transaction/delete

Request Parameters

ParameterRequiredTypeDescription
transaction_idYesstringUnique identifier of the transaction to delete.

Sample Request

delete-transaction-request
{
"transaction_id": "TRANSACTION_ID"
}

Response

delete-transaction-response
{
"data": {},
"error": false,
"message": "Transaction deleted successfully",
"status": "SUCCESS"
}