Not sure which Scandit product fits your use case?
Install the Scandit plugin and use the /data-capture-sdk skill so that your AI coding agent can recommend the right product for your use case. More info →
Run the following command in your project directory. It detects the supported coding agents you have installed and adds the Scandit plugin to each. Re-run it to update.
npx plugins add scandit/skillsPrefer to set it up yourself? Manual installation steps for each agent →
AI-Powered Barcode Scanning
Barcode scanning workflows commonly face operational challenges such as scanning from awkward angles or long distances, selecting the correct barcode in dense environments, handling damaged labels, and preventing unintended duplicate scans. Traditional scanners handle these scenarios with rigid time-based logic and manual user intervention, which slows down workflows and increases errors.
Scandit's AI-powered scanning capabilities, built into the Scandit AI Engine and available in both SparkScan and Barcode Capture, solve these problems by analyzing context and user intent in real-time. The scanner adapts dynamically to environmental conditions and user behavior.
On Web, these features are off with the default settings. To use intent anticipation and the Smart Duplicate Filter, set the scan intention to Smart. For dense-environment selection, also set the selection mode to Auto. You enable the text recognition fallback per symbology. For details, see Default settings.
Overview
The AI-powered features address four critical scanning challenges:
-
Avoiding unintentional scans – Prevent background codes from being captured along with the intended barcode
-
Selecting barcodes in dense environments – Support the user in selecting the right barcode among many by automatically enabling the aimer
-
Handling damaged or unreadable barcodes – Automatically fall back to OCR to capture the text value when barcode decoding fails
-
Filtering duplicates – Distinguish intentional duplicate scans from accidental re-scans
Intent anticipation and dense-environment selection depend on two settings: scan intention and selection mode. The Smart Duplicate Filter depends on the scan intention and the duplicate filter setting, with one exception for selection mode On, as described in Filtering duplicate scans. The defaults differ by capture mode and by framework, as shown in Default settings. You configure the text recognition fallback for damaged barcodes per symbology, as described in Scanning damaged barcodes.
Default settings
The following table lists the default scan intention and selection mode for each capture mode.
| Framework | SparkScan scanIntention | SparkScan selectionMode | Barcode Capture scanIntention | Barcode Capture selectionMode |
|---|---|---|---|---|
| iOS, Android, React Native, Flutter, Capacitor, Cordova, .NET iOS, .NET Android, Kotlin Multiplatform | Smart | Auto | Smart | Off |
| Web | Manual | Off | Manual | Off |
With these defaults:
- On every framework except Web, SparkScan anticipates user intent and assists with selection in dense environments without any configuration.
- On every framework except Web, Barcode Capture anticipates user intent. Dense-environment selection is off until you set the selection mode to Auto.
- On Web, both capture modes use manual scan intention and no selection assistance until you enable them.
Smart scan intention and Auto selection mode take effect on supported devices only. Auto selection mode requires Smart scan intention. If you set the scan intention to Manual, Auto behaves like Off.
On Web, SparkScan behaves differently while the scan intention is unset. The scan intention is unset if you never set it or you set it to null. For details, see Selecting barcodes in dense environments.
Avoiding unintentional scans
The problem
When scanning items from a distance or with imperfect aiming, which is common in retail backrooms, warehouses, or during replenishment, users often accidentally capture barcodes in the background or periphery instead of their intended target. This forces them to open their scan list, identify the wrong entry, delete it, and try again.
Traditional scanners trigger on any barcode that enters the scanning area, relying on users to maintain perfect aim and proximity to the target code. This approach breaks down in real-world conditions where users need to scan quickly from natural working distances.
How Scandit solves it
The scanner uses intent anticipation algorithms to analyze device movement and aiming behavior in real-time. It identifies which barcode the user is trying to scan and ignores unintended codes even when aiming is imperfect or scanning from a distance.
This allows users to scan from comfortable distances without the precision required by traditional scanners.
Key benefits:
-
Scan from natural distances without bending or reaching
-
Reduce list cleanup and workflow interruptions
-
Maintain accuracy even with fast, imprecise movements
Configuration
The scan intention property controls intent anticipation: SparkScanSettings.scanIntention for SparkScan and BarcodeCaptureSettings.scanIntention for Barcode Capture. Set it to ScanIntention.Smart to enable intent anticipation, or to ScanIntention.Manual to turn it off.
On Web, the default is ScanIntention.Manual for both SparkScan and Barcode Capture. To enable intent anticipation, set the scan intention to ScanIntention.Smart.
Selecting barcodes in dense environments
The problem
In environments with multiple barcodes placed closely together, such as densely packed warehouse shelves, multi-label packages, or retail displays, traditional scanners often capture the wrong code. Users must manually adjust their position, zoom in, or repeatedly attempt the scan until the correct barcode is recognized. In some cases, they resort to covering adjacent barcodes with their hands, a slow and awkward workaround.
How Scandit solves it
When the selection mode is SelectionMode.Auto, the scanner automatically detects dense barcode environments and adapts its behavior and user interface accordingly.
The interface transitions based on environmental context:
-
Sparse environments: Direct scanning with intent anticipation (no aimer needed)
-
Dense environments: Aimer overlay appears automatically, allowing precise selection
This adaptive approach means users don't need to switch modes manually. The scanner adapts to what it sees.
Key benefits:
-
Precise barcode selection in cluttered environments
-
Automatic interface adaptation based on context
-
No manual mode switching required
-
Reduced positioning and re-scanning attempts
Configuration
The selection mode property controls dense-environment detection and barcode selection: SparkScanSettings.selectionMode for SparkScan and BarcodeCaptureSettings.selectionMode for Barcode Capture. It takes one of the following SelectionMode values:
SelectionMode.Auto: The SDK decides dynamically whether selection is active, based on device capabilities and scene conditions.SelectionMode.Off: Selection is never active. The SDK scans a barcode as the user aims at it.SelectionMode.On: Selection is always active. The user confirms each scan by tapping the trigger button in SparkScan, or the preview in Barcode Capture. While the selection mode isSelectionMode.On, the SDK stores the scan intention you set but doesn't apply it, and uses smart selection internally so that the aimer appears. The SDK applies your scan intention when the selection mode changes toSelectionMode.AutoorSelectionMode.Off. In SparkScan,SelectionMode.Onalso turns off hold-to-scan on the trigger button, and the SDK ignoresSparkScanViewSettings.holdToScanEnabled.
SelectionMode.Auto requires the scan intention to be ScanIntention.Smart. If you set the scan intention to ScanIntention.Manual, SelectionMode.Auto behaves like SelectionMode.Off. In SparkScan, this is different while the scan intention is unset, as described later in this section.
On Web, the default is SelectionMode.Off for both SparkScan and Barcode Capture. To enable dense-environment selection, set the scan intention to ScanIntention.Smart and the selection mode to SelectionMode.Auto.
In SparkScan on Web, the scan intention is unset if you never set it or you set it to null. While the scan intention is unset, setting the selection mode to SelectionMode.Auto also changes the scan intention to ScanIntention.Smart. Barcode Capture doesn't do this. Set both the scan intention and the selection mode explicitly to get predictable behavior.
Since SDK 8.5, ScanIntention.SmartSelection is deprecated. Use ScanIntention.Smart together with the selection mode SelectionMode.Auto instead.
Note: SparkScan is recommended for single scanning workflows as its UI is optimized to provide visual feedback and adapt dynamically to AI inputs.
Scanning damaged barcodes
The problem
Barcodes in real-world operational environments, retail stores, warehouses, distribution centers, are frequently damaged, partially torn, scratched, or covered by stickers. When the barcode structure itself is compromised to the point where decoding is impossible, users traditionally resort to manual data entry, asking colleagues for help, or moving items to access alternative labels.
This interrupts the scanning workflow, slows down operations, and introduces opportunities for transcription errors when data is entered manually.
How Scandit solves it
Scandit's barcode scanning engine already employs advanced computer vision techniques at the frontier of the industry to decode damaged, low-contrast, poorly printed, and partially obscured barcodes with exceptional reliability. The engine uses sophisticated image processing, error correction algorithms, and pattern reconstruction to successfully read barcodes that other scanners cannot. However, when the barcode's encoded information is physically lost or damaged beyond reconstruction, such as when critical sections are torn away, burned, or chemically degraded, our text recognition technology helps to get the data.
The transition is automatic and requires no user intervention. From the user's perspective, they point at a damaged label and get the data, whether through barcode decoding or OCR.
Key benefits:
-
No manual workarounds or data entry
-
Maintains workflow speed even with severely damaged labels
-
Reduces dependency on backup labels or manual lookups
Configuration
OCR-based text reading is supported for a subset of symbologies, including Code128, Code39, Codabar, and EAN13/UPCA. Support and configuration details vary by symbology and may evolve over time. For the up-to-date list of supported symbologies and instructions on how to enable text reading extensions, refer to the symbology extension documentation.
Filtering duplicate scans
The problem
Traditional duplicate filters use time-based blocking: after scanning a barcode, the same code cannot be scanned again for a fixed duration (for example, 1.5 seconds). This approach creates two significant problems:
-
Workflow delays – When intentionally scanning duplicate items (for example, multiple boxes or items with the same barcode during inventory), users must wait for the timeout to expire between each scan. This artificial delay slows down operations.
-
Accidental re-scans – When dwelling on a barcode or moving slowly, the timeout expires and the same code is accidentally captured multiple times. Users must then clean up their scan list by identifying and removing duplicate entries.
Both scenarios reduce efficiency and create friction in scanning workflows. Time-based filters cannot distinguish between intentional and accidental duplicates, they impose a fixed delay regardless of user intent.
How Scandit solves it
The Smart Duplicate Filter uses AI algorithms to analyze user behavior and intent in real-time, distinguishing between:
-
Intentional duplicate scans
-
Accidental duplicate scans
The system analyzes user behavior and context to determine whether a duplicate scan represents a new item or an accidental re-trigger.
When the filter detects intentional scanning of a duplicate code, it reports the barcode immediately. When it detects accidental dwelling or hesitation, it suppresses the duplicate, eliminating both workflow delays and false positives.
Key benefits:
-
Scan duplicate items back-to-back without delays
-
Prevent accidental re-scans from dwelling or slow movement
-
Eliminate manual cleanup of duplicate entries
Configuration
The Smart Duplicate Filter is active when both of the following are true:
- The scan intention is
ScanIntention.Smart, or the deprecatedScanIntention.SmartSelection. - The duplicate filter property,
SparkScanSettings.codeDuplicateFilterorBarcodeCaptureSettings.codeDuplicateFilter, is set to its smart default,-2(the default since SDK 7.1).
On Web, the scan intention defaults to ScanIntention.Manual. To enable the Smart Duplicate Filter, set it to ScanIntention.Smart. In SparkScan, an unset scan intention also resolves to ScanIntention.Smart when the selection mode is SelectionMode.Auto, which enables the Smart Duplicate Filter. For details, see Selecting barcodes in dense environments.
If the scan intention is ScanIntention.Manual, the smart default acts as a fixed 1.5-second duplicate filter.
Since SDK 8.5, SelectionMode.On is an exception. If the selection mode is SelectionMode.On and you don't set the duplicate filter, the SDK doesn't filter duplicates. This lets the user select the same barcode again. If you set the duplicate filter to any value, including -2, the SDK uses that value instead.
To revert to manual, time-based duplicate filtering, set the duplicate filter to a number of milliseconds greater than 0. This disables Smart Duplicate Filter and restores fixed timeout-based duplicate suppression. To report the same code every time the SDK finds it, set the duplicate filter to 0.