Receipt Scanning

Available on: iOS Android React Native Flutter Cordova .NET MAUI

Overview

The Genius Scan SDK provides specialized receipt scanning capabilities that combine document capture with automatic data extraction. This feature extracts structured information from receipts, including merchant details, amounts, dates, and VAT information.

Key Features

  • Automatic Data Extraction - Extract merchant, total amount, date, category, and VAT details
  • Multi-currency Support - Handle receipts in various currencies with locale detection
  • Smart Enhancement - Optimized filters for receipt readability

Quick Implementation

Enable receipt scanning by adding receipt extraction to your ScanFlow configuration:

let configuration = GSKScanFlowConfiguration()

// Enable receipt extraction
configuration.structuredData = [.receipt]
configuration.multiPage = false
configuration.skipPostProcessingScreen = true

// Start scan flow
let scanFlow = GSKScanFlow(configuration: configuration)
scanFlow.start(from: viewController, onSuccess: { result in
    // Access receipt data
    if let receipt = result.scans.first?.structuredDataResult?.receipt {
        print("Merchant: \(receipt.merchant ?? "Unknown")")
        print("Amount: \(receipt.amount ?? 0)")
        print("Date: \(receipt.date ?? Date())")
        print("Currency: \(receipt.currency ?? "")")
        print("Category: \(receipt.category ?? "")")
        print("VAT Number: \(receipt.vatNumber ?? "")")
    }
}, failure: { error in
    // Handle error
})
val configuration = ScanConfiguration().apply {
    // Enable receipt extraction
    structuredData = EnumSet.of(StructuredData.RECEIPT)
    multiPage = false
}

// Start scan flow
ScanFlow.scanWithConfiguration(activity, configuration)

// Handle result
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    val result = ScanFlow.getScanResultFromActivityResult(data)

    // Access receipt data
    result.scans?.first()?.structuredDataResult?.receipt?.let { receipt ->
        Log.d("Receipt", "Merchant: ${receipt.merchant}")
        Log.d("Receipt", "Amount: ${receipt.amount}")
        Log.d("Receipt", "Date: ${receipt.date}")
        Log.d("Receipt", "Currency: ${receipt.currency}")
        Log.d("Receipt", "Category: ${receipt.category}")
        Log.d("Receipt", "VAT Number: ${receipt.vatNumber}")
    }
}
const configuration = {
  // Enable receipt extraction
  structuredData: ['receipt'],
  multiPage: false,
  skipPostProcessingScreen: true
};

// Start scan flow
try {
  const result = await RNGeniusScan.scanWithConfiguration(configuration);

  // Access receipt data
  if (result.scans?.[0]?.structuredData?.receipt) {
    const receipt = result.scans[0].structuredData.receipt;
    console.log("Merchant:", receipt.merchant);
    console.log("Amount:", receipt.amount);
    console.log("Date:", receipt.date);
    console.log("Currency:", receipt.currency);
    console.log("Category:", receipt.category);
    console.log("VAT Number:", receipt.vatNumber);
  }
} catch (error) {
  // Handle error
  console.error("Scan failed:", error);
}
var configuration = {
  // Enable receipt extraction
  'structuredData': ['receipt'],
  'multiPage': false,
  'skipPostProcessingScreen': true
};

// Start scan flow
try {
  var result = await FlutterGeniusScan.scanWithConfiguration(configuration);

  // Access receipt data
  var receipt = result['scans']?[0]?['structuredData']?['receipt'];
  if (receipt != null) {
    print("Merchant: ${receipt['merchant']}");
    print("Amount: ${receipt['amount']}");
    print("Date: ${receipt['date']}");
    print("Currency: ${receipt['currency']}");
    print("Category: ${receipt['category']}");
    print("VAT Number: ${receipt['vatNumber']}");
  }
} catch (error) {
  // Handle error
  print("Scan failed: $error");
}
var configuration = {
  // Enable receipt extraction
  structuredData: ['receipt'],
  multiPage: false,
  skipPostProcessingScreen: true
};

// Start scan flow
cordova.plugins.GeniusScan.scanWithConfiguration(configuration,
  function(result) {
    // Access receipt data
    var receipt = result.scans?.[0]?.structuredData?.receipt;
    if (receipt) {
      console.log("Merchant:", receipt.merchant);
      console.log("Amount:", receipt.amount);
      console.log("Date:", receipt.date);
      console.log("Currency:", receipt.currency);
      console.log("Category:", receipt.category);
      console.log("VAT Number:", receipt.vatNumber);
    }
  },
  function(error) {
    // Handle error
    console.error("Scan failed:", error);
  }
);
using GeniusScanSDK.ScanFlow;
var scanFlowService = new ScanFlowService();

var configuration = new Dictionary<string, object>
{
    // Enable receipt extraction
    ["structuredData"] = new[] { "receipt" },
    ["multiPage"] = false,
    ["skipPostProcessingScreen"] = true
};
var result = await scanFlowService.ScanDocument(configuration);

// Access receipt data
var scans = (IList<object>)result["scans"];
var firstScan = (Dictionary<string, object>)scans[0];
if (firstScan.TryGetValue("structuredData", out var structuredDataObj))
{
    var structuredData = (Dictionary<string, object>)structuredDataObj;
    if (structuredData.TryGetValue("receipt", out var receiptObj))
    {
        var receipt = (Dictionary<string, object>)receiptObj;
        Console.WriteLine($"Merchant: {receipt["merchant"]}");
        Console.WriteLine($"Amount: {receipt["amount"]}");
        Console.WriteLine($"Date: {receipt["date"]}");
        Console.WriteLine($"Currency: {receipt["currency"]}");
        Console.WriteLine($"Category: {receipt["category"]}");
        Console.WriteLine($"VAT Number: {receipt["vatNumber"]}");
    }
}

Extracted Data Fields

The SDK extracts the following receipt information:

Field Description Type
Merchant Store or vendor name String
Amount Total receipt amount Decimal
Date Transaction date Date
Currency Currency code (USD, EUR, etc.) String
Locale Receipt locale information String
Category Receipt category classification String
VAT Number Merchant’s VAT registration number String
VAT Values VAT rates and amounts (can be multiple) Array

VAT Details

Receipts may contain multiple VAT rates that apply to different items. Each VAT entry includes:

  • Rate - The VAT percentage rate
  • Amount - The VAT amount for that rate

Error Handling

Handle cases where extraction might fail:

if let receipt = result.scans.first?.structuredData?.receipt {
    // Process receipt data
} else {
    // No receipt data extracted
    // You still have the scanned image
    let imageUrl = result.scans.first?.enhancedFilePath
    // Allow manual entry or retry
}

What’s Next?

Ready to get started?

Start with a free trial license to test the SDK, or contact us directly for a custom quote tailored to your needs.

Products

Industries

Case Studies

Integration

Company

© 2025 The Grizzly Labs. All rights reserved.