---
Source: https://docs.microblink.com/blinkcard/extract-fields
Title: Extract specific fields
Description: Read the card number, expiry date, CVV, IBAN, and cardholder name from a BlinkCard result
---

# Extract specific fields

Once scanning completes, BlinkCard returns a result object with the extracted card data.
This guide shows how to read the most common fields on web, Android, and iOS.

## The result object

Whether you scan [via camera](./scan-camera.md) or from a [static image](./scan-image.md), you get back a `BlinkCardScanningResult`.
Card account data (number, CVV, expiry) lives in the `cardAccounts` array, while the cardholder name and IBAN are top-level fields:

<Tabs queryString="platform">
  <TabItem value="web" label="Web (JS)" default>

```ts
blinkCard.addOnResultCallback((result) => {
  const account = result.cardAccounts[0];

  const cardNumber = account.cardNumber;
  const cvv = account.cvv;
  const cardholderName = result.cardholderName;
  const iban = result.iban;
  const issuingNetwork = result.issuingNetwork; // e.g. "visa", "mastercard"
});
```

  </TabItem>
  <TabItem value="android" label="Android (Kotlin)">

```kotlin
val account = result.cardAccounts[0]

val cardNumber = account.cardNumber
val cvv = account.cvv
val cardholderName = result.cardholderName
val iban = result.iban
val issuingNetwork = result.issuingNetwork // e.g. "visa", "mastercard"
```

  </TabItem>
  <TabItem value="ios" label="iOS (Swift)">

```swift
let account = result.cardAccounts[0]

let cardNumber = account.cardNumber
let cvv = account.cvv
let cardholderName = result.cardholderName
let iban = result.iban
let issuingNetwork = result.issuingNetwork // e.g. "visa", "mastercard"
```

  </TabItem>
</Tabs>

A card can expose more than one payment account, so `cardAccounts` is an array.
For a standard single-account card, read the first entry.

## Card number

The card number is always extracted from the first side.
Each account also reports whether the number passed [Luhn](https://en.wikipedia.org/wiki/Luhn_algorithm) checksum validation:

<Tabs queryString="platform">
  <TabItem value="web" label="Web (JS)" default>

```ts
const account = result.cardAccounts[0];
console.log("Card number:", account.cardNumber);
console.log("Passes checksum:", account.cardNumberValid);
```

  </TabItem>
  <TabItem value="android" label="Android (Kotlin)">

```kotlin
val account = result.cardAccounts[0]
Log.d("BlinkCard", "Card number: ${account.cardNumber}")
Log.d("BlinkCard", "Passes checksum: ${account.cardNumberValid}")
```

  </TabItem>
  <TabItem value="ios" label="iOS (Swift)">

```swift
let account = result.cardAccounts[0]
print("Card number:", account.cardNumber)
print("Passes checksum:", account.cardNumberValid)
```

  </TabItem>
</Tabs>

## Expiry date

The expiry date is a structured `DateResult`.
Read the parsed `month` and `year`, or use `originalString` for the raw text as printed on the card:

<Tabs queryString="platform">
  <TabItem value="web" label="Web (JS)" default>

```ts
const expiry = result.cardAccounts[0].expiryDate;
console.log("Month:", expiry.month);
console.log("Year:", expiry.year);
console.log("As printed:", expiry.originalString);
```

  </TabItem>
  <TabItem value="android" label="Android (Kotlin)">

```kotlin
val expiry = result.cardAccounts[0].expiryDate
Log.d("BlinkCard", "Month: ${expiry.month}")
Log.d("BlinkCard", "Year: ${expiry.year}")
Log.d("BlinkCard", "As printed: ${expiry.originalString}")
```

  </TabItem>
  <TabItem value="ios" label="iOS (Swift)">

On iOS, `expiryDate` is optional (`DateResult?`), so unwrap it before reading the parsed values:

```swift
if let expiry = result.cardAccounts[0].expiryDate {
    print("Month:", expiry.month)
    print("Year:", expiry.year)
    print("As printed:", expiry.originalString)
}
```

  </TabItem>
</Tabs>

## CVV

The CVV is usually printed on the back of the card, so it is only present after the second side is scanned:

<Tabs queryString="platform">
  <TabItem value="web" label="Web (JS)" default>

```ts
const cvv = result.cardAccounts[0].cvv;
```

  </TabItem>
  <TabItem value="android" label="Android (Kotlin)">

```kotlin
val cvv = result.cardAccounts[0].cvv
```

  </TabItem>
  <TabItem value="ios" label="iOS (Swift)">

```swift
let cvv = result.cardAccounts.first?.cvv
```

  </TabItem>
</Tabs>

## Cardholder name and IBAN

These are top-level fields and may be empty if the card does not contain them or extraction was disabled:

<Tabs queryString="platform">
  <TabItem value="web" label="Web (JS)" default>

```ts
console.log("Cardholder:", result.cardholderName);
console.log("IBAN:", result.iban);
```

  </TabItem>
  <TabItem value="android" label="Android (Kotlin)">

```kotlin
Log.d("BlinkCard", "Cardholder: ${result.cardholderName}")
Log.d("BlinkCard", "IBAN: ${result.iban}")
```

  </TabItem>
  <TabItem value="ios" label="iOS (Swift)">

```swift
print("Cardholder:", result.cardholderName ?? "")
print("IBAN:", result.iban ?? "")
```

  </TabItem>
</Tabs>

## Disable fields you don't need

By default, BlinkCard extracts all supported fields.
If your integration only needs some of them, disable the rest so the SDK can finish scanning sooner (it concludes after a single side once all requested data is captured).

## Related articles

- [Scan a card via camera](./scan-camera.md)
- [Scan a card from a static image](./scan-image.md)


Last updated on Jun 18, 2026
