Payments
User Transactions
List current user wallet-linked transactions and open one transaction detail.
Flow Summary
The current mobile user transaction flow is:
Step 1. Load your transaction listGET /api/v1/mobile_user/transactions
Step 2. Open one transaction detailGET /api/v1/mobile_user/transactions/{id}
All routes below should be treated as protected routes and sent with:
Authorization: Bearer <access_token>
Data Model Notes
These routes read from mobile_user_transactions.
Important current behavior:
- The handler always forces the list to the authenticated
mobile_user_id - The list query excludes
FAILEDrows at the repository level amountis returned as a formatted string with 2 decimals, even though the database stores it as an integer amountpayment_numberis a 9-digit zero-padded sequence such as000000123
1. List Transactions
GET /api/v1/mobile_user/transactions
Returns a paginated list of transactions for the authenticated mobile user.
Query parameters
| Name | Required | Notes |
|---|---|---|
card_id | No | Filters by the local card database ID |
transaction_type | No | Filters by raw transaction type |
transaction_status | No | Filters by raw transaction status |
order_id | No | Exact order ID filter |
start_date | No | RFC3339 start timestamp |
end_date | No | RFC3339 end timestamp |
page | No | Default 1 |
limit | No | Default 20 |
sort_by | No | Default created_at |
sort_order | No | Default desc |
Common current values
transaction_typeoften includes:TOP_UPWITHDRAWTRANSFERRECEIVECARD_REQUEST
transaction_statuscommonly includes:PENDINGSUCCESSFAILED
directionuses:INOUT
Important backend behavior
- The handler rejects the request if
start_date > end_date - The repository excludes
FAILEDrows before any other filters are applied - Because of that exclusion, filtering with
transaction_status=FAILEDcurrently returns no rows - If
page < 1, the repository normalizes it to1 - If
limit < 1, the repository normalizes it to20
Success response shape
{
"status_code": 200,
"message": "Transactions retrieved successfully",
"data": [
{
"id": 91,
"uuid": "0d65f58d-47f6-43d7-84b2-4bdc8d44e391",
"payment_number": "000000091",
"order_id": "ORD-20260228-H3KZ",
"card_id": 508,
"transaction_type": "TOP_UP",
"amount": "100.00",
"direction": "IN",
"transaction_status": "SUCCESS",
"transaction_currency": "USD",
"merchant": "",
"transfer_id": null,
"created_at": "2026-02-28T10:00:00Z",
"updated_at": "2026-02-28T10:00:00Z"
}
],
"metadata": {
"current_page": 1,
"limit": 20,
"total": 1
}
}
Notes
- The list response does not expand transfer source/destination card details
- For transfer enrichment, open the detail endpoint below
2. Get Transaction By ID
GET /api/v1/mobile_user/transactions/{id}
Returns one transaction by local numeric transaction ID.
Important backend behavior
- The row is loaded first by local
id - The service then verifies that
transaction.mobile_user_idmatches the authenticated user - If the row belongs to another user, the API returns a not-found style response
Transfer-specific enrichment
If the transaction has a non-zero transfer_id, the service also loads the linked card transfer and adds:
source_card_uuidsource_card_numbersource_card_holder_namedestination_card_uuiddestination_card_numberdestination_card_holder_nameremark
Important caveat
- If a transaction has
transfer_id > 0but the linked transfer row can no longer be loaded, the detail endpoint returns an error even though the base transaction exists
Success response shape
{
"status_code": 200,
"message": "Transaction retrieved successfully",
"data": {
"id": 92,
"transaction_type": "TRANSFER",
"amount": "25.50",
"direction": "OUT",
"transaction_status": "SUCCESS",
"source_card_uuid": "5e5d4990-2241-46dc-9dbd-8abcf97e6061",
"destination_card_uuid": "6f77454d-400f-4ec4-8e2c-7a7ebfa0bcfe",
"remark": "Split payment"
}
}
Integration Notes
- Use this module for the app's own transaction timeline, not for raw card-network transaction history.
- Use Card Transaction History when you need the underlying card transaction feed.
- Use the detail endpoint for transfer rows when you need source/destination card context.