Transactions API
Query wallet transaction history and retrieve detailed transaction information
Transactions API
The Transactions API provides access to wallet transaction history, enabling you to retrieve transaction details, filter by various criteria, and track all wallet activities including credits, debits, and forex conversions.
Overview
The Transactions API consists of two main endpoints:
- List Transactions - Retrieve paginated transaction history with filtering options
- Get Transaction by ID - Get detailed information for a specific transaction
All transaction endpoints require authentication and return real-time transaction data with comprehensive details including forex conversions and charges.
List Transactions
Retrieve a paginated list of transactions for the authenticated client with optional filtering by currency, transaction type, and sorting.
Endpoint
GET /api/v1/transactionsAuthentication: Bearer token required
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
page | number | 1 | Page number for pagination (min: 1) |
limit | number | 50 | Number of items per page (min: 1, max: 10,000) |
transaction_type | string | - | Filter by transaction type ("CREDIT" or "DEBIT") |
status | string | - | Filter by transaction status ("PENDING", "COMPLETED", "FAILED") |
wallet_id | number | - | Filter by specific wallet ID |
sort | object | {"field":"id","direction":"DESC"} | Sort configuration |
Sort Object Format
{
"field": "id", // Options: "id", "amount", "created_at"
"direction": "DESC" // Options: "ASC" or "DESC"
}Response
Success Response (200 OK)
Headers:
X-Page: 1
X-Per-Page: 50
X-Total-Count: 150
X-Total-Pages: 3
X-Page-Size: 50
X-Has-More: trueResponse Body:
[
{
"id": 1001,
"wallet_id": 101,
"currency_id": 1,
"amount": 500.00,
"transaction_type": "CREDIT",
"status": "COMPLETED",
"source_currency": null,
"destination_currency": null,
"forex_rate": null,
"conversion_charges": null,
"remarks": "Wallet funding via bank transfer",
"created_at": "2025-01-15T10:30:00Z"
},
{
"id": 1002,
"wallet_id": 101,
"currency_id": 1,
"amount": -25.00,
"transaction_type": "DEBIT",
"status": "COMPLETED",
"source_currency": null,
"destination_currency": null,
"forex_rate": null,
"conversion_charges": null,
"remarks": "Order #12345 - Amazon Gift Card",
"created_at": "2025-01-15T11:45:00Z"
},
{
"id": 1003,
"wallet_id": 102,
"currency_id": 2,
"amount": 100.00,
"transaction_type": "CREDIT",
"status": "COMPLETED",
"source_currency": "USD",
"destination_currency": "EUR",
"forex_rate": 0.92,
"conversion_charges": 2.50,
"remarks": "Forex conversion from USD wallet",
"created_at": "2025-01-15T12:00:00Z"
}
]Response Fields
| Field | Type | Description |
|---|---|---|
id | number | Unique transaction identifier |
wallet_id | number | Associated wallet ID |
currency_id | number | Currency ID for the transaction |
amount | number | Transaction amount (positive for credits, negative for debits) |
transaction_type | string | Type of transaction: "CREDIT" or "DEBIT" |
status | string | Current transaction status |
source_currency | string|null | Source currency code for forex transactions |
destination_currency | string|null | Destination currency code for forex transactions |
forex_rate | number|null | Exchange rate applied (if applicable) |
conversion_charges | number|null | Charges for currency conversion (if applicable) |
remarks | string | Transaction description or notes |
created_at | string | Transaction timestamp in RFC3339 format |
Transaction Types
| Type | Description | Amount Sign |
|---|---|---|
CREDIT | Funds added to wallet | Positive (+) |
DEBIT | Funds removed from wallet | Negative (-) |
Transaction Status
| Status | Description |
|---|---|
PENDING | Transaction initiated, awaiting processing |
COMPLETED | Transaction successfully completed |
FAILED | Transaction failed |
Pagination Headers
| Header | Description |
|---|---|
X-Page | Current page number |
X-Per-Page | Items per page |
X-Total-Count | Total number of transactions |
X-Total-Pages | Total number of pages |
X-Page-Size | Configured page size |
X-Has-More | Whether more pages are available |
Error Responses
400 Bad Request
{
"error": {
"code": "BAD_REQUEST",
"message": "Invalid query parameters"
}
}401 Unauthorized
{
"error": {
"code": "UNAUTHORIZED",
"message": "Invalid or expired authentication token"
}
}500 Internal Server Error
{
"error": {
"code": "INTERNAL_ERROR",
"message": "Failed to retrieve transactions"
}
}Examples
# Get first page of transactions with default pagination
curl -X GET "{{host}}/api/v1/transactions" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Accept: application/json"
# Filter by currency ID with custom pagination
curl -X GET "{{host}}/api/v1/transactions?currency_id=1&limit=20&page=1" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Accept: application/json"
# Filter by transaction type (CREDIT only)
curl -X GET "{{host}}/api/v1/transactions?transaction_type=CREDIT" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Accept: application/json"
# Filter by status
curl -X GET "{{host}}/api/v1/transactions?status=COMPLETED&limit=50" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Accept: application/json"
# Filter by date range
curl -X GET "{{host}}/api/v1/transactions?start_date=2025-01-01T00:00:00Z&end_date=2025-01-31T23:59:59Z" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Accept: application/json"
# Filter by amount range
curl -X GET "{{host}}/api/v1/transactions?min_amount=100&max_amount=1000" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Accept: application/json"
# Sort by amount in ascending order
curl -X GET "{{host}}/api/v1/transactions?sort=%7B%22field%22%3A%22amount%22%2C%22direction%22%3A%22ASC%22%7D" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Accept: application/json"<?php
function listTransactions($token, $filters = []) {
$defaultFilters = [
'page' => 1,
'limit' => 50
];
$params = array_merge($defaultFilters, $filters);
// Handle sort parameter
if (isset($params['sort']) && is_array($params['sort'])) {
$params['sort'] = json_encode($params['sort']);
}
$queryString = http_build_query($params);
$url = '{{host}}/api/v1/transactions?' . $queryString;
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Accept: application/json'
],
CURLOPT_HEADER => true
]);
$response = curl_exec($ch);
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$headers = substr($response, 0, $headerSize);
$body = substr($response, $headerSize);
curl_close($ch);
// Parse pagination headers
$pagination = [];
if (preg_match('/X-Page: (\d+)/', $headers, $matches)) {
$pagination['current_page'] = (int)$matches[1];
}
if (preg_match('/X-Total-Count: (\d+)/', $headers, $matches)) {
$pagination['total_count'] = (int)$matches[1];
}
if (preg_match('/X-Total-Pages: (\d+)/', $headers, $matches)) {
$pagination['total_pages'] = (int)$matches[1];
}
return [
'transactions' => json_decode($body, true),
'pagination' => $pagination
];
}
// Example: Get recent transactions
$result = listTransactions('YOUR_ACCESS_TOKEN', [
'limit' => 20,
'page' => 1
]);
foreach ($result['transactions'] as $txn) {
echo "Transaction #{$txn['id']}: {$txn['amount']}\n";
echo " Type: {$txn['transaction_type']}\n";
echo " Status: {$txn['status']}\n";
echo " Date: {$txn['created_at']}\n\n";
}
// Display pagination info
echo "Page {$result['pagination']['current_page']} of {$result['pagination']['total_pages']}\n";
echo "Total transactions: {$result['pagination']['total_count']}\n";
?>Get Transaction by ID
Retrieve detailed information for a specific transaction including all forex conversion details and charges.
Endpoint
GET /api/v1/transactions/:idAuthentication: Bearer token required
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | number | Yes | Unique transaction identifier |
Response
Success Response (200 OK)
{
"id": 1003,
"wallet_id": 102,
"currency_id": 2,
"amount": 100.00,
"transaction_type": "CREDIT",
"status": "COMPLETED",
"source_currency": "USD",
"destination_currency": "EUR",
"forex_rate": 0.92,
"conversion_charges": 2.50,
"remarks": "Forex conversion from USD wallet",
"created_at": "2025-01-15T12:00:00Z"
}Response Fields
Same as the List Transactions response fields.
Error Responses
400 Bad Request
{
"error": {
"code": "BAD_REQUEST",
"message": "Invalid transaction ID"
}
}404 Not Found
{
"error": {
"code": "NOT_FOUND",
"message": "Transaction not found"
}
}500 Internal Server Error
{
"error": {
"code": "INTERNAL_ERROR",
"message": "Failed to retrieve transaction"
}
}Examples
# Get specific transaction by ID
curl -X GET "{{host}}/api/v1/transactions/1003" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Accept: application/json"<?php
function getTransaction($token, $transactionId) {
$url = '{{host}}/api/v1/transactions/' . $transactionId;
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $token,
'Accept: application/json'
]
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode === 404) {
throw new Exception("Transaction not found");
}
if ($httpCode !== 200) {
throw new Exception("API Error: HTTP $httpCode");
}
return json_decode($response, true);
}
// Usage
try {
$transaction = getTransaction('YOUR_ACCESS_TOKEN', 1003);
echo "Transaction ID: {$transaction['id']}\n";
echo "Amount: {$transaction['amount']}\n";
echo "Type: {$transaction['transaction_type']}\n";
echo "Status: {$transaction['status']}\n";
// Display forex details if present
if ($transaction['forex_rate']) {
echo "Forex Rate: {$transaction['forex_rate']}\n";
echo "Conversion Charges: {$transaction['conversion_charges']}\n";
echo "From: {$transaction['source_currency']}\n";
echo "To: {$transaction['destination_currency']}\n";
}
} catch (Exception $e) {
echo "Error: " . $e->getMessage() . "\n";
}
?>Implementation Notes
Transaction Amount Convention
- CREDIT transactions: Positive amounts (e.g., 500.00)
- DEBIT transactions: Negative amounts (e.g., -25.00)
- The amount sign indicates the direction of funds relative to the wallet
Forex Transactions
When a transaction involves currency conversion, the following fields are populated:
| Field | Description |
|---|---|
source_currency | Original currency code (e.g., "USD") |
destination_currency | Target currency code (e.g., "EUR") |
forex_rate | Exchange rate applied |
conversion_charges | Fee charged for conversion |
Example Calculation:
Source Amount: 100 USD
Forex Rate: 0.92
Conversion Charges: 2.50 EUR
Final Amount: (100 × 0.92) - 2.50 = 89.50 EURTransaction Remarks
The remarks field contains contextual information about the transaction:
- Order payments: "Order #12345 - Product Name"
- Wallet funding: "Wallet funding via bank transfer"
- Refunds: "Refund for Order #12345"
- Forex conversions: "Forex conversion from USD wallet"
- Transfers: "Transfer to Wallet #102"
Filtering Best Practices
- Use Specific Filters - Apply currency or name filters to reduce response size
- Paginate Large Results - Use appropriate page sizes (50-100 items) for performance
- Cache Results - Cache completed transaction lists that don't change
- Monitor Headers - Check pagination headers to handle multi-page results
- Sort Appropriately - Sort by created_at for chronological order, by amount for financial analysis
Performance Tips
Optimal Page Sizes
- Interactive UI: 20-50 items per page
- Reporting: 100-500 items per page
- Bulk Processing: Up to 1,000 items per page (max: 10,000)
Caching Strategy
- Cache completed transactions (status: COMPLETED, FAILED)
- Don't cache pending transactions
- Implement cache invalidation when new transactions occur
- Consider caching by wallet_id for faster wallet-specific queries
Rate Limiting
The Transactions API implements the following rate limits:
- List Transactions: 1000 requests per minute
- Get Transaction by ID: 2000 requests per minute
- Rate limits are applied per client authentication token
Security Considerations
Access Control
- Clients can only access their own transactions
- Admin users may have cross-client visibility
- Transaction IDs are globally unique and non-sequential
Data Privacy
- Sensitive transaction details are only visible to authorized users
- All API requests are logged for audit purposes
- Implements TLS encryption for data in transit
Integration Examples
# Get all transactions for reconciliation
curl -X GET "{{host}}/api/v1/transactions?limit=1000&sort=%7B%22field%22%3A%22created_at%22%2C%22direction%22%3A%22ASC%22%7D" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Accept: application/json"
# Get all credit transactions
curl -X GET "{{host}}/api/v1/transactions?transaction_type=CREDIT" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Accept: application/json"
# Get transactions for a specific wallet
curl -X GET "{{host}}/api/v1/transactions?wallet_id=101" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Accept: application/json"
# Get transactions in a specific currency
curl -X GET "{{host}}/api/v1/transactions?currency_id=1" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Accept: application/json"<?php
class TransactionClient {
private $baseUrl;
private $token;
public function __construct($baseUrl, $token) {
$this->baseUrl = $baseUrl;
$this->token = $token;
}
/**
* List transactions with filtering
*/
public function listTransactions($filters = [], $limit = 50, $page = 1) {
$params = [
'limit' => $limit,
'page' => $page
];
// Merge additional filters
$params = array_merge($params, $filters);
$queryString = http_build_query($params);
$url = $this->baseUrl . '/api/v1/transactions?' . $queryString;
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $this->token,
'Accept: application/json'
]
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode !== 200) {
throw new Exception("API Error: HTTP $httpCode");
}
return json_decode($response, true);
}
/**
* Get transaction by ID
*/
public function getTransaction($transactionId) {
$url = $this->baseUrl . '/api/v1/transactions/' . $transactionId;
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $this->token,
'Accept: application/json'
]
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode === 404) {
return null;
}
if ($httpCode !== 200) {
throw new Exception("API Error: HTTP $httpCode");
}
return json_decode($response, true);
}
/**
* Calculate total credits
*/
public function getTotalCredits($filters = []) {
$filters['transaction_type'] = 'CREDIT';
$transactions = $this->listTransactions($filters, 10000);
$total = 0;
foreach ($transactions as $txn) {
$total += $txn['amount'];
}
return $total;
}
/**
* Calculate total debits
*/
public function getTotalDebits($filters = []) {
$filters['transaction_type'] = 'DEBIT';
$transactions = $this->listTransactions($filters, 10000);
$total = 0;
foreach ($transactions as $txn) {
$total += abs($txn['amount']);
}
return $total;
}
/**
* Get transaction summary
*/
public function getTransactionSummary($filters = []) {
$transactions = $this->listTransactions($filters, 10000);
$summary = [
'total_transactions' => count($transactions),
'total_credits' => 0,
'total_debits' => 0,
'net_amount' => 0,
'pending_count' => 0,
'completed_count' => 0,
'failed_count' => 0
];
foreach ($transactions as $txn) {
if ($txn['transaction_type'] === 'CREDIT') {
$summary['total_credits'] += $txn['amount'];
} else {
$summary['total_debits'] += abs($txn['amount']);
}
$summary['net_amount'] += $txn['amount'];
switch ($txn['status']) {
case 'PENDING':
$summary['pending_count']++;
break;
case 'COMPLETED':
$summary['completed_count']++;
break;
case 'FAILED':
$summary['failed_count']++;
break;
}
}
return $summary;
}
}
// Usage example
$client = new TransactionClient('{{host}}', 'YOUR_ACCESS_TOKEN');
try {
// Get all transactions for currency ID 1
$usdTransactions = $client->listTransactions(['currency_id' => 1]);
echo "Total transactions: " . count($usdTransactions) . "\n";
// Get credit transactions only
$creditTransactions = $client->listTransactions(['transaction_type' => 'CREDIT'], 100);
echo "Credit transactions: " . count($creditTransactions) . "\n";
// Get transactions for a specific wallet
$walletTransactions = $client->listTransactions(['wallet_id' => 101], 50);
echo "Wallet #101 transactions: " . count($walletTransactions) . "\n";
// Get specific transaction
$transaction = $client->getTransaction(1003);
if ($transaction) {
echo "Transaction Amount: {$transaction['amount']}\n";
}
// Get transaction summary
$summary = $client->getTransactionSummary(['currency_id' => 1]);
echo "Total Credits: {$summary['total_credits']}\n";
echo "Total Debits: {$summary['total_debits']}\n";
echo "Net Amount: {$summary['net_amount']}\n";
echo "Completed: {$summary['completed_count']}\n";
} catch (Exception $e) {
echo "Error: " . $e->getMessage() . "\n";
}
?>Next Steps
- Wallet Management - View wallet balances and details
- Order Tracking - Monitor order-related transactions
Quick Reference
Common Transaction Types
| Type | Description | Direction |
|---|---|---|
CREDIT | Funds added to wallet | Credit |
DEBIT | Funds removed from wallet | Debit |
Transaction Status
The system uses the following transaction status values:
| Status | Description |
|---|---|
PENDING | Transaction initiated, awaiting processing |
COMPLETED | Transaction successfully completed |
Note: All transaction type and status values are uppercase enums as defined in the database models.
Error Codes
| Code | Description |
|---|---|
INSUFFICIENT_BALANCE | Wallet balance insufficient for transaction |
WALLET_NOT_FOUND | Specified wallet does not exist |
INVALID_AMOUNT | Transaction amount invalid or out of range |
CURRENCY_MISMATCH | Currency incompatibility in transaction |
LIMIT_EXCEEDED | Transaction exceeds configured limits |
DUPLICATE_TRANSACTION | Duplicate transaction detected |
WALLET_SUSPENDED | Wallet is suspended or inactive |
Integration Support
For immediate assistance with transaction operations:
- API Status: Check system status at status.starship.com
- Technical Support: Contact support@starshiprewards.com
- Emergency Support: Use priority support channel for critical issues