For the complete documentation index, see llms.txt. This page is also available as Markdown.

Transfers

Create and manage travel-rule transfers through their lifecycle.

List Transfers

get

Retrieve a paginated overview of all transfers initiated between entities, with support for filtering by VASP identifiers, blockchain addresses, transfer status, and date ranges.

Authorizations
AuthorizationstringRequired
Bearer authentication header of the form Bearer <token>.
Query parameters
pageinteger · min: 1OptionalDefault: 1
sizeinteger · min: 1 · max: 100OptionalDefault: 50
sortstring · nullableOptional
dtistring · nullableOptional
beneficiary_vasp_idstring · nullableOptional
originator_addressstring · nullableOptional
beneficiary_addressstring · nullableOptional
originator_account_reference_idstring · nullableOptional
beneficiary_account_reference_idstring · nullableOptional
directionstring · nullableOptional
transfer_statusstring · nullableOptional
beneficiary_account_typestring · nullableOptional
transaction_hashstring · nullableOptional
protocolstring · nullableOptional
start_dateany of · nullableOptional
string · date-timeOptional
or
stringOptional
end_dateany of · nullableOptional
string · date-timeOptional
or
stringOptional
Responses
200

A page of transfers.

application/json
statusstringOptionalDefault: success
get/api/v2/travelrule/transfers
GET /api/v2/travelrule/transfers HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "status": "success",
  "data": {
    "items": [
      {
        "transfer_id": "067fd57d-efe3-7eab-8000-04d8f072e418",
        "reference_id": "reference-transfer-01",
        "amount": 4.2,
        "amount_str": "4.2",
        "dti": "4H95J0R2X",
        "chain": "bitcoin",
        "symbol": "BTC",
        "protocol": "flow",
        "originator_vasp_id": "UVWDEP",
        "beneficiary_vasp_id": "MLESJF",
        "originator_address": "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy",
        "beneficiary_address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
        "originator_address_is_self_hosted": false,
        "beneficiary_address_is_self_hosted": false,
        "routing_number": "1234XYZ",
        "originator_account_reference_id": "random-ref-id-101",
        "beneficiary_account_reference_id": "random-ref-id-102",
        "transfer_status": "INITIATED",
        "transfer_type": "INSTRUCTION",
        "direction": "outgoing"
      }
    ],
    "total": 1,
    "page": 1,
    "size": 50,
    "pages": 1
  }
}

Create Transfer

post

Initiate a Travel Rule transfer between crypto service providers or to a self-hosted wallet. Combines account creation, wallet address verification, and transfer initiation into a single call. Supports VASP-to-VASP withdrawals, self-hosted wallet withdrawals, and self-hosted wallet deposits.

reference_id is the idempotency key, scoped to your account. A request repeating a reference_id you have already used creates nothing: it returns that original transfer unchanged and ignores the rest of the body, answering 200 OK with the header Idempotent-Replayed: true. A fresh create answers 201 Created and carries no such header. A request without a reference_id never replays.

Authorizations
AuthorizationstringRequired
Bearer authentication header of the form Bearer <token>.
Body

POST /travelrule/transfers

amountany ofRequired
numberOptional
or
stringOptionalPattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
amount_usdany of · nullableOptional
numberOptional
or
stringOptionalPattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
dtistring · nullableOptional

Digital Token Identifier (ISO 24165) of the asset being transferred, and the documented way to name it — list the accepted identifiers with GET /travelrule/tokens. Optional only because one legacy alternative is still accepted: a request that names no asset at all is rejected.

protocolstring · nullableOptional

The rail to send this transfer over, from GET /travelrule/protocols. Required whenever the transfer resolves to an instruction. A record dispatches nothing and carries no protocol: any value sent on one is accepted and discarded, and the transfer reads back with a null protocol. A self-hosted leg has no counterparty VASP to instruct, so naming any rail other than the deprecated 'flow' on one — or naming none — is rejected unless is_record is true.

originator_vasp_idstring · nullableOptional
beneficiary_vasp_idstring · nullableOptional
originator_addressstringRequired
originator_address_is_self_hostedboolean · nullableOptional

Declare that this transfer's originator wallet is self-hosted — nobody operates it on the sender's behalf. It describes this transfer, so the transfer reads back with exactly what you send: absent or false means this is not a self-hosted transfer, whatever any earlier transfer declared about the same wallet. A self-hosted leg can only ride a record — set is_record — and the reserved 'SLFHST' VASP ID is applied automatically, so do not send originator_vasp_id with it.

Default: false
beneficiary_addressstring · nullableOptional
beneficiary_address_is_self_hostedboolean · nullableOptional

Declare that this transfer's beneficiary wallet is self-hosted — nobody operates it on the recipient's behalf. It describes this transfer, so the transfer reads back with exactly what you send: absent or false means this is not a self-hosted transfer, whatever any earlier transfer declared about the same wallet. A self-hosted leg can only ride a record — set is_record — and the reserved 'SLFHST' VASP ID is applied automatically, so do not send beneficiary_vasp_id with it.

Default: false
travel_addressstring · nullableOptional
originator_account_reference_idstringRequired
beneficiary_account_reference_idstring · nullableOptional
reference_idstring · nullableOptional
transaction_hashstring · nullableOptional
routing_numberstring · nullableOptional
transfer_typestring · enum · nullableOptional

Deprecated and inert: the server derives the transfer type from the transfer's shape. Any value sent is accepted and discarded — it never reaches the persisted transfer.

Possible values:
is_recordbooleanOptional

Book this transfer as a unilateral record rather than an instruction to a counterparty: nothing is dispatched and only the creating tenant ever sees it. A record carries no protocol — send none, and any value sent is discarded. True narrows the derived transfer type to RECORD; false or absent defers to the derivation, and it can never promote a derived RECORD to an INSTRUCTION. Use it for a self-recorded VASP-VASP deposit, and for a self-hosted leg: naming originator_vasp_id, or a self-hosted address, with protocol 'flow' and no is_record is the deprecated spelling of the same thing. On a self-hosted leg it is the only spelling under any other rail, or under none — those are rejected.

Default: false
response_timeoutstring · duration · nullableOptional
Responses
200

Idempotent replay. This reference_id already identifies one of your transfers, so nothing was created: the original transfer is returned unchanged and the rest of the request body was ignored.

application/json
post/api/v2/travelrule/transfers
POST /api/v2/travelrule/transfers HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 973

{
  "amount": 4.2,
  "dti": "4H95J0R2X",
  "protocol": "flow",
  "reference_id": "reference-transfer-01",
  "beneficiary_vasp_id": "MLESJF",
  "originator_address": "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy",
  "originator_address_is_self_hosted": false,
  "originator_account_reference_id": "random-ref-id-101",
  "beneficiary_address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
  "beneficiary_address_is_self_hosted": false,
  "beneficiary_account_reference_id": "random-ref-id-102",
  "routing_number": "1234XYZ",
  "transaction_hash": "80003fee6bcbb2726b4d6466d690fce6caaa03771aada747eb0651637514b893",
  "originator_account": {
    "account_type": "individual",
    "account_category": "customer",
    "customer_id": "random-cust-id-101",
    "individual": {
      "individual_name": {
        "name_type": "LEGL",
        "name_first": "Mark",
        "name_last": "Rover"
      }
    }
  },
  "beneficiary_account": {
    "account_type": "individual",
    "account_category": "non-customer",
    "customer_id": "random-cust-id-102",
    "individual": {
      "individual_name": {
        "name_type": "LEGL",
        "name_first": "Robert",
        "name_last": "Harding"
      }
    }
  }
}
{
  "status": "success",
  "data": {
    "transfer_id": "067fd57d-efe3-7eab-8000-04d8f072e418",
    "reference_id": "reference-transfer-01",
    "amount": 4.2,
    "dti": "4H95J0R2X",
    "chain": "bitcoin",
    "symbol": "BTC",
    "protocol": "flow",
    "originator_vasp_id": "UVWDEP",
    "beneficiary_vasp_id": "MLESJF",
    "originator_address": "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy",
    "beneficiary_address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
    "originator_address_is_self_hosted": false,
    "beneficiary_address_is_self_hosted": false,
    "routing_number": "1234XYZ",
    "originator_account_reference_id": "random-ref-id-101",
    "beneficiary_account_reference_id": "random-ref-id-102",
    "transaction_hash": "80003fee6bcbb2726b4d6466d690fce6caaa03771aada747eb0651637514b893",
    "transfer_status": "INITIATED",
    "transfer_type": "INSTRUCTION"
  }
}

Get Transfer Details

get

Retrieve comprehensive details about a specific Travel Rule transfer, including originator and beneficiary information, amount, timestamps, and transfer status.

Authorizations
AuthorizationstringRequired
Bearer authentication header of the form Bearer <token>.
Path parameters
transfer_idstringRequired

System-generated identifier unique to each transfer.

Responses
200

The full transfer, with both sides' records and VASPs. A counterparty's own declared record, when the wire carried one, sits beside ours rather than merged into it -- the disagreement between the two is the compliance artifact.

application/json
statusstringOptionalDefault: success
get/api/v2/travelrule/transfers/{transfer_id}
GET /api/v2/travelrule/transfers/{transfer_id} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "status": "success",
  "data": {
    "transfer_data": {
      "transfer_id": "067fd57d-efe3-7eab-8000-04d8f072e418",
      "reference_id": "reference-transfer-01",
      "amount": 4.2,
      "dti": "4H95J0R2X",
      "chain": "bitcoin",
      "symbol": "BTC",
      "protocol": "flow",
      "originator_address": "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy",
      "beneficiary_address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
      "originator_address_is_self_hosted": false,
      "beneficiary_address_is_self_hosted": false,
      "routing_number": "1234XYZ",
      "transfer_status": "REVIEW",
      "transfer_type": "INSTRUCTION",
      "created": "2026-08-31T09:14:22.418293",
      "created_by_desc": "api"
    },
    "originator_record": {
      "display_name": "John Doe",
      "reference_id": "random-ref-id-101",
      "account_type": "individual",
      "name_first": "John",
      "name_last": "Doe",
      "date_of_birth": "1990-01-01",
      "place_of_birth": "Singapore, Singapore",
      "nationality_code": "SG",
      "residence_country_code": "US"
    },
    "beneficiary_record": {
      "display_name": "Grace Receiver",
      "reference_id": "random-ref-id-102",
      "account_type": "individual",
      "name_first": "Grace",
      "name_last": "Receiver"
    },
    "originator_vasp": {
      "vasp_id": "UVWDEP",
      "name_legal": "Northwind Digital Assets",
      "registration_country_code": "SG"
    },
    "beneficiary_vasp": {
      "vasp_id": "MLESJF",
      "name_legal": "Meridian Exchange Ltd",
      "registration_country_code": "SG"
    }
  }
}

Update Transfer

patch

Update the details of an existing transfer.

Authorizations
AuthorizationstringRequired
Bearer authentication header of the form Bearer <token>.
Path parameters
transfer_idstringRequired

System-generated identifier unique to each transfer.

Body
transaction_hashstringRequired
Responses
200

The transfer was updated with its on-chain transaction hash.

application/json
statusstringOptionalDefault: success
patch/api/v2/travelrule/transfers/{transfer_id}
PATCH /api/v2/travelrule/transfers/{transfer_id} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 87

{
  "transaction_hash": "80003fee6bcbb2726b4d6466d690fce6caaa03771aada747eb0651637514b893"
}
{
  "status": "success",
  "data": {
    "transfer_id": "067fd57d-efe3-7eab-8000-04d8f072e418",
    "reference_id": "reference-transfer-01",
    "amount": 4.2,
    "amount_str": "4.2",
    "dti": "4H95J0R2X",
    "chain": "bitcoin",
    "symbol": "BTC",
    "protocol": "flow",
    "originator_vasp_id": "UVWDEP",
    "beneficiary_vasp_id": "MLESJF",
    "originator_address": "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy",
    "beneficiary_address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
    "originator_address_is_self_hosted": false,
    "beneficiary_address_is_self_hosted": false,
    "routing_number": "1234XYZ",
    "originator_account_reference_id": "random-ref-id-101",
    "beneficiary_account_reference_id": "random-ref-id-102",
    "transaction_hash": "80003fee6bcbb2726b4d6466d690fce6caaa03771aada747eb0651637514b893",
    "transfer_status": "INITIATED",
    "transfer_type": "INSTRUCTION"
  }
}

Action Transfer

patch

Perform an action on a transfer based on its current status, such as accepting, rejecting, canceling, or completing it.

Authorizations
AuthorizationstringRequired
Bearer authentication header of the form Bearer <token>.
Path parameters
transfer_idstringRequired

System-generated identifier unique to each transfer.

actionstring · enumRequired

Action to apply to the transfer, such as accept, reject, cancel, or complete.

Possible values:
Body
transaction_hashstring · nullableOptional
reject_errorstring · nullableOptional
messagestring · nullableOptional
beneficiary_addressstring · nullableOptional

Optional, accept only: the beneficiary Payment Address to answer the counterparty's Inquiry with, for an inbound transfer whose Inquiry named no beneficiary wallet. The wallet must already be registered against one of your own customer accounts. Supplying it on a transfer that already has one is accepted when the two agree and refused when they do not.

Responses
200

The lifecycle action was applied; the body reports the landed status.

application/json
statusstringOptionalDefault: success
patch/api/v2/travelrule/transfers/{transfer_id}/{action}
PATCH /api/v2/travelrule/transfers/{transfer_id}/{action} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 87

{
  "transaction_hash": "80003fee6bcbb2726b4d6466d690fce6caaa03771aada747eb0651637514b893"
}
{
  "status": "success",
  "data": {
    "transfer_id": "067fd57d-efe3-7eab-8000-04d8f072e418",
    "reference_id": "reference-transfer-01",
    "amount": 4.2,
    "amount_str": "4.2",
    "dti": "4H95J0R2X",
    "chain": "bitcoin",
    "symbol": "BTC",
    "protocol": "flow",
    "originator_vasp_id": "UVWDEP",
    "beneficiary_vasp_id": "MLESJF",
    "originator_address": "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy",
    "beneficiary_address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
    "originator_address_is_self_hosted": false,
    "beneficiary_address_is_self_hosted": false,
    "routing_number": "1234XYZ",
    "originator_account_reference_id": "random-ref-id-101",
    "beneficiary_account_reference_id": "random-ref-id-102",
    "transfer_status": "ACCEPTED",
    "transfer_type": "INSTRUCTION"
  }
}

Last updated