Starship Rewards API

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/transactions

Authentication: Bearer token required

Query Parameters

ParameterTypeDefaultDescription
pagenumber1Page number for pagination (min: 1)
limitnumber50Number of items per page (min: 1, max: 10,000)
transaction_typestring-Filter by transaction type ("CREDIT" or "DEBIT")
statusstring-Filter by transaction status ("PENDING", "COMPLETED", "FAILED")
wallet_idnumber-Filter by specific wallet ID
sortobject{"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: true

Response 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

FieldTypeDescription
idnumberUnique transaction identifier
wallet_idnumberAssociated wallet ID
currency_idnumberCurrency ID for the transaction
amountnumberTransaction amount (positive for credits, negative for debits)
transaction_typestringType of transaction: "CREDIT" or "DEBIT"
statusstringCurrent transaction status
source_currencystring|nullSource currency code for forex transactions
destination_currencystring|nullDestination currency code for forex transactions
forex_ratenumber|nullExchange rate applied (if applicable)
conversion_chargesnumber|nullCharges for currency conversion (if applicable)
remarksstringTransaction description or notes
created_atstringTransaction timestamp in RFC3339 format

Transaction Types

TypeDescriptionAmount Sign
CREDITFunds added to walletPositive (+)
DEBITFunds removed from walletNegative (-)

Transaction Status

StatusDescription
PENDINGTransaction initiated, awaiting processing
COMPLETEDTransaction successfully completed
FAILEDTransaction failed

Pagination Headers

HeaderDescription
X-PageCurrent page number
X-Per-PageItems per page
X-Total-CountTotal number of transactions
X-Total-PagesTotal number of pages
X-Page-SizeConfigured page size
X-Has-MoreWhether 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/:id

Authentication: Bearer token required

Path Parameters

ParameterTypeRequiredDescription
idnumberYesUnique 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:

FieldDescription
source_currencyOriginal currency code (e.g., "USD")
destination_currencyTarget currency code (e.g., "EUR")
forex_rateExchange rate applied
conversion_chargesFee 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 EUR

Transaction 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

  1. Use Specific Filters - Apply currency or name filters to reduce response size
  2. Paginate Large Results - Use appropriate page sizes (50-100 items) for performance
  3. Cache Results - Cache completed transaction lists that don't change
  4. Monitor Headers - Check pagination headers to handle multi-page results
  5. 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

Quick Reference

Common Transaction Types

TypeDescriptionDirection
CREDITFunds added to walletCredit
DEBITFunds removed from walletDebit

Transaction Status

The system uses the following transaction status values:

StatusDescription
PENDINGTransaction initiated, awaiting processing
COMPLETEDTransaction successfully completed

Note: All transaction type and status values are uppercase enums as defined in the database models.

Error Codes

CodeDescription
INSUFFICIENT_BALANCEWallet balance insufficient for transaction
WALLET_NOT_FOUNDSpecified wallet does not exist
INVALID_AMOUNTTransaction amount invalid or out of range
CURRENCY_MISMATCHCurrency incompatibility in transaction
LIMIT_EXCEEDEDTransaction exceeds configured limits
DUPLICATE_TRANSACTIONDuplicate transaction detected
WALLET_SUSPENDEDWallet 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