---
Source: https://docs.microblink.com/blinkid/scan-barcodes
Title: Scan barcodes
Description: How to use BlinkID as a barcode scanner only
---

# Scan barcodes

By default, BlinkID runs all four [extraction modules](scanning-settings.md).

To use BlinkID as a standalone barcode scanner, disable all the modules except `barcodeModule`.

When `documentCaptureModule` is disabled, additional barcode formats that are otherwise unavailable become enabled: UPC-E, UPC-A, Code 128, Code 39, EAN-8, EAN-13, ITF, Data Matrix, and Aztec.

:::note

`pdf417ScanningEnabled` and `qrScanningEnabled` must always be enabled or disabled together.

:::

## Configure the session

Disable `documentCaptureModule`, `mrzModule`, and `vizModule` by setting each to `null` (web, Android) or `nil` (iOS).
Leave `barcodeModule` enabled.

<Tabs queryString="platform">

  <TabItem value="web" label="Web (TS)" default>

  ```typescript
  import { createBlinkId } from "@microblink/blinkid";

  const blinkId = await createBlinkId({
    licenseKey: "your-license-key",
    scanningSettings: {
      documentCaptureModule: null,
      mrzModule: null,
      vizModule: null,
    },
  });
  ```

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

  ```kotlin
  BlinkIdCameraScanningScreen(
      blinkIdSdk = blinkIdSdk,
      sessionSettings = BlinkIdSessionSettings(
          scanningSettings = ScanningSettings(
              documentCaptureModule = null,
              mrzModule = null,
              vizModule = null,
          )
      ),
      onScanningSuccess = { result -> /* handle result */ },
      onScanningCanceled = { }
  )
  ```

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

  ```swift
  let sessionSettings = BlinkIDSessionSettings(
      scanningSettings: ScanningSettings(
          documentCaptureModule: nil,
          mrzModule: nil,
          vizModule: nil,
      )
  )

  let analyzer = try await BlinkIDAnalyzer(
      sdk: sdk,
      blinkIdSessionSettings: sessionSettings
  )
  ```

  </TabItem>
</Tabs>

## Read the result

The barcode result is available on the per-side sub-result.
`barcodeData` contains the raw bytes and the decoded string.
For driver's licenses and other AAMVA-compliant documents, the barcode data is also parsed into structured fields.

{/* TODO: review the correctness of these fields */}

<Tabs queryString="platform">

  <TabItem value="web" label="Web (TS)" default>

  ```typescript
  blinkId.addOnResultCallback((result) => {
    const side = result.subResults[0];

    // Raw barcode string
    console.log("Barcode string:", side.barcode?.barcodeData.stringData);
    console.log("Barcode type:", side.barcode?.barcodeData.barcodeType);
    console.log("Parsed:", side.barcode?.parsed);

    // Parsed fields (populated for AAMVA-compliant documents)
    if (side.barcode?.parsed) {
      console.log("First name:", side.barcode.firstName);
      console.log("Last name:", side.barcode.lastName);
      console.log("Date of birth:", side.barcode.dateOfBirth?.gregorian);
      console.log("Document number:", side.barcode.documentNumber);
    }

    void blinkId.destroy();
  });
  ```

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

  ```kotlin
  onScanningSuccess = { result ->
      val side = result.subResults[0]

      // Raw barcode string
      println("Barcode string: ${side.barcode?.barcodeData?.stringData}")
      println("Barcode type: ${side.barcode?.barcodeData?.barcodeType}")
      println("Parsed: ${side.barcode?.parsed}")

      // Parsed fields (populated for AAMVA-compliant documents)
      if (side.barcode?.parsed == true) {
          val barcode = side.barcode
          println("First name: ${barcode.firstName}")
          println("Last name: ${barcode.lastName}")
          println("Date of birth: ${barcode.dateOfBirth?.gregorian}")
          println("Document number: ${barcode.documentNumber}")
      }
  }
  ```

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

  ```swift
  BlinkIDUXView(
      analyzer: analyzer,
      onScanCompleted: { resultState in
          guard let result = resultState.scanningResult else { return }
          let side = result.subResults[0]

          // Raw barcode string
          print("Barcode string:", side.barcode?.barcodeData.stringData ?? "")
          print("Barcode type:", side.barcode?.barcodeData.barcodeType as Any)
          print("Parsed:", side.barcode?.parsed as Any)

          // Parsed fields (populated for AAMVA-compliant documents)
          if side.barcode?.parsed == true, let barcode = side.barcode {
              print("First name:", barcode.firstName)
              print("Last name:", barcode.lastName)
              print("Date of birth:", barcode.dateOfBirth.gregorian as Any)
              print("Document number:", barcode.documentNumber)
          }
      }
  )
  ```

  </TabItem>
</Tabs>

## Related articles

- [Scanning settings](scanning-settings.md)
- [BlinkID settings validation](settings-validation.md)


Last updated on Jul 24, 2026
