List transfers
List transfers with filtering, sorting, and pagination support. Uses RBAC-aware query system with JSON-based search and sort parameters. This list shows payments — one row per payment — and never a beneficiary's own row. A company on the receiving side of an on-us payment is shown the payment itself, so it reads as outgoing with the payer as originator; `customer_id` here has always meant the originator. It is one row per payment either way: a payment carrying the legacy `type="internal"` beneficiary row used to appear here twice. To read the receiving company's own record, use `search.customer_id` on `GET /v2/transfers` or `customer_id` on `GET /v2/transfers/{transfer_id}`.
Authorization
BearerAuth JWT authentication token
In: header
Query Parameters
Filter by transfer status
Filter by transfer type
Filter by originator customer ID (UUID)
Filter by beneficiary customer ID (UUID)
Deprecated: Use search.ori_customer_id instead. Filter by originator customer ID (UUID)
Filter by product ID (UUID)
Filter by product code (alternative to product_id). If product code is not found, returns no results.
Filter by currency code (txn_ccy)
Sort field (prefix with - for descending). Example: -created_at or created_at
Number of items per page
Starting position for pagination
ACCEPTED AND IGNORED ON THIS OPERATION. The shared parser reads it, but Service.GetTransfers never fills StackedData or Keys, so the response is always the flat paginated array. GET /v2/transfers is the list that honours stack; /v1/transfers/statuses and /v1/transfers/events honour it too.
JSON filter object, parsed by the shared parser. Malformed JSON is refused with 400.
Free-text search over the virtual full-row text expression, resolved by the shared parser's ExtractTextSearch. Bare search._text implies the like operator; the operator suffixes accepted are .eq, .like, .ilike, .contains, .start_with and .end_with. More than one of them in a single request is refused with 400, as is any other suffix.
Header Parameters
Language preference for the response
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/transfers"{
"data": [
{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"product_id": "0d012afa-f885-4e65-aeca-37e27701e2d1",
"product_code": "string",
"ori_customer_id": "bc70e6eb-7d69-4074-a870-6cf369440f5d",
"ben_customer_id": "f5b93205-a0f3-4d6a-a411-580dff187bdf",
"ori_account_id": "93f2cf79-32f9-44a2-ad78-373f29b5514e",
"ben_account_id": "4d1f2312-f55e-46c1-af1c-97fa399de1d5",
"type": "string",
"status": "string",
"active": true,
"txn_amt": {
"amount": "string",
"currency": "string",
"precision": 0
},
"txn_paymentPurpose": "string",
"ori_name": "string",
"ori_iban": "string",
"ori_bic": "string",
"ben_name": "string",
"ben_iban": "string",
"ben_bic": "string",
"ben_amt": {
"amount": "string",
"currency": "string",
"precision": 0
},
"ori_walletAddress": "string",
"ben_walletAddress": "string",
"ben_addressTag": "string",
"bc_network": "string",
"bc_txHash": "string",
"token": "string",
"txn_netAmt": {
"amount": "string",
"currency": "string",
"precision": 0
},
"txn_feeAmt": {
"amount": "string",
"currency": "string",
"precision": 0
},
"txn_instructionId": "string",
"txn_externalId": "string",
"direction": "string",
"parent_id": "1c6ca187-e61f-4301-8dcb-0e9749e89eef",
"metadata": {},
"context": {},
"error_code": "string",
"error_message": "string",
"created_at": "string",
"updated_at": "string"
}
],
"total": 0,
"total_unfiltered": 0,
"has_more": true,
"metadata": {},
"keys": [
"string"
]
}{
"status": 0,
"message": "string",
"code": "transfers_m.account_not_found",
"class": "validation",
"retryable": false,
"details": [
{
"field": "amount",
"rule": "gt",
"param": "0",
"message": "amount must be greater than 0"
}
]
}{
"status": 0,
"message": "string",
"code": "transfers_m.account_not_found",
"class": "validation",
"retryable": false,
"details": [
{
"field": "amount",
"rule": "gt",
"param": "0",
"message": "amount must be greater than 0"
}
]
}{
"status": 0,
"message": "string",
"code": "transfers_m.account_not_found",
"class": "validation",
"retryable": false,
"details": [
{
"field": "amount",
"rule": "gt",
"param": "0",
"message": "amount must be greater than 0"
}
]
}{
"status": 429,
"message": "Rate limit exceeded",
"code": "rate_limits_m.exceeded",
"class": "temporary",
"retryable": true
}{
"status": 0,
"message": "string",
"code": "transfers_m.account_not_found",
"class": "validation",
"retryable": false,
"details": [
{
"field": "amount",
"rule": "gt",
"param": "0",
"message": "amount must be greater than 0"
}
]
}{
"overall_status": "unhealthy",
"message": "Service is shutting down",
"timestamp": "2026-08-27T15:04:05Z"
}NOT IMPLEMENTED. SignTransfer ignores the request entirely and answers 501 with a bare {"error": "Not implemented yet"} map — not the apireply envelope, and the key is error rather than message. The 501 is not unconditional: the route goes through auth.WrapWithMiddlewares, so a missing, malformed or expired bearer token is refused with 401, and an RBAC or licence denial with 403, before the stub body is ever produced.
Reads one transfer in the minor-units shape.