Data Models

Android SDK: Data Models

Reference guide for the core data structures used throughout the Digital Card Engine SDK.

CardEntity

The primary model representing a complete card with all associated data.

data class CardEntity(
    val receivedCard: ReceivedCard,
    val cardArt: String?,
    val isReceiver: Boolean = false,
    val transactionHistory: List<Transaction>?,
    val transactionCurrency: String?,
    val transactionHasNext: Boolean?,
    val transactionNextPageStartingAfter: String?,
    val events: List<CardEvent>?,
    val assetType: AssetType?,
    val metadata: CardMetadata?
)

Properties

PropertyTypeNullableDescription
receivedCardReceivedCardNoCore card information (ID, balance, PAN, etc.)
cardArtString?YesBase64-encoded image of the card front
isReceiverBooleanNoWhether the current user is the card receiver (default false)
transactionHistoryList<Transaction>?YesList of transactions (fetched separately via getTransactionHistory)
transactionCurrencyString?YesISO 4217 currency code for the returned transactions
transactionHasNextBoolean?Yestrue if more transaction pages are available
transactionNextPageStartingAfterString?YesCursor to pass as nextPageStartingAfter in the next page request
eventsList<CardEvent>?YesCard lifecycle events (fetched separately)
assetTypeAssetType?YesType categorization for the card
metadataCardMetadata?YesAdditional extensible metadata

Usage

// Fetch cards
val cards: List<CardEntity> = sdk.getCards()

// Access card details
val card = cards.first()
val label = card.receivedCard.cardLabel
val balance = card.receivedCard.balance
val last4 = card.receivedCard.last4

ReceivedCard

Core card information including identifiers, balance, and cardholder details.

data class ReceivedCard(
    val giftCardId: String,
    val expiryDate: String,
    val cardArtId: String,
    val balance: Double?,
    val name: String?,
    val lastName: String?,
    val last4: String?,
    val message: CardMessage?,
    val status: ActivationStatus?,
    val cardLabel: String?
)

Properties

PropertyTypeNullableDescription
giftCardIdStringNoUnique card identifier
expiryDateStringNoExpiration date (ISO 8601 format)
cardArtIdStringNoID to fetch card artwork
balanceDouble?YesCurrent card balance
nameString?YesCardholder first name
lastNameString?YesCardholder last name
last4String?YesLast 4 digits of PAN
messageCardMessage?YesOptional card message/greeting
statusActivationStatus?YesCard activation status
cardLabelString?YesDisplay name for the card

Usage

val receivedCard = cardEntity.receivedCard

// Display card label
val displayName = receivedCard.cardLabel ?: receivedCard.giftCardId

// Format masked PAN
val maskedPan = receivedCard.last4?.let { "•••• $it" } ?: "N/A"

// Format balance
val formattedBalance = receivedCard.balance?.let { 
    "${sdk.styleConfiguration.currencySymbol}%.2f".format(it)
} ?: "N/A"

Transaction

Represents a single card transaction.

data class Transaction(
    val transactionType: String,          // e.g. "LOAD", "DEDUCTION", "AUTHORISATION"
    val transactionTypeDetail: String?,   // Sub-type detail or MCC code
    val transactionDate: String,          // ISO date-time string
    val transactionAmount: Double,        // Absolute transaction amount
    val transactionId: String,            // Unique transaction ID
    val transactionDescription: String?  // Optional description / merchant name
)

Properties

PropertyTypeNullableDescription
transactionTypeStringNoTransaction type string, e.g. "LOAD", "DEDUCTION", "AUTHORISATION"
transactionTypeDetailString?YesSub-type detail or merchant category code
transactionDateStringNoTransaction date/time (ISO date-time format)
transactionAmountDoubleNoAbsolute transaction amount
transactionIdStringNoUnique transaction identifier
transactionDescriptionString?YesOptional description or merchant name

Usage

// Fetch transactions
val result = sdk.getTransactionHistory(
    card = card,
    periodStart = "2026-01-01T00:00:00",
    periodEnd   = "2026-01-31T23:59:59"
)
val transactions = result.transactionHistory ?: emptyList()

// Display transaction
transactions.forEach { txn ->
    val label = txn.transactionDescription ?: txn.transactionType
    println("${txn.transactionAmount} on ${txn.transactionDate}: $label")
}

// Filter by type
val loads = transactions.filter { it.transactionType == "LOAD" }
val deductions = transactions.filter { it.transactionType == "DEDUCTION" }

CardEvent

Represents a lifecycle or activity event for a card.

data class CardEvent(
    val eventTime: String,
    val eventType: CardEventType,
    val initialBalance: Double
)

Properties

PropertyTypeNullableDescription
eventTimeStringNoEvent date/time (ISO 8601)
eventTypeCardEventTypeNoType enum (see below)
initialBalanceDoubleNoCard balance at the time of the event

CardEventType

enum class CardEventType {
    Purchased,
    FundsLoaded,
    Sent,
    Activated,
    Declined,
    Expired
}

Usage

// Fetch events
val cardWithEvents = sdk.getEventHistory(card)
val events = cardWithEvents.events ?: emptyList()

// Display recent events
events.take(5).forEach { event ->
    println("${event.eventType} at ${event.eventTime}: balance=${event.initialBalance}")
}

// Filter by type
val fundsLoaded = events.filter { it.eventType == CardEventType.FundsLoaded }
val activations = events.filter { it.eventType == CardEventType.Activated }

CardMessage

Optional message attached to a card (e.g., gift card greeting).

data class CardMessage(
    val receiver: String?,
    val text: String?
)

Properties

PropertyTypeNullableDescription
receiverString?YesReceiver name/greeting
textString?YesMessage text

Usage

val message = cardEntity.receivedCard.message
if (message != null) {
    println("To: ${message.receiver ?: "You"}")
    println(message.text ?: "")
}

ActivationStatus

Card activation/lifecycle status.

enum class ActivationStatus {
    Sent,
    Activated,
    Declined,
    Expired,
    InActivation,
    NotActivated,
    Rejected,
    InProgress,
    Failed,
    Blocked
}

Usage

val status = cardEntity.receivedCard.status

when (status) {
    ActivationStatus.Activated  -> showCard()
    ActivationStatus.Blocked    -> showLockedState()
    ActivationStatus.Expired    -> showExpiredMessage()
    ActivationStatus.Declined,
    ActivationStatus.Rejected,
    ActivationStatus.Failed     -> showErrorState()
    else                        -> showPendingState()
}

AssetType

Categorization for different card types.

enum class AssetType {
    GIFT_CARD,
    PREPAID_CARD,
    DEBIT_CARD,
    CREDIT_CARD,
    VIRTUAL_CARD,
    OTHER
}

CardMetadata

Extensible key-value metadata for cards.

data class CardMetadata(
    val properties: Map<String, String>
)

Usage

val metadata = cardEntity.metadata
val customField = metadata?.properties?.get("customField")

UI-Specific Models

CardListItem

UI wrapper for card list items returned in onCardSelected callbacks.

data class CardListItemUi(
    val label: String,          // Card display name or ID
    val number: String,         // Masked PAN, e.g. "•••• 1234"
    val balance: String,        // Formatted balance string
    val imageBase64: String?,   // Base64-encoded card artwork
    val entity: CardEntity      // Underlying model — pass to details/transactions
)

typealias CardListItem = CardListItemUi

CardOverviewProperties

Per-instance configuration for UILibrary.CardOverview.

data class CardOverviewProperties(
    val cardInfo: CardInfo = CardInfo.Brief,
    val actionButton: Boolean = true,
    val cardStatus: CardStatus = CardStatus.Default,
    val cardWidgetStyle: CardWidgetStyle = CardWidgetStyle.Large,
    val slider: Boolean = false,
    val currencySymbol: String? = null
)

enum class CardInfo {
    Brief,   // Balance only
    Detail   // Balance + masked PAN + expiry
}

enum class CardStatus {
    Default,  // Normal state
    Details,  // Secure fields visible
    Locked    // Card locked state
}

enum class CardWidgetStyle {
    Default,  // Compact
    Large     // Full-width
}

TransactionsCardProperties

Configuration for the transactions card widget.

data class TransactionsCardProperties(
    val title: Boolean = true  // Show the "Transactions" section header
)

Complete Example

import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.launch

class CardActivity : ComponentActivity() {
    private lateinit var sdk: DigitalCardEngineSDK

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        sdk = (application as MyApp).sdk

        lifecycleScope.launch {
            try {
                // Fetch all cards
                val cards = sdk.getCards()
                val card = cards.firstOrNull() ?: return@launch

                // Access card properties
                val receivedCard = card.receivedCard
                println("Card: ${receivedCard.cardLabel}")
                println("Balance: ${receivedCard.balance}")
                println("Last 4: ${receivedCard.last4}")
                println("Status: ${receivedCard.status}")

                // Fetch transactions (requires periodStart / periodEnd)
                val result = sdk.getTransactionHistory(
                    card = card,
                    periodStart = "2026-01-01T00:00:00",
                    periodEnd   = "2026-01-31T23:59:59"
                )
                result.transactionHistory?.forEach { txn ->
                    println("${txn.transactionType}: ${txn.transactionAmount} on ${txn.transactionDate}")
                }

                // Fetch events
                val cardWithEvents = sdk.getEventHistory(card)
                cardWithEvents.events?.forEach { event ->
                    println("${event.eventType} at ${event.eventTime}: balance=${event.initialBalance}")
                }

            } catch (e: Exception) {
                Log.e("CardActivity", "Error: ${e.message}")
            }
        }
    }
}

Nullability Guidelines

Many properties are nullable to accommodate:

  • Partial API responses: Backend may not always return all fields
  • Progressive loading: Data fetched incrementally (e.g., transactions loaded separately)
  • Optional features: Not all cards have messages, metadata, etc.

Always use safe calls (?.) or Elvis operators (?:) when accessing nullable properties.


Type Conversions

Date Formatting

import java.time.LocalDateTime
import java.time.format.DateTimeFormatter

fun formatTransactionDate(isoDateTime: String): String {
    val dt = LocalDateTime.parse(isoDateTime)
    val formatter = DateTimeFormatter.ofPattern("MMM dd, yyyy HH:mm")
    return dt.format(formatter)
}

// Usage
val displayDate = formatTransactionDate(transaction.transactionDate)

Currency Formatting

import java.text.NumberFormat
import java.util.Locale

fun formatAmount(amount: Double, currencySymbol: String?): String {
    val formatted = NumberFormat.getInstance(Locale.US).format(amount)
    return "${currencySymbol ?: ""}$formatted"
}

// Usage
val displayAmount = formatAmount(
    transaction.transactionAmount,
    sdk.styleConfiguration.currencySymbol
)

See Also