` elements. One for the QR code scanner and one for displaying the scan result.
```hljs html
HTML5 Barcode Scanner
```
Since smartphone cameras are much better suited for scanning barcodes than laptop or desktop webcams, let’s also make sure our scanner looks good on mobile by including some simple CSS in our **index.html**:
```hljs html
HTML5 Barcode Scanner
```
To test your project on your phone, you have a few options. One option is to use a service like [ngrok](https://ngrok.com/), which creates a tunnel to one of their SSL-certified domains. Their [Quick Start](https://ngrok.com/docs/getting-started/) guide will help you get up and running quickly.
Now let’s test our app by scanning a barcode!

## Optional: Implement additional features
The html5-qrcode library offers some further [customization options](https://github.com/mebjas/html5-qrcode?tab=readme-ov-file#documentation-1). Let’s say you want to build a [PDF417 scanner](https://scanbot.io/techblog/pdf417-barcode-reader-javascript-tutorial/) that also works in poor lighting conditions. By passing a `config` object as an argument to the `Html5QrcodeScanner` constructor in **script.js**, you can …
- adapt the aspect ratio of the viewfinder to the more horizontal format of a PDF417 barcode,
- restrict scanning to PDF417 barcodes to avoid false positives,
- enable a button that turns on the device’s flashlight if it has one.
```hljs csharp
// define the config object
let config = {
fps: 10,
qrbox: {width: 300, height: 100},
formatsToSupport: [Html5QrcodeSupportedFormats.PDF_417],
showTorchButtonIfSupported: true,
};
// existing code
// pass the config object to the Html5QrcodeScanner constructor
var html5QrcodeScanner = new Html5QrcodeScanner(
"qr-reader", config);
// existing code
```

## Disadvantages of using html5-qrcode for scanning barcodes
The html5-qrcode library is easy to integrate and offers a preconfigured UI, which makes it a good choice for quick prototyping or personal projects.
However, it comes with a few drawbacks:
- **Camera issues**: Some users have reported issues with the camera not starting on specific platforms.
- **Poor performance**: Compared to alternative libraries, html5-qrcode tends to be less performant and can struggle with certain barcode types.
- **Inconsistent results**: Scanning results can vary between devices and environments, leading to unreliable performance.
- **Lack of supported symbologies:** Under the hood, html5-qrcode uses ZXing.js (another barcode scanning library that is no longer officially supported), which limits the different barcode types it can scan.
- **Difficulties when troubleshooting:** Debugging an app that uses html5-qrcode can be challenging due to insufficient documentation and unclear error messages.
For companies that heavily rely on barcode scanning in their business processes, we recommend using an enterprise-grade solution instead.
## Building an HTML5 QR Code & Barcode Scanner with the Scanbot SDK
We developed the Scanbot [Web Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/web-barcode-scanner/) to help enterprises overcome the hurdles presented by free barcode scanning software. Our goal was to have a developer-friendly solution available for a wide range of platforms that consistently delivers high-quality results – even in challenging circumstances.
Thanks to the Scanbot SDK’s Ready-to-Use UI Components, you can even use an AR overlay to display multiple barcodes’ contents right in the viewfinder.
Scanning a single barcode
Scanning multiple barcodes with the AR overlay
To accomplish that, you will need to follow the steps below:
1. Downloading the Web SDK
2. Creating the HTML page and configuring the Web SDK
3. Enabling the AR overlay
Let’s dive into more details for each step.
### Step 1: Download the Web SDK
First, create a new empty directory for your app and name it, e.g. “barcode-scanner-app”.
Then download the Scanbot SDK package directly from [the npm registry](https://registry.npmjs.org/scanbot-web-sdk/-/scanbot-web-sdk-7.0.0.tgz).
💡 You can also [use npm to download and install the package](https://docs.scanbot.io/barcode-scanner-sdk/web/detailed-setup-guide/installation/#npm), but in this tutorial, we’ll do it manually. You can check the latest SDK version in the [changelog](https://docs.scanbot.io/barcode-scanner-sdk/web/changelog/).
Unzip the downloaded files into **barcode-scanner-app**. If the unzipped folder is named “package” or similar, rename it to “scanbot-web-sdk” or make sure to later provide the correct directory path in the code.
Your folder structure should look like this:
```bash
barcode-scanner-app/
|- scanbot-web-sdk/
|- webpack/
|- bundle/
|- @types/
|- index.js
|- ui.js
... (and some other files)
```
### Step 2: Create the HTML page and configure the Web SDK
Create an **index.html** file in the **barcode-scanner-app** folder. Then add the following code to the file:
```hljs html
My Scanner App
Start scanning
```
The code block above:
- Adds the “Start scanning” button.
- Imports and initializes the Scanbot SDK.
- Executes the user interface from the Scanbot SDK when the user clicks the “Start scanning” button.
- If a barcode is identified, it will present the barcode type and its content to the user.
💡 Without a license key, our SDK only runs for 60 seconds per session. This is more than enough for the purposes of our tutorial, but if you like, you can [generate a license key](https://scanbot.io/trial/) on our website.
Feel free to run the app to see if everything is working so far.

### Step 3: Enable the AR overlay
The Scanbot SDK lets you display an AR overlay on the screen so users can pick a specific barcode when the scanner recognizes multiple barcodes. All you need to do to enable this feature is to add the following code after defining the `config` object:
```hljs cpp
config.useCase.arOverlay.visible = true;
config.useCase.arOverlay.automaticSelectionEnabled = false;
```
Run your app again to see the AR overlay in action.

### Conclusion
🎉 That’s it! You now have a fully functional barcode scanning web app using the Scanbot SDK’s RTU UI.
Are you interested in how the scanner implementation works in your favorite JavaScript framework?
We’ve got you covered:
- [React.js](https://scanbot.io/techblog/react-barcode-reader-tutorial/)
- [Vue](https://scanbot.io/techblog/vue-js-barcode-scanner-tutorial/)
- [Angular](https://scanbot.io/techblog/angular-barcode-scanner-tutorial/)
- [Svelte](https://scanbot.io/techblog/svelte-barcode-scanner-tutorial/)
- [Next.js](https://scanbot.io/techblog/next-js-barcode-scanner-tutorial/)
Should you have any questions, feel free to reach out to us [on Slack or MS Teams](https://docs.scanbot.io/support/) or send us an email via [sdksupport@scanbot.io](mailto:sdksupport@scanbot.io)
Happy scanning! 🤳
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Related blog posts
[](https://scanbot.io/techblog/how-to-build-a-javascript-document-scanner-web-app/)
### [How to build a JavaScript Document Scanner web app](https://scanbot.io/techblog/how-to-build-a-javascript-document-scanner-web-app/)
We'll show you how to build a document scanning web app in minutes using only HTML, JavaScript, and our Web Document Scanner SDK.

Kevin February 21, 20257 mins read
[](https://scanbot.io/techblog/compose-multiplatform-barcode-scanning-ui-tutorial/)
### [How to create a Compose Multiplatform iOS & Android barcode scanning application using the Scanbot SDK](https://scanbot.io/techblog/compose-multiplatform-barcode-scanning-ui-tutorial/)
Compose Multiplatform enables developers to write UI code compatible with both Android and iOS. We’ll walk you through the integration process with the Scanbot Barcode Scanner SDK.

Ildar July 30, 202411 mins read
[](https://scanbot.io/techblog/progressive-web-app-barcode-scanner-tutorial/)
### [How to build a Progressive Web App (PWA) Barcode Scanner with React and TypeScript](https://scanbot.io/techblog/progressive-web-app-barcode-scanner-tutorial/)
Learn how to build an installable barcode scanning PWA using React and our Web SDK in this step-by-step guide.

Kevin January 7, 202510 mins read
+
## React Native Barcode Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/developer/react-native-barcode-scanner/?utm_source=chatgpt.com#main)
# React Native Barcode Scanner
Add fast and accurate barcode scanning to your React Native apps with the Scanbot React Native Barcode Scanner SDK. Seamlessly integrate real-time barcode scanning across iOS and Android platforms using a single codebase.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders


Real-time AR feedback
With the React Native Barcode Scanner SDK, you can display important product information directly in the camera view while scanning barcodes.

Barcode scanning in challenging conditions
The Scanbot React Native Barcode Scanner SDK is optimized to handle difficult real-world scanning environments, such as:
- Damaged barcodes
- Low-light environments
- Tiny or distant barcodes
[Customizable UI components\\
\\
Our Ready-To-Use UI components cover all barcode scanning scenarios and are highly customizable.](https://scanbot.io/rtu-ui/)
Fast.
Very fast.
Every scan happens in
0.04s
or less
Scans all major barcode types
Code 39
Code 93
Code 32
Code 25
EAN-5
PDF417
GS1 DataBar
Code 39
Code 93
Code 32
Code 25
EAN-5
PDF417
GS1 DataBar
EAN-13
MSI Plessey
EAN-2
Aztec Code
rMQR Code
Codabar
UPC-A
EAN-13
MSI Plessey
EAN-2
Aztec Code
rMQR Code
Codabar
UPC-A
EAN-8
ISBN
GiroCode
GS1-128
Data Matrix
IATA 2 of 5
EAN-8
ISBN
GiroCode
GS1-128
Data Matrix
IATA 2 of 5
Code 128
Code 11
QR Code
UPC-E
Micro QR Code
MaxiCode
Code 128
Code 11
QR Code
UPC-E
Micro QR Code
MaxiCode
## Add a fast and reliable Barcode Scanner to your React Native app
The Scanbot React Native [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) provides an easy way to integrate powerful barcode scanning functionalities into your React Native applications. With React Native, developers can build apps for both iOS and Android using a single codebase, ensuring consistent performance and ease of development.
Supporting key barcode formats such as [Data Matrix](https://scanbot.io/barcode-scanner-sdk/data-matrix/), [QR codes](https://scanbot.io/glossary/qr-code/), [PDF417](https://scanbot.io/barcode-scanner-sdk/pdf417/), and [EAN](https://scanbot.io/barcode-scanner-sdk/ean/), the SDK is perfect for applications in industries like retail, logistics, healthcare, and manufacturing. With customizable UI components, developers can quickly implement barcode scanning features while ensuring a seamless user experience. The SDK also handles challenging environments like low-light conditions and damaged barcodes, ensuring reliable scanning performance in any situation.
Need help? Our [expert support](https://docs.scanbot.io/support/) team is available via Slack, Microsoft Teams, or email to guide you through the integration process and ensure that your React Native app takes full advantage of the Scanbot Barcode Scanner SDK.
### Technical requirements
The Scanbot React Native Barcode Scanner SDK requires:
- **React Native Version**: 0.73 or higher
- **Platforms**: iOS 13.0+ and Android 5.0+ (API Level 21+)
- **Hardware**: A rear-facing camera with autofocus
- **Architecture:**
- Android: armeabi-v7, arm64-v8a, x86, x86\_64
- iOS: arm64, x86\_64
## Integrate this evening with your framework
categoryFeatures
## Discover common React Native Barcode Scanning use cases
See how the scan modes of the Scanbot React Native Barcode Scanner can improve your workflows.
- ### Single Scanning
The React Native Barcode Scanner is ideal for scanning single barcodes in retail or inventory management applications. Users can scan barcodes quickly and accurately, improving overall efficiency.
- ### Batch Scanning
Allow users to scan multiple barcodes in a single session without needing to close the scanner. This feature is particularly useful for logistics, warehouse management, and order fulfillment applications.
- ### Multi Scanning
Capture several barcodes simultaneously with the React Native Camera Barcode Scanner, perfect for applications that need to handle large volumes of items in inventory management or logistics.
Learn more [Multi Barcode Scanner](https://scanbot.io/blog/enhancing-operations-with-multi-barcode-scanners/)
- ### Find & Pick
Provide one or more barcode values, and the SDK will highlight and scan the correct items. This is essential for warehouse picking or product identification in supply chain management.
- ### Scan & Count
Allow users to count multiple items in a single scan, making this feature ideal for inventory checks and warehouse audits, where accuracy and speed are important.

## How to integrate the Scanbot React Native Barcode Scanner using Ready-To-Use UI
The **Ready-To-Use UI** (RTU UI) is an easy-to-integrate and highly customizable high-level UI component that can handle most barcode scanning use cases and tasks.
The design and behavior of this component are based on our many years of experience as well as the feedback from our SDK customers.
Although the main idea of the RTU UI is to provide simple-to-integrate and simple-to-configure components, its customization capabilities are numerous and should suit most of your needs. To achieve an even higher degree of customization, you can implement a custom UI and business-logic using our [Native Components](https://docs.scanbot.io/barcode-scanner-sdk/react-native/barcode-scanner/native-components/).
**Import**
[](https://docs.scanbot.io/barcode-scanner-sdk/react-native/barcode-scanner/ui-components/#import)
To use the RTU UI component please import `startBarcodeScanner` function and all related configurations and results from `react-native-scanbot-barcode-scanner-sdk/ui_v2`.
**Example:** [](https://docs.scanbot.io/barcode-scanner-sdk/react-native/barcode-scanner/ui-components/#example)
```hljs javascript
import { startBarcodeScanner, BarcodeScannerConfiguration } from 'react-native-scanbot-barcode-scanner-sdk/ui_v2';
```
RTU UI v2 Default Configuration
```hljs csharp
// Create the default configuration object.
const config = new BarcodeScannerConfiguration();
// See further customization configs...
const result = await startBarcodeScanner(config);
```
[See full example on GitHub](https://github.com/doo/scanbot-barcode-scanner-sdk-example-react-native/blob/v5.1.1/src/utils/CodeSnippets.ts#L83-L88)
**Returns**
[](https://docs.scanbot.io/barcode-scanner-sdk/react-native/barcode-scanner/ui-components/#returns)
- `result.status` – `OK` If the scanning is completed, `CANCELED` if the user has canceled the operation (tapped on the “cancel” button).
- `result.data?.items` – Optional List of recognized barcodes as items. See the barcode item structure below.
Barcode item structure:
- `type` – Recognized barcode symbology.
- `count` – Number of recognized barcodes of this symbology and value.
- `text` – Recognized value of the barcode.
- `textWithExtension` – Recognized barcode value with extension (if available).
- `rawBytes` – Representation of the raw data that is contained the recognized barcode.
- `parsedDocument` – The parsed known document format (if parsed successfully).
## React Native Barcode Scanner for Expo
The Scanbot Barcode Scanner SDK can be integrated into React Native applications using the Expo framework. This integration is only possible when using an Expo development build.
Combining Expo’s framework with Scanbot SDK allows you to implement powerful barcode scanning features with minimal setup. The entire integration process can be completed in less than an hour, with comprehensive documentation and dedicated integration support available. Check out our comprehensive, step-by-step [tutorial](https://scanbot.io/techblog/react-native-scanner-tutorial/) that guides you through the entire process of integrating the React Native Barcode Scanner SDK into your Expo project.
[Read the full React Native Barcode Scanner SDK documentation](https://docs.scanbot.io/barcode-scanner-sdk/react-native/barcode-scanner/ui-components/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### **What are the key requirements for the Scanbot React Native Barcode Scanner SDK?**
The Scanbot React Native Barcode Scanner SDK has the following technical requirements:
**React Native Version**: 0.68 or higher
**Operating System**:
\- Android: 5.0 (API Level 21) and higher
\- iOS: 13.0 and higher
**Hardware**: A device with a rear-facing camera with autofocus
**Supported Architectures**:
\- Android: armeabi-v7, arm64-v8a, x86, x86\_64
\- iOS: arm64 (physical devices) and x86\_64 (simulators)
These requirements ensure compatibility with both iOS and Android platforms, allowing for smooth barcode scanning in React Native applications.
### **Can I use the React Native Barcode Scanner SDK offline?**
Yes, the Scanbot React Native Barcode Scanner SDK works fully offline. All barcode data is processed directly on the device, without requiring an internet connection. This makes it suitable for use cases where data privacy is important, such as in healthcare, logistics, and retail, as well as in remote environments where internet access may be unreliable.
### **Is there a trial version available for the React Native Barcode Scanner SDK?**
Yes, you can request a 7-day free trial license for the Scanbot React Native Barcode Scanner SDK. Simply visit the Scanbot SDK [trial request page](https://scanbot.io/trial/), fill in the required details, and you will receive a trial license to test all features of the SDK.
### **Is the Scanbot React Native Barcode Scanner SDK compatible with different Android and iOS devices?**
Yes, the Scanbot React Native Barcode Scanner SDK is compatible with a wide range of devices across both Android and iOS. Supported devices include:
1\. **Android**: Devices running Android 5.0 (API Level 21) or higher
2\. **iOS**: Devices running iOS 13.0 or higher
The SDK is optimized to work efficiently on both lower-end and high-performance devices, ensuring reliable barcode scanning across diverse hardware configurations.
### **How do I customize the React Native Barcode Scanner UI?**
The Scanbot React Native Barcode Scanner SDK provides customizable UI components, enabling you to modify the scanner’s layout and appearance to suit your app’s design. Customization options include:
1\. Customizing the scanner overlay
2\. Adjusting button colors and styles
3\. Modifying user feedback sounds and messages
These options allow you to seamlessly integrate barcode scanning into your app while maintaining your desired branding and user experience.
If you need more customization options, you can also integrate the SDK using Classical Components – giving you complete freedom over the design of the Scanner UI.
### **What platforms are supported besides React Native?**
In addition to React Native, the Scanbot SDK supports a variety of other platforms, making it versatile for developers working on multiple technologies. Supported platforms include:
1\. [iOS](https://scanbot.io/developer/ios-barcode-scanner-sdk/)
2\. [Android](https://scanbot.io/developer/android-barcode-scanner/)
3\. [JavaScript](https://scanbot.io/developer/javascript-barcode-scanner/) (Web)
4\. [Flutter](https://scanbot.io/developer/flutter-barcode-scanner/)
5\. [Cordova](https://scanbot.io/developer/cordova-barcode-scanner-plugin/)
6\. [Capacitor](https://scanbot.io/developer/capacitor-barcode-scanner-sdk/) / [Ionic](https://scanbot.io/developer/ionic-barcode-scanner/)
7\. [Xamarin](https://scanbot.io/developer/xamarin-barcode-scanner/)
8\. [.NET MAUI](https://scanbot.io/developer/net-maui-barcode-scanner-sdk/)
9\. [UWP](https://scanbot.io/developer/uwp-barcode-scanner/) (Universal Windows Platform)
10\. [Linux](https://scanbot.io/developer/linux-barcode-scanner/)
This multi-platform support ensures that the SDK can be integrated across mobile, web, and desktop applications, providing consistent functionality and performance.
### Does the Scanbot React Native Barcode Scanner SDK support Expo?
Yes. Integration with Expo is possible when using a development build. Check out the [tutorial](https://scanbot.io/techblog/react-native-scanner-tutorial/) to learn how to integrate the Scanbot SDK in a React Native app using the Expo framework.
+
## Cordova Barcode Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/developer/cordova-barcode-scanner-plugin/#main)
# Cordova Barcode Scanner Plugin
Seamlessly add fast, reliable barcode scanning to your Cordova-based hybrid apps. The Scanbot Cordova Barcode Scanner ensures real-time data capture across iOS and Android platforms.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders


Real-time AR feedback
Enhance your app’s user experience with real-time AR feedback during barcode scanning in your Cordova app. Visual cues help guide users to improve accuracy and efficiency in barcode scanning.

Barcode scanning in challenging conditions
The Scanbot Cordova Barcode Scanner is optimized for scanning barcodes in difficult real-world environments, such as:
- Damaged barcodes
- Low-light environments
- Tiny or distant barcodes
[Customizable UI components\\
\\
Our Ready-To-Use UI components cover all barcode scanning scenarios and are highly customizable.](https://scanbot.io/rtu-ui/)
Fast.
Very fast.
Every scan happens in
0.04s
or less
Scans all major barcode types
Code 39
Code 93
Code 32
Code 25
EAN-5
PDF417
GS1 DataBar
Code 39
Code 93
Code 32
Code 25
EAN-5
PDF417
GS1 DataBar
EAN-13
MSI Plessey
EAN-2
Aztec Code
rMQR Code
Codabar
UPC-A
EAN-13
MSI Plessey
EAN-2
Aztec Code
rMQR Code
Codabar
UPC-A
EAN-8
ISBN
GiroCode
GS1-128
Data Matrix
IATA 2 of 5
EAN-8
ISBN
GiroCode
GS1-128
Data Matrix
IATA 2 of 5
Code 128
Code 11
QR Code
UPC-E
Micro QR Code
MaxiCode
Code 128
Code 11
QR Code
UPC-E
Micro QR Code
MaxiCode
## Add fast and reliable Barcode Scanning to your Cordova app
Integrate the Scanbot Cordova [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) seamlessly into your hybrid applications. Our SDK provides APIs for scanning and parsing 1D and 2D barcodes, ensuring fast, accurate barcode recognition in real time.
The Scanbot Cordova Barcode Scanner Plugin supports a wide range of barcode formats, including QR codes, PDF417, and EAN, making it ideal for applications that require precise barcode scanning. Whether you’re developing solutions for warehouse management, supply chain logistics, or industrial asset tracking, the plugin ensures accurate and efficient scanning. Its flexibility also suits document digitization tasks, where the reliable capture of barcode data is critical for maintaining workflow accuracy and speed.
With our Ready-To-Use UI (RTU UI) components, you can quickly implement a fully functional barcode scanner without extensive coding. The SDK is designed for low-light environments and can handle damaged barcodes, providing reliability in various real-world scenarios.
Additionally, the SDK supports image-based barcode scanning, enabling users to scan barcodes from uploaded images. This feature adds flexibility for use cases like document management and inventory control.
### Technical requirements
The Scanbot Cordova Barcode Scanner Plugin requires the following:
- **Cordova CLI**:
9.x+
- **Cordova Platforms:** Android 10+, iOS 5.1+
- **Operating System**:
Android: 5.0 (API Level 21) and higher, iOS: 13.0 and higher
- **Architectures**:
- Android: armeabi-v7, arm64-v8a, x86, x86\_64
- iOS: arm64 for physical devices and x86\_64 for simulators
## Integrate this evening with
categoryFeatures
## Discover common Cordova Barcode Scanning use cases
See how the scan modes of the Scanbot Cordova Barcode Scanner Plugin can improve your workflows.
- ### Single Scanning
Perfect for scanning individual barcodes in inventory management or product lookups. The Scanbot Cordova Barcode Scanner ensures high accuracy for quick, single barcode scans.
- ### Batch Scanning
Allow users to scan multiple barcodes in succession without closing the scanner, making the Cordova Barcode Scanner Plugin ideal for logistics operations and order picking.
- ### Multi Scanning
Capture several barcodes simultaneously. This feature is perfect for warehouse management where multiple items need to be scanned in one go, improving workflow efficiency.
- ### Find & Pick
Given one or more barcode values, the Cordova Barcode Scanner Plugin will highlight and scan the correct items, simplifying warehouse picking and product identification.
- ### Scan & Count
Easily count multiple items with a single scan. This feature, supported by the Cordova Barcode Scanner Plugin, is useful for inventory checks, enabling fast and accurate processing of large numbers of items.

## How to integrate the Scanbot Cordova Barcode Scanner
**Installation**
The Scanbot Barcode Scanner SDK Cordova Plugin is available as an npm package `cordova-plugin-scanbot-barcode-scanner`.
You can simply install and add it to your Cordova project with the following command:
```
$ cordova plugin add cordova-plugin-scanbot-barcode-scanner
```
Or in an [Ionic](https://ionicframework.com/) based project:
```
$ ionic cordova plugin add cordova-plugin-scanbot-barcode-scanner
```
**Permissions**
During the installation, this plugin will try to add all required permissions to your projects automatically. Here is a listing of those permissions to verify:
- **Android** (will be added in your `AndroidManifest.xml` file): `
` – This permission is used for the camera views.
- **iOS** (will be added in your `Info.plist` file): `NSCameraUsageDescription` – “Privacy – Camera Usage Description”. Describe why your app wants to access the camera. By default, an empty string value will be added. You can change this value in the `config.xml` file of your Cordova project – see `CAMERA_USAGE_DESCRIPTION`.
[Read the full Cordova Barcode Scanner SDK documentation](https://docs.scanbot.io/barcode-scanner-sdk/cordova/getting-started/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### **What are the key requirements for the Scanbot Cordova Barcode Scanner SDK?**
The Scanbot Cordova Barcode Scanner SDK requires:
**Operating System:**\- Android: 5.0 (API Level 21) and higher
\- iOS: 13.0 and higher
**Cordova CLI:** Version 9.x or higher
**Hardware:** Devices must have a rear-facing camera with autofocus
**Supported Architectures:**\- Android: armeabi-v7, arm64-v8a, x86, x86\_64
\- iOS: arm64 (physical devices) and x86\_64 (simulators)
### **Can I use the Cordova Barcode Scanner SDK offline?**
Yes, the Scanbot Cordova Barcode Scanner SDK works fully offline, ensuring that barcode data is processed directly on the device without needing an internet connection. This is particularly useful for field operations, remote locations, and situations where data privacy is crucial.
### **Does the Cordova Barcode Scanner SDK work with all types of barcodes?**
Yes, the SDK supports a wide range of 1D and 2D barcodes, including:
**1D Barcodes:** UPC, EAN, Code 128, Code 39, ITF, and more
**2D Barcodes:** QR codes, [PDF417](https://scanbot.io/barcode-scanner-sdk/pdf417/), [DataMatrix](https://scanbot.io/barcode-scanner-sdk/data-matrix/), Aztec, and more
This broad compatibility ensures the SDK can be used across various industries like logistics, healthcare, and retail. You can find a list of all supported barcodes [here](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/).
### **What platforms are supported besides Cordova?**
Besides Cordova, the Scanbot SDK supports:
1\. [iOS](https://scanbot.io/developer/ios-barcode-scanner-sdk/)
2\. [Android](https://scanbot.io/developer/android-barcode-scanner/)
3\. [JavaScript](https://scanbot.io/developer/javascript-barcode-scanner/) (Web)
4\. [Flutter](https://scanbot.io/developer/flutter-barcode-scanner/)
5\. [React Native](https://scanbot.io/developer/react-native-barcode-scanner/)
6\. [Capacitor](https://scanbot.io/developer/capacitor-barcode-scanner-sdk/) / [Ionic](https://scanbot.io/developer/ionic-barcode-scanner/)
7\. [Xamarin](https://scanbot.io/developer/xamarin-barcode-scanner/)
8\. [.NET MAUI](https://scanbot.io/developer/net-maui-barcode-scanner-sdk/)
9\. [UWP](https://scanbot.io/developer/uwp-barcode-scanner/) (Universal Windows Platform)
10\. [Linux](https://scanbot.io/developer/linux-barcode-scanner/)
This flexibility allows developers to integrate barcode scanning into web, mobile, and desktop applications.
### **How can I integrate a Cordova Barcode Scanner Plugin into my app?**
To integrate a Cordova Barcode Scanner Plugin into your app, you typically add a barcode scanning SDK to your project, configure supported barcode formats, and initialize the scanner in your app's workflow. These SDKs usually support formats like QR codes, PDF417, and Code 128. If you want the fastest and most reliable solution, you need to choose the Scanbot SDK – trusted by over 250 enterprises worldwide.
You can find detailed installation instructions in the [Scanbot SDK Cordova Barcode Scanner Documentation](https://docs.scanbot.io/barcode-scanner-sdk/cordova/introduction/).
### **Is there a trial version available for the Cordova Barcode Scanner SDK?**
Yes, you can obtain a 7-day free trial license for the Scanbot Cordova Barcode Scanner SDK. Visit the Scanbot SDK [trial page](https://scanbot.io/trial/) to request a trial license key. The trial version allows you to test the full SDK without any functional limitations.
### **What is the performance of the Cordova Barcode Scanner SDK in low-light conditions?**
The Scanbot Cordova Barcode Scanner SDK is optimized to work in challenging environments, including low-light conditions. The SDK uses advanced image processing techniques to ensure accurate barcode detection even in suboptimal lighting, making it suitable for applications in warehouses, factories, and other industrial environments.
### **How can I customize the Scanbot Cordova Barcode Scanner UI?**
The Scanbot Cordova Barcode Scanner SDK provides customizable UI components that allow you to adjust the look and feel of the barcode scanner interface. You can customize the colors, layout, and behavior of the scanner to match your app’s design and branding requirements.
Customization can be done by passing UI configuration parameters when initializing the scanner component.
### **Is the Cordova Barcode Scanner SDK GDPR- and CCPA-compliant?**
Yes, the Scanbot Cordova Barcode Scanner SDK is fully GDPR- and CCPA-compliant, since the SDK processes all barcode data locally on the device and does not require an internet connection. No data is transmitted to external servers, ensuring full compliance with data privacy regulations.
+
## Windows Tablets Barcode Scanners
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/blog/windows-tablets-barcode-scanners/?utm_source=chatgpt.com#main)
Windows tablets offer portability and ease-of-use while seamlessly integrating into an existing Windows IT infrastructure. This makes them ideal devices for implementing enterprise-wide barcode technology that seamlessly communicates with your backend solution.
The [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) equips your Windows tablets with a powerful barcode scanning solution. Not only is it lightning-fast, it is also highly accurate, even in less than ideal conditions. Thanks to batch scanning and similar features, even large amounts of barcodes can be captured in no time. Tailored modules for very small or distant codes cover all kinds of special use cases.
If you already use Windows tablets in your company, the Scanbot SDK can be integrated in a matter of days. If, on the other hand, you are still deciding which device is the best fit for your use case, this guide is for you. We will provide you with an overview of the hardware characteristics you should look out for and present you with suggestions for Windows tablets with various configurations.
Despite the technological advances in recent decades, many companies still rely heavily on manual data entry. In doing so, they accept the risk of introducing errors into their datasets and information processes. In the long run, this costs them countless hours and millions of dollars. According to a [report by IBM](https://www.ibm.com/downloads/cas/EDJANVZY), businesses lose almost $10 million annually on average due to poor data quality.
Even if they do not involve data entry, most manual workflows are inefficient and time-consuming. Automating them can thus boost productivity considerably. However, this often involves purchasing costly and complex software and deep changes to existing business processes, making automation an intimidating endeavor.
Barcodes, on the other hand, are a time-tested technology that not only eliminates human error, but also makes it easy to introduce automated workflows. Since their introduction in US supermarkets during the 1970s, [1D and 2D barcodes](https://scanbot.io/blog/types-of-barcodes/) have found their way into just about any industry, from [manufacturing](https://scanbot.io/resources/brochures/manufacturing-use-cases/) to air travel, from [insurance](https://scanbot.io/solutions/insurance/) to logistics.
To ensure an optimal performance of our Barcode Scanner SDK, your devices should fulfill certain hardware and software requirements:
| | | |
| --- | --- | --- |
| | **Minimum** | **Recommended** |
| **Architecture** | Intel x64 | Intel x64 |
| **Processor** | i3 | i5 or higher |
| **RAM** | 4 GB
(barcode scanning only) | 8 GB or more |
| **Operating system** | Windows 10 or 11 | Windows 10 or 11 |
| **Camera Resolution** | 5 MP | 8 MP or more |
Devices with x86 64-bit architecture (x64 for short) provide the best software compatibility. These tablets use chips by Intel or, more rarely, AMD. The ARM architecture powering many mobile devices is currently not sufficiently supported by Microsoft, even though their Surface Pro X tablet and some Surface Pro 9 devices use it. As a result, a lot of Windows software will not run properly on ARM hardware, and this includes our Windows SDK.
When it comes to the performance of the processor (CPU), Intel’s Core line will be necessary to ensure smooth operation. These currently range from Core i3 to Core i9. An i3 processor will work, but is not ideal, depending on how fast you want to scan and decode your barcodes. If you can, go for i5 or i7 instead. The i9 series of CPUs is very powerful, but also costly, and likely will not provide a huge performance boost to our SDK.
Since Windows is first and foremost a desktop operating system, your device will need more RAM to run it smoothly than it would require for Android or iOS. This means that 4 GB are a must even for less resource-intensive applications, including our Barcode Scanner. If you plan to use more complex software, go with at least 8 GB of RAM.
You can use Windows 10 or Windows 11 as an operating system. Windows 8 and earlier are unfortunately incompatible with our software. Windows OSes come in Home and Pro versions, which differ in the advanced features they include. Both work equally well with our SDK. However, you should make sure that your chosen version has the features your enterprise needs to integrate the devices into its IT infrastructure. Fortunately, upgrading from Home to Pro is always possible.
**Would you like to discover more about what makes a good Windows-based mobile barcode scanner? Get full insight by downloading our [Windows Device Guide 2023](https://scanbot.io/resources/ebooks/windows-device-guide-2023/), which also includes an overview of current models in different price ranges**.
[](https://scanbot.io/resources/ebooks/windows-device-guide-2023/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Related blog posts
[](https://scanbot.io/blog/meet-our-windows-barcode-scanner/)
### [Meet our Barcode Scanner SDK for Windows](https://scanbot.io/blog/meet-our-windows-barcode-scanner/)
Our Barcode Scanning solution is now available for the Universal Windows Platform (UWP).

Kevin November 10, 20222 mins read
[](https://scanbot.io/techblog/developing-a-scanning-sdk-for-windows-a-first-hand-account/)
### [Developing a scanning SDK for Windows: A first-hand account](https://scanbot.io/techblog/developing-a-scanning-sdk-for-windows-a-first-hand-account/)
One of our software engineers shares his experiences with developing our new Windows SDK. Trials and tribulations await.

Aare June 20, 202317 mins read
[](https://scanbot.io/blog/our-barcode-scanner-demo-app-is-now-available-on-windows/)
### [Our Barcode Scanner Demo App is now available on Windows](https://scanbot.io/blog/our-barcode-scanner-demo-app-is-now-available-on-windows/)
The "Scanbot SDK: Barcode Scanning" app is now available for free on the Microsoft Store.

Kevin June 26, 20232 mins read
+
## Ionic Barcode Scanner Tutorial
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/techblog/ionic-capacitor-barcode-scanner-tutorial/#main)
Setting up an app in Ionic Capacitor capable of scanning any 1D or 2D barcode is very straightforward. All we need are the following steps:
1. Prepare the project
2. Install the SDK
3. Initialize the SDK
4. Implement the scanning modules
5. Scan some barcodes!
Thanks to our SDK’s Ready-to-Use UI Components, you can even use an AR overlay to display multiple barcodes’ contents right in the viewfinder.
Scanning a single barcode
Scanning multiple barcodes with the AR overlay
## Requirements
Before starting development with Capacitor, you need to [set up your environment](https://capacitorjs.com/docs/getting-started/environment-setup).
The prerequisites for developing Ionic Capacitor apps are:
**Core requirements:**
- Node.js version 18 or higher
**For iOS development:**
- macOS
- Xcode
- Xcode Command Line Tools
- Homebrew
- Cocoapods
**For Android development:**
- Android Studio
- Android SDK
To get the full benefits and experience from using our SDK, we also recommend real devices for testing.
Developing Capacitor applications can be done via CLI or using the [VS Code extension](https://capacitorjs.com/docs/getting-started/vscode-extension). In this tutorial we will use CLI commands. However, feel free to follow along using whatever option suits you best.
Capacitor can be used with different frameworks. In this tutorial, we will use **Capacitor with Ionic and Angular**. Again, these choices depend on your needs and prior knowledge.
Since we’ll use Ionic in this tutorial, you also need to [install the Ionic CLI](https://ionicframework.com/docs/intro/cli) if you haven’t already:
```hljs dart
npm install -g @ionic/cli
```
## 1\. Preparing the project
To start creating your Capacitor app with Ionic using the CLI, run the following command in the terminal, which will create a blank project with some recommended Capacitor dependencies:
```hljs wasm
ionic start CapacitorTutorial blank --capacitor --type angular-standalone --package-id io.scanbot.tutorial.capacitor
```
⚠️ When using your own license, make sure that the `package-id` is the same as the application/bundle ID associated with it.
### Generate the native projects
Now, let’s add the Android and iOS platforms to our project.
Navigate into the project directory:
```hljs undefined
cd CapacitorTutorial
```
Add Android and iOS as platforms:
```hljs dart
npm i @capacitor/android @capacitor/ios
```
Run the following commands to create the native Android and iOS projects:
```hljs csharp
npx cap add android
npx cap add ios
```
## 2\. Installing the SDK
To install the Scanbot Capacitor Barcode Scanner SDK, run:
```hljs undefined
npm i capacitor-plugin-scanbot-barcode-scanner-sdk
```
💡 This will install the latest Scanbot SDK version. You can find more information about each version in our [changelog](https://docs.scanbot.io/barcode-scanner-sdk/capacitor/changelog/).
Now that the npm package has been installed, we need to make some changes to the native projects.
### Android
For Android, we need to add the camera permission and feature in **android/app/src/main/AndroidManifest.xml**:
```hljs html
```
### iOS
For iOS, we need to include a description for the camera permission in **ios/App/App/Info.plist** anywhere inside the `
` element:
```hljs html
NSCameraUsageDescription
Camera permission is needed to scan barcodes
```
Now that the project is set up, we can start integrating the barcode scanning functionalities.
## 3\. Initializing the SDK
Before using any feature of the Capacitor Barcode Scanner SDK, we need to initialize it. Ideally, initialization should be done once, as soon as the app is fully launched.
In this tutorial, we’re going to initialize the SDK inside the `ngOnInit` callback in the **src/app/app.component.ts** file and make sure that we import the `ScanbotBarcodeSDK`. Your **app.component.ts** should then look like this:
```hljs typescript
import { Component, OnInit } from '@angular/core';
import { IonApp, IonRouterOutlet } from '@ionic/angular/standalone';
import { ScanbotBarcodeSDK } from 'capacitor-plugin-scanbot-barcode-scanner-sdk';
@Component({
selector: 'app-root',
templateUrl: 'app.component.html',
standalone: true,
imports: [IonApp, IonRouterOutlet],
})
export class AppComponent implements OnInit {
constructor() { }
ngOnInit(): void {
ScanbotBarcodeSDK.initializeSdk({
licenseKey: ""
}).then(result => console.log(result))
.catch(err => console.log(err));
}
}
```
💡 Without a license key, our SDK only runs for 60 seconds per session. This is more than enough for the purposes of our tutorial, but if you like, you can [generate a license key](https://scanbot.io/trial/) using the application/bundle ID.
## 4\. Implementing the scanning modes
Our [RTU UI components](https://docs.scanbot.io/barcode-scanner-sdk/capacitor/barcode-scanner/ui-components/) make it easy to deploy our Barcode Scanner SDK’s different scanning modes in your app. Let’s start with the simplest use case: single-barcode scanning.
In your project folder, go to **scr/app/home/home.page.ts**, add the necessary imports, and create a method that will start the single-barcode scanning use case. The result should look something like this:
```hljs typescript
import { Component } from '@angular/core';
import { IonHeader, IonToolbar, IonTitle, IonContent, IonButton } from '@ionic/angular/standalone';
import { ScanbotBarcodeSDK } from 'capacitor-plugin-scanbot-barcode-scanner-sdk';
import { startBarcodeScanner, BarcodeScannerConfiguration, SingleScanningMode } from 'capacitor-plugin-scanbot-barcode-scanner-sdk/ui_v2';
@Component({
selector: 'app-home',
templateUrl: 'home.page.html',
styleUrls: ['home.page.scss'],
standalone: true,
imports: [IonHeader, IonToolbar, IonTitle, IonContent, IonButton],
})
export class HomePage {
constructor() {}
async startSingleBarcodeScan() {
try {
/** Check license status and return early if the license is not valid */
if (!(await ScanbotBarcodeSDK.getLicenseInfo()).data?.isLicenseValid) {
return;
}
/**
* Instantiate a configuration object of BarcodeScannerConfiguration and
* start the barcode scanner with the configuration
*/
const config = new BarcodeScannerConfiguration();
/** Initialize the use case for single scanning */
config.useCase = new SingleScanningMode();
/** Start the BarcodeScanner */
const result = await startBarcodeScanner(config);
/** Handle the result if there are scanned barcodes */
if (result.data && result.data?.items.length > 0) {
alert(
'Barcode Scanning successfully! \n' +
`Value: ${result.data.items[0].text} \n` +
`Type: ${result.data.items[0].type}`
);
}
} catch (e: any) {
console.error("An error has occurred while running Barcode Scanner", e.message);
}
}
}
```
Next, go to **scr/app/home/home.page.html** and add a button that calls our `startSingleBarcodeScan` method when clicked. Your **home.page.html** should look something like this:
```hljs html
Capacitor Tutorial
Capacitor Tutorial
Start single barcode scanning
```
We can add our multi-scanning and AR overlay use cases in a similar manner.
Just add `MultipleScanningMode` to the import:
```hljs javascript
import { startBarcodeScanner, BarcodeScannerConfiguration, SingleScanningMode, MultipleScanningMode } from 'capacitor-plugin-scanbot-barcode-scanner-sdk/ui_v2';
```
And create two more methods:
```hljs typescript
async startMultiBarcodeScan() {
try {
/** Check license status and return early if the license is not valid */
if (!(await ScanbotBarcodeSDK.getLicenseInfo()).data?.isLicenseValid) {
return;
}
/**
* Instantiate a configuration object of BarcodeScannerConfiguration and
* start the barcode scanner with the configuration
*/
const config = new BarcodeScannerConfiguration();
/** Initialize the use case for multi-scanning */
config.useCase = new MultipleScanningMode();
/** Start the BarcodeScanner */
const result = await startBarcodeScanner(config);
/** Handle the result */
if (result.data && result.data?.items.length > 0) {
alert(
'Barcode Scanning successfully! \n' +
`${result.data.items.map(barcode =>
`Barcode value: ${barcode.text} and type: ${barcode.type}`
).join("\n")}`);
}
} catch (e: any) {
console.error("An error has occurred while running Barcode Scanner", e.message);
}
}
async startAROverlayBarcodeScan() {
try {
/** Check license status and return early if the license is not valid */
if (!(await ScanbotBarcodeSDK.getLicenseInfo()).data?.isLicenseValid) {
return;
}
/**
* Instantiate a configuration object of BarcodeScannerConfiguration and
* start the barcode scanner with the configuration
*/
const config = new BarcodeScannerConfiguration();
/** Initialize the use case for multi-scanning */
config.useCase = new MultipleScanningMode();
/** Configure AR Overlay. */
config.useCase.arOverlay.visible = true;
config.useCase.arOverlay.automaticSelectionEnabled = false;
/** Start the BarcodeScanner */
const result = await startBarcodeScanner(config);
/** Handle the result */
if (result.data && result.data?.items.length > 0) {
alert(
'Barcode Scanning successfully! \n' +
`${result.data.items.map(barcode =>
`Barcode value: ${barcode.text} and type: ${barcode.type}`
).join("\n")}`);
}
} catch (e: any) {
console.error("An error has occurred while running Barcode Scanner", e.message);
}
}
```
Next, go back to **scr/app/home/home.page.html** and add buttons for the multi-scanning and AR overlay use cases:
```hljs html
Start multi-barcode scanning
Start AR Overlay barcode scanning
```
We’re now ready to build and run the app!
## 5\. Build the app and scan some barcodes!
In the terminal, run these commands to build and sync the native projects:
```hljs dart
npm run build
npx cap sync
```
To run the app on Android and iOS, use the following commands:
**For Android:**
```hljs undefined
npx cap run android
```
**For iOS:**
To run the app on a real iOS device, you need to adjust the _Provisioning_ and _Signing_ settings. Open **ios/App/App.xcworkspace** with Xcode, manage the signing and provisioning settings, and run the project from Xcode or with this command:
```hljs undefined
npx cap run ios
```
Now you can go ahead and scan 1D and 2D barcodes – one after the other, many at the same time, and even with an AR overlay that lets you preview their values!

And if you’re in need of some sample barcodes for testing purposes, we’ve got you covered:

## Choosing the best barcode scanner solution for your Ionic Capacitor app
When integrating an Ionic Barcode Scanner into your application, it’s essential to ensure speed, accuracy, and seamless user experience. The right barcode scanner plugin should not only support a variety of QR codes and supported barcodes but also integrate easily within the Ionic Framework. Here are key considerations to keep in mind:
### Speed and accuracy
An effective barcode scanner should prioritize fast and accurate scanning, even in challenging conditions such as poor lighting or awkward angles. The ability to recognize multiple formats quickly enhances usability, reducing the need for rescans.
To optimize performance:
- Test how well the scanner detects supported barcodes in different orientations and lighting conditions.
- Ensure default settings provide a smooth experience but allow users to modify configurations if needed.
- Consider enabling features such as flash toggling for better visibility.
### Easy integration and customization
A high-quality barcode scanner plugin should be easy to integrate and flexible enough for customization. The Scanbot SDK, for example, provides [Ready-to-Use UI Components](https://docs.scanbot.io/barcode-scanner-sdk/capacitor/barcode-scanner/ui-components/) that streamline development.
For customization:
- You should be able to modify the scanner’s appearance and functionality to match your app’s branding.
- The plugin should [work across multiple platforms](https://scanbot.io/techblog/how-to-build-a-cross-platform-barcode-scanner/), including web.
- If using an enterprise-grade solution is not an option, support for advanced features like ML Kit integration can further enhance scanning capabilities.
### Security and offline capabilities
Data security is critical in barcode scanning applications. A reliable scanner should function entirely offline, ensuring that sensitive information is not sent to external servers. The Scanbot SDK guarantees that all scanned data remains secure on the device.
### Cross-device Support
Your barcode scanner should work seamlessly across various device models and operating systems. Ensuring compatibility with different camera types enhances usability, whether the user is on a high-end smartphone or a more basic device.
### Example and repository resources
For developers looking to dive deeper, reviewing a [GitHub repository with an example project](https://github.com/doo/scanbot-barcode-scanner-sdk-example-capacitor-ionic) can be highly beneficial. Sample projects help understand implementation details and how to enable different scanner features effectively.
By following these best practices, you can ensure your Ionic Barcode Scanner application provides a robust, user-friendly experience while maintaining flexibility and high performance.
## Conclusion
If this tutorial has piqued your interest in integrating barcode scanning functionalities into your Ionic Capacitor app, make sure to take a look at our SDK’s other neat features in our [documentation](https://docs.scanbot.io/barcode-scanner-sdk/capacitor/introduction/).
Furthermore, you can take a look at and run our [public example project](https://github.com/doo/scanbot-barcode-scanner-sdk-example-capacitor-ionic).
Should you have questions about this tutorial or ran into any issues, we’re happy to help! Just shoot us an email via [tutorial-support@scanbot.io](mailto:tutorial-support@scanbot.io).
Happy coding!
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Related blog posts
[](https://scanbot.io/techblog/react-native-scanner-tutorial/)
### [React Native Barcode Scanner tutorial – Expo integration guide](https://scanbot.io/techblog/react-native-scanner-tutorial/)
Learn how to use Expo to easily integrate powerful barcode scanning functionalities into your React Native app.

Stefan September 17, 202413 mins read
[](https://scanbot.io/techblog/net-maui-barcode-scanner-sdk-integration-tutorial/)
### [Building a .NET MAUI Barcode Scanner with C\#](https://scanbot.io/techblog/net-maui-barcode-scanner-sdk-integration-tutorial/)
Create a cross-platform Android and iOS app for scanning barcodes and QR codes using .NET MAUI and C#.

Matthew July 7, 20257 mins read
[](https://scanbot.io/techblog/progressive-web-app-barcode-scanner-tutorial/)
### [How to build a Progressive Web App (PWA) Barcode Scanner with React and TypeScript](https://scanbot.io/techblog/progressive-web-app-barcode-scanner-tutorial/)
Learn how to build an installable barcode scanning PWA using React and our Web SDK in this step-by-step guide.

Kevin January 7, 202510 mins read
+
## iOS Document Scanner SDK
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/developer/ios-document-scanner/?utm_source=chatgpt.com#main)
# iOS Document Scanner SDK
Add high-quality document scanning to your native iOS app
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

Simple to use for anyone
Allow even non-tech-savvy users to easily create crisp document scans with user guidance, automatic capture, auto-cropping, and more.

On-device intelligence
100% offline – no servers, no tracking, complete data security.
[Customizable UI components\\
\\
Our Ready-To-Use UI components cover all document scanning scenarios and are highly customizable.](https://scanbot.io/rtu-ui/)
High-quality scans
Let your users generate high-quality scans suitable for automated processing.
Available for App & Web
The SDK supports iOS, Android, Web, Windows, Linux, and all common cross-platform frameworks, including Flutter, React Native, and .NET MAUI.
## Turn mobile devices into easy-to-use, high-quality document scanners
The Scanbot [Document Scanner SDK](https://scanbot.io/document-scanner-sdk/) for iOS provides everything you need to integrate swift document scanning into your app. It operates entirely offline, ensuring secure data processing and full compliance with privacy regulations like GDPR and CCPA/CPRA.
Whether scanning documents with the device’s camera or processing imported images, the SDK applies image optimization features to ensure top-quality results.
It also comes with Ready-To-Use UI (RTU UI) components, allowing integration in under an hour. These components can be customized to match your app’s workflow and branding, making the iOS Document Scanner SDK easy to implement and use.
Dedicated chat support is available for customers via Slack, Microsoft Teams, or email. Non-customers can also get [integration assistance](https://docs.scanbot.io/support/) from our support engineers.
### Technical requirements
The Scanbot iOS Document Scanner SDK has the following technical requirements:
- Operating System: iOS 13 or higher
- IDE: Xcode 14.0 or higher
- Language: Fully compatible with Swift & Objective-C for seamless integration
## Integrate this evening with
categoryFeatures
## Learn more about our document scanning features
The iOS Document Scanner SDK offers a comprehensive set of features designed to enhance the scanning experience and improve output quality.
- ### User Guidance
Ease of use is crucial for any app’s design, especially with a large user base. Our on-screen user guidance helps even non-tech-savvy users create the perfect scan.
- ### Automatic Capture
The SDK automatically triggers the scan when the device is ideally positioned over the document. This minimizes submissions of blurry or incomplete scans.
- ### Automatic Cropping
Our SDK automatically straightens and crops documents, producing high-quality scans every time.
- ### Document Quality Analyzer
This feature automatically rates the scan quality from “very poor” to “excellent.” If it is low, it can prompt the user to rescan. This allows you to build quality checks into your workflow.
- ### Custom Filters
Every use case has specific image requirements. The SDK’s custom filters allow you to transform document images into optimal input for your backend systems. They include grayscale, several binarization options, and more.
- ### Multiple Export Formats
The Scanbot Document Scanner SDK supports several output formats for compatibility with all standard backend systems: JPG, PDF, TIFF, and PNG.

## How to integrate the Scanbot iOS Document Scanner SDK using Ready-to-Use UI
Our revamped Ready-To-Use UI Components for iOS and Android Document Scanner SDKs offer a refined and enhanced document scanning experience with built-in review capabilities. This version not only simplifies the integration process but also introduces a comprehensive document management interface. Users can now review scanned documents, rotate, crop, reorder, retake specific pages, and delete one or all pages directly within the scanner. Additionally, the scanning process is enriched with engaging animation feedback and document acknowledgment features, ensuring high-quality scans by allowing users to verify and decide whether to keep or retake the scanned image.
Although the main idea of the RTU UI is to provide simple-to-integrate and simple-to-configure components, its customization capabilities are numerous and should suit most of your needs. To achieve an even higher degree of customization, you can implement a custom UI and business-logic using our Classic UI Components.
**Launching the scanner**
In this section, we’ll show you how to start the Document Scanner with minimal code. We’ll also describe how to configure it extensively later on.
```
import ScanbotSDK
class DocumentLaunchingUI2SwiftViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.startScanning()
}
func startScanning() {
// Create the default configuration object.
let configuration = SBSDKUI2DocumentScanningFlow()
// Present the recognizer view controller modally on this view controller.
SBSDKUI2DocumentScannerController.present(on: self,
configuration: configuration) { document in
// Completion handler to process the result.
if let document {
// Handle the document.
} else {
// Indicates that the cancel button was tapped.
}
}
}
}
```
[Read the full iOS Document Scanner SDK documentation](https://docs.scanbot.io/document-scanner-sdk/ios/features/document-scanner/ready-to-use-ui/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### What is an iOS Document Scanner SDK?
An iOS Document Scanner SDK allows developers to integrate document scanning capabilities into their iOS apps. It includes tools for capturing, processing, and exporting scanned documents, with features such as automatic cropping, edge detection, and image quality analysis.
### How can I ensure high-quality document scans in my iOS app?
To guarantee high-quality scans, use an SDK with features like automatic cropping, edge detection, and document quality analysis. The Scanbot iOS Document Scanner SDK offers these tools, ensuring clear, perfectly aligned scans. Its Document Quality Analyzer also prompts users to rescan low-quality images.
### How do I integrate document scanning functionality into my iOS app?
The Scanbot iOS Document Scanner SDK includes Ready-To-Use UI (RTU UI) components that allow developers to add scanning capabilities in less than an hour. The SDK comes with extensive documentation, and integration support is available through Slack, Microsoft Teams, or email.
### Is there a free iOS document scanner SDK?
Apple’s Vision Kit provides a free solution for basic document scanning on iOS. However, it typically lacks advanced features such as custom UI components, user guidance, and comprehensive image quality checks. For developers looking for more control and a better user experience, commercial SDKs like the Scanbot SDK offer ready-to-use screens, automatic capture, and image optimization, making integration quicker and more efficient.
Plus, customers can access a dedicated team of support engineers who can help resolve issues, even during integration for non-customers. Check out integration support [here](https://docs.scanbot.io/support/).
### Which iOS-based Document Scanner SDKs comply with GDPR and other privacy regulations?
The Scanbot iOS Document Scanner SDK operates entirely offline, ensuring that sensitive data is never sent to external servers. This helps meet the strict requirements of GDPR, CCPA, and CPRA, protecting user data and ensuring compliance with global privacy standards.
### What platforms does the Scanbot Document Scanner SDK support besides iOS?
In addition to iOS, the Scanbot Document Scanner SDK also supports [Android](https://scanbot.io/developer/android-document-scanner-sdk/) and web apps. It can be integrated into cross-platform frameworks like [Flutter](https://scanbot.io/developer/flutter-document-scanner/), [Xamarin](https://scanbot.io/developer/xamarin-document-scanner/), [.NET MAUI](https://scanbot.io/developer/net-maui-document-scanner-sdk/), [Cordova](https://scanbot.io/developer/cordova-document-scanner/), [Capacitor](https://scanbot.io/developer/capacitor-document-scanner-sdk/), and [React Native](https://scanbot.io/developer/react-native-document-scanner/), ensuring consistent functionality across all devices.
+
## Barcode Scanner Comparison
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/blog/scanbot-sdk-vs-ml-kit-vs-zxing/?utm_source=chatgpt.com#main)
It took almost twenty years after the invention of the first “bar code” for the technology to become commercially successful. Nowadays, we are used to seeing those symbologies in virtually every aspect of our everyday lives. And as usage expanded, of course, different types of barcode detectors have emerged over the past decades. A recent technology trend replaces laser scanners with smartphones for both commercial and private use. This shift has driven the development of a variety of high-performing open-source Software and SDK options designed for enterprise use cases.
In this article, we will compare popular barcode reader libraries and Scanbot’s advanced [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) in terms of supported platforms and their capabilities to scan various types of barcodes. Finally, we will consider ease of integration and customer support.
But before we make this comparison and draw our conclusions, let’s talk about the barcode scanner market, issues, and possible enterprise-grade solutions out there.
## Covering countless use cases: Why do we need so many barcode formats?
There are plenty of different barcode symbologies. Roughly, those can be divided into one-dimensional (1D) and two-dimensional (2D) standards. 1D barcodes, like the EAN code, can only hold a minimal amount of data encoded by varying the widths of lines and the spaces between them – hence the name “linear” barcodes. In contrast, 2D barcodes, like the QR Code, consist of a grid of pixels that can have either an on (black) or off (white) state. They can store thousands of characters each.
But why do we need so many different kinds of barcodes? Why are we still using one-dimensional barcodes at all, if two-dimensional codes can encode so much more data? The answer is that 2D codes can only be read with dedicated imager scanners or smartphones. One-dimensional symbologies, however, need just a simple, low-cost laser scanner. Those are still in widespread use, reflecting the continuing popularity of 1D barcodes.
Different barcodes are also more or less suited for certain applications. If you are curious about this, please check out our detailed blog post on the most common [barcode types and their uses](https://scanbot.io/blog/types-of-barcodes/).
## Can you read all types of barcodes with a single device?
Each dedicated barcode reader device, too, has its own benefits and disadvantages. Let’s have a quick look at the most common barcode scanners and their characteristics to get an overview of the available hardware scanning options on the market.
Pen-type barcode readers are the cheapest available option, but also the least practical. They require direct contact with the barcode, are limited to 1D barcodes, and perform poorly with damaged barcodes.
CCD barcode scanners are fast in recognition, but they are also limited to 1D barcodes and have a short reading distance.
Laser scanners are fast, easy to use, and work well in low light conditions. But they too are limited to 1D barcodes, and their moving mechanical components make them prone to malfunctions.
In contrast, imager barcode scanners work like cameras. Thus, they are able to read 2D barcodes, and work reliably even on damaged barcodes. Unfortunately, they are expensive and less suitable for 1D barcode recognition.
Lastly, smartphones (applause and confetti): Apps turn mobile devices into a modern barcode scanning tool that efficiently covers both 1D and 2D symbologies. Smartphones are considerably cheaper than imager scanners and allow users to scan all barcode types with just one device. With a BYOD strategy, there is no hardware cost at all. Enterprises don’t have to dedicate a mobile device to just one barcode scanning job, but instead get high versatility at the lowest TCO.
Additionally, users don’t need any special training to use smartphones as scanners, since apps provide them with direct visual feedback. With simple mobile application updates, the apps themselves can evolve constantly.
Apps or websites with integrated scanning capabilities for barcodes can cover just about all barcode symbologies and turn smartphones into mobile barcode readers within just days.
Mobile scanners, too, have their differences. Now, it is about choosing the right kind of solution for your project: Open-source software, free barcode libraries or a proprietary Scanner SDK?
## Properties of outstanding barcode scanner libraries for mobile apps
Let’s assume your mobile or web-based project requires barcode scanning for a use case such as inventory barcode scanner, process automation, or parcel tracking. Now, you’ll have to decide which barcode reading solution on the market suits your enterprise’s requirements best.
There are a couple of signs of a good third-party barcode library that you should look for while comparing your potential candidates.
First of all, you need to make sure that the performance of the scanner meets your requirements. Apart from raw speed, performance also includes properties like accuracy, response in rough conditions, and stability.
Since there is a large variety of web and mobile platforms, compatibility is another key topic. Suppose you want to support all common mobile and web platforms. Then your barcode library should be compatible with Android and iOS (or the cross-platform framework you are developing your mobile app in), as well as with common browsers such as Safari, Chrome, or Firefox.
The integration process itself is another crucial factor, as it decides how fast you can release your product to the market. Ease of integration also affects the quality of your product. A complicated integration increases the chances of developers making mistakes, while a straightforward integration phase makes it easier to arrive at an error-free software in the end.
Additionally, there are various types of barcodes out there – even QR codes come in several flavors, for example. Your enterprise-grade barcode scanning library should support all necessary barcode types, both those that you are currently working with and those you might use in the future.
Speaking of the future: Your requirements may evolve with your business. That means it’s also important to evaluate the continuity of the Barcode SDK development, the responsiveness of the software developers to your questions and bug reports, and customer support.
**To get a full overview of the similarities and differences between ZXing, ML Kit, and the Scanbot SDK, download our [free eBook](https://page.scanbot.io/hubfs/content/ebook/scanbot-ebook-barcode-library-comparison-en-eb016.pdf)**:
[](https://page.scanbot.io/hubfs/content/ebook/scanbot-ebook-barcode-library-comparison-en-eb016.pdf)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Related blog posts
[](https://scanbot.io/blog/cold-chain-logistics-management-barcode-scanner/)
### [Overcoming challenges in cold chain logistics management with barcode technology](https://scanbot.io/blog/cold-chain-logistics-management-barcode-scanner/)
Barcodes optimize cold chain logistics management, improving visibility and ensuring regulatory compliance for temperature-sensitive goods.

Johanna July 18, 20255 mins read
[](https://scanbot.io/blog/what-is-an-mrz/)
### [How to scan MRZs with OCR: Considerations and first steps](https://scanbot.io/blog/what-is-an-mrz/)
MRZs encode information on ID cards and passports in a machine-readable format. Find out how to automatically read MRZs with data capture software.

Kevin July 16, 20259 mins read
[](https://scanbot.io/blog/mobile-ocr-for-legal-documents/)
### [OCR for legal documents: Unlock efficiency with mobile data capture](https://scanbot.io/blog/mobile-ocr-for-legal-documents/)
OCR creates digital, searchable versions of legal documents that can be retrieved instantly. Learn how to set up an OCR scanner app in minutes.

Johanna July 11, 20257 mins read
+
## QuaggaJS Barcode Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/techblog/quagga-js-tutorial/?utm_source=chatgpt.com#main)
QuaggaJS is a popular open-source barcode scanning library written in JavaScript that locates and decodes various 1D barcode symbologies in the user’s camera stream.
While the [original project](https://github.com/serratus/quaggaJS) is no longer maintained, it lives on as [Quagga2](https://github.com/ericblade/quagga2), which is what we’ll be using in our tutorial.
Since Quagga is a JavaScript-only library, it is easy to integrate into any website or web app. In this tutorial, we’ll show you how to set up the barcode scanner in a single HTML file.
📺 You can also [watch this tutorial on YouTube](https://youtu.be/AQR5TQb8ATI).
## Step 1: Setting up the HTML file
Let’s start by creating the basic structure of the HTML document:
```hljs html
QuaggaJS
```
💡 The line ` ` ensures that the page fits the device’s resolution and that users cannot zoom into it.
The first thing we’ll put into the body is a `div` into which we’ll later render the camera stream:
```hljs html
```
## Step 2: Configuring Quagga
Next, we’ll add Quagga itself. We’re including the `quagga.min.js` script from jsDelivr, but you can of course also host the script on your own web server.
```hljs html
// new
```
Now, we need to configure QuaggaJS. First, we have to specify the DOM element where the video stream will be displayed. Next, we also need to specify the barcode decoders we want to use.
To accomplish the first part, we create a config object, which we will call `quaggaConf`. We use [document.querySelector](https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector) to select the `div` we created above as the target where the video stream will be displayed.
```hljs html
```
Now we specify which barcode symbologies our QuaggaJS app will read (to optimize performance, it’s recommended to only include those you expect to scan). In this tutorial, we’ll be sticking to the common barcode type Code 128. You can find a list of all supported symbologies in the [Quagga2 GitHub repository](https://github.com/ericblade/quagga2?tab=readme-ov-file#decoder).
```hljs html
```
💡 QuaggaJS cannot read QR codes or other 2D barcode symbologies. To enable QR code scanning, Quagga2’s README recommends [using external reader modules](https://github.com/ericblade/quagga2?tab=readme-ov-file#using-with-external-readers).
The next step is to prepare the initialization function. We provide our Quagga configuration and an error handler. If the initialization is successful, `Quagga.start()` will begin the barcode scanning process.
We have also added a function to display an alert with the barcode result when a barcode is detected and read.
```hljs html
```
## Step 3: Configuring the video stream
Now we’ll add `LiveStream` as the input stream type, since we want to process and display the live video as captured by the user’s camera. Other possible values for the stream type are described in the [Quagga docs](https://github.com/ericblade/quagga2?tab=readme-ov-file#inputstream).
We’ll also have to define the constraints for the video stream. To do that, we need to specify the width, height, aspect ratio, and camera for the input stream.
💡 A lower resolution will result in faster scanning speeds at the cost of accuracy.
```hljs html
```
Next, we add some styling to display the video in the resolution we requested from the camera to ensure it fits the screen.
```hljs html
QuaggaJS
// new
```
Lastly, we’re going to apply a `style` attribute to our camera `div` to make it take up the entire width of the body.
```hljs html
```
And we’re done! 🎉
The final result looks like this:
```hljs html
QuaggaJS
```
Try scanning a Code 128 to see if everything works as intended.

## Drawbacks of using QuaggaJS
As impressive as this JavaScript-based barcode scanner implementation is, QuaggaJS does have its disadvantages.
The biggest drawback is that it only supports 1D barcodes. Two-dimensional symbologies like QR Code, Data Matrix, and Aztec encode much more data while taking up less space, which makes them a valuable alternative to their one-dimensional counterparts.
As useful as it is to have a barcode scanner written in JavaScript, the performance of the detection algorithm would also benefit from an implementation in WebAssembly. Especially on low-end devices, this could result in increased scanning speeds.
Quagga’s feature set is also not on par with that of [professional solutions](https://docs.scanbot.io/barcode-scanner-sdk/web/barcode-scanner/use-cases/). Enterprise-grade barcode scanner software often includes dedicated modules for scanning many barcodes simultaneously or in rapid succession, as well as UI elements, all of which this open-source solution lacks.
If you plan to use Quagga in production, you should also keep in mind that you will depend entirely on the open-source community for its maintenance and for support. If you run into a problem, you might have to find a solution on your own.
For companies that heavily rely on barcode scanning in their business processes, we recommend using an enterprise-grade solution instead.
## Building a JavaScript Barcode Scanner with the Scanbot SDK
We developed the Scanbot [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) to help enterprises overcome the hurdles presented by free barcode scanning software. Our goal was to have a developer-friendly solution available for a wide range of platforms that consistently delivers high-quality results – even in challenging circumstances.

Scan the QR code or [follow this link](https://websdk-barcode.scanbot.io/) to try the Web Barcode Scanner Demo!
In the following section, we’ll show you how easy it is to integrate our Web Barcode Scanner SDK into your JavaScript app. Thanks to our SDK’s **Ready-to-Use UI Components**, you can even use an AR overlay to display multiple barcodes’ contents right in the viewfinder.

To accomplish that, we’ll need to follow the steps below:
1. Download the SDK files
2. Create the HTML page and configure the Web SDK
3. Start a local HTTP server
4. Start scanning
5. Configure styling and scanning behavior
6. Deploy to a server (optional)
Let’s dive into more details for each step.
### Step 1: Download the SDK
First, create a new empty directory for your app and name it **my-scanner-app**.
Then, download the Scanbot SDK **npm package** directly from [here](https://registry.npmjs.org/scanbot-web-sdk/-/scanbot-web-sdk-5.1.0.tgz).
💡 As [specified in our documentation](https://docs.scanbot.io/barcode-scanner-sdk/web/quick-start/), you can also use npm install to download and install the package, but for this tutorial, we suggest manually downloading it and installing it from the link provided.
Unzip the downloaded files into **my-scanner-app**. Your folder structure should look like this:
```bash
my-scanner-app/
|- scanbot-web-sdk/
|- webpack/
|- bundle/
|- @types/
|- index.js
|- ui.js
... (and some other files)
```
⚠️ Make sure the folder containing the package files is called **scanbot-web-sdk**, not “package” or similar.
### Step 2: Create the HTML page and configure the Web SDK
To create the HTML with the Scanbot SDK, first create an **index.html** file in the **my-scanner-app/** folder. Then, add the following code to the file.
```typescript hljs
My Scanner App
Start scanning
```
The code block above:
- Adds the “Start scanning” button.
- Imports and initializes the Scanbot SDK.
- Executes the user interface from the Scanbot SDK when the user clicks the “Start scanning” button.
- If a barcode is identified, it will present the barcode type and its content to the user.
### Step 3: Start local HTTP server
The Scanbot SDKuses advanced browser features that are unavailable when opening our site via a file URL. Therefore, a local HTTP server is required to view the site.
There are two main ways to run the index.js file in a localhost server: using **Python** or **Node.js**.
#### Python
If you have **Python** installed, you can use it to start a local HTTP server. To do so, follow the steps below:
1. Open a terminal in the **my-scanner-app/** folder.
2. Use the command `python3 -m http.server` to start a local test server.
3. Now, you can access it on your browser at `http://localhost:8000`.
To stop running the localhost server, press **Ctrl+C** on the terminal.
#### Node.js
If **Node.js** isinstalled, you can use the npmserve package to start a local HTTP server. To do so, follow the steps below:
1. Open a terminal in the **my-scanner-app/** folder.
2. Run the command `npx serve`.
3. Once it finishes loading, you can access the page using the URL provided in your terminal, which usually is `http://localhost:3000`.
To stop running the localhost server, press **Ctrl+C** on the terminal.
### Step 4: Start scanning
Once you access the site on your browser, follow the steps below to test the Scanbot SDK:
Click the “Start scanning” button.
Our simple start screen
The scanning UI will open, allowing you to scan a barcode using your camera. Point your camera to a barcode, as in the example below.
The default scanning screen
After scanning, the UI closes, displaying the scanned code and its type right below the “Start scanning” button.
A straightforward way of displaying a barcode’s type and content
### Step 5: Configure the style and scanning behavior
The app code provided in Step 2 has the UI fully configured. To change the app’s appearance, you can customize the config object. You can, for example, change the viewfinder size and color.
To do so, you can change the `aspectRatio` and `strokeColor` after defining the `config` object, as displayed in the following code block:
```typescript hljs
const config = new ScanbotSDK.UI.Config.BarcodeScannerConfiguration();
config.viewFinder.aspectRatio.height = 1;
config.viewFinder.aspectRatio.width = 5;
config.viewFinder.style.strokeColor = "#FF000050";
```
The above configurations will result in the following styling:
A more horizontal version of the viewfinder with red corners
You can find more configuration options by accessing the [SDK](https://docs.scanbot.io/barcode-scanner-sdk/web/barcode-scanner/ready-to-use-ui/) or [API documentation](https://scanbotsdk.github.io/documentation/web/classes/UIConfig.BarcodeScannerConfiguration.html).
As another configuration example, you can display an **AR overlay** and let the user pick a specific barcode when the app identifies multiple barcodes on the camera. To add this feature, add the following code after defining the `config` object:
```typescript hljs
config.useCase.arOverlay.visible = true;
config.useCase.arOverlay.automaticSelectionEnabled = false;
```
If you open your app again, it will look like this:
The AR overlay displays the barcodes’ contents right in the viewfinder
💡 The AR labels can also be [fully configured](https://docs.scanbot.io/barcode-scanner-sdk/web/barcode-scanner/ready-to-use-ui/#ar-overlay).
### Step 6: Deploy to a server (optional)
To test your new app on your phone, you need to deploy it to a server. If you don’t have a web server ready, you can prototype your site using services like [Static.app](https://static.app/) by executing the following steps:
1. Zip the content from **my-scanner-app.**
2. Access [Static.app](https://static.app/) and click **Upload for free**.
3. Find and select the **my-scanner-app.zip** file.
4. After the upload, your site will run within minutes. You will then be presented with a **URL**. Use it to access the app from any device, including your mobile phone.
The Scanbot SDK UI is optimized for mobile devices. It allows users to choose the camera and toggle the flashlight by default. Use the URL to test the app interface on your mobile device, as displayed below.
Our JavaScript barcode scanner running on a phone
### Conclusion
That’s it! You now have a fully functional barcode-scanning web app using the Scanbot SDK’s RTU UI.
You can also take a look at our integration guides for [React](https://scanbot.io/techblog/react-barcode-reader-tutorial/) and [Vue.js](https://scanbot.io/techblog/vue-js-barcode-scanner-tutorial/) for implementations similar to this one. Should you have any questions, feel free to reach out to us [on Slack or MS Teams](https://docs.scanbot.io/support/) or send us an email via [sdksupport@scanbot.io](mailto:sdksupport@scanbot.io)
## How to improve barcode scanning performance in real-world conditions
Now that you’ve developed a working barcode scanner app, it’s time to consider how your app performs in real-world conditions—where lighting varies, barcode quality isn’t guaranteed, and users might be scanning everything from glossy product labels to crumpled shipping labels. In this section, we’ll dive deeper into advanced optimization strategies and the challenges your app might encounter. Mastering these techniques not only strengthens your app’s robustness but also prepares it for deployment in production environments.
### Scanning in low-light environments
One of the most common issues users face is scanning barcodes in poorly lit environments. Whether it’s a dimly lit stockroom, a late-night delivery, or simply indoor lighting that’s not quite sufficient, low light can drastically affect image clarity and contrast, making it harder for algorithms to detect and decode barcodes. One effective way to mitigate this is to programmatically enable the device’s flashlight when low light is detected. Many mobile platforms provide APIs for controlling the torch feature, and using it intelligently—such as activating it only when ambient light falls below a certain threshold—can significantly improve scan success rates.
In addition to enabling the flash, consider applying image preprocessing techniques like brightness normalization or histogram equalization. These approaches enhance visibility by boosting contrast and clarity before the barcode is passed to the decoder.
### Scanning damaged or worn-out barcodes
Barcodes in the wild are rarely perfect, so being able to [read damaged or blurry barcodes](https://scanbot.io/blog/how-to-read-damaged-or-blurry-barcodes/) is essential. They may be scratched, faded, crumpled, partially torn, or covered in dust. In such cases, conventional decoding methods may fail to read them accurately. The key to handling this challenge lies in preprocessing the image to repair or reconstruct the barcode as much as possible.
Basic image enhancement algorithms like Gaussian blur, morphological closing, and thresholding can help clean up the barcode region by eliminating noise or filling in broken bars. For more advanced applications, you might consider using machine learning-based restoration models trained to “fill in the blanks” of damaged codes. Additionally, some libraries offer confidence scoring on barcode reads—if the confidence is low, your app could attempt to reprocess the image using a different set of filters or prompt the user to try scanning again at a different angle or distance.
### Scanning multiple barcodes in one image
In warehouse or retail environments, it’s not uncommon for a single frame to contain several barcodes—think of a shipping label with a QR code, a UPC, and maybe even a custom format code all printed together. To deal with this, your app should be capable of [detecting and decoding multiple barcodes in a single frame](https://scanbot.io/blog/enhancing-operations-with-multi-barcode-scanners/).
This requires more than just running a barcode detector on the full image. You’ll want to implement barcode localization algorithms that scan the image for rectangular or barcode-like patterns, isolate each candidate region, and run individual decoding passes. Modern approaches include using deep learning models to first detect the [barcodes’ bounding boxes](https://scanbot.io/blog/how-to-use-our-barcode-scanner-ar-overlay/) before passing them off to traditional decoders. This separation of detection and decoding not only improves accuracy but also allows you to prioritize certain barcode types if your app is domain-specific.
### Scanning barcodes at different orientations
Barcodes aren’t always perfectly aligned. Users might scan at an angle, or the barcode might be printed sideways, upside-down, or rotated at an arbitrary degree. If your app can only decode horizontally aligned codes, you’re limiting its real-world utility. To address this, your scanning logic should incorporate rotation-invariant algorithms.
Many modern barcode libraries already support this feature by internally rotating the image during processing, but it’s worth verifying how well your chosen library performs with rotated inputs. You can also pre-process the image using computer vision techniques to estimate and normalize the orientation of the barcode before attempting a decode. For 2D barcodes like QR or Data Matrix codes, rotation doesn’t typically affect readability, but with 1D barcodes, alignment matters a lot more, so orientation handling becomes crucial.
A related challenge is [scanning inverted barcodes](https://scanbot.io/blog/how-to-scan-an-inverted-barcode/), which requires different approaches depending on whether a barcode is one- or two-dimensional. Some scanning software offers an “inverted mode” to speed up scans of inverted barcodes, which simply inverts the camera input, creating a non-inverted version of the barcode for the software to process. However, this approach depends on users selecting the correct mode, who may not even be aware that they are scanning an inverted barcode. Having the software automatically detect inversion is usually better.
### Scanning barcodes of different sizes
Barcodes come in a wide range of sizes—from tiny stickers on product packaging to large labels on warehouse pallets. Your scanner needs to gracefully handle both extremes. If a barcode is too small in the frame, it may not be resolvable; if it’s too large, the scanner might only capture part of it, leading to failed reads.
To adapt dynamically, consider implementing a system that uses autofocus and auto-zoom features provided by the device’s camera API. On mobile devices, you can measure the size of the detected barcode in the frame and adjust the zoom accordingly, ensuring that the code fills the optimal portion of the screen. Also, make sure your app supports a sufficiently high resolution for scanning small codes—downscaling might save processing time but at the cost of scan accuracy.
### Supporting multiple barcode types
Real-world applications often require scanning a [variety of barcode formats](https://scanbot.io/blog/types-of-barcodes/). These may include linear (1D) codes like UPC-A or Code 128, and matrix (2D) codes like QR, PDF417, or Data Matrix – some of them using international standards like [GS1](https://scanbot.io/blog/gs1-barcodes-what-they-are-and-how-to-scan-them/), which require specific [data parsers](https://scanbot.io/blog/barcode-parser-how-to-parse-gs1-pdf417/). Not every library supports every type, and some libraries perform better with specific formats.
If your app serves a general-purpose audience or multiple industries, it’s worth supporting as many formats as feasible. Some barcode scanning frameworks allow you to specify which formats to scan for, improving performance by skipping irrelevant types. You can also add custom logic to prioritize or validate certain barcode types based on context—like expecting a [QR code for login](https://scanbot.io/blog/qr-code-authentication/), but a [UPC code in a grocery store](https://scanbot.io/blog/grocery-list-scanner-smartphones-are-turning-into-smart-shopping-sidekicks/). Consider offering visual cues or configuration settings for users to choose their expected format.
### Optimizing for different devices
Performance and accuracy can vary widely depending on the device used. On mobile phones, leveraging native camera features such as tap-to-focus, manual exposure adjustment, or even real-time edge enhancement filters can significantly improve the user experience. If you’re targeting lower-end phones, be sure to optimize your processing pipeline to run efficiently without lag.
For desktop environments using webcams, there’s less flexibility with camera control, but you can still improve performance by accessing resolution settings via browser APIs or device drivers. Encouraging users to use external cameras with better focus capabilities can also help when scanning detailed or small codes.
### Leveraging machine learning for accuracy
One of the most significant performance boosters is [applying deep learning algorithms to barcode scanning](https://scanbot.io/blog/how-does-deep-learning-benefit-barcode-scanning/). Whereas traditional methods rely on strict image patterns and simple heuristics, machine learning models can adapt to far more variability in lighting, orientation, damage, and noise.
You can train custom object detection models to locate barcodes in complex scenes, or even use CNNs to directly interpret damaged barcodes that would otherwise be unreadable. Some open-source models already exist for this purpose, and integrating them with your app’s scanning logic can lead to a dramatic improvement in robustness. However, keep in mind that ML models often require more computational power, so consider providing a fallback to traditional decoding methods for low-power devices.
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Related blog posts
[](https://scanbot.io/techblog/react-barcode-reader-tutorial/)
### [How to build a React.js Barcode Scanner web app with TypeScript and Vite](https://scanbot.io/techblog/react-barcode-reader-tutorial/)
This tutorial will demonstrate how to integrate our Web Barcode Scanner SDK using React.js and Vite.

Alex January 3, 20259 mins read
[](https://scanbot.io/techblog/progressive-web-app-barcode-scanner-tutorial/)
### [How to build a Progressive Web App (PWA) Barcode Scanner with React and TypeScript](https://scanbot.io/techblog/progressive-web-app-barcode-scanner-tutorial/)
Learn how to build an installable barcode scanning PWA using React and our Web SDK in this step-by-step guide.

Kevin January 7, 202510 mins read
[](https://scanbot.io/techblog/vue-js-barcode-scanner-tutorial/)
### [How to build a Vue.js Barcode Scanner web app with TypeScript and Vite](https://scanbot.io/techblog/vue-js-barcode-scanner-tutorial/)
This tutorial will demonstrate how to integrate our Web Barcode Scanner SDK using Vue.js and Vite.

Kevin January 9, 20259 mins read
+
## Direct Part Marking Barcodes
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/blog/direct-part-marking-barcodes/#main)
While traditional barcode labels are an effective way to track products, they often wear down, becoming unreadable over time. Robust product traceability, however, is critical for compliance.
What if a product needs to be identified or traced throughout its entire life span? What if the conditions will be harsh? Think of medical and military equipment, or airplane components.
The solution is to engrave the barcode directly into the material. In this blog post, we’ll explore Direct Part Marking (DPM) technology, its applications, and how to maximize readability.
## What is direct part marking (DPM)?
The idea of direct part marking is to permanently apply a code onto the surface of an item. This makes DPM barcodes far more robust than labels, ensuring that parts and products can be identified and traced throughout their entire lifecycle.
There are several common DPM technologies manufacturers can use to this end. The DPM barcodes themselves are typically QR codes or Data Matrix codes, owing to their small footprint.
## QR codes vs. Data Matrix codes for DPM
In industrial part marking, [Data Matrix codes](https://scanbot.io/barcode-scanner-sdk/data-matrix/) are generally preferred over QR codes. For one, they can store more data in the same space, making them ideal for marking small components. For another, their encoding makes them less prone to be misread, especially in challenging conditions such as poor lighting.
However, QR codes also have their advantages: Consumers readily recognize them and associate them with quick access to online information. Moreover, they can easily scan QR codes, using nothing but the default camera app on most modern smartphones. QR codes are therefore commonly used for web links, especially when the goal is consumer interaction.
## Choosing the right marking method
Depending on the material and other factors, some direct part marking methods work better than others.
The three most common DPM methods are laser marking, dot peen marking, and chemical etching. Here is how they work – and when to use which:
- **Laser marking** uses a focused beam of light to create permanent marks on various materials. It can be used with most metals, plastics, glass, and ceramics. Laser marking is the most precise and fastest marking method. Furthermore, it is also the preferred choice for clean room applications, because the contamination risk is minimal.
- **Dot peen marking** uses an electromechanical engraving machine, usually a stylus or a pen, to rapidly engrave small dots. Dot peen marking is ideal for engraving on curved surfaces, soft metals, or when deep marking is required. Because the marked data can be changed easily and rapidly, it is also the preferred method for handling a lot of variety within products.
- **Chemical etching** selectively removes material from a surface to create specific patterns or shapes. This technique is specifically used on stainless steel and to produce high contrast.
Generally, laser marking is the go-to method for many DPM applications, especially in cases where precision, code durability and cleanliness are key. However, it does have some limitations such as a higher initial equipment cost.

## DPM technology: Benefits and challenges
DPM barcodes are highly durable and have a long life span. They can endure high temperatures, moisture, and corrosive environments, making them ideal for manufacturing in the military, medical, and aerospace industry. Barcodes engraved directly onto the object also minimize the risk of tampering, as they cannot be easily removed, altered or replaced – unlike traditional adhesive labels.
For these reasons, DPM technology ensures reliable identification of components and traceability throughout a product’s entire lifecycle.
However, the implementation and ongoing use of DPM barcodes does present challenges. To begin with, buying the marking equipment and training personnel to create and manage DPM codes can be capital-intensive. At the scanning end, the variety in component materials, including texture and color, can influence the accuracy of the DPM scanning results.
Lastly, there are industry standards and regulations to comply with. Different sectors have specific standards for barcode encoding. For example, the U.S. Department of Defense typically requires Item Unique Identification (IUID) as part of the compliance process for military applications. This ensures that all components in military vehicles such as tanks and fighter jets can be identified and traced easily throughout their lifecycle.
## Industry applications
Direct part marking is used across various industries where identification and long-term traceability of components are essential. The technique became established in the automotive and aerospace industries first, but is now also found in healthcare, construction, electronics manufacturing, the food and beverage industry, and the energy sector.
NASA, for instance, has been using Data Matrix identification on their aerospace parts, and thereby exemplifies effective use of direct part marking in high-stakes environments. Some of our Scanbot SDK clients, such as SKF and Breww, have also implemented DPM to identify and trace parts across their supply chain – or their customers’.
## Accurately scanning DPM barcodes
Direct part marking’s durability and reliability in harsh environments make it invaluable for product identification and traceability in sectors like aerospace, automotive, and healthcare.
However, certain factors should be considered when implementing DPM. The crucial concern is barcode readability, which can be affected by the materials’ textures and colors. Additionally, even DPM barcodes can become dirty or damaged. As a result, it’s advisable to invest in a scanning solution that can effectively address these challenges.
Our [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) delivers reliable and fast scanning of both QR and Data Matrix codes, regardless of the surface material. Its powerful barcode scanning capabilities can be integrated into any mobile app or website, enabling fast and reliable scanning for all common 1D and 2D barcode symbologies, even under challenging conditions such as low light or damaged barcodes.
The SDK is available for all common platforms, including iOS, Android, Web, Windows, Linux, and cross-platform frameworks like Flutter, React Native, and .NET MAUI. One of its standout features is its ability to operate entirely offline, ensuring compliance with data protection regulations like GDPR and CCPA/CPRA.
In addition to basic scanning functionality, the SDK includes advanced features such as AR overlays for intuitive scanning, batch and multi-scanning capabilities, and customizable UI components. It is used by enterprises in a wide range of industries, including retail, logistics, healthcare, aviation, and manufacturing.
Interested to learn more? Try the Scanbot Barcode Scanner SDK yourself with the [free demo app](https://scanbot.io/demo-apps/#barcode-scanner-sdk).
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Related blog posts
[](https://scanbot.io/blog/industrial-scanner-for-mobile-devices/)
### [Industrial scanner – Cost-effective alternatives](https://scanbot.io/blog/industrial-scanner-for-mobile-devices/)
Ever since its first revolution in 1800, the industrial sector has continually developed new approaches to make production, transportation, and communication between the divisions faster and more efficient. In...

Magdalena July 5, 20205 mins read
[](https://scanbot.io/blog/bearing-counterfeits/)
### [Navigating the Counterfeit Maze: Identifying Fake Industrial Products Using Barcodes](https://scanbot.io/blog/bearing-counterfeits/)
Mobile barcode scanners enable customers to check the authenticity of industrial parts within seconds. Learn more about how it works.

Magdalena September 20, 20224 mins read
[](https://scanbot.io/blog/types-of-barcodes/)
### [Types of barcodes and their usage](https://scanbot.io/blog/types-of-barcodes/)
An overview of the 1D and 2D barcode types supported by the Scanbot Barcode Scanner SDK and their use cases.

Kevin November 15, 202419 mins read
+
## Evolution of Document Scanning
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/blog/evolution-of-document-scanning/#main)
## The first glimmer
The humble beginning of scanning dates back to the **16th century** with the appearance of **camera obscura**. This precursor to modern photography used a pinhole to project an image onto a surface, resembling a primitive camera. The images could not be captured yet, however.
This changed in the **19th century** with the invention of **photography**. The fathers of photography, Louis Daguerre and William Henry Fox Talbot, used chemical processes to capture images on metal plates and paper.
As the next step towards document scanning, a way was needed to easily copy – and transmit – images.
In **1860**, the **pantelegraph** emerged, vaguely mirroring today’s fax machines. For the first time, telegraph lines could be used to transmit handwriting and drawings. The device soon proved invaluable for verifying signatures in banking.
What did this look like? A pair of pantelegraphs transmitted the images, but the receiving end did not print them out in ink, unlike later fax machines. Instead, the shared image was permanently recorded on special chemically treated paper. The reproduction could thus be preserved for future reference or verification.
In **1913**, the **belinograph** revolutionized image scanning and transmission. Thanks to the recently-invented photocell, it became far easier to send images over standard telephone lines.
This breakthrough laid the foundation for the Associated Press (AP) press distribution service. The AP was established in 1846 to share news stories among member newspapers. Belinograph technology enabled the AP to rapidly transmit both text-based news and visual content. This innovation transformed news reporting and distribution, ushering in a new era where images shaped how information was presented and consumed.
Fast-forward to **1924**, where Richard Ranger’s work resulted in the wireless **photoradiogram** technology. This precursor to modern fax machines achieved a significant milestone by transmitting the first photograph across the Atlantic: from New York to London.
While the photoradiogram didn’t use telephone lines like modern fax machines, it did set the stage for sending images over long distances.
From the camera obscura to photoradiograms, these inventions document the pursuit of ways to efficiently capture and share visual information. They paved for still more advanced technology – and, ultimately, modern document scanning.
## Early document scanning technology

The true revolution in document scanning arrived in the **1930s** with the introduction of the **photocopier**. Chester Carlson developed the Xerox machine, the first automatic photocopying device. It used **xerography** to transfer images from a photosensitive drum to paper. The photocopier made document replication faster and more accessible.
Duringthe **1950s**, David H. Shepard’s “Statistical Machine” gave rise to **optical character recognition (OCR)**. This innovation enabled the optical reading and conversion of printed text into electrical impulses, revolutionizing text processing.
In the **1960s**, scanning technology advanced with IBM’s 805 Test Scoring Machine and Russell Kirsch’s Drum Scanner, the first **flatbed scanner**.
The **1970s** saw the launch of commercial flatbed scanners from Xerox and Ray Kurzweil’s versatile OCR system, capable of reading text in any font.
The **1980s** brought the release of the Apple Macintosh, propelling desktop publishing and scanning into the mainstream. Visioneer’s PaperPort further developed scanning by making flatbed scanners accessible to personal computer users.
Throughout the **1990s**, the landscape continued to evolve with the introduction of color scanning, thanks to Fujitsu’s high-speed color document scanner. Simultaneously, Adobe’s launch of the **searchable PDF** format transformed how scanned documents were accessed and managed.

## Scanning goes mobile
With the advent of smartphones at the beginning of the **21st century**, document scanning underwent its most dramatic transformation. Mobile apps and built-in camera technology turned our handheld devices into powerful document scanners. Suddenly, anyone could easily capture, store, and share documents, significantly impacting industries like business, education, and healthcare.
Document scanning soon became more deeply integrated into mobile devices. Apple’s **iPhone** introduced built-in scanning capabilities, Google Docs incorporated OCR for scanned documents, and Evernote popularized mobile document capture and storage.
In the **2010s**, the focus was on cloud integration. Microsoft launched Office Lens, and Adobe Acrobat DC offered **mobile scanning** and editing capabilities.
Now, in the **2020s**, AI-powered document scanning solutions provide **automated text recognition, classification, and data extraction**. They mark the latest chapter in the evolution of document scanning – but there is still room to grow. The remote work trend and digital document management further accelerated the adoption of cloud-based scanning and storage solutions.

## The present and beyond
Today’s smartphones have high-resolution cameras and offer more than enough precision when scanning documents and receipts and recognizing data. It is now on app developers to make the most of the modern hardware.
The journey of document scanning has been remarkable, from its humble beginnings in the camera obscura to today’s sophisticated smartphone scanners. As technology continues to advance, the future possibilities for document scanning are limitless.
## Integrating a document scanner into your mobile app
The [Scanbot Document Scanning SDK](https://scanbot.io/document-scanner-sdk/) provides a cutting-edge solution that empowers developers to integrate document scanning capabilities into their applications. With the Scanbot SDK, businesses can streamline document management, enhance the user experience, and take full advantage of the smartphone’s scanning potential.
Download our [Demo App](https://scanbot.io/demo-apps/#document-scanner-sdk) or get a no-strings-attached [7-day trial license](https://scanbot.io/trial/) to try the Scanbot SDK for free.
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Related blog posts
[](https://scanbot.io/blog/essential-document-scanner-features/)
### [Document scanner apps: 7 features you shouldn’t miss out on](https://scanbot.io/blog/essential-document-scanner-features/)
Just taking a photo of a paper document is not enough for automated processing. To find the right scanning solution, keep an eye out for the following features.

Kevin November 28, 20225 mins read
[](https://scanbot.io/blog/what-is-ocr-software/)
### [What is OCR software?](https://scanbot.io/blog/what-is-ocr-software/)
How does optical character recognition work? And what can we do to achieve better end results? This article will help you understand the underlying mechanics of OCR technology.

Kevin August 10, 20224 mins read
[](https://scanbot.io/blog/online-document-submissions-using-a-web-sdk/)
### [How insurances can offer easy online document submissions using a Web SDK](https://scanbot.io/blog/online-document-submissions-using-a-web-sdk/)
Giving insureds the option to scan and submit documents via a web portal saves time and increases automatic processing rates.

Kevin October 17, 20234 mins read
+
## Open-source vs SDK
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/blog/open-source-scanner-vs-scanner-sdk/?utm_source=chatgpt.com#main)
## **What is open-source software?**
Open-source software differentiates itself from proprietary software by having its code publicly available. This allows any knowledgeable user to audit it – and to contribute. Open-source projects often result from the collaboration of a large, mostly unpaid community of developers. Well-maintained open-source projects are updated regularly by this community, receiving new features and security patches.
“Free Software” or FOSS (“Free and Open-Source Software”) goes one step beyond publishing the source code by defining four additional essential criteria:
1. The freedom to run the program for any purpose
2. The freedom to study how the program works and change it to one’s own requirements
3. The freedom to redistribute copies of the software to help others
4. The freedom to distribute modified copies
These freedoms define the “free” part in FOSS. To avoid confusion with “free” as in free-of-charge, some use the term “libre” – from “liberty” – instead.
This contrasts with the term “freeware” – software that actually is free-of-charge, though its code can still be proprietary. Therefore, freeware should not be confused with open-source or free/libre software.
An important aspect of open-source projects are the licenses they come with. Code is covered by copyright laws, meaning anyone using the software as part of a project should know the terms under which it is licensed. For example, some open-source software forbids its use for commercial purposes.
## **Open-source software licenses**
There are many software licenses available for open-source projects, and they come with different restrictions on how the code can be used.
Some use a concept called “copyleft”. This means that any software incorporating code with such a license cannot be made proprietary. One example is the popular GNU General Public License (GPL). Companies should not take this issue lightly, since violating the software license can incite legal action. They may be forced to stop selling their product immediately and open-source its code.
At the other end of the spectrum are permissive licenses. These place minimal restrictions on how the code is used and allow its integration into proprietary software. The BSD License and the MIT License are good examples of this. Such code is generally safe to integrate into proprietary software, though companies should not do so blindly.
Sometimes, popular open-source projects are acquired by corporations, which can result in the community forking the project. A fork starts as a copy of a software’s source code, which is then developed independently. This results in a separate piece of software.
A famous example of this is MariaDB, a fork of the relational database management system MySQL. In 2009, before the latter was acquired by Oracle, its community of open-source developers grew worried about its future direction and decided to fork the project, resulting in MariaDB. What started as a drop-in replacement for MySQL is now a powerful tool in itself, providing many additional features and improved performance.
## **Advantages and disadvantages of open-source tools**
As outlined above, the advantages of open-source code are that it is often free of charge, independently developed, and in many cases very secure, since any knowledgeable person can audit it.
However, there is a flip side to the community-driven development of open-source software. Since maintainers are mostly unpaid, there is little monetary incentive to contribute to a project longer than necessary. As a result, even fundamental building blocks of today’s software may be abandoned by their developers at some point, leaving them outdated and open to malicious actors.
According to [Sonatype’s 8th Annual State of the Software Supply Chain Report](https://www.sonatype.com/state-of-the-software-supply-chain/introduction), 1.2 billion vulnerable dependencies are downloaded each month. Correspondingly, the number of attacks on software supply chains increased by a staggering 742% per year from 2019 to 2022.
It’s also easy to stumble into conflicts with the variety of licenses used by open-source projects, especially if a software depends on many different libraries. For proprietary products, code with GNU GPL licenses should generally be avoided, whereas the Apache, BSD, and MIT licenses pose less of a risk.
## **Challenges of building a mobile app with open-source software**
Say you want to add document scanning and text recognition functionalities to your mobile app. You could combine various freely available libraries for that. These include code for the scanning API itself, image filters, the user interface, and text recognition via OCR. Each of these components is subject to its license and might be available under different terms of use.
These licenses must be checked to ensure that every software component is used in a way that is legally compliant. If the software is forked for your company’s business purposes, any changes made by the original developers must be manually incorporated. This ensures that the updated components stay compatible with your company’s software environment.
Implementing all these updates requires considerable time and effort for your company’s internal development team. Thus, customers cannot always be immediately supplied with the latest component version.
Moreover, if a component’s original open-source code stops being maintained by the community, your company’s development team is responsible for any further improvements and security updates.
The initial investment needed to build a software product on open-source projects is often lower. However, these uncertainties can become considerable cost factors that are difficult to calculate in advance.
## **Advantages of proprietary software development kits**
A proprietary software development kit (SDK) is a comprehensive solution that can be easily integrated and tailored to a company’s needs. This contrasts with the many individual software components usually needed for products built on open-source code. The adaptability of open-source software is retained through various customization options.
Customers automatically receive continuous updates and new functionalities, without need for further adjustments. SDK components can deliver state-of-the-art features while guaranteeing compatibility with operating systems and cross-platform wrappers. This ensures both an optimal user experience and accurate results.
By purchasing a proprietary software license, companies can depend on extensive support. Customers that use our Scanbot SDK in their products have access to a dedicated Slack channel where they can directly contact our in-house developers with any questions or issues.
All updates, new features, and bug fixes are included in the license fee, as is assistance from your dedicated Customer Success Manager, who ensures comprehensive support throughout the license period. This guarantees a flawless user experience.
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Related blog posts
[](https://scanbot.io/blog/scanbot-sdk-vs-ml-kit-vs-zxing/)
### [Barcode scanner comparison – Scanbot SDK vs ML Kit vs ZXing](https://scanbot.io/blog/scanbot-sdk-vs-ml-kit-vs-zxing/)
A comparison of barcode reader libraries and the Scanbot Barcode Scanner SDK regarding platforms, barcode types, integration, and support.

Ivan August 30, 20226 mins read
[](https://scanbot.io/blog/5-things-to-look-out-for-in-an-sdk/)
### [5 things to look out for when deciding on an SDK](https://scanbot.io/blog/5-things-to-look-out-for-in-an-sdk/)
When it comes to SDKs, several factors can impact the success of your project. Here are five things you should consider when deciding which SDK to buy.

Kevin October 4, 20225 mins read
[](https://scanbot.io/blog/essential-document-scanner-features/)
### [Document scanner apps: 7 features you shouldn’t miss out on](https://scanbot.io/blog/essential-document-scanner-features/)
Just taking a photo of a paper document is not enough for automated processing. To find the right scanning solution, keep an eye out for the following features.

Kevin November 28, 20225 mins read
+
## Benefits of Mobile Apps
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/blog/leveraging-the-power-of-modern-technology-6-key-benefits-of-mobile-apps/#main)
Mobile apps have transformed how companies operate and communicate with their customers. From improved customer engagement and brand loyalty to increased operational efficiency and revenue generation, an effective mobile strategy provides numerous advantages. Apps are now an essential component of modern business strategies.
In this article, we explore the key benefits mobile apps hold for companies and how they enable businesses to stay ahead.
## 1\. Accelerated revenue generation
Companies can generate revenue using mobile apps in a variety of ways. Common monetization options include in-app purchases, subscriptions, and mobile advertising. A simple, seamless app experience and interesting features encourage users to make purchases (or watch ads).
Furthermore, businesses can use applications as a platform to demonstrate and advertise specific items or services. A simple way to increase sales is to regularly show customers personalized recommendations of new products, based on their view and purchase history. App-based loyalty programs can boost revenue even further.
## 2\. Enhanced customer loyalty & engagement
Mobile applications give companies a personal, direct marketing channel to their users. With push notifications and in-app messaging, businesses can deliver targeted, relevant, and highly personalized information. Not only does this increase immediate user engagement, it also strengthens the connection between the company and its customers, improving brand loyalty and customer satisfaction.
Push notifications, for example, are a great way to announce new features or in-app content – though they should be specifically tailored to the user’s previous behavior and preferences. This way, users are regularly reminded to use the mobile app, but without being flooded with unnecessary information that could repel them.
## 3\. Streamlined processes and cost efficiency
Enterprises can also use mobile apps to streamline their internal business processes. They help automate repetitive tasks such as inventory management, personnel scheduling, or order processing, thus increasing productivity, minimizing human error, and reducing costs.
Additionally, they can provide real-time data and analytics, enabling businesses to make informed choices to optimize their operations and resource distribution.
The gains can be dramatic: [Deutsche Telekom](https://scanbot.io/success-stories/telekom/) was able to cut document submission time from three days to three minutes. With the internal app, employees can now [scan relevant documents](https://scanbot.io/document-scanner-sdk/) with their mobile devices and submit them digitally within milliseconds. Paired with automated data extraction, this eliminated the need for manual processing in the back-office and resulted in significant cost savings.

## 4\. Boosting brand awareness & competitive advantage
Modern customers expect businesses to have a mobile presence. This has a growing impact on buying decisions, giving an edge to enterprises that do offer a mobile application.
Businesses that deliver a well-designed, versatile app can distinguish themselves from their competitors and show their commitment to putting the customer first. Additionally, a mobile app can be a powerful branding tool, reinforcing brand identity and demonstrating the company’s thought leadership.
Health insurance apps are a great example here. Many offer more than just basic services, such as mobile document submission. Instead, they comprehensively cover health and fitness topics. This way, insurers can establish themselves as thought leaders around these topics, showing that they are committed to assisting their customers beyond the typical services.
## 5\. Efficient customer support & service
Thanks to mobile apps, businesses can provide outstanding customer support and service. With quicker responses to questions and issues through tools like in-app chatbots or support requests, they improve the entire customer experience. Knowledge bases, FAQs, and other self-service app features allow users to get common answers at any time – without having to pick up the phone to ask for help.
Additionally, mobile apps can be used to collect customer feedback to enhance processes and offering further.
This way, enterprises can establish a reputation for great service and foster customer loyalty with effective, timely customer care.
## 6\. Data collection & customer insights
Finally, enterprises can use mobile apps to collect valuable data and insights into consumer behavior. By analyzing user behavior and interactions within the app, companies can tailor their offerings directly to their target audience.
The data can be leveraged to study purchasing patterns, demand, or user flows. This information helps enterprises refine their marketing strategies, personalize the mobile app experience, and develop products or services that fulfill the current demand.
The retail industry provides a very practical example. Imagine an enterprise seeing an increased in-app search volume for yellow skirts. These searches are unsuccessful, however, because the store does not currently stock any yellow skirts. As these numbers are available in real-time, the retailer can quickly adjust to the high demand by ordering the desired piece of clothing for its customers.
## Leveraging a mobile app effectively promotes sales and creates long-term customer relationships
The shift to mobile devices has completely changed the way businesses operate, enabling them to increase client interaction and operate more efficiently. With modern mobile applications, companies can improve customer loyalty and engagement, promote sales, streamline operations, and deliver top-notch service to set themselves apart from rivals.
Today, therefore, mobile applications are no longer a nice-to-have – they are vital tools for businesses that want to succeed.
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Related blog posts
[](https://scanbot.io/blog/cold-chain-logistics-management-barcode-scanner/)
### [Overcoming challenges in cold chain logistics management with barcode technology](https://scanbot.io/blog/cold-chain-logistics-management-barcode-scanner/)
Barcodes optimize cold chain logistics management, improving visibility and ensuring regulatory compliance for temperature-sensitive goods.

Johanna July 18, 20255 mins read
[](https://scanbot.io/blog/what-is-an-mrz/)
### [How to scan MRZs with OCR: Considerations and first steps](https://scanbot.io/blog/what-is-an-mrz/)
MRZs encode information on ID cards and passports in a machine-readable format. Find out how to automatically read MRZs with data capture software.

Kevin July 16, 20259 mins read
[](https://scanbot.io/blog/mobile-ocr-for-legal-documents/)
### [OCR for legal documents: Unlock efficiency with mobile data capture](https://scanbot.io/blog/mobile-ocr-for-legal-documents/)
OCR creates digital, searchable versions of legal documents that can be retrieved instantly. Learn how to set up an OCR scanner app in minutes.

Johanna July 11, 20257 mins read
+
## Web Storage Solutions
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/techblog/storage-wars-web-edition/#main)
## Prologue
All modern browsers offer ways to store data locally. Our world would look rather different if they didn’t. Since you’re reading this, I’m sure you already have some idea of what local storage in the browser is. Still, let’s quickly go over the basics.
I’m writing this in Google Docs. I figure it stores my data locally before syncing it to Google’s servers. This is a good thing, because it makes sure that any changes I make are immediately stored on my device, and that Docs doesn’t fully depend on an external server being available.
Cookies are the oldest way to store data locally – however, they’re ripe for abuse by third parties. They’re also intended for communication with servers anyway, so they are a story for another time.
Then we have session storage and local storage proper. They’re almost exactly the same, except for their scope and lifetime.
**Local storage** stores data per origin, meaning whenever and from whichever tab you visit the same URL, you have the same data stored locally.
**Session storage**, on the other hand, works per instance, meaning its lifecycle is bound to a single browser tab. It’s intended to allow separate instances of the same web app to run in different windows without interfering with each other, which is a nifty feature. However, it does not exactly fit our requirements.
Wait, which requirements? What exactly are we looking for?
We’re here to research storage options for the Scanbot Web SDK, you see.
This SDK has a complex API that deals with various different types of data. When you scan a document with it, you don’t just get a bunch of strings and numbers. For one, the result data also includes an array with the coordinates of the document’s location on the scanned image. For another, you also get the image itself as binary data (more on this later). All of this needs to be properly stored and managed as conveniently for the user as possible.
Here’s an example of the data object we need to store (I’ve removed annotations and irrelevant types for the sake of brevity):
```hljs yaml
class CroppedDetectionResult {
croppedImage: RawImage | null;
originalImage: Image;
status: DetectionStatus = "NOT_ACQUIRED";
detectionScores: DetectionScores;
points: Point[];
horizontalLines: LineSegment[];
verticalLines: LineSegment[];
aspectRatio: number;
averageBrightness: number = 0;
}
```
As you can see, it’s not overly complicated. Some numbers and strings, some classes as types.
There are only two parts that are actually problematic: `RawImage`, which contains `Uint8Array` data, and `Image`, which is a type that can refer to any of the interfaces `ImageData`, `ArrayBuffer`, `Uint8Array` and `RawImage` itself.
How can we store all this, then?
## Local storage
Let’s start with the basics, the OG of storage: `localStorage`. It has been available since before I could call myself a software developer, all the way back in 2009. Ah, simpler times. `localStorage` is still used in all kinds of applications and the API has remained relatively stable throughout the ages, so I will jump right into the implementation.
Let’s create a separate storage class for our data object. Just the bare bones for storing an item and retrieving it without worrying about unique keys or anything.
JSON parsing is necessary because `localStorage` only accepts strings as values, another indication that this is not meant for larger data sets. And here it is:
```hljs javascript
export default class SBStorage {
static storeDocument(source: CroppedDetectionResult): void {
localStorage.setItem("document", JSON.stringify(source));
}
static getDocument(): CroppedDetectionResult {
const item = localStorage.getItem("document");
return item ? JSON.parse(item) : null;
}
}
```
### Limitations
At this point, I just wanted to show you what a retrieved document looked like, but my React starter project immediately threw an exception:
```hljs csharp
sb-storage.ts:7 Uncaught (in promise) DOMException: Failed to execute 'setItem' on 'Storage': Setting the value of 'document' exceeded the quota.
at SBStorage.storeDocument (
```
There is this nifty online tool that shows you how many characters can be held in `localStorage`: [https://arty.name/localstorage.html](https://arty.name/localstorage.html). As of writing this, my limit seems to be 5,200,000. This number will vary based on the browser and version you’re using.
The site’s author even explains:
> Chrome 6.0.472.36 beta let me save 2600-2700 thousands of characters, Firefox 3.6.8 – 5200-5300k, Explorer 8 – 4900-5000k, and Opera 10.70 build 9013 popped a dialog, that allowed me to give the script unlimited storage. Spec arbitrarily recommends 5 megabytes of storage, but doesn’t say a thing about actual characters, so in UTF-16 you get twice less.
So, let’s check how many characters’ worth of data we’re trying to store. A quick modification to the existing snippet …
```hljs javascript
const value = JSON.stringify(source);
console.log("Characters:", value.length);
localStorage.setItem("document", value);
```
… and the result we get is:
```hljs yaml
Characters: 68046772
```
As it turns out, `localStorage` can’t even store a tenth of that.
Even though we’ve already proven that it’s not a viable option here, I briefly want to touch on the fact that `localStorage` does not support binary data. That’s what I was going to get at in the first place, but instead we immediately ran into the quota issue.
I just want to quickly show you what serialization does to a binary data format. To begin with, the format of our `croppedImage` data is an `Uint8Array`. It looks more or less like what you would expect (this array is actually 1,504,272 characters long, but here’s the start of it):
```hljs undefined
[169, 195, 195, 169, 195, 195, 168, 194, 194, 168, ...\
\
\
\
\
```\
\
After serialization, the same array looks like the following:\
\
```hljs cpp\
{"0":169,"1":195,"2":195,"3":169,"4":195,"5":195,"6":168,"7":194,"8":194,"9":168, ...\
\
\
\
\
```\
\
We’ll get into why this is in a later section, but what we need to know right now is that `localStorage` only accepts strings and therefore doesn’t support binary formats out of the box.\
\
There are ways to get around this – you can probably already imagine an algorithm to turn this map of keys and values back into an array of integers. It’s always going to be a hack, though. You just shouldn’t have to manipulate binary data manually.\
\
### Base64\
\
The correct way to do this would be to convert the image data to a Base64 image first, which we can then store properly.\
\
**Base64** is a family of binary-to-text encoding schemes that represent binary data in an ASCII string format by transforming it into a radix-64 representation.\
\
That may sound complicated, but it’s really a straightforward process. You simply create a reader object, pass your array as a blob, and read it in as a data URL using the native JavaScript function. If necessary, also remove the descriptor part of the string. Here’s the convenience function we use:\
\
```hljs typescript\
public static async toBase64(data: Uint8Array): Promise {\
// See https://stackoverflow.com/a/39452119\
const base64url = await new Promise(resolve => {\
const reader = new FileReader()\
reader.onload = () => resolve(reader.result as string)\
reader.readAsDataURL(new Blob([data]))\
});\
// remove the `data:...;base64,` part from the start\
return base64url.slice(base64url.indexOf(',') + 1);\
}\
\
\
\
\
```\
\
And then the following, if not too long, can be effectively held in local storage:\
\
```hljs javascript\
const base64 = await ImageUtils.toBase64(source.croppedImage.data);\
// Base64: wsLQw8LQw8LQw8TRxMXSxMXTxcfUxcjVxMjVxcnXx8vaztHh1dbm19np2dvr2Nv...\
console.log("Base64: ", base64);\
\
\
\
\
```\
\
However, any kind of operation of this magnitude is computationally heavy, be it the direct manipulation of a key-value map or the Base64 version, and we’re trying to be optimal here. So all that just won’t cut it. We need to be able to work with binary data directly.\
\
And this brings us to …\
\
## Binary data\
\
In web development, we meet binary data mostly when dealing with files (creating, uploading, downloading). Another typical use case is image processing – which is what we’re doing here.\
\
There are many classes for various implementations of binary data in JavaScript, such as `ArrayBuffer`, `Uint8Array`, `DataView`, `Blob` and `File`, but these different nuances of implementation aren’t important right now.\
\
Anyway, the core object is `ArrayBuffer` – the root of everything, the raw binary data. And that is what we will be working with. Whichever of the aforementioned wrapper classes you use, it will contain a variation of an `ArrayBuffer`.\
\
### Everything is an object (almost)\
\
Now, the explanation as to why stringification of `ArrayBuffer` or `Uint8Array` turns it into a bit of a nightmare is actually pretty interesting. You see, everything in JavaScript is actually an object, except strings. Strings are still strings. But with arrays, it means you can do the following:\
\
```hljs cpp\
const a = [1, 2, 3]; a.foo = "bar"console.log(a); // [ 1, 2, 3, foo: 'bar']\
\
\
\
\
```\
\
That’s because natively, an array is still an object prototype, but it does stringify into _looking_ like a simple array simply because its `toString()` function has been overwritten for the convenience of developers. Because it’s often needed.\
\
And that is also exactly why stringifying an `Uint8Array` turns it into an object of key-value pairs (remember the `{"0":169,"1":195,"2":195,"3":169 …}` example from earlier) and why we need additional steps to properly serialize it.\
\
### Serialization\
\
At this point, it’s also worth it to elaborate on a point I made previously: that binary data is not serializable. While that is still fundamentally true, JavaScript does have some native support for serialization these days, with the latest and greatest tool being `TextDecoder`. Take this example:\
\
```hljs javascript\
const buffer = new TextEncoder().encode('banana');\
const testObj = { encodedText: buffer.toString() };\
\
const serializedTestObj = JSON.stringify(testObj);\
console.log(serializedTestObj); // {"encodedText":"98,97,110,97,110,97"}\
\
const deserializedTestObj = JSON.parse(serializedTestObj);\
const deserializedBuffer = deserializedTestObj.encodedText.split(',');\
const newBuffer = Uint8Array.from(deserializedBuffer);\
const str = new TextDecoder().decode(newBuffer);\
console.log(str); // banana\
\
\
\
\
```\
\
Thank you to [Will Munslow from dev.to](https://dev.to/subterrane/how-to-serialize-that-ing-buffer-12m3) for this snippet!\
\
While it is _relatively_ straightforward, you’ll notice right away that this encoding method requires:\
\
- For the data to initially be a string that’s serialized with the coder class, which is a relatively uncommon use case (in most cases you start off with binary data).\
- String splitting, which is an expensive operation.\
- At the end, both buffer deserialization and text decoding again.\
\
Let’s now move on to the next web storage method.\
\
## IndexedDB\
\
So, what is IndexedDB? I would’ve gladly given my own short overview of the concept, but [MDN](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API) says it best:\
\
> IndexedDB is a low-level API for client-side storage of significant amounts of structured data, including files/blobs. This API uses indexes to enable high-performance searches of this data.\
\
What that actually means for us is a convenient way to store the aforementioned binary data of `ArrayBuffer` format. Yay, no more of this complex, nonsensical and resource-hungry encoding and decoding logic!\
\
To quickly reiterate, the main problems with `localStorage` are that:\
\
- It can only store strings.\
- It has a very small and unstable data cap.\
\
IndexedDB easily solves both of these issues. On top of that, it has some additional benefits, such as the fact that it can be used inside web workers (more on this later). It’s also asynchronous, meaning the render cycle is not blocked while saving/loading.\
\
The only thing `localStorage` has going for it is the simplicity of its API. It’s just `localStorage.setItem` and `localStorage.getItem`. There are a couple of additional convenience functions, but that’s roughly it. Done!\
\
### Messy API & solutions\
\
IndexedDB isn’t perfect, either: The API is famously a fabulous mess. It’s such a mess, in fact, that a whole ecosystem of libraries has been developed around it just so that your average developer doesn’t have to deal with its nonsense.\
\
So, before we finally move on to our actual implementation, let’s take a look at what’s already out there to help you with this.\
\
There’s [use-indexeddb](https://www.npmjs.com/package/use-indexeddb), which promises to be the most lightweight one, but that’s because it only wraps a few of the basics. It’s not all that convenient to use, and it also features some intrusive logging that cannot be disabled.\
\
Next up is [Dexie](https://dexie.org/), a more fully-fledged storage framework that looks pretty promising. Its API is very straightforward. It’s super intuitive to create a base, write queries and add entries:\
\
```hljs csharp\
const db = new Dexie('MyDatabase');\
\
// Declare tables, IDs and indexes\
db.version(1).stores({ friends: '++id, name, age' });\
\
// Find some old friends\
const oldFriends = await db.friends.where('age').above(75).toArray();\
\
// or make a new one\
await db.friends.add({\
name: 'Camilla',\
age: 25,\
street: 'East 13:th Street',\
picture: await getBlob('camilla.png')\
});\
\
\
\
\
```\
\
At first glance, it seems to be inspired by C#’s LINQ statements, and it also supports live queries. That means you can combine it with, for example, Redux and completely handle state management through that. While that’s a nice feature, Dexie is actually a bit too elaborate for our use case.\
\
Another one is [idb](https://www.npmjs.com/package/idb), which claims to mostly mirror the IndexedDB API, but with some notable usability improvements. But really, looking at the implementation, it just seems to wrap the API in the `Promise` class and not much else. It’s definitely not worth the hassle of adding a third-party dependency for such a minor increase in convenience.\
\
The final popular wrapper framework is called [JsStore](https://jsstore.net/docs/get-started), which wraps the IndexedDB API into an SQL-like API.\
\
```hljs csharp\
var insertCount = await connection.insert({ into: 'Product', values: [value] });\
\
var results = await connection.select({ from: 'Product', where: { id: 5 } });\
\
\
\
\
```\
\
Which, in my humble opinion, is not much of an improvement. SQL is still pretty complex and it’s easy to create sub-optimal transactions. It’s not raw SQL, so maybe it’s not too bad, but I’ve been burned by SQL too many times to trust anything like that again.\
\
Plus, as with Dexie, JsStore seems to be overkill for our use case as well.\
\
To be honest, I knew in advance that I wasn’t going to be impressed by any of these libraries. The plan was always to get our hands dirty, the Spartan way, and not to tie ourselves down by any more dependencies. I just wanted to give a quick overview of the options available. If our solution were more complex, I’d go with Dexie.\
\
### The Spartan approach\
\
However, we’re building an SDK for clients, so we do not want to rely on any external libraries. It is possible, and we do use them, but we do not add them lightly, because:\
\
- They always come with a license, which we must adhere to and disclose.\
- They add overhead to future development and maintenance (I’m sure you know the pain of upgrading dependencies all too well).\
- They add additional points of failure to our project.\
\
If possible and within reason, we want to be in control of what happens inside our SDK.\
\
So, for our storage logic, let’s roll our own!\
\
In terms of use cases, ours is relatively straightforward. The data model itself is complex, but the database transactions are not, so I was not expecting too much of a hassle. The basic setup is simple enough:\
\
```hljs kotlin\
const request = indexedDB.open("SBSDKBase", 1);\
\
\
\
\
```\
\
We create the request, think of a name for the database and add a version number of the database we’re requesting from. Having to specify the version number right away may seem unnecessary, but the documentation makes it pretty clear why: database models change all the time and having an easy option to keep track of version history seems intuitive enough.\
\
The request object has different callbacks: `onerror`, `onupgradeneeded`, and `onsuccess`. Right now, we can ignore errors, as we’re just trying to add some basic documents to the base and retrieve them. There’s no model changes, no indexing, we only use readwrite mode and increment automatically (let’s hope this doesn’t come back to bite us).\
\
All we’re interested in at the moment is the success callback.\
\
```hljs csharp\
request.onsuccess = (event) => {\
const db = (event.target as IDBOpenDBRequest).result;\
db.createObjectStore("documents", { keyPath: "id", autoIncrement: true });\
\
const transaction = db.transaction("documents", "readwrite");\
const store = transaction.objectStore("documents");\
store.add(source);\
\
console.log("Added item to store");\
\
const getRequest = store.get(1);\
getRequest.onsuccess = (event) => {\
const result = (event.target as IDBRequest).result;\
console.log("Got item from store", result);\
};\
};\
\
\
\
\
```\
\
This is the most bare-bones code snippet I thought I’d need to add a document to storage. Open the database, create a document table, put an object in it. I’ve been doing this for a long time, I’ve worked on various databases and thought I had a handle on it. I thought this would work.\
\
Nope. I got bitten right away. The error:\
\
```hljs csharp\
Uncaught DOMException: Failed to execute 'createObjectStore' on 'IDBDatabase': The database is not running a version change transaction.\
\
\
\
\
```\
\
Why would I be unable to create a table when opening the database? I’m barely getting started and I already get the feeling that writing raw SQL is more intuitive than this. There, you can at least execute queries once you open the database.\
\
Let’s hope it gets better from here on! At least the error message itself is not cryptic. We’ll try again by implementing `onupgradeneeded` (don’t forget to upgrade your db version):\
\
```hljs csharp\
request.onupgradeneeded = (event) => {\
const db = (event.target as IDBOpenDBRequest).result;\
db.createObjectStore("documents", { keyPath: "id", autoIncrement: true });\
console.log("IndexedDB upgraded", event);\
};\
\
\
\
\
```\
\
Now we can also remove the `create` block from our success callback and voilá, we’ve created a database, added our first item to it, and also retrieved it:\
\
```hljs csharp\
request.onsuccess = (event) => {\
const db = (event.target as IDBOpenDBRequest).result;\
const transaction = db.transaction("documents", "readwrite");\
const store = transaction.objectStore("documents");\
store.add(source);\
console.log("Added item to store");\
\
const getRequest = store.get(1);\
getRequest.onsuccess = (event) => {\
const result = (event.target as IDBRequest).result;\
console.log("Got item from store", result);\
};\
};\
\
\
\
\
```\
\
And the retrieved object still contains our image data in the correct `Uint8Array` format. Juicy!\
\
```hljs yaml\
Got item from store {\
status: 'OK',\
detectionScores: {...},\
points: Array(4),\
horizontalLines: Array(5),\
verticalLines: Array(5), …}\
aspectRatio: 0.698217078300424averageBrightness: 183\
croppedImage: {..., format: 'BGR', data: Uint8Array(1859760)\
...\
}\
\
\
\
\
```\
\
### Asynchronous improvements\
\
Time to make the entire process a bit more convenient. Let’s wrap the database opening into its own asynchronous block:\
\
```hljs typescript\
private static openDB(): Promise {\
return new Promise((resolve, reject) => {\
\
const DB_NAME = "SBSDKBase";\
const DB_VERSION = 4;\
const request = indexedDB.open(DB_NAME, DB_VERSION);\
\
request.onsuccess = (event) => {\
resolve((event.target as IDBOpenDBRequest).result);\
};\
\
request.onerror = (event) => { reject(event); };\
request.onupgradeneeded = (event) => {\
// Update object stores when necessary\
};\
});\
}\
\
\
\
\
```\
\
And another block to get the store itself, so we don’t have to duplicate that any further:\
\
```hljs csharp\
private static async getDocumentStore(): Promise {\
const db = await SBStorage.openDB();\
const transaction = db.transaction("documents", "readwrite");\
return transaction.objectStore("documents");\
}\
\
\
\
\
```\
\
And now we have two super intuitive public functions for our storage service to store a document and retrieve all of them:\
\
```hljs javascript\
static async storeDocument(source: CroppedDetectionResult): Promise {\
const store = await SBStorage.getDocumentStore();\
store.add(source);\
}\
\
static async getDocuments(): Promise {\
const store = await SBStorage.getDocumentStore();\
return new Promise((resolve, reject) => {\
store.getAll().onsuccess = (event) => {\
const result = (event.target as IDBRequest).result;\
resolve(result);\
};\
});\
}\
\
\
\
\
```\
\
Eventually we’ll have to add proper error handling, but as you can see, with a couple of wrapper functions, it’s relatively easy to implement IndexedDB on your own, no third-party libraries required.\
\
This asynchronous approach with `Promise` already utilizes callbacks and does not block the main thread. JavaScript is pretty nice, you see. We just implemented some basic syntactic sugar to make the code look nicer, and that ended up being the optimal approach anyway.\
\
### Timing transactions\
\
It’s possible to optimize this even further, and we’ll get to that in a second. But first, let’s check out how much time all these transactions take. You should always know exactly what you’re optimizing and why. Performance metrics are key.\
\
The most robust way to do this is to just go back to our initial implementation and measure how many milliseconds have passed after each meaningful operation. For example:\
\
```hljs javascript\
const currentMS = new Date().getTime();\
const request = indexedDB.open("SBSDKBase", 4);\
console.log("Opening indexedDB", new Date().getTime() - currentMS);\
\
request.onsuccess = (event) => {\
const db = (event.target as IDBOpenDBRequest).result;\
const transaction = db.transaction("documents", "readwrite");\
const store = transaction.objectStore("documents");\
store.add(source);\
console.log("Added item to store", new Date().getTime() - currentMS);\
\
const getRequest = store.get(1);\
getRequest.onsuccess = (event) => {\
const result = (event.target as IDBRequest).result;\
console.log("Got item from store", new Date().getTime() - currentMS);\
};\
};\
\
\
\
\
```\
\
```hljs csharp\
Opening indexedDB 0\
Added item to store 17\
Got item from store 30\
\
\
\
\
```\
\
That’s not too bad, but it’s also not nothing. Considering that I’m currently working on a higher-end MacBook Pro with an M2 chip and an SSD, this operation could easily take 20–50 times as long on a lower-end Android or iOS device.\
\
We have already implemented basic asynchronous IndexedDB usage with Promises, and in some use cases this would be good enough. But since we’re dealing with large chunks of data, though, it’s worth investing in true parallelism and moving everything off the main thread.\
\
And this brings us to …\
\
## Web workers\
\
> Web workers are a simple means for web content to run scripts in background threads. The worker thread can perform tasks without interfering with the user interface. ( [MDN](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers))\
\
How web workers differ from promises/callbacks is rather fundamental.\
\
I won’t dive too deep into threading, but to put it briefly, a JavaScript environment is fundamentally single-threaded. In its simplest form, asynchronous is just syntactic sugar for promise chains that allow for the user interface to be rendered before other long-running operations.\
\
It’s also important to note that two jobs can never run in parallel in this environment. One async operation might run in between two jobs of another one, so in that sense they can run “concurrently.” For true parallelism, e.g. simultaneously rendering the user interface and storing data, we need threads.\
\
Luckily, all modern browsers give us worker threads, allowing for this kind of operation.\
\
### Basic implementation & problems\
\
Let’s see how we can set up worker threads for our specific use case, following the same example code used previously.\
\
Spawning a worker is a relatively trivial task. From [MDN’s examples](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers), you just need to create a worker JavaScript file:\
\
```hljs javascript\
onmessage = function(e) {\
console.log('Worker: Message received from main script');\
const result = e.data[0] * e.data[1];\
if (isNaN(result)) {\
postMessage('Please write two numbers');\
} else {\
const workerResult = 'Result: ' + result;\
console.log('Worker: Posting message back to main script');\
postMessage(workerResult);\
}\
}\
\
\
\
\
```\
\
And then you’re able to import it in your main JavaScript file and pass data to it as follows:\
\
```hljs javascript\
if (window.Worker) {\
const myWorker = new Worker("worker.js");\
\
[first, second].forEach(input => {\
input.onchange = function() {\
myWorker.postMessage([first.value, second.value]);\
...\
\
\
\
\
```\
\
As you can see, running a piece of JavaScript code on another thread is not as trivial as running it asynchronously. You need to spawn a dedicated worker from a separate file. While that seems relatively simple, once your build system becomes more complex, so does this.\
\
Where do you put your worker file in a Vite environment? Where does it go when you’re using Webpack? Does your environment use bare-bones Webpack that is configurable, or is it wrapped behind another build system? What if you also have automated tests running – are they easily able to pick up your worker file?\
\
Or, to give a more specific example: We use Webpack to transpile the SDK, and it has a separate worker-loader plugin that can be used to ensure workers are bundled into the end product. That’s pretty straightforward. However, our development environment uses the SDK’s source code directly, so it’s necessary to have another option to make sure this worker file is properly compiled into that environment as well.\
\
### Loading a file as data\
\
So, the easiest solution turns out to be to simply create the file as you normally would, in your source code, and then simply use JavaScript itself to package it into a blob. That blob is then loaded into the worker, exactly as another external JavaScript file would be (and thank you to [Martins Olumide on dev.to](https://dev.to/martinsolumide8/how-to-use-web-worker-in-react-with-typescript-4o79) for this hint).\
\
It may sound convoluted, but it’s a pretty solid solution to start off with. I bet it’s good enough for production, but before shipping this, we will definitely delve into additional performance metrics to see whether using Webpack to pre-compile it into the bundle is better or not.\
\
First, the basic worker file will look like this:\
\
```hljs javascript\
const workerFunction = function () {\
// Perform every operation we want in this function\
self.onmessage = (event: MessageEvent) => {\
postMessage('Message received!');\
};\
};\
\
// This stringifies the whole function\
let codeToString = workerFunction.toString();\
// This brings out the code in the bracket in string\
let mainCode = codeToString.substring(codeToString.indexOf('{') + 1, codeToString.LastIndexOf('}'));\
// Convert the code into a raw data\
let blob = new Blob([mainCode], { type: 'application/javascript' });\
// A url is made out of the blob object and we're good to go\
let worker_script = URL.createObjectURL(blob);\
\
export default worker_script;\
\
\
\
\
```\
\
The comments in the block above should make pretty clear what we intend to do: We’re basically mock loading a separate worker file by simply stringifying the entire worker and returning it as a blob.\
\
## Putting it all together\
\
After that, we just need to refactor our previous code a bit to make it fit into that JavaScript function and we have our worker up and running. We move the previously defined wrapper functions inside that function (because, thankfully, in JavaScript you can have inner functions, else this would be a mess) and do exactly what we did previously, only now we need to post the message instead of returning the data:\
\
```hljs javascript\
const workerFunction = function () {\
\
function openDB(): Promise {\
...\
}\
\
async function getDocumentStore(): Promise {\
...\
}\
\
self.onmessage = (event: MessageEvent) => {\
console.log("Received in worker thread:", event.data);\
if (event.data.type === 'storeDocument') {\
console.log("Storing document in worker thread");\
getDocumentStore().then((store) => {\
store.add(event.data.data);\
self.postMessage(true);\
});\
} else if (event.data.type === 'getDocuments') {\
console.log("Getting documents in worker thread");\
getDocumentStore().then((store) => {\
const request = store.getAll();\
request.onsuccess = (event) => {\
self.postMessage((event.target as IDBRequest).result);\
};\
});\
}\
};\
};\
\
\
\
\
```\
\
Now that we’ve moved all of the IndexedDB API implementation to the worker, our main storage service file ends up looking pretty bare:\
\
```hljs typescript\
import { CroppedDetectionResult } from "../../core/worker/ScanbotSDK.Core";\
import worker_script from './worker/sb-storage.worker';\
\
export default class SBStorage {\
\
private static readonly worker: Worker = new Worker(worker_script);\
\
static async storeDocument(source: CroppedDetectionResult): Promise {\
this.worker.postMessage({ type: 'storeDocument', data: source });\
\
return new Promise((resolve, reject) => {\
this.worker.onmessage = (event) => {\
resolve(true);\
}\
});\
}\
\
static async getDocuments(): Promise {\
this.worker.postMessage({ type: 'getDocuments' });\
return new Promise((resolve, reject) => {\
this.worker.onmessage = (event) => {\
resolve(event.data);\
}\
});\
}\
}\
\
\
\
\
```\
\
All that’s left in this file is the code to import the blob, initialize the worker itself, post messages to the worker and resolve the promise once a message has been received.\
\
And that’s it! Some additional error handling needs to be implemented, but that’s busywork at this point. The takeaway: In just a few steps, we’ve built ourselves an optimal storage solution for complex objects – using only IndexedDB and web workers, no third-party libraries needed.\
\
## Ready to get started?\
\
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.\
\
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)\
\
## Related blog posts\
\
[](https://scanbot.io/techblog/react-barcode-reader-tutorial/)\
\
### [How to build a React.js Barcode Scanner web app with TypeScript and Vite](https://scanbot.io/techblog/react-barcode-reader-tutorial/)\
\
This tutorial will demonstrate how to integrate our Web Barcode Scanner SDK using React.js and Vite.\
\
\
Alex January 3, 20259 mins read\
\
[](https://scanbot.io/techblog/developing-a-scanning-sdk-for-windows-a-first-hand-account/)\
\
### [Developing a scanning SDK for Windows: A first-hand account](https://scanbot.io/techblog/developing-a-scanning-sdk-for-windows-a-first-hand-account/)\
\
One of our software engineers shares his experiences with developing our new Windows SDK. Trials and tribulations await.\
\
\
Aare June 20, 202317 mins read\
\
[](https://scanbot.io/techblog/progressive-web-app-barcode-scanner-tutorial/)\
\
### [How to build a Progressive Web App (PWA) Barcode Scanner with React and TypeScript](https://scanbot.io/techblog/progressive-web-app-barcode-scanner-tutorial/)\
\
Learn how to build an installable barcode scanning PWA using React and our Web SDK in this step-by-step guide.\
\
\
Kevin January 7, 202510 mins read\
\
+
## UWP Barcode Scanner SDK
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/developer/uwp-barcode-scanner/?utm_source=chatgpt.com#main)
# UWP Barcode Scanner
Add fast and accurate barcode scanning to your UWP apps with the Scanbot UWP Barcode Scanner SDK. Seamlessly integrate real-time barcode scanning across Windows applications, with support for both VB.NET and C#.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders


Seamless UWP integration
The Scanbot UWP Barcode Scanner SDK integrates natively into Windows applications, providing smooth barcode scanning functionality using VB.NET or C#, without the need for third-party integrations.

Barcode scanning in challenging conditions
The UWP Barcode Scanner SDK is designed to perform in challenging real-world environments, such as:
- Damaged barcodes
- Low-light environments
- Tiny or distant barcodes
[Customizable UI components\\
\\
Our Ready-To-Use UI components cover all barcode scanning scenarios and are highly customizable.](https://scanbot.io/rtu-ui/)
Fast.
Very fast.
Every scan happens in
0.04s
or less
Scans all major barcode types
Code 39
Code 93
Code 32
Code 25
EAN-5
PDF417
GS1 DataBar
Code 39
Code 93
Code 32
Code 25
EAN-5
PDF417
GS1 DataBar
EAN-13
MSI Plessey
EAN-2
Aztec Code
rMQR Code
Codabar
UPC-A
EAN-13
MSI Plessey
EAN-2
Aztec Code
rMQR Code
Codabar
UPC-A
EAN-8
ISBN
GiroCode
GS1-128
Data Matrix
IATA 2 of 5
EAN-8
ISBN
GiroCode
GS1-128
Data Matrix
IATA 2 of 5
Code 128
Code 11
QR Code
UPC-E
Micro QR Code
MaxiCode
Code 128
Code 11
QR Code
UPC-E
Micro QR Code
MaxiCode
## Add a fast and reliable UWP Barcode Scanner to your app
The Scanbot UWP [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) provides developers with a reliable solution to integrate fast barcode scanning functionality into Universal Windows Platform (UWP) applications. Whether you’re using VB.NET or C#, the SDK supports seamless integration with minimal coding effort, enabling real-time barcode recognition on Windows devices.
Supporting major barcode formats such as QR codes, PDF417, and EAN, the SDK is ideal for a wide range of industries, including logistics, retail, healthcare, and manufacturing. Developers can quickly implement the barcode scanning functionality and customize the UI for a tailored experience. Additionally, the SDK handles low-light environments and can scan damaged barcodes, ensuring high reliability in any condition.
The SDK also supports image-based barcode scanning, making it useful for applications that need to scan barcodes from static images uploaded to the app.
### Technical requirements
The Scanbot UWP Barcode Scanner SDK requires:
- **UWP Version**:
10.x or higher
- **Languages**:
Compatible with both VB.NET and C#
- **Hardware**:
A rear-facing camera with autofocus
## Integrate this evening with your framework
## How to integrate the Scanbot UWP Barcode Scanner SDK
The SDK offers various ways to extract barcodes from a live camera feed or still images.
**Scanner UI**
For live detection, you can use our so-called **Ready-To-Use UI Component (RTU UI)** or implement a custom scanner UI by using our **Classic Component**.
**Ready-To-Use UI Component**
This UI component is a final and ready-to-use [`Page`](https://learn.microsoft.com/en-us/uwp/api/windows.ui.xaml.controls.page) component and is meant for the simplest interactions, with the fewest customizations possible, but can be implemented within a couple of minutes.
To launch Scanbot SDK’s barcode scanner `Page`, run the following:
```codeBlockLines_e6Vv hljs csharp
var scanner = new BarcodeScanner();var configuration = new BarcodeScannerConfiguration();BarcodeResult result = await scanner.Start(Frame, configuration);Debug.WriteLine(result.Barcodes);
```
This approach returns a `BarcodeResult` object and then closes and properly disposes the scanner `Page` itself.
This `BarcodeResult` object contains a list of barcodes, each with a `SoftwareBitmap` containing a crop of the detected barcode, and, if something went wrong, a `Scanbot.Model.ScanbotSdkException` object with a message.
**Classic Component**
If you wish to build your own layout, we advise you to use `BarcodeScannerComponent`. It’s a XAML-compliant camera component that offers endless recognition and handles all initialization and error-handling for you. This approach allows you full customization of the UI and workflow. Since you have full control over the lifecycle of this component, you can implement continuous scanning.
Add the component to your view:
```codeBlockLines_e6Vv
```
[Read the full UWP Barcode Scanner SDK documentation](https://docs.scanbot.io/barcode-scanner-sdk/windows/barcode-scanner/ui-components/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### **What are the key requirements for the Scanbot UWP Barcode Scanner SDK?**
The Scanbot UWP Barcode Scanner SDK has the following key requirements:
\- **Supported Platforms:** UWP Version 10.x or higher
\- **Supported Architectures:** x86, x64, ARM, and ARM64
\- **Development Environment:** Visual Studio 2019 or newer with UWP development workloads
\- **Programming Languages:** Compatible with C# and VB.NET
\- **Hardware:** A device with a rear-facing camera equipped with autofocus
These requirements ensure compatibility with a wide range of Windows devices, enabling robust barcode scanning capabilities within UWP applications.
### **Can I use the UWP Barcode Scanner SDK offline?**
Yes, the Scanbot UWP Barcode Scanner SDK functions fully offline. This ensures that all barcode data is processed directly on the device, without needing an internet connection. It is ideal for applications in healthcare, logistics, and retail, where data privacy and security are important, as well as for use in remote areas with limited connectivity.
### **Does the UWP Barcode Scanner SDK support all barcode types?**
Yes, the Scanbot UWP Barcode Scanner SDK supports a wide array of barcode formats, including:
**1D Barcodes:** [UPC](https://scanbot.io/barcode-scanner-sdk/upc/), [EAN](https://scanbot.io/barcode-scanner-sdk/ean/), [Code 128](https://scanbot.io/barcode-scanner-sdk/code-128/), [Code 39](https://scanbot.io/barcode-scanner-sdk/code-39/), [ITF](https://scanbot.io/barcode-scanner-sdk/itf-code/), and more
**2D Barcodes:** [QR codes](https://scanbot.io/glossary/qr-code/), [PDF417](https://scanbot.io/barcode-scanner-sdk/pdf417/), [DataMatrix](https://scanbot.io/barcode-scanner-sdk/data-matrix/), [Aztec](https://scanbot.io/barcode-scanner-sdk/aztec-code/), and others
This broad support ensures that the SDK is flexible and can be utilized across different industries, including logistics, healthcare, retail, and more.
### **Is there a trial version available for the UWP Barcode Scanner SDK?**
Yes, a **7-day free trial license** is available for the Scanbot UWP Barcode Scanner SDK. To request a trial, visit the Scanbot SDK [trial page](https://scanbot.io/trial/), fill out the required form, and you will receive a trial license key to test all SDK features.
### **Is the Scanbot UWP Barcode Scanner SDK compatible with different Windows devices?**
Yes, the Scanbot UWP Barcode Scanner SDK is compatible with a wide range of Windows devices, including:
\- Windows 10 version 1809 or higher
\- Architectures: x86, x64, ARM, and ARM64
### **How do I customize the UWP Barcode Scanner UI?**
The Scanbot UWP Barcode Scanner SDK provides customizable UI components that allow you to adjust the scanner’s interface according to your app’s design and user experience needs. Customization options include:
1\. Overlay design and colors
2\. Button styles
3\. Success and error feedback messages
These options make it easier to integrate barcode scanning functionality into your UWP app while maintaining your branding and app design.
If you need more customization options, you can also integrate the SDK using Classical Components – giving you complete freedom over the design of the Scanner UI.
### **What platforms are supported besides UWP?**
In addition to UWP, the Scanbot SDK is available on a variety of other platforms, making it versatile for developers working on multiple platforms. Supported platforms include:
1\. [iOS](https://scanbot.io/developer/ios-barcode-scanner-sdk/)
2\. [Android](https://scanbot.io/developer/android-barcode-scanner/)
3\. [JavaScript](https://scanbot.io/developer/javascript-barcode-scanner/) (Web)
4\. [Flutter](https://scanbot.io/developer/flutter-barcode-scanner/)
5\. [React Native](https://scanbot.io/developer/react-native-barcode-scanner/)
6\. [Cordova](https://scanbot.io/developer/cordova-barcode-scanner-plugin/)
7\. [Capacitor](https://scanbot.io/developer/capacitor-barcode-scanner-sdk/) / [Ionic](https://scanbot.io/developer/ionic-barcode-scanner/)
8\. [Xamarin](https://scanbot.io/developer/xamarin-barcode-scanner/)
9\. [.NET MAUI](https://scanbot.io/developer/net-maui-barcode-scanner-sdk/)
10\. [Linux](https://scanbot.io/developer/linux-barcode-scanner/)
This broad platform support ensures that barcode scanning functionality can be integrated across various environments, including mobile, desktop, and web applications.
+
## Prevent Barcode Misreads
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/blog/prevent-barcode-scanner-misreads/?utm_source=chatgpt.com#main)
When barcode scanners decode incorrect information, workflows can grind to a halt or – worse – continue with false information. In mission-critical operations, like warehouse and inventory management or at the point-of-sale (POS), this can have far-reaching consequences.
## What is a false positive barcode scan?
A false positive barcode scan occurs when a barcode scanner misidentifies a foreign pattern or noise on a barcode as a valid part of it. The result: Since the barcode reader will show a seemingly correct value, all dependent operations will proceed as usual. In reality, however, the scanned data is incorrect.
In real-world workflows, checking every single scanned barcode for correctness is impossible. False positives may go undetected, to be noticed only once the damage has already been done. This is why barcodes that have been scanned incorrectly are more dangerous than ones that haven’t been scanned at all.
## Why do barcode scanners read barcodes incorrectly?
Several factors influence how often barcode scanners produce false positives. Some are environmental, others are related to scanner technology and settings.
### Damaged barcodes

When barcodes are damaged or faded and have smudges or uneven spots, a barcode scanner might interpret that additional noise as a legitimate barcode pattern and decode it accordingly. In those cases, the barcode’s bad condition makes it difficult for scanners to extract the correct data accurately.
### Real-world conditions

In real-life operations, ideal scanning conditions aren’t a given. Lighting, distance, and scanner alignment are just three common issues.
The lighting can be too harsh – or too poor – which impacts a scanner’s ability to read barcodes accurately, potentially causing false positives and failed scans. Distance matters because barcodes can be both too close or too far away for reliable scans.
Some scanners’ performance relies on the alignment of the scanner and barcode. Unsophisticated laser barcode scanners, for instance, must be placed such that the laser line is at an angle of 90 degrees to the bars of the barcode.

### Scanner-related issues
Laser scanners and camera-based scanners are two of the most popular choices for barcode scanners. They are usually very reliable, especially compared to manual entry. Still,, even these solutions are not immune to scanning false positives.
For instance, [laser barcode scanners](https://scanbot.io/blog/how-does-a-laser-barcode-scanner-work/) famously struggle with [inverted barcodes](https://scanbot.io/blog/how-to-scan-an-inverted-barcode/). Besides that, their laser light has to hit barcodes at a certain angle for accurate scanning. If they are mounted or handled incorrectly, false positives are more likely.
Camera-based barcode scanners, on the other hand, can scan inverted barcodes with the help of automatic detection modes. Their advanced image processing techniques enable them to identify and decode heavily damaged 2D barcodes accurately. However, their scan accuracy is tied to the camera’s quality. A low camera resolution, for instance, can result in more misreads.
What both laser- and camera-based scanners have in common is that certain settings can heighten the risk of receiving false positives. Higher sensitivity settings, in particular, help read faded or damaged barcodes, but they also make the scanner more prone to misinterpreting non-barcode patterns and noise as part of a barcode. Lowered sensitivity means that low-contrast barcodes may fail to scan accurately – a no-win situation.
In general, mobile devices enhanced with barcode scanning software will produce fewer false positives. However, today’s barcode scanner software options differ vastly in scan quality.
## Minimize the risk of false positives with mobile barcode scanners
At first glance, [open-source solutions and other free barcode scanning libraries](https://scanbot.io/blog/ml-kit-vs-zxing/) may seem like good, cost-efficient options. However, they have several disadvantages that can make them more prone to misreading. Open-source libraries often struggle with high-volume use cases, certain barcode symbologies, inadequate lighting, and device compatibility.
If you already use such a solution, limit the barcode scanner to only the types you expect to read. This will reduce the likelihood of the scanner misinterpreting other patterns (such as smudges or noise) as valid barcodes.
If this doesn’t solve the problem, consider switching to a solution that delivers higher accuracy and fewer false positives.
For mission-critical use cases, commercial solutions are your best bet. Not only do they often perform more reliably to begin with, they also come with extensive customer support. Should false positive scans occur, you can rely on developers committed to improving the solution.
The Scanbot [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) comes at a flat annual fee that is independent of the number of users or scans. We at Scanbot SDK know the impact that real-world conditions have on scan quality. That is why we ensured that the SDK scans even damaged, tiny, and distant barcodes – even in low-light environments.
The SDK scans all major barcode types. With our [AR overlay](https://scanbot.io/blog/how-to-use-our-barcode-scanner-ar-overlay/), users get real-time feedback on the scanning process, helping them achieve the best result possible. Complete data privacy is guaranteed: The SDK functions entirely offline, without connection to servers or usage tracking.
To troubleshoot false positives, integration challenges, or any other issue, our support engineers and a dedicated Customer Success Manager are always happy to help via Slack or Teams.
Experience the SDK yourself by trying our [free Barcode Scanner demo apps](https://scanbot.io/demo-apps/) or running our [example apps](https://github.com/doo/scanbot-sdk-examples/) for various platforms. If you’d like to test the SDK in your app, generate a [free 7-day trial license](https://scanbot.io/trial/) to start integration immediately.
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Related blog posts
[](https://scanbot.io/blog/how-to-read-damaged-or-blurry-barcodes/)
### [How to read damaged or blurry barcodes](https://scanbot.io/blog/how-to-read-damaged-or-blurry-barcodes/)
As barcodes are used in all kinds of environments, they are susceptible to being scratched, deformed, or rendered illegible in other ways. Let’s look at the most common problems...

Kevin January 11, 20246 mins read
[](https://scanbot.io/blog/how-to-scan-an-inverted-barcode/)
### [How to scan an inverted barcode](https://scanbot.io/blog/how-to-scan-an-inverted-barcode/)
How does a barcode scanner recognize that a barcode is inverted and still scan it accurately? Here's the answer!

Kevin July 30, 20244 mins read
[](https://scanbot.io/blog/how-does-a-laser-barcode-scanner-work/)
### [How does a laser barcode scanner work?](https://scanbot.io/blog/how-does-a-laser-barcode-scanner-work/)
How does a laser scanner transform the black and white lines of a barcode into human-readable information? Let's find out!

Johanna October 22, 20244 mins read
+
## Flutter Barcode Scanner Tutorial
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/techblog/flutter-barcode-scanner-package-android-tutorial/?utm_source=chatgpt.com#main)
This tutorial shows how to create a simple barcode scanning app in Flutter using the [**flutter\_barcode\_scanner**](https://pub.dev/packages/flutter_barcode_scanner) package. While this library hasn’t been updated in years, it’s still widely used for both Android and iOS apps.
This guide covers installation, configuration, basic usage, and solutions to common problems. For this tutorial, we’ll focus on testing with an Android application.
## Setting up the project
Before diving into the code, let’s set up the Flutter project and install the necessary dependencies.
### Step 1: Create a new Flutter project
To create the Flutter project, open your terminal and run the following commands:
```hljs undefined
flutter create barcode_scanner_app
cd barcode_scanner_app
```
### Step 2: Add dependencies to **pubspec.yaml**
Now add the **flutter\_barcode\_scanner** package to **barcode\_scanner\_app/pubspec.yaml**.
You can either use the [original package](https://pub.dev/packages/flutter_barcode_scanner) …
```hljs yaml
dependencies:
flutter:
sdk: flutter
flutter_barcode_scanner: ^2.0.0
```
… or a [fork](https://github.com/decodevM/flutter_barcode_scanner) that includes fixes for Android:
```hljs yaml
dependencies:
flutter:
sdk: flutter
flutter_barcode_scanner:
git:
url: https://github.com/decodevM/flutter_barcode_scanner.git
ref: master
```
To install the dependencies, run the following command in your terminal:
```hljs csharp
flutter pub get
```
We’ll need to access the device camera to scan barcodes. Therefore, open **android/app/src/main/AndroidManifest.xml** and add the necessary permissions:
```hljs html
```
### Step 3: Fixes for Android building
To ensure compatibility with newer Android versions and resolve common build issues, apply the following fixes to your application.
#### 1\. Update `minSdkVersion`
Open **android/app/build.gradle** and set the `minSdkVersion` to at least **21**:
```hljs undefined
defaultConfig {
minSdkVersion 21
targetSdkVersion 33
}
```
#### 2\. Set the correct NDK version
This package requires a specific Android NDK version ( **27.0.12077973**). First, check your installed NDK versions by running:
```hljs undefined
sdkmanager --list | grep ndk
```
💡 You can also check the installed NDK versions in Android Studio:
1. Go to **Tools > SDK Manager**.
2. Open the **SDK Tools** tab.
3. Check the **Show Package Details** box and look for **NDK (Side by side)**. The installed versions will be listed there.

If the required version is missing, install it using the following command or via Android Studio’s SDK Manager:
```hljs cpp
sdkmanager "ndk;27.0.12077973"
```
Then update **android/app/build.gradle**:
```hljs cpp
android {
ndkVersion "27.0.12077973"
}
```
#### 3\. Fix namespace issue for Android Gradle Plugin (AGP 7.0+)
If you encounter a “Namespace not specified” error, manually add a namespace in the package directory. Navigate to the package location …
```hljs swift
cd ~/.pub-cache/hosted/pub.dev/flutter_barcode_scanner-2.0.0/android
```
… then add the following to the **build.gradle** file located there:
```hljs dart
android {
namespace 'com.amolg.flutterbarcodescanner'
}
```
## Basic implementation
Now we’ll implement a minimal barcode scanning feature. To start, open **lib/main.dart** and import the required packages.
```hljs dart
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_barcode_scanner/flutter_barcode_scanner.dart';
```
Next, define the `main` application:
```hljs csharp
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Barcode Scanner Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
),
home: const MyHomePage(title: 'Barcode Scanner Demo'),
);
}
}
```
We need to initialize the `scanBarcode` method (declared inside a `try except` block to handle errors) with four parameters:
```hljs dart
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State createState() => _MyHomePageState();
}
class _MyHomePageState extends State {
String _scanResult = "";
Future scanCode() async {
String barcodeScanRes;
try {
barcodeScanRes = await FlutterBarcodeScanner.scanBarcode(
"#ff6666", // Red scanning line
"Cancel",
true, // Show flash toggle
ScanMode.BARCODE,
);
} on PlatformException {
barcodeScanRes = "Failed to scan";
}
setState(() {
_scanResult = barcodeScanRes;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [\
const Text('Scan Result:', style: TextStyle(fontSize: 16)),\
const SizedBox(height: 8),\
Text(\
_scanResult.isEmpty ? 'No scan yet' : _scanResult,\
style: const TextStyle(\
fontSize: 20,\
fontWeight: FontWeight.bold,\
color: Colors.blue,\
),\
),\
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: scanCode,
tooltip: 'Scan Barcode',
child: const Icon(Icons.qr_code_scanner),
),
);
}
}
```
With this, we’ve built a basic barcode scanning app. Try it out if you like:
```hljs undefined
flutter run
```

You might notice that the camera stream’s aspect ratio is wrong. Unfortunately, this is a common issue with the **flutter\_barcode\_scanner** package. More on this further down.
## Advanced features
The **flutter\_barcode\_scanner** library provides additional capabilities to add to your barcode scanner app.
### 1\. Different scanning modes
The `flutter_barcode_scanner` supports three scan modes:
| Scan Mode | Description |
| --- | --- |
| `ScanMode.BARCODE` | Restricts scanning to 1D barcodes. |
| `ScanMode.QR` | Restricts scanning to 2D barcodes. |
| `ScanMode.DEFAULT` | Scans both 1D and 2D barcodes. |
Restricting scanning to certain barcode types prevents accidental scans and improves the scanner’s performance, as it doesn’t need to check for each supported symbology.

### 2\. Customizing the scanner’s appearance
You can change the scanner’s appearance by modifying the following parameters:
| Parameter | Example Value | Description |
| --- | --- | --- |
| `COLOR_CODE` | `"#ff6666"` | HEX color for the scanning line. |
| `CANCEL_BUTTON_TEXT` | `"Cancel"` | Custom text for the cancel button. |
| `isShowFlashIcon` | `true` | Whether to show the flash toggle button. |
The following code snippet shows an example of how to define the appearance configurations:
```hljs csharp
Future scanWithCustomAppearance() async {
String barcodeScanRes;
try {
barcodeScanRes = await FlutterBarcodeScanner.scanBarcode(
"#4CAF50", // Green scanning line
"Close", // Custom cancel button text
true, // Enable flash toggle
ScanMode.DEFAULT,
);
} on PlatformException {
barcodeScanRes = "Failed to scan";
}
setState(() {
_scanResult = barcodeScanRes;
});
}
```
### 3\. Continuous barcode scanning
By default, the scanner stops after detecting a barcode. To enable continuous scanning, you need to use a stream listener ( `listen`), as shown in the following code snippet:
```hljs csharp
void startContinuousScanning() {
FlutterBarcodeScanner.getBarcodeStreamReceiver(
"#ff6666",
"Cancel",
true,
ScanMode.DEFAULT,
)?.listen((barcode) {
if (barcode != '-1') {
setState(() {
_scanResult = barcode;
});
}
});
}
```
In the above code example, the scanner listens for barcodes ( `barcode`). If the scan result is not `-1`, meaning it wasn’t canceled, it updates the `_scanResult` state to ensure all barcode results are available after the scanning stops.

Unfortunately, the continuous scanning mode lacks an indication of which barcodes have been successfully scanned. Worse still, barcodes outside the [viewfinder](https://scanbot.io/techblog/implementing-a-barcode-scanner-viewfinder/) are also picked up, leading to unexpected entries in the results list. When using the **flutter\_barcode\_scanner** package in your project, you might want to remedy this with your own code.
## Disadvantages of using the flutter\_barcode\_scanner package to scan barcodes
While the **flutter\_barcode\_scanner** package can be useful for quickly prototyping a Flutter app with barcode scanning functionalities, its lack of maintenance results in compatibility issues with modern Flutter, Android, and iOS environments. Issues users have faced when integrating the package into their Flutter apps include:
- Wrong aspect ratio of the camera stream
- Problems compiling with newer Flutter versions
- Incompatibility with older devices
- Black screen when trying to scan a barcode
- Crashes on startup
For companies that heavily rely on barcode scanning in their business processes, we recommend using an enterprise-grade solution instead.
## Building a Flutter Barcode Scanner with the Scanbot SDK
We developed the Scanbot [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) to help enterprises overcome the hurdles presented by free barcode scanning software. Our goal was to have a developer-friendly solution available for a wide range of platforms that consistently delivers high-quality results – even in challenging circumstances.
With the SDK’s Ready-to-Use UI Components, you can even use an AR overlay to display multiple barcodes’ contents directly in the viewfinder, enhancing the scanning experience.
Scanning a single barcode
Scanning multiple barcodes with the AR overlay
Setting up a Flutter app to scan 1D or 2D barcodes is straightforward. We’re going to follow these steps:
1. Prepare the project.
2. Install the SDK.
3. Initialize the SDK.
4. Implement the scanning modules.
5. Start scanning barcodes!
### Requirements
To develop Flutter applications for Android and iOS, ensure you have the following:
1. **Flutter SDK**: [Download the latest version](https://flutter.dev/docs/get-started/install) for your OS.
2. **Dart SDK**: No separate installation needed, since it’s integrated with Flutter.
3. **The right IDEs for your target platforms:**
1. [Android Studio](https://developer.android.com/studio) to develop for Android. It includes the Android SDK and AVD Manager.
2. [Xcode](https://developer.apple.com/xcode/) for iOS development on macOS.
3. You can also use [Visual Studio Code](https://code.visualstudio.com/), which supports Flutter plugins.
⚠️ **A note to Windows users:** A Mac is necessary to build and test iOS apps. Consider using a remote Mac service or a physical Mac as a build server.
### 1\. Preparing the project
First, create a new directory for your project and navigate into it:
```hljs undefined
mkdir test-flutter
cd test-flutter
```
Create a new Flutter project:
```hljs undefined
flutter create test_barcode_scanner
cd test_barcode_scanner
```
Since we need access to the device camera to scan barcodes, let’s add the necessary **camera permissions** for Android and iOS.
Add camera permissions to `android/app/src/main/AndroidManifest.xml`:
```hljs html
```
And in `ios/Runner/Info.plist`:
```hljs html
NSCameraUsageDescription
We need camera access to scan barcodes.
```
### 2\. Installing the SDK
Add the Scanbot Flutter Barcode Scanner package to your `pubspec.yaml`:
```hljs yaml
dependencies:
flutter:
sdk: flutter
barcode_scanner: ^5.1.0
```
Run the following commnand to install the packages:
```hljs csharp
flutter pub get
```
💡 Please refer to our [changelog](https://docs.scanbot.io/barcode-scanner-sdk/flutter/changelog/) for the latest version of the Barcode Scanner SDK.
Now that the project is set up, we can integrate the barcode scanning functionalities.
### 3\. Initializing the SDK
Initialize the SDK in `main.dart`:
```hljs typescript
import 'package:flutter/material.dart';
import 'package:barcode_scanner/scanbot_barcode_sdk_v2.dart';
const BARCODE_SDK_LICENSE_KEY = "";
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
State createState() => _MyHomePageState();
}
class _MyHomePageState extends State {
@override
void initState() {
super.initState();
_initScanbotSdk();
}
Future _initScanbotSdk() async {
var config = ScanbotSdkConfig(
licenseKey: BARCODE_SDK_LICENSE_KEY,
loggingEnabled: true,
);
try {
await ScanbotBarcodeSdk.initScanbotSdk(config);
print('Scanbot SDK initialized successfully');
} catch (e) {
print('Error initializing Scanbot SDK: $e');
}
}
@override
Widget build(BuildContext context) {
...
}
```
💡 Without a license key, our SDK only runs for 60 seconds per session. This is more than enough for the purposes of our tutorial, but if you like, you can [generate a license key](https://scanbot.io/trial/) using your [applicationId](https://docs.scanbot.io/barcode-scanner-sdk/flutter/detailed-setup-guide/sdk-initialization/#app-identifier).
### 4\. Implementing the scanning modes
The SDK’s [RTU UI components](https://docs.scanbot.io/barcode-scanner-sdk/flutter/barcode-scanner/ready-to-use-ui/) make it easy to deploy our Flutter Barcode Scanner package’s different scanning modes in your app. Let’s start with the simplest use case: single-barcode scanning.
Implement the barcode scanning functionality:
```hljs dart
void _startBarcodeScanning() async {
try {
// Create the default configuration object.
var configuration = BarcodeScannerConfiguration();
// Initialize the use case for single scanning.
var scanningMode = SingleScanningMode();
// Enable and configure the confirmation sheet.
scanningMode.confirmationSheetEnabled = true;
scanningMode.sheetColor = ScanbotColor("#FFFFFF");
// Hide/unhide the barcode image.
scanningMode.barcodeImageVisible = true;
// Configure the barcode title of the confirmation sheet.
scanningMode.barcodeTitle.visible = true;
scanningMode.barcodeTitle.color = ScanbotColor("#000000");
// Configure the barcode subtitle of the confirmation sheet.
scanningMode.barcodeSubtitle.visible = true;
scanningMode.barcodeSubtitle.color = ScanbotColor("#000000");
// Configure the cancel button of the confirmation sheet.
scanningMode.cancelButton.text = "Close";
scanningMode.cancelButton.foreground.color = ScanbotColor("#C8193C");
scanningMode.cancelButton.background.fillColor = ScanbotColor("#00000000");
// Configure the submit button of the confirmation sheet.
scanningMode.submitButton.text = "Submit";
scanningMode.submitButton.foreground.color = ScanbotColor("#FFFFFF");
scanningMode.submitButton.background.fillColor = ScanbotColor("#C8193C");
// Configure other parameters, pertaining to single-scanning mode as needed.
configuration.useCase = scanningMode;
// Set an array of accepted barcode types.
// configuration.recognizerConfiguration.barcodeFormats = [\
// scanbotV2.BarcodeFormat.AZTEC,\
// scanbotV2.BarcodeFormat.PDF_417,\
// scanbotV2.BarcodeFormat.QR_CODE,\
// scanbotV2.BarcodeFormat.MICRO_QR_CODE,\
// scanbotV2.BarcodeFormat.MICRO_PDF_417,\
// scanbotV2.BarcodeFormat.ROYAL_MAIL,\
/// .....\
// ];
// Configure other parameters as needed.
var result = await ScanbotBarcodeSdk.startBarcodeScanner(configuration);
if(result.operationResult == OperationResult.SUCCESS)
{
// TODO: present barcode result as needed
print(result.value?.items.first.type?.name);
}
} catch (e) {
print('Error: $e');
}
}
```
Now let’s go to the `build` method and add the button on the start screen so it calls our `_startBarcodeScanning` method when clicked:
```hljs typescript
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Barcode Scanner'),
),
body: Center(
child: ElevatedButton(
onPressed: _startBarcodeScanning,
style: ElevatedButton.styleFrom(
padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 40),
textStyle: const TextStyle(fontSize: 18),
),
child: const Text("Start single-barcode scanning"),
),
),
);
}
```
If you like, you can build and run the app to see if everything is working correctly so far:
```hljs undefined
flutter run
```

In the next step, we’re going to insert both the multi-barcode scanning and the AR overlay modules.
Let’s create two more methods, `_startBarcodeMultiScanning` and `_startAROverlay`:
```hljs dart
void _startBarcodeMultiScanning() async {
try {
// Create the default configuration object.
var configuration = BarcodeScannerConfiguration();
// Initialize the use case for multiple scanning.
var scanningMode = MultipleScanningMode();
// Set the counting mode.
scanningMode.mode = MultipleBarcodesScanningMode.COUNTING;
// Set the sheet mode for the barcodes preview.
scanningMode.sheet.mode = SheetMode.COLLAPSED_SHEET;
// Set the height for the collapsed sheet.
scanningMode.sheet.collapsedVisibleHeight = CollapsedVisibleHeight.LARGE;
// Enable manual count change.
scanningMode.sheetContent.manualCountChangeEnabled = true;
// Set the delay before same barcode counting repeat.
scanningMode.countingRepeatDelay = 1000;
// Configure the submit button.
scanningMode.sheetContent.submitButton.text = "Submit";
scanningMode.sheetContent.submitButton.foreground.color =
ScanbotColor("#000000");
// Configure other parameters, pertaining to multiple-scanning mode as needed.
configuration.useCase = scanningMode;
// Set an array of accepted barcode types.
// configuration.recognizerConfiguration.barcodeFormats = [\
// BarcodeFormat.AZTEC,\
// BarcodeFormat.PDF_417,\
// BarcodeFormat.QR_CODE,\
// BarcodeFormat.MICRO_QR_CODE,\
// BarcodeFormat.MICRO_PDF_417,\
// BarcodeFormat.ROYAL_MAIL,\
/// .....\
// ];
// Configure other parameters as needed.
var result = await ScanbotBarcodeSdk.startBarcodeScanner(configuration);
if(result.operationResult == OperationResult.SUCCESS)
{
// TODO: present barcode result as needed
print(result.value?.items.first.type?.name);
}
} catch (e) {
print('Error: $e');
}
}
```
```hljs dart
void _startAROverlay() async {
try {
// Create the default configuration object.
var configuration = new BarcodeScannerConfiguration();
// Configure the usecase.
var usecase = new MultipleScanningMode();
usecase.mode = MultipleBarcodesScanningMode.UNIQUE;
usecase.sheet.mode = SheetMode.COLLAPSED_SHEET;
usecase.sheet.collapsedVisibleHeight = CollapsedVisibleHeight.SMALL;
// Configure AR Overlay.
usecase.arOverlay.visible = true;
usecase.arOverlay.automaticSelectionEnabled = false;
// Set the configured usecase.
configuration.useCase = usecase;
// Set an array of accepted barcode types.
// configuration.recognizerConfiguration.barcodeFormats = [\
// BarcodeFormat.AZTEC,\
// BarcodeFormat.PDF_417,\
// BarcodeFormat.QR_CODE,\
// BarcodeFormat.MICRO_QR_CODE,\
// BarcodeFormat.MICRO_PDF_417,\
// BarcodeFormat.ROYAL_MAIL,\
/// .....\
// ];
var result = await ScanbotBarcodeSdk.startBarcodeScanner(configuration);
if (result.operationResult == OperationResult.SUCCESS) {
// TODO: present barcode result as needed
print(result.value?.items.first.type?.name);
}
} catch (e) {
print('Error: $e');
}
}
```
And let’s not forget to insert the buttons:
```hljs yaml
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Barcode Scanner'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [\
ElevatedButton(\
onPressed: _startBarcodeScanning,\
style: ElevatedButton.styleFrom(\
padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 40),\
textStyle: const TextStyle(fontSize: 18),\
),\
child: const Text("Start single-barcode scanning"),\
),\
const SizedBox(height: 20),\
ElevatedButton(\
onPressed: _startBarcodeMultiScanning,\
style: ElevatedButton.styleFrom(\
padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 40),\
textStyle: const TextStyle(fontSize: 18),\
),\
child: const Text("Start multi-barcode scanning"),\
),\
const SizedBox(height: 20),\
ElevatedButton(\
onPressed: _startAROverlay,\
style: ElevatedButton.styleFrom(\
padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 40),\
textStyle: const TextStyle(fontSize: 18),\
),\
child: const Text("Start the AR overlay"),\
),\
],
),
),
);
}
```
Your final `main.dart` should look something like this:
```hljs dart
import 'package:flutter/material.dart';
import 'package:barcode_scanner/scanbot_barcode_sdk_v2.dart';
const BARCODE_SDK_LICENSE_KEY = "";
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
State createState() => _MyHomePageState();
}
class _MyHomePageState extends State {
@override
void initState() {
super.initState();
_initScanbotSdk();
}
Future _initScanbotSdk() async {
var config = ScanbotSdkConfig(
licenseKey: BARCODE_SDK_LICENSE_KEY,
loggingEnabled: true,
);
try {
await ScanbotBarcodeSdk.initScanbotSdk(config);
print('Scanbot SDK initialized successfully');
} catch (e) {
print('Error initializing Scanbot SDK: $e');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Barcode Scanner'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [\
ElevatedButton(\
onPressed: _startBarcodeScanning,\
style: ElevatedButton.styleFrom(\
padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 40),\
textStyle: const TextStyle(fontSize: 18),\
),\
child: const Text("Start single-barcode scanning"),\
),\
const SizedBox(height: 20),\
ElevatedButton(\
onPressed: _startBarcodeMultiScanning,\
style: ElevatedButton.styleFrom(\
padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 40),\
textStyle: const TextStyle(fontSize: 18),\
),\
child: const Text("Start multi-barcode scanning"),\
),\
const SizedBox(height: 20),\
ElevatedButton(\
onPressed: _startAROverlay,\
style: ElevatedButton.styleFrom(\
padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 40),\
textStyle: const TextStyle(fontSize: 18),\
),\
child: const Text("Start the AR overlay"),\
),\
],
),
),
);
}
void _startBarcodeScanning() async {
try {
// Create the default configuration object.
var configuration = BarcodeScannerConfiguration();
// Initialize the use case for single scanning.
var scanningMode = SingleScanningMode();
// Enable and configure the confirmation sheet.
scanningMode.confirmationSheetEnabled = true;
scanningMode.sheetColor = ScanbotColor("#FFFFFF");
// Hide/unhide the barcode image.
scanningMode.barcodeImageVisible = true;
// Configure the barcode title of the confirmation sheet.
scanningMode.barcodeTitle.visible = true;
scanningMode.barcodeTitle.color = ScanbotColor("#000000");
// Configure the barcode subtitle of the confirmation sheet.
scanningMode.barcodeSubtitle.visible = true;
scanningMode.barcodeSubtitle.color = ScanbotColor("#000000");
// Configure the cancel button of the confirmation sheet.
scanningMode.cancelButton.text = "Close";
scanningMode.cancelButton.foreground.color = ScanbotColor("#C8193C");
scanningMode.cancelButton.background.fillColor = ScanbotColor("#00000000");
// Configure the submit button of the confirmation sheet.
scanningMode.submitButton.text = "Submit";
scanningMode.submitButton.foreground.color = ScanbotColor("#FFFFFF");
scanningMode.submitButton.background.fillColor = ScanbotColor("#C8193C");
// Configure other parameters, pertaining to single-scanning mode as needed.
configuration.useCase = scanningMode;
// Set an array of accepted barcode types.
// configuration.recognizerConfiguration.barcodeFormats = [\
// scanbotV2.BarcodeFormat.AZTEC,\
// scanbotV2.BarcodeFormat.PDF_417,\
// scanbotV2.BarcodeFormat.QR_CODE,\
// scanbotV2.BarcodeFormat.MICRO_QR_CODE,\
// scanbotV2.BarcodeFormat.MICRO_PDF_417,\
// scanbotV2.BarcodeFormat.ROYAL_MAIL,\
/// .....\
// ];
// Configure other parameters as needed.
var result = await ScanbotBarcodeSdk.startBarcodeScanner(configuration);
if(result.operationResult == OperationResult.SUCCESS)
{
// TODO: present barcode result as needed
print(result.value?.items.first.type?.name);
}
} catch (e) {
print('Error: $e');
}
}
void _startBarcodeMultiScanning() async {
try {
// Create the default configuration object.
var configuration = BarcodeScannerConfiguration();
// Initialize the use case for multiple scanning.
var scanningMode = MultipleScanningMode();
// Set the counting mode.
scanningMode.mode = MultipleBarcodesScanningMode.COUNTING;
// Set the sheet mode for the barcodes preview.
scanningMode.sheet.mode = SheetMode.COLLAPSED_SHEET;
// Set the height for the collapsed sheet.
scanningMode.sheet.collapsedVisibleHeight = CollapsedVisibleHeight.LARGE;
// Enable manual count change.
scanningMode.sheetContent.manualCountChangeEnabled = true;
// Set the delay before same barcode counting repeat.
scanningMode.countingRepeatDelay = 1000;
// Configure the submit button.
scanningMode.sheetContent.submitButton.text = "Submit";
scanningMode.sheetContent.submitButton.foreground.color =
ScanbotColor("#000000");
// Configure other parameters, pertaining to multiple-scanning mode as needed.
configuration.useCase = scanningMode;
// Set an array of accepted barcode types.
// configuration.recognizerConfiguration.barcodeFormats = [\
// BarcodeFormat.AZTEC,\
// BarcodeFormat.PDF_417,\
// BarcodeFormat.QR_CODE,\
// BarcodeFormat.MICRO_QR_CODE,\
// BarcodeFormat.MICRO_PDF_417,\
// BarcodeFormat.ROYAL_MAIL,\
/// .....\
// ];
// Configure other parameters as needed.
var result = await ScanbotBarcodeSdk.startBarcodeScanner(configuration);
if(result.operationResult == OperationResult.SUCCESS)
{
// TODO: present barcode result as needed
print(result.value?.items.first.type?.name);
}
} catch (e) {
print('Error: $e');
}
}
void _startAROverlay() async {
try {
// Create the default configuration object.
var configuration = new BarcodeScannerConfiguration();
// Configure the usecase.
var usecase = new MultipleScanningMode();
usecase.mode = MultipleBarcodesScanningMode.UNIQUE;
usecase.sheet.mode = SheetMode.COLLAPSED_SHEET;
usecase.sheet.collapsedVisibleHeight = CollapsedVisibleHeight.SMALL;
// Configure AR Overlay.
usecase.arOverlay.visible = true;
usecase.arOverlay.automaticSelectionEnabled = false;
// Set the configured usecase.
configuration.useCase = usecase;
// Set an array of accepted barcode types.
// configuration.recognizerConfiguration.barcodeFormats = [\
// BarcodeFormat.AZTEC,\
// BarcodeFormat.PDF_417,\
// BarcodeFormat.QR_CODE,\
// BarcodeFormat.MICRO_QR_CODE,\
// BarcodeFormat.MICRO_PDF_417,\
// BarcodeFormat.ROYAL_MAIL,\
/// .....\
// ];
var result = await ScanbotBarcodeSdk.startBarcodeScanner(configuration);
if (result.operationResult == OperationResult.SUCCESS) {
// TODO: present barcode result as needed
print(result.value?.items.first.type?.name);
}
} catch (e) {
print('Error: $e');
}
}
}
```
Now let’s build and run the app again so we can try out our new scanning modules.
### 5\. Scanning some barcodes!
Now you can go ahead and scan 1D and 2D barcodes – one after the other, many at the same time, and even with an AR overlay that lets you preview their values!

And if you’re in need of some sample barcodes for testing purposes, we’ve got you covered:

If this tutorial has piqued your interest in integrating barcode scanning functionalities into your Flutter app, make sure to take a look at our SDK’s other neat features in our [documentation](https://docs.scanbot.io/barcode-scanner-sdk/flutter/barcode-scanner/ready-to-use-ui/).
Should you have questions about this tutorial or ran into any issues, we’re happy to help! Just shoot us an email via [tutorial-support@scanbot.io](mailto:tutorial-support@scanbot.io).
Happy coding!
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Related blog posts
[](https://scanbot.io/techblog/integrate-android-barcode-scanner-library/)
### [How to build an Android Barcode Scanner with Kotlin in Android Studio](https://scanbot.io/techblog/integrate-android-barcode-scanner-library/)
In this tutorial, we'll create an Android app for scanning barcodes and QR codes using Kotlin and Android Studio.

Kevin June 26, 202514 mins read
[](https://scanbot.io/techblog/how-to-build-a-cross-platform-barcode-scanner/)
### [How to build a cross-platform barcode scanner app (in React Native, Flutter, .NET MAUI, and Capacitor)](https://scanbot.io/techblog/how-to-build-a-cross-platform-barcode-scanner/)
Learn how to build a mobile barcode scanning app using four popular frameworks.

Kevin February 27, 202532 mins read
[](https://scanbot.io/techblog/ios-barcode-scanner-sdk-integration-tutorial/)
### [Building an iOS Barcode Scanner in Xcode using Storyboards](https://scanbot.io/techblog/ios-barcode-scanner-sdk-integration-tutorial/)
Learn how to build an iOS app for reading barcodes and QR codes in Xcode using Swift.

Kevin April 21, 20259 mins read
+
## Industry Solutions Overview
https://scanbot.io/solutions/healthcare/2025-07-14T15:02:37+00:00https://scanbot.io/solutions/retail/2025-07-14T15:01:57+00:00https://scanbot.io/solutions/manufacturing-supply-chain/2025-06-16T12:44:51+00:00https://scanbot.io/solutions/finance-banking/2025-04-04T13:49:47+00:00https://scanbot.io/solutions/technology-software/2025-03-10T12:38:49+00:00https://scanbot.io/solutions/insurance/2025-01-29T07:02:40+00:00https://scanbot.io/solutions/freight-logistics/2025-01-29T06:59:21+00:00https://scanbot.io/solutions/hospitality-travel/2024-12-13T16:25:38+00:00
## Scanbot SDK Overview
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/social-links/#main)
[Visit website\\
arrow\_outward](https://scanbot.io/)
# Learn more about Scanbot SDK
[Careerscall\_made](https://scanbot.io/careers/) [Blogcall\_made](https://scanbot.io/blog/)
[Cookie preferences](https://scanbot.io/social-links/#)
+
## HTML5 Barcode Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/techblog/html5-barcode-scanner-tutorial/#main)
In this tutorial, we’ll use the [html5-qrcode](https://github.com/mebjas/html5-qrcode) library to create a web app for scanning 1D and 2D barcodes with just a few lines of HTML and JavaScript code. This library runs in most desktop and mobile browsers and supports scanning barcodes from a live camera stream as well as image files.

We’ll set up our scanner in three simple steps:
1. Creating the HTML page
2. Using JavaScript to initialize and configure the scanner
3. Linking the JavaScript file to the HTML page
Let’s get started!
## Step 1: Create the HTML page
In your project folder, create an **index.html** file with the usual boilerplate.
```hljs html
HTML5 Barcode Scanner
```
## Step 2: Use JavaScript to initialize and configure the scanner
Next, create a **script.js** file in the same folder. To set up our scanner, we can copy and paste a code snippet that the library’s developer has provided in a [gist on GitHub](https://gist.github.com/mebjas/729c5397506a879ec704075c8a5284e8#file-html5-qrcode-demo-js):
```hljs javascript
function docReady(fn) {
// see if DOM is already available
if (document.readyState === "complete" || document.readyState === "interactive") {
// call on next available tick
setTimeout(fn, 1);
} else {
document.addEventListener("DOMContentLoaded", fn);
}
}
docReady(function() {
var resultContainer = document.getElementById('qr-reader-results');
var lastResult, countResults = 0;
var html5QrcodeScanner = new Html5QrcodeScanner(
"qr-reader", { fps: 10, qrbox: 250 });
function onScanSuccess(decodedText, decodedResult) {
if (decodedText !== lastResult) {
++countResults;
lastResult = decodedText;
console.log(`Scan result = ${decodedText}`, decodedResult);
resultContainer.innerHTML += `[${countResults}] - ${decodedText}
`;
// Optional: To close the QR code scannign after the result is found
html5QrcodeScanner.clear();
}
}
// Optional callback for error, can be ignored.
function onScanError(qrCodeError) {
// This callback would be called in case of qr code scan error or setup error.
// You can avoid this callback completely, as it can be very verbose in nature.
}
html5QrcodeScanner.render(onScanSuccess, onScanError);
});
```
## Step 3: Link the JavaScript file to the HTML page
Back in **index.html**, we need to include our **script.js** as well as the **html5-qrcode** library itself. In this tutorial, we’ll use a CDN, but you can also use `npm install` or similar methods to include the library in your project.
We also need to add two `` elements. One for the QR code scanner and one for displaying the scan result.
```hljs html
HTML5 Barcode Scanner
```
Since smartphone cameras are much better suited for scanning barcodes than laptop or desktop webcams, let’s also make sure our scanner looks good on mobile by including some simple CSS in our **index.html**:
```hljs html
HTML5 Barcode Scanner
```
To test your project on your phone, you have a few options. One option is to use a service like [ngrok](https://ngrok.com/), which creates a tunnel to one of their SSL-certified domains. Their [Quick Start](https://ngrok.com/docs/getting-started/) guide will help you get up and running quickly.
Now let’s test our app by scanning a barcode!

## Optional: Implement additional features
The html5-qrcode library offers some further [customization options](https://github.com/mebjas/html5-qrcode?tab=readme-ov-file#documentation-1). Let’s say you want to build a [PDF417 scanner](https://scanbot.io/techblog/pdf417-barcode-reader-javascript-tutorial/) that also works in poor lighting conditions. By passing a `config` object as an argument to the `Html5QrcodeScanner` constructor in **script.js**, you can …
- adapt the aspect ratio of the viewfinder to the more horizontal format of a PDF417 barcode,
- restrict scanning to PDF417 barcodes to avoid false positives,
- enable a button that turns on the device’s flashlight if it has one.
```hljs csharp
// define the config object
let config = {
fps: 10,
qrbox: {width: 300, height: 100},
formatsToSupport: [Html5QrcodeSupportedFormats.PDF_417],
showTorchButtonIfSupported: true,
};
// existing code
// pass the config object to the Html5QrcodeScanner constructor
var html5QrcodeScanner = new Html5QrcodeScanner(
"qr-reader", config);
// existing code
```

## Disadvantages of using html5-qrcode for scanning barcodes
The html5-qrcode library is easy to integrate and offers a preconfigured UI, which makes it a good choice for quick prototyping or personal projects.
However, it comes with a few drawbacks:
- **Camera issues**: Some users have reported issues with the camera not starting on specific platforms.
- **Poor performance**: Compared to alternative libraries, html5-qrcode tends to be less performant and can struggle with certain barcode types.
- **Inconsistent results**: Scanning results can vary between devices and environments, leading to unreliable performance.
- **Lack of supported symbologies:** Under the hood, html5-qrcode uses ZXing.js (another barcode scanning library that is no longer officially supported), which limits the different barcode types it can scan.
- **Difficulties when troubleshooting:** Debugging an app that uses html5-qrcode can be challenging due to insufficient documentation and unclear error messages.
For companies that heavily rely on barcode scanning in their business processes, we recommend using an enterprise-grade solution instead.
## Building an HTML5 QR Code & Barcode Scanner with the Scanbot SDK
We developed the Scanbot [Web Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/web-barcode-scanner/) to help enterprises overcome the hurdles presented by free barcode scanning software. Our goal was to have a developer-friendly solution available for a wide range of platforms that consistently delivers high-quality results – even in challenging circumstances.
Thanks to the Scanbot SDK’s Ready-to-Use UI Components, you can even use an AR overlay to display multiple barcodes’ contents right in the viewfinder.
Scanning a single barcode
Scanning multiple barcodes with the AR overlay
To accomplish that, you will need to follow the steps below:
1. Downloading the Web SDK
2. Creating the HTML page and configuring the Web SDK
3. Enabling the AR overlay
Let’s dive into more details for each step.
### Step 1: Download the Web SDK
First, create a new empty directory for your app and name it, e.g. “barcode-scanner-app”.
Then download the Scanbot SDK package directly from [the npm registry](https://registry.npmjs.org/scanbot-web-sdk/-/scanbot-web-sdk-7.0.0.tgz).
💡 You can also [use npm to download and install the package](https://docs.scanbot.io/barcode-scanner-sdk/web/detailed-setup-guide/installation/#npm), but in this tutorial, we’ll do it manually. You can check the latest SDK version in the [changelog](https://docs.scanbot.io/barcode-scanner-sdk/web/changelog/).
Unzip the downloaded files into **barcode-scanner-app**. If the unzipped folder is named “package” or similar, rename it to “scanbot-web-sdk” or make sure to later provide the correct directory path in the code.
Your folder structure should look like this:
```bash
barcode-scanner-app/
|- scanbot-web-sdk/
|- webpack/
|- bundle/
|- @types/
|- index.js
|- ui.js
... (and some other files)
```
### Step 2: Create the HTML page and configure the Web SDK
Create an **index.html** file in the **barcode-scanner-app** folder. Then add the following code to the file:
```hljs html
My Scanner App
Start scanning
```
The code block above:
- Adds the “Start scanning” button.
- Imports and initializes the Scanbot SDK.
- Executes the user interface from the Scanbot SDK when the user clicks the “Start scanning” button.
- If a barcode is identified, it will present the barcode type and its content to the user.
💡 Without a license key, our SDK only runs for 60 seconds per session. This is more than enough for the purposes of our tutorial, but if you like, you can [generate a license key](https://scanbot.io/trial/) on our website.
Feel free to run the app to see if everything is working so far.

### Step 3: Enable the AR overlay
The Scanbot SDK lets you display an AR overlay on the screen so users can pick a specific barcode when the scanner recognizes multiple barcodes. All you need to do to enable this feature is to add the following code after defining the `config` object:
```hljs cpp
config.useCase.arOverlay.visible = true;
config.useCase.arOverlay.automaticSelectionEnabled = false;
```
Run your app again to see the AR overlay in action.

### Conclusion
🎉 That’s it! You now have a fully functional barcode scanning web app using the Scanbot SDK’s RTU UI.
Are you interested in how the scanner implementation works in your favorite JavaScript framework?
We’ve got you covered:
- [React.js](https://scanbot.io/techblog/react-barcode-reader-tutorial/)
- [Vue](https://scanbot.io/techblog/vue-js-barcode-scanner-tutorial/)
- [Angular](https://scanbot.io/techblog/angular-barcode-scanner-tutorial/)
- [Svelte](https://scanbot.io/techblog/svelte-barcode-scanner-tutorial/)
- [Next.js](https://scanbot.io/techblog/next-js-barcode-scanner-tutorial/)
Should you have any questions, feel free to reach out to us [on Slack or MS Teams](https://docs.scanbot.io/support/) or send us an email via [sdksupport@scanbot.io](mailto:sdksupport@scanbot.io)
Happy scanning! 🤳
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Related blog posts
[](https://scanbot.io/techblog/how-to-build-a-javascript-document-scanner-web-app/)
### [How to build a JavaScript Document Scanner web app](https://scanbot.io/techblog/how-to-build-a-javascript-document-scanner-web-app/)
We'll show you how to build a document scanning web app in minutes using only HTML, JavaScript, and our Web Document Scanner SDK.

Kevin February 21, 20257 mins read
[](https://scanbot.io/techblog/compose-multiplatform-barcode-scanning-ui-tutorial/)
### [How to create a Compose Multiplatform iOS & Android barcode scanning application using the Scanbot SDK](https://scanbot.io/techblog/compose-multiplatform-barcode-scanning-ui-tutorial/)
Compose Multiplatform enables developers to write UI code compatible with both Android and iOS. We’ll walk you through the integration process with the Scanbot Barcode Scanner SDK.

Ildar July 30, 202411 mins read
[](https://scanbot.io/techblog/progressive-web-app-barcode-scanner-tutorial/)
### [How to build a Progressive Web App (PWA) Barcode Scanner with React and TypeScript](https://scanbot.io/techblog/progressive-web-app-barcode-scanner-tutorial/)
Learn how to build an installable barcode scanning PWA using React and our Web SDK in this step-by-step guide.

Kevin January 7, 202510 mins read
+
## Improve OCR Accuracy
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/blog/improve-ocr-accuracy-with-image-processing/#main)
On their quest to streamline and automate workflows, extracting text from images has become increasingly crucial for businesses. [Optical Character Recognition (OCR)](https://scanbot.io/blog/what-is-ocr-software/) technology has made great strides in recent years – even consumer smartphones can now accurately scan documents.
However, OCR accuracy still hinges on the quality of input images. This is where image pre-processing comes in. This article explores how image pre-processing techniques enhance OCR performance, making text extraction more reliable and efficient.
## What is OCR, and how does it work?
Optical Character Recognition ( **OCR**) technology converts images of text into digital text. The software first separates the text from the background and then recognizes the individual characters. The result is machine-readable text – data that can be copied, searched, and processed automatically.
Generally, an OCR solution works like this:
1. **Image capture**: The physical document is scanned with a camera, such as a smartphone’s. The result is a grayscale or color scan.
2. **Character recognition:** The OCR engine detects areas on the scanned document that contain individual characters, words, or lines. Historically, engines checked the individual characters against a database of characters in a variety of fonts ( _matrix matching_) or of topological features like open areas or line intersections ( _feature extraction_). Modern OCR instead uses neural networks, which provide superior pattern recognition. They can reliably recognize text even under challenging conditions such as low lighting, shadows, skewed text, or badly printed characters.
3. **Output:** Once the text is extracted from the input image, it can be processed. The output format depends on the use case: To create a searchable PDF file, for instance, the recognized text is added as an invisible layer over the input image. Or, if further editing of the document is required, the software can create an editable text file that mimics the formatting and layout of the input image.
## Benefits of OCR
Accurate OCR **improves data integrity** by ensuring that text extracted from [documents](https://scanbot.io/blog/ocr-automation-in-document-processing/) faithfully represents the original content. It eliminates the mistakes that arise from manual data entry, thus reducing the need for manual data correction and validation. This, and the fact that the documents are now searchable, dramatically speeds up document management workflows from data entry to retrieval. The result is significant **time and cost savings**.
The **workflow automation** this enables further boosts **productivity and efficiency**.
To reach its full potential, however, OCR depends on high input image quality. Less-than-ideal images with blurry text, skewing, shadows, and low contrast pose a serious challenge to OCR accuracy.
## Enhance OCR accuracy with image pre-processing
Modern OCR software is more than the OCR engine that performs the actual text recognition. Today’s solutions use image pre-processing techniques to enhance input image quality. The focus is usually on adjusting image angle and enhancing contrast between text and background.
### Deskewing
Scans of paper documents are often skewed at a slight angle, resulting in distorted text characters. Deskewing corrects this and makes it easier for the OCR software to establish text baselines, which are crucial reference lines the OCR engine uses for character alignment and recognition.
### Image filters
Image filters are often applied as a first step to improve quality. As color information is unnecessary for text recognition, images are typically converted to **grayscale**. The different shades of gray can result in cleaner backgrounds and sharper text characters.
Some OCR engines don’t perform well on grayscale or color images and need more contrast to deliver accurate results. **Binarization** converts the image from grayscale to pure black-and-white pixels, creating maximum contrast between text and background.
Apart from enhancing contrast, these filters also reduce **image noise**. By removing dust specks, image compression, and other noise, they improve character recognition.
Though these image-processing techniques can enhance OCR accuracy, they only go so far. Some images are so poor they cannot be salvaged. The solution is to prevent these poor-quality images in the first place – and this is where a feedback system for users comes into play.
## Prevent low-quality scans and use only high-quality input images
Recently, we introduced the Scanbot SDK [Document Quality Analyzer](https://scanbot.io/blog/enhanced-document-quality-analyzer/) (DQA). This feature provides you with built-in quality control right at the source: in your document scanner app. It ensures that documents are captured with optimal quality and are suitable for subsequent OCR processing.
This is how it works:
1. The DQA detects all Latin characters and numbers in the input image.
2. Next, it examines each detected text string and rates it – based on how sharp the characters are – as “excellent”, “good”, “reasonable”, “poor”, or “very poor”.
3. If the average rating of the input image does not match your set threshold, a notification asks the user to retake the scan.
You can set your own acceptance threshold, but we recommend using at least “good” for automatic OCR processing. This prevents low-quality images from entering the OCR process to begin with.
The DQA is part of our [Document Scanner SDK](https://scanbot.io/document-scanner-sdk/), but is also available as a stand-alone, self-hosted module. The SDK’s advanced OCR software turns any smartphone and tablet into a powerful document scanner. Features such as **user guidance**, **automatic capture**, and **automatic cropping** minimize low-quality submissions and ensure accurate results. Its powerful OCR engine also works on full-color images.
Try our [free demo app](https://scanbot.io/demo-apps/) and see for yourself why companies like [HUK Coburg](https://scanbot.io/success-stories/huk-coburg/), one of the ten largest insurance groups in Germany, trust our document-scanning solution. If you would like to learn more about our Document Scanner SDK or the Document Quality Analyzer, please contact us at sdk@scanbot.io.
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Related blog posts
[](https://scanbot.io/blog/document-scan-quality-control-system/)
### [How to scan high-quality documents with a Document Scan Quality Control System](https://scanbot.io/blog/document-scan-quality-control-system/)
Finding a fast way to communicate and exchange documents is crucial for any business. Modern software tools enable input quality control.

Johanna December 13, 20247 mins read
[](https://scanbot.io/blog/credit-card-scanner-sdk-mobile-apps/)
### [A complete guide: Credit card scanning for mobile apps](https://scanbot.io/blog/credit-card-scanner-sdk-mobile-apps/)
Credit card scanning in mobile apps can make the difference between an abandoned cart and a conversion. Learn all about it in this post.

Maya December 6, 202410 mins read
[](https://scanbot.io/blog/smart-devices-as-proof-of-delivery-scanners/)
### [Proof-of-delivery scanners for efficient and transparent deliveries](https://scanbot.io/blog/smart-devices-as-proof-of-delivery-scanners/)
Software-based proof of delivery scanners automate the delivery confirmation process to increase efficiency, reduce costs, and provide customers with transparency.

Kevin November 26, 20245 mins read
+
## ZXing Android Scanner Tutorial
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/techblog/zxing-android-embedded-tutorial/?utm_source=chatgpt.com#main)
**ZXing** is an open-source project that provides a barcode image processing library. **ZXing Android Embedded** is a standalone library that facilitates barcode scanning within Android applications.
In this tutorial, we’ll show you how to use [ZXing Android Embedded](https://github.com/journeyapps/zxing-android-embedded) to integrate a barcode scanner into your Android app using [Kotlin](https://kotlinlang.org/) and [Android Studio](https://developer.android.com/studio).
To achieve this, we’ll do the following:
1. Create a new Android project
2. Add the ZXing dependencies
3. Create the app layout
4. Configure the app activity
5. Change the orientation
6. Run the app

Let’s get started! 🧑🏻💻
## Step 1: Create a new Android project
To create a new Android project, launch Android Studio and follow the steps below:
1. On the welcome screen, click on **New Project**. If Android Studio is already open, on the top menu, select **File > New > New Project**.
2. On the new window, select **Phone and Tablet** and choose the **Empty Views Activity**. Click **Next.**
3. Set the following project configurations:
1. **Name**: Choose a name for your app. In this tutorial, we’ll go with **BarcodeScanner**.
2. **Package Name**: This field is automatically populated based on your project name.
3. **Save Location**: Select a directory to save your project.
4. **Language**: Choose the programming language (Java or Kotlin). To follow this guide, select **Kotlin**.
5. **Minimum SDK**: Select the minimum Android version your app will support. Fewer devices will support the newer versions. For this tutorial, choose **API 24(“Nougat”; Android 7.0).**
4. Click **Finish** to create your project.

When you create the new project, Android Studio will make the necessary configurations and build the modules. After this is finished, you should see a project with an organization similar to the one below.

## Step 2: Add the ZXing dependencies
To start, you have to add ZXing to your project dependencies. First, add ZXing to your project’s libraries:
1. Open the **libs.versions.toml** file.
2. Under **\[versions\]** add `scanner = "4.3.0"`.
3. Under **\[libraries\]** add `scanner = { group = "com.journeyapps", name = "zxing-android-embedded", version.ref = "scanner" }`. Here, you are including the library and naming it as **scanner**, which you will use to add to your project.
The **libs.versions.tom** file should look something like this:
```hljs csharp
[versions]
agp = "8.4.0"
kotlin = "1.9.0"
coreKtx = "1.13.1"
junit = "4.13.2"
junitVersion = "1.1.5"
espressoCore = "3.5.1"
appcompat = "1.7.0"
material = "1.12.0"
activity = "1.9.0"
scanner = "4.3.0"
constraintlayout = "2.1.4"
[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
material = { group = "com.google.android.material", name = "material", version.ref = "material" }
androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "activity" }
androidx-constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" }
scanner = { group = "com.journeyapps", name = "zxing-android-embedded", version.ref = "scanner" }
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
```
Afterwards, you have to include the library in your project’s **build.gradle.kts (Modular :app)** using the **scanner** name:
1. Open the **build.gradle.kts (Modular :app)** file.
2. Add `implementation(libs.scanner)` within **dependencies.**
The **build.gradle.kts (Modular :app)** file should look like this:
```hljs csharp
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.jetbrains.kotlin.android)
}
android {
namespace = "com.example.barcodescanner"
compileSdk = 34
defaultConfig {
applicationId = "com.example.barcodescanner"
minSdk = 24
targetSdk = 34
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
}
dependencies {
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.material)
implementation(libs.androidx.activity)
implementation(libs.androidx.constraintlayout)
implementation(libs.scanner)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
}
```
## Step 3: Create the app layout
Before using the functionalities provided by the ZXing library, you need to add the visual elements to your app to enable the user to interact with it. For this tutorial, the app is composed of two elements:
- A Button the user will use to start the scanning process.
- A TextView to display the bar code after finishing the scanning process.
To add the above components to your app, open the **activity\_main.xml** file, which you will find under **app > res > layout**. Replace the existing content with the following code.
💡 If you open the **activity\_main.xml** file and no code appears on your screen, click the **Split** button at the top right of Android Studio.
```hljs html
```
The configurations used for each component are described in the following tables.
| | |
| --- | --- |
| **Button** |
| **Attribute** | **Description** |
| `android:id="@+id/scanBtn"` | Unique identifier for the Button. |
| `android:layout_width="wrap_content"` | The width of the Button is set to wrap its content. |
| `android:layout_height="wrap_content"` | The height of the Button is set to wrap its content. |
| `android:text="Scan Bar Code"` | The text displayed on the Button. |
| `app:layout_constraintBottom_toBottomOf="parent"` | Constraint to align the bottom of the Button with the bottom of the parent layout. |
| `android:layout_marginBottom="250dp"` | Margin at the bottom of the Button. |
| `app:layout_constraintEnd_toEndOf="parent"` | Constraint to align the end (right) of the Button with the end (right) of the parent layout. |
| `app:layout_constraintHorizontal_bias="0.5"` | Horizontal bias to center the Button horizontally. |
| `app:layout_constraintStart_toStartOf="parent"` | Constraint to align the start (left) of the Button with the start (left) of the parent layout. |
| | |
| --- | --- |
| **TextView** |
| **Attribute** | **Description** |
| `android:id="@+id/scannedValue"` | Unique identifier for the TextView. |
| `android:layout_width="wrap_content"` | The width of the TextView is set to wrap its content. |
| `android:layout_height="wrap_content"` | The height of the TextView is set to wrap its content. |
| `android:text="Scanned Value"` | The text displayed in the TextView. |
| `android:textColor="@android:color/black"` | The color of the text is set to black. |
| `android:textSize="20sp"` | The size of the text is set to 20sp (scaled pixels). |
| `android:textStyle="bold"` | The text style is set to bold. |
| `app:layout_constraintTop_toBottomOf="@id/scanBtn"` | Constraint to align the top of the TextView with the bottom of the Button. |
| `app:layout_constraintBottom_toBottomOf="parent"` | Constraint to align the bottom of the TextView with the bottom of the parent layout. |
| `app:layout_constraintEnd_toEndOf="parent"` | Constraint to align the end (right) of the TextView with the end (right) of the parent layout. |
| `app:layout_constraintStart_toStartOf="parent"` | Constraint to align the start (left) of the TextView with the start (left) of the parent layout. |
After setting up the above configuration on the **activity\_main.xml** file, Android Studio should present an app preview.

## Step 4: Configure the app activity
After adding the components, it’s time to configure the app functionalities. At this step, you will define the functions that define the Button and TextView behaviour.
To start, open the **MainActivity.kt** file, which you will find under **app > kotling+java > com.example.barcodescanner**.
First, declare a `Button` and a `TextView` variable within the `MainActivity` class. Then, override the `onCreate` function to assign the Button and TextView variables to respective Ids defined in the **activity\_main.xml** file. After that, add the `registerUiListener()` function, which you will define next. The beginning of the `MainActivity` class should be equal to the content of the following code block:
```hljs kotlin
class MainActivity : AppCompatActivity() {
private lateinit var scanBtn: Button
private lateinit var scannedValue: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
scanBtn = findViewById(R.id.scanBtn)
scannedValue = findViewById(R.id.scannedValue)
registerUiListener()
}
```
Next, you have to define the `registerUiListener()` function. The `registerUiListener` method sets up an `OnClickListener` for the `scanBtn` button. When someone clicks the button, it triggers the `scannerLauncher` to launch the barcode scanner. At this point, you can specify the options to define the scanner behaviour. Check [ScanOptions.java](https://github.com/journeyapps/zxing-android-embedded/blob/master/zxing-android-embedded/src/com/journeyapps/barcodescanner/ScanOptions.java) to see all the available options. This tutorial uses the following options:
- `setPrompt("Scan Barcode")`: Specifies the text that will appear when the app accesses the camera to scan the barcode.
- `.setDesiredBarcodeFormats(ScanOptions.ONE_D_CODE_TYPES)`: Defines that only one-dimensional codes will be identified.
The following code block presents the `registerUiListener()` code.
```hljs kotlin
private fun registerUiListener() {
scanBtn.setOnClickListener {
scannerLauncher.launch(
ScanOptions().setPrompt("Scan Barcode")
.setDesiredBarcodeFormats(ScanOptions.ONE_D_CODE_TYPES)
)
}
}
```
Last, you need to define the behaviour of the `TextView` after a barcode is scanned. For this, you will add the `scannerLauncher` activity, which will handle the result of the barcode scanning activity. Use the `registerForActivityResult` method to register it with a `ScanContract`. You also have to specify the callback function to handle the scan result. In this tutorial, the callback has the following behaviour:
- The app displays a **Canceled** message if the scan was cancelled, meaning no content was scanned.
- If the scan is successful, the app updates the `scannedValue TextView` with the scanned barcode contents, formatted as **Scanned Value: \[result\]**.
The following code block presents the `scannerLauncher` code.
```hljs kotlin
private val scannerLauncher = registerForActivityResult
(
ScanContract()
) { result ->
if (result.contents == null) {
Toast.makeText(this, "Cancelled", Toast.LENGTH_SHORT).show()
} else {
scannedValue.text = buildString {
append("Scanned Value : ")
append(result.contents)
}
}
}
```
After adding all configurations, the **MainActivity.kt** file should have the following content:
```hljs kotlin
package com.example.barcodescanner
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.google.zxing.client.android.Intents.Scan
import com.journeyapps.barcodescanner.CaptureActivity
import com.journeyapps.barcodescanner.ScanContract
import com.journeyapps.barcodescanner.ScanIntentResult
import com.journeyapps.barcodescanner.ScanOptions
class MainActivity : AppCompatActivity() {
private lateinit var scanBtn: Button
private lateinit var scannedValue: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
scanBtn = findViewById(R.id.scanBtn)
scannedValue = findViewById(R.id.scannedValue)
registerUiListener()
}
private fun registerUiListener() {
scanBtn.setOnClickListener {
scannerLauncher.launch(
ScanOptions().setPrompt("Scan Barcode")
.setDesiredBarcodeFormats(ScanOptions.ONE_D_CODE_TYPES)
)
}
}
private val scannerLauncher = registerForActivityResult(
ScanContract()
) { result ->
if (result.contents == null) {
Toast.makeText(this, "Cancelled", Toast.LENGTH_SHORT).show()
} else {
scannedValue.text = buildString {
append("Scanned Value : ")
append(result.contents)
}
}
}
}
```
## Step 5: Change the orientation
By default, the ZXing Android Embedded uses landscape mode. To change this behaviour, you must change the **AndroidManifest.xml** file, which you find under **app > manifests**.
In the **AndroidManifest.xml** file, you have to add a new `CaptureActivity` to ensure the scanning interface is always in portrait orientation. The following code block presents the code you need to add to the file:
```hljs html
```
In the above code, the `tools:replace="screenOrientation"` attribute informs the Android tools that this activity’s `screenOrientation` attribute should replace any previously declared `screenOrientation` attribute for this activity.
## Step 6: Run the app
After completing the four steps, you can test the app’s final result. To test the app, you can connect your Android phone to your computer and enable the Developer Options, or use Virtual Devices. If you have never tested an app using Android Studio, you can check one of the following guides:
- [How to connect your Android device](https://developer.android.com/codelabs/basic-android-kotlin-compose-connect-device#0)
- [Run your first app on the Android Emulator](https://developer.android.com/codelabs/basic-android-kotlin-compose-emulator#0)
Before running the app, be sure to:
- **Save all files**: Click **File > Save All**.
- **Sync the project**: Click **File > Sync Project with Gradle Files**.
**Build the project without any errors**: On the top menu, click **Build > Rebuild Project**. You should see the **BUILD SUCCESSFUL** in the Android Studio terminal.

## Disadvantages of using the ZXing barcode scanner library
ZXing provides decent performance for basic barcode scanning tasks but sometimes struggles with more challenging scenarios. Its most notable drawbacks as a barcode scanning solution include:
- **Scanning accuracy and speed**: ZXing struggles with scanning poorly lit or damaged barcodes. It often exhibits low recognition rates for smaller barcodes and can fail to decode them altogether.
- **Compatibility issues**: ZXing may not perform reliably across all devices, particularly newer models. This has led to frustration among developers who require consistent performance across different platforms.
- **Lack of active development**: As an open-source project, ZXing has seen limited updates and maintenance in recent years. This stagnation can lead to unresolved bugs and compatibility issues, making it less reliable for commercial applications.
- **Integration complexity**: Integrating ZXing into your app can be cumbersome, especially for developers who may not be familiar with its architecture. This can lead to longer development times and increased chances of bugs during implementation.
For companies that heavily rely on barcode scanning in their business processes, we recommend using an enterprise-grade solution instead.
## Building an Android Barcode Scanner with the Scanbot SDK
We developed the [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) as a commercial solution to help enterprises overcome these hurdles presented by free barcode scanning software. Our goal was to have a developer-friendly solution available for a wide range of platforms that consistently delivers high-quality results – even in challenging circumstances.
In the following tutorial, we’ll use Android Studio and the Scanbot SDK [Android Barcode Scanner library](https://scanbot.io/developer/android-barcode-scanner/) to create a simple app offering three different scanning modes: scanning one barcode at a time, multiple barcodes at once, and displaying the barcode values in the viewfinder using the SDK’s AR overlay.
Scanning a single barcode
Scanning multiple barcodes with the AR overlay
We’ll achieve this in five steps:
1. Prepare the project
2. Initialize the SDK
3. Set up the main screen
4. Implement the scanning modes
5. Scan some barcodes!
All you need is the latest version of Android Studio and you’re good to go.
### **Step 1: Preparing the project**
Create a new **Empty View Activity** and name the project (e.g., “Android Barcode Scanner”).
When your project is ready, go to **settings.gradle.kts** and add the Maven repositories for our SDK:
```hljs csharp
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
// Add the repositories here:
maven(url = "https://nexus.scanbot.io/nexus/content/repositories/releases/")
maven(url = "https://nexus.scanbot.io/nexus/content/repositories/snapshots/")
}
}
```
Now go to **app/build.gradle.kts** and add the dependencies for the Scanbot SDK and the RTU UI:
```hljs cpp
dependencies {
implementation("io.scanbot:scanbot-barcode-scanner-sdk:5.2.0")
implementation("io.scanbot:rtu-ui-v2-barcode:5.2.0")
```
Sync the project.
💡 We use Barcode Scanner SDK version 5.2.0 in this tutorial. You can find the latest version in the [changelog](https://docs.scanbot.io/barcode-scanner-sdk/android/changelog/).
Since we need to access the device camera to scan barcodes, let’s also add the necessary permissions in **AndroidManifest.xml**:
```hljs html
Kotlin Class/File**, and naming it (e.g. “ExampleApplication”).
In the resulting **ExampleApplication.kt**, let’s first add the necessary imports:
```hljs cpp
import android.app.Application
import io.scanbot.sdk.barcode_scanner.ScanbotBarcodeScannerSDKInitializer
```
Then we make `ExampleApplication` extend the `Application` class by adding `: Application()` and add the code for initializing the SDK inside it:
```hljs kotlin
class ExampleApplication : Application() {
override fun onCreate() {
super.onCreate()
ScanbotBarcodeScannerSDKInitializer()
// Optional: uncomment the next line if you have a license key.
// .license(this, LICENSE_KEY)
.initialize(this)
}
}
```
💡 Without a license key, our SDK only runs for 60 seconds per session. This is more than enough for the purposes of our tutorial, but if you like, you can [generate a license key](https://scanbot.io/trial/). Just make sure to change your `applicationId` in **app/build.gradle.kts** to `io.scanbot.androidbarcodescanner` and use that ID for generating the license.
Finally, we need to register the `Example Application` class in **AndroidManifest.xml**:
```hljs cpp
```
### **Step 4: Implementing the scanning modes**
Now we’ll connect each button with one of our RTU UI’s scanning modes, starting with single-barcode scanning.
Go to **MainActivity.kt** and add the necessary imports:
```hljs cpp
import android.widget.Button
import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
import io.scanbot.sdk.ui_v2.barcode.BarcodeScannerActivity
import io.scanbot.sdk.ui_v2.common.activity.registerForActivityResultOk
import io.scanbot.sdk.ui_v2.barcode.common.mappers.COMMON_CODES
import io.scanbot.sdk.ui_v2.barcode.configuration.BarcodeFormat
import io.scanbot.sdk.ui_v2.barcode.configuration.CollapsedVisibleHeight
import io.scanbot.sdk.ui_v2.barcode.configuration.BarcodeScannerConfiguration
import io.scanbot.sdk.ui_v2.barcode.configuration.MultipleBarcodesScanningMode
import io.scanbot.sdk.ui_v2.barcode.configuration.MultipleScanningMode
import io.scanbot.sdk.ui_v2.barcode.configuration.SheetMode
import io.scanbot.sdk.ui_v2.barcode.configuration.SingleScanningMode
import io.scanbot.sdk.ui_v2.common.ScanbotColor
```
With that out of the way, let’s implement the first scanning mode.
#### **Single-barcode scanning**
In the `MainActivity` class, add a private property that we’ll use to launch the barcode scanner.
```hljs kotlin
private val barcodeResultLauncher: ActivityResultLauncher =
registerForActivityResultOk(BarcodeScannerActivity.ResultContract()) { resultEntity ->
// Barcode Scanner result callback:
// Get the first scanned barcode from the result object...
val barcodeItem = resultEntity.result?.items?.first()
// ... and process the result as needed. For example, display as a Toast:
Toast.makeText(
this,
"Scanned: ${barcodeItem?.text} (${barcodeItem?.type})",
Toast.LENGTH_LONG
).show()
}
```
Next, in the `onCreate()` method, we set up an `OnClickListener` for our **Single-barcode scanning** button. When the button is clicked, it should launch `barcodeResultLauncher` using a configuration object we’ll set up in the next step:
```hljs html
findViewById(R.id.btn_single_scanning).setOnClickListener {
barcodeResultLauncher.launch(config)
}
```
Now paste the configuration for the RTU UI’s single-barcode scanning mode (from the [documentation](https://docs.scanbot.io/barcode-scanner-sdk/android/barcode-scanner/ready-to-use-ui/#single-scan-with-confirmation-dialog)) above `barcodeResultLauncher.launch(config)`:
```hljs kotlin
findViewById(R.id.btn_single_scanning).setOnClickListener {
val config = BarcodeScannerConfiguration().apply {
// Configure parameters (use explicit `this.` receiver for better code completion):
// Initialize the use case for single scanning.
this.useCase = SingleScanningMode().apply {
// Enable and configure the confirmation sheet.
this.confirmationSheetEnabled = true
this.sheetColor = ScanbotColor("#FFFFFF")
// Hide/unhide the barcode image.
this.barcodeImageVisible = true
// Configure the barcode title of the confirmation sheet.
this.barcodeTitle.visible = true
this.barcodeTitle.color = ScanbotColor("#000000")
// Configure the barcode subtitle of the confirmation sheet.
this.barcodeSubtitle.visible = true
this.barcodeSubtitle.color = ScanbotColor("#000000")
// Configure the cancel button of the confirmation sheet.
this.cancelButton.text = "Close"
this.cancelButton.foreground.color = ScanbotColor("#C8193C")
this.cancelButton.background.fillColor = ScanbotColor("#00000000")
// Configure the submit button of the confirmation sheet.
this.submitButton.text = "Submit"
this.submitButton.foreground.color = ScanbotColor("#FFFFFF")
this.submitButton.background.fillColor = ScanbotColor("#C8193C")
// Configure other parameters, pertaining to single-scanning mode as needed.
}
// Set an array of accepted barcode types.
this.recognizerConfiguration.barcodeFormats = BarcodeFormat.COMMON_CODES
// Configure other parameters as needed.
}
barcodeResultLauncher.launch(config)
}
```
If you want, you can run the app to try out the single-barcode scanning feature before we move on to the next mode.

#### **Multi-barcode scanning**
Set up another `OnClickListener`, this time for the **Multi-barcode scanning** button …
```hljs html
findViewById(R.id.btn_multi_scanning).setOnClickListener {
barcodeResultLauncher.launch(config)
}
```
… and paste in the [configuration](https://docs.scanbot.io/barcode-scanner-sdk/android/barcode-scanner/ready-to-use-ui/#multiple-scanning) for multi-scanning above `barcodeResultLauncher.launch(config)`:
```hljs kotlin
findViewById(R.id.btn_multi_scanning).setOnClickListener {
val config = BarcodeScannerConfiguration().apply {
// Configure parameters (use explicit `this.` receiver for better code completion):
// Initialize the use case for multiple scanning.
this.useCase = MultipleScanningMode().apply {
// Set the counting mode.
this.mode = MultipleBarcodesScanningMode.COUNTING
// Set the sheet mode for the barcodes preview.
this.sheet.mode = SheetMode.COLLAPSED_SHEET
// Set the height for the collapsed sheet.
this.sheet.collapsedVisibleHeight = CollapsedVisibleHeight.LARGE
// Enable manual count change.
this.sheetContent.manualCountChangeEnabled = true
// Set the delay before same barcode counting repeat.
this.countingRepeatDelay = 1000
// Configure the submit button.
this.sheetContent.submitButton.text = "Submit"
this.sheetContent.submitButton.foreground.color = ScanbotColor("#000000")
// Configure other parameters, pertaining to multiple-scanning mode as needed.
}
// Set an array of accepted barcode types.
this.recognizerConfiguration.barcodeFormats = BarcodeFormat.COMMON_CODES
// Configure other parameters as needed.
}
barcodeResultLauncher.launch(config)
}
```
Try it out if you like and then move on to the final scanning mode.

#### **AR overlay**
You know the drill. Set up an `OnClickListener` …
```hljs html
findViewById(R.id.btn_ar_overlay).setOnClickListener {
barcodeResultLauncher.launch(config)
}
```
… and paste in the configuration for the AR overlay:
```hljs kotlin
findViewById(R.id.btn_ar_overlay).setOnClickListener {
findViewById(R.id.btn_ar_overlay).setOnClickListener {
val config = BarcodeScannerConfiguration().apply {
// Configure parameters (use explicit `this.` receiver for better code completion):
// Configure the use case.
this.useCase = MultipleScanningMode().apply {
this.mode = MultipleBarcodesScanningMode.UNIQUE
this.sheet.mode = SheetMode.COLLAPSED_SHEET
this.sheet.collapsedVisibleHeight = CollapsedVisibleHeight.SMALL
// Configure AR Overlay.
this.arOverlay.visible = true
this.arOverlay.automaticSelectionEnabled = false
// Configure other parameters, pertaining to use case as needed.
}
// Set an array of accepted barcode types.
this.recognizerConfiguration.barcodeFormats = BarcodeFormat.COMMON_CODES
// Configure other parameters as needed.
}
barcodeResultLauncher.launch(config)
}
}
```
Build and run the app… and that’s it! 🎉
### **Step 5: Scanning some barcodes!**
You can now scan barcodes one at a time, multiple barcodes in one go, and display their values on the screen via the AR overlay.

### **Conclusion**
If this tutorial has piqued your interest in integrating barcode scanning functionalities into your Android app, make sure to take a look at our SDK’s other neat features in our [documentation](https://docs.scanbot.io/barcode-scanner-sdk/android/introduction/) – or run our [example project](https://github.com/doo/scanbot-barcode-scanner-sdk-example-android) for a more hands-on experience.
You can also try our [Barcode Scanner demo app](https://play.google.com/store/apps/details?id=io.scanbot.demo.barcodescanner) for a more feature-rich implementation of our SDK – just scan the following QR code:
[Or go directly to Google Play](https://play.google.com/store/apps/details?id=io.scanbot.demo.barcodescanner)
Should you have questions about this tutorial or run into any issues, we’re happy to help! Just shoot us an email via [tutorial-support@scanbot.io](mailto:tutorial-support@scanbot.io).
Happy coding!
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Related blog posts
[](https://scanbot.io/techblog/zxing-barcode-scanner-tutorial/)
### [ZXing Barcode Scanner tutorial – JavaScript library implementation](https://scanbot.io/techblog/zxing-barcode-scanner-tutorial/)
In this tutorial, we'll show you how to integrate ZXing's JavaScript library into a web app to use its barcode scanning functionalities.

Kevin August 5, 202413 mins read
[](https://scanbot.io/techblog/integrating-the-android-sdk-in-10-minutes-or-less/)
### [Try our Integration Challenge – run the Android SDK in 10 minutes or less](https://scanbot.io/techblog/integrating-the-android-sdk-in-10-minutes-or-less/)
We asked developers to integrate our Barcode Scanner SDK in less than 10 minutes. Can you do it as well?

Kevin July 11, 20245 mins read
[](https://scanbot.io/techblog/compose-multiplatform-barcode-scanning-ui-tutorial/)
### [How to create a Compose Multiplatform iOS & Android barcode scanning application using the Scanbot SDK](https://scanbot.io/techblog/compose-multiplatform-barcode-scanning-ui-tutorial/)
Compose Multiplatform enables developers to write UI code compatible with both Android and iOS. We’ll walk you through the integration process with the Scanbot Barcode Scanner SDK.

Ildar July 30, 202411 mins read
+
## iOS Barcode Scanner SDK
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/developer/ios-barcode-scanner-sdk/?utm_source=chatgpt.com#main)
# iOS Barcode Scanner SDK
Integrate our fast and accurate iOS Barcode Scanner SDK into your web or mobile apps. Seamlessly scan 1D and 2D barcodes with real-time data capture.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders


Real-time AR feedback
Deliver real-time AR feedback for barcode scanning, elevating the user experience in your iOS app. Visual cues help users capture barcodes more intuitively, ensuring faster, more accurate scanning.

Barcode scanning in challenging conditions
Our iOS Barcode Scanner SDK ensures reliable scanning even under the toughest real-world conditions:
- Damaged barcodes
- Low-light environment
- Tiny or distant barcodes
[Customizable UI components\\
\\
Our Ready-To-Use UI components cover all barcode scanning scenarios and are highly customizable.](https://scanbot.io/rtu-ui/)
Fast.
Very fast.
Every scan happens in
0.04s
or less
Scans all major barcode types
Code 39
Code 93
Code 32
Code 25
EAN-5
PDF417
GS1 DataBar
Code 39
Code 93
Code 32
Code 25
EAN-5
PDF417
GS1 DataBar
EAN-13
MSI Plessey
EAN-2
Aztec Code
rMQR Code
Codabar
UPC-A
EAN-13
MSI Plessey
EAN-2
Aztec Code
rMQR Code
Codabar
UPC-A
EAN-8
ISBN
GiroCode
GS1-128
Data Matrix
IATA 2 of 5
EAN-8
ISBN
GiroCode
GS1-128
Data Matrix
IATA 2 of 5
Code 128
Code 11
QR Code
UPC-E
Micro QR Code
MaxiCode
Code 128
Code 11
QR Code
UPC-E
Micro QR Code
MaxiCode
## Add a fast and reliable Barcode Scanner SDK to your iOS application
Integrate the Scanbot iOS [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) seamlessly into your applications. Our SDK provides easy-to-use APIs for scanning and parsing both 1D and 2D barcodes with device cameras or from images. This ensures fast, accurate, and reliable barcode recognition in real time, whether captured live or from uploaded images.
Designed for developers, our iOS Barcode Scanner Library supports all major barcode formats, including [DataMatrix](https://scanbot.io/barcode-scanner-sdk/data-matrix/), [QR codes](https://scanbot.io/glossary/qr-code/), [PDF417](https://scanbot.io/barcode-scanner-sdk/pdf417/), [EAN](https://scanbot.io/barcode-scanner-sdk/ean/), and more. Whether you’re building mobile or web apps for retail, logistics, healthcare, or inventory management, our SDK is optimized for smooth integration. With Ready-To-Use UI (RTU UI) components, you can quickly set up and customize the scanner’s interface. The SDK also excels in low-light environments and can scan damaged barcodes, making it ideal for challenging real-world use cases.
Need help? Our [expert support](https://docs.scanbot.io/support/) team is available via Slack, Microsoft Teams, or email to guide you through integration and ensure you get the most out of the Scanbot Barcode Scanner SDK.
### Technical requirements
The Scanbot iOS Barcode Scanner SDK requires the following:
- **Operating System**: iOS 13 or higher
- **IDE**: Xcode 14.0 or higher
- **Language**: Fully compatible with Swift & Objective-C for seamless integration
## Integrate this evening with your framework
categoryFeatures
## Discover common iOS Barcode Scanning use cases
See how the scan modes of the Scanbot iOS Barcode Scanner Library can improve your workflows.
- ### Single Scanning
Perfect for scanning single barcodes in retail or inventory management, such as performing quick stock lookups or reordering items in iOS apps.
- ### Batch Scanning
Effortlessly scan multiple barcodes in quick succession with our iOS Barcode Scanner SDK, making it ideal for order picking or processing multiple products simultaneously.
- ### Multi Scanning
Easily find and scan the correct item by providing the barcode value. Our iOS Barcode Scanning Software will highlight and scan the correct barcode, simplifying processes like warehouse picking or last-mile delivery.
Learn more about [Multi Barcode Scanner](https://scanbot.io/blog/enhancing-operations-with-multi-barcode-scanners/)
- ### Find & Pick
Easily find and scan the correct item by providing the barcode value. The iOS Barcode Reader SDK will highlight and scan the correct barcode, simplifying processes like warehouse picking or last-mile delivery.
- ### Scan & Count
Let users count multiple items in a single scan, ideal for retail employees conducting inventory checks or warehouse staff processing stock.

## How to integrate the Scanbot iOS Barcode Scanner Library using Ready-To-Use UI
The Ready-To-Use UI (RTU UI) is an easy to integrate and highly-customizable high-level UI component that can handle most cases and tasks in barcode scanning. The design and behavior of this component are based on our many years of experience as well as the feedback from our SDK customers.
Although the main idea of the RTU UI is to provide simple-to-integrate and simple-to-configure components, the customizing capabilities are almost infinite and should suit most of your needs. Should you need even more customization options, you can implement custom UI and business logic using our [Classic SDK UI Components](https://docs.scanbot.io/barcode-scanner-sdk/ios/barcode-scanner/classic-ui/).
### Change the visuals to suit your needs
In addition to a fresh new design, the RTU UI v.2.0 comes with new configuration options that enable you to quickly adapt its visual appearance:
**Palette**
Using the new palette feature, you can change the UI components’ colors to match your brand design.
```hljs swift
import Foundation
import ScanbotBarcodeScannerSDK
class PaletteUI2SwiftViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// Start scanning here. Usually this is an action triggered by a button or menu.
self.startScanning()
}
func startScanning() {
// Create the default configuration object.
let configuration = SBSDKUI2BarcodeScannerConfiguration()
// Retrieve the instance of the palette from the configuration object.
let palette = configuration.palette
// Configure the colors.
// The palette already has the default colors set, so you don't have to always set all the colors.
palette.sbColorPrimary = SBSDKUI2Color(colorString: "#C8193C")
palette.sbColorPrimaryDisabled = SBSDKUI2Color(colorString: "#F5F5F5")
palette.sbColorNegative = SBSDKUI2Color(colorString: "#FF3737")
palette.sbColorPositive = SBSDKUI2Color(colorString: "#4EFFB4")
palette.sbColorWarning = SBSDKUI2Color(colorString: "#FFCE5C")
palette.sbColorSecondary = SBSDKUI2Color(colorString: "#FFEDEE")
palette.sbColorSecondaryDisabled = SBSDKUI2Color(colorString: "#F5F5F5")
palette.sbColorOnPrimary = SBSDKUI2Color(colorString: "#FFFFFF")
palette.sbColorOnSecondary = SBSDKUI2Color(colorString: "#C8193C")
palette.sbColorSurface = SBSDKUI2Color(colorString: "#FFFFFF")
palette.sbColorOutline = SBSDKUI2Color(colorString: "#EFEFEF")
palette.sbColorOnSurfaceVariant = SBSDKUI2Color(colorString: "#707070")
palette.sbColorOnSurface = SBSDKUI2Color(colorString: "#000000")
palette.sbColorSurfaceLow = SBSDKUI2Color(colorString: "#26000000")
palette.sbColorSurfaceHigh = SBSDKUI2Color(colorString: "#7A000000")
palette.sbColorModalOverlay = SBSDKUI2Color(colorString: "#A3000000")
// Set the palette in the barcode scanner configuration object.
configuration.palette = palette
// Create and set an array of accepted barcode formats.
configuration.recognizerConfiguration.barcodeFormats = SBSDKUI2BarcodeFormat.twoDFormats
// Present the recognizer view controller modally on this view controller.
SBSDKUI2BarcodeScannerViewController.present(on: self,
configuration: configuration) { controller, cancelled, error, result in
// Completion handler to process the result.
// The `cancelled` parameter indicates whether the cancel button was tapped.
controller.presentingViewController?.dismiss(animated: true)
}
}
}
```
[Read the full iOS Barcode Scanner SDK documentation](https://docs.scanbot.io/barcode-scanner-sdk/ios/barcode-scanner/ready-to-use-ui/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### What are the key requirements for the Scanbot iOS Barcode Scanner SDK?
To integrate the Scanbot iOS Barcode Scanner SDK into your app, your development environment must meet the following key requirements:
**Operating System**: iOS 13.0 or higher
**IDE**: Xcode 14.0 or higher
**Language**: Swift or Objective-C
**Devices**: iPhone or iPad
The SDK works entirely offline, making it perfect for use cases requiring data privacy or functionality in areas with limited connection, such as in healthcare, logistics, and retail.
### What platforms are supported besides iOS?
In addition to iOS, the Scanbot SDK supports a broad array of platforms, offering developers flexibility in choosing the right tech stack.
**The supported platforms include:**
[Android](https://scanbot.io/developer/android-barcode-scanner/)
[JavaScript](https://scanbot.io/developer/javascript-barcode-scanner/) (Web)
[Flutter](https://scanbot.io/developer/flutter-barcode-scanner/)
[React Native](https://scanbot.io/developer/react-native-barcode-scanner/) [Cordova](https://scanbot.io/developer/cordova-barcode-scanner-plugin/)
[Capacitor](https://scanbot.io/developer/capacitor-barcode-scanner-sdk/) / [Ionic](https://scanbot.io/developer/ionic-barcode-scanner/)
[Xamarin](https://scanbot.io/developer/xamarin-barcode-scanner/)
[.NET MAUI](https://scanbot.io/developer/net-maui-barcode-scanner-sdk/) [UWP](https://scanbot.io/developer/uwp-barcode-scanner/) (Universal Windows Platform)
[Linux](https://scanbot.io/developer/linux-barcode-scanner/)
This extensive support ensures that the Scanbot SDK can be integrated across mobile, desktop, and web applications, providing a consistent scanning experience.
### Is the SDK compatible with different iOS devices and versions?
Yes, the Scanbot iOS Barcode Scanner SDK is compatible with a wide range of iOS devices and versions. It supports:
**iOS Versions**: iOS 13.0 or higher
**Devices**: All iPhones and iPads
The SDK is optimized for different device types, ensuring smooth performance on older and newer iOS devices alike.
### How do I obtain a trial license key for the Scanbot iOS Barcode Scanner SDK?
To obtain a trial license key for the Scanbot iOS Barcode Scanner SDK, follow these steps:
1\. Visit the Scanbot SDK [trial license page](https://scanbot.io/trial/).
2\. Fill in your app identifier.
3\. After submitting the form, you will receive your trial license key, which will be valid for 7 days.
If you need any support during the implementation process, feel free to join our free support channel on [Slack](https://join.slack.com/t/scanbotsdksupport/shared_invite/zt-1sroz452o-TWvJJwmIM6hoQ79gb01wJg), where our developers will help you free of charge. Further, if you need more time to test our SDK, please [reach out to our sales team.](https://scanbot.io/contact-sales/)
### How do I integrate a barcode scanner into my iOS app?
Integrating a barcode scanner into your iOS app is straightforward. You can add the SDK to your Xcode project, configure barcode formats (like QR codes or EAN), and set up event listeners to handle scan results. Please find a detailed iOS Barcode Scanner integration tutorial [here](https://scanbot.io/techblog/ios-barcode-scanner-sdk-integration-tutorial/).
### Which barcode formats are supported by iOS barcode scanner SDKs?
Most iOS Barcode Scanner SDKs support common 1D and 2D formats, including UPC, EAN, Code 128 for 1D codes, and QR codes, [PDF417](https://scanbot.io/barcode-scanner-sdk/pdf417/), and [DataMatrix](https://scanbot.io/barcode-scanner-sdk/data-matrix/) for 2D codes. The Scanbot iOS Barcode Scanner SDK supports almost any barcode. You can find a detailed list of all supported barcodes [here](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/).
### Can barcode scanners work offline in iOS apps?
Yes, certain barcode scanner SDKs allow offline scanning, which ensures that your app can function without internet connectivity, making it ideal for secure, offline environments. The Scanbot SDK, for example, runs completely offline, without any third-party server connections. In fact, you never even need to connect to the internet to scan a barcode.
### Is it possible to scan barcodes from images in iOS apps?
Yes, many barcode scanner SDKs offer the ability to scan barcodes from images, allowing users to process barcode images in addition to live scanning via camera. So does the Scanbot SDK. Please find more information about scanning barcodes from an image [here](https://docs.scanbot.io/barcode-scanner-sdk/ios/barcode-scanner/scanning-from-an-image/).
### What is the Scanbot iOS Barcode Scanner SDK and how does it work?
The Scanbot iOS Barcode Scanner SDK enables developers to integrate fast, accurate barcode scanning into their iOS apps, supporting both real-time camera-based scanning and image-based barcode recognition.
+
## Barcode Scanning Resources
https://scanbot.io/resources/getting-started/customer-success/2025-03-07T14:11:39+00:00https://scanbot.io/resources/infographics/real-estate-outbound/2024-12-19T13:27:19+00:00https://scanbot.io/resources/infographics/public-sector-outbound/2024-12-19T13:26:03+00:00https://scanbot.io/resources/infographics/implementing-an-efficient-barcode-system/2024-12-19T13:24:09+00:00https://scanbot.io/resources/infographics/automotive-outbound/2024-12-19T11:50:22+00:00https://scanbot.io/resources/booklet/app-barcode-scanning-booklet/2024-12-19T11:09:11+00:00https://scanbot.io/resources/whitepapers/na-insurance-online-presence-whitepaper/2024-12-13T16:30:20+00:00https://scanbot.io/resources/whitepapers/retail-systems-whitepaper/2024-12-13T16:30:20+00:00https://scanbot.io/resources/whitepapers/transportation-whitepaper/2024-12-13T16:30:20+00:00https://scanbot.io/resources/whitepapers/document-scanning-technolog/2024-12-13T16:30:19+00:00https://scanbot.io/resources/whitepapers/insurance/2024-12-13T16:30:19+00:00https://scanbot.io/resources/whitepapers/future-of-fashion-in-store-customer-experience/2024-12-13T16:30:19+00:00https://scanbot.io/resources/whitepapers/barcode-technology-whitepaper/2024-12-13T16:30:18+00:00https://scanbot.io/resources/platform-guides/xamarin-platform-guide/2024-12-13T16:30:18+00:00https://scanbot.io/resources/platform-guides/react-native-platform-guide/2024-12-13T16:30:18+00:00https://scanbot.io/resources/platform-guides/ios-platform-guide/2024-12-13T16:29:47+00:00https://scanbot.io/resources/platform-guides/ionic-platform-guide/2024-12-13T16:29:47+00:00https://scanbot.io/resources/platform-guides/flutter-platform-guide/2024-12-13T16:29:46+00:00https://scanbot.io/resources/platform-guides/android-platform-guide/2024-12-13T16:29:46+00:00https://scanbot.io/resources/platform-guides/cordova-platform-guide/2024-12-13T16:29:46+00:00https://scanbot.io/resources/platform-guides/net-maui-platform-guide/2024-12-13T16:29:46+00:00https://scanbot.io/resources/infographics/what-makes-a-good-document-scanner/2024-12-13T16:29:45+00:00https://scanbot.io/resources/infographics/document-processing-transportation/2024-12-13T16:29:45+00:00https://scanbot.io/resources/infographics/utilities-ig/2024-12-13T16:29:45+00:00https://scanbot.io/resources/infographics/shelf-management/2024-12-13T16:29:44+00:00https://scanbot.io/resources/infographics/sdk-api/2024-12-13T16:29:44+00:00https://scanbot.io/resources/infographics/sdk-for-websites/2024-12-13T16:29:44+00:00https://scanbot.io/resources/infographics/scan-and-go/2024-12-13T16:29:43+00:00https://scanbot.io/resources/infographics/scanning-devices-2/2024-12-13T16:29:43+00:00https://scanbot.io/resources/infographics/retail-mobile-scanning/2024-12-13T16:29:43+00:00https://scanbot.io/resources/infographics/public-transport-ig/2024-12-13T16:29:42+00:00https://scanbot.io/resources/infographics/mrz-scanning-in-public-transportation/2024-12-13T16:29:14+00:00https://scanbot.io/resources/infographics/operational-retail-use-cases/2024-12-13T16:29:13+00:00https://scanbot.io/resources/infographics/patient-bracelets-ig/2024-12-13T16:29:13+00:00https://scanbot.io/resources/infographics/pricing-models/2024-12-13T16:29:13+00:00https://scanbot.io/resources/infographics/make-or-buy/2024-12-13T16:29:12+00:00https://scanbot.io/resources/infographics/manufacturing-ig/2024-12-13T16:29:12+00:00https://scanbot.io/resources/infographics/oil-energy-infographic/2024-12-13T16:29:12+00:00https://scanbot.io/resources/infographics/last-mile-comparison/2024-12-13T16:29:11+00:00https://scanbot.io/resources/infographics/legal-outbound-infographic/2024-12-13T16:29:11+00:00https://scanbot.io/resources/infographics/last-mile-barcode-scanning/2024-12-13T16:29:08+00:00https://scanbot.io/resources/infographics/insurance-ig/2024-12-13T16:29:07+00:00https://scanbot.io/resources/infographics/input-management-without-mobile-app/2024-12-13T16:29:07+00:00https://scanbot.io/resources/infographics/general-insurance/2024-12-13T16:29:07+00:00https://scanbot.io/resources/infographics/it-costs/2024-12-13T16:29:07+00:00https://scanbot.io/resources/infographics/healthcare-ig/2024-12-13T16:29:06+00:00https://scanbot.io/resources/infographics/input-management/2024-12-13T16:29:06+00:00https://scanbot.io/resources/infographics/food-beverage/2024-12-13T16:29:05+00:00https://scanbot.io/resources/infographics/finance-ig/2024-12-13T16:29:05+00:00https://scanbot.io/resources/infographics/telecommunications-field-services-barcode-scanning/2024-12-13T16:28:41+00:00https://scanbot.io/resources/infographics/events-ticketing-amusement-parks/2024-12-13T16:28:41+00:00https://scanbot.io/resources/infographics/barcode-scanning-in-telecommunications-customer-apps/2024-12-13T16:28:40+00:00https://scanbot.io/resources/infographics/customer-service-in-retail/2024-12-13T16:28:40+00:00https://scanbot.io/resources/infographics/data-scanner-infographic/2024-12-13T16:28:40+00:00https://scanbot.io/resources/infographics/education-ig/2024-12-13T16:28:40+00:00https://scanbot.io/resources/infographics/byod-vs-cope/2024-12-13T16:28:39+00:00https://scanbot.io/resources/infographics/customer-pain-points/2024-12-13T16:28:39+00:00https://scanbot.io/resources/infographics/mobile-claims-submission/2024-12-13T16:28:39+00:00https://scanbot.io/resources/infographics/check-scanning/2024-12-13T16:28:39+00:00https://scanbot.io/resources/infographics/barcode-parser/2024-12-13T16:28:38+00:00https://scanbot.io/resources/infographics/barcode-types-infographic/2024-12-13T16:28:38+00:00https://scanbot.io/resources/infographics/barcode-scanning/2024-12-13T16:28:38+00:00https://scanbot.io/resources/infographics/app-development/2024-12-13T16:28:37+00:00https://scanbot.io/resources/infographics/barcode-scanning-in-agriculture/2024-12-13T16:28:36+00:00https://scanbot.io/resources/infographics/agent-portals/2024-12-13T16:28:36+00:00https://scanbot.io/resources/infographics/air-travel-infographic/2024-12-13T16:28:36+00:00https://scanbot.io/resources/infographics/5-things-to-look-for-in-an-sdk/2024-12-13T16:28:10+00:00https://scanbot.io/resources/getting-started/general-fact-sheet/2024-12-13T16:28:10+00:00https://scanbot.io/resources/infographics/accounting/2024-12-13T16:28:10+00:00https://scanbot.io/resources/getting-started/stakeholders-guide/2024-12-13T16:28:09+00:00https://scanbot.io/resources/getting-started/licensing-model-fact-sheet/2024-12-13T16:28:09+00:00https://scanbot.io/resources/getting-started/data-security/2024-12-13T16:28:08+00:00https://scanbot.io/resources/getting-started/support-fact-sheet/2024-12-13T16:28:08+00:00https://scanbot.io/resources/getting-started/quality-assurance/2024-12-13T16:28:07+00:00https://scanbot.io/resources/getting-started/retail-fact-sheet/2024-12-13T16:28:07+00:00https://scanbot.io/resources/getting-started/transportation-fact-sheet/2024-12-13T16:28:07+00:00https://scanbot.io/resources/getting-started/tax-accounting-fact-sheet/2024-12-13T16:28:07+00:00https://scanbot.io/resources/getting-started/insurance-fact-sheet/2024-12-13T16:28:06+00:00https://scanbot.io/resources/getting-started/manufacturing-fact-sheet/2024-12-13T16:28:06+00:00https://scanbot.io/resources/getting-started/hospitality-fact-sheet/2024-12-13T16:28:06+00:00https://scanbot.io/resources/getting-started/healthcare-fact-sheet/2024-12-13T16:28:06+00:00https://scanbot.io/resources/getting-started/air-travel-fact-sheet/2024-12-13T16:28:05+00:00https://scanbot.io/resources/getting-started/field-services-fact-sheet/2024-12-13T16:28:05+00:00https://scanbot.io/resources/ebooks/windows-device-guide-2023/2024-12-13T16:27:15+00:00https://scanbot.io/resources/ebooks/transportation/2024-12-13T16:27:15+00:00https://scanbot.io/resources/ebooks/state-of-multichannel-retail-2023/2024-12-13T16:27:14+00:00https://scanbot.io/resources/ebooks/self-checkout-solutions-ebook/2024-12-13T16:27:14+00:00https://scanbot.io/resources/ebooks/smart-factories/2024-12-13T16:27:14+00:00https://scanbot.io/resources/ebooks/preventing-shoplifting-with-scan-and-go/2024-12-13T16:27:13+00:00https://scanbot.io/resources/ebooks/post-parcel-transformation/2024-12-13T16:27:13+00:00https://scanbot.io/resources/ebooks/scanbot-sdk-vs-ml-kit-vs-zxing-ebook/2024-12-13T16:27:13+00:00https://scanbot.io/resources/ebooks/introduction-to-ocr-technology/2024-12-13T16:27:12+00:00https://scanbot.io/resources/ebooks/last-mile/2024-12-13T16:27:12+00:00https://scanbot.io/resources/ebooks/mobile-data-capture/2024-12-13T16:27:12+00:00https://scanbot.io/resources/ebooks/retail-transformation-2/2024-12-13T16:27:11+00:00https://scanbot.io/resources/ebooks/field-services/2024-12-13T16:27:11+00:00https://scanbot.io/resources/ebooks/digital-health/2024-12-13T16:27:11+00:00https://scanbot.io/resources/ebooks/insurance-ebook/2024-12-13T16:27:11+00:00https://scanbot.io/resources/ebooks/air-travel/2024-12-13T16:27:10+00:00https://scanbot.io/resources/brochures/transportation-use-case-brochure/2024-12-13T16:27:10+00:00https://scanbot.io/resources/brochures/web-sdk-for-insurances-brochure/2024-12-13T16:27:10+00:00https://scanbot.io/resources/brochures/p3-data-capture-brochure/2024-12-13T16:27:09+00:00https://scanbot.io/resources/brochures/p1-document-scanning-brochure/2024-12-13T16:26:27+00:00https://scanbot.io/resources/brochures/new-retail-brochure/2024-12-13T16:26:26+00:00https://scanbot.io/resources/brochures/p0-barcode-scanning-brochure/2024-12-13T16:26:26+00:00https://scanbot.io/resources/brochures/native-hybrid-cross-platform-brochure/2024-12-13T16:26:26+00:00https://scanbot.io/resources/brochures/manufacturing-use-cases/2024-12-13T16:26:25+00:00https://scanbot.io/resources/brochures/insurance-use-cases-in-practice/2024-12-13T16:26:25+00:00https://scanbot.io/resources/brochures/insurance-use-cases/2024-12-13T16:26:25+00:00https://scanbot.io/resources/brochures/check-scanning-software-brochure/2024-12-13T16:26:24+00:00https://scanbot.io/resources/brochures/how-to-scan-an-mrz-brochure/2024-12-13T16:26:24+00:00https://scanbot.io/resources/brochures/how-to-increase-customer-acceptance-of-self-checkout-systems/2024-12-13T16:26:24+00:00https://scanbot.io/resources/brochures/drivers-license-pdf417-scanner/2024-12-13T16:26:23+00:00https://scanbot.io/resources/brochures/flutter-vs-react-native-vs-xamarin/2024-12-13T16:26:23+00:00https://scanbot.io/resources/brochures/container-ocr-brochure/2024-12-13T16:26:23+00:00https://scanbot.io/resources/brochures/5-inspiring-barcode-use-cases/2024-12-13T16:26:22+00:00https://scanbot.io/resources/brochures/air-travel-brochure/2024-12-13T16:26:22+00:00https://scanbot.io/resources/brochures/barcode-scanning-test-sheet/2024-12-13T16:26:22+00:00https://scanbot.io/resources/booklet/web-barcode-scanning-booklet/2024-12-13T16:26:21+00:00
## Barcode Scanner Tutorial
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/techblog/barcodescanning-native-maui-tutorial/?utm_source=chatgpt.com#main)
This tutorial walks you through the process of creating a barcode scanner app for Android and iOS using the [BarcodeScanning.Native.Maui](https://github.com/afriscic/BarcodeScanning.Native.Maui) package. This library leverages Google ML Kit on Android and Apple Vision on iOS to detect and decode barcodes.
To build our app, we’re going to follow these steps:
1. Preparing the project
2. Installing the NuGet package
3. Initializing the plugin
4. Adding the scanner UI
5. Implementing barcode detection

Let’s get started!
## Requirements
There are several options for developing .NET MAUI applications, including the ability to build and launch projects from the .NET CLI. Whatever method you choose, make sure you have [.NET 9.0](https://dotnet.microsoft.com/en-us/download) installed for your development platform of choice. You’ll also need Microsoft’s build of [OpenJDK](https://learn.microsoft.com/en-us/java/openjdk/download).
⚠️ A note for Windows users: If you want to develop your app for iOS, additional setup is required, including having a Mac available as a build server. You can learn more about this in the [.NET MAUI documentation](https://learn.microsoft.com/en-us/dotnet/maui/ios/pair-to-mac?view=net-maui-8.0). In this tutorial, we’ll assume you’re developing on a Mac and using the CLI.
If this is your first time developing a .NET MAUI application on your machine, execute the following command:
```hljs undefined
sudo dotnet workload install maui
```
## Step 1: Prepare the project
First, create a new directory for your project …
```hljs undefined
mkdir barcode-scanner-maui
```
… and navigate into it.
```hljs undefined
cd barcode-scanner-maui
```
Then create the project with:
```hljs cpp
dotnet new maui --framework net9.0
```
Since we need access to the device cameras to scan barcodes, let’s add the necessary camerapermissions for Android and iOS.
For Android, add the following to **Platforms/Android/AndroidManifest.xml** inside the `` element:
```hljs html
```
For iOS, add the following to **Platforms/iOS/Info.plist** anywhere inside the `` element.
```hljs html
NSCameraUsageDescription
Grant camera access to scan barcodes.
```
## Step 2: Install the NuGet package
In your terminal, install the BarcodeScanning.Native.Maui package with the following command:
```hljs csharp
dotnet add package BarcodeScanning.Native.Maui --version 2.1.8
```
## Step 3: Initialize the plugin
In **MauiProgram.cs**, include the namespace:
```hljs cpp
using BarcodeScanning;
```
Then register the barcode scanner in the app builder with `.UseBarcodeScanning()`.
```hljs csharp
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp()
.UseBarcodeScanning() // Add this line
// ...
}
```
## Step 4: Add the scanner UI
At the top of **MainPage.xaml**, define the XML namespace.
```hljs cpp
xmlns:scanner="clr-namespace:BarcodeScanning;assembly=BarcodeScanning.Native.Maui"
```
Then replace the ` ` code with:
```hljs html
```
## Step 5: Implement barcode detection
Finally, in **MainPage.xaml.cs**, include the namespace …
```hljs cpp
using BarcodeScanning;
```
… and remove `int count = 0;` and the `OnCounterClicked()` method.
Inside the `MainPage` class, add the following to make sure the app asks for camera access on startup:
```hljs csharp
protected override async void OnAppearing()
{
base.OnAppearing();
BarcodeScanner.CameraEnabled = true;
await Methods.AskForRequiredPermissionAsync();
}
```
Below, add the following to deactivate the camera on closing:
```hljs csharp
protected override void OnDisappearing()
{
base.OnDisappearing();
BarcodeScanner.CameraEnabled = false;
}
```
And below that, add the barcode detection event handler:
```hljs csharp
private async void CameraView_OnDetectionFinished(object sender, OnDetectionFinishedEventArg e)
{
if (e.BarcodeResults.Count > 0)
{
BarcodeScanner.PauseScanning = true;
foreach (var result in e.BarcodeResults)
{
await DisplayAlert("Scanned Barcode", result.RawValue, "OK");
}
BarcodeScanner.PauseScanning = false;
}
}
```
Now you can build and run your app with the following commands:
**Android**:
```hljs undefined
dotnet build -t:Run -f net9.0-android
```
**iOS:**
```hljs undefined
dotnet build -t:Run -f net9.0-ios
```

## Disadvantages of using BarcodeScanning.Native.MAUI for scanning barcodes
The BarcodeScanning.Native.MAUI library is easy to integrate into .NET MAUI projects, making it a good choice for quick prototyping or personal projects.
However, it comes with a few drawbacks:
- A recurring issue arises when navigating between pages after using the barcode scanner. Developers report crashes or glitches when attempting to open a new page while the camera is still shutting down or consuming resources, resulting in forced closures or rendering issues in the main view.
- Problems can occur when initializing the camera scanner in specific lifecycle events (e.g., `OnAppearing`) or navigating back to a page containing the scanner. This can lead to non-functioning scanners or UI elements failing to update properly.
- Threading issues can arise when attempting to perform barcode detection while interacting with UI elements. Since UI operations require the main thread, improper threading can cause delays or crashes.
- The package’s reliance on Google ML Kit and Apple Vision ties applications to their updates and changes. Developers must adapt to new API versions or deprecated features, which can increase maintenance overhead.
For companies that heavily rely on barcode scanning in their business processes, we recommend using an enterprise-grade solution instead.
## Building a .NET MAUI Barcode Scanner with the Scanbot SDK
We developed the Scanbot [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) to help enterprises overcome the hurdles presented by free barcode scanning software. Our goal was to have a developer-friendly solution available for a wide range of platforms that consistently delivers high-quality results – even in challenging circumstances.
With our dedicated [.NET MAUI SDK](https://scanbot.io/developer/net-maui-barcode-scanner-sdk/), you can easily integrate barcode scanning functionalities into your cross-platform app. We’ll show you how to do it in a matter of minutes – thanks to the SDK’s Ready-to-Use UI!
First, we’re going to implement single-barcode scanning in our app. Afterwards, we’ll adapt the scanner to support multi-barcode scanning and implement an AR overlay.
Scanning a single QR code
Scanning multiple barcodes with the AR overlay
We’ll achieve this in five steps:
1. Preparing the .NET MAUI project
2. Installing the Scanbot SDK
3. Initializing the SDK
4. Implementing single-barcode scanning
5. Implementing multi-barcode scanning with AR overlay
Let’s get started!
### Step 1: Prepare the .NET MAUI project
First, create a new directory for your project and navigate into it.
```hljs undefined
mkdir test-maui
```
```hljs undefined
cd test-maui
```
Then create the project with the following command:
```hljs cpp
dotnet new maui
```
Since we need access to the device camera to scan barcodes, let’s add the necessary camera permissions for Android and iOS.
For Android, add the following to **Platforms/Android/AndroidManifest.xml** inside the `` element:
```hljs html
```
For iOS, add the following to **Platforms/iOS/Info.plist** anywhere inside the `` element:
```hljs html
NSCameraUsageDescription
Please provide camera access.
```
### Step 2: Install the Scanbot SDK
In this tutorial, we’re using Scanbot Barcode Scanner SDK version 6.1.0. You can find the latest version in the SDK’s [changelog](https://docs.scanbot.io/barcode-scanner-sdk/maui/changelog/maui-changelog/).
Add the following code to the **test-maui.csproj** file in your project folder:
```hljs html
```
Then run:
```hljs undefined
dotnet restore
```
💡 If there are package conflicts, add the appropriate `` tags to the project and make sure `` has `NoWarn="NU1605"` added to it to suppress the related build error for that particular package.
### Step 3: Initialize the SDK
In **MauiProgram.cs**, initialize the Barcode Scanner SDK by replacing the contents with the following code:
```hljs csharp
using Microsoft.Extensions.Logging;
using ScanbotSDK.MAUI;
namespace test_maui;
public static class MauiProgram
{
public const string LicenseKey = "";
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
});
#if DEBUG
builder.Logging.AddDebug();
#endif
SBSDKInitializer.Initialize(LicenseKey, new SBSDKConfiguration
{
EnableLogging = true,
ErrorHandler = (status, feature) =>
{
Console.WriteLine($"License error: {status}, {feature}");
}
});
return builder.Build();
}
}
```
This will set an empty license key, initialize the SDK, and enable logging and error handling.
💡 Without a license key, the Barcode Scanner SDK only runs for 60 seconds per session. This is more than enough for the purposes of this tutorial, but if you like, you can [generate a license key](https://scanbot.io/trial/) using the `` found in **test-maui.csproj**.
For the scanning components to work correctly in Android, you also need to add `DependencyManager.RegisterActivity(this)` to the `OnCreate` method in **Platforms/Android/MainActivity.cs**:
```hljs csharp
protected override void OnCreate(Bundle? savedInstanceState)
{
base.OnCreate(savedInstanceState);
ScanbotSDK.MAUI.DependencyManager.RegisterActivity(this);
}
```
💡 If there’s no `OnCreate` method in your **MainActivity.cs**, add the above code snippet to the `MainActivity` class.
### Step 4: Implement single-barcode scanning
We’ll first implement single-barcode scanning in our .NET MAUI app.
In **MainPage.xaml.cs**, first add the necessary imports.
```hljs cpp
using ScanbotSDK.MAUI;
using ScanbotSDK.MAUI.Barcode;
```
Then replace the `OnCounterClicked()` method with the following:
```hljs csharp
private async void StartBarcodeScanner(object sender, EventArgs e)
{
try
{
if (!ScanbotSDKMain.LicenseInfo.IsValid)
{
await DisplayAlert(title: "License invalid", message: "Trial license expired.", cancel: "Dismiss");
return;
}
// Create the default configuration object.
var configuration = new BarcodeScannerConfiguration();
var result = await ScanbotSDKMain.RTU.BarcodeScanner.LaunchAsync(configuration);
var barcodeAsText = result.Items.Select(barcode => $"{barcode.Type}: {barcode.Text}")
.FirstOrDefault() ?? string.Empty;
await DisplayAlert("Found barcode", barcodeAsText, "Finish");
}
catch (TaskCanceledException)
{
// For when the user cancels the action.
}
catch (Exception ex)
{
// For any other errors that occur.
Console.WriteLine(ex.Message);
}
}
```
This configures our barcode scanner with the default behavior and implements a text pop-up showing a barcode’s type and encoded data when scanned.
Now go to **MainPage.xaml** and edit the `CounterBtn` so it calls our `StartBarcodeScanner()` method when clicked.
```hljs html
```
Build and run the app to test the single-barcode scanning functionality.
For iOS:
```hljs undefined
dotnet build . -f net8.0-ios -t:Run -r ios-arm64
```
For Android:
```hljs undefined
dotnet build . -f net8.0-android -t:Run
```

In the next step, we’ll change the scanner’s behavior to scan multiple barcodes and display their values on the scanning screen using an AR overlay.
### Step 5: Implement multi-barcode scanning with AR overlay
Go back to **MainPage.xaml.cs** and below `var configuration = new BarcodeScannerConfiguration();`, create a new instance of the `MultipleScanningMode` class and assign it to a variable `usecase`.
```hljs csharp
var usecase = new MultipleScanningMode();
```
Then modify this object to enable the AR overlay, disable the automatic selection of barcodes as they enter the scanning area (requiring the user to select them manually instead), and disable the viewfinder (since having it doesn’t make much sense when using the AR overlay).
```hljs cpp
usecase.ArOverlay.Visible = true;
usecase.ArOverlay.AutomaticSelectionEnabled = false;
configuration.ViewFinder.Visible = false;
```
Finally, apply the configuration.
```hljs undefined
configuration.UseCase = usecase;
```
Your final **MainPage.xaml.cs** will look something like this:
```hljs csharp
using ScanbotSDK.MAUI;
using ScanbotSDK.MAUI.Barcode;
namespace test_maui;
public partial class MainPage : ContentPage
{
int count = 0;
public MainPage()
{
InitializeComponent();
}
private async void StartBarcodeScanner(object sender, EventArgs e)
{
try
{
if (!ScanbotSDKMain.LicenseInfo.IsValid)
{
await DisplayAlert(title: "License invalid", message: "Trial license expired.", cancel: "Dismiss");
return;
}
var configuration = new BarcodeScannerConfiguration();
var usecase = new MultipleScanningMode();
usecase.ArOverlay.Visible = true;
usecase.ArOverlay.AutomaticSelectionEnabled = false;
configuration.ViewFinder.Visible = false;
configuration.UseCase = usecase;
var result = await ScanbotSDKMain.RTU.BarcodeScanner.LaunchAsync(configuration);
var barcodeAsText = result.Items.Select(barcode => $"{barcode.Type}: {barcode.Text}")
.FirstOrDefault() ?? string.Empty;
await DisplayAlert("Found barcode", barcodeAsText, "Finish");
}
catch (TaskCanceledException)
{
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
```
Now build and run the app again and try out the new scanning behavior.

If you’re in need of some sample barcodes for testing purposes, we’ve got you covered:

💡 If you run into errors while building the Android app, try the command `_dotnet build . -f net8.0-android -t:Run --no-incremental`.
The option `--no-incremental` disables incremental building. When used, it forces a clean rebuild of the entire project, ignoring any previously built components.
### Conclusion
🎉 Congratulations! You’ve successfully built a cross-platform barcode scanning app for iOS and Android with .NET MAUI!
The scanner is customizable and supports features like multi-barcode scanning and AR overlay. For more customization options, check out the [RTU UI documentation](https://docs.scanbot.io/barcode-scanner-sdk/maui/barcode-scanner/ready-to-use-ui/) and [API references](https://scanbotsdk.github.io/documentation/web/classes/UIConfig.BarcodeScannerConfiguration.html).
Should you have questions about this tutorial or ran into any issues, we’re happy to help! Just shoot us an email via [tutorial-support@scanbot.io](mailto:tutorial-support@scanbot.io).
Happy scanning! 🤳
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Related blog posts
[](https://scanbot.io/techblog/avalonia-barcode-scanner-tutorial/)
### [Avalonia UI Barcode Scanner tutorial – .NET MAUI integration guide](https://scanbot.io/techblog/avalonia-barcode-scanner-tutorial/)
In this tutorial, we'll show you how you can build a barcode scanner for Android and iOS with Avalonia using our .NET MAUI SDK.

Matthew February 24, 20257 mins read
[](https://scanbot.io/techblog/compose-multiplatform-barcode-scanning-ui-tutorial/)
### [How to create a Compose Multiplatform iOS & Android barcode scanning application using the Scanbot SDK](https://scanbot.io/techblog/compose-multiplatform-barcode-scanning-ui-tutorial/)
Compose Multiplatform enables developers to write UI code compatible with both Android and iOS. We’ll walk you through the integration process with the Scanbot Barcode Scanner SDK.

Ildar July 30, 202411 mins read
[](https://scanbot.io/techblog/uno-platform-barcode-scanner-tutorial/)
### [Uno Platform Barcode Scanner tutorial – .NET MAUI integration guide](https://scanbot.io/techblog/uno-platform-barcode-scanner-tutorial/)
In this tutorial, we'll show you how you can build a barcode scanner for Android and iOS in Uno Platform using our .NET MAUI SDK.

Matthew March 3, 20257 mins read
+
## Scanbot Sitemap
https://scanbot.io/post-sitemap.xml2025-05-09T09:00:53+00:00https://scanbot.io/page-sitemap.xml2025-05-08T22:21:39+00:00https://scanbot.io/developer-sitemap.xml2025-05-05T17:07:26+00:00https://scanbot.io/glossary-sitemap.xml2025-04-14T09:40:29+00:00https://scanbot.io/resources-sitemap.xml2025-03-07T14:11:39+00:00https://scanbot.io/solutions-sitemap.xml2025-04-04T13:49:47+00:00https://scanbot.io/success-stories-sitemap.xml2025-04-28T09:39:37+00:00https://scanbot.io/tech-post-sitemap.xml2025-05-09T07:22:31+00:00
## Ready-to-Use Scanning UIs
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/rtu-ui/#main)
# Ready-to-Use Scanning UIs
Pre-built scanning interfaces for barcode, document,
and data capture applications
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Why customers love our Ready-To-Use UI
Faster go-live, lower dev effort, seamless user experience
acute
### Quick setup
Developers appreciate the simplicity. Our RTU UI integrates with minimal code, significantly shortening development time and speeding up the deployment of your app or website.
savings
### Cost-effective and customizable
Skip the expense of building a custom scanning interface from scratch. Scanbot SDK's RTU UI provides simple-to-integrate, simple-to-configure components. At the same time, it offers a host of customization options.
palette
### Adaptable to your use case
Our scanner's user interface is designed with flexibility in mind. You can tailor its functionalities to specific needs and use case, ensuring a perfect fit for your application – and for your end users.
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
+
## Scanbot SDK Newsroom
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/newsroom/#main)
# Scanbot SDK Newsroom
Stay up to date with the latest Scanbot SDK news
[Send a press inquiry](mailto:press@scanbot.io) [Get media kit](https://drive.google.com/drive/folders/1DUrXLYGsh6CwJGLZlWERRKOTVoQ65rQf)
CategoryAll
Press Release
Media News
YearAll202520242023202220212020
[](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft) Press Release
#### [Scanbot SDK is now part of Apryse!](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
Apryse, the global leader in document processing technology, has acquired Scanbot SDK. Together, we’ll collaborate on delivering a unified suite of tools covering the full document lifecycle.
July 10, 2025
[](https://impeller.net/magazin/krohne-group-streamlines-field-device-access-in-pick-app-with-new-barcode-scanner/) Media News
#### [KROHNE Group Streamlines Field Device Access in PICK App with New Barcode Scanner](https://impeller.net/magazin/krohne-group-streamlines-field-device-access-in-pick-app-with-new-barcode-scanner/)
**Impeller.net** – KROHNE Group improves Data Matrix scanning reliability and speed with Scanbot SDK.
July 4, 2025
[](https://www.aerotime.aero/articles/how-mobile-scanning-transforms-airline-operations) Media News
#### [How mobile scanning transforms airline operations](https://www.aerotime.aero/articles/how-mobile-scanning-transforms-airline-operations)
**AeroTime** – Max Stratmann, CRO of Scanbot SDK, explains the use cases of mobile scanning in the aviation industry.
March 21, 2025
[](https://www.supplychainbrain.com/blogs/1-think-tank/post/41323-are-hardware-scanners-a-thing-of-the-past) Media News
#### [Are Hardware Scanners a Thing of the Past?](https://www.supplychainbrain.com/blogs/1-think-tank/post/41323-are-hardware-scanners-a-thing-of-the-past)
**SupplyChainBrain** – Max Stratmann, CRO of Scanbot SDK, discusses the growing adoption of software scanners and the evolution of hybrid solutions.
March 6, 2025
[](https://www.truckingdive.com/news/bison-transport-scanbot-scannable-barcodes/740922/) Media News
#### [Bison adds barcode tech to give real-time freight updates](https://www.truckingdive.com/news/bison-transport-scanbot-scannable-barcodes/740922/)
**Trucking Dive** – The carrier is continuing the rollout of Scanbot SDK across its operations, which began late last year.
March 4, 2025
[](https://www.cio.de/article/3813342/huk-coburg-automatisiert-dokumentenbearbeitung.html) Media News
#### [HUK-Coburg simplifies document submission with Scanbot SDK](https://www.cio.de/article/3813342/huk-coburg-automatisiert-dokumentenbearbeitung.html)
**CIO** (German only) – Now insured persons can conveniently capture their medical bills and receipts using their mobile devices.
January 28, 2025
[](https://www.logrealdirekt.de/ePaper/2025.01.27/index.html#p=6) Media News
#### [2025: The year in which technologies unite to form the Concerto Grosso](https://www.logrealdirekt.de/ePaper/2025.01.27/index.html\#p=6)
**LogReal.Direkt** (German only) – Frank Thelen highlights how Scanbot SDK enhances logistics and real estate operations, from seamless barcode scanning in parcel logistics to efficient document digitization.
January 27, 2025
[](https://www.it-finanzmagazin.de/bildqualitaet-entscheidet-warum-dunkelverarbeitung-schon-am-eingang-scheitert-221497/) Media News
#### [Image quality is crucial: Why dark processing already fails at the input](https://www.it-finanzmagazin.de/bildqualitaet-entscheidet-warum-dunkelverarbeitung-schon-am-eingang-scheitert-221497/)
**IT Finanzmagazin** (German only) – Eduard Frank, CTO of Scanbot SDK, explains how high-quality image capture is crucial for dark processing in insurance workflows.
January 21, 2025
[](https://www.sdcexec.com/transportation/trucking/article/22928262/scanbot-sdk-is-driver-technology-keeping-up) Media News
#### [Is Driver Technology Keeping Up?](https://www.sdcexec.com/transportation/trucking/article/22928262/scanbot-sdk-is-driver-technology-keeping-up)
**Supply & Demand Chain Executive** – Max Stratmann, CRO of Scanbot SDK, discusses how advancements in driver technology, including mobile scanning solutions, can enhance workflows for truck drivers.
December 12, 2024
[](https://scottishgrocer.co.uk/2024/12/03/jisp-enhances-its-scan-save-loyalty-scheme/) Media News
#### [Jisp enhances its Scan & Save loyalty scheme with Scanbot SDK](https://scottishgrocer.co.uk/2024/12/03/jisp-enhances-its-scan-save-loyalty-scheme/)
**Scottish Grocer & Convenience Retailer** – UK retailer Jisp switches to Scanbot SDK to optimize its in-app loyalty program for consumers.
December 3, 2024
[](https://www.prnewswire.com/news-releases/scanbot-sdk-achieves-scanning-speed-breakthrough-0-04-seconds-per-barcode-302229279.html) Press Release
#### [Scanbot SDK achieves scanning speed breakthrough: 0.04 seconds per barcode](https://www.prnewswire.com/news-releases/scanbot-sdk-achieves-scanning-speed-breakthrough-0-04-seconds-per-barcode-302229279.html)
August 26, 2024
[](https://www.freightwaves.com/news/leveraging-integrations-to-speed-up-document-workflows) Media News
#### [Leveraging integrations to speed up document workflows](https://www.freightwaves.com/news/leveraging-integrations-to-speed-up-document-workflows)
**Freightwaves** – Scanbot SDK makes manual transfer of documents by drivers obsolete.
August 20, 2024
[](https://www.inboundlogistics.com/articles/are-we-ready-for-fully-digital-bols/) Media News
#### [Are We Ready for Fully Digital BoLs?](https://www.inboundlogistics.com/articles/are-we-ready-for-fully-digital-bols/)
**Inbound Logistics** – Max Stratmann, CRO of Scanbot SDK, provides insights into the digitization of documents in the trucking industry.
July 1, 2024
[](https://fintech.global/2024/06/18/fourth-aifintech100-shines-a-light-on-the-leading-firms-revolutionising-financial-services/) Media News
#### [FinTech Global](https://fintech.global/2024/06/18/fourth-aifintech100-shines-a-light-on-the-leading-firms-revolutionising-financial-services/)
Fourth AIFinTech100 shines a light on the leading firms revolutionising financial services
June 18, 2024
[](https://www.prnewswire.com/news-releases/cypher-robotics-and-scanbot-sdk-team-up-to-automate-inventory-cycle-counting-302092901.html) Press Release
#### [Cypher Robotics and Scanbot SDK team up to automate inventory cycle counting](https://www.prnewswire.com/news-releases/cypher-robotics-and-scanbot-sdk-team-up-to-automate-inventory-cycle-counting-302092901.html)
March 20, 2024
[](https://www.prnewswire.com/news-releases/scanbot-sdks-new-rtu-ui-v2-0-makes-integrating-barcode-scanning-into-mobile-apps-easier-than-ever-302078613.html) Press Release
#### [Scanbot SDK's new RTU UI v.2.0 makes integrating barcode scanning into mobile apps easier than ever](https://www.prnewswire.com/news-releases/scanbot-sdks-new-rtu-ui-v2-0-makes-integrating-barcode-scanning-into-mobile-apps-easier-than-ever-302078613.html)
March 6, 2024
[](https://www.prnewswire.com/news-releases/scanbot-sdk-stellt-neues-logo-und-brand-design-vor-301917785.html) Press Release
#### [Scanbot SDK unveils new logo and brand design](https://www.prnewswire.com/news-releases/scanbot-sdk-stellt-neues-logo-und-brand-design-vor-301917785.html)
September 6, 2023
[](https://www.prnewswire.co.uk/news-releases/scanbot-sdk-adds-net-maui-support-to-its-data-capture-solutions-301883176.html) Press Release
#### [Scanbot SDK Adds .NET MAUI Support to Its Data Capture Solutions](https://www.prnewswire.co.uk/news-releases/scanbot-sdk-adds-net-maui-support-to-its-data-capture-solutions-301883176.html)
July 25, 2023
[](https://www.prnewswire.co.uk/news-releases/scanbot-sdk-named-among-vendors-in-computer-vision-tools-landscape-report-301865559.html?gclid=EAIaIQobChMI-p) Press Release
#### [Scanbot SDK Named Among Vendors in Computer Vision Tools Landscape Report](https://www.prnewswire.co.uk/news-releases/scanbot-sdk-named-among-vendors-in-computer-vision-tools-landscape-report-301865559.html?gclid=EAIaIQobChMI-p)
June 30, 2023
[](https://www.prnewswire.co.uk/news-releases/scanbot-sdk-brings-barcode-scanner-demo-app-to-windows-devices-301857753.html) Press Release
#### [Scanbot SDK brings Barcode Scanner Demo App to Windows devices](https://www.prnewswire.co.uk/news-releases/scanbot-sdk-brings-barcode-scanner-demo-app-to-windows-devices-301857753.html)
June 23, 2023
[](https://fintech.global/2023/06/21/3rd-annual-aifintech100-unveils-the-movers-and-shakers-in-the-growing-sector/) Media News
#### [FinTech Global](https://fintech.global/2023/06/21/3rd-annual-aifintech100-unveils-the-movers-and-shakers-in-the-growing-sector/)
3rd annual AIFinTech100 unveils the movers and shakers in the growing sector
June 21, 2023
[](https://www.prnewswire.com/news-releases/scanbot-sdks-new-web-barcode-scanner-demo-lets-you-scan-barcodes-from-your-browser-301787744.html) Press Release
#### [Scanbot SDK's new Web Barcode Scanner Demo lets you scan barcodes from your browser](https://www.prnewswire.com/news-releases/scanbot-sdks-new-web-barcode-scanner-demo-lets-you-scan-barcodes-from-your-browser-301787744.html)
April 4, 2023
[](https://www.prnewswire.com/news-releases/scanbot-sdk-releases-brand-new-demo-app-for-mobile-data-capture-sdk-301706006.html) Press Release
#### [Scanbot SDK releases brand-new Demo App for mobile Data Capture SDK](https://www.prnewswire.com/news-releases/scanbot-sdk-releases-brand-new-demo-app-for-mobile-data-capture-sdk-301706006.html)
December 20, 2022
[](https://www.prnewswire.com/news-releases/scanbot-sdk-introduces-new-document-scanner-demo-app-for-ios-and-android-301687214.html) Press Release
#### [Scanbot SDK introduces new Document Scanner Demo App for iOS and Android](https://www.prnewswire.com/news-releases/scanbot-sdk-introduces-new-document-scanner-demo-app-for-ios-and-android-301687214.html)
November 28, 2022
[](https://www.prnewswire.com/news-releases/scanbot-sdk-publishes-dedicated-barcode-scanner-sdk-for-the-universal-windows-platform-ecosystem-301671960.html) Press Release
#### [Scanbot SDK publishes dedicated Barcode Scanner SDK for the Universal Windows Platform ecosystem](https://www.prnewswire.com/news-releases/scanbot-sdk-publishes-dedicated-barcode-scanner-sdk-for-the-universal-windows-platform-ecosystem-301671960.html)
November 9, 2022
[](https://www.prnewswire.com/news-releases/scanbot-sdk-releases-new-barcode-scanner-demo-app-on-ios-and-android-301636933.html) Press Release
#### [Scanbot SDK releases new Barcode Scanner Demo App on iOS and Android](https://www.prnewswire.com/news-releases/scanbot-sdk-releases-new-barcode-scanner-demo-app-on-ios-and-android-301636933.html)
October 4, 2022
[](https://www.prnewswire.com/news-releases/scanbot-sdk-joins-dag-jessel-as-new-cfo-301621879.html) Press Release
#### [Dag Jessel joins Scanbot SDK as new CFO](https://www.prnewswire.com/news-releases/scanbot-sdk-joins-dag-jessel-as-new-cfo-301621879.html)
September 12, 2022
[](https://www.prnewswire.com/news-releases/scanbot-sdk-have-officially-changed-their-companies-names-to-scanbot-sdk-gmbh-and-scanbot-sdk-inc-301612335.html) Press Release
#### [Scanbot SDK have officially changed their companies' names to 'Scanbot SDK GmbH' and 'Scanbot SDK, Inc.'](https://www.prnewswire.com/news-releases/scanbot-sdk-have-officially-changed-their-companies-names-to-scanbot-sdk-gmbh-and-scanbot-sdk-inc-301612335.html)
August 29, 2022
[](https://fintech.global/2022/12/07/fintech-global-reveals-second-annual-aifintech100-list-of-must-know-companies/) Media News
#### [FinTech Global](https://fintech.global/2022/12/07/fintech-global-reveals-second-annual-aifintech100-list-of-must-know-companies/)
FinTech Global reveals second annual AIFinTech100 list of must know companies
July 12, 2022
[](https://www.digitalinsuranceagenda.com/wp-content/uploads/2022/01/220105-The-DIA-Top-250.pdf) Media News
#### [Digital Insurance Agenda](https://www.digitalinsuranceagenda.com/wp-content/uploads/2022/01/220105-The-DIA-Top-250.pdf)
DIA TOP 250 – Celebrating 5 Years of Connecting Insurance Executives with Insurtech Leaders
January 5, 2022
[](https://www.digitalinsuranceagenda.com/featured-insurtechs/scanbot-sdk-increase-the-rate-of-automatically-processed-documents-claims-with-high-quality-input/) Media News
#### [Digital Insurance Agenda](https://www.digitalinsuranceagenda.com/featured-insurtechs/scanbot-sdk-increase-the-rate-of-automatically-processed-documents-claims-with-high-quality-input/)
Scanbot SDK: Increase the rate of automatically processed documents & claims with high-quality input
December 7, 2021
[](https://fintech.global/2021/09/07/first-annual-global-aifintech100-list-highlights-the-must-know-names-in-ai/) Media News
#### [FinTech Global](https://fintech.global/2021/09/07/first-annual-global-aifintech100-list-highlights-the-must-know-names-in-ai/)
First annual Global AIFinTech100 list highlights the must know names in AI
September 7, 2021
[](https://www.forrester.com/report/new-tech-computer-vision-platforms-q3-2021/RES176154) Media News
#### [Forrester](https://www.forrester.com/report/new-tech-computer-vision-platforms-q3-2021/RES176154)
New Tech: Computer Vision Platforms, Q3 2021
August 31, 2021
[](https://www.instech.co/insight/data-extraction-ingestion-40-companies-watch-2021) Media News
#### [Instech London](https://www.instech.co/insight/data-extraction-ingestion-40-companies-watch-2021)
Data Extraction and Ingestion: The 40 companies to watch in 2021
August 15, 2021
[](https://www.digitalinsuranceagenda.com/thought-leadership/dia-top-100-the-insurtechs-to-watch-in-2021/) Media News
#### [Digital Insurance Agenda](https://www.digitalinsuranceagenda.com/thought-leadership/dia-top-100-the-insurtechs-to-watch-in-2021/)
DIA TOP 100 – The Insurtechs to Watch in 2021
March 11, 2021
[](https://www.ft.com/content/8b37a92b-15e6-4b9c-8427-315a8b5f4332?utm_content=156224514&utm_medium=social&utm_source=linkedin&hss_channel=lcp-10507725) Media News
#### [Financial Times](https://www.ft.com/content/8b37a92b-15e6-4b9c-8427-315a8b5f4332?utm_content=156224514&utm_medium=social&utm_source=linkedin&hss_channel=lcp-10507725)
FT 1000: the fifth annual list of Europe’s fastest-growing companies
March 2, 2021
[](https://www.insurtechinsights.com/reports/the-status-of-the-european-health-insurance-space/?utm_source=Linkedin) Media News
#### [Insurtech Insights](https://www.insurtechinsights.com/reports/the-status-of-the-european-health-insurance-space/?utm_source=Linkedin)
The Status of the European Health Insurance Space
January 25, 2021
[](https://www.oliverwyman.de/our-expertise/insights/2021/aug/insurtech-radar-2021.html) Media News
#### [OliverWyman](https://www.oliverwyman.de/our-expertise/insights/2021/aug/insurtech-radar-2021.html)
Die Zukunft von InsurTech in DACH
January 20, 2021
[](https://insurtechmap.eu/?utm_content=183278901&utm_medium=social&utm_source=linkedin&hss_channel=lcp-10507725#?utf8=%E2%9C%93&query=&tags_should%5Bvalue-chain%5D%5B%5D=claims-customer-service) Media News
#### [InsurTech Map](https://insurtechmap.eu/?utm_content=183278901&utm_medium=social&utm_source=linkedin&hss_channel=lcp-10507725\#?utf8=%E2%9C%93&query=&tags_should%5Bvalue-chain%5D%5B%5D=claims-customer-service)
Claims & Customer Service
January 15, 2021
[](https://www.itcdiaeurope.com/thought-leadership/the-dia-white-paper-the-four-post-covid-trends-insurers-should-tap-into/) Media News
#### [Digital Insurance Agenda](https://www.itcdiaeurope.com/thought-leadership/the-dia-white-paper-the-four-post-covid-trends-insurers-should-tap-into/)
The DIA White Paper: The Four Post-Covid Trends Insurers Should Tap Into
June 15, 2020
[](https://www.insurtechinsights.com/industry-insights/the-new-business-app/) Media News
#### [InsurTech Insights](https://www.insurtechinsights.com/industry-insights/the-new-business-app/)
The New Business App
April 20, 2020
Show more
View all
## Press contact
For press inquiries, please contact us by email. We look forward to hearing from you.
[press@scanbot.io](mailto:press@scanbot.io) [LinkedIn](https://www.linkedin.com/in/niklaskreck) [Xing](https://www.xing.com/profile/Niklas_Kreck034801)

### Niklas Kreck
Head of Growth
+
## Data Capture Solutions
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/about/#main)
# We make capturing data as easy, accurate, and as fast as possible
One scan at a time
## 10+ years of experience
## 300+ enterprise customers
## 120M+ monthly active users
## Billions of scans every year
## What we do
Scanbot SDK helps organizations turn analog information into digital data. We specialize in advanced scanning and data extraction technology – from document scanning and OCR to barcode reading and data capture workflows – building on years of experience serving hundreds of millions of end users and over 300 enterprise customers.
Instead of building complex scanners in-house, enterprises can simply integrate our battle-tested solutions. This lets them focus on their core competencies while benefiting from our cutting-edge technology.
**Now part of Apryse**, we’re building something bigger: an end-to-end data capture and document platform that empowers developers and businesses across mobile, web, and desktop. This partnership enhances our mobile scanning, barcode reading, and OCR capabilities with Apryse’s comprehensive document technology – creating a unified platform for all data capture and document processing needs.

visibilityOur vision
## Bringing the power of Machine Learning & Computer Vision into the hands of everyone
## Equal opportunities
Apryse is a global leader in document technology, focused on delivering innovative solutions that enable the creation, editing, merging, extracting, and smart classification of documents.
Together with Scanbot SDK, Apryse provides a complete platform that spans mobile data capture – including barcode scanning, document scanning, and OCR – through to full document lifecycle management. This combination brings together specialized mobile scanning expertise with comprehensive document processing capabilities, creating more innovation and expanded integration opportunities for our customers across all data capture use cases.
For more information, visit [apryse.com](https://apryse.com/).
## We’re hiring
Check our open positions and take your chance to shape the Scanbot SDK journey.
[See all open positions](https://scanbot.io/careers/open-positions/)
+
## Scanbot SDK Overview
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/sitemap/#main)
# Sitemap
## Products
### Barcode Scanner Software
- [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/)
- [Web Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/web-barcode-scanner/)
- [Barcode Scanning Software](https://scanbot.io/barcode-scanning-software/)
### Document Scanner Software
- [Document Scanner SDK](https://scanbot.io/document-scanner-sdk/)
- [Web Document Scanner](https://scanbot.io/document-scanner-sdk/web-document-scanner/)
### Data Capture Software
- [Data Capture Software](https://scanbot.io/data-capture-software/)
### Barcode Symbologies
- [Data Matrix Scanner](https://scanbot.io/barcode-scanner-sdk/data-matrix/)
- [PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/pdf417/)
- [Aztec Code Scanner](https://scanbot.io/barcode-scanner-sdk/aztec-code/)
- [Code 128 Scanner](https://scanbot.io/barcode-scanner-sdk/code-128/)
- [Intelligent Mail Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/intelligent-mail-barcode/)
- [Micro PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/micro-pdf417/)
- [Code 93 Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/code-93/)
- [Code 39 Scanner](https://scanbot.io/barcode-scanner-sdk/code-39/)
- [EAN Scanner](https://scanbot.io/barcode-scanner-sdk/ean/)
- [UPC Scanner](https://scanbot.io/barcode-scanner-sdk/upc/)
- [Micro QR Code Scanner](https://scanbot.io/barcode-scanner-sdk/micro-qr-code/)
- [GS1 DataBar Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-databar/)
- [rMQR Scanner](https://scanbot.io/barcode-scanner-sdk/rmqr/)
- [AAMVA Scanner](https://scanbot.io/barcode-scanner-sdk/aamva-pdf417/)
- [GS1 DataMatrix Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-data-matrix/)
- [GS1-128 Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-128/)
- [ITF Code Scanner](https://scanbot.io/barcode-scanner-sdk/itf-code/)
- [Codabar Scanner](https://scanbot.io/barcode-scanner-sdk/codabar/)
- [MaxiCode Scanner](https://scanbot.io/barcode-scanner-sdk/maxicode/)
- [Royal Mail Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/royal-mail/)
- [MSI Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/msi-barcode/)
## Developer
### Android
- [Android Barcode Scanner SDK](https://scanbot.io/developer/android-barcode-scanner/)
- [Android Document Scanner SDK](https://scanbot.io/developer/android-document-scanner-sdk/)
- [Android Check Scanner](https://scanbot.io/developer/android-data-capture/check-scanner/)
- [Android Driver License Scanner](https://scanbot.io/developer/android-data-capture/drivers-license-scanner/)
- [Android ID Scanner](https://scanbot.io/developer/android-data-capture/id-scanner/)
- [Android MRZ Scanner](https://scanbot.io/developer/android-data-capture/mrz-scanner/)
- [Android OCR Library](https://scanbot.io/developer/android-data-capture/ocr-library/)
- [Android QR Code Scanner](https://scanbot.io/developer/android-barcode-scanner/qr-code/)
- [Android VIN Scanner](https://scanbot.io/developer/android-data-capture/vin-scanner/)
### iOS
- [iOS Barcode Scanner SDK](https://scanbot.io/developer/ios-barcode-scanner-sdk/)
- [iOS Document Scanner SDK](https://scanbot.io/developer/ios-document-scanner/)
- [iOS Drivers License Scanner](https://scanbot.io/developer/ios-data-capture/drivers-license-scanner/)
- [iOS MRZ Scanner](https://scanbot.io/developer/ios-data-capture/mrz-scanner/)
- [iOS OCR Library](https://scanbot.io/developer/ios-data-capture/ocr-library/)
- [iOS VIN Scanner](https://scanbot.io/developer/ios-data-capture/vin-scanner/)
- [iOS QR Code Scanner](https://scanbot.io/developer/ios-barcode-scanner-sdk/qr-code/)
### JavaScript
- [JavaScript Barcode Scanner SDK](https://scanbot.io/developer/javascript-barcode-scanner/)
- [JavaScript Document Scanner SDK](https://scanbot.io/developer/javascript-document-scanner/)
- [JavaScript MRZ Scanner](https://scanbot.io/developer/javascript-data-capture/js-mrz-scanner/)
- [JavaScript QR Code Scanner](https://scanbot.io/developer/javascript-barcode-scanner/qr-code/)
### React Native
- [React Native Barcode Scanner SDK](https://scanbot.io/developer/react-native-barcode-scanner/)
- [React Native Document Scanner SDK](https://scanbot.io/developer/react-native-document-scanner/)
- [React Native ID Scanner](https://scanbot.io/developer/react-native-data-capture/id-scanner/)
- [React Native MRZ Scanner](https://scanbot.io/developer/react-native-data-capture/mrz-scanner/)
- [React Native OCR Scanner](https://scanbot.io/developer/react-native-data-capture/ocr/)
- [React Native QR Code Scanner](https://scanbot.io/developer/react-native-barcode-scanner/qr-code/)
- [React Native VIN Scanner](https://scanbot.io/developer/react-native-data-capture/vin-scanner/)
### Flutter
- [Flutter Barcode Scanner SDK](https://scanbot.io/developer/flutter-barcode-scanner/)
- [Flutter Document Scanner SDK](https://scanbot.io/developer/flutter-document-scanner/)
- [Flutter EHIC Scanner](https://scanbot.io/developer/flutter-data-capture/ehic-scanner/)
- [Flutter ID Scanner](https://scanbot.io/developer/flutter-data-capture/flutter-id-scanner/)
- [Flutter MRZ Scanner](https://scanbot.io/developer/flutter-data-capture/mrz-scanner/)
- [Flutter OCR Scanner](https://scanbot.io/developer/flutter-data-capture/ocr-text-recognition/)
- [Flutter QR Code Scanner](https://scanbot.io/developer/flutter-barcode-scanner/qr-code/)
### Ionic
- [Ionic Barcode Scanner SDK](https://scanbot.io/developer/ionic-barcode-scanner/)
- [Ionic Document Scanner SDK](https://scanbot.io/developer/ionic-document-scanner/)
- [Ionic OCR Plugin](https://scanbot.io/developer/ionic-data-capture/ocr/)
- [Ionic QR Code Scanner](https://scanbot.io/developer/ionic-barcode-scanner/qr-code/)
### Cordova
- [Cordova Barcode Scanner SDK](https://scanbot.io/developer/cordova-barcode-scanner-plugin/)
- [Cordova Document Scanner SDK](https://scanbot.io/developer/cordova-document-scanner/)
- [Cordova OCR Plugin](https://scanbot.io/developer/cordova-data-capture/ocr-plugin/)
- [Cordova QR Code Scanner](https://scanbot.io/developer/cordova-barcode-scanner-plugin/qr-code/)
### Xamarin
- [Xamarin Barcode Scanner SDK](https://scanbot.io/developer/xamarin-barcode-scanner/)
- [Xamarin Document Scanner SDK](https://scanbot.io/developer/xamarin-document-scanner/)
- [Xamarin OCR Scanner](https://scanbot.io/developer/xamarin-data-capture/ocr/)
- [Xamarin QR Code Scanner](https://scanbot.io/developer/xamarin-barcode-scanner/qr-code/)
### .NET MAUI
- [.NET MAUI Barcode Scanner SDK](https://scanbot.io/developer/net-maui-barcode-scanner-sdk/)
- [.NET MAUI Document Scanner SDK](https://scanbot.io/developer/net-maui-document-scanner-sdk/)
### Capacitor
- [Capacitor Barcode Scanner SDK](https://scanbot.io/developer/capacitor-barcode-scanner-sdk/)
- [Capacitor Document Scanner SDK](https://scanbot.io/developer/capacitor-document-scanner-sdk/)
### Windows
- [UWP Barcode Scanner SDK](https://scanbot.io/developer/uwp-barcode-scanner/)
### Linux
- [Linux Barcode Scanner SDK](https://scanbot.io/developer/linux-barcode-scanner/)
## Trial License & Integration
### Start your Trial
- [Free Trial License](https://scanbot.io/trial/)
### Mobile Demo Apps
- [Barcode Demo](https://scanbot.io/demo-apps/#barcode-scanner-sdk)
- [Document Demo](https://scanbot.io/demo-apps/#document-scanner-sdk)
- [Data Capture Demo](https://scanbot.io/demo-apps/#data-capture-sdk)
### Get in touch
- [Get Started](https://scanbot.io/get-started/)
- [Contact Sales](https://scanbot.io/contact-sales/)
### Help & Assistance
- [FAQ](https://docs.scanbot.io/faq/)
- [Free Integration Support](https://docs.scanbot.io/support/)
## Solutions
- [Retail](https://scanbot.io/solutions/retail/)
- [Air Travel](https://scanbot.io/solutions/freight-logistics/)
- [Insurance](https://scanbot.io/solutions/insurance/)
- [Finance & Banking](https://scanbot.io/solutions/finance-banking/)
- [Manufacturing & Supply Chain](https://scanbot.io/solutions/manufacturing-supply-chain/)
- [Hospitality & Travel](https://scanbot.io/solutions/hospitality-travel/)
- [Healthcare](https://scanbot.io/solutions/healthcare/)
- [Technology & Software](https://scanbot.io/solutions/technology-software/)
## About Scanbot SDK
- [Company Overview](https://scanbot.io/about/)
- [Success Stories](https://scanbot.io/success-stories/)
- [Blog](https://scanbot.io/blog/)
- [Careers](https://scanbot.io/careers/)
- [Open Positions](https://scanbot.io/careers/open-positions/)
- [Newsroom](https://scanbot.io/newsroom/)
## Resources
- [Resources Overview](https://scanbot.io/resources/)
- [Barcode Generator](https://scanbot.io/barcode-generator/)
- [Barcode Lookup Tool](https://scanbot.io/lookup-tool/)
- [QR Code Scanner](https://scanbot.io/qr-code-scanner-online/)
- [Glossary](https://scanbot.io/glossary/)
+
## Web Barcode Scanner SDK
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanner-sdk/web-barcode-scanner/#main)
# Barcode Scanner SDK for the Web
Integrate a fast and reliable Barcode Scanner SDK into your web applications
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

## Fast and reliable barcode scanning for your website
With our web-based barcode scanner, you can easily add barcode scanning capabilities to your website or web app. Our SDK reads all common barcode symbologies and delivers fast and accurate detection even in challenging conditions.
Thanks to our customizable Ready-To-Use UI Components (RTU UI), you can integrate the Web Barcode Scanner SDK into your website in less than an hour. All our customers receive direct developer support. Simply connect with your Customer Success Manager or our support engineers via Slack or Teams.
Made for real-world conditions
Scan barcodes reliably even in challenging conditions:
- Damaged barcodes
- Low-light environments
- Tiny or distant barcodes

096653869330034PDF 417
Fast.
Very fast.
Every scan happens in
0.04s
or less
No server connection
Our SDK transmits no data. This guarantees complete data security.
[Customizable UI components\\
\\
Our Ready-To-Use UI components cover all barcode scanning scenarios and are highly customizable.](https://scanbot.io/rtu-ui/) [Scans all major barcode types\\
Code 39\\
\\
Code 93\\
\\
Code 32\\
\\
Code 25\\
\\
EAN-5\\
\\
PDF417\\
\\
GS1 DataBar\\
\\
Code 39\\
\\
Code 93\\
\\
Code 32\\
\\
Code 25\\
\\
EAN-5\\
\\
PDF417\\
\\
GS1 DataBar\\
\\
EAN-13\\
\\
MSI Plessey\\
\\
EAN-2\\
\\
Aztec Code\\
\\
rMQR Code\\
\\
Codabar\\
\\
UPC-A\\
\\
EAN-13\\
\\
MSI Plessey\\
\\
EAN-2\\
\\
Aztec Code\\
\\
rMQR Code\\
\\
Codabar\\
\\
UPC-A\\
\\
EAN-8\\
\\
ISBN\\
\\
GiroCode\\
\\
GS1-128\\
\\
Data Matrix\\
\\
IATA 2 of 5\\
\\
EAN-8\\
\\
ISBN\\
\\
GiroCode\\
\\
GS1-128\\
\\
Data Matrix\\
\\
IATA 2 of 5\\
\\
Code 128\\
\\
Code 11\\
\\
QR Code\\
\\
UPC-E\\
\\
Micro QR Code\\
\\
MaxiCode\\
\\
Code 128\\
\\
Code 11\\
\\
QR Code\\
\\
UPC-E\\
\\
Micro QR Code\\
\\
MaxiCode](https://scanbot.io/supported-barcodes/)
## Integrate this evening with your framework
categoryUse cases
## Discover common barcode scanning use cases
See how the Scanbot Web Barcode Scanner SDK’s scan modes improve your workflows
- ### Single Scanning
Ideal for simple activities where only a single barcode needs to be scanned, such as re-ordering a product or a stock lookup.
- ### Batch Scanning
This feature allows users to scan multiple codes in succession without closing the scanning screen. This simplifies tasks where a series of barcodes must be scanned, such as picking several products for one order.
- ### Multi Scanning
Capture multiple barcodes simultaneously. For example, it enables logistics workers to scan several packages at once.
- ### Find & Pick
Given one or more barcode values, the SDK will visually highlight and scan the correct items for your users. This simplifies finding the right package in last-mile operations, for example.
- ### Scan & Count
Let your users count multiple items automatically in one go. This allows retail workers, for example, to complete inventory counting more quickly.

diamondValue
## Why Scanbot SDK?
### Fixed pricing
Unpredictable costs are frustrating. The Scanbot SDK comes with a flat annual fee that includes everything, without limits on
users or scans.
### No server processing
Our SDK transmits no data. Everything happens locally. This guarantees complete data security.
### Enterprise support
Directly connect with your dedicated Customer Success Manager and our support engineers via Slack or Teams.
person\_celebrateSuccess Stories
## See what our customers say about Scanbot SDK
[See all success stories](https://scanbot.io/success-stories)
[arrow\_outward\\
](https://scanbot.io/success-stories/huk-coburg/)

[arrow\_outward\\
\\
How Rimi Baltic reduced its Scan & Go costs by 90% using Scanbot SDK](https://scanbot.io/success-stories/rimi-baltic/)
[arrow\_outward\\
](https://scanbot.io/success-stories/vakifbank/) [arrow\_outward\\
](https://scanbot.io/success-stories/coop-estonia/)
[arrow\_outward\\
](https://scanbot.io/success-stories/arcbest/)

[arrow\_outward\\
\\
\\
“We rely heavily on this solution, and the Scanbot SDK team has been a trusted partner since day one.”\\
\\
\\
\\
Patrick Krämer\\
\\
Product Owner MitarbeiterApp](https://scanbot.io/success-stories/telekom/)
[arrow\_outward\\
](https://scanbot.io/success-stories/swica/)

[arrow\_outward\\
](https://scanbot.io/success-stories/flaschenpost/)

[arrow\_outward\\
\\
Krónan fixed their Scan & Go issues by switching from Google ML Kit to Scanbot SDK](https://scanbot.io/success-stories/kronan/)
[arrow\_outward\\
](https://scanbot.io/success-stories/red-cross-flanders/)

[arrow\_outward\\
](https://scanbot.io/success-stories/huk-coburg/)

[arrow\_outward\\
\\
How Rimi Baltic reduced its Scan & Go costs by 90% using Scanbot SDK](https://scanbot.io/success-stories/rimi-baltic/)
[arrow\_outward\\
](https://scanbot.io/success-stories/vakifbank/) [arrow\_outward\\
](https://scanbot.io/success-stories/coop-estonia/)
[arrow\_outward\\
](https://scanbot.io/success-stories/arcbest/)

[arrow\_outward\\
\\
\\
“We rely heavily on this solution, and the Scanbot SDK team has been a trusted partner since day one.”\\
\\
\\
\\
Patrick Krämer\\
\\
Product Owner MitarbeiterApp](https://scanbot.io/success-stories/telekom/)
[arrow\_outward\\
](https://scanbot.io/success-stories/swica/)

[arrow\_outward\\
](https://scanbot.io/success-stories/flaschenpost/)

[arrow\_outward\\
\\
Krónan fixed their Scan & Go issues by switching from Google ML Kit to Scanbot SDK](https://scanbot.io/success-stories/kronan/)
[arrow\_outward\\
](https://scanbot.io/success-stories/red-cross-flanders/)

## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### How do I add a barcode scanner to my website?
A barcode scanner can be easily integrated into your website via a Web Scanner SDK. A Software Development Kit contains documentation, tools, and libraries that allow you to integrate barcode scanning functionality within a couple of hours.
### Can a barcode be scanned on a website?
Yes, the integration of a web barcode scanner allows you to easily scan barcodes on a website or in a web application.
### Which barcode symbologies are supported by Scanbot SDK’s Web Barcode Scanner?
With the Scanbot SDK, you can capture data from all common barcode symbologies, including EAN, UPC, Code128, PDF417, and [more](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/).
### What kind of camera do you recommend to scan barcodes from the browser?
We recommend using a camera with autofocus on smartphones or tablets.
+
## Scanbot SDK Demos
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/demo-apps/#main)
# Try the Scanbot SDK in our free demo applications
Barcode Scanner SDK
Document Scanner SDK
Data Capture Modules


## For mobile apps
Scan all standard 1D and 2D barcodes reliably in less than 0.04 seconds using our free barcode demo app. Explore various features like Multiple Scanning, Scan & Count, and our AR Overlays.
Or scan a QR code
Scan the code below to download the demo app from the App Store or Play Store


## For websites
Experience the speed and reliability of our Web Barcode Scanner SDK.
Scan the QR code with your smartphone to launch the web barcode demo.


## For mobile apps
Experience easy and reliable document scanning with our free demo app. Turn paper documents into high-quality scans.
Or scan a QR code
Scan the code below to download the demo app from the App Store or Play Store


## For websites
See how easy it is to create high-quality document scans in a web application.
Scan the QR code with your smartphone to launch the web document demo.


## For mobile apps
Experience fast and reliable data extraction in our free demo app. Extract key-value pairs from structured documents in milliseconds – 100% data secure.
Or scan a QR code
Scan the code below to download the demo app from the App Store or Play Store


## For websites
Test out fast and accurate data extraction directly in your browser.
Scan the QR code with your smartphone to launch the web data capture demo.

+
## Supported Barcode Types
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/#main)
# Supported barcode symbologies
All barcode types supported by the SDK and their common applications
## 1D barcodes
1D barcodes, or linear barcodes, are the original type of barcode. They are widely used across various industries for simple, efficient data encoding. These barcodes consist of parallel lines of varying widths and spacing, which represent numeric or alphanumeric information. This data can then be scanned rapidly and reliably with barcode readers. 1D barcodes are particularly common in retail, inventory management, and logistics, where they serve to streamline operations and enhance data accuracy.
### EAN

The European Article Number (EAN) is a standard barcode symbology used for product identification in retail and supply chain management worldwide. EAN barcodes encode Global Trade Item Numbers (GTINs), which uniquely identify products. They are assigned and managed by GS1.
- EAN-13: 13-digit barcode for individual product identification, used globally.
- EAN-8: Compact 8-digit barcode for small product packaging, suitable for retail and distribution.
- EAN-2: 2-digit supplemental barcode used with EAN-13, typically for issue numbers on periodicals.
- EAN-5: 5-digit supplemental barcode used with EAN-13 for price, weight, or variant information.
- ISBN: The International Standard Book Number (ISBN) barcode is a specialized form of the EAN-13 used exclusively for books.
[Learn more](https://scanbot.io/barcode-scanner-sdk/ean/)
### UPC

The Universal Product Code (UPC) is a barcode symbology widely used in North America for retail and distribution purposes. UPC barcodes encode Global Trade Item Numbers (GTINs) to uniquely identify products. This facilitates efficient supply chain management.
- UPC-A: 12-digit barcode encoding the GTIN, widely used in retail and distribution in North America.
- UPC-E: Compressed version of UPC-A barcode, designed for smaller items where a full 12-digit barcode would be too large.
[Learn more](https://scanbot.io/barcode-scanner-sdk/upc/)
### Code 128

This high-density barcode is used across various sectors, but particularly in logistics for marking goods and containers. It supports all ASCII characters and can thus encode a broad range of information, from basic numeric data to text with special characters.
[Learn more](https://scanbot.io/barcode-scanner-sdk/code-128/)
### GS1-128

A derivative of Code 128, GS1-128 incorporates the GS1 specification for Application Identifiers, which facilitates logistics operations. It typically encodes data such as order numbers, weights, dates of manufacture, and other critical logistical details.
[Learn more](https://scanbot.io/barcode-scanner-sdk/gs1-128/)
### Code 25

The Code 25 barcode (also known as Code 2 of 5) is a linear barcode used to encode numeric values. It was initially employed in the logistics industry and is still in use today in several industries. There are two types of Code 25 symbologies: Code 25 Industrial (also known as Standard 2 of 5 or Industrial 2 of 5) and Code 25 Interleaved (also known as Code 2 of 5 Interleaved or ITF).
### Code 39

Code 39 is a versatile barcode used in numerous industries, especially in the United States. It can encode letters, which is crucial in environments like automotive and electronics manufacturing. In total, it encodes 43 characters: letters, digits, and several special characters.
[Learn more](https://scanbot.io/barcode-scanner-sdk/code-39/)
### PZN (Pharmazentralnummer)

A unique identifier for medicines and pharmacy-only products in Germany, typically encoded as a Code 39 barcode containing six to seven digits and a check digit.
### Code 32

Code 32 is a linear barcode symbology specifically designed for encoding pharmaceutical products in Italy. It’s based on Code 39 and is used to encode an identification number for medication. Code 32 consists of 6 numeric characters and a check digit, typically preceded by the letter A when printed on packaging.
### Code 93

Used chiefly by Canada Post, Code 93 encodes 43 characters and five special symbols. In its extended form, it can represent all 128 ASCII characters, enabling it to store detailed delivery information.
[Learn more](https://scanbot.io/barcode-scanner-sdk/code-93/)
### Code 11

Code 11 is a linear barcode symbology used primarily in telecommunications. It can encode numeric digits 0-9 and the dash character. Code 11 is one of the oldest barcode types and is known for its high density, making it suitable for applications where space is at a premium.
### Codabar

Codabar is used in libraries, blood banks, and for other logistical applications. It is a self-checking barcode that encodes up to 16 alphanumeric characters.
[Learn more](https://scanbot.io/barcode-scanner-sdk/codabar/)
### MSI Plessey

Commonly found in grocery store shelving and warehousing, MSI Plessey is an improvement on the original Plessey code. It can use up to two check digits to enhance reliability. It holds numerical data and is used for a variety of product information.
[Learn more](https://scanbot.io/barcode-scanner-sdk/msi-barcode/)
### Standard 2 of 5

Standard 2 of 5 (also known as Industrial 2 of 5) is a barcode symbology in the Code 2 of 5 / Code 25 family. It is a general-purpose code and is used for general-purpose applications across various industries. It encodes an even number of numeric digits, with each digit represented by five bars and five spaces. Unlike Airline 2 of 5 (IATA 2 of 5), Standard 2 of 5 allows for optional check digits, providing flexibility in its implementation.
### ITF (Interleaved 2 of 5)

ITF (Interleaved 2 of 5) is a barcode symbology in the Code 2 of 5 / Code 25 family. It encodes numbers in pairs, using both the bars and the spaces, which results in a higher data density. ITF codes are prevalent in bulk storage and shipping environments, and are typically placed on the packing material.
[Learn more](https://scanbot.io/barcode-scanner-sdk/itf-code/)
### IATA 2 of 5

IATA 2 of 5 (also known as Airline 2 of 5) is a barcode symbology in the Code 2 of 5 / Code 25 family. It is utilized in the airline industry for processing and managing air cargo. It encodes an even number of numeric digits, without a check digit.
### GS1 DataBar

Formerly known as RSS (Reduced Space Symbology), GS1 DataBar barcodes are ideal for fresh produce and small item labeling in retail environments. They encode all 14 digits of a GTIN and can include additional information like expiration dates and batch numbers through GS1 Application Identifiers.
[Learn more](https://scanbot.io/barcode-scanner-sdk/gs1-databar/)
### GS1 DataBar Expanded

GS1 DataBar Expanded (formerly RSS Expanded) is used for similar applications as GS1 DataBar. It offers variable length encoding and omnidirectional scanning. It is particularly suited for dynamic retail and coupon applications.
[Learn more](https://scanbot.io/barcode-scanner-sdk/gs1-databar/)
### One-track Pharmacode

A simple binary code used in pharmaceutical packaging that encodes a number from 3 to 131,070 using vertical bars of varying widths.
[Learn more](https://scanbot.io/glossary/pharmacode/)
### Two-track Pharmacode

A binary barcode symbology used in the pharmaceutical industry that represents a number from 4 to 64,570,080 using short and tall bars positioned above or below a midline.
[Learn more](https://scanbot.io/glossary/pharmacode/)
## 2D barcodes
2D barcodes are more reliable and store more data per unit area than their 1D counterparts. They are thus suited to a wide range of applications, from retail and advertising to complex supply chain management and healthcare systems.
### QR Code

The extremely versatile QR Code symbology is used globally in marketing, public transport, airline ticketing, and parcel delivery. It can encode up to 7089 digits or 4296 alphanumeric characters. Thanks to automatic error correction, the data can be read even if up to 30% of the QR code is damaged.
[Learn more](https://scanbot.io/glossary/qr-code/)
### Micro QR Code

The Micro QR Code is a QR Code variant for applications requiring a smaller footprint. It can store up to 35 numeric or 21 alphanumeric characters and is ideal for items with limited labeling space.
[Learn more](https://scanbot.io/barcode-scanner-sdk/micro-qr-code/)
### rMQR Code

rMQR Code (Rectangular Micro QR Code) is a variant of the QR Code designed for applications where space is limited in one dimension. It maintains the core features of QR Codes but allows for rectangular shapes, making it suitable for narrow spaces like product packaging or electronic components.
[Learn more](https://scanbot.io/barcode-scanner-sdk/rmqr/)
### Aztec Code

Mostly used in transportation applications, such as train and airline tickets, the Aztec Code stores over 3000 characters. It offers high data density and fault tolerance.
[Learn more](https://scanbot.io/barcode-scanner-sdk/aztec-code/)
### PDF417 Code

The PDF417 barcode is popular in ticketing, logistics, and ID documents like the U.S. driver’s license. It can theoretically store 2725 numeric or 1850 alphanumeric characters, is size-adjustable, and boasts high fault tolerance.
[Learn more](https://scanbot.io/barcode-scanner-sdk/pdf417/)
### MicroPDF417 Code

MicroPDF417 is a two-dimensional stacked barcode symbology designed to encode a moderate amount of data in a very small space. It’s based on the PDF417 barcode but offers a more compact symbol size, capable of storing up to 250 alphanumeric characters or 366 numeric digits. MicroPDF417 uses Reed-Solomon error correction, allowing for data recovery even if parts of the barcode are damaged.
[Learn more](https://scanbot.io/barcode-scanner-sdk/micro-pdf417/)
### Data Matrix Code

Known for its small size and high capacity, the Data Matrix code is also readable in low-contrast conditions. It is therefore often used for direct part marking. The code features a distinctive L-shaped finder pattern and can store up to 3116 numeric or 2335 alphanumeric characters.
[Learn more](https://scanbot.io/barcode-scanner-sdk/data-matrix/)
### GS1 Data Matrix Code

The GS1 version of the standard Data Matrix code is tailored for the pharmaceutical industry. It facilitates the encoding of data such as batch numbers and expiration dates on medicinal products, enhancing traceability and counterfeiting protection.
[Learn more](https://scanbot.io/barcode-scanner-sdk/gs1-data-matrix/)
### GS1 DataBar Composite Code

This barcode combines a primary one-dimensional GS1 barcode (like DataBar, EAN, UPC-A, or GS1-128) with a secondary symbol (either PDF417 or MicroPDF417) that encodes additional data such as batch numbers or expiration dates. It is used to label items that require detailed information.
There are three subtypes of GS1 DataBar Composite Barcode, each designed for specific data requirements and symbology compatibility:
- GS1 Composite Code A (CC-A) encodes up to 56 characters in its 2D component, which is a MicroPDF417 code. The 1D component can be any GS1 barcode other than GS1-128.
- GS1 Composite Code B (CC-B) encodes more than 56 characters in its 2D component, which is a MicroPDF417 code, accommodating larger data sets. The 1D component can be any GS1 barcode other than GS1-128.
- GS1 Composite Code C (CC-C) is used to efficiently handle extensive data requirements. To do so, it pairs a GS1-128 code with a PDF417 code.
[Learn more](https://scanbot.io/barcode-scanner-sdk/gs1-databar/)
### MaxiCode

MaxiCode is a two-dimensional barcode consisting of a distinctive bull’s-eye pattern surrounded by a hexagonal array of dots. It was developed by UPS for package tracking and can encode up to 93 characters. MaxiCode is optimized for high-speed sorting and can be read omnidirectionally.
[Learn more](https://scanbot.io/barcode-scanner-sdk/maxicode/)
### GiroCode

GiroCode is a variant of the QR Code specified by the European Payments Council that facilitates digital money transfers. It is used exclusively for financial transactions within the EU.
[Learn more](https://scanbot.io/glossary/giro-code/)
### Swiss QR Code

Introduced in 2022 for invoicing in Switzerland, the Swiss QR Code carries all necessary payment details, streamlining transaction processing.
### Royal Mail Mailmark

Specifically developed for the UK’s Royal Mail, the Mailmark barcode is a high-density 2D code used to improve mail sorting and delivery efficiency.
[Learn more](https://scanbot.io/barcode-scanner-sdk/royal-mail/)
### NTIN Code

The NTIN code encodes a National Trade Item Number in a Data Matrix format to combat drug counterfeiting. The NTIN itself combines a national product registration number with a global GTIN prefix.
[Learn more](https://scanbot.io/glossary/gtin/)
### PPN Code

Similar to the NTIN code, the PPN (Pharmacy Product Number) code encodes specific pharmaceutical details in a Data Matrix code to support global efforts against drug counterfeiting.
[Learn more](https://scanbot.io/glossary/ppn/)
### UDI Code

The UDI (Unique Device Identification Code) system uses 1D or 2D barcodes on medical devices that encode critical information such as serial numbers and expiry dates. By improving traceability and counterfeit detection, UDI barcodes ultimately enhance patient safety.
[Learn more](https://scanbot.io/blog/improve-medical-device-tracking-with-a-udi-scanner/)
## Postal symbologies
Postal symbologies are specialized barcode formats designed to enhance mail sorting and delivery processes. These barcodes encode crucial delivery and tracking information, and are tailored to meet the needs of national postal systems.
### USPS Intelligent Mail Barcode

Developed by the US Postal Service to improve mail tracking and sorting, the Intelligent Mail barcode (IMb) is a 4-State Customer Barcode that encodes up to 31 digits across 65 bars. It features built-in error detection and encodes detailed information like service identifiers and routing codes.
[Learn more](https://scanbot.io/barcode-scanner-sdk/intelligent-mail-barcode/)
### RM4SCC Barcode

Used by the UK’s Royal Mail, the RM4SCC encodes UK postcodes and Delivery Point Suffixes (DPS) for efficient mail sorting. This 4-state barcode supports alphanumeric characters in order to store detailed mail routing data.
[Learn more](https://scanbot.io/barcode-scanner-sdk/royal-mail/)
### Australia Post 4-State Customer Code

This barcode is used by Australia Post to encode delivery information on parcels and letters. Available in three formats that differ in their capacity, it uses Reed-Solomon error correction to ensure accurate data transmission.
### Japan Post 4-State Customer Code

Also known as Kasutama Barcode, it facilitates automated mail processing in Japan by encoding a 7-digit postal code and additional address data. This system ensures fast, accurate mail sorting.
### KIX

The KIX (or Klant Index Code) is used by the Dutch postal services for mail sorting. Originally derived from the Royal Mail’s RM4SCC barcode, the symbology can encode the digits 0 to 9 and the letters A to Z. Each character is made up of a sequence of four bars, where each bar can be one of four types.
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
+
## Code 39 Barcode Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanner-sdk/code-39/#main)
# Code 39 Barcode Scanner
Add Code 39 scanning to your mobile application or website
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

## Turn smartphones into fast & reliable Code 39 scanners
The Scanbot Code 39 [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) delivers exceptional performance even under challenging conditions – such as code damage or when scanning small codes commonly found in industrial applications like warehousing and manufacturing. With a scanning speed of under 0.04 seconds, your users get instant reads for seamless workflows.
Key benefits include:
- **Offline scanning**: The Scanbot SDK works 100% on-device, ensuring both uninterrupted performance and data security.
- **Enterprise-grade support**: Get dedicated chat support via Slack, Teams or email for any issue. Includes free assistance during the integration phase.
- **Flat pricing model**: Cost stays the same no matter how much your user base or scanning volume grows.


### How this scanning tool works
Our free online Code 39 barcode reader scans codes directly through your camera or on imported images. This barcode scanner works in any browser, no app download or signup needed. Enjoy real-time camera view scanning or decode barcodes on pictures in seconds – just point your camera at the Code 39 barcode or import an image file to instantly access the encoded data.
This tool is powered by the [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/)!
* * *
(We don’t store any images or data you import. Everything stays on your device.)
## Understanding Code 39 barcodes
### What is a Code 39 barcode?
Code 39 is a one-dimensional (1D) barcode symbology standardized in ISO/IEC 16388. Developed in 1974, it was among the first barcodes to support alphanumeric data, including letters, numbers, and some special characters.
Each barcode includes start and stop characters (an asterisk) that help barcode scanners identify the code’s boundaries. Additionally, Code 39 includes an optional check character or check digit for enhanced error detection.
Code 39 barcodes are easily scanned by most barcode scanners and support manual verification thanks to their text interpretation below the barcode.
### Structure and components
Code 39 relies on patterns of wide and narrow bars and spaces to encode characters. Each character is represented by 9 elements: 5 bars and 4 spaces. These include 3 wide and 6 narrow elements, corresponding to “3 of 9.”
The symbology can encode 43 characters: numeric digits (0-9), uppercase letters (A-Z), and seven special characters (-, ., $, /, +, %, and space).
Code 39 barcodes consist of the following key components:
1. **Quiet zones**: Blank areas on both sides of the barcode that ensure proper detection and readability.
2. **Start character**: An asterisk (\*) that indicates the beginning of the barcode.
3. **Data characters**: The main content section where information is encoded.
4. **Stop character**: An asterisk (\*) that indicates the end of the barcode.

### Encoding and error detection
Each character pattern is assigned a numeric value, as shown in the table below.

These values are used to calculate the checksum. This is an optional modulo 10 or 43 check character added to the end of the Code 39 barcode for error detection.
Here’s how the checksum is calculated and encoded:
1. Assign numeric values to each character in the data portion of the barcode (using the table).
2. Sum all those numeric values together.
3. Divide the sum by 43 (the number of possible values) or 10.
4. The remainder of that division is the checksum value.
5. The character corresponding to this value is appended to the barcode.
### Applications of Code 39 barcodes
**Manufacturing and automotive**
Code 39 is common in the automotive industry and factory automation for tracking components, products, and work-in-progress items. It was also adopted by the Automotive Industry Action Group as the standard [VIN](https://scanbot.io/data-capture-software/vin-scanner/) Barcode.
**Healthcare**
In the healthcare sector, Code 39 barcodes are used for patient identification, medication management, and equipment tracking. In particular, the [Health Industry Bar Code Council](https://www.hibcc.org/) (HIBCC) regulates their use on wristbands, medication packaging, and medical devices.
**Logistics**
Code 39 barcodes are widespread in logistics applications, including inventory management, warehouse operations, and shipping processes.
**Military and government**
The United States Department of Defense uses Code 39 under the LOGMARS (Logistics Applications of Automated Marking and Reading Symbols) standard to label supplies and equipment.
### Advantages of Code 39 barcodes
- **Ease of printing**: Code 39 uses only two different bar widths (wide and narrow), making it highly lenient for printing on various surfaces.
- **Error detection**: Code 39’s self-checking and optional checksum enable basic error detection, but no error correction.
- **Scalability**: Code 39 can hold alphanumeric data and has no length limit, making it useful for a variety of applications.
- **Omnidirectional scanning**: The asymmetric start and stop character ensures seamless decoding from any angle.
### Why choose the Scanbot SDK for Code 39 scanning?
The Scanbot Barcode Scanner SDK is specifically designed to handle the challenges of decoding Code 39 barcodes in real-world scenarios.
What sets us apart:
- **Exceptional performance**: Reliably decodes even damaged, low-contrast or distorted barcodes.
- **High-speed scanning**: Read Code 39 barcodes in as little as 0.04 seconds.
- **Cross-platform compatibility**: Easily integrate with Android, iOS, cross-platform, web, Windows, and Linux platforms.
- **Customizable UI**: Customize the ready-to-use components to match your app or website design.
- **Privacy-first**: Operates offline for complete data security.
Whether your use case involves Code 39 barcodes, QR codes, or [any other barcode](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/), the Scanbot SDK delivers the accuracy, speed, and reliability you need to succeed.
* * *
## Related Barcode Types:
- [Data Matrix Scanner](https://scanbot.io/barcode-scanner-sdk/data-matrix/)
- [QR Code Scanner](https://scanbot.io/qr-code-scanner-online/)
- [PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/pdf417/)
- [Aztec Code Scanner](https://scanbot.io/barcode-scanner-sdk/aztec-code/)
- [Code 128 Scanner](https://scanbot.io/barcode-scanner-sdk/code-128/)
- [EAN Scanner](https://scanbot.io/barcode-scanner-sdk/ean/)
- [UPC Scanner](https://scanbot.io/barcode-scanner-sdk/upc/)
- [Micro QR Code Scanner](https://scanbot.io/barcode-scanner-sdk/micro-qr-code/)
- [GS1 DataBar Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-databar/)
- [GS1 DataMatrix Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-data-matrix/)
- [GS1-128 Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-128/)
- [MaxiCode Scanner](https://scanbot.io/barcode-scanner-sdk/maxicode/)
- [ITF Scanner](https://scanbot.io/barcode-scanner-sdk/itf-code/)
- [Codabar Scanner](https://scanbot.io/barcode-scanner-sdk/codabar/)
- [Intelligent Mail Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/intelligent-mail-barcode/)
- [rMQR Code Scanner](https://scanbot.io/barcode-scanner-sdk/rmqr/)
- [Royal Mail Scanner](https://scanbot.io/barcode-scanner-sdk/royal-mail/)
- [Micro PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/micro-pdf417/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### **What is the difference between a Code 39 and Code 128 barcode?**
Code 39 encodes fewer characters and is less dense, while Code 128 supports a larger character set and is more compact, allowing for higher data density.
### **What are the limitations of Code 39 barcodes?**
Code 39 has limited character support, encoding only uppercase letters, numbers, and a few symbols. It also has lower data density compared to barcodes like Code 128, which can encode more characters in a smaller space.
### **How could Scanbot SDK help you with Code 39 barcode scanning?**
The Scanbot Code 39 barcode scanner delivers exceptional performance in challenging environments, including damaged or curved barcodes, with a scanning speed of under 0.04 seconds for seamless workflows. Try it now with a [free trial license](https://scanbot.io/trial/).
+
## Serial Number Scanner SDK
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/data-capture-software/serial-number-scanner/#main)
# Serial Number Scanner SDK
Empower your mobile and web applications to capture serial numbers with speed and precision, offline and on-device, eliminating manual data entry errors.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

rocket\_launchSolution
## Fast and accurate Serial Number Scanner
Quickly and reliably capture serial numbers directly through your mobile or web application. The Scanbot Serial Number Scanner SDK replaces slow, error-prone manual input with efficient, automatic data extraction – even from challenging surfaces or in low-light conditions. Its advanced OCR and pattern recognition technology ensures high accuracy for a wide variety of serial number formats.
The Scanbot Serial Number Scanner SDK works entirely offline, keeping all data on the user’s device. This ensures dependable scanning performance anywhere and robust data security.
checkAvailable for mobile and web development platforms

## Integrate this evening with your framework
## What is a serial number?
A serial number is a unique identifier, typically a sequence of letters and numbers, assigned to one particular item. The core idea is simple: this gives the individual product a unique mark to differentiate it from all other units, even if they are visually identical or from the same batch.
You’ll find these codes vary quite a bit in how they are structured, with different lengths and character sets used by different makers. The reason for often including letters, not just numbers, is practical: it vastly increases the number of distinct codes that can be created, so every different item gets a unique one.
The practical use of these distinct codes boils down to enabling item-specific tracking. Businesses use this to maintain individual records for their products, which can tell them, for instance, an item’s point of origin, its time spent in inventory, or when it should be considered for replacement.
## **Types of serial numbers**
No single blueprint fits all serial numbers; their look and makeup shift to handle specific identification jobs. We generally see these key forms in action:
### Standard alphanumeric serial numbers
For many everyday goods – think consumer electronics, various machinery, or items on retail shelves – a flexible yet straightforward tag is essential. Mixing letters with numbers gives these products their unique ID, a system that offers a vast number of distinct codes while still being relatively easy for people to read and use.
### USNR (United States Serial Numbers Registry) codes
When an item is connected to U.S. military and defense operations, its serial code often follows a very specific, federally mandated playbook: the USNR system. This isn’t just any identifier; it’s a structured approach designed to guarantee highly reliable tracking and full compliance with stringent government regulations for critical assets.
### Custom manufacturer serial codes
Often, a company’s internal workings and specific product details demand a more personalized identification method. In these cases, businesses will engineer their own custom manufacturer serial codes. These unique-to-the-company tags can cleverly pack in vital internal data – such as batch origins, exact production dates, or line numbers – acting almost like a shorthand for their specific operational and tracking logic.
### Encoded serial numbers
Manually entering serial numbers can be slow and error-prone, especially with many items. The practical fix is to use encoded serial numbers. The idea is simple: any type of existing serial number can be transformed into a visual, machine-friendly format, like the stripes of a barcode or the squares of a QR code. Scanners then read these in an instant, making data input both quick and much more accurate.
## **Applications of serial number scanning**
### Manufacturing & industrial sector
In factories, thousands of parts go into making products, and each can have its own unique serial number. If workers have to manually read and type these numbers, it’s incredibly slow. Worse, it’s easy to make typos or misread a number. This can lead to big problems, like using the wrong component in an assembly or having incorrect records for quality control and traceability.
Instead of manual entry, workers can use a device with a scanning app. They just point it at the serial number on a part – whether it’s a barcode, QR code, or even plain text numbers on a label. The app reads the serial number instantly. Even if a part is a bit greasy or the lighting isn’t perfect, good scanning technology can often still capture the number correctly. The app can then immediately check if it’s the right part for that stage of production and automatically log it.
### Logistics & warehousing sector
Warehouses are constantly buzzing with items coming in and going out – things like computers, tools, electronics, you name it. Each of these items often has a serial number, sometimes on tiny labels or directly on the product, and these labels can get worn or be hard to reach. Keeping track of all these serial numbers correctly is essential to avoid losing items and to know exactly what’s in stock. Trying to do this by hand, especially when dealing with large volumes, is very difficult and prone to mistakes.
Warehouse staff can use mobile apps on phones or dedicated scanners to quickly read these serial numbers. Whether an item is being received, moved, counted during a stocktake, or shipped out, a quick scan captures its serial number. Modern scanning can often read numbers even from slightly damaged labels or when there are many items close together. Some systems even work offline, so a poor internet connection in the warehouse doesn’t stop the work.
### Electronics & telecommunications sector
Repair technicians working in the field often need to identify specific equipment, like internet routers, servers, or other electronic devices, by their serial numbers. These numbers are frequently printed very small, might be on curved surfaces, or could be faded or dirty, making them hard to read clearly and type correctly into a service app or database, especially when the technician is on-site, possibly in an awkward location. This can slow down the repair process considerably. With a service app on their smartphone or tablet that includes good scanning capabilities, technicians can use the device’s camera to quickly capture the serial number. Even if the label is worn or the number is tiny, the app can often decipher it. Once scanned, the app can instantly pull up the equipment’s details, repair history, customer information, or warranty status.
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### **What types of serial numbers can the Scanbot SDK read?**
The Scanbot SDK reads printed alphanumeric serial numbers (a mix of letters and numbers). It's built to handle these across many surfaces and materials, adapting to different fonts, sizes, and layouts. Its capability extends to challenging situations, such as curved surfaces, worn labels, or low-contrast print.
### **Does the Scanbot Serial Number Scanner SDK work offline?**
Yes, the Scanbot SDK operates fully offline. All scanning and data processing are performed directly on the user's device, meaning no internet connection is necessary. This design ensures functionality in remote locations and supports secure environments where data privacy is critical.
### **Is the Scanbot SDK GDPR compliant?**
Yes, the Scanbot SDK is fully GDPR – compliant. Its on-device data processing model, where no data leaves the user's device, inherently supports privacy-first application development and aligns with the strictest data protection regulations like GDPR.
+
## Data Extraction SDK
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/data-capture-software/data-scanner/#main)
# Text Pattern Scanner SDK
Extract single-line data with your mobile or web app
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

rocket\_launchSolution
## Efficient, accurate, and user-friendly mobile data extraction
Quickly and accurately extract single-line data through your mobile or web app. The Scanbot Text Pattern Scanner SDK replaces slow, time-consuming, and error-prone manual data entry with reliable automatic data extraction. Create custom patterns tailored to your specific use case for optimal results.
The Scanbot Text Pattern Scanner SDK operates entirely offline, without any server connections, ensuring dependable scanning performance and robust data security.
checkAvailable for mobile and web development platforms

## Integrate this evening with your framework
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### **What is a text pattern scanner?**
Text pattern scanners are hardware or software that extract and process information from sources like images and documents (e.g., invoices and forms). Using optical character recognition (OCR), text can be extracted and converted into a digital format.
The Scanbot Text Pattern Scanner SDK allows you to extract single-line data within your own web or app environment. You can create predefined patterns tailored to your specific use case. This ensures that the software knows exactly what type of information to look for, improving accuracy and efficiency in extracting relevant data.
### **Can I use my phone to scan data?**
Yes. Any mobile device with a camera is suitable for scanning data. Simply install a text pattern scanning app or integrate a text pattern scanner SDK into your own application. Enterprise-grade text pattern scanning SDKs, such as the Scanbot SDK, can be easily integrated into an app within hours. With our ready-to-use UI components, developers can easily integrate the Text Pattern Scanner SDK in their own app.
Want to try it out for yourself? Download our [demo app](https://scanbot.io/demo-apps/) or request a [free 7-day trial license](https://scanbot.io/trial/).
### **Can the Scanbot Text Pattern Scanner SDK capture numbers and text?**
Yes. Our SDK can scan any text consisting of alphanumeric characters. Simply scan your data using the camera of your device and process the result in your workflow. Download our [demo app](https://scanbot.io/demo-apps/#data-capture-modules) to try it out yourself.
### **Does the Scanbot Text Pattern Scanner** **SDK need an internet connection?**
No, as a 100% offline solution, the SDK doesn’t need an internet connection. This guarantees that personal data remains secure, with all necessary data privacy measures upheld.
### **What should I consider when choosing a text pattern scanning software?**
A Text Pattern Scanner SDK should provide fast scanning functionalities and accurately extract data for easy processing by your backend systems. It should increase your efficiency by reducing processing time and minimizing human errors. Furthermore, the scanner should provide high-quality outputs only.
Here are some important factors to consider:
**Performance and accuracy**: Make sure the scanning solution is able to scan data quickly and accurately in all conditions. This includes scanning in low-light environments, scanning damaged or blurry barcodes, or scanning barcodes up close or from long distances. It should also extract data accurately, minimizing the risk of errors.
**Compatibility**: Look out for software that works seamlessly with your development environment and is compatible with the devices you plan to use, both mobile or desktop.
**Data privacy**: Considering you might handle sensitive information, you should pay extra attention to data security. The Scanbot US Driver’s License Scanner SDK operates entirely offline, ensuring full data privacy.
**Developer support**: Make sure your software provider offers sufficient support for developers to facilitate smooth integration. With Scanbot SDK, you’ll have access to detailed [documentation](https://docs.scanbot.io/) and Slack and Teams channels for [direct assistance](https://docs.scanbot.io/support/).
**Pricing model**: Look for a pricing model that fits your business needs and scales without extra costs. Scanbot SDK offers an unlimited scanning model with a fixed annual fee, so you can use it without worrying about rising expenses.
### **How do I integrate the Scanbot Text Pattern Scanner SDK into my app?**
Our Text Pattern Scanner SDK comes with detailed [documentation](https://docs.scanbot.io/) that takes you through the integration process step by step. The entire integration doesn’t take longer than a few hours. If you need any additional support, we are happy to help you with our [free support channels](https://docs.scanbot.io/support/).
### **Which platforms is the Scanbot Text Pattern Scanner SDK currently available for?**
Our Text Pattern Scanner SDK supports development for Native Android and iOS, JavaScript (Web), Flutter, React Native, Cordova, Capacitor / Ionic, Xamarin, and .NET MAUI. Try the Scanbot Text Pattern Scanner SDK by downloading the [demo app](https://scanbot.io/demo-apps/#data-capture-modules) or requesting a [free trial license](https://scanbot.io/trial/).
+
## Barcode Scanner SDK
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanner-sdk/#main)
# Fast and reliable Barcode Scanner SDK for your app or website
Turn mobile devices into fast & reliable barcode readers
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

AR Overlay
Provides real-time visual feedback as your users scan, enhancing the user experience.

ABCFXPHxKData Matrix
Fast.
Very fast.
Every scan happens in
0.04s
or less
On-device intelligence
100% offline – no servers, no tracking, complete data security.
[Customizable UI components\\
\\
Our Ready-To-Use UI components cover all barcode scanning scenarios and are highly customizable.](https://scanbot.io/rtu-ui/)
Made for real-world conditions
Scan barcodes reliably even in challenging conditions:
- Damaged barcodes
- Low-light environments
- Tiny or distant barcodes

096653869330034PDF 417
Available for App & Web
The SDK supports iOS, Android, Web, Windows, Linux, and all common cross-platform frameworks, including Flutter, React Native, and .NET MAUI.
[Scans all major barcode types\\
Code 39\\
\\
Code 93\\
\\
Code 32\\
\\
Code 25\\
\\
EAN-5\\
\\
PDF417\\
\\
GS1 DataBar\\
\\
Code 39\\
\\
Code 93\\
\\
Code 32\\
\\
Code 25\\
\\
EAN-5\\
\\
PDF417\\
\\
GS1 DataBar\\
\\
EAN-13\\
\\
MSI Plessey\\
\\
EAN-2\\
\\
Aztec Code\\
\\
rMQR Code\\
\\
Codabar\\
\\
UPC-A\\
\\
EAN-13\\
\\
MSI Plessey\\
\\
EAN-2\\
\\
Aztec Code\\
\\
rMQR Code\\
\\
Codabar\\
\\
UPC-A\\
\\
EAN-8\\
\\
ISBN\\
\\
GiroCode\\
\\
GS1-128\\
\\
Data Matrix\\
\\
IATA 2 of 5\\
\\
EAN-8\\
\\
ISBN\\
\\
GiroCode\\
\\
GS1-128\\
\\
Data Matrix\\
\\
IATA 2 of 5\\
\\
Code 128\\
\\
Code 11\\
\\
QR Code\\
\\
UPC-E\\
\\
Micro QR Code\\
\\
MaxiCode\\
\\
Code 128\\
\\
Code 11\\
\\
QR Code\\
\\
UPC-E\\
\\
Micro QR Code\\
\\
MaxiCode](https://scanbot.io/supported-barcodes/)
## Integrate this evening with your framework
categoryUse cases
## Discover common barcode scanning use cases
See how the Scanbot Barcode Scanner SDKs scan modes can improve your workflows.
- ### Single Scanning
Ideal for simple activities where only a single barcode needs to be scanned, such as re-ordering a product or a stock lookup.
- ### Batch Scanning
This feature allows users to scan multiple codes in succession without closing the scanning screen. This simplifies tasks where a series of barcodes must be scanned, such as picking several products for one order.
- ### Multi Scanning
Capture multiple barcodes simultaneously. For example, it enables logistics workers to scan several packages at once.
- ### Find & Pick
Given one or more barcode values, the SDK will visually highlight and scan the correct items for your users. This simplifies finding the right package in last-mile operations, for example.
- ### Scan & Count
Let your users count multiple items automatically in one go. This allows retail workers, for example, to complete inventory counting more quickly.

diamondValue
## Why Scanbot SDK?
### Fixed pricing
Unpredictable costs are frustrating. The Scanbot SDK comes with a flat annual fee that includes everything, without limits on
users or scans.
### On-device intelligence
Our SDK works entirely offline, without any server connections or usage tracking. This ensures complete data security.
### Enterprise support
Directly connect with your dedicated Customer Success Manager and our support engineers via Slack or Teams.
person\_celebrateSuccess Stories
## See what our customers say about Scanbot SDK
[See all success stories](https://scanbot.io/success-stories)
[arrow\_outward\\
](https://scanbot.io/success-stories/huk-coburg/)

[arrow\_outward\\
\\
How Rimi Baltic reduced its Scan & Go costs by 90% using Scanbot SDK](https://scanbot.io/success-stories/rimi-baltic/)
[arrow\_outward\\
](https://scanbot.io/success-stories/vakifbank/) [arrow\_outward\\
](https://scanbot.io/success-stories/coop-estonia/)
[arrow\_outward\\
](https://scanbot.io/success-stories/arcbest/)

[arrow\_outward\\
\\
\\
“We rely heavily on this solution, and the Scanbot SDK team has been a trusted partner since day one.”\\
\\
\\
\\
Patrick Krämer\\
\\
Product Owner MitarbeiterApp](https://scanbot.io/success-stories/telekom/)
[arrow\_outward\\
](https://scanbot.io/success-stories/swica/)

[arrow\_outward\\
](https://scanbot.io/success-stories/flaschenpost/)

[arrow\_outward\\
\\
Krónan fixed their Scan & Go issues by switching from Google ML Kit to Scanbot SDK](https://scanbot.io/success-stories/kronan/)
[arrow\_outward\\
](https://scanbot.io/success-stories/red-cross-flanders/)

[arrow\_outward\\
](https://scanbot.io/success-stories/huk-coburg/)

[arrow\_outward\\
\\
How Rimi Baltic reduced its Scan & Go costs by 90% using Scanbot SDK](https://scanbot.io/success-stories/rimi-baltic/)
[arrow\_outward\\
](https://scanbot.io/success-stories/vakifbank/) [arrow\_outward\\
](https://scanbot.io/success-stories/coop-estonia/)
[arrow\_outward\\
](https://scanbot.io/success-stories/arcbest/)

[arrow\_outward\\
\\
\\
“We rely heavily on this solution, and the Scanbot SDK team has been a trusted partner since day one.”\\
\\
\\
\\
Patrick Krämer\\
\\
Product Owner MitarbeiterApp](https://scanbot.io/success-stories/telekom/)
[arrow\_outward\\
](https://scanbot.io/success-stories/swica/)

[arrow\_outward\\
](https://scanbot.io/success-stories/flaschenpost/)

[arrow\_outward\\
\\
Krónan fixed their Scan & Go issues by switching from Google ML Kit to Scanbot SDK](https://scanbot.io/success-stories/kronan/)
[arrow\_outward\\
](https://scanbot.io/success-stories/red-cross-flanders/)

## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### What is a barcode scanner SDK?
A barcode scanner software development kit (SDK) is a set of development tools that turns any device with a camera, such as a smartphone or tablet, into a reliable and easy-to-use barcode scanner. The Scanbot Barcode Scanner SDK utilizes machine learning and computer vision technology to deliver fast and accurate scanning results. Additionally, it offers advanced features like batch scanning and an AR overlay. It operates entirely offline, and integration into your mobile app or website takes only a couple of hours.
### What is a barcode scanner API?
API stands for "application programming interface". It allows different software applications to talk to one another. Barcode APIs enable developers to integrate barcode scanning functionalities into their apps. The Scanbot Barcode Scanner API provides real-time scanning on mobile devices and can recognize multiple barcodes at once. Moreover, it supports [many different barcode formats](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/).
### Why should I use a barcode scanning software?
A software-based barcode scanner is installed on devices that are already available in most cases, such as smartphones, tablets or computers. This means that you don’t have to invest capital in additional hardware. Additionally, smartphones are not limited to barcode scanning but can also be used for other purposes. Furthermore, it reduces human error resulting from manual data entry and improves efficiency since it is significantly faster.
### **What should I consider when choosing the best barcode scanner SDK?**
Overall, the best barcode scanner SDK should provide fast and reliable results that make daily operations easier and more efficient. It should be easy to use and improve the workflow of the user.
Some important factors to consider are:
**Performance and reliability:** The scanning software should operate fast and accurately in all conditions. This includes scanning in low-light environments, scanning damaged or blurry barcodes, or scanning barcodes up close or from long distances.
**Compatibility and barcode support:** Look out for a solution that is compatible with your development platform and the devices you want to support. Furthermore, make sure to check that the barcode scanning software supports the barcode symbologies you require.
**Features:** Depending on your use case, look for specific features, such as batch scanning, an AR overlay, and real-time feedback, as they can significantly improve the user flow of your application.
**Developer support**: Make sure your software provider offers developer support and maintenance for a smooth integration process. Scanbot SDK provides extensive documentation as well as dedicated Slack and Teams channels for direct customer support.
**Pricing model**: Choose a pricing model that allows you to scale your use case, without having to worry about increasing costs. To not limit your usage, we offer unlimited scanning for a fixed annual price.
### How do barcodes work?
Barcodes encode data into a visual pattern of lines or squares. The pattern represents information, typically numbers or characters, and can be interpreted as binary data (1s and 0s) by scanning software. This binary data is then translated into the original information, such as a product number or name.
There are two types of barcodes:
**One-dimensional (1D) barcodes** or linear codes represent data through the varying widths and spacing of parallel lines. UPC and EAN codes are examples of 1D barcodes.
**Two-dimensional (2D) barcodes** or matrix codes encode data both horizontally and vertically, with QR codes and PDF417 being popular examples.
For more detailed information on different barcodes and their usage, check out our [blog post](https://scanbot.io/blog/types-of-barcodes/).
### Is a barcode scanner hardware or software?
A barcode scanner can be either hardware or software-based. Hardware scanners are physical devices, including handheld scanners or fixed-mount scanners. They are designed for the sole purpose of scanning barcodes. On the other hand, software scanners such as the Scanbot Barcode Scanner SDK can be integrated or installed on smartphones, computers, or tablets. They scan barcodes by using the device’s camera.
Some key differences are the cost and flexibility. By adopting a bring-your-own-device approach, companies can save themselves the investment cost for new devices, as well as the running costs for maintenance or device replacements. Software-based scanners running on smartphones are easier to maintain and offer more flexibility, as the device can be used for other purposes. Read more on the advantages and disadvantages of both solutions [here](https://scanbot.io/blog/barcode-reader-pros-cons/).
The Scanbot Barcode Scanner SDK enables businesses to add powerful barcode scanning functionalities to already-available smart devices. Furthermore, it scans up to [26 barcodes per second](https://scanbot.io/blog/scanning-twenty-six-barcodes-per-second/) and is able to [read barcodes in all conditions](https://scanbot.io/blog/how-to-read-damaged-or-blurry-barcodes/).
### Can I use my phone as a barcode scanner?
Yes. Any mobile device with a camera is suitable for barcode scanning. Simply install a barcode scanning app or integrate a barcode scanner SDK into your own application. Enterprise-grade barcode scanning SDKs, such as the Scanbot SDK, can be easily integrated into an app within hours. With our ready-to-use UI components, developers can easily integrate the Barcode Scanner SDK in their own app.
Want to try it out for yourself? Download our [demo app](https://scanbot.io/demo-apps/) or request a [free 7-day trial license](https://scanbot.io/trial/).
### What different barcode scanners are available?
There are two primary categories of barcode scanners: hardware-based scanners and software-based scanners. Hardware-based scanners are physical devices specifically designed for scanning purposes. Some examples include pen-type or wand-type laser scanners. Software-based scanners can be installed on smart devices to use the device’s camera to scan barcodes.
### **How do I integrate the Scanbot Barcode Scanner SDK into my app?**
Our Scanbot Barcode Scanner SDK comes with detailed [documentation](https://docs.scanbot.io/) that takes you through the integration process step by step. The entire integration doesn’t take longer than a few hours. You can also find hands-on tutorials and detailed information on supported frameworks in our [Technology Blog](https://scanbot.io/techblog/). If you need any additional support, we are happy to assist you on our [free support channels](https://docs.scanbot.io/support/).
### **Which platforms is the Scanbot Barcode Scanner SDK currently available for?**
The Scanbot Barcode Scanner SDK supports a wide range of platforms, allowing developers to integrate barcode scanning capabilities using various app development frameworks.
The supported platforms include:
Native [Android](https://scanbot.io/developer/android-barcode-scanner/) and [iOS](https://scanbot.io/developer/ios-barcode-scanner-sdk/), [JavaScript](https://scanbot.io/developer/javascript-barcode-scanner/) (Web), [Flutter](https://scanbot.io/developer/flutter-barcode-scanner/), [React Native](https://scanbot.io/developer/react-native-barcode-scanner/), [Cordova](https://scanbot.io/developer/cordova-barcode-scanner-plugin/), [Capacitor / Ionic](https://scanbot.io/developer/capacitor-barcode-scanner-sdk/), [Xamarin](https://scanbot.io/developer/xamarin-barcode-scanner/), [.NET MAUI](https://scanbot.io/developer/net-maui-barcode-scanner-sdk/), [UWP](https://scanbot.io/developer/uwp-barcode-scanner/) (Universal Windows Platform), and [Linux](https://scanbot.io/developer/linux-barcode-scanner/).
This extensive platform support ensures flexibility in deploying barcode scanning functionalities across mobile, desktop, and web environments.
+
## Barcode Scanning Software
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanning-software/#main)
# Barcode Scanning Software for your app or website
Turn mobile devices into fast & reliable barcode readers
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

## Speed up workflows with accurate Barcode Scanning Software
[play\_circle](https://scanbot.io/wp-content/uploads/2025/04/Scanbot-Barcode-Video-Ad-1.mp4)
## Supported development frameworks

### Mobile apps
Our [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) works with all types of mobile applications. The software is available for native iOS and Android development.
For cross-platform frameworks, we support React Native, Flutter, .NET MAUI, Xamarin, Cordova, Capacitor, and Compose Multiplatform.

### Web apps
Our [Web SDK](https://scanbot.io/barcode-scanner-sdk/web-barcode-scanner/) is based on WebAssembly and supports common web frameworks including React, Angular, and Vue as well as Progressive Web Applications (PWAs).
The SDK is compatible with all major browsers: Microsoft Edge 16+, Firefox 53+, Google Chrome 57+, and Safari 11+.

### Linux server apps and Windows apps
Our [Linux Barcode Scanner SDK](https://scanbot.io/developer/linux-barcode-scanner/) enables scanning deployment in server environments, embedded systems, and edge devices. It is currently in closed beta but available upon request.
For Windows, we support Linux Universal Windows Platform (UWP) and WinUI 3. The SDK works with Windows 10 (version 1809 and higher) on devices with autofocus cameras using x64 architecture.
## Barcode scanning use cases across industries
- ### Retail
Barcode scanning enables real-time inventory management while slashing errors, accelerates checkout, powers self-service options, and streamlines warehouse operations. In consumer apps, it [boosts customer experience](https://scanbot.io/solutions/retail/) through loyalty programs, personalized promotions, and product information access.
- ### Freight Logistics
In the [logistics industry](https://scanbot.io/solutions/freight-logistics/), mobile barcode scanners drive efficiency and minimize mistakes. They streamline cross-docking, last-mile delivery, and fleet management by providing instant shipment status and proof-of-delivery data.
The Scanbot SDK’s offline functionality ensures drivers can scan seamlessly even in remote areas without network coverage.
- ### Manufacturing & Supply Chain
For [manufacturers](https://scanbot.io/solutions/manufacturing-supply-chain/) and distributors, a barcode scanning app enables accurate component tracking and efficient inventory management across the entire production lifecycle. [Cypher Robotics](https://scanbot.io/success-stories/cypher-robotics/), for instance, cut inventory count times by 90% by implementing our Linux SDK on their warehouse drone fleet.
Mobile barcode scanning software pairs perfectly with [direct part marking](https://scanbot.io/blog/direct-part-marking-barcodes/) (DPM), as smartphone-based scanners can reliably capture small, soiled, or engraved codes that traditional hardware laser scanners struggle to read.
- ### Hospitality & Travel
Smartphone and tablet scanners enable airline personnel to scan barcodes on boarding passes rapidly from anywhere in the terminal, reducing gate congestion. Mobile luggage tag scanning, meanwhile, lets staff and passengers track the luggage in real time.
Barcode scanners in [hospitality](https://scanbot.io/solutions/hospitality-travel/) also let hotel guests check in by simply scanning reservation QR codes, bypassing front desk queues entirely. Smartphone scanning creates smoother experiences for travelers and streamlines workflows for staff, improving customer satisfaction and saving costs.
- ### Healthcare
Mobile barcode scanning is transforming [healthcare](https://scanbot.io/solutions/healthcare/) by enabling accurate specimen labeling, equipment tracking, and medication administration directly at the point of care. Smartphone-based scanners help medical staff save time, [prevent identification errors](https://scanbot.io/blog/barcode-scanner-patient-identification-system/), verify that patients receive the correct medication, and efficiently monitor medical equipment.

diamondValue
## Why Scanbot SDK?
### Speed & UX
Scan multiple codes simultaneously. Deliver real-time feedback with augmented reality (AR) overlays. Make scanning easy for everyone with intuitive user guidance.
### Full data privacy
Our SDK works offline, protecting your data by processing everything on-device. Without network connections, the software offers full data security and is GDPR- and CCPA-compliant by default.
### Direct support
Need help with integration? Have feature requests or questions? Talk to your dedicated Customer Success Manager and chat with our developers via [Slack or Teams](https://docs.scanbot.io/support/).
## The advantages of software scanners

### Cost-effective
Smartphone-based scanning solutions offer a lower total cost of ownership. Especially with a BYOD policy, which virtually eliminates hardware costs.

### Versatile and scalable
Software scanners enable multi-code scanning in a single capture, while hardware scanners are limited to one code at a time. They scale easily – one app, unlimited devices.

### Easy to deploy and use
Mobile scanners leverage familiar smartphone interfaces. Users need next to no training, enabling rapid deployment and adoption.
person\_celebrateSuccess Stories
## See what our customers say about Scanbot SDK
[See all success stories](https://scanbot.io/success-stories)
[arrow\_outward\\
](https://scanbot.io/success-stories/huk-coburg/)

[arrow\_outward\\
\\
How Rimi Baltic reduced its Scan & Go costs by 90% using Scanbot SDK](https://scanbot.io/success-stories/rimi-baltic/)
[arrow\_outward\\
](https://scanbot.io/success-stories/vakifbank/) [arrow\_outward\\
](https://scanbot.io/success-stories/coop-estonia/)
[arrow\_outward\\
](https://scanbot.io/success-stories/arcbest/)

[arrow\_outward\\
\\
\\
“We rely heavily on this solution, and the Scanbot SDK team has been a trusted partner since day one.”\\
\\
\\
\\
Patrick Krämer\\
\\
Product Owner MitarbeiterApp](https://scanbot.io/success-stories/telekom/)
[arrow\_outward\\
](https://scanbot.io/success-stories/swica/)

[arrow\_outward\\
](https://scanbot.io/success-stories/flaschenpost/)

[arrow\_outward\\
\\
Krónan fixed their Scan & Go issues by switching from Google ML Kit to Scanbot SDK](https://scanbot.io/success-stories/kronan/)
[arrow\_outward\\
](https://scanbot.io/success-stories/red-cross-flanders/)

[arrow\_outward\\
](https://scanbot.io/success-stories/huk-coburg/)

[arrow\_outward\\
\\
How Rimi Baltic reduced its Scan & Go costs by 90% using Scanbot SDK](https://scanbot.io/success-stories/rimi-baltic/)
[arrow\_outward\\
](https://scanbot.io/success-stories/vakifbank/) [arrow\_outward\\
](https://scanbot.io/success-stories/coop-estonia/)
[arrow\_outward\\
](https://scanbot.io/success-stories/arcbest/)

[arrow\_outward\\
\\
\\
“We rely heavily on this solution, and the Scanbot SDK team has been a trusted partner since day one.”\\
\\
\\
\\
Patrick Krämer\\
\\
Product Owner MitarbeiterApp](https://scanbot.io/success-stories/telekom/)
[arrow\_outward\\
](https://scanbot.io/success-stories/swica/)

[arrow\_outward\\
](https://scanbot.io/success-stories/flaschenpost/)

[arrow\_outward\\
\\
Krónan fixed their Scan & Go issues by switching from Google ML Kit to Scanbot SDK](https://scanbot.io/success-stories/kronan/)
[arrow\_outward\\
](https://scanbot.io/success-stories/red-cross-flanders/)

## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### **Can I use my smartphone as a barcode scanner?**
Yes. With the [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) in your app, users can capture barcodes directly with their mobile device camera. Intelligent user guidance and AR overlays provide real-time feedback, ensuring accurate scans on the first try, no training needed.
### **What is barcode scanning software?**
Barcode scanning software is a technology that transforms smart devices, such as smartphones and tablets, into powerful scanning tools. Unlike traditional hardware, software enables you to leverage devices you already own, providing enterprise-grade scanning capabilities without additional equipment costs.
Our barcode scanning software captures all standard 1D and 2D barcodes with high accuracy, in just 0.04 seconds per code. Our solutions are highly versatile, offering advanced features like [batch scanning](https://scanbot.io/blog/enhancing-operations-with-multi-barcode-scanners/), user guidance, and [AR overlays](https://scanbot.io/blog/how-to-use-our-barcode-scanner-ar-overlay/).
### **What is the difference between barcode scanning software and hardware?**
While hardware scanners excel in specialized scenarios, barcode scanning software has a broader range of benefits:
\- **Performance**: Modern smartphone cameras often surpass the scanning capabilities of hardware devices.
\- **Ease of implementation**: Software solutions are easily installed on existing devices and can be updated remotely, while hardware scanners are specialized equipment and require ongoing maintenance.
\- **Flexibility and cost-effectiveness**: Leveraging existing devices with powerful scanning software eliminates dedicated hardware investments and reduces long-term expenses.
\- **Mobility**: Mobile scanning offers greater portability and convenience, especially in dynamic work environments where bulky hardware – especially corded devices – is impractical.
### **What platforms is the Scanbot SDK barcode scanning technology available for?**
Our technology is available for all common mobile and web development platforms. Apart from native Android and native iOS, we also support cross-platform frameworks like .NET MAUI, Flutter, and React Native.
### **How can I test the Scanbot Barcode Scanner Software?**
Download our [demo app](https://scanbot.io/demo-apps/) and try our technology yourself. Want to see how our solution integrates with your own application or website? Request a free 7-day trial license [here](https://scanbot.io/trial/) and get testing!
### **How do I install and configure the Scanbot Barcode Scanner Software?**
To install and configure the Scanbot SDK, first add the package to your project and install the dependencies. Next, implement the scanning functionality and set your options. Finally, you’ll need to handle the scan results. You can find a detailed description and examples in our [documentation](https://docs.scanbot.io/).
Looking for a step-by-step tutorial for your particular platform? Check out our [tech blog](https://scanbot.io/techblog/)!
+
## Web Document Scanner SDK
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/document-scanner-sdk/web-document-scanner/#main)
# Reliable document scanning for your web app
The Scanbot Web Document Scanner SDK brings reliable scanning to your website or web application
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

## High-quality document scanning in your website
With our Document Scanner SDK for the web, users can immediately capture crisp document scans with their smartphones, no app download needed. Integrate the SDK into your website in a few hours with direct developer support. Simply connect with your Customer Success Manager or our support engineers via Slack or Teams.
Simple to use for anyone
Allow even non-tech-savvy users to easily create crisp document scans thanks to user guidance, automatic capture, auto-cropping, and other features.
Ready to capture
Capturing...
Captured!
0
Add
Retake
Crop
Rotate
Delete
AA
scanbot.io
High-quality scans
Let your users generate high-quality scans suitable for automated processing.
No need to build an app
Integrate the Scanbot SDK into your website or web app and let users create high-quality scans right from their browser – no need to build a mobile app.

No server connection
Our SDK transmits no data. This guarantees complete data security.
## Integrate this evening with your framework
categoryUse cases
## Learn more about our document scanning features
The SDK’s comprehensive feature set simplifies the scanning experience for your users and improves output quality
- ### User guidance
Ease of use is crucial for any app’s design, but especially if the user base is large. Our on-screen user guidance helps even non-tech-savvy users create the perfect scan.
- ### Automatic capture
The SDK automatically triggers the scan when the device is ideally positioned over the document. This minimizes submissions of blurry or incomplete scans.
- ### Automatic cropping
Our SDK automatically straightens and crops documents, producing high-quality scans every time.
- ### Document Quality Analyzer
This feature automatically rates the scan quality from “very poor” to “excellent”. If it is low, it can prompt the user to rescan. This allows you to build quality checks into your workflow.
- ### Custom filters
Every use case has specific image requirements. The SDK’s custom filters allow you to transform document images into optimal input for your backend systems. They include grayscale, several binarization options, and more.
- ### Multiple export formats
The Web Document Scanner SDK supports several output formats for compatibility with all common backend systems: JPG, PDF, TIFF, and PNG.

diamondValue
## Why Scanbot SDK?
### Fixed pricing
Unpredictable costs are frustrating. The Scanbot SDK comes with a flat annual fee that includes everything, without limits on
users or scans.
### No server processing
Our SDK transmits no data. Everything happens locally. This guarantees complete data security.
### Enterprise support
Directly connect with your dedicated Customer Success Manager and our support engineers via Slack or Teams.
person\_celebrateSuccess Stories
## See what our customers say about Scanbot SDK
[See all success stories](https://scanbot.io/success-stories)
[arrow\_outward\\
](https://scanbot.io/success-stories/huk-coburg/)

[arrow\_outward\\
\\
How Rimi Baltic reduced its Scan & Go costs by 90% using Scanbot SDK](https://scanbot.io/success-stories/rimi-baltic/)
[arrow\_outward\\
](https://scanbot.io/success-stories/vakifbank/) [arrow\_outward\\
](https://scanbot.io/success-stories/coop-estonia/)
[arrow\_outward\\
](https://scanbot.io/success-stories/arcbest/)

[arrow\_outward\\
\\
\\
“We rely heavily on this solution, and the Scanbot SDK team has been a trusted partner since day one.”\\
\\
\\
\\
Patrick Krämer\\
\\
Product Owner MitarbeiterApp](https://scanbot.io/success-stories/telekom/)
[arrow\_outward\\
](https://scanbot.io/success-stories/swica/)

[arrow\_outward\\
](https://scanbot.io/success-stories/flaschenpost/)

[arrow\_outward\\
\\
Krónan fixed their Scan & Go issues by switching from Google ML Kit to Scanbot SDK](https://scanbot.io/success-stories/kronan/)
[arrow\_outward\\
](https://scanbot.io/success-stories/red-cross-flanders/)

[arrow\_outward\\
](https://scanbot.io/success-stories/huk-coburg/)

[arrow\_outward\\
\\
How Rimi Baltic reduced its Scan & Go costs by 90% using Scanbot SDK](https://scanbot.io/success-stories/rimi-baltic/)
[arrow\_outward\\
](https://scanbot.io/success-stories/vakifbank/) [arrow\_outward\\
](https://scanbot.io/success-stories/coop-estonia/)
[arrow\_outward\\
](https://scanbot.io/success-stories/arcbest/)

[arrow\_outward\\
\\
\\
“We rely heavily on this solution, and the Scanbot SDK team has been a trusted partner since day one.”\\
\\
\\
\\
Patrick Krämer\\
\\
Product Owner MitarbeiterApp](https://scanbot.io/success-stories/telekom/)
[arrow\_outward\\
](https://scanbot.io/success-stories/swica/)

[arrow\_outward\\
](https://scanbot.io/success-stories/flaschenpost/)

[arrow\_outward\\
\\
Krónan fixed their Scan & Go issues by switching from Google ML Kit to Scanbot SDK](https://scanbot.io/success-stories/kronan/)
[arrow\_outward\\
](https://scanbot.io/success-stories/red-cross-flanders/)

## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
+
## German Residence Permit Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/data-capture-software/residence-permit-scanner/#main)
# German Residence Permit Scanner SDK
Extract data from German Residence Permits as key-value pairs
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

rocket\_launchSolution
## Fast, secure, and accurate German residence permit scanning
Extract data from German residence permits directly through your mobile app. Our SDK captures key information like the name, date of birth, document number, and more, providing the data as key-value pairs for easy integration.
By automating data extraction, our SDK replaces manual entry, speeding up workflows and reducing errors. The Scanbot SDK operates entirely offline, without server connections, ensuring maximum data security for your users.
checkAvailable for mobile development platforms

## Integrate this evening with your framework
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### Can the German Residence Permit Scanner SDK be integrated into existing mobile applications?
Yes, the Scanbot SDK is designed for easy integration into existing mobile applications. Developers can integrate the SDK in less than an hour by following the provided [documentation](https://docs.scanbot.io/), exploring [GitHub example projects](https://github.com/doo), or downloading [demo apps](https://scanbot.io/demo-apps/) to get started.
+
## German Medical Certificate Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/data-capture-software/medical-certificate-scanner/#main)
# German Medical Certificate Scanner SDK
Extract key-value-pair data from German Medical Certificates
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

rocket\_launchSolution
## Fast, accurate, and secure data capture for German medical certificates
Extract key patient data from German medical certificates directly in your mobile app with our Scanner SDK. Replace manual data entry with reliable automatic extraction of name, DOB, diagnosis & more, providing the data as key-value pairs for easy integration.
Boost data entry speed, reduce errors & ensure accuracy. As a fully offline solution, the SDK provides maximum data security and privacy.
checkAvailable for mobile development platforms

## Integrate this evening with your framework
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### What data can the German Medical Certificate Scanner SDK extract?
The German Medical Certificate Scanner SDK extracts key data points such as insurance provider, insurance number, insured person number, doctor number, and form type. It returns simple key-value pairs, making it easy to integrate into healthcare systems.
+
## German ID Card Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/data-capture-software/german-id-card-scanner/#main)
# German ID Card Scanner SDK
Extract data from German ID Cards as key-value pairs
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

rocket\_launchSolution
## Fast, secure, and accurate German ID card scanning
Extract data from German ID cards directly through your mobile app. Our SDK captures key information like the name, date of birth, ID number, and more, extracting the data as key-value pairs for easy integration.
By automating data extraction, our SDK replaces manual entry, speeding up workflows and reducing errors. The SDK works entirely offline, without server connections, ensuring maximum data security for your users.
checkAvailable for mobile development platforms

## Integrate this evening with your framework
## Extractable data fields
Our German ID Card Scanner SDK extracts the following key data fields:
- Document type
- Document number
- Surname
- Given name(s)
- Maiden name (if any)
- Pseudonym (if any)
- Date of birth
- Place of birth
- Nationality
- Address
- Issuing authority
- Access number (CAN)
- Date of issuance
- Date of expiration
- Height
- Eye color
- Portrait image
- Signature

## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### How secure is the German ID Card Scanner SDK?
The SDK operates offline, ensuring that sensitive data does not need to be transmitted to a server, enhancing security and data privacy.
### Are there any demo applications available to test the SDK's functionality?
Yes, Scanbot SDK provides [demo applications](https://scanbot.io/demo-apps/) that allow developers to explore the SDK's features and functionalities before integration. If you want to try our solution right in your project, you can request a [free 7-day trial license](https://scanbot.io/trial/).
+
## German License Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/data-capture-software/german-drivers-license-scanner/#main)
# German Driver’s License Scanner SDK
Extract data from German Driver’s Licenses as key-value pairs
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

rocket\_launchSolution
## Fast, secure, and accurate German driver's license scanning
Extract data from German driver’s licenses directly through your mobile app. Our SDK captures personal information like the name, date of birth, and more, providing the data as key-value pairs for seamless integration.
By automating data extraction, our SDK replaces manual entry, speeding up workflows and reducing errors. It functions entirely offline, without server connections, ensuring maximum data security for your users.
checkAvailable for mobile development platforms

## Integrate this evening with your framework
## Extractable data fields
Our German Driver’s License Scanner SDK extracts the following key data fields:
- Name
- Given name
- Date of birth
- Place of birth
- Date of issuance
- Date of expiration
- Driver’s license number
- Driving license class
- Issuing authority
- Photograph

## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### What data does the German Driver’s License Scanner SDK extract?
The German Driver's License Scanner SDK extracts key data fields such as the name, date of birth, license number, date of issuance and expiration, issuing authority, classes, and even the photo from the license.
### How does the Scanbot SDK ensure the security of personal data?
The Scanbot SDK processes all data on-device, meaning that it transmits no sensitive information to external servers, protecting the driver's data and privacy.
### Is there a trial version of the Scanbot German Driver’s License Scanner SDK available?
Yes, Scanbot SDK provides [free demo apps](https://scanbot.io/demo-apps/#data-capture-modules) for you to experience the data extraction and a [free trial license](https://scanbot.io/trial/) that allows developers to test the SDK thoroughly. The trial license enables scanning beyond the default one-minute limitation, providing ample opportunity to evaluate the SDK's capabilities before committing to a purchase.
+
## EHIC Scanner SDK
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/data-capture-software/ehic-scanner/#main)
# EHIC Scanner SDK
Extract European Health Insurance Card (EHIC) data as key-value pairs
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

rocket\_launchSolution
## Fast, accurate, and secure EHIC data extraction
Seamlessly extract data from European Health Insurance Cards with the Scanbot EHIC Scanner SDK. Integrate it into your mobile application to capture personal information such as name, birth date, or insurance number as key-value pairs, replacing slow and error-prone manual data entry.
The SDK works entirely offline, without any server connections, ensuring maximum data security.
checkAvailable for mobile development platforms

## Integrate this evening with your framework
## Scan and extract data from EHIC cards
The Scanbot EHIC Scanner SDK supports the European Health Insurance Card format. It extracts key data fields from EHIC cards, including:
- Name
- Given names
- Date of birth
- Country
- Expiration date
- Personal identification number
- Card identification number
- Institution number and name

## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### How does the EHIC Scanner SDK ensure the accuracy of data capture from health insurance cards?
The Scanbot EHIC SDK uses advanced Optical Character Recognition (OCR) technology to accurately extract information such as names, birthdates, and insurance numbers. It is designed to handle varying image qualities and even partially damaged cards, ensuring reliable results.
### How does the Scanbot EHIC Scanner SDK ensure the security of personal health data?
The Scanbot EHIC Scanner SDK processes all personal data locally on the device, preventing any sensitive information from being transmitted to external servers. This ensures its full compliance with GDPR privacy and sensitive health insurance data regulations.
### Where can I find documentation and example projects for the EHIC Scanner SDK?
The comprehensive [Scanbot SDK Documentation](https://docs.scanbot.io/) includes guides, API references, and code samples. Additionally, example projects for various platforms can be found on our [GitHub repository](https://github.com/doo), assisting you in rapidly integrating the SDK into your application.
### Does the Scanbot EHIC SDK need an internet connection?
No, the Scanbot EHIC Scanner SDK operates entirely offline. It does not require any server connections, ensuring maximum data security and compliance with privacy regulations such as GDPR and CCPA.
+
## Data Capture Solutions
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/data-capture-software/#main)
# Data Capture Modules for your mobile app or website
Extract key-value pairs from structured documents with the Scanbot SDK
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

rocket\_launchSolution
## Fast, accurate, and easy-to-use mobile data capture
With the Scanbot SDK Data Capture Modules, you can extract data from a broad range of structured documents. Integrate the SDK into your mobile application to replace error-prone manual data entry with reliable automatic data extraction.

### MRZ Scanner SDK
[Learn\\
more](https://scanbot.io/data-capture-software/mrz-scanner/)

### Credit Card Scanner SDK
[Learn\\
more](https://scanbot.io/data-capture-software/credit-card-scanner-sdk/)

### Check Scanner SDK
[Learn\\
more](https://scanbot.io/data-capture-software/check-scanner/)

### VIN Scanner SDK
[Learn\\
more](https://scanbot.io/data-capture-software/vin-scanner/)

### OCR SDK
[Learn\\
more](https://scanbot.io/data-capture-software/ocr-sdk/)

### Text Pattern Scanner SDK
[Learn\\
more](https://scanbot.io/data-capture-software/data-scanner/)

### U.S. Driver’s License Scanner SDK
[Learn\\
more](https://scanbot.io/data-capture-software/us-drivers-license-scanner/)

### EHIC Scanner SDK
[Learn\\
more](https://scanbot.io/data-capture-software/ehic-scanner/)

### German Medical Certificate Scanner SDK
[Learn\\
more](https://scanbot.io/data-capture-software/medical-certificate-scanner/)

### German ID Card Scanner SDK
[Learn\\
more](https://scanbot.io/data-capture-software/german-id-card-scanner/)

### German Driver’s License Scanner SDK
[Learn\\
more](https://scanbot.io/data-capture-software/german-drivers-license-scanner/)

### German Residence Permit Scanner SDK
[Learn\\
more](https://scanbot.io/data-capture-software/residence-permit-scanner/)
## Integrate this evening with your framework
person\_celebrateSuccess Stories
## See what our customers say about Scanbot SDK
[See all success\\
stories](https://scanbot.io/success-stories)
[arrow\_outward\\
](https://scanbot.io/success-stories/huk-coburg/)

[arrow\_outward\\
\\
How Rimi Baltic reduced its Scan & Go costs by 90% using Scanbot SDK](https://scanbot.io/success-stories/rimi-baltic/)
[arrow\_outward\\
](https://scanbot.io/success-stories/vakifbank/) [arrow\_outward\\
](https://scanbot.io/success-stories/coop-estonia/)
[arrow\_outward\\
](https://scanbot.io/success-stories/arcbest/)

[arrow\_outward\\
\\
\\
“We rely heavily on this solution, and the Scanbot SDK team has been a trusted partner since day one.”\\
\\
\\
\\
Patrick Krämer\\
\\
Product Owner MitarbeiterApp](https://scanbot.io/success-stories/telekom/)
[arrow\_outward\\
](https://scanbot.io/success-stories/swica/)

[arrow\_outward\\
](https://scanbot.io/success-stories/flaschenpost/)

[arrow\_outward\\
\\
Krónan fixed their Scan & Go issues by switching from Google ML Kit to Scanbot SDK](https://scanbot.io/success-stories/kronan/)
[arrow\_outward\\
](https://scanbot.io/success-stories/red-cross-flanders/)

[arrow\_outward\\
](https://scanbot.io/success-stories/huk-coburg/)

[arrow\_outward\\
\\
How Rimi Baltic reduced its Scan & Go costs by 90% using Scanbot SDK](https://scanbot.io/success-stories/rimi-baltic/)
[arrow\_outward\\
](https://scanbot.io/success-stories/vakifbank/) [arrow\_outward\\
](https://scanbot.io/success-stories/coop-estonia/)
[arrow\_outward\\
](https://scanbot.io/success-stories/arcbest/)

[arrow\_outward\\
\\
\\
“We rely heavily on this solution, and the Scanbot SDK team has been a trusted partner since day one.”\\
\\
\\
\\
Patrick Krämer\\
\\
Product Owner MitarbeiterApp](https://scanbot.io/success-stories/telekom/)
[arrow\_outward\\
](https://scanbot.io/success-stories/swica/)

[arrow\_outward\\
](https://scanbot.io/success-stories/flaschenpost/)

[arrow\_outward\\
\\
Krónan fixed their Scan & Go issues by switching from Google ML Kit to Scanbot SDK](https://scanbot.io/success-stories/kronan/)
[arrow\_outward\\
](https://scanbot.io/success-stories/red-cross-flanders/)

## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
+
## GS1 DataMatrix Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanner-sdk/gs1-data-matrix/#main)
# GS1 DataMatrix Scanner
Add GS1 DataMatrix scanning to your mobile application or website
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

## Turn smartphones into fast & reliable GS1 DataMatrix scanners
The Scanbot GS1 DataMatrix Scanner SDK delivers exceptional performance even under challenging conditions – such as code damage or when scanning very small codes on pharmaceutical products. With a scanning speed of under 0.04 seconds, your users get instant reads for seamless workflows.
Key benefits include:
- **Offline scanning**: The Scanbot SDK works 100% on-device, ensuring both uninterrupted performance and data security.
- **Enterprise-grade support**: Get dedicated chat support via Slack, Teams or email for any issue. Includes free assistance during the integration phase.
- **Flat pricing model**: Cost stays the same no matter how much your user base or scanning volume grows.


### How this scanning tool works
Our free online GS1 DataMatrix code reader scans codes directly through your camera or on imported images. This barcode scanner works in any browser, no app download or signup needed. Enjoy real-time camera view scanning or decode barcodes on pictures in seconds – just point your camera at the GS1 DataMatrix code or import an image file to instantly access the encoded data.
This tool is powered by the [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/)!
* * *
(We don’t store any images or data you import. Everything stays on your device.)
## Understanding GS1 DataMatrix Codes
### What are GS1 DataMatrix codes?
The GS1 DataMatrix code is a two-dimensional (2D) barcode and a variant of the Data Matrix symbology. Even though it is based on the ISO/IEC 16022 standard it has specific features that distinguish it from the generic Data Matrix code:
- FNC1 Start Sequence: at the beginning of the encoded data, enables scanners to process the information according to GS1 System rules
- Application Identifiers (AIs): uses standardized AIs to encode various types of information
- Data structure: supports a structured data format that enables the encoding of multiple pieces of information, such as GTIN, expiration date, batch number, and more

GS1 DataMatrix codes can encode large amounts of product data, including the Global Trade Item Number (GTIN), with up to 2,335 alphanumeric and 3,116 numeric characters. They store significantly more data than 1D barcodes in smaller spaces, which makes them suitable for small prints or direct marking on products. Additionally, they have error correction capabilities that make them readable even when partially damaged.
### Applications of GS1 DataMatrix codes
**Healthcare**
GS1 DataMatrix codes are used for drug labeling and medical device identification. They help improve patient safety by ensuring traceability and combatting counterfeit medicines.
**Manufacturing**
They are also employed for direct part marking (DPM) of components, especially in the automotive and aerospace sectors. It enables efficient tracking of parts throughout their lifecycle and helps in quality control.
**Retail and logistics**
Similarly, GS1 DataMatrix codes are used for traceability in retail and supply chain management. They improve inventory tracking and help reduce food waste.
### Advantages of GS1 DataMatrix codes
- Compact size: They store large amounts of information in minimal space, ideal for small product labels or irregularly shaped surfaces.
- Error correction: Advanced algorithms allow decoding even if the barcode is damaged or partially obscured.
- Scalability: Different matrix sizes can encode up to 2,335 alphanumeric and 3,116 numeric characters to meet varying data capacity requirements.
- Versatility: Omnidirectional scanning ensures seamless decoding from any angle.
### Why choose the Scanbot SDK for GS1 DataMatrix scanning?
The Scanbot Barcode Scanner SDK is specifically designed to handle the challenges of decoding GS1 DataMatrix codes in real-world scenarios.
What sets us apart:
- **Exceptional performance**: Reliably decodes even damaged, low-contrast or distorted barcodes.
- **High-speed scanning**: Read GS1 DataMatrix codes in as little as 0.04 seconds.
- **Cross-platform compatibility**: Easily integrate with Android, iOS, cross-platform, web, Windows, and Linux platforms.
- **Customizable UI**: Customize the ready-to-use components to match your app or website design.
- **Privacy-first**: Operates offline for complete data security.
Whether your use case involves GS1 DataMatrix codes, UPCs or [any other barcode](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/), the Scanbot SDK delivers the accuracy, speed, and reliability you need to succeed.
* * *
## Related Barcode Types:
- [Data Matrix Scanner](https://scanbot.io/barcode-scanner-sdk/data-matrix/)
- [QR Code Scanner](https://scanbot.io/qr-code-scanner-online/)
- [PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/pdf417/)
- [Aztec Code Scanner](https://scanbot.io/barcode-scanner-sdk/aztec-code/)
- [Code 128 Scanner](https://scanbot.io/barcode-scanner-sdk/code-128/)
- [Code 39 Scanner](https://scanbot.io/barcode-scanner-sdk/code-39/)
- [EAN Scanner](https://scanbot.io/barcode-scanner-sdk/ean/)
- [UPC Scanner](https://scanbot.io/barcode-scanner-sdk/upc/)
- [Micro QR Code Scanner](https://scanbot.io/barcode-scanner-sdk/micro-qr-code/)
- [GS1 DataBar Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-databar/)
- [GS1-128 Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-128/)
- [MaxiCode Scanner](https://scanbot.io/barcode-scanner-sdk/maxicode/)
- [ITF Scanner](https://scanbot.io/barcode-scanner-sdk/itf-code/)
- [Codabar Scanner](https://scanbot.io/barcode-scanner-sdk/codabar/)
- [Intelligent Mail Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/intelligent-mail-barcode/)
- [rMQR Code Scanner](https://scanbot.io/barcode-scanner-sdk/rmqr/)
- [Royal Mail Scanner](https://scanbot.io/barcode-scanner-sdk/royal-mail/)
- [Micro PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/micro-pdf417/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### What is the difference between a standard Data Matrix code and a GS1 DataMatrix code?
GS1 DataMatrix codes implement GS1 standards in a [Data Matrix](https://scanbot.io/barcode-scanner-sdk/data-matrix/) 2D barcode. In particular, Application Identifiers (AIs) are used to encode structured data like GTINs, expiration dates, and batch numbers. The standardization of identifiers and data ensures global uniqueness and compatibility across various systems.
### What are the size variations available for GS1 DataMatrix codes?
GS1 DataMatrix symbols come in various sizes: The square format ranges from 10x10 to 144x144 modules, and the rectangular format ranges from 8x18 to 16x48 modules. The appropriate size depends on the amount of data encoded and the application's requirements.
### How does the error correction feature in GS1 DataMatrix codes work?
GS1 DataMatrix codes utilize Reed-Solomon error correction. Adding redundancy enables accurate data retrieval even if the code is partially damaged or obscured. This enhances reliability in environments where codes might suffer wear and tear.
+
## Code 93 Barcode Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanner-sdk/code-93/#main)
# Code 93 Barcode Scanner
Add Code 93 scanning to your mobile application or website
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

## Turn smartphones into fast & reliable Code 93 scanners
The Scanbot Code 93 [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) delivers exceptional performance even under challenging conditions – such as code damage or when scanning small codes commonly found in industrial applications like warehousing and manufacturing. With a scanning speed of under 0.04 seconds, your users get instant reads for seamless workflows.
Key benefits include:
- **Offline scanning**: The Scanbot SDK works 100% on-device, ensuring both uninterrupted performance and data security.
- **Enterprise-grade support**: Get dedicated chat support via Slack, Teams or email for any issue. Includes free assistance during the integration phase.
- **Flat pricing model**: Cost stays the same no matter how much your user base or scanning volume grows.


### How this scanning tool works
Our free online Code 93 barcode reader scans codes directly through your camera or on imported images. This barcode scanner works in any browser, no app download or signup needed. Enjoy real-time camera view scanning or decode barcodes on pictures in seconds – just point your camera at the Code 93 barcode or import an image file to instantly access the encoded data.
This tool is powered by the [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/)!
* * *
(We don’t store any images or data you import. Everything stays on your device.)
## Understanding Code 93 barcodes
### What is a Code 93 barcode?
Code 93 is a one-dimensional (1D) barcode symbology standardized in ANSI/AIM-BC5-2000. Developed in 1982, it was among the first barcodes to support alphanumeric data, including letters, numbers, and some special characters. Today, Code 93 is widely used as a logistics and packing barcode to identify packages.
Each barcode includes start and stop characters (an asterisk \*) that help barcode scanners identify the code’s boundaries. Additionally, Code 93 barcodes contain two check digit characters for enhanced error detection.
Most barcode scanners easily scan Code 93 barcodes and, as the text interpretation is placed below the barcode, support manual verification.
### Structure and components
Code 93 encodes characters using patterns of wide and narrow bars and spaces. Each data character in a Code 93 symbol consists of nine modules arranged into three bars and three spaces, hence the name. Each bar or space can be one to four modules wide.
The default implementation or standard mode of Code 93 can encode 47 characters, including digits (0–9), uppercase letters (A–Z), and the special characters -, $, %, , ., /, and +. An asterisk (\*) is used as the start/stop character. Four additional characters enable an extended or Full ASCII mode, which can encode all 128 ASCII characters.
Another defining feature is its two mandatory modulo-47 checksum characters, known as the “C” and “K” checks. These are calculated from the data and help ensure the barcode is read accurately by scanners.
Overall, Code 93 barcodes consist of the following key components:
1. **Quiet zones:** Blank areas on both sides of the barcode that aid proper detection and readability.
2. **Start character**: An asterisk (\*) that indicates the beginning of the barcode.
3. **Data characters**: The main content section where information is encoded.
4. **Two check digits**: Enable error detection.
5. **Stop character**: An asterisk (\*) that indicates the end of the barcode.
6. **Termination bar**: A single bar that separates the stop character from the quiet zone.
### Encoding and error detection
Code 93 can encode the entire 128-character ASCII set by using combinations of two characters, allowing it to represent both standard and extended characters efficiently.
The symbology’s pair of modulo-47 check characters (C and K) enables error detection to ensure data integrity. They are calculated and encoded using a table of numeric values for every character.
Each character in the barcode is assigned a numeric value based on a predefined table.
Here’s how the checksum is calculated and encoded:
1. Numeric values are assigned to each character in the data portion of the barcode.
2. The C checksum is calculated first, using a weighted sum of the data characters’ values.
3. This sum is divided by 47, resulting in a remainder.
4. The character corresponding to the remainder value is appended to the end of the barcode.
5. Then the K checksum is calculated using the same method, but including the C character, and appended.
### Applications of Code 93 barcodes
Across industries, Code 93 is frequently used in internal inventory system tools, especially because of its compact size and higher density of data compared to many other 1D barcodes.
**Manufacturing and automotive**
Code 93 is common in the automotive industry and in factory automation for tracking components, parts, and work-in-progress items. It is used for assembly line management and quality control, especially where space is limited, as for small parts.
**Healthcare**
While less common than Code 128 or Data Matrix, Code 93’s compact size is useful for smaller labels for medical equipment, lab samples, and hospital inventory.
**Logistics and postal**
Code 93 barcodes see use in logistics applications for tracking packages, pallets, and shipping containers. Carriers use it to encode tracking numbers, destination codes, and routing information, but also for inventory management.
**Retail**
Code 93 is also used in retail operations, specifically retail inventory management, warehouse operations, and order fulfillment. The main use cases are labelling stock, organizing bin locations, and managing product movements.
### Advantages of Code 93 barcodes
- **Size**: Code 93 offers greater data density than Code 39 by using 9 modules per character and a more compact encoding scheme. This allows for shorter barcodes with the same information.
- **Error detection**: Code 93’s checksum characters enable basic error detection, though no error correction.
- **Versatility**: Code 93 can hold alphanumeric data and has no length limit, making it useful for a variety of applications.
- **Omnidirectional scanning**: The asymmetric start/stop character enables decoding from any angle.
### Why choose the Scanbot SDK for Code 93 scanning?
The Scanbot Barcode Scanner SDK is specifically designed to handle the challenges of decoding Code 93 barcodes in real-world scenarios. We can empower any enterprise or consumer mobile or desktop app with advanced barcode scanning capabilities with minimal integration effort.
What sets us apart:
- **Exceptional performance**: Reliably decodes even damaged, low-contrast or distorted barcodes.
- **High-speed scanning**: Read Code 93 barcodes in as little as 0.04 seconds.
- **Cross-platform compatibility**: Easily integrate with Android, iOS, cross-platform, web, Windows, and Linux platforms.
- **Customizable UI**: Customize the ready-to-use components to match your app or website design.
- **Privacy-first**: Operates offline for complete data security.
Whether your use case involves Code 93 barcodes, QR codes, or [any other barcode](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/), the Scanbot SDK delivers the accuracy, speed, and reliability you need to succeed.
* * *
## Related Barcode Types:
- [Data Matrix Scanner](https://scanbot.io/barcode-scanner-sdk/data-matrix/)
- [QR Code Scanner](https://scanbot.io/qr-code-scanner-online/)
- [PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/pdf417/)
- [Aztec Code Scanner](https://scanbot.io/barcode-scanner-sdk/aztec-code/)
- [Code 128 Scanner](https://scanbot.io/barcode-scanner-sdk/code-128/)
- [EAN Scanner](https://scanbot.io/barcode-scanner-sdk/ean/)
- [UPC Scanner](https://scanbot.io/barcode-scanner-sdk/upc/)
- [Micro QR Code Scanner](https://scanbot.io/barcode-scanner-sdk/micro-qr-code/)
- [GS1 DataBar Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-databar/)
- [GS1 DataMatrix Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-data-matrix/)
- [GS1-128 Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-128/)
- [MaxiCode Scanner](https://scanbot.io/barcode-scanner-sdk/maxicode/)
- [ITF Scanner](https://scanbot.io/barcode-scanner-sdk/itf-code/)
- [Codabar Scanner](https://scanbot.io/barcode-scanner-sdk/codabar/)
- [Intelligent Mail Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/intelligent-mail-barcode/)
- [rMQR Code Scanner](https://scanbot.io/barcode-scanner-sdk/rmqr/)
- [Royal Mail Scanner](https://scanbot.io/barcode-scanner-sdk/royal-mail/)
- [Micro PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/micro-pdf417/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### Is Code 93 still used today?
Yes, Code 93 is still used today, mainly in manufacturing, retail, the automotive industry, healthcare, and logistics.
### What’s the difference between Code 93 and Code 39?
Code 93 is an enhanced version of Code 39, designed to be more compact and reliable. It allows for higher data density and includes two checksum digits for better error detection.
### What’s the maximum length for a Code 93 barcode?
The Code 93 is a variable-length symbology and has no hard limit on the number of alphanumeric characters it can encode. It can accommodate both short and long data strings, depending on the use case. For reliable scanning, though, the optimal length is 43 characters or less.
### Are there any security concerns with Code 93?
Code 93 offers better accuracy than other codes, such as Code 39, but its two checksum characters (C & K) only detect basic errors. They offer no protection against tampering or spoofing.
Moreover, data is stored in plain text, without encryption, making it easy to read, copy, or forge with a basic scanner. This poses risks in systems requiring trust or authentication.
Cloud-based scan software creates another attack surface. A fully offline Code 93 Barcode scanner introduces no such data security issues and ensures uninterrupted performance.
+
## MRZ Scanner SDK
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/data-capture-software/mrz-scanner/#main)
# MRZ Scanner SDK
Extract data from MRZs on IDs, passports, and more as key-value pairs
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

rocket\_launchSolution
## Fast, secure, and easy-to-use MRZ scanning
With the Scanbot MRZ Scanner SDK, you can quickly and reliably extract data from machine-readable zones on IDs, passports, and other identity documents. Integrate our MRZ OCR scanning software into your mobile or web application to upgrade from error-prone manual data entry to fast and accurate automatic data extraction.
Our scanning technology extracts all relevant MRZ data fields and returns key-value pairs. This makes it easy to process the captured information in your app. The entire scanning process happens offline on your mobile device, without any external server connections, ensuring complete data security.
checkAvailable for mobile and web development platforms

## Integrate this evening with your framework
## Scan and extract MRZs on ID documents
The Scanbot MRZ OCR Scanner SDK supports both two-line (TD3, TD2) and three-line (TD1, MRV-A, MRV-B) standards. Powered by OCR technology, it extracts the following MRZ fields on ID documents:
- Document type code
- Document number
- Surname
- Given names
- Gender
- Date of birth
- Date of issuance
- Date of expiration
- Nationality
- Issuing authority
MRZs use a unique font called OCR-B and standardized formatting. You can easily recognize the MRZ code on your document by looking for the “<” characters used to fill the empty space between the encoded information.
On an ID card, you can typically find the MRZ code on the back side of the card. On passports, it is located on the bottom of the identification card at the beginning of your passport booklet. On visas, you can find the MRZ either on the lower half of the front side or on the back, depending on the format.

## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### What does MRZ mean?
MRZ, or " [machine-readable zone](https://scanbot.io/blog/what-is-an-mrz/)," refers to a standardized section on an identity or travel document that can be read automatically for fast identity verification. The MRZ contains encoded personal information about the document holder, including the document number, the expiration date and their nationality. It also includes document-specific information that varies depending on the type of identification document.
### **What is an MRZ scanner?**
An MRZ scanner is hardware or software designed to scan ID documents with machine-readable zones and extract the information using optical character recognition (OCR). The Scanbot MRZ Scanner SDK enables you to quickly and accurately scan identity documents and extract their data as key-value pairs, all on your own device. It operates fully offline, without any connection to a server.
Interested in how our customers use it? Read the success story of Red Cross Flanders [here](https://scanbot.io/success-stories/red-cross-flanders/).
### **Which country or region is supported?**
The Scanbot MRZ Scanner SDK supports both two-line (TD3, TD2) and three-line (TD1, MRV-A, MRV-B) standards. This means it can read MRZ codes on ID cards, passports and visas.
Do you need a special standard? [Contact us](mailto:sdk@scanbot.io)!
### **What should I consider when choosing an MRZ scanning software?**
An MRZ Scanner SDK should deliver high-quality scans and accurately extract data that can be processed by your backend systems. It should increase your efficiency by reducing processing time and minimizing human errors.
Here are some important factors to consider:
**Performance and accuracy**: Make sure the scanning solution is able to quickly and accurately read MRZ codes, even from identity documents that are hard to read or presented in poor lighting conditions.
**Compatibility**: Look out for software that works seamlessly with your development environment and is compatible with the devices you plan to use, both mobile or desktop.
**Data privacy**: Since MRZ codes include personal data, it is important that the scanning software has measures in place that protect sensitive information. The Scanbot MRZ Scanner SDK operates entirely offline, ensuring full data privacy.
**Developer support**: Make sure your software provider offers sufficient support for developers to facilitate smooth integration. With Scanbot SDK, you’ll have access to detailed [documentation](https://docs.scanbot.io/?__hstc=51647990.48ea42627c7aeee6cbd0d80c37e5f7b8.1733477614230.1737618211192.1737621367169.31&__hssc=51647990.7.1737621367169&__hsfp=24499724) and Slack and Teams channels for [direct assistance](https://docs.scanbot.io/support/?__hstc=51647990.48ea42627c7aeee6cbd0d80c37e5f7b8.1733477614230.1737618211192.1737621367169.31&__hssc=51647990.7.1737621367169&__hsfp=24499724).
**Pricing model**: Look for a pricing model that fits your business needs and scales without extra costs. Scanbot SDK offers an unlimited scanning model with a fixed annual fee, so you can use it without worrying about rising expenses.
### **Is the Scanbot MRZ Scanner SDK compliant with GDPR and CCPA?**
Yes, as a 100% offline solution, the SDK doesn’t need an internet connection. This guarantees that personal data remains secure and on your device, with all necessary data privacy measures upheld.
### **How do I integrate the Scanbot MRZ Scanner SDK into my app?**
Our MRZ Scanner SDK comes with detailed [documentation](https://docs.scanbot.io/?__hstc=51647990.48ea42627c7aeee6cbd0d80c37e5f7b8.1733477614230.1737618211192.1737621367169.31&__hssc=51647990.7.1737621367169&__hsfp=24499724) that takes you through the integration process step by step. The entire integration doesn’t take longer than a few hours. If you need additional support, we are happy to help you with our [free support channels](https://docs.scanbot.io/support/?__hstc=51647990.48ea42627c7aeee6cbd0d80c37e5f7b8.1733477614230.1737618211192.1737621367169.31&__hssc=51647990.7.1737621367169&__hsfp=24499724).
### **Which platforms is the Scanbot MRZ Scanner SDK currently available for?**
The Scanbot MRZ Scanner SDK supports development for Native Android and iOS, JavaScript (Web), Flutter, React Native, Cordova, Capacitor / Ionic, Xamarin, and .NET MAUI. Try the Scanbot MRZ Scanner SDK by downloading the [demo app](https://scanbot.io/demo-apps/?__hstc=51647990.48ea42627c7aeee6cbd0d80c37e5f7b8.1733477614230.1737618211192.1737621367169.31&__hssc=51647990.7.1737621367169&__hsfp=24499724#data-capture-modules) or requesting a [free trial license](https://scanbot.io/trial/?__hstc=51647990.48ea42627c7aeee6cbd0d80c37e5f7b8.1733477614230.1737618211192.1737621367169.31&__hssc=51647990.7.1737621367169&__hsfp=24499724).
+
## MSI Barcode Scanner SDK
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanner-sdk/msi-barcode/#main)
# MSI Barcode Scanner
Add MSI Barcode Scanner to your mobile application or website
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

## Turn smartphones into fast & reliable MSI barcode readers
The Scanbot MSI [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) delivers exceptional performance even under challenging conditions – such as code damage or when scanning small codes commonly found in industrial applications like warehousing and manufacturing. With a scanning speed of under 0.04 seconds, your users get instant reads for seamless workflows.
Key benefits include:
- **Offline scanning**: The Scanbot SDK works 100% on-device, ensuring both uninterrupted performance and data security.
- **Enterprise-grade support**: Get dedicated chat support via Slack, Teams or email for any issue. Includes free assistance during the integration phase.
- **Flat pricing model**: Cost stays the same no matter how much your user base or scanning volume grows.


### How this scanning tool works
Our free online MSI barcode reader scans codes directly through your camera or on imported images. This barcode scanner works in any browser, no app download or signup needed. Enjoy real-time camera view scanning or decode barcodes on pictures in seconds – just point your camera at the MSI barcode or import an image file to instantly access the encoded data.
This tool is powered by the [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/)!
* * *
(We don’t store any images or data you import. Everything stays on your device.)
## Understanding MSI barcodes
### What is an MSI barcode scanner?
MSI barcode, also known as MSI Plessey code or Modified Plessey, is a one-dimensional (1D) numeric barcode symbology. Developed in 1974 by the MSI Data Corporation, it improved the accuracy of the existing Plessey Code, one of the most error-prone codes.
Each barcode includes start and stop characters that help barcode scanners identify the code’s boundaries. MSI barcode also allows optional check digits for enhanced error detection.
Most barcode scanners easily scan MSI barcodes. As the text interpretation is printed below the barcode proper, they also support manual verification.
### Encoding scheme, structure, and components
The MSI barcode encodes numerical data using both bars and spaces, each either one or two modules wide. The encoding is binary, with black modules (bars) representing “1” and white modules (spaces) representing “0”.
The default implementation of MSI barcode represents each digit from 0 to 9 in a unique pattern of 4 bars and 4 spaces, which is spread over 12 modules. The barcode uses continuous encoding, meaning there is no inter-character gap, which helps reduce the overall length. Since there are only two widths – narrow and wide – the barcode is easy to print even with low-resolution printing methods.
The data portion of MSI barcode is followed by optional check characters. The symbology supports several types of check digits, but the most common is Mod 10. The data digits are added together in a specific way (see below) to get a single-digit result.
During reads, the scanner calculates the same checksums. If the result matches the check digits in the barcode, the code has been read correctly.
A stop guard character, finally, indicates the end of the code. To sum up, MSI barcodes consist of the following key components:
1. **Start character**: A fixed pattern (usually a single bar) indicating the beginning of the barcode.
2. **Data character**: The main content section where information is encoded.
3. **Check digits**: Optional, but commonly used. They are calculated using algorithms like Mod 10, Mod 11, or combinations.
4. **Stop character:** A fixed pattern indicates the end of the barcode.
### Error detection
To ensure data integrity, MSI barcode uses check digits to detect errors in the decoded data, with two common methods for calculating these digits: Mod 10 and Mod 11.
A Mod 10 Check Digit is the most common error-detection method in MSI Plessey. Here is how it is calculated:
1. Double every second digit, starting from the rightmost digit.
2. Sum all the digits of the resulting values.
3. Subtract the sum from the next highest multiple of 10.
4. Divide the result by 10.
5. The remainder of this division is the check digit.
### Applications of MSI barcodes
**Retail inventory**
In supermarkets and other retail stores, these barcodes are typically used for shelf labeling, helping track product locations and quantities. While UPC or EAN barcodes are used on the products themselves, MSI barcodes are often applied to the front edges of shelves, providing access to important information about the products stored there, such as stock levels and product identification.
**Warehousing**
In warehouse environments, MSI barcode plays a key role in inventory control, particularly for storage management and distribution. It is used to label shelves, racks, pallets, and packages, aiding in the tracking of items as they pass through the warehouse, from receipt to dispatch.
### Advantages of Code MSI Barcode Scanner
- **Ease of printing**: Code MSI barcode uses only two bar widths, making it easy to print reliably on a variety of surfaces with basic printing technology.
- **Error detection**: It supports one or more check digits (typically Mod 10 or Mod 11), which help detect data corruption or scanning errors – important for ensuring data integrity. However, it does not offer data correction.
- **Versatility**: MSI barcode can encode variable-length numbers, making it adaptable for different types of inventory or tracking systems.
### Why choose the Scanbot SDK for Code MSI Barcode Scanner?
The Scanbot Barcode Scanner SDK is specifically designed to handle the challenges of decoding MSI barcode in real-world scenarios. We can empower any enterprise or consumer mobile or desktop app with advanced barcode scanning capabilities with minimal integration effort.
What sets us apart:
- **Exceptional performance**: Reliably decodes even damaged, low-contrast, or distorted barcodes.
- **High-speed scanning**: Read MSI barcodes in as little as 0.04 seconds.
- **Cross-platform compatibility**: Easily integrate with Android, iOS, cross-platform, web, Windows, and Linux platforms.
- **Customizable UI**: Customize the ready-to-use components to match your app or website design.
- **Privacy-first**: Operates offline for complete data security.
Whether your use case involves MSI barcodes, QR codes, or [any other barcode](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/), the Scanbot SDK delivers the accuracy, speed, and reliability you need to succeed.
* * *
## Related Barcode Types:
- [Data Matrix Scanner](https://scanbot.io/barcode-scanner-sdk/data-matrix/)
- [QR Code Scanner](https://scanbot.io/qr-code-scanner-online/)
- [PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/pdf417/)
- [Aztec Code Scanner](https://scanbot.io/barcode-scanner-sdk/aztec-code/)
- [Code 128 Scanner](https://scanbot.io/barcode-scanner-sdk/code-128/)
- [EAN Scanner](https://scanbot.io/barcode-scanner-sdk/ean/)
- [UPC Scanner](https://scanbot.io/barcode-scanner-sdk/upc/)
- [Micro QR Code Scanner](https://scanbot.io/barcode-scanner-sdk/micro-qr-code/)
- [GS1 DataBar Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-databar/)
- [GS1 DataMatrix Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-data-matrix/)
- [GS1-128 Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-128/)
- [MaxiCode Scanner](https://scanbot.io/barcode-scanner-sdk/maxicode/)
- [ITF Scanner](https://scanbot.io/barcode-scanner-sdk/itf-code/)
- [Codabar Scanner](https://scanbot.io/barcode-scanner-sdk/codabar/)
- [Intelligent Mail Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/intelligent-mail-barcode/)
- [rMQR Code Scanner](https://scanbot.io/barcode-scanner-sdk/rmqr/)
- [Royal Mail Scanner](https://scanbot.io/barcode-scanner-sdk/royal-mail/)
- [Micro PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/micro-pdf417/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### Is the MSI barcode still used today?
Yes, the MSI barcode is still used today, despite the rise of more complex barcodes like Code 128 and QR codes. It is widely used in certain industries, particularly in inventory management, warehouse tracking, and shelf labeling in retail environments. Its simplicity and error detection capability make it a reliable choice for tracking large quantities of items.
### Is MSI barcode the same as Plessey Code?
No, MSI Plessey and the original Plessey Code symbology are not the same, although they are closely related. The term Plessey Code refers to a family of barcodes developed by the Plessey Company. MSI barcode is based on a specific variant of this code, modified to include check digits for better error detection.
### What data types does MSI barcode support?
The MSI barcode supports numeric data only (0–9). It does not support alphabetic characters, special symbols, or other types of data. MSI barcode is therefore used in applications where only numeric identifiers (such as stock numbers, asset IDs, and product codes) are needed.
### What’s the difference between MSI and Code 39?
There are a few key differences between these two barcodes. While MSI is a numeric symbology (0–9 only), Code 39 is more versatile, as it can store alphanumeric data (A–Z, 0–9, and some special characters by default).
In terms of error detection, MSI often includes optional check digits (Mod 10 or Mod 11), which help verify the accuracy of the decoded data. By default, Code 39 barcodes lack check digits, though they are sometimes added. Additionally, MSI barcodes are generally shorter, making them easier to print and scan, especially for applications requiring numeric identifiers.
On the other hand, Code 39 can handle longer alphanumeric strings. It is common in broader applications such as asset tracking and logistics, where a wider range of characters is needed.
+
## GS1 DataBar Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanner-sdk/gs1-databar/#main)
# GS1 DataBar Scanner
Add GS1 DataBar scanning to your mobile application or website
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

## Turn smartphones into fast & reliable GS1 DataBar scanners
The Scanbot GS1 DataBar Scanner SDK delivers exceptional performance even under challenging conditions – such as damaged barcodes or when reading compact barcodes found in retail and healthcare. With a scanning speed of under 0.04 seconds, your users get instant reads for seamless workflows.
Key benefits include:
- **Offline scanning**: The Scanbot SDK works 100% on-device, ensuring both uninterrupted performance and data security.
- **Enterprise-grade support**: Get dedicated chat support via Slack, Teams or email for any issue. Includes free assistance during the integration phase.
- **Flat pricing model**: Cost stays the same no matter how much your user base or scanning volume grows.


### How this scanning tool works
Our free online GS1 DataBar barcode scanner reads barcodes directly through your camera or on imported images. This scanner works in any browser, no app download or signup needed. Enjoy real-time camera view scanning or decode barcodes on pictures in seconds – just point your camera at the GS1 DataBar code or import an image file to instantly access the encoded data.
This tool is powered by the [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/)!
* * *
(We don’t store any images or data you import. Everything stays on your device.)
## Understanding GS1 DataBar codes
### What is a GS1 DataBar code?
The GS1 DataBar code, formerly known as Reduced Space Symbology or RSS, is a compact one-dimensional (1D) or stacked code standardized in ISO/IEC 24724. Smaller than traditional UPC or EAN codes, GS1 DataBar codes are ideal for printing on small items. In particular, retailers use them for fresh produce, while the healthcare industry employs them for tracking medical supplies.
The GS1 DataBar family consists of seven barcodes, each tailored for different use cases. They vary in their overall size and shape as well as their capacity. The symbol shown above is the basic GS1 DataBar Omnidirectional, which holds a 14-digit Global Trade Item Number (GTIN-14) or a Global Coupon Number (GCN).
### Variations and check digit
Here are the GS1 DataBar types, starting with the **POS variations**:
| Barcode variation | Data capacity | Application |
| --- | --- | --- |
| **GS1 DataBar Omnidirectional** | 14 numeric digits (GTIN or GCN) | General retail products, designed for omnidirectional scanning |
| **GS1 DataBar Stacked Omnidirectional** | 14 numeric digits (GTIN or GCN) | Small items, stacked format, designed for omnidirectional scanning |
| **GS1 DataBar Expanded** | Up to 74 numeric or 41 alphanumeric characters | Variable-weight products, coupons, and products requiring additional information, designed for omnidirectional scanning |
| **GS1 DataBar Expanded Stacked** | Up to 74 numeric or 41 alphanumeric characters | Items requiring additional information, stacked format for small spaces, designed for omnidirectional scanning |

GS1 DataBar Expanded and GS1 DataBar Expanded Stacked can include additional information, such as batch number, serial number, and expiration date.
**Non-POS variations**
These barcode variations do not support omnidirectional scanning:
| Barcode variation | Data capacity | Application |
| --- | --- | --- |
| **GS1 DataBar Limited** | 14 numeric digits (GTIN) | Small items, designed for single-directional scanning |
| **GS1 DataBar Stacked** | 14 numeric digits (GTIN) | Small items, stacked format for small spaces, designed for single-directional scanning |
| **GS1 DataBar Truncated** | 14 numeric digits (GTIN) | Small items, designed for single-directional scanning |

**Check digit**
The fixed-length variants include a check digit for error detection, ensuring data integrity. This is calculated using an [algorithm](https://www.gs1.org/services/check-digit-calculator) that processes all preceding digits in the barcode. By verifying this check digit, scanning systems can instantly detect errors in data entry or scanning.
### Applications of GS1 DataBar codes
**Fresh food items**
GS1 DataBar barcodes are useful for identifying small and hard-to-mark items, particularly fresh produce, meat, seafood, and bakery goods.
**Variable measure products**
The GS1 DataBar Expanded variations are commonly used when additional data beyond the GTIN needs to be encoded, such as weight, expiration date, or batch numbers.
**Small consumer goods**
GS1 DataBar Limited is used for small, hard-to-mark consumer products due to its compact size.
**Healthcare**
The GS1 DataBar family also plays a vital role in labelling pharmaceuticals and medical devices, enabling compliance with strict regulatory requirements for tracking and traceability. They can encode additional information like batch numbers and expiry dates, crucial for patient safety.
**Coupons**
For promotional materials and coupons, GS1 DataBar Expanded variants offer enough capacity to individualize the items. This enhances flexibility, security, and personalization, enabling more sophisticated and targeted marketing campaigns in retail environments.
### Advantages of GS1 DataBar codes
- **Compact size**: These barcodes store key information in minimal space, ideal for small or irregularly shaped surfaces.
- **Versatility**: The individual barcode formats can encode different data types and lengths, including GTINs, serial numbers, and expiration dates, for various applications.
- **Flexible orientation**: Omnidirectional scanning ensures seamless decoding from any angle on most variants.
### Why choose the Scanbot SDK for GS1 DataBar scanning?
The Scanbot Barcode Scanner SDK is specifically designed to handle the challenges of decoding GS1 DataBar codes in real-world scenarios.
What sets us apart:
- **Exceptional performance**: Reliably decodes even damaged, low-contrast or distorted barcodes.
- **High-speed scanning**: Read GS1 DataBar codes in as little as 0.04 seconds.
- **Cross-platform compatibility**: Easily integrate with Android, iOS, cross-platform, web, Windows, and Linux platforms.
- **Customizable UI**: Customize the ready-to-use components to match your app or website design.
- **Privacy-first**: Operates offline for complete data security.
Whether your use case involves GS1 DataBar codes, UPC barcodes or [any other barcode](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/), the Scanbot SDK delivers the accuracy, speed, and reliability you need to succeed.
* * *
## Related Barcode Types:
- [Data Matrix Scanner](https://scanbot.io/barcode-scanner-sdk/data-matrix/)
- [QR Code Scanner](https://scanbot.io/qr-code-scanner-online/)
- [PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/pdf417/)
- [Aztec Code Scanner](https://scanbot.io/barcode-scanner-sdk/aztec-code/)
- [Code 128 Scanner](https://scanbot.io/barcode-scanner-sdk/code-128/)
- [Code 39 Scanner](https://scanbot.io/barcode-scanner-sdk/code-39/)
- [EAN Scanner](https://scanbot.io/barcode-scanner-sdk/ean/)
- [UPC Scanner](https://scanbot.io/barcode-scanner-sdk/upc/)
- [Micro QR Code Scanner](https://scanbot.io/barcode-scanner-sdk/micro-qr-code/)
- [GS1 DataMatrix Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-data-matrix/)
- [GS1-128 Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-128/)
- [MaxiCode Scanner](https://scanbot.io/barcode-scanner-sdk/maxicode/)
- [ITF Scanner](https://scanbot.io/barcode-scanner-sdk/itf-code/)
- [Codabar Scanner](https://scanbot.io/barcode-scanner-sdk/codabar/)
- [Intelligent Mail Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/intelligent-mail-barcode/)
- [rMQR Code Scanner](https://scanbot.io/barcode-scanner-sdk/rmqr/)
- [Royal Mail Scanner](https://scanbot.io/barcode-scanner-sdk/royal-mail/)
- [Micro PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/micro-pdf417/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### What is a GS1 DataBar code?
The GS1 DataBar code is a compact one-dimensional (1D,) linear code that is smaller than EANs and UPCs. While different variations, like DataBar Expanded Stacked exist, all GS1 DataBar codes are ideal for labeling small items. Retailers use them for fresh produce, while healthcare relies on them for tracking medical supplies.
### Where is a GS1 DataBar code used?
The GS1 DataBar Omnidirectional is commonly used for POS scanning in retail environments. The GS1 DataBar Expanded and Expanded Stacked are often used on coupons and fresh produce for encoding additional information beyond GTIN, such as weight, expiration dates, or serial numbers. The GS1 DataBar Truncated and Limited versions are used for very small item identification in healthcare, such as unit dose pharmaceuticals and ampoules.
### How can Scanbot SDK help you with GS1 DataBar code scanning?
The Scanbot GS1 DataBar code scanner is a software solution that delivers exceptional performance in challenging environments, including damaged or curved barcodes, with a scanning speed of under 0.04 seconds for seamless workflows. Try it now with a [free trial license](https://scanbot.io/trial/).
+
## UPC Barcode Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanner-sdk/upc/#main)
# UPC Barcode Scanner
Add UPC-A and UPC-E code scanning to your mobile application or website
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

## Turn smartphones into fast & reliable UPC code readers
The Scanbot UPC Barcode Scanner SDK ensures outstanding performance, even in demanding scenarios – such as scanning damaged barcodes or codes printed on curved or reflective surfaces often encountered in retail and logistics environments. With a scanning speed of under 0.04 seconds, your users get instant reads for seamless workflows.
Key benefits include:
- **Offline scanning**: The Scanbot SDK works 100% on-device, ensuring both uninterrupted performance and data security.
- **Enterprise-grade support**: Get dedicated chat support via Slack, Teams or email for any issue. Includes free assistance during the integration phase.
- **Flat pricing model**: Cost stays the same no matter how much your user base or scanning volume grows.


### How this scanning tool works
Our free online UPC scanning software reads codes directly through your camera or on imported images. This scanner works in any browser, no app download or signup needed. Enjoy real-time camera view scanning or decode barcodes on pictures in seconds – just point your camera at the UPC or import an image file to instantly access the encoded information.
This tool is powered by the [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/)!
* * *
(We don’t store any images or data you import. Everything stays on your device.)
## Understanding UPC barcodes
### What are UPCs?
The UPC, short for Universal Product Code, is a one-dimensional (1D) barcode widely used for product identification in retail, warehousing, and distribution. Its’ structures are a component of Global Trade Item Numbers (GTINs) and follow the global GS1 specification, which is based on international standards. There are two main variations.

UPC-A barcodes are the standard format, consisting of 12 numeric characters that contain product information. UPC-E barcodes, more frequently used in the US and Canada, is a compressed version of UPC-A barcode and contains only 6 digits. The key difference lies in their size and encoding method. UPC-E is also designed for smaller surfaces where space is limited, such as coupons.
Mainly utilized in North America, they differ slightly from [EAN](https://scanbot.io/barcode-scanner-sdk/ean/) barcodes, which find widespread international use. Together, these barcodes serve as the backbone for product identification, tracking, and management in both the manufacturing and retail industries.
One of the defining strengths of barcode is its role at the point of sale. They facilitate seamless checkout processes like [Scan & Go](https://scanbot.io/blog/scan-go-how-smartphones-as-grocery-scanners-create-a-first-class-in-store-experience/) and enhance [inventory management](https://scanbot.io/blog/instore-operations-retail-barcode-scanning/) by providing real-time stock updates.
### Applications of UPCs
**Retail**
UPCs are omnipresent in retail, enabling quick and accurate product identification at checkout. They streamline inventory management and facilitate efficient restocking processes.
**Supply chain**
These codes enhance supply chain efficiency by enabling accurate tracking of products from manufacturer to retailer. They also help manage inventory levels and forecast sales across the entire distribution network.
**Warehousing**
In warehousing and distribution centers, they allow for real-time inventory updates, reducing errors in stock counts and improving overall inventory accuracy.
### Structure of UPC barcodes
UPC-A barcodes include 12 numeric characters, split into two key components: 11 product digits and 1 check digit. The product digits are divided into three categories:
- The first digit identifies the category or type of product.
- The next five digits represent a unique identifier for the product manufacturer.
- The last five product digits contain specific product information like size or flavor.
The 12th and last digit is a check digit used for error detection and correction. Calculated from the first 11 digits, it helps scanners detect errors like incomplete or incorrect data during the scanning process.
UPC-E codes follow the same structure as UPC-A barcodes but use 6 digits instead, consisting of 5 product digits and 1 check number.
### Advantages of UPC barcodes
- Compact size: UPC codes are designed to store essential product information in a compact format, making them suitable for labeling items of various sizes in retail settings.
- Error detection: UPCs include error detection through the use of a check digit, which is calculated using the Modulo 10 algorithm. It helps identify errors such as single-digit mistakes or some transposition errors.
- Scalability: They come in fixed lengths, with the standard UPC-A format storing 12 digits, while the compact UPC-E format accommodates smaller products with reduced data capacity.
- Versatility: They are compatible with virtually all retail and point-of-sale systems, ensuring seamless integration across industries worldwide.
### Why choose the Scanbot SDK for UPC scanning?
The Scanbot Barcode Scanner SDK is specifically designed to handle the challenges of decoding UPC codes in real-world scenarios.
What sets us apart:
- **Exceptional performance**: Reliably decodes even damaged, low-contrast or distorted barcodes.
- **High-speed scanning**: Read UPC codes in as little as 0.04 seconds.
- **Cross-platform compatibility**: Easily integrate with Android, iOS, cross-platform, web, Windows, and Linux platforms.
- **Customizable UI**: Customize the ready-to-use components to match your app or website design.
- **Privacy-first**: Operates offline for complete data security.
Whether your use case involves UPC codes, EAN codes or [any other barcode](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/), the Scanbot SDK delivers the accuracy, speed, and reliability you need to succeed.
* * *
## Related Barcode Types:
- [Data Matrix Scanner](https://scanbot.io/barcode-scanner-sdk/data-matrix/)
- [QR Code Scanner](https://scanbot.io/qr-code-scanner-online/)
- [PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/pdf417/)
- [Aztec Code Scanner](https://scanbot.io/barcode-scanner-sdk/aztec-code/)
- [Code 128 Scanner](https://scanbot.io/barcode-scanner-sdk/code-128/)
- [Code 39 Scanner](https://scanbot.io/barcode-scanner-sdk/code-39/)
- [EAN Scanner](https://scanbot.io/barcode-scanner-sdk/ean/)
- [Micro QR Code Scanner](https://scanbot.io/barcode-scanner-sdk/micro-qr-code/)
- [GS1 DataBar Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-databar/)
- [GS1 DataMatrix Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-data-matrix/)
- [GS1-128 Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-128/)
- [MaxiCode Scanner](https://scanbot.io/barcode-scanner-sdk/maxicode/)
- [ITF Scanner](https://scanbot.io/barcode-scanner-sdk/itf-code/)
- [Codabar Scanner](https://scanbot.io/barcode-scanner-sdk/codabar/)
- [Intelligent Mail Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/intelligent-mail-barcode/)
- [rMQR Code Scanner](https://scanbot.io/barcode-scanner-sdk/rmqr/)
- [Royal Mail Scanner](https://scanbot.io/barcode-scanner-sdk/royal-mail/)
- [Micro PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/micro-pdf417/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### **What is a UPC-A barcode?**
The UPC-A code, short for Universal Product Code, is a one-dimensional barcode widely used for product identification in retail, warehousing, and distribution. UPC-A is the standard format, consisting of 12 digits that encode product information.
### **Where is a UPC-A used?**
They are used in retail for quick product identification at checkout, in supply chains for tracking products and managing inventory, and in warehousing for real-time inventory updates and accuracy.
### **What is the difference between UPC-A and UPC-E?**
The difference lies in their size and encoding. UPC-A has 12 digits, while UPC-E is a compressed 6-digit version, designed for smaller surfaces like coupons. UPC-A is globally used, whereas the other is more common in the US and Canada.
### **What is the difference between a QR Code and a UPC barcode?**
The key difference between a QR Code and a UPC barcode is in their structure and use. A UPC barcode is one-dimensional (1D) and typically contains product information. It is used for inventory management and checkout in retail. A QR Code, on the other hand, is a two-dimensional (2D) matrix code that can store more information, including URLs, text, or contact details, and is commonly used for mobile devices to link to websites or digital content.
### **How can Scanbot SDK help you with UPC barcode scanning?**
The Scanbot SDK delivers exceptional performance in challenging environments, including damaged or curved barcodes, with a scanning speed of under 0.04 seconds for seamless workflows. Try it now with a [free trial license](https://scanbot.io/trial/).
+
## ITF Barcode Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanner-sdk/itf-code/#main)
# ITF Barcode Scanner
Add Interleaved 2 of 5 scanning to your mobile application or website
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

## Turn smartphones into fast & reliable ITF code scanners
The Scanbot ITF Barcode Scanner SDK delivers exceptional performance even under challenging conditions – such as code damage or when scanning tiny codes. With a scanning speed of under 0.04 seconds, your users get instant reads for seamless workflows.
Key benefits include:
- **Offline scanning**: The Scanbot SDK works 100% on-device, ensuring both uninterrupted performance and data security.
- **Enterprise-grade support**: Get dedicated chat support via Slack, Teams or email for any issue. Includes free assistance during the integration phase.
- **Flat pricing model**: Cost stays the same no matter how much your user base or scanning volume grows.


### How this scanning tool works
Our free online ITF barcode reader scans codes directly through your camera or on imported images. This barcode scanner works in any browser, no app download or signup needed. Enjoy real-time camera view scanning or decode barcodes on pictures in seconds – just point your tablet, laptop or mobile phone’s camera at the ITF barcode or import an image file to instantly access the encoded data.
This tool is powered by the [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/)!
* * *
(We don’t store any images or data you import. Everything stays on your device.)
## Understanding ITF barcodes
### What are ITF barcodes?
ITF (Interleaved 2 of 5) is a one-dimensional, linear barcode that contains pairs of numeric characters into a high-density, self-checking format. It uses a pattern of wide and narrow bars and spaces to represent data, allowing for compact encoding of numeric information.

ITF codes are widely used in logistics, warehousing, and manufacturing industries. They are particularly common on shipping cartons, corrugated cardboard boxes, and outer packaging for efficient inventory tracking and management. There is no strict limit on the total number of characters an ITF barcode can encode, as long as it maintains an even count of numeric characters. However, specific variants like ITF-14 barcodes are limited to 14 digits.
The high data density and ease of printing barcodes on various surfaces make ITF ideal for applications requiring compact numeric data representation. They are used in inventory management, stock control, shipment tracking, and automated sorting in warehouses and distribution centers.
### Applications of ITF barcodes
**Logistics, shipping and warehousing**
ITF barcodes are widely used in logistics, shipping, and warehousing industries for efficient tracking and management of products throughout the supply chain. These barcodes are particularly well-suited for printing on corrugated cardboard boxes and cartons, as their simple structure of wide and narrow bars allows for clear readability even on rough or textured surfaces.
**Manufacturing**
Manufacturing industries utilize ITF barcodes to track unfinished and finished goods, manage component parts, and maintain precise records of production batches, ensuring seamless traceability and operational transparency throughout the production process.
### Structure of ITF barcodes
ITF (Interleaved 2 of 5) barcodes are a special code for numbers only, using thick and thin lines (bars) and the spaces between them to represent digits. The key feature of ITF is that it always encodes two numbers at once:
- One number is represented by the pattern of bars (the black lines)
- The other number is represented by the pattern of spaces between those bars
This interleaved structure is why it’s called “Interleaved 2 of 5”. The “2 of 5” part refers to the fact that each digit is encoded using five elements (bars or spaces), with two being wide and three being narrow. Optionally, ITF codes can include a thick black border that surrounds it. This is called a bearer bar, and it helps prevent partial reads.
### Advantages of ITF barcodes
- Compact size: ITF barcodes store numeric information in minimal space, which is ideal for shipping cartons and product packaging with a limited label area.
- Error detection: While not as advanced as 2D barcodes, ITF can include an optional check digit that helps reduce scanning errors.
- Scalability: ITF barcodes can accommodate variable even-numbered lengths of numeric data, allowing flexibility in encoding different quantities of information.
- Versatility: ITF barcodes support omnidirectional scanning, enabling quick and easy reading from multiple angles in industrial and logistics environments.
### Why choose the Scanbot SDK for ITF barcode scanning?
The Scanbot Barcode Scanner SDK is specifically designed to handle the challenges of decoding ITF barcodes in real-world scenarios.
What sets us apart:
- **Exceptional performance**: Reliably decodes even damaged, low-contrast or distorted barcodes.
- **High-speed scanning**: Read ITF barcodes in as little as 0.04 seconds.
- **Cross-platform compatibility**: Easily integrate with Android, iOS, cross-platform, web, Windows, and Linux platforms.
- **Customizable UI**: Customize the ready-to-use components to match your app or website design.
- **Privacy-first**: Operates offline for complete data security.
Whether your use case involves ITF barcodes, QR codes or [any other barcode](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/), the Scanbot SDK delivers the accuracy, speed, and reliability you need to succeed.
* * *
## Related Barcode Types:
- [Data Matrix Scanner](https://scanbot.io/barcode-scanner-sdk/data-matrix/)
- [QR Code Scanner](https://scanbot.io/qr-code-scanner-online/)
- [PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/pdf417/)
- [Aztec Code Scanner](https://scanbot.io/barcode-scanner-sdk/aztec-code/)
- [Code 128 Scanner](https://scanbot.io/barcode-scanner-sdk/code-128/)
- [Code 39 Scanner](https://scanbot.io/barcode-scanner-sdk/code-39/)
- [EAN Scanner](https://scanbot.io/barcode-scanner-sdk/ean/)
- [UPC Scanner](https://scanbot.io/barcode-scanner-sdk/upc/)
- [Micro QR Code Scanner](https://scanbot.io/barcode-scanner-sdk/micro-qr-code/)
- [GS1 DataBar Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-databar/)
- [GS1 DataMatrix Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-data-matrix/)
- [GS1-128 Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-128/)
- [MaxiCode Scanner](https://scanbot.io/barcode-scanner-sdk/maxicode/)
- [Codabar Scanner](https://scanbot.io/barcode-scanner-sdk/codabar/)
- [Intelligent Mail Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/intelligent-mail-barcode/)
- [rMQR Code Scanner](https://scanbot.io/barcode-scanner-sdk/rmqr/)
- [Royal Mail Scanner](https://scanbot.io/barcode-scanner-sdk/royal-mail/)
- [Micro PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/micro-pdf417/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### **What is an ITF barcode?**
ITF (Interleaved 2 of 5) is a one-dimensional barcode that encodes numeric data using wide and narrow bars and spaces. It represents pairs of digits in a compact, high-density format with an interleaved structure. ITF barcodes can only include an even number of digits. They are common in distribution and manufacturing.
### **What is the difference between EAN and ITF barcodes?**
The key difference lies in their structure and primary application areas.
EAN-13 barcodes are used for retail products with a fixed 13-digit format, while ITF barcodes are used for shipping and logistics with a variable even number of digits. EAN requires high-quality printing and is scanned at point-of-sale, whereas ITF can be printed on rough surfaces like cardboard boxes.
### **Where are ITF barcodes used?**
ITF barcodes are used in logistics, shipping, and warehousing for tracking products throughout the supply chain. They are ideal for corrugated cardboard boxes due to their clear readability. Additionally, manufacturing industries use ITF barcodes to track unfinished and finished goods and manage components.
### **How can Scanbot SDK help you with ITF barcode scanning?**
The Scanbot ITF barcode scanner delivers exceptional performance in challenging environments, including damaged or curved barcodes, with a scanning speed of under 0.04 seconds for seamless workflows. Try it now with a [free trial license](https://scanbot.io/trial/).
+
## EAN Barcode Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanner-sdk/ean/#main)
# EAN Barcode Scanner
Add EAN scanning to your mobile application or website
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

## Turn smartphones into fast & reliable EAN barcode readers
The Scanbot EAN Barcode Scanner SDK delivers exceptional performance in scanning both EAN-13 codes and EAN-8 codes, ensuring reliable product identification across retail and e-commerce industries. With a scanning speed of under 0.04 seconds, your users get instant reads for seamless workflows.
Key benefits include:
- **Offline scanning**: The Scanbot SDK works 100% on-device, ensuring both uninterrupted performance and data security.
- **Enterprise-grade support**: Get dedicated chat support via Slack, Teams or email for any issue. Includes free assistance during the integration phase.
- **Flat pricing model**: Cost stays the same no matter how much your user base or scanning volume grows.


### How this scanning tool works
Our free online EAN-13 barcode reader and EAN-8 barcode reader scan codes directly through your camera or on imported images. This barcode reader works in any browser, no app download or signup needed. Enjoy real-time camera view scanning or decode barcodes on pictures in seconds – just point your camera at the EAN or import an image file to instantly access the encoded data.
This tool is powered by the [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/)!
* * *
(We don’t store any images or data you import. Everything stays on your device.)
## Understanding EAN barcodes
### What is an EAN barcode?
The EAN barcode is a one-dimensional (1D) code that serves as the current standard for product identification in much of global trade. The exception is North America, where UPC barcodes are used. While “EAN” originally meant “European Article Number,” it now stands for International Article Number.
EAN barcodes come in several subtypes, with EAN-13 and EAN-8 being the most common. They are listed in the table below:
| | | | |
| --- | --- | --- | --- |
| **Barcode variation** | **Image** | **Data capacity** | **Use cases** |
| EAN-13 |  | 13 digits | Global product identification, retail POS |
| EAN-8 |  | 8 digits | Smaller products with limited space on packaging |
| EAN-5 (supplement) |  | 5 digits | Add-on for EAN-13, EAN-8, and UPC-A, often used for book pricing |
| EAN-2 (supplement) |  | 2 digits | Add-on for EAN-13, EAN-8, and UPC-A, often used for magazine issue numbers |
| ISSN (International Standard Serial Number) |  | 8 digits | Serial publications identification |
| ISBN (International Standard Book Number) |  | 13 digits | Book identification |
EAN codes are standardized in ISO/IEC 15420. EAN-13 symbols always encode the product’s Global Trade Item Number (GTIN). These consist of a GS1 prefix of the country of registration, company and product codes, and a check digit for error detection.
### Structure and components
EAN-13 codes encode 13 numeric digits, split into two key components: A 12-digit GTIN and 1 check digit.
The GTIN itself begins with a GS1 Company Prefix (GCP), a unique identifier assigned to the product’s original seller, obtained through registration at the relevant country’s GS1 code center. The length of the GCP varies, but the first three digits are a country code.
The remaining digits are used to identify a particular product, including variations like size, color, or flavor.
An EAN-13 barcode thus has the following structure:
1. **Country code**: 3 digits (countries can be assigned more than one).
2. **Company prefix**: Unique identifier for the seller. It includes the country code and a manufacturer code. Find the list of GS1 prefixes [here](https://www.gs1.org/standards/id-keys/company-prefix).
3. **Item reference**: Takes up the rest of the 12 GTIN digits, creating a unique product ID.
4. **Check digit**: The final digit is used for error detection.

### Error detection and other accuracy features
The checksum digit is calculated using a variant of the Modulo-10 (Luhn Algorithm) and helps detect scanning errors. It is the last digit and can be any number between 0 and 9.
EAN codes also feature guard bars (marked in green) and quiet zones (marked in red), which help barcode readers identify code boundaries and orientation. The quiet zones prevent interference from surrounding text and graphics. Additionally, the two halves of the barcode – before and after the middle guard bar – use different patterns for the same digit, further clarifying the orientation.
Finally, the content is also shown in human-readable form for redundancy.
### Applications of EAN codes
**Retail**
EAN codes enable fast, accurate checkout processes by providing instant access to product information, prices, and inventory levels.
**E-commerce**
Major platforms like Amazon and eBay require EAN codes on products and for product listings, facilitating inventory tracking, shipping logistics, and sales management.
### Advantages of EAN codes
- **Compact size**: They store product codes in a compact format. The choice of EAN-13 and EAN-8 makes them suitable for use on products of various sizes, from grocery items to larger retail goods.
- **Error detection**: EAN codes offer error detection through a modulo-10 check digit.
- **Omnidirectional scanning**: EAN codes have a clear direction, ensuring seamless decoding from any angle.
### Why choose the Scanbot SDK for EAN barcode scanning?
The Scanbot Barcode Scanner SDK is specifically designed to handle the challenges of decoding EAN barcodes in real-world scenarios.
What sets us apart:
- **Exceptional performance**: Reliably decodes even damaged, low-contrast or distorted barcodes.
- **High-speed scanning**: Read EAN codes in as little as 0.04 seconds.
- **Cross-platform compatibility**: Easily integrate with Android, iOS, cross-platform, web, Windows, and Linux platforms.
- **Customizable UI**: Customize the ready-to-use components to match your app or website design.
- **Privacy-first**: Operates offline for complete data security.
Whether your use case involves EAN codes, UPC codes, QR codes, or [other barcode symbologies](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/), the Scanbot SDK delivers the accuracy, speed, and reliability you need to succeed.
* * *
## Related Barcode Types:
- [Data Matrix Scanner](https://scanbot.io/barcode-scanner-sdk/data-matrix/)
- [QR Code Scanner](https://scanbot.io/qr-code-scanner-online/)
- [PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/pdf417/)
- [Aztec Code Scanner](https://scanbot.io/barcode-scanner-sdk/aztec-code/)
- [Code 128 Scanner](https://scanbot.io/barcode-scanner-sdk/code-128/)
- [Code 39 Scanner](https://scanbot.io/barcode-scanner-sdk/code-39/)
- [UPC Scanner](https://scanbot.io/barcode-scanner-sdk/upc/)
- [Micro QR Code Scanner](https://scanbot.io/barcode-scanner-sdk/micro-qr-code/)
- [GS1 DataBar Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-databar/)
- [GS1 DataMatrix Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-data-matrix/)
- [GS1-128 Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-128/)
- [MaxiCode Scanner](https://scanbot.io/barcode-scanner-sdk/maxicode/)
- [ITF Scanner](https://scanbot.io/barcode-scanner-sdk/itf-code/)
- [Codabar Scanner](https://scanbot.io/barcode-scanner-sdk/codabar/)
- [Intelligent Mail Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/intelligent-mail-barcode/)
- [rMQR Code Scanner](https://scanbot.io/barcode-scanner-sdk/rmqr/)
- [Royal Mail Scanner](https://scanbot.io/barcode-scanner-sdk/royal-mail/)
- [Micro PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/micro-pdf417/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### Where is EAN-13 used?
EAN-13 barcodes are essential in retail environments and e-commerce platforms for product identification, pricing, and inventory management. They are more common in Europe’s retail environments, while UPC (Universal Product Codes) are more popular in North America.
### What is the difference between EAN-13 and EAN-8 barcodes?
The difference between EAN-13 and EAN-8 lies in their size and encoding. EAN-13 has 13 digits, while EAN-8 is a compressed 8-digit version, designed for smaller surfaces like candy bars. EAN codes are the standard for product identification in global trade.
### How could Scanbot SDK help you with EAN barcode scanning?
The Scanbot EAN barcode scanner delivers exceptional performance in challenging environments, including damaged or curved barcodes, with a scanning speed of under 0.04 seconds for seamless workflows. Try it now with a [free trial license](https://scanbot.io/trial/).
+
## Royal Mail Barcode Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanner-sdk/royal-mail/#main)
# Royal Mail Barcode Scanner
Add RM4SCC and Mailmark barcode scanning to your mobile application or website
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

## Turn smartphones into fast & reliable barcode scanners for Royal Mail codes
The Scanbot Royal Mail Barcode Scanner SDK ensures outstanding performance, even in demanding scenarios – such as scanning damaged or dirty barcodes on parcels in the postal industry. With a scanning speed of under 0.04 seconds, your users get instant reads for seamless workflows.
Key benefits include:
- **Offline scanning**: The Scanbot SDK works 100% on-device, ensuring both uninterrupted performance and data security.
- **Enterprise-grade support**: Get dedicated chat support via Slack, Teams or email for any issue. Includes free assistance during the integration phase.
- **Flat pricing model**: Cost stays the same no matter how much your user base or scanning volume grows.


### How this scanning tool works
Our free online Royal Mail barcode scanning software reads codes directly through your camera or on imported images. This barcode scanner works in any browser, no app download or signup needed. Enjoy real-time camera view scanning or decode barcodes on pictures in seconds – just point your camera at the Royal Mail barcode or import an image file to instantly access the encoded data.
This tool is powered by the [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/)!
* * *
(We don’t store any images or data you import. Everything stays on your device.)
## Understanding Royal Mail barcodes
### What is a UK Royal Mail code?
RM4SCC (Royal Mail 4-State Customer Code) is a barcode character set created by Royal Mail. Under the Mailmark scheme, this barcode system is designed for mail sorting and delivery in the United Kingdom. It encodes postal information for efficient automated processing of mail.
The RM4SCC was formerly used for the 9-character Customer Barcode, or CBC.
Today, Royal Mail uses two barcodes: The Mailmark, which is based on a Data Matrix barcode, and the Mailmark 4-State (based on the RM4SCC system).
| | | |
| --- | --- | --- |
| | **RM4SCC / Mailmark 4-State** | **Mailmark** |
| Barcode type | 1D, 4-state barcode | 2D Data Matrix (Type 7, 9 and 29) |
| Total data capacity | L: 26 characters C: 22 characters | Type 7: 51 characters Type 9: 90 characters Type 29: 70 characters |
| Information encoded | Mailing class, sender information (SCID), unique item ID, UK postcodes, Delivery Point Suffixes (DPS) | Unique item ID, postcode, delivery point, sender info |
| Use case | Mail automation and tracking | Mail automation and tracking |
| Image |  |  |
While primarily used in the UK, Royal Mail barcodes serve a similar purpose to other national and international postal barcodes, helping with mail sorting and tracking. Royal Mail introduced them to enable automation, reduce errors, and improve delivery efficiency.
### Structure and components
A 4-state Mailmark barcode contains the following elements:
- **Format**: 1 character identifying the format of the item (Letter, Large Letter, etc.)
- **Version ID**: 1 character indicating the barcode version (currently “1” for Mailmark)
- **Class**: 1 character identifying the class of mail (1C, 2C, etc.)
- **Supply Chain ID**: Either 2 digits (for Consolidator barcode C) or 6 digits (for barcode L) identifying the unique group of customers involved in the mailing
- **Item ID**: 8 digits identifying the unique item within the Supply Chain
- **Destination Post Code plus DPS**: 9 characters containing the Postcode of the destination with Delivery Point Suffix
### Encoding
The Mailmark 4-State employs a special encoding system based on four distinct bar states. These are:
- Tracker (T): Occupies the middle section of the barcode’s height
- Tracker, Descender (D): Occupies the two lower sections
- Tracker, Ascender (A): Occupies the two upper sections
- Tracker, Ascender, Descender (full bar, F): Occupies the entire height

Mailmark 4-State barcodes can represent all 10 digits (0–9), 26 letters (A–Z), and the space character, for a total of 37 symbols. The data is encoded in several steps, which includes adding Reed-Solomon error correction codes. The final barcode characters consist of 3 bars each.
### Applications of Royal Mail codes
**Postal service**
The Royal Mail barcode system is primarily used to automate mail sorting, tracking, and delivery within the UK. The barcode is located above the delivery address. Customers can use the contained tracking codes for mailing analytics.
### Advantages of Royal Mail barcodes
- **Flexible size**: Mailmark barcodes come in three different sizes (Data Matrix type 7, 9 and 29) and an additional 1D format.
- **Error correction**: All Royal Mail Mailmark barcodes use Reed-Solomon error correction, ensuring reliable reading in demanding postal environments.
- **Scalability**: Royal Mail barcodes can encode both numeric digits (0-9) and uppercase letters (A-Z). The 2D Mailmark barcodes offer increased data capacity of up to 90 characters, 45 of them customizable.
- **Versatility**: Royal Mail barcodes support various mail types such as letters and large letters. Mailmark barcodes enable tracking and delivery status information, and can be used by mailers to frank their own mail in-house.
### Why choose the Scanbot SDK for Royal Mail barcode scanning?
The Scanbot Barcode Scanner SDK is specifically designed to handle the challenges of decoding Royal Mail barcodes in real-world scenarios.
What sets us apart:
- **Exceptional performance**: Reliably decodes even damaged, low-contrast or distorted barcodes.
- **High-speed scanning**: Read Royal Mail barcodes in as little as 0.04 seconds.
- **Cross-platform compatibility**: Easily integrate with Android, iOS, cross-platform, web, Windows, and Linux platforms.
- **Customizable UI**: Customize the ready-to-use components to match your app or website design.
- **Privacy-first**: Operates offline for complete data security.
Whether your use case involves Royal Mail barcodes, UPC codes or [any other barcode](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/), the Scanbot SDK delivers the accuracy, speed, and reliability you need to succeed.
* * *
## Related Barcode Types:
- [Data Matrix Scanner](https://scanbot.io/barcode-scanner-sdk/data-matrix/)
- [QR Code Scanner](https://scanbot.io/qr-code-scanner-online/)
- [PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/pdf417/)
- [Aztec Code Scanner](https://scanbot.io/barcode-scanner-sdk/aztec-code/)
- [Code 128 Scanner](https://scanbot.io/barcode-scanner-sdk/code-128/)
- [Code 39 Scanner](https://scanbot.io/barcode-scanner-sdk/code-39/)
- [EAN Scanner](https://scanbot.io/barcode-scanner-sdk/ean/)
- [UPC Scanner](https://scanbot.io/barcode-scanner-sdk/upc/)
- [Micro QR Code Scanner](https://scanbot.io/barcode-scanner-sdk/micro-qr-code/)
- [GS1 DataBar Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-databar/)
- [GS1 DataMatrix Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-data-matrix/)
- [GS1-128 Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-128/)
- [MaxiCode Scanner](https://scanbot.io/barcode-scanner-sdk/maxicode/)
- [ITF Scanner](https://scanbot.io/barcode-scanner-sdk/itf-code/)
- [Codabar Scanner](https://scanbot.io/barcode-scanner-sdk/codabar/)
- [Intelligent Mail Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/intelligent-mail-barcode/)
- [rMQR Code Scanner](https://scanbot.io/barcode-scanner-sdk/rmqr/)
- [Micro PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/micro-pdf417/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### **Can I still use Royal Mail stamps without a barcode?**
No, you cannot use Royal Mail stamps without a barcode. As of August 1, 2023, stamps without barcodes are no longer valid for postage and will incur a surcharge for insufficient postage. However, you can exchange non-barcoded stamps for new barcoded ones through the Royal Mail's swap scheme.
### **How can Scanbot SDK help you with Royal Mail barcode scanning?**
The Scanbot Barcode Scanner SDK delivers exceptional performance in challenging environments, including damaged or curved barcodes, with a scanning speed of under 0.04 seconds for seamless workflows. Try it now with a [free trial license](https://scanbot.io/trial/).
+
## Scanbot SDK Teams
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/careers/open-positions/teams/#main)
# Where Teamwork Meets Success
Meet our team at Scanbot SDK
[See all open positions](https://scanbot.io/careers/open-positions/)

00
Employees
00
Nationalities
00
Team
Come and join us as we take a closer look at the innovators who are changing the world of mobile data capture every day.
## Meet our Engineering Team
Our product lies at the heart of Scanbot SDK. That’s why we have gathered various industry experts who ensure we deliver excellence day by day.
- ### Core Team
Every new feature development starts at the Core. The team combines state-of-the-art Machine Learning and Computer Vision technologies, while transforming R&D Python code to integration-ready C++.
- ### Android Team
The Android team creates state-of-the-art native Android APIs used by our global customer base – a challenging task given the vast variety of possible devices and OS version combinations. It builds new features and integrates the Core code as well as the ML models within the world of Android development.
- ### iOS Team
The iOS team builds new features and integrates the Core code and ML models into the iOS landscape. They ensure compatibility across different iOS devices and versions, ultimately building a production-ready iOS SDK, and providing enterprises with modern APIs around mobile data capture.
- ### Cross-Platform Team
The Cross-Platform team challenges the status quo for mobile data capture in cross-platform frameworks such as Flutter, React Native, Xamarin, or Cordova. Using our native Android & iOS SDKs as a baseline, they build reliable and robust solutions not only for mobile, but also for web development.
- ### Web Team
The Web team ensures that our customers don’t get tangled up in their web applications. They are responsible for developing the Web SDK.
- ### QA / Support Team
Our last line of defense, the QA team, ensures that all our product releases are flawless and match our high standards in product development. They also delight our enterprise clients with reliable Customer Support.
- ### QA Automation / Dev Ops Team
The QA Automation team develops and maintains our CI/CD system, keeping it continuously healthy and wealthy.
- ### Data Tagging Team
The Data Tagging team lays a strong foundation for our ML team. They tag and annotate data for ML training purposes and offer support with any kind of training data preparation.

## Meet our Revenue Team
We at Scanbot SDK are proud of what we create. Our Revenue team ensures that our product gets the attention it deserves.
- ### Design
An appealing design and a convenient user experience are just as important as high-quality content. From the SDK and its demo app over our website and emails to content pieces – our designers execute projects in close collaboration with numerous teams and create engaging visual content.
- ### Web Development
The website is generally the entry point for every new potential customer, with our Web Development team collaborating across departments to deliver exceptional digital experiences. They also develop our web demo app, and specialized demos that showcase specific use cases for prospects.
- ### Growth
Our Growth team is always looking for new ways to generate leads and drive our company’s growth forward. With the multitude of potential use cases we cover with our product, Growth is a key factor in discovering new strategic fields for Scanbot SDK and our solutions.
- ### Performance and SEM
Paid and organic search traffic play a key role in our marketing activities for B2B inbound lead generation. The Performance and SEM team tracks relevant data and analyzes it in order to measure our performance. They set up website A/B tests, paid search ads, and distribute content on all relevant channels, all while driving high-quality traffic to our website.
- ### Content Marketing
Decision-making requires an extensive information base. That’s why our Content Marketing team aims to provide existing and potential customers with all the necessary information around mobile data capture, business digitization, and our Scanner SDK modules. They create relevant and engaging materials in numerous formats.
- ### Customer Success
The customer is at the heart of our product offering. Our Customer Success team is the internal voice of our customers, understanding every individual use case, and helping them solve any present or upcoming problems related to mobile data capture.
- ### Sales
In inbound and outbound sales the mission is to find solutions to problems enterprises around the world face with data capture. Our Sales team tries to find the most effective way to solve problems – on a daily basis for an unlimited amount of use cases.

## Meet our People and Finance Teams
People and Numbers – at Scanbot SDK they go well together. Let’s have a look at how these two teams ensure that everything runs smoothly in front of and behind the scenes.
- ### Finance and Operations Team
The Finance & Operations team handles finance and accounting matters, from budget development to reporting, and all administrative HR tasks like payroll and visa applications for new team members from abroad. Furthermore, they are taking care of legal- and compliance topics. By removing obstacles out of the way and keeping internal and external stakeholders informed they enable all teams to do their best work.
- ### People and Recruiting Team
The People and Recruiting team is always looking for motivated and inquisitive talents in software development, sales, marketing, and many other areas of expertise. Our recruiters work hand-in-hand with the departments to understand the need for talent and knowledge requirements of prospective team members. In collaboration with the Content team, they deliver engaging employer branding strategies. They are the first point of contact for most new employees and are entirely responsible for a smooth on- and offboarding.

+
## MicroPDF417 Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanner-sdk/micro-pdf417/#main)
# MicroPDF417 Scanner
Add MicroPDF417 scanning to your mobile application or website
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

## Turn smartphones into fast & reliable MicroPDF417 readers
The Scanbot MicroPDF417 Barcode Scanner SDK ensures outstanding performance, even in demanding scenarios – such as scanning damaged or tiny barcodes commonly found in the shipping and logistics industry. With a scanning speed of under 0.04 seconds, your users get instant reads for seamless workflows.
Key benefits include:
- **Offline scanning**: The Scanbot SDK works 100% on-device, ensuring both uninterrupted performance and data security.
- **Enterprise-grade support**: Get dedicated chat support via Slack, Teams or email for any issue. Includes free assistance during the integration phase.
- **Flat pricing model**: Cost stays the same no matter how much your user base or scanning volume grows.


### How this scanning tool works
Our free online MicroPDF417 scanning software reads codes directly through your camera or on imported images. This barcode scanner works in any browser, no app download or signup needed. Enjoy real-time camera view scanning or decode barcodes on pictures in seconds – just point your camera at the MicroPDF417 barcode or import an image file to instantly access the encoded data.
This tool is powered by the [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/)!
* * *
(We don’t store any images or data you import. Everything stays on your device.)
## Understanding MicroPDF417 barcodes
### What is a MicroPDF417 barcode?
MicroPDF417 codes are compact two-dimensional barcodes designed to encode moderate amounts of data in a small space. They can store up to 150 bytes of data, 250 alphanumeric characters, or 366 numeric data. The MicroPDF417 symbology is standardized in ISO/IEC 24728.

MicroPDF417’s data capacity varies based on symbol size and error correction level. The code offers 34 different symbol sizes, ranging from 1 to 4 data columns and 4 to 44 rows. Smaller versions hold around 20-30 characters, while larger ones accommodate over 200 characters.
These barcodes find applications across various industries, including in logistics for tracking shipments, in retail for product information and in healthcare for patient identification.
### Structure and components
MicroPDF417 codes contain the following key components:
1. **Quiet zones**: Margins help identify the code’s boundaries.
2. **Left Row Address Pattern (RAP)**: Indicates the specific row number within the barcode. It consists of 10 modules split into 3 black bars and 3 white spaces.
3. **Data codewords**: The core of the barcode where actual data is encoded using a series of codewords (4 bars and 4 spaces arranged within 17 modules each).
4. **Right Row Address Pattern**: Same as the left RAP, but on the right side of the symbol.
5. **Stop bar**: A single black bar located after the right RAP, serving as the final element of each row.

For codes with 3 or 4 data columns, a third RAP column is inserted in the middle.
### Error correction
MicroPDF417 employs Reed-Solomon error correction across seven levels (0-6), which are automatically determined by the number of data codewords. This system can detect missing or corrupted codewords and reconstruct them up to the capacity of the chosen EC level.
Error correction in MicroPDF417 improves readability by adding redundant error correction codewords to recover lost or damaged codewords, at the cost of data capacity.
### Applications of MicroPDF417 barcodes
**Logistics and warehousing**
MicroPDF417 barcodes facilitate tracking and management of shipments, inventory, and assets due to their compact size and high data density.
**Healthcare**
In the pharmaceutical industry, MicroPDF417 codes are used on medication packaging to store dosage instructions, expiration dates, and batch numbers, ensuring safety and compliance.
**Retail**
MicroPDF417 barcodes are ideal for encoding detailed product information, such as serial numbers, batch codes, or regulatory data, in a compact format. They are especially suited for labeling small items with limited space, like cosmetics or electronics accessories. They frequently appear as part of a GS1 Composite Code alongside a 1D barcode.
### Advantages of MicroPDF417 barcodes
- **Compact size and high density**: They can store up to 150 bytes, 250 alphanumeric characters, or 366 numeric characters in minimal space.
- **Error correction**: Utilizing Reed-Solomon error correction, MicroPDF417 ensures reliable data retrieval even when parts of the barcode are damaged or obscured.
- **Versatility**: They are suitable for a wide range of applications, including logistics for tracking shipments, product information, and inventory management.
### Why choose the Scanbot SDK for MicroPDF417 scanning?
The Scanbot Barcode Scanner SDK is specifically designed to handle the challenges of decoding MicroPDF417 barcodes in real-world scenarios.
What sets us apart:
- **Exceptional performance**: Reliably decodes even damaged, low-contrast or distorted barcodes.
- **High-speed scanning**: Read MicroPDF417 barcodes in as little as 0.04 seconds.
- **Cross-platform compatibility**: Easily integrate with Android, iOS, cross-platform, web, Windows, and Linux platforms.
- **Customizable UI**: Customize the ready-to-use components to match your app or website design.
- **Privacy-first**: Operates offline for complete data security.
Whether your use case involves MicroPDF417 barcodes, QR codes or [any other barcode](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/), the Scanbot SDK delivers the accuracy, speed, and reliability you need to succeed.
* * *
## Related Barcode Types:
- [Data Matrix Scanner](https://scanbot.io/barcode-scanner-sdk/data-matrix/)
- [QR Code Scanner](https://scanbot.io/qr-code-scanner-online/)
- [PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/pdf417/)
- [Aztec Code Scanner](https://scanbot.io/barcode-scanner-sdk/aztec-code/)
- [Code 128 Scanner](https://scanbot.io/barcode-scanner-sdk/code-128/)
- [Code 39 Scanner](https://scanbot.io/barcode-scanner-sdk/code-39/)
- [EAN Scanner](https://scanbot.io/barcode-scanner-sdk/ean/)
- [UPC Scanner](https://scanbot.io/barcode-scanner-sdk/upc/)
- [Micro QR Code Scanner](https://scanbot.io/barcode-scanner-sdk/micro-qr-code/)
- [GS1 DataBar Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-databar/)
- [GS1 DataMatrix Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-data-matrix/)
- [GS1-128 Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-128/)
- [MaxiCode Scanner](https://scanbot.io/barcode-scanner-sdk/maxicode/)
- [ITF Scanner](https://scanbot.io/barcode-scanner-sdk/itf-code/)
- [Codabar Scanner](https://scanbot.io/barcode-scanner-sdk/codabar/)
- [Intelligent Mail Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/intelligent-mail-barcode/)
- [rMQR Code Scanner](https://scanbot.io/barcode-scanner-sdk/rmqr/)
- [Royal Mail Scanner](https://scanbot.io/barcode-scanner-sdk/royal-mail/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### Where are MicroPDF417 codes used?
MicroPDF417 codes are used in logistics for tracking shipments, in government IDs like driver’s licenses, and in healthcare for storing medication packaging and patient identification. In retail, they are commonly used for labeling smaller items like electronics.
### **What is the difference between MicroPDF417 and PDF417?**
MicroPDF417 improves efficiency by eliminating the start/stop characters found in standard PDF417 barcodes. Unlike its predecessor, MicroPDF417 follows strict formatting rules, allowing only specific combinations of columns, rows, and error correction levels—with a maximum configuration of four data columns and 44 rows.
### How can Scanbot SDK help you with MicroPDF417 barcode scanning?
The Scanbot MicroPDF417 barcode scanner delivers exceptional performance in challenging environments, including damaged or curved barcodes, with a scanning speed of under 0.04 seconds for seamless workflows. Try it now with a [free trial license](https://scanbot.io/trial/).
+
## rMQR Code Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanner-sdk/rmqr/#main)
# RMQR Reader
Add rectangular Micro QR code scanning to your mobile application or website
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

## Turn smartphones into fast & reliable rMQR Code scanners
The Scanbot Rectangular Micro QR Code Scanner SDK ensures outstanding performance, even in demanding scenarios – such as damage or when scanning extremely compact codes commonly found in narrow spaces. With a scanning speed of under 0.04 seconds, your users get instant reads for seamless workflows.
Key benefits include:
- **Offline scanning**: The Scanbot SDK works 100% on-device, ensuring both uninterrupted performance and data security.
- **Enterprise-grade support**: Get dedicated chat support via Slack, Teams or email for any issue. Includes free assistance during the integration phase.
- **Flat pricing model**: Cost stays the same no matter how much your user base or scanning volume grows.


### How this scanning tool works
Our free online rMQR scanning software is capable of reading codes directly through your camera or on imported images. This barcode scanner works in any browser, no app download or signup needed. Enjoy real-time camera view scanning or decode barcodes on pictures in seconds – just point your camera at the rMQR or import an image file to instantly access the encoded data.
This tool is powered by the [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/)!
* * *
(We don’t store any images or data you import. Everything stays on your device.)
## Understanding rMQR codes
### What is an rMQR code?
The Rectangular Micro QR Code (rMQR) is a two dimensional code developed by Denso Wave and standardized as ISO/IEC 23941 in 2022. This extension of the Micro QR code family offers similar functionality, but in a rectangular format optimized for narrow spaces and curved surfaces such as test tubes.

A rMQR can store several data types, including numeric and alphabetic characters, kanji, and binary data. Thanks to Reed-Solomon error correction, these codes maintain data integrity even when partially damaged. Depending on the selected error correction level (M or H), 15% to 30% of data can be recovered.
### Structure and components
The rMQR Code is a rectangular variant of Micro QRs and conventional QR Codes. Its structure consists of several key components:
- **Data region**: The area where the information is encoded. It consists of black and white modules representing binary data (1s and 0s).
- **Finder patterns**: A main bullseye pattern in the top left corner and a smaller sub-pattern in the bottom right help scanners locate and orient the code.
- **Corner patterns**: Patterns located in the top-right and bottom-left corners, up to 3×3 modules in size. They may be smaller or absent in some versions.
- **Timing patterns**: Alternating black and white modules along the edges that determine symbol version, density, and ensure proper scanning alignment.
- **Alignment patterns**: Smaller square patterns throughout the code that correct for distortion when scanning curved surfaces or at angles. The number of alignment patterns increases with the code’s size to maintain readability.
- **Quiet zone**: A margin of at least two modules wide helps scanners detect its boundaries.
- **Format information**: Provides details about the structure of the symbol and its error correction level.

Rectangular Micro QR Codes come in 32 versions, each with a different combination of height and width. The sizes range from a minimum of 7×43 (narrow) or 11×27 (compact) to a maximum of 17×139 modules.
They can encode up to 361 numeric characters, 219 alphanumeric characters, 92 kanji characters, or 150 bytes of data.
### Applications of rMQR codes
**Medical and pharmaceutical industries**
These barcodes are ideal for marking test tubes, vials, and other cylindrical or curved surfaces where conventional QR codes may not fit.
**Manufacturing**
They can be applied to narrow or irregularly shaped parts and components for product tracking, quality control, and inventory management.
### Advantages of rMQR codes
- **Compact size**: They store up to 361 numeric or 219 alphanumeric characters in a compact, rectangular format. Their rectangular shape is specifically designed for narrow spaces, allowing to store large amounts of data in space-constrained environments.
- **Error correction**: Two EC levels support up to 30% code restoration.
- **Versatility**: There are 32 versions of rMQR Code with a variety of dimensions, from 7×43 or 11×27 to 17×139 modules.
### Why choose the Scanbot SDK for rMQR code scanning?
The Scanbot Barcode Scanner SDK is specifically designed to handle the challenges of decoding rMQR codes in real-world scenarios.
What sets us apart:
- **Exceptional performance**: Reliably decodes even damaged, low-contrast or distorted barcodes.
- **High-speed scanning**: Read rMQR codes in as little as 0.04 seconds.
- **Cross-platform compatibility**: Easily integrate with Android, iOS, cross-platform, web, Windows, and Linux platforms.
- **Customizable UI**: Customize the ready-to-use components to match your app or website design.
- **Privacy-first**: Operates offline for complete data security.
Whether your use case involves rMQR codes, UPC codes or [any other barcode](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/), the Scanbot SDK delivers the accuracy, speed, and reliability you need to succeed.
* * *
## Related Barcode Types:
- [Data Matrix Scanner](https://scanbot.io/barcode-scanner-sdk/data-matrix/)
- [QR Code Scanner](https://scanbot.io/qr-code-scanner-online/)
- [PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/pdf417/)
- [Aztec Code Scanner](https://scanbot.io/barcode-scanner-sdk/aztec-code/)
- [Code 128 Scanner](https://scanbot.io/barcode-scanner-sdk/code-128/)
- [Data Matrix Scanner](https://scanbot.io/barcode-scanner-sdk/data-matrix/)
- [QR Code Scanner](https://scanbot.io/qr-code-scanner-online/)
- [PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/pdf417/)
- [Aztec Code Scanner](https://scanbot.io/barcode-scanner-sdk/aztec-code/)
- [Code 128 Scanner](https://scanbot.io/barcode-scanner-sdk/code-128/)
- [Code 39 Scanner](https://scanbot.io/barcode-scanner-sdk/code-39/)
- [EAN Scanner](https://scanbot.io/barcode-scanner-sdk/ean/)
- [UPC Scanner](https://scanbot.io/barcode-scanner-sdk/upc/)
- [Micro QR Code Scanner](https://scanbot.io/barcode-scanner-sdk/micro-qr-code/)
- [GS1 DataBar Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-databar/)
- [GS1 DataMatrix Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-data-matrix/)
- [GS1-128 Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-128/)
- [MaxiCode Scanner](https://scanbot.io/barcode-scanner-sdk/maxicode/)
- [ITF Scanner](https://scanbot.io/barcode-scanner-sdk/itf-code/)
- [Codabar Scanner](https://scanbot.io/barcode-scanner-sdk/codabar/)
- [Intelligent Mail Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/intelligent-mail-barcode/)
- [Royal Mail Scanner](https://scanbot.io/barcode-scanner-sdk/royal-mail/)
- [Micro PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/micro-pdf417/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### **Where are rMQRs used?**
Rectangular Micro QR Codes are commonly used in healthcare industries for labeling medical vials, test tubes, and other specimen containers. This ensures accurate tracking and traceability throughout medical processes.
### **What is the difference between a Micro QR and an rMQR?**
Both are variants of the standard QR code, but they have some key differences. RMQR is rectangular in shape and has higher data capacity. Micro QR codes come in 4 versions, while rMQR has 32 versions. On the other hand, rMQR offers only two levels of error correction, while Micro QR offers four.
### **How can Scanbot SDK help you with rMQR Code scanning?**
The Scanbot rMQR Code scanner delivers exceptional performance in challenging environments, including damaged or curved barcodes, with a scanning speed of under 0.04 seconds for seamless workflows. Customize the ready-to-use components to match your app or website design. Try it now with a [free trial license](https://scanbot.io/trial/).
+
## Intelligent Mail Barcode Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanner-sdk/intelligent-mail-barcode/#main)
# USPS Intelligent Mail Barcode Scanner
Add Intelligent Mail barcode scanning to your mobile application or website
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

## Turn smartphones into fast & reliable Intelligent Mail barcode readers
The Scanbot USPS Intelligent Mail Barcode Reader SDK ensures outstanding performance, even in demanding scenarios – such as scanning damaged barcodes or codes printed on curved or reflective surfaces often encountered in logistics environments. With a scanning speed of under 0.04 seconds, your users get instant reads for seamless workflows.
Key benefits include:
- **Offline scanning**: The Scanbot SDK works 100% on-device, ensuring both uninterrupted performance and data security.
- **Enterprise-grade support**: Get dedicated chat support via Slack, Teams or email for any issue. Includes free assistance during the integration phase.
- **Flat pricing model**: Cost stays the same no matter how much your user base or scanning volume grows.


### How this scanning tool works
Our free online Intelligent Mail barcode decoder software reads codes directly through your camera or on imported images. This barcode scanner works in any browser, no app download or signup needed. Enjoy real-time camera view scanning or decode barcodes on pictures in seconds – just point your camera at the Intelligent Mail code or import an image file to instantly access the encoded data.
This tool is powered by the [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/)!
* * *
(We don’t store any images or data you import. Everything stays on your device.)
## Understanding Intelligent Mail barcodes
### What is an Intelligent Mail barcode (IMb)?
The Intelligent Mail barcode, or IMb, is a one-dimensional (1D) barcode symbology used by the United States Postal Service (USPS) for sorting and tracking letters and flats. It replaced the older POSTNET and PLANET codes with a single, higher-capacity barcode that contains both routing and tracking information.

USPS Intelligent Mail barcodes usually cannot be scanned with traditional barcode scanners. This is due to a combination of two factors: Firstly, IMb is a height-modulated barcode, whereas most 1D barcode scanners are designed to read data encoded in the bars’ widths. Secondly, traditional barcode scanners cannot parse USPS’ specialized encoding system.
### Structure and components
The IMb is a 65-bar height-modulated barcode. It encodes up to 31 digits of numeric data using four distinct symbols:
- Full bar: extends both above and below the middle
- Ascender: extends from the middle to the top
- Tracker: positioned in the middle
- Descender: extends from the middle to the bottom

The IMb contains two core pieces of information:
(1) a 20-digit **Tracking Code**, which itself includes:
- **Barcode Identifier** (ID): A 2-digit number identifying the specific service type.
- **Service Type Identifier** (STID): A 3-digit number that identifies the mail class, service type, and handling instructions.
- **Valid Mailer Identifier** (MID): A 6- or 9-digit number assigned to businesses and organizations. It identifies the sender in postal transactions, ensuring accurate tracking and billing. Both Mailer ID and IMb tracking codes are provided by USPS.
- **Serial number**: A 6- or 9-digit number (complementary to the MID length) that uniquely identifies each mailpiece.
(2) a **Routing Code**, which includes a 5- or 9-digit ZIP code, or an 11-digit delivery-point ZIP code. If the IMb is used for tracking only, this field can be omitted.
For some services and applications, the Tracking Code contains different data after the ID and STID. Reply mail tracking, for instance, uses a 15-digit customer number instead of the MID and serial number.
### Error detection
The Intelligent Mail Barcode uses an 11-bit Cyclic Redundancy Check (CRC) for error detection. This CRC is calculated from the binary representation of the barcode’s data and appended to the original message, creating a 114-bit payload. During a scan, the CRC is recalculated and compared to the appended CRC; if they don’t match, an error is detected, ensuring mail sorting accuracy.
### Applications of IMb
**Postal service**
USPS uses the IMb to sort and track mail pieces through the U.S. postal system, improving mail flow monitoring and visibility for both mailers and recipients. Letters and flats only qualify for discounted automation prices if they feature a valid IMb.
### Advantages of IMb
- **Compact size**: IMb encodes up to 31 digits in a 65-bar format, suitable for various mail pieces.
- **Error detection**: IMb uses a Cycle Redundancy Check (CRC) for error detection, preventing false readings even if the barcode experiences minor damage.
- **Enhanced tracking**: Mailers and USPS can monitor mail pieces throughout their journey.
- **Versatility in postal uses**: IMb was designed for USPS mail sorting and tracking systems, and enables participation in multiple postal programs with a single barcode.
### Why choose the Scanbot SDK for Intelligent Mail barcode scanning?
The Scanbot Barcode Scanner SDK is specifically designed to handle the challenges of decoding Intelligent Mail barcodes in real-world scenarios.
What sets us apart:
- **Exceptional performance**: Reliably decodes even damaged, low-contrast or distorted barcodes.
- **High-speed scanning**: Read Intelligent Mail barcodes in as little as 0.04 seconds.
- **Cross-platform compatibility**: Easily integrate with Android, iOS, cross-platform, web, Windows, and Linux platforms.
- **Customizable UI**: Customize the ready-to-use components to match your app or website design.
- **Privacy-first**: Operates offline for complete data security.
Whether your use case involves Intelligent Mail barcodes, QR codes or [any other barcode](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/), the Scanbot SDK delivers the accuracy, speed, and reliability you need to succeed.
* * *
## Related Barcode Types:
- [Data Matrix Scanner](https://scanbot.io/barcode-scanner-sdk/data-matrix/)
- [QR Code Scanner](https://scanbot.io/qr-code-scanner-online/)
- [PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/pdf417/)
- [Aztec Code Scanner](https://scanbot.io/barcode-scanner-sdk/aztec-code/)
- [Code 128 Scanner](https://scanbot.io/barcode-scanner-sdk/code-128/)
- [Code 39 Scanner](https://scanbot.io/barcode-scanner-sdk/code-39/)
- [EAN Scanner](https://scanbot.io/barcode-scanner-sdk/ean/)
- [UPC Scanner](https://scanbot.io/barcode-scanner-sdk/upc/)
- [Micro QR Code Scanner](https://scanbot.io/barcode-scanner-sdk/micro-qr-code/)
- [GS1 DataBar Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-databar/)
- [GS1 DataMatrix Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-data-matrix/)
- [GS1-128 Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-128/)
- [MaxiCode Scanner](https://scanbot.io/barcode-scanner-sdk/maxicode/)
- [ITF Scanner](https://scanbot.io/barcode-scanner-sdk/itf-code/)
- [Codabar Scanner](https://scanbot.io/barcode-scanner-sdk/codabar/)
- [rMQR Code Scanner](https://scanbot.io/barcode-scanner-sdk/rmqr/)
- [Royal Mail Scanner](https://scanbot.io/barcode-scanner-sdk/royal-mail/)
- [Micro PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/micro-pdf417/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### How to scan an Intelligent Mail barcode?
Purpose-built barcode scanners or mobile applications with specialized IMb scanning capabilities (like those built with the Scanbot SDK) are required to successfully scan and decode IMb barcodes.
### Can you track an Intelligent Mail barcode?
Yes, you can track an Intelligent Mail barcode. The IMb system allows mailers to track individual mailpieces, providing information such as date, time, location, and sort operation as the mail is processed by the USPS.
### What are the benefits of Intelligent Mail Barcode?
The IMb offers high data capacity, error detection, and seamless integration with USPS systems. It enables greater mail stream visibility and allows users to participate in multiple postal service programs with a single barcode, earning it the nickname "one-code solution."
### How can Scanbot SDK help you with Intelligent Mail barcode scanning?
The Scanbot Intelligent Mail Barcode Scanner SDK delivers exceptional performance in challenging environments, including damaged or curved barcodes, with a scanning speed of under 0.04 seconds for seamless workflows. Try it now with a [free trial license](https://scanbot.io/trial/).
+
## MaxiCode Scanner SDK
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanner-sdk/maxicode/#main)
# MaxiCode Reader
Add MaxiCode scanning to your mobile application or website
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

## Turn smartphones into fast & reliable MaxiCode scanners
The Scanbot MaxiCode Scanner SDK delivers exceptional performance, easily reading codes even when damaged or at an angle. With a scanning speed of under 0.04 seconds, your users get instant reads for seamless workflows.
Key benefits include:
- **Offline scanning**: The Scanbot SDK works 100% on-device, ensuring both uninterrupted performance and data security.
- **Enterprise-grade support**: Get dedicated chat support via Slack, Teams or email for any issue. Includes free assistance during the integration phase.
- **Flat pricing model**: Cost stays the same no matter how much your user base or scanning volume grows.


### How this scanning tool works
Our free online MaxiCode reader scans codes directly through your camera or on imported images. This barcode reader works in any browser, no app download or signup needed. Enjoy real-time camera view scanning or decode barcodes on pictures in seconds – just point your tablet, laptop, or mobile phone camera at the MaxiCode or import an image file to instantly access the encoded data.
This tool is powered by the [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/)!
* * *
(We don’t store any images or data you import. Everything stays on your device.)
## Understanding MaxiCodes
### What is a MaxiCode barcode?
The MaxiCode is a two-dimensional (2D) barcode developed by United Parcel Service (UPS), primarily used for quick and accurate scanning of parcel information in logistics and shipping. It features a unique hexagonal grid pattern with a central circular bullseye, enabling efficient scanning from any angle.
MaxiCode can encode up to 93 alphanumeric characters or 138 numeric characters, and generally stores shipping information like postal codes, tracking numbers, and service class codes.
It employs the Reed-Solomon error correction algorithm, enabling scanners to detect and correct symbol errors and burst errors, ensuring reliable data recovery even if part of the barcode is damaged.
This design makes MaxiCode particularly well-suited for high-speed environments, especially rapid package sorting and tracking.
### Structure and components
MaxiCode symbols nominally have a fixed size of 1.11 x 1.054 inches (28.14 x 26.91 mm), including quiet zones. They consist of the following key elements:
- **Central finder pattern**: The distinctive bullseye consists of three concentric black circles that allow scanners to recognize and align the symbol.
- **Data regions**: A grid of 33 alternating rows, each consisting of 29 or 30 hexagonal modules that contain the encoded data.
- **Orientation pattern**: Six fixed patterns surrounding the bullseye that help scanners determine the symbol’s orientation.
- **Quiet zone**: Blank areas around the MaxiCode that ensure proper scanning and readability.

### Encoding
MaxiCode uses different code sets for data encoding:
- Code set A: Uppercase letters, numbers, and 15 common punctuation marks.
- Code set B: Lowercase letters and other punctuation marks.
- Code set C: Multilingual uppercase letters and special graphic characters.
- Code set D: Multilingual lowercase letters and special graphic characters.
- Code set E: ASCII characters 0–31, 149–160, 162–167, 169, 173–174, and 182.
### MaxiCode messages and data modes
The information in MaxiCode barcodes is split into two messages, primary and secondary. MaxiCode barcodes also support several data modes, each with a specific purpose and data structure.
For logistics uses, the MaxiCode contains a Structured Carrier Message (SCM), which is laid out as follows:
- **Primary message** (mandatory): Encodes a postal code, a 3-digit country code (standardized in ISO 3166), and a 3-digit service class number assigned by the carrier.
- **Secondary message** (optional): Stores additional address data and other relevant information.
MaxiCodes can also hold general-purpose data, in which case the primary and the secondary messages are simply joined together. Here are the available modes:
| | | |
| --- | --- | --- |
| **Mode** | **Data structure** | **Purpose** |
| Mode 2 | Structured Carrier Message with numeric postal code (up to 9 digits) | UPS domestic shipping (typically US destinations) |
| Mode 3 | Structured Carrier Message with alphanumeric postal code (up to 6 characters) | Global shipping |
| Mode 4 | General data | Encoding general information, without mandatory data fields. |
| Mode 5 | General data | Encoding general information using full enhanced error correction for primary and secondary messages. |
| Mode 6 | Programming instructions | Programming hardware devices, especially barcode readers. |
Note: Mode 0 and Mode 1 are obsolete.
### Error correction
MaxiCode uses Reed-Solomon error correction with two levels:
- Standard Error Correction (SEC)
- Enhanced Error Correction (EEC)
The primary message always uses EEC in all modes. The secondary message uses SEC except in Mode 5, which offers the best overall error protection by using EEC for both messages, at the cost of capacity.
### Applications of MaxiCode barcodes
**Logistics and shipping**
MaxiCode barcodes are extensively utilized by courier services like UPS and DHL for routing, managing, and tracking domestic and international packages. They encode detailed shipment information, enabling real-time tracking and high-speed sorting. UPS itself uses Mode 2 for domestic and Mode 3 for international shipments.
**Retail**
In retail environments, MaxiCodes help manage stock levels and monitor product movement across supply chains, facilitating accurate inventory control and timely replenishment.
**Manufacturing**
MaxiCodes are used to track products and parts throughout production processes, enhancing operational efficiency and quality control.
### Advantages of MaxiCode barcodes
- **Compact**: They store up to 93 alphanumeric characters or 138 numeric characters in a shape suitable for various packaging types.
- **Error correction**: MaxiCode uses Reed-Solomon error correction to accurately retrieve data even if the barcode is partially damaged or obscured.
- **Structured messaging**: The primary message (postal code, country code, and service class) can be read reliably at very high speeds for sorting and routing. The secondary message (any additional shipment details) does not need to be decoded unless necessary).
- **Omnidirectional scanning**: The hexagonal grid design with orientation patterns enables scanning from any angle.
### Why choose the Scanbot SDK for MaxiCode barcode scanning?
The Scanbot Barcode Scanner SDK is specifically designed to handle the challenges of decoding MaxiCode barcodes in real-world scenarios.
What sets us apart:
- **Exceptional performance**: Reliably decodes even damaged, low-contrast or distorted barcodes.
- **High-speed scanning**: Read MaxiCodes in as little as 0.04 seconds.
- **Cross-platform compatibility**: Easily integrate with Android, iOS, cross-platform, web, Windows, and Linux platforms.
- **Customizable UI**: Customize the ready-to-use components to match your app or website design.
- **Privacy-first**: Operates offline for complete data security.
Whether your use case involves MaxiCode codes, QR codes or [any other barcode](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/), the Scanbot SDK delivers the accuracy, speed, and reliability you need to succeed.
* * *
## Related Barcode Types:
- [Data Matrix Scanner](https://scanbot.io/barcode-scanner-sdk/data-matrix/)
- [QR Code Scanner](https://scanbot.io/qr-code-scanner-online/)
- [PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/pdf417/)
- [Aztec Code Scanner](https://scanbot.io/barcode-scanner-sdk/aztec-code/)
- [Code 128 Scanner](https://scanbot.io/barcode-scanner-sdk/code-128/)
- [Code 39 Scanner](https://scanbot.io/barcode-scanner-sdk/code-39/)
- [EAN Scanner](https://scanbot.io/barcode-scanner-sdk/ean/)
- [UPC Scanner](https://scanbot.io/barcode-scanner-sdk/upc/)
- [Micro QR Code Scanner](https://scanbot.io/barcode-scanner-sdk/micro-qr-code/)
- [GS1 DataBar Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-databar/)
- [GS1 DataMatrix Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-data-matrix/)
- [GS1-128 Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-128/)
- [ITF Scanner](https://scanbot.io/barcode-scanner-sdk/itf-code/)
- [Codabar Scanner](https://scanbot.io/barcode-scanner-sdk/codabar/)
- [Intelligent Mail Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/intelligent-mail-barcode/)
- [rMQR Code Scanner](https://scanbot.io/barcode-scanner-sdk/rmqr/)
- [Royal Mail Scanner](https://scanbot.io/barcode-scanner-sdk/royal-mail/)
- [Micro PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/micro-pdf417/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### What is a MaxiCode barcode?
A MaxiCode is a two-dimensional barcode developed by United Parcel Service (UPS) featuring a hexagonal grid with a central bullseye. It encodes up to 93 characters and uses error correction for reliable data recovery even when damaged.
### Where are MaxiCodes used?
MaxiCodes are primarily used in logistics on shipping labels for tracking packages. They are also utilized in retail for inventory management and in manufacturing to track products and parts during production.
### How can Scanbot SDK help you with MaxiCode barcode scanning?
The Scanbot MaxiCode barcode reader delivers exceptional performance in challenging environments, including damaged or curved barcodes, with a scanning speed of under 0.04 seconds for seamless workflows. Try it now with a [free trial license](https://scanbot.io/trial/).
+
## Micro QR Code Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanner-sdk/micro-qr-code/#main)
# Micro QR Code Scanner
Add Micro QR Code scanning to your mobile application or website
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

## Turn smartphones into fast & reliable Micro QR Code scanners
The Scanbot Micro QR Code Scanner SDK delivers exceptional performance even under challenging conditions – such as damage or when scanning extremely compact codes commonly found in space-constrained applications. With its ability to read codes as small as 11×11 modules, your users get instant reads for seamless workflows on any smart device.
Key benefits include:
- **Offline scanning**: The Scanbot SDK works 100% on-device, ensuring both uninterrupted performance and data security.
- **Enterprise-grade support**: Get dedicated chat support via Slack, Teams or email for any issue. Includes free assistance during the integration phase.
- **Flat pricing model**: Cost stays the same no matter how much your user base or scanning volume grows.


### How this scanning tool works
Our free online Micro QR Code reader scans codes directly through your camera or on imported images. This barcode scanner works in any browser, no app download or signup needed. Enjoy real-time camera view scanning or decode barcodes on pictures in seconds – just point your camera at the Micro QR Code or import an image file to instantly access the encoded data.
This tool is powered by the [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/)!
* * *
(We don’t store any images or data you import. Everything stays on your device.)
## Understanding Micro QR Codes
### What is a Micro QR Code?
The Micro QR Code is a smaller version of the traditional QR Code, standardized in 2004 under Japanese Industrial Standards (JIS-X-0510). It achieves its smaller footprint by using only one position detection pattern instead of three and requiring just a two-module-wide quiet zone.
There are four sizes of Micro QR Codes. The data density is high: The smallest – at only 11×11 modules – can still store 5 numeric digits. The largest, at 17×17 modules, can store up to 35 numeric or 21 alphanumeric characters and can encode kanji characters and binary data besides alphanumeric data (see table below).
### Structure and components
Micro QR Codes are compact variants of standard QR Codes, designed to encode essential information in a smaller space. Their structure consists of four main components:
- **Data modules**: These are small squares that form the data area of the Micro QR Code. They encode information as binary data, with black modules representing 1 and white modules representing 0.
- **Finder pattern**: This is a single square bull’s eye in one corner of the code, allowing for quick and accurate scanning at any angle.
- **Timing pattern**: They have one row and one column of alternating black and white modules. This pattern helps determine the symbol version, alignment, and orientation, ensuring proper grid synchronization during scanning.
- **Quiet zone**: This is a margin around the code, typically two modules wide for Micro QR Codes (regular QR codes require four). It helps scanners identify the code’s boundaries.

Micro QR Codes come in four versions, three of which provide error correction (EC):
| | | | | | |
| --- | --- | --- | --- | --- | --- |
| **Version** | **Size** | **EC levels available** | **Max. numeric** | **Max. alphanumeric** | **Max. bytes** |
| M1 | 11×11 | None (only error detection) | 5 | – | – |
| M2 | 13×13 | L | 10 | 6 | – |
| M3 | 15×15 | L, M | 23 | 14 | 9 |
| M4 | 17×17 | L, M, Q | 35 | 21 | 15 |
### Error correction
Micro QR codes use Reed-Solomon error correction to restore data when parts of the code are damaged or obscured. The following three levels are supported:
- Level L (Low): Restores up to 7% code damage.
- Level M (Medium): Restores up to 15% code damage.
- Level Q (Quartile): Restores up to 25% code damage.
Higher error correction levels reduce the data capacity of the Micro QR. As shown in the table above, M1 Micro QR Codes only support error detection, not correction.
### Applications of Micro QR Codes
**Small electronic components**
Micro QR Codes are often used on circuit board components for tracking information and serial numbers, as well as for access to information like manufacturing details or usage instructions.
**Product tags**
In retail, they help manage inventory for small items like jewelry or electronics accessories. Placed on product tags, they allow quick lookup of product details, stock levels, and pricing information.
**Healthcare**
Healthcare facilities utilize them on patient wristbands, medical devices, and laboratory samples to provide access to critical patient information and test results.
**Security and authentication**
Micro QR Codes are often employed on ID cards, access passes, and security tags to store encrypted information such as employee details or access permissions.
### Advantages of Micro QR Codes
- **Compact size**: They contain less information than the normal QR Code. However, Micro QR Codes still have sufficient capacity to store SKU codes, and even URLs in the larger versions.
- **Error correction**: Advanced error correction mechanisms (from L to Q levels) allow them to remain readable even if partially damaged or obscured.
- **Versatility**: Micro QR Codes encode numeric data and alphanumeric data, allowing them to meet the specific data capacity needs of space-constrained applications.
- **Omnidirectional reading**: They can be scanned from any angle.
### Why choose the Scanbot SDK for Micro QR Code scanning?
The Scanbot Barcode Scanner SDK is specifically designed to handle the challenges of decoding Micro QR Codes in real-world scenarios.
What sets us apart:
- **Exceptional performance**: Reliably decodes even damaged, low-contrast or distorted barcodes.
- **High-speed scanning**: Read Micro QR codes in as little as 0.04 seconds.
- **Cross-platform compatibility**: Easily integrate with Android, iOS, cross-platform, web, Windows, and Linux platforms.
- **Customizable UI**: Customize the ready-to-use components to match your app or website design.
- **Privacy-first**: Operates offline for complete data security.
Whether your use case involves Micro QR Codes, UPCs or [any other barcode](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/), the Scanbot SDK delivers the accuracy, speed, and reliability you need to succeed.
* * *
## Related Barcode Types:
- [Data Matrix Scanner](https://scanbot.io/barcode-scanner-sdk/data-matrix/)
- [QR Code Scanner](https://scanbot.io/qr-code-scanner-online/)
- [PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/pdf417/)
- [Aztec Code Scanner](https://scanbot.io/barcode-scanner-sdk/aztec-code/)
- [Code 128 Scanner](https://scanbot.io/barcode-scanner-sdk/code-128/)
- [Code 39 Scanner](https://scanbot.io/barcode-scanner-sdk/code-39/)
- [EAN Scanner](https://scanbot.io/barcode-scanner-sdk/ean/)
- [UPC Scanner](https://scanbot.io/barcode-scanner-sdk/upc/)
- [GS1 DataBar Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-databar/)
- [GS1 DataMatrix Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-data-matrix/)
- [GS1-128 Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-128/)
- [MaxiCode Scanner](https://scanbot.io/barcode-scanner-sdk/maxicode/)
- [ITF Scanner](https://scanbot.io/barcode-scanner-sdk/itf-code/)
- [Codabar Scanner](https://scanbot.io/barcode-scanner-sdk/codabar/)
- [Intelligent Mail Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/intelligent-mail-barcode/)
- [rMQR Code Scanner](https://scanbot.io/barcode-scanner-sdk/rmqr/)
- [Royal Mail Scanner](https://scanbot.io/barcode-scanner-sdk/royal-mail/)
- [Micro PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/micro-pdf417/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### What is the difference between a QR Code and a Micro QR Code?
Even though they are a variant of regular QR Codes, the two types differ in several aspects. Micro QR Codes are, as the name suggests, smaller in design and structure. Instead of three, they have only one position detection pattern and a significantly reduced data capacity compared to QR Codes of 15 bytes of binary data to 2,953 bytes of binary data. Ultimately, they are used for cases where space is limited and only minimal information needs to be encoded.
### How could Scanbot SDK help you with Micro QR Code scanning?
The Scanbot SDK supports Micro QR Codes and delivers exceptional performance in challenging environments, including damaged or curved barcodes, with a scanning speed of under 0.04 seconds for seamless workflows. Try it now with a [free trial license](https://scanbot.io/trial/).
+
## Aztec Code Reader
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanner-sdk/aztec-code/#main)
# Aztec Code Reader
Add an Aztec code reader to your mobile application or website
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

## Turn smartphones into fast & reliable Aztec code scanners
The Scanbot Aztec Code Reader delivers exceptional performance even under challenging conditions – such as code damage, low contrast, or small symbol sizes. With a scanning speed of under 0.04 seconds, your users can read barcodes instantly for seamless workflows.
Key benefits include:
- **Offline scanning**: The Scanbot SDK works 100% on-device, ensuring both uninterrupted performance and data security.
- **Enterprise-grade support**: Get dedicated chat support via Slack, Teams or email for any issue. Includes free assistance during the integration phase.
- **Flat pricing model**: Cost stays the same no matter how much your user base or scanning volume grows.


### How this scanning tool works
Our free online Aztec code reader scans codes directly through your camera or on imported images. This barcode scanner works in any browser, no app download or signup needed. Enjoy real-time camera view scanning or decode barcodes on pictures in seconds – just point your mobile device at the Aztec code or import an image file to instantly access the encoded data.
This tool is powered by the [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/)!
* * *
(We don’t store any images or data you import. Everything stays on your device.)
## Understanding Aztec codes
### What is an Aztec code?
The Aztec code is a two-dimensional (2D) barcode named for its unique central pattern, which resembles an Aztec pyramid viewed from above. They were invented by Andrew Longacre Jr. and Robert Hussey in 1995, and are standardized in ISO/IEC 24778.
Aztec barcodes support any ASCII character and can have up to 32 data layers. They come in three different types:
| | | | | |
| --- | --- | --- | --- | --- |
| **Type** | **Matrix size** | **Text capacity** | **Numeric capacity** | **Binary capacity** |
| Aztec Rune | 11×11 | N/A | 3 digits (0-225) | 1 byte |
| Compact Aztec | 15×15 to 27×27 | 89 characters | 110 digits | 53 bytes |
| Full Aztec | 19×19 to 151×151 | 3,067 characters | 3,832 digits | 1,914 bytes |
Aztec codes do not require a quiet zone, making them more space-efficient than some other two-dimensional barcodes. Additionally, they can be read in any direction and even when mirrored, because of the orientation marks on the central target design.
### Structure and components
A full Aztec code consists of the following components:
- **Finder pattern**: A central bulls-eye pattern (9×9 or 13×13 modules) that helps locate the symbol
- **Orientation pattern**: Corner markers that determine the code’s orientation (even if rotated or mirrored).
- **Mode message**: This encodes information about the number of layers and data codewords. It is located in the same layer as the orientation pattern.
- **Reference grid**: This grid helps barcode readers maintain alignment over large symbols. It consists of alternating black and white pixels in every 16th row and column.
- **Data layers**: Up to 32 layers storing encoded information and check characters. They are read clockwise, starting next to the first orientation pattern.

**Special symbols**
Aztec barcodes support special symbols like FNC1 and ECI to enhance their functionality:
- FNC1 indicates an application identifier, like that used by GS1 barcode standards and commonly seen in product barcodes. It is encoded as “\\f” in the data.
- ECI (Extended Channel Interpretation) specifies the character set to be used, such as UTF-8 or ISO 8859-1, and is encoded as “\\e\[number\]”.
### Error detection and correction
Aztec codes use Reed-Solomon error correction to generate check codewords. The number of check codewords depends on the symbol size and capacity as well as on the desired error correction level. This is highly customizable, ranging from 5% to 95%. Aztec barcode generators usually default to 23% error correction plus three additional check codewords.
The size of the Reed-Solomon codewords themselves varies from 6 to 12 bits, depending on the number of layers in the Aztec barcode.
### Applications of Aztec codes
**Transportation**
Aztec barcodes are widely used in electronic ticketing in air and rail travel because of their accuracy and compactness. They are the International Union of Railways (UIC) standard for railway ticketing, and are used by companies such as Lufthansa and Deutsche Bahn.
**Healthcare**
In the healthcare sector, Aztec codes ensure accurate identification on patient wristbands and medical devices.
**Supply chain and logistics**
Switching from linear barcodes to Aztec codes streamlines inventory tracking and supply chain operations. Their scalability and reliability make them attractive to government agencies and private companies alike.
**Digital identity**
Aztec barcodes are increasingly used for secure digital identity verification due to their high capacity, advanced error correction, and small footprint on printed materials.
### Advantages of Aztec codes
- **Compact size**: Store large amounts of information in little space. No quiet zone is required.
- **High fault tolerance**: Built-in error correction ensures readability even if the code is damaged or distorted.
- **High density**: Aztec code barcodes are approximately 30 times smaller than Code 39 symbols encoding the same information.
- **Versatility**: Encodes numeric, alphanumeric, and binary data, making it adaptable to diverse use cases.
- **Ease of scanning**: Scannable in any orientation – even mirrored – on various surfaces and materials.
### Why choose the Scanbot SDK for Aztec code scanning?
The Scanbot Barcode Reader SDK is designed to handle the unique challenges of scanning Aztec barcodes in real-world conditions.
What sets us apart:
- **Exceptional performance**: Reliably decodes even damaged or dense Aztec codes and other matrix barcodes.
- **High-speed scanning**: Reads Aztec code barcodes in as little as 0.04 seconds.
- **Cross-platform compatibility**: Easily integrate with Android, iOS, cross-platform, web, Windows, and Linux platforms.
- **Customizable UI**: Customize the ready-to-use components to match your app or website design.
- **Privacy-first**: Operates offline for complete data security.
Whether your use case involves Aztec barcodes, QR codes, or [any other barcode](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/), the Scanbot SDK delivers the accuracy, speed, and reliability you need to succeed.
* * *
## Related Barcode Types:
- [Data Matrix Scanner](https://scanbot.io/barcode-scanner-sdk/data-matrix/)
- [QR Code Scanner](https://scanbot.io/qr-code-scanner-online/)
- [PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/pdf417/)
- [Code 128 Scanner](https://scanbot.io/barcode-scanner-sdk/code-128/)
- [Code 39 Scanner](https://scanbot.io/barcode-scanner-sdk/code-39/)
- [EAN Scanner](https://scanbot.io/barcode-scanner-sdk/ean/)
- [UPC Scanner](https://scanbot.io/barcode-scanner-sdk/upc/)
- [Micro QR Code Scanner](https://scanbot.io/barcode-scanner-sdk/micro-qr-code/)
- [GS1 DataBar Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-databar/)
- [GS1 DataMatrix Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-data-matrix/)
- [GS1-128 Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-128/)
- [MaxiCode Scanner](https://scanbot.io/barcode-scanner-sdk/maxicode/)
- [ITF Scanner](https://scanbot.io/barcode-scanner-sdk/itf-code/)
- [Codabar Scanner](https://scanbot.io/barcode-scanner-sdk/codabar/)
- [Intelligent Mail Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/intelligent-mail-barcode/)
- [rMQR Code Scanner](https://scanbot.io/barcode-scanner-sdk/rmqr/)
- [Royal Mail Scanner](https://scanbot.io/barcode-scanner-sdk/royal-mail/)
- [Micro PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/micro-pdf417/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### **What is the Aztec code encoding?**
Aztec code encoding converts data into a compact two-dimensional barcode using a series of square rings around a central bull's-eye pattern. It employs bit encoding, Reed-Solomon error correction, and a spiral arrangement of data.
### **What is the difference between a QR code and an Aztec code?**
Aztec code barcodes feature a distinctive pattern, allowing them to occupy less space than QR codes. They don’t require quiet zones, which further contributes to their smaller size. While QR codes can store significantly more data—up to 7,089 numeric or 4,296 alphanumeric characters—Aztec codes remain efficient for applications where size is a priority.
+
## Code 128 Barcode Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanner-sdk/code-128/#main)
# Code 128 Barcode Scanner
Add Code 128 barcode scanning to your mobile application or website
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

## Turn smartphones into fast & reliable Code 128 scanners
The Scanbot Code 128 Scanner delivers exceptional performance, enabling users to quickly decode barcodes in a small space or even scan damaged barcodes. With a scanning speed of under 0.04 seconds, your app users will benefit from seamless workflows.
Key benefits include:
- **Offline scanning**: The Scanbot SDK works 100% on-device, ensuring both uninterrupted performance and data security.
- **Enterprise-grade support**: Get dedicated chat support via Slack, Teams or email for any issue. Includes free assistance during the integration phase.
- **Flat pricing model**: Cost stays the same no matter how much your user base or scanning volume grows.


### How this scanning tool works
Our free online Code 128 barcode reader scans codes directly through your camera or on imported images. This barcode scanner works in any browser, no app download or signup needed. Enjoy real-time camera view scanning or decode barcodes on pictures in seconds – just point your camera at the Code 128 barcode or import an image file to instantly access the encoded data.
This tool is powered by the [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/)!
* * *
(We don’t store any images or data you import. Everything stays on your device.)
## Understanding Code 128 barcodes
### What is Code 128?
Code 128 is a one-dimensional barcode format that encodes all 128 standard ASCII symbols, including uppercase and lowercase letters, numeric digits, and special characters. It is standardized in ISO/IEC 15417 and features three character subsets (A, B, and C), each optimized for a specific data type.
Code 128 offers high density and flexibility. Each symbol can represent a large amount of information in a small space. It is ideal for logistics, warehousing, and other applications that require compact, variable-length barcodes.
GS1-128 barcodes combine the Code 128 symbology with GS1 application identifiers.
### Structure and components
Code 128 barcodes consist of the following key components:
1. **Quiet zones**: Blank areas on both sides of the barcode that ensure proper detection and readability.
2. **Start character**: A unique 11-module pattern (3 bars and 3 spaces) that indicates which character set (A, B, or C) will be initially used.
3. **Data characters**: The main content section where information is encoded. Each character consists of 11 modules (3 bars and 3 spaces). Code 128 encodes all 128 ASCII characters and switches between sets A, B, and C for optimal efficiency.
4. **Check character**: A mandatory verification element calculated using a weighted modulo-103 checksum. It ensures data integrity by providing error detection.
5. **Stop character**: A distinct 13-module pattern (4 bars and 3 spaces) that marks the barcode’s end.

Despite its name, it doesn’t contain 128 distinct symbols – instead, it achieves full ASCII coverage by switching between sets A and B, while set C specializes in encoding digit strings efficiently. Code 128 in fact consists of 108 symbols (103 data symbols, 3 start symbols, and 2 stop symbols).
The table below shows which code set supports which characters (excluding the barcode’s function codes):
| | |
| --- | --- |
| **Character set** | **Character coverage** |
| Code Set A | ASCII 0-95: Digits (0-9), uppercase letters (A-Z), punctuation marks, seven special characters, and control codes. |
| Code set B | ASCII 32-127: Digits (0-9), upper- and lowercase letters (A-Z, a-z), punctuation marks, and seven special characters. |
| Code set C | Numeric pairs from 00 to 99, plus three special characters. Each character represents two digits. |
### Error detection
Code 128 provides error detection through a modulo 103 check digit, which is added before the stop symbol. Here’s how it works:
1. The scanner reads the encoded data and calculates a checksum.
2. This is compared with the check digit in the barcode.
3. If both check digits match, the data is considered valid.
4. If they don’t match, the scan is rejected as an error.
While Code 128 allows scanners to detect errors effectively, it does not have built-in error correction capabilities.
### Applications of Code 128 barcodes
**Logistics and shipping**
Code 128 barcodes are widely used for real-time package tracking and automated sorting in shipping operations across global supply chains.
**Inventory management**
Code 128 barcodes simplify inventory management by encoding comprehensive product data, including serial numbers, batch codes, and production dates.
**Manufacturing**
In production environments, Code 128 is used to ensure accurate component tracking and assembly verification while maintaining complete product traceability.
**Healthcare**
Healthcare facilities employ Code 128 for patient safety systems. The symbology allows precise tracking of medication, medical equipment, lab specimens, and patient records.
### Advantages of Code 128 barcodes
- **High data density**: Encodes large amounts of information in a compact format.
- **Full ASCII support**: Represents standard ASCII symbols, including uppercase, lowercase, and special characters.
- **Versatile encoding**: Efficiently handles numeric, alphanumeric, and control codes through its three subsets.
- **Simple printing**: Barcodes can be created using regular printers, rather than requiring specialized equipment, unlike older barcode formats which need thermal printers for reliable scanning.
### Why choose the Scanbot SDK for Code 128 barcode scanning?
The Scanbot Barcode Scanner SDK is tailored to decode Code 128 barcodes quickly and accurately, even in demanding scenarios.
What sets us apart:
- **Exceptional performance**: Reliably decodes even damaged, low-contrast or distorted barcodes.
- **High-speed scanning**: Reads Code 128 barcodes in as little as 0.04 seconds.
- **Cross-platform compatibility**: Easily integrate with Android, iOS, cross-platform, web, Windows, and Linux platforms.
- **Customizable UI**: Customize the ready-to-use components to match your app or website design.
- **Privacy-first**: Operates offline for complete data security.
Whether your use case involves Code 128, QR codes, or [any other barcode](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/), the Scanbot SDK delivers the accuracy, speed, and reliability you need to succeed.
* * *
## Related Barcode Types:
- [Data Matrix Scanner](https://scanbot.io/barcode-scanner-sdk/data-matrix/)
- [QR Code Scanner](https://scanbot.io/qr-code-scanner-online/)
- [PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/pdf417/)
- [Aztec Code Scanner](https://scanbot.io/barcode-scanner-sdk/aztec-code/)
- [Code 39 Scanner](https://scanbot.io/barcode-scanner-sdk/code-39/)
- [EAN Scanner](https://scanbot.io/barcode-scanner-sdk/ean/)
- [UPC Scanner](https://scanbot.io/barcode-scanner-sdk/upc/)
- [Micro QR Code Scanner](https://scanbot.io/barcode-scanner-sdk/micro-qr-code/)
- [GS1 DataBar Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-databar/)
- [GS1 DataMatrix Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-data-matrix/)
- [GS1-128 Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-128/)
- [MaxiCode Scanner](https://scanbot.io/barcode-scanner-sdk/maxicode/)
- [ITF Scanner](https://scanbot.io/barcode-scanner-sdk/itf-code/)
- [Codabar Scanner](https://scanbot.io/barcode-scanner-sdk/codabar/)
- [Intelligent Mail Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/intelligent-mail-barcode/)
- [rMQR Code Scanner](https://scanbot.io/barcode-scanner-sdk/rmqr/)
- [Royal Mail Scanner](https://scanbot.io/barcode-scanner-sdk/royal-mail/)
- [Micro PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/micro-pdf417/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### **What is the limitation of Code 128?**
Code 128 lacks error correction capabilities, meaning it may face readability issues when the code is obscured or damaged. Apart from that, it uses three different character sets, making encoding more complex.
### **Should I use Code 39 or Code 128?**
The choice depends on your needs. However, Code 128 is generally the better choice due to its higher data density, full ASCII support, and built-in error detection. Code 39 might be preferable in situations requiring extreme simplicity or compatibility with older systems that only support this format.
### **What is the difference between Code 128 and GS1-128?**
GS1-128 is a specialized variant of Code 128 that uses standardized Application Identifiers (AIs) to encode structured data according to GS1 standards. GS1-128 includes a Function Code 1 (FNC1) character at the start, allowing it to encode multiple pieces of information such as product identification, expiration dates, and batch numbers in a standardized format.
+
## PDF417 Barcode Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanner-sdk/pdf417/#main)
# PDF417 Barcode Scanner
Add PDF417 scanning to your mobile application or website
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

## Turn smartphones into fast & reliable PDF417 Barcode Reader
The Scanbot PDF417 Barcode Reader delivers exceptional performance even under challenging conditions—such as scanning faded or creased driver’s licenses carried in wallets, weather-damaged shipping labels on packages, or worn boarding passes printed on thermal paper. With a scan speed of just 0.04 seconds, your users get instant reads for seamless workflows.
Key benefits include:
- **Offline scanning**: The Scanbot SDK works 100% on-device, ensuring both uninterrupted performance and data security.
- **Enterprise-grade support**: Get dedicated chat support via Slack, Teams or email for any issue. Includes free assistance during the integration phase.
- **Flat pricing model**: Cost stays the same no matter how much your user base or scanning volume grows.


### How this scanning tool works
Our free online barcode reader scans PDF417 codes directly through your mobile device’s camera or on imported images. This barcode scanner works in any browser, no app download or signup needed. Enjoy real-time camera view scanning or decode barcodes on pictures in seconds – just point your camera at the PDF417 barcode or import an image file to instantly access the data encoded.
This tool is powered by the [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/)!
* * *
(We don’t store any images or data you import. Everything stays on your device.)
## Understanding PDF417 codes
### What is a PDF417 code?
PDF417 is a two-dimensional (2D) stacked barcode standardized in ISO/IEC 15438. “PDF” stands for “Portable Data File,” reflecting its high data capacity of up to 2,725 numeric or 1,850 alphanumeric characters. These barcodes combine multiple rows of linear codes with built-in error correction, making them ideal for applications requiring reliable data storage in a compact format.
### Structure and components
A PDF417 code consists of multiple linear barcodes stacked on top of each other, creating a 2D symbol. Each row in a PDF417 symbol contains the same structural elements:
- **Start pattern**: A distinctive pattern (one wide bar followed by three thin bars) signaling the beginning of the barcode.
- **Stop pattern**: This pattern marks the end of the barcode. Start and stop patterns tell scanners where the data codewords begin and end, but don’t encode data themselves.
- **Left and right row indicators**: These too serve as structural components, and don’t store any actual data like text or numbers. Instead, they contain metadata such as row count and level of error correction.
- **Data codewords**: This section stores the actual encoded information. Each row can hold up to 30 data codewords.

Each data codeword in a PDF417 barcode consists of four bars and four spaces, and has a total width of 17 modules (hence “417”). The width of the bars and spaces themselves ranges from 1 to 6 modules. Every codeword begins with a bar and ends with a space.
For example, in the image below:
- The first bar is 2 modules wide.
- The second bar is 1 module wide.
- The third bar is 2 modules wide.
- The fourth bar is 3 modules wide.

The codeword patterns translate to 929 unique values, numbered from 0 to 928. These values can represent various data types, including text, numbers, and binary information.
PDF417 codes consist of rows and columns. The barcode can contain 3 to 90 rows, with each row functioning as a narrow linear barcode. The size of the PDF417 depends both on how much data is encoded and on the error correction level.

### Error correction
PDF417 employs the Reed-Solomon algorithm with nine available security levels (0–8). The error correction level determines how many codewords are reserved for error correction (EC), ranging from 2 to 512. Higher levels provide greater protection but reduce data capacity.
| | | |
| --- | --- | --- |
| **EC level** | **EC codewords generated** | **AIM recommendation** |
| 0 | 2 | Not recommended |
| 1 | 4 | Not recommended |
| 2 | 6 | Minimum for 1–40 data codewords |
| 3 | 8 | Minimum for 41–160 data codewords |
| 4 | 16 | Minimum for 161–320 data codewords |
| 5 | 32 | Minimum for 321–863 data codewords |
| 6 | 64 | For higher security |
| 7 | 128 | For higher security |
| 8 | 512 | Maximum level |
### Applications of PDF417 codes
**Government and identity documents**
PDF417 barcodes are the standard for encoding data on U.S. driver’s licenses and other state-issued identification cards. They were chosen for their compact format and high error tolerance.
**Ticketing and travel**
PDF417 barcodes are widely used for boarding passes, tickets, and visas. For airline boarding passes, an error correction level of 2–5 is recommended.
**Logistics and transportation**
In logistics, PDF417 barcodes streamline package labeling and tracking, ensuring efficient inventory management and shipment tracking. They are preferred for their high data density, storing comprehensive shipping information in a compact format.
**Healthcare**
PDF417 barcodes are commonly used for patient identification, medical records, and pharmaceutical tracking to comply with stringent industry regulations. With error correction and encryption capabilities, they are suited to applications that require reliable, secure data handling.
### Advantages of PDF417 codes
- **High data capacity**: Store up to 2,725 numeric or 1,850 alphanumeric characters, ideal for complex data.
- **Adjustable size**: Customizable length and width make them suitable for various surfaces and applications.
- **Built-in error correction**: Robust Reed-Solomon error correction ensures data readability even when parts of the barcode are damaged.
- **Versatility**: Suitable for a wide range of industries and applications, from ID verification to postal tracking and logistics.
### Why choose the Scanbot SDK for PDF417 Code scanning?
The Scanbot [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) is specifically designed to handle the challenges of decoding PDF417 codes in real-world scenarios.
What sets us apart:
- **Exceptional performance**: Reliably decodes even damaged, low-contrast or distorted barcodes.
- **High-speed scanning**: Read PDF417 codes in as little as 0.04 seconds.
- **Cross-platform compatibility**: Easily integrate with Android, iOS, cross-platform, web, Windows, and Linux platforms.
- **Customizable UI**: Customize the ready-to-use components to match your app or website design.
- **Privacy-first**: Operates offline for complete data security.
Whether your use case involves PDF417 codes, QR codes, or [any other barcode](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/), the Scanbot SDK delivers the accuracy, speed, and reliability you need to succeed.
* * *
## Related Barcode Types
- [Data Matrix Scanner](https://scanbot.io/barcode-scanner-sdk/data-matrix/)
- [QR Code Scanner](https://scanbot.io/qr-code-scanner-online/)
- [Aztec Code Scanner](https://scanbot.io/barcode-scanner-sdk/aztec-code/)
- [Code 128 Scanner](https://scanbot.io/barcode-scanner-sdk/code-128/)
- [Code 39 Scanner](https://scanbot.io/barcode-scanner-sdk/code-39/)
- [EAN Scanner](https://scanbot.io/barcode-scanner-sdk/ean/)
- [UPC Scanner](https://scanbot.io/barcode-scanner-sdk/upc/)
- [Micro QR Code Scanner](https://scanbot.io/barcode-scanner-sdk/micro-qr-code/)
- [GS1 DataBar Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-databar/)
- [GS1 DataMatrix Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-data-matrix/)
- [GS1-128 Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-128/)
- [MaxiCode Scanner](https://scanbot.io/barcode-scanner-sdk/maxicode/)
- [ITF Scanner](https://scanbot.io/barcode-scanner-sdk/itf-code/)
- [Codabar Scanner](https://scanbot.io/barcode-scanner-sdk/codabar/)
- [Intelligent Mail Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/intelligent-mail-barcode/)
- [rMQR Code Scanner](https://scanbot.io/barcode-scanner-sdk/rmqr/)
- [Royal Mail Scanner](https://scanbot.io/barcode-scanner-sdk/royal-mail/)
- [Micro PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/micro-pdf417/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### **Where is a PDF417 barcode used?**
PDF417 is commonly used in IDs, [driver’s licenses](https://scanbot.io/blog/drivers-license-barcode-parser/), and airline boarding passes. They are also found on shipping labels, and in the healthcare sector for patient identification, due to their high data capacity and error correction.
### **How can Scanbot SDK help you with PDF417 scanning?**
The Scanbot SDK delivers exceptional performance in challenging environments, including damaged or curved barcodes, with a scanning speed of under 0.04 seconds for seamless workflows. Try it now with a [free trial license](https://scanbot.io/trial/).
+
## VIN Scanner SDK
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/data-capture-software/vin-scanner/#main)
# VIN Scanner SDK
Let users capture vehicle identification numbers (VINs) with their smartphone
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

rocket\_launchSolution
## Fast, accurate, and offline VIN scanning
With the Scanbot VIN Scanner SDK, you can instantly capture VINs directly from the truck or car door. Integrate our SDK into your mobile or web-based fleet management application to replace slow, error-prone manual VIN entry with fast, reliable automatic data extraction.
Our VIN scanning module works entirely offline, ensuring reliable scanning no matter how remote the location is. All data stays safely on your device. The Scanbot SDK also supports VIN barcode scanning.
checkAvailable for mobile and web development platforms

## Integrate this evening with your framework
## Scan and extract data from VINs with OCR
The Scanbot VIN Scanner SDK enables users to extract vehicle information from VINs and chassis numbers simply by scanning with their mobile device.
A car’s VIN number is a 17-character code that consists of three key sections:
- The first three characters are the **World Manufacturer Identifier (WMI)**, with the first digit referring to the country of origin, and the second and third character to the manufacturer.
- The next six characters contain the **Vehicle Descriptor Section (VDS)**, which represents different vehicle attributes such as model and engine size. The ninth digit is often a check digit that validates the VIN.
- The remaining eight characters represent the **Vehicle Identifier Section (VIS)**. Usually, the tenth character indicates the model year and the eleventh the assembly plant. Characters 12 to 17 often represent the production sequence number.
The Scanbot VIN Scanner SDK leverages optical character recognition (OCR) to streamline your operations. After submitting a picture, our VIN OCR software extracts the information and converts it into a structured format. This output can then be used for further processing in your backend system.
This scanning functionality enables real-time cross-referencing against inventory or registers of both legitimate and stolen vehicles. And it allows users to do so quickly from a mobile device, allowing them to rapidly and reliably verify multiple VIN numbers. A scanning software removes the need for manual data input, reducing human errors and improving overall accuracy while saving time.
## **VIN barcode scanning**
Apart from VIN numbers, cars now typically have VIN barcodes too. These use the [Code 39](https://scanbot.io/barcode-scanner-sdk/code-39/) symbology, which the [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) also supports. They are commonly located on a printed paper sticker inside the driver’s door.

## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### **What is a VIN**?
Every vehicle manufactured in the U.S. after 1981 has a Vehicle Identification Number (VIN). It’s a unique 17-character alphanumeric code that acts as a vehicle’s fingerprint and is internationally standardized in ISO 3779 and ISO 4030. VIN numbers also contain vehicle details about the origin and specifications. They are typically located on the driver’s side of the dashboard, near the windshield. Most recent models also have a VIN barcode, typically on a sticker inside the driver’s door. VINs are commonly printed on insurance cards and other vehicle-related documents as well.
VIN numbers are crucial for tracking recalls, registrations, and insurance coverage, making them invaluable for vehicle and ownership verification. They are tightly linked with the history of the particular car.
### **Where is VIN scanning used?**
Our VIN scanner is handy for a wide range of use cases in [fleet management](https://scanbot.io/success-stories/ete-reman/). For example, dealerships can use any modern device to verify particular vehicles or to instantly access vehicle history reports and other technical vehicle information. Furthermore, it is also used in inventory management for efficiently tracking and managing vehicle inventories.
Compared to manual data entry, scanning with a mobile device is far more accurate and saves time. With VIN cloning on the rise, mobile scanners can help businesses protect themselves and their customers.
### **How could Scanbot SDK help you with VIN scanning?**
Our VIN scanning software gives you quick and easy access to vehicle information. Just point your device's camera at the vehicle's VIN number – the scanning module in your app will immediately read the number.
The Scanbot SDK offers both VIN number scanning and barcode scanning. Our SDK delivers exceptional performance even on damaged or curved barcodes and in low-lighting conditions, all with a scanning speed of under 0.04 seconds.
### Which VIN standards are supported?
The Scanbot VIN OCR Scanner SDK supports the ISO 3779, as used in Europe. It also supports further specifications on top of this ISO standard:
\- FMVSS 115, Part 565, as used in the United States and Canada
\- SAE J853, commonly used in North America
\- ADR 61/2, as used in Australia
### **Which platforms is the Scanbot VIN Scanner SDK available for?**
Our VIN scanning software can be integrated into [iOS](https://scanbot.io/developer/ios-data-capture/vin-scanner/) and [Android](https://scanbot.io/developer/android-data-capture/vin-scanner/) apps both natively or with all common cross-platform frameworks.
Want to try it out? Check out our [demo app](https://scanbot.io/demo-apps/#data-capture-modules) or [request a trial license](https://scanbot.io/trial/).
### **Is the Scanbot SDK compliant with GDPR?**
Yes, the Scanbot VIN Scanner SDK works exclusively offline, using only on-device intelligence. This means your data is never tracked or sent to external servers.
+
## Data Matrix Scanner SDK
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanner-sdk/data-matrix/#main)
# Data Matrix Code Scanner
Add Data Matrix scanning to your mobile application or website
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

## Turn smartphones into fast & reliable Data Matrix scanners
The Scanbot Data Matrix Scanner delivers exceptional performance even under challenging conditions – such as code damage or when scanning the very small codes commonly found in industrial environments. With a scanning speed of under 0.04 seconds, your users get instant reads for seamless workflows.
Key benefits include:
- **Offline scanning**: The Scanbot SDK works 100% on-device, ensuring both uninterrupted performance and data security.
- **Enterprise-grade support**: Get dedicated chat support via Slack, Teams or email for any issue. Includes free assistance during the integration phase.
- **Flat pricing model**: Cost stays the same no matter how much your user base or scanning volume grows.


### How this scanning tool works
Our free online Data Matrix code reader scans codes directly through your camera or on imported images. This barcode scanner works in any browser, no app download or signup needed. Enjoy real-time camera view scanning or decode barcodes on pictures in seconds – just point your camera at the Data Matrix code or import an image file to instantly access the encoded data.
This tool is powered by the [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/)!
* * *
(We don’t store any images or data you import. Everything stays on your device.)
## Understanding Data Matrix codes
### What is a Data Matrix code?
Data Matrix codes are two-dimensional barcodes that store data in a compact and reliable format. Unlike traditional linear barcodes, they use a grid of black and white modules to encode information such as characters, numbers, or binary data. Defined in the ISO/IEC 16022 standard, these codes can store up to 3,116 numeric, 2,335 alphanumeric, or 1,556 binary characters at an exceptional data density.
Their small size and large storage capacity make Data Matrix one of the most widely used 2D barcode types. They can be microscopically small, making them ideal for applications where space is tight. These codes remain highly readable even in low light or low contrast conditions and – with the right scanning software – maintain readability when damaged or distorted.
### Structure and components
Data Matrix barcodes use black and white cells (modules) arranged in a square or rectangular pattern. The key components include:
- **Finder pattern**: This serves as the foundation of every Data Matrix. It consists of two solid adjacent borders forming an “L” shape along the left and bottom edges, helping scanners locate and determine the orientation of the symbol.
- **Timing pattern**: The timing pattern, which is located along the top and right edges, allows scanners to determine the exact number of rows and columns.
- **Data regions**: These contain arrays of modules, where each black or white module represents a binary digit (1 or 0) to encode text, numbers, or other data.
- **Quiet zone**: Also known as the margin, the quiet zone surrounds the entire symbol, creating a buffer that helps scanners distinguish the code from background elements.
- **Alignment pattern**: For larger Data Matrix codes, the alignment pattern divides the symbol into multiple, individual blocks. This minimizes distortion risk and ensures accurate scanning.

Data Matrix codes come in different versions. ECC200 is the newer version that has an even number of rows and columns, with sizes ranging from 10×10 to 144×144. ECC000-140 versions have an odd number of modules with sizes ranging from 9×9 to 49×49.
Data Matrix code (ECC200) comes in two variations:
**Square Data Matrix**
Square Data Matrix codes can store up to 3,116 numeric, 2,335 alphanumeric, or 1,556 binary characters. They range from 10 x 10 to 144 x 144 modules in size. To prevent distortion, any symbol larger than 24 x 24 modules is divided into smaller blocks, each no larger than 24 modules per side.

| | |
| --- | --- |
| **Total symbol size** | **Number of blocks** |
| 10×10 to 26×26 | 1 block |
| 32×32 to 52×52 | 4 blocks |
| 64×64 to 104×104 | 16 blocks |
| 120×120 to 144×144 | 36 blocks |
**Rectangular Data Matrix**
Rectangular Data Matrix barcodes can store up to 98 numeric, 72 alphanumeric, or 47 binary characters. They come in six sizes, ranging from 8 x 18 to 16 x 48 modules. Unlike square Data Matrix codes, only the larger rectangular symbols are divided into blocks.

| | |
| --- | --- |
| **Total symbol size** | **Number of blocks** |
| 8×18 | 1 block |
| 12×26 | 1 block |
| 16×36 | 1 block |
| 8×32 | 2 blocks |
| 12×36 | 2 blocks |
| 16×48 | 2 blocks |
### Error correction
ECC200 employs Reed-Solomon error correction algorithms to ensure reliable data recovery, even when the code is partially damaged or obscured. This advanced error correction system is integrated into the Data Matrix structure and automatically scales with the symbol size.
The system can reconstruct complete data strings even when up to 30% of the symbol is damaged, as long as the scanner can still find the matrix position. This robust error correction results in an exceptionally low error rate of less than 1 in 10 million scanned characters.
Unlike earlier versions or other 2D codes, ECC200’s error correction cannot be manually adjusted, ensuring consistent reliability across all implementations. This standardization helps maintain data integrity across different scanning environments and applications.
### Applications of Data Matrix codes
**Small electronic components**
Data Matrix barcodes are widely used for marking small items due to their ability to store 50 characters in a symbol as small as 2–3 mm². Despite their compact size, they remain highly readable, even when printed with a low contrast ratio of just 20%. For that reason, Data Matrix barcodes are especially useful in industries like electronics, where space is limited. The US Electronic Industries Alliance (EIA) even recommends them for labeling small electronic parts.
**Direct part marking**
[Direct part marking (DPM)](https://scanbot.io/blog/direct-part-marking-barcodes/) is a method of permanently applying a code onto the surface of an item by lasering, dot peen marking or permanently etching barcodes. Data Matrix barcodes are commonly used as dpm codes. They are essential for reliable identification of products and parts in industries like manufacturing, automotive, and aerospace. Their ability to remain readable even when damaged ensures reliable tracking.
**Healthcare**
Data Matrix barcodes are used to label and authenticate medication quickly. By encoding critical information like batch numbers and expiry dates, they contribute to safe medication administration. Moreover, they are used for Unique Device Identification (UDI) of medical devices, where they [ensure traceability and patient safety](https://scanbot.io/blog/barcode-scanner-patient-identification-system/).
**Retail and logistics**
Similarly, these codes also allow for product identification and tracking in retail and logistics industries. Data Matrix barcodes are often used for inventory control, where they manage stock levels and automate the reordering process.
### Advantages of Data Matrix codes
- **Compact size**: They can store large amounts of data in minimal space (up to 3,116 numeric characters) with exceptional density – as small as 2-3 mm² for 50 characters.
- **Error correction**: They use Reed-Solomon error correction that maintains readability even when the code is partially damaged or printed in low contrast conditions (down to 20%).
- **Scalability**: Data Matrix codes are available in multiple sizes from 10×10 to 144×144 modules for square formats, with automatic block division for larger sizes to prevent distortion. Rectangular formats also exist for specific applications.
- **Versatility**: Omnidirectional scanning ensures seamless decoding from any angle.
### Why choose the Scanbot SDK for Data Matrix scanning?
The Scanbot Barcode Scanner SDK is specifically designed to handle the challenges of decoding Data Matrix codes in real-world scenarios.
What sets us apart:
- **Exceptional performance**: Reliably decodes even damaged, low-contrast or distorted barcodes.
- **High-speed scanning**: Read Data Matrix codes in as little as 0.04 seconds.
- **Cross-platform compatibility**: Easily integrate with Android, iOS, cross-platform, web, Windows, and Linux platforms.
- **Customizable UI**: Customize the ready-to-use components to match your app or website design.
- **Privacy-first**: Operates offline for complete data security.
Whether your use case involves Data Matrix codes, QR codes, or [any other barcode](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/), the Scanbot SDK delivers the accuracy, speed, and reliability you need to succeed.
* * *
## Related Barcode Types:
- [QR Code Scanner](https://scanbot.io/qr-code-scanner-online/)
- [PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/pdf417/)
- [Aztec Code Scanner](https://scanbot.io/barcode-scanner-sdk/aztec-code/)
- [Code 128 Scanner](https://scanbot.io/barcode-scanner-sdk/code-128/)
- [Code 39 Scanner](https://scanbot.io/barcode-scanner-sdk/code-39/)
- [EAN Scanner](https://scanbot.io/barcode-scanner-sdk/ean/)
- [UPC Scanner](https://scanbot.io/barcode-scanner-sdk/upc/)
- [Micro QR Code Scanner](https://scanbot.io/barcode-scanner-sdk/micro-qr-code/)
- [GS1 DataBar Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-databar/)
- [GS1 DataMatrix Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-data-matrix/)
- [GS1-128 Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-128/)
- [MaxiCode Scanner](https://scanbot.io/barcode-scanner-sdk/maxicode/)
- [ITF Scanner](https://scanbot.io/barcode-scanner-sdk/itf-code/)
- [Codabar Scanner](https://scanbot.io/barcode-scanner-sdk/codabar/)
- [Intelligent Mail Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/intelligent-mail-barcode/)
- [rMQR Code Scanner](https://scanbot.io/barcode-scanner-sdk/rmqr/)
- [Royal Mail Scanner](https://scanbot.io/barcode-scanner-sdk/royal-mail/)
- [Micro PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/micro-pdf417/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### **Can you scan a Data Matrix code?**
Yes. The Scanbot Barcode Scanner SDK reads Data Matrix barcodes as fast as 0.04 seconds per scan. Interested in integrating reliable scanning into your app or website? Get a [free trial license](https://scanbot.io/trial/), or try our [demo apps](https://scanbot.io/demo-apps/) to see the SDK in action.
### **What is the difference between a Code 128 and a Data Matrix?**
[Code 128](https://scanbot.io/barcode-scanner-sdk/code-128/) is a one-dimensional (1D) linear barcode, while Data Matrix is a two-dimensional (2D) barcode. Data Matrix has a much higher data capacity compared to Code 128. It can store up to 2,335 alphanumeric characters or 3,116 numeric characters. Code 128 encodes up to 128 ASCII characters.
While both code symbologies offer error correction, Data Matrix has a more robust system, that can read the data even if up to 30% of the code is damaged.
### **What is the difference between a Data Matrix code and a QR Code?**
Data Matrix and [QR codes](https://scanbot.io/qr-code-scanner-online/) are both two-dimensional (2D) barcodes but differ in key aspects. QR codes generally have a higher data capacity than Data Matrix codes. However, Data Matrix codes are typically smaller and offer higher data density in a compact format.
Visually, Data Matrix codes have an "L"-shaped finder pattern, whereas QR codes use three corner squares. QR codes also support Kanji and multi-byte characters. Data Matrix codes are common in industrial and healthcare settings, while QR codes are widely used in consumer applications.
### **What is the difference between a UPC and a Data Matrix?**
[UPC](https://scanbot.io/barcode-scanner-sdk/upc/) is a one-dimensional (1D) linear barcode, while Data Matrix is a two-dimensional (2D) barcode. UPC has limited data capacity and can only encode numeric characters, with UPC-A encoding 12 digits and UPC-E encoding 6 digits. Data Matrix can store up to 2,335 alphanumeric characters, 3,116 numeric characters or 1,556 binary characters.
UPCs have limited error detection through a check digit, whereas Data Matrix codes have robust error correction capabilities. Moreover, UPCs are primarily used in retail for product identification and inventory tracking. Data Matrix codes are more common in manufacturing, healthcare, and aerospace for product traceability and direct part marking.
### **What is the difference between ECC140 and ECC200?**
The older versions of the data matrix (ECC000, ECC050, ECC080, ECC100, ECC140) differ in the number of modules on the side. The ECC200 has even-numbered modules, whereas the older versions have odd-numbered modules.
### **How do I determine the Data Matrix code size?**
To calculate the size of a Data Matrix code, multiply the number of modules by the printable size of each module. For example, a 10 x 10 module code with 0.25 mm printable modules will be 2.5 x 2.5 mm in size.
### **How can Scanbot SDK help you with Data Matrix scanning?**
The Scanbot SDK delivers exceptional performance in challenging environments, including damaged or curved barcodes, with a scanning speed of under 0.04 seconds for seamless workflows. Try it now with a [free trial license](https://scanbot.io/trial/).
+
## Codabar Barcode Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanner-sdk/codabar/#main)
# Codabar Reader
Add Codabar scanning to your mobile application or website
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

## Turn smartphones into fast & reliable Codabar scanners
The Scanbot Codabar Scanner SDK ensures outstanding performance, even in demanding scenarios – such as scanning damaged barcodes or smaller codes often encountered in healthcare and logistics environments. With a scanning speed of under 0.04 seconds, your users get instant reads for seamless workflows.
Key benefits include:
- **Offline scanning**: The Scanbot SDK works 100% on-device, ensuring both uninterrupted performance and data security.
- **Enterprise-grade support**: Get dedicated chat support via Slack, Teams or email for any issue. Includes free assistance during the integration phase.
- **Flat pricing model**: Cost stays the same no matter how much your user base or scanning volume grows.


### How this scanning tool works
Our free online Codabar barcode scanning software reads codes directly through your camera or on imported images. This barcode reader works in any browser, no app download or signup needed. Enjoy real-time camera view scanning or decode barcodes on pictures in seconds – just point your camera at the Codabar or import an image file to instantly access the data encoded.
This tool is powered by the [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/)!
* * *
(We don’t store any images or data you import. Everything stays on your device.)
## Understanding Codabar barcodes
### What are Codabar codes?
The Codabar is a one-dimensional (1D) linear barcode symbology developed in 1972 by Pitney Bowes. It has a built-in error detection mechanism that reduces the risk of misreads. This barcode type is designed to be read on printed forms, especially from dot-matrix printers. While newer barcode formats can store significantly more information in a smaller area, Codabar remains in use. It is still commonly used in libraries (on book spines).

Codabar barcodes are made up of a sequence of bars and spaces that represent numeric digits along with a limited selection of special characters. They can encode up to 16 different characters, which includes four start/stop characters. Codabar is also referred to by several other names, including Codeabar, Ames Code, NW-7, Monarch, and USD-4.
### Applications of Codabar codes
**Libraries**
Libraries use Codabar barcodes to effectively manage their collection of books and other materials. Each item is assigned a Codabar barcode, which allows for easy tracking during checkouts and returns. This system streamlines library operations, helping staff quickly locate materials and maintain accurate inventory records.
**Healthcare**
Codabar codes are essential in healthcare for patient identification and specimen tracking. They are widely used in blood banks for labeling samples and managing inventory, as well as in laboratories for tracking specimen tubes, ensuring accurate matching and reducing the risk of errors.
**Logistics**
In logistics, Codabar is commonly used for labeling packages and tracking shipments. The barcode enables quick scanning and identification of packages at various points in the shipping process, ensuring accurate tracking and improving operational efficiency.
### Structure of Codabar codes
Codabar can encode a total of 16 different characters, which includes the numeric digits 0-9 and a limited set of special characters: $, +, -, ., /, and :. This total also accounts for the four start and stop characters (A, B, C, and D), which indicate to scanners where the encoded data begins and ends.
The structure of Codabar allows for variable-length barcodes, making it adaptable for various applications that require straightforward data representation, such as in healthcare and logistics. Additionally, Codabar is a self-checking barcode, enhancing its reliability in environments where accurate data capture is essential.
### Advantages of Codabar codes
- Compact size: Codabar codes are designed to encode essential information in a compact format, making them suitable for labeling items of various sizes in applications such as healthcare and libraries.
- Self-checking symbology: They include a self-checking feature that allows it to verify its own integrity during scanning. This helps ensure accurate data capture, even if the barcode experiences minor wear or smudging.
- Scalability: Codabar codes can accommodate variable-length data, allowing for flexibility in encoding information based on specific application needs.
- Versatility: They are compatible with many systems used in healthcare, logistics, and library management. Their straightforward design allows for easy generation and decoding.
### Why choose the Scanbot SDK for Codabar scanning?
The Scanbot Barcode Scanner SDK is specifically designed to handle the challenges of decoding Codabar codes in real-world scenarios.
What sets us apart:
- **Exceptional performance**: Reliably decodes even damaged, low-contrast or distorted barcodes.
- **High-speed scanning**: Read Codabar codes in as little as 0.04 seconds.
- **Cross-platform compatibility**: Easily integrate with Android, iOS, cross-platform, web, Windows, and Linux platforms.
- **Customizable UI**: Customize the ready-to-use components to match your app or website design.
- **Privacy-first**: Operates offline for complete data security.
Whether your use case involves Codabar barcodes, QR codes or [any other barcode](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/), the Scanbot SDK delivers the accuracy, speed, and reliability you need to succeed.
* * *
## Related Barcode Types:
- [Data Matrix Scanner](https://scanbot.io/barcode-scanner-sdk/data-matrix/)
- [QR Code Scanner](https://scanbot.io/qr-code-scanner-online/)
- [PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/pdf417/)
- [Aztec Code Scanner](https://scanbot.io/barcode-scanner-sdk/aztec-code/)
- [Code 128 Scanner](https://scanbot.io/barcode-scanner-sdk/code-128/)
- [Code 39 Scanner](https://scanbot.io/barcode-scanner-sdk/code-39/)
- [EAN Scanner](https://scanbot.io/barcode-scanner-sdk/ean/)
- [UPC Scanner](https://scanbot.io/barcode-scanner-sdk/upc/)
- [Micro QR Code Scanner](https://scanbot.io/barcode-scanner-sdk/micro-qr-code/)
- [GS1 DataBar Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-databar/)
- [GS1 DataMatrix Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-data-matrix/)
- [GS1-128 Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-128/)
- [MaxiCode Scanner](https://scanbot.io/barcode-scanner-sdk/maxicode/)
- [ITF Scanner](https://scanbot.io/barcode-scanner-sdk/itf-code/)
- [Intelligent Mail Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/intelligent-mail-barcode/)
- [rMQR Code Scanner](https://scanbot.io/barcode-scanner-sdk/rmqr/)
- [Royal Mail Scanner](https://scanbot.io/barcode-scanner-sdk/royal-mail/)
- [Micro PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/micro-pdf417/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### What is a Codabar barcode?
A Codabar barcode is a 1D barcode that uses bars and spaces to encode up to 16 characters, including numeric digits, a limited selection of special characters, and four start/stop characters. It includes built-in error detection and is designed for printed forms. Codabar is still used today, commonly in libraries on book spines.
### Is Codabar still used?
Yes, Codabar is still used today in libraries for labeling book spines, as well as in blood banks and other industries that rely on simple and reliable barcodes. However, it has become more outdated, as newer code forms can encode more information and are generally smaller.
### What is Codabar used for?
Codabar is used in libraries for labeling book spines, on blood bank forms and other forms requiring simple and reliable barcode solutions.
### How can Scanbot SDK help you with Codabar scanning?
The Scanbot Codabar barcode reader delivers exceptional performance in challenging environments, including damaged or curved barcodes, with a scanning speed of under 0.04 seconds for seamless workflows. The SDK is available for both web and mobile devices. Try it now with a [free trial license](https://scanbot.io/trial/).
+
## GS1-128 Barcode Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanner-sdk/gs1-128/#main)
# GS1-128 Barcode Scanner
Add GS1-128 barcode scanning to your mobile application or website
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

## Turn smartphones into fast & reliable GS1-128 barcode scanners
The Scanbot GS1-128 Barcode Scanner SDK delivers exceptional performance even under challenging conditions – such as code damage or when scanning the very small codes commonly found in industrial environments. With a scanning speed of under 0.04 seconds, your users get instant reads for seamless workflows.
Key benefits include:
- **Offline scanning**: The Scanbot SDK works 100% on-device, ensuring both uninterrupted performance and data security.
- **Enterprise-grade support**: Get dedicated chat support via Slack, Teams or email for any issue. Includes free assistance during the integration phase.
- **Flat pricing model**: Cost stays the same no matter how much your user base or scanning volume grows.


### How this scanning tool works
Our free online GS1-128 barcode reader scans codes directly through your camera or on imported images. This barcode scanner works in any browser, no app download or signup needed. Enjoy real-time camera view scanning or decode barcodes on pictures in seconds – just point your camera at the code or import an image file to instantly access the encoded data.
This tool is powered by the [Scanbot Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/)!
* * *
(We don’t store any images or data you import. Everything stays on your device.)
## Understanding GS1-128 barcodes
### What are GS1-128 barcodes?
The GS1-128 code is a versatile one-dimensional (1D) barcode widely used for product identification and supply chain management across various industries including retail, logistics, healthcare, and manufacturing. It is based on the Code 128 symbology and was previously known as EAN-128 or UCC-128.

GS-128 codes incorporate a Function Code 1 (FNC1) character and Application Identifiers (AIs) to structure data. The FNC1 character identifies the barcode as GS1-128, signaling to scanners that the data follows GS1 standards. AIs are numerical prefixes that define the meaning and format of the data that follows, enabling standardized encoding of diverse information such as GTINs, batch numbers, expiry dates, and weights.
They can carry up to 48 characters of alphanumeric data, with a maximum physical length of 165.10 millimeters. Unlike UPC or EAN codes used primarily at point-of-sale, GS1-128 allows for combining multiple data elements in a single barcode, enhancing traceability and regulatory compliance. This feature also facilitates automation in logistics and improves inventory management efficiency.
### Applications of GS1-128 barcodes
**Logistics and shipping**
GS1-128 barcodes are highly valuable in shipping, receiving, and warehouse scanning environments because they can encode detailed product information, including batch or lot numbers, serial numbers, and expiration dates.
**Healthcare**
In healthcare, they ensure patient safety by encoding unique device identification (UDI) and pharmaceutical traceability. They help track medical products from manufacturing to patient use, supporting critical regulatory compliance.
**Retail and food service**
Most major retailers and food service operators use GS1-128 barcodes to enhance inventory management, automate receiving processes, and improve product traceability. These barcodes are especially valuable for tracking expiration and production dates and batch numbers in food safety initiatives.
### Advantages of GS1-128 barcodes
- Data capacity: GS1-128 can encode up to 48 characters of alphanumeric data, allowing for detailed product information in a single barcode.
- Standardization: As part of the GS1 system, these barcodes ensure global compatibility and standardized data interpretation.
- Length: GS1-128 barcodes can be up to 165.10 millimeters (6.500 inches) long, including quiet zones, allowing for significant data encoding in a linear format.
- Versatility: GS1-128 barcodes can encode various types of information using Application Identifiers (AIs), making them adaptable for different supply chain needs.
### Structure of GS1-128 barcodes
Multiple pieces of information can be combined in a single GS1 barcode, with the FNC1 character serving as a separator between different data items. The barcode begins with a unique double character start pattern consisting of a start character followed by the FNC1 character, distinguishing it from regular Code 128 symbols. The key components are:
- Start Character: Indicates the beginning of the barcode (START-A, START-B, or START-C). It is an internal part of the barcode’s encoding that helps the scanner determine how to interpret the data.
- FNC1 Character: Flagging character that identifies the barcode as a GS1-128 and acts as a separator for variable-length data.
- Application Identifiers (AIs): Two to four-digit numerical prefixes that define the meaning and format of the following data. For example:
- (01) represents a Global Trade Item Number (GTIN)
- (10) indicates a Batch or Lot Number
- (17) signifies an Expiration Date
- Data Elements: The actual information being encoded, such as product numbers, dates, or quantities. The format and length depend on the preceding Application Identifier (AI). This data is encoded as a text string within the barcode, enabling precise data interpretation.
- Symbol Check Character: A single character calculated from all preceding data, used for error detection.
- Stop Character: Indicates the end of the barcode. It is an internal part of the barcode’s encoding and remains invisible to users.
The human-readable text below the barcode displays this information, with Application Identifiers (AIs) in parentheses to indicate what each piece of data represents.
### Why choose the Scanbot SDK for GS1-128 barcode scanning?
The Scanbot Barcode Scanner SDK is specifically designed to handle the challenges of decoding GS1 barcodes in real-world scenarios.
What sets us apart:
- **Exceptional performance**: Reliably decodes even damaged, low-contrast or distorted barcodes.
- **High-speed scanning**: Read GS1-128 codes in as little as 0.04 seconds.
- **Cross-platform compatibility**: Easily integrate with Android, iOS, cross-platform, web, Windows, and Linux platforms.
- **Customizable UI**: Customize the ready-to-use components to match your app or website design.
- **Privacy-first**: Operates offline for complete data security.
Whether your use case involves GS1 barcodes, QR codes or [any other barcode](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/), the Scanbot SDK delivers the accuracy, speed, and reliability you need to succeed.
* * *
## Related Barcode Types:
- [Data Matrix Scanner](https://scanbot.io/barcode-scanner-sdk/data-matrix/)
- [QR Code Scanner](https://scanbot.io/qr-code-scanner-online/)
- [PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/pdf417/)
- [Aztec Code Scanner](https://scanbot.io/barcode-scanner-sdk/aztec-code/)
- [Code 128 Scanner](https://scanbot.io/barcode-scanner-sdk/code-128/)
- [Code 39 Scanner](https://scanbot.io/barcode-scanner-sdk/code-39/)
- [EAN Scanner](https://scanbot.io/barcode-scanner-sdk/ean/)
- [UPC Scanner](https://scanbot.io/barcode-scanner-sdk/upc/)
- [Micro QR Code Scanner](https://scanbot.io/barcode-scanner-sdk/micro-qr-code/)
- [GS1 DataBar Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-databar/)
- [GS1 DataMatrix Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-data-matrix/)
- [MaxiCode Scanner](https://scanbot.io/barcode-scanner-sdk/maxicode/)
- [ITF Scanner](https://scanbot.io/barcode-scanner-sdk/itf-code/)
- [Codabar Scanner](https://scanbot.io/barcode-scanner-sdk/codabar/)
- [Intelligent Mail Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/intelligent-mail-barcode/)
- [rMQR Code Scanner](https://scanbot.io/barcode-scanner-sdk/rmqr/)
- [Royal Mail Scanner](https://scanbot.io/barcode-scanner-sdk/royal-mail/)
- [Micro PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/micro-pdf417/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### **What is a GS1-128 barcode?**
A GS1-128 barcode is a versatile one-dimensional (1D) barcode used for product identification and supply chain management. It is based on Code 128 symbology and includes a Function Code 1 (FNC1) character and Application Identifiers (AIs) to structure data, enabling standardized encoding of various information.
### **Where are GS1-128 barcodes used?**
GS1-128 barcodes are used in logistics for shipping and warehouse scanning, in healthcare for tracking medical products, and in retail and food service for inventory management and traceability. They encode detailed information like batch numbers and expiry dates.
### **What is the difference between Code 128 and GS1-128 barcodes?**
Code 128 is a general barcode symbology that encodes alphanumeric data without context, while GS1-128 is a specific version of Code 128 that follows GS1 standards and uses Application Identifiers (AIs) to define the meaning of the data. GS1-128 is designed for supply chain management, allowing multiple data elements to be combined in one barcode.
### **How can Scanbot SDK help you with GS1-128 barcode scanning?**
The Scanbot GS1-128 barcode scanner delivers exceptional performance in challenging environments, including damaged or curved barcodes, with a scanning speed of under 0.04 seconds for seamless workflows. Try it now with a [free trial license](https://scanbot.io/trial/).
+
## Check Scanner SDK
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/data-capture-software/check-scanner/#main)
# Check Scanner SDK
Extract check data as key-value pairs to speed up your workflows
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

rocket\_launchSolution
## Fast, secure, and easy-to-use check scanning
With the Scanbot Check Scanner SDK, you can quickly and reliably extract data from international paper checks. Integrate the SDK into your mobile application to replace error-prone manual data entry with fast and accurate automatic data extraction.
Our check scanner software extracts the check number, routing number, and account number as key-value pairs from the MICR code. The captured data can then easily be processed in your app. This simplifies workflows for both your customers and employees, reducing errors and saving data entry time. The entire scanning process happens offline on the device, without any server connections, ensuring complete data security for sensitive financial information.
checkAvailable for mobile development platforms

## Integrate this evening with your framework
## Scan and extract data with our OCR Check Scanner
The Scanbot Check OCR Scanner SDK supports multiple check standards, including US, French, Kuwaiti, Australian, Indian, Israeli, UAE, and Canadian formats.
(Need support for a different check standard? [Get in touch](mailto:sdk@scanbot.io) to discuss options.)
Our SDK uses optical character recognition (OCR) to extract information from Magnetic Ink Character Recognition (MICR) codes, including:
- Check Number
- Routing Number
- Account Number
Depending on the check type:
- Sort Code
- (Extra) Aux Domestic
- BSB
- Transaction Code
- Serial Number
- Auxiliary On-Us
With check OCR technology, banks and financial institutions can automate data extraction from checks with high accuracy.

## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### **What is a check scanner SDK?**
Check OCR technology, such as the Scanbot SDK enables financial institutions to digitize and process paper checks. The software can be integrated into an app or website environment, streamlining workflows in the bank branch or in remote deposit capture.
Bank check OCR solutions capture the check number, routing number, and account number from the MICR code as key-value pairs, allowing for easy processing within your operating systems. Our solution operates fully offline, ensuring complete data security for sensitive financial information.
Interested to see how it works? Read more on how to read a check in our [brochure](https://scanbot.io/resources/brochures/check-scanning-software-brochure/).
### **What is an MICR code?**
MICR stands for Magnetic Ink Character Recognition. It is a unique 9-digit code used in financial institutions to facilitate check processing. The first 3 digits refer to the city’s pin code. The middle 3 digits refer to the bank code and the last 3 digits refer to the branch code.
Read more about MICR and how they work on [our blog](https://scanbot.io/blog/how-to-use-a-check-scanner/).
### **How does the Scanbot Check Scanner SDK work?**
The SDK uses optical character recognition (OCR) to enable your end-users to scan checks along with the corresponding MICR codes, simply by snapping a picture with their device. They can then upload the image in your online banking app and the data can be processed in your backend.
By integrating check OCR processing into your workflow, you can speed up transactions, minimize errors, and improve overall efficiency. As our scanner software operates entirely offline, it never sends any data to our servers or those of a third party. It therefore also complies with both the GDPR and the CCPA and is ideal for handling sensitive data.
### **Does the Scanbot Check Scanner SDK need an internet connection?**
No, as a 100% offline solution, our check scanner software doesn’t need an internet connection. This guarantees that sensitive financial information remains secure, with all data privacy measures upheld.
### **Can I scan international checks with the Scanbot Check Scanner SDK?**
Yes. Our SDK supports multiple check standards, including US, French, Kuwaiti, Australian, Indian, Israeli, UAE, and Canadian formats. If you need support for a different standard, [get in touch](mailto:sdk@scanbot.io) with us to discuss the options.
### **What should I consider when choosing a check scanning software?**
Our check scanner software should provide high-quality outcomes that allow for accurate data extraction and simplified processing. It should increase your efficiency by reducing processing time and minimizing human errors.
Here are some important factors to consider:
**Performance and accuracy**: Ensure that the software is capable of high-quality scanning and accurate data extraction. It should be simple and quick to use. The Scanbot Check Scanner SDK comes with intuitive user guidance, as well as custom filters to optimize the raw check image for later processing.
**Compatibility**: Look out for software that works seamlessly with your development environment and is compatible with the devices you plan to use, both mobile or desktop.
**Data privacy**: As check scanning involves the handling of sensitive financial information, it is important that the SDK complies with both the GDPR and the CCPA. The Scanbot Check Scanner SDK operates entirely offline, ensuring full data privacy, so you don’t have to worry about anything.
**Developer support**: Make sure your software provider offers sufficient guidance for developers to facilitate smooth integration. Our developers are there to [support](https://docs.scanbot.io/support/) you with any obstacles your team may encounter.
**Pricing model**: Look for a pricing model that fits your business needs and scales without extra costs. Our pricing model is simple: unlimited scanning for a flat annual fee, regardless of the number of scans, users, or devices.
### **How do I integrate the Scanbot Check Scanner SDK into my app?**
Our check scanning software comes with detailed [documentation](https://docs.scanbot.io/) that takes you through the integration process step by step. The entire integration doesn’t take longer than a few hours. If you need any additional support, we are happy to help you with our [free support channels](https://docs.scanbot.io/support/).
### **Which platforms is the Scanbot Check Scanner SDK currently available for?**
Our check scanner software supports development for Native Android and iOS, JavaScript (Web), Flutter, React Native, Cordova, Capacitor / Ionic, Xamarin and .NET MAUI. Try the Scanbot Check Scanner SDK by downloading the [demo app](https://scanbot.io/demo-apps/#data-capture-modules) or requesting a [free trial license](https://scanbot.io/trial/).
+
## Mobile ID Scanning
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/data-capture-software/id-scanner/#main)
# Mobile ID Scanning Software
Scan and extract data from ID documents with mobile devices
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

rocket\_launchSolution
## Fast, secure, and easy-to-use ID scanning
The Scanbot SDK is a simple solution for quickly and accurately extracting data from a variety of ID documents. By adding an ID scanning feature to your mobile apps or websites, you can automate data entry from documents such as passports, ID cards, or driver’s licenses. This significantly speeds up any workflows that involve identity authentication and validation.
By capturing data directly from machine-readable zones (MRZs) or PDF417 codes, the SDK ensures streamlined, dependable data capture and processing.
The Scanbot SDK operates entirely offline and on the device, without any server involvement. This ensures absolute privacy and compliance with strict data protection standards, such as the GDPR. Scanned data remains securely on the device, giving you and your app users peace of mind.
checkAvailable for mobile and web development platforms

## Integrate this evening with your framework
## Scan any ID with MRZ or PDF417 Codes
The Scanbot ID Scanner SDK is specialized in extracting data from ID documents with machine-readable zones. The SDK provides robust tools for scanning and parsing various types of ID formats, including:
- Passports
- National ID cards
- Driver’s licenses
- Residence permits
- Visa documents
Moreover, the SDK is capable of scanning any other ID format that implements the two-line (TD3, TD2) or three-line (TD1, MRV-A, MRV-B) MRZ standards.
In addition to MRZ scanning, the SDK supports the parsing of PDF417 codes, including the AAMVA codes commonly found on US and Canadian driver’s licenses. In regions like the US, driver’s licenses commonly use PDF417 barcodes to store personal information. Similarly, certain national ID cards around the world rely on PDF417 codes, making this functionality essential for comprehensive ID scanning workflows.
Using advanced OCR and barcode scanning technology, the Scanbot SDK extracts critical information from MRZ data fields or PDF417 barcodes, such as:
- Full name
- Date of birth
- Nationality
- Document number
- Expiry date
The structured data is immediately available as key-value pairs you can easily process in your applications, whether that is identity verification, user onboarding, or a compliance workflow.
### Why rely on MRZ and PDF417-based ID scanning?
Using MRZs and PDF417 barcodes for ID scanning is a time-tested approach to data capture. These technologies are specifically designed for automated reading, ensuring extremely fast and reliable processing. They are also standardized, which means a scanner can process a large range of documents.
Both MRZ and PDF417 scanning are particularly valuable in applications that require rapid identity verification, such as travel and hospitality, banking, or customer onboarding. Leveraging both technologies ensures comprehensive coverage for diverse ID formats across different regions.

## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### What is an ID Scanner SDK?
An ID scan SDK (Software Development Kit) enables automated scanning and data collection from identity documents like passports and ID cards. An ID scanner is particularly useful in the hospitality industry, where it can enhance the check-in process. Such a tool simplifies workflows by extracting information from MRZs or PDF417 codes and returning it as a simple data structure, which is easy to process further.
### How does an ID Scan SDK work?
The Scanbot ID Scanner SDK reads the MRZ on ID documents using advanced OCR technology or parses PDF417 barcodes where applicable. To protect the extracted personal information, the data is processed on-device only, without reliance on servers.
### What types of ID documents can be scanned using an ID Scanner SDK?
The Scanbot ID Scanner SDK supports ID documents that contain machine-readable zones (MRZs) or PDF417 codes, such as:
\- Passports
\- National ID cards
\- Driver’s licenses
\- Residence permits
### How accurate is the ID Scanner SDK in extracting information?
The Scanbot ID Scanner SDK is optimized for accuracy, delivering reliable results even in low light and from any angle. Its OCR technology ensures dependable data extraction from MRZs on a range of document types.
### How do I integrate an ID Scanner SDK into my existing application?
Integration is easy with the Scanbot ID Scanner SDK. It comes with comprehensive documentation, sample code, and enterprise support, making it easy to integrate into iOS, Android or web applications. The SDK is designed for seamless deployment within hours.
### What are the key features to look for in an ID Scanner SDK?
When evaluating an ID scan SDK, prioritize the following:
\- Offline, on-device processing for maximum data security
\- Compliance with GDPR and other regulations
\- Fast and accurate OCR and barcode scanning performance
\- Support for a wide range of ID documents
\- Easy integration and robust developer support
+
## AAMVA Barcode Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/barcode-scanner-sdk/aamva-pdf417/#main)
# AAMVA Barcode Scanner
Extract barcode data from PDF417 on AAMVA documents
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

## Turn smartphones into fast & reliable scanners for AAMVA documents
The Scanbot [Barcode Scanner SDK](https://scanbot.io/barcode-scanner-sdk/) ensures outstanding performance, such as scanning faded or creased driver’s licenses carried in wallets. With a scanning speed of under 0.04 seconds, your users get instant reads for seamless workflows. To decode the raw PDF417 data into a human-readable format, use our U.S. Driver’s License Scanner SDK, which includes an AAMVA parser.
Key benefits include:
- **Offline scanning**: The Scanbot SDK works 100% on-device, ensuring both uninterrupted performance and data security.
- **Enterprise-grade support**: Get dedicated chat support via Slack, Teams or email for any issue. Includes free assistance during the integration phase.
- **Flat pricing model**: Cost stays the same no matter how much your user base or scanning volume grows.


### How this scanning tool works
Our free online barcode scanning software reads PDF417 codes directly through your camera or on imported images. This barcode scanner works in any browser, no app download or signup needed.
**NOTE**: This tool only reads the barcode. Use the [Scanbot Data Capture SDK web demo](https://websdk-data-capture.scanbot.io/#/) to parse and access the information in a human-readable format, directly from your camera.
* * *
(We don’t store any images or data you import. Everything stays on your device.)
## Understanding PDF417 codes
### What are PDF417 codes?
PDF417 codes are two-dimensional barcodes designed to encode large amounts of data in a compact, flexible format. The name “PDF” stands for “Portable Data File,” emphasizing the code’s ability to carry complex data sets. These barcodes consist of multiple rows and columns of linear codes that can store up to 2,725 numeric characters or 1,850 alphanumeric characters.

Defined in the ISO/IEC 15438 standard, PDF417 codes are highly scalable, making them suitable for a variety of applications that require different formats. They have built-in error correction, ensuring accurate decoding even when parts of the barcode are damaged or obscured.
In the U.S. and Canada, PDF417 is commonly used on driver’s licenses and other identitiy cards to store essential personal information. The American Association of Motor Vehicle Administrators (AAMVA) has created additional guidelines for encoding data specifically on U.S. and Canadian driver’s licenses, adapting the ISO/IEC 15438 standard to meet local regulatory and operational needs.
### Applications of PDF417 codes on AAMVA documents
**Driver’s licenses**
Most U.S. and Canadian driver’s licenses include a PDF417 that follows the AAMVA standard. This barcode encodes essential information such as the driver’s name, date of birth, address, license number, expiration date, and restrictions. Law enforcement officers, retailers, and other organizations use barcode scanners to quickly extract and verify this data for identity checks, age verification, and fraud prevention.
**ID documents**
Many government-issued identification cards in the U.S. and Canada, such as state ID cards and national ID cards use PDF417 codes.
### Structure of PDF417 codes on AAMVA documents
The PDF417 barcode on the back of a driver’s license has a start pattern (left) and an end pattern (right). In the middle section, the mandatory data elements on AAMVA documents are encoded.

The three letters in front are the data item’s corresponding element ID:
- DCA: Vehicle class(es) the cardholder is allowed to drive
- DCB: Restrictions on driving privileges (e.g., only automatic transmission)
- DCD: Additional privileges granted to the cardholder (e.g., transportation of hazardous material)
- DBA: Expiration date of the document
- DCS: Last name / family name
- DAC: First name
- DAD: Middle name(s)
- DBD: Issue date of the document
- DBB: Date of birth
- DBC: Gender
- DAY: Eye color
- DAU: Height
- DAG: Address: Street name
- DAI: Address: City name
- DAJ: Address: State name
- DAK: Address: Postal code
- DAQ: ID number of the cardholder
- DCF: ID number of the document
- DCG: Country in which the document was issued
- DDE: Indicator that the last name is truncated
- DDF: Indicator that the first name is truncated
- DDG: Indicator that the middle name(s) are truncated
### Advantages of PDF417 codes
- High data capacity: Store up to 2,725 numeric or 1,850 alphanumeric characters, ideal for complex datasets.
- Adjustable size: Customizable length and width make them suitable for various surfaces and applications.
- Error correction levels: Robust built-in error correction ensures data readability even when parts of the barcode are damaged.
- Versatility: Suitable for a wide range of industries and applications, from ID verification to postal parcels and logistics.
### Why choose the Scanbot SDK for PDF417 scanning?
The Scanbot Barcode Scanner SDK is specifically designed to handle the challenges of decoding PDF417 codes in real-world scenarios.
What sets us apart:
- **Exceptional performance**: Reliably decodes even damaged, low-contrast or distorted barcodes.
- **High-speed scanning**: Read PDF417 codes in as little as 0.04 seconds for quick identification.
- **Cross-platform compatibility**: Easily integrate with Android, iOS, cross-platform, web, Windows, and Linux platforms.
- **Customizable UI**: Customize the ready-to-use components to match your app or website design.
- **Privacy-first**: Operates offline for complete data security.
Whether your use case involves PDF417 codes, UPCs, QR codes, or [any other barcode](https://scanbot.io/barcode-scanner-sdk/supported-barcodes/), the Scanbot SDK delivers the accuracy, speed, and reliability you need to succeed.
* * *
## Related Barcode Types:
- [QR Code Scanner](https://scanbot.io/qr-code-scanner-online/)
- [Data Matrix Code Scanner](https://scanbot.io/barcode-scanner-sdk/data-matrix/)
- [PDF417 Scanner](https://scanbot.io/barcode-scanner-sdk/pdf417/)
- [Aztec Code Scanner](https://scanbot.io/barcode-scanner-sdk/aztec-code/)
- [Code 128 Scanner](https://scanbot.io/barcode-scanner-sdk/code-128/)
- [Code 39 Scanner](https://scanbot.io/barcode-scanner-sdk/code-39/)
- [EAN Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/ean/)
- [UPC Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/upc/)
- [Micro QR Code Scanner](https://scanbot.io/barcode-scanner-sdk/micro-qr-code/)
- [GS1 DataBar Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-databar/)
- [GS1 DataMatrix Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-data-matrix/)
- [GS1-128 Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/gs1-128/)
- [ITF Barcode Scanner](https://scanbot.io/barcode-scanner-sdk/itf-code/)
- [Codabar Scanner](https://scanbot.io/barcode-scanner-sdk/codabar/)
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### **Where is PDF417 used?**
PDF417 barcodes are widely used on U.S. and Canadian driver’s licenses and government-issued ID cards, following the AAMVA standard to encode key details for identity verification, age checks, and fraud prevention. They are also commonly used in ticketing, healthcare, and logistics for identification and tracking purposes.
### **How does parsing from AAMVA documents work?**
A barcode reader linked to a data parser can decode the information encoded by a PDF417 barcode to be easily readable by humans. The scanner captures the barcode's data, and the data parser processes it to extract specific information, such as date of birth or street name.
### **How can Scanbot SDK help you with parsing from AAMVA documents?**
The Scanbot Barcode Scanner SDK delivers exceptional performance in challenging environments, including damaged or curved barcodes, with a scanning speed of under 0.04 seconds for seamless workflows. Try it now with a [free trial license](https://scanbot.io/trial/).
+
## U.S. Driver's License Scanner
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/data-capture-software/us-drivers-license-scanner/#main)
# U.S. Driver’s License Scanner SDK
Extract data from U.S. Driver’s Licenses as key-value pairs
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
Trusted by
300+
global
industry leaders

rocket\_launchSolution
## Fast, accurate, and secure U.S. driver's license scanning
Expand your mobile or web application with our U.S. driver’s license scanning software. The Scanbot SDK quickly and reliably extracts data from AAMVA PDF417 barcodes on U.S. driver’s licenses, returning plain key-value pairs.
Replace slow, error-prone manual data entry with fast, accurate automatic data extraction. The Scanbot SDK works entirely offline, without any server connections, ensuring reliable scanning performance and strong data security.
checkAvailable for mobile and web development platforms

## Integrate this evening with your framework
## Scan AAMVA data on U.S. Driver’s Licenses
The [PDF417 barcode](https://scanbot.io/barcode-scanner-sdk/pdf417/) on the back of a driver’s license contains a large number of data elements, all of which our SDK can parse and present in a human-readable format. These are the mandatory data elements on AAMVA documents, with the three letters in front representing the data item’s corresponding element ID:
- DCA: Vehicle class(es)
- DCB: Restrictions
- DCD: Additional privileges
- DBA: Expiration date
- DCS: Last name
- DAC: First name
- DAD: Middle name(s)
- DBD: Issue date
- DBB: Date of birth
- DBC: Gender
- DAY: Eye color
- DAD: Height
- DAG: Address: Street name
- DAI: Address: City name
- DAJ: Address: State name
- DAK: Address: Postal code
- DAQ: ID number of the cardholder
- DCF: Document discriminator (unique identifier assigned to the issuance of the document)
- DCG: Country in which the document was issued
- DDE: Indicator that the last name is truncated
- DDF: Indicator that the first name is truncated
- DDG: Indicator that the middle name(s) are truncated
## Ready to get started?
Integrate the Scanbot SDK in less than an hour. Check out our docs, explore our GitHub example projects, or download our demo apps to get started right away.
[Get started](https://scanbot.io/get-started/) [Contact sales](https://scanbot.io/contact-sales/)
## Frequently Asked Questions
### **What is a US driver’s license scanner?**
A US driver’s license scanner is a hardware or software that reads and translates the cardholder’s information stored in the PDF417 barcode found on the back.
The Scanbot US Driver’s License Scanner SDK enables you to accurately scan and extract data as key-value pairs, all on your own device. It operates fully offline, without any connection to a server. Apart from the US driver’s license scanner SDK, we also offers a solution for [German driver’s licenses](https://scanbot.io/data-capture-software/german-drivers-license-scanner/).
### **How does the Scanbot US Driver’s License Scanner SDK work?**
The Scanbot US Driver’s License Scanner SDK allows you to easily and reliably extract personal information using a [barcode parser](https://scanbot.io/blog/drivers-license-barcode-parser/). After scanning the PDF417 barcode using the Barcode Scanner SDK, the raw data is processed by a parser, which converts it into key-value pairs for improved readability and easier backend processing.
### **What is the barcode on a US driver’s license?**
The code on a US driver’s license is a PDF417 barcode. This [2D barcode](https://scanbot.io/glossary/2d-barcode/) is composed of multiple linear barcodes stacked on top of each other. It has a start pattern (left) and an end pattern (right), with the information itself encoded in the middle section.
The American Association of Motor Vehicle Administrators (AAMVA) has standardized both the design and data content of driver's licenses in the US and Canada, including the use of PDF417 barcodes.
### **Can I use my phone to scan my driver’s license?**
Yes. Any mobile device with a camera is suitable for scanning US driver’s licenses. Simply install a driver’s license scanning app or integrate a driver’s license scanner SDK into your own application. Enterprise-grade driver’s license scanning SDKs, such as the Scanbot SDK, can be easily integrated into an app within hours. With its ready-to-use UI components, developers can easily integrate the US Driver’s License Scanner SDK in their own app.
Want to try it out for yourself? Download our [demo app](https://scanbot.io/demo-apps/) or request a [free 7-day trial license](https://scanbot.io/trial/).
### **Does the Scanbot US Driver’s License Scanner SDK need an internet connection?**
No, the SDK doesn’t need an internet connection as is a fully offline software solution. This guarantees that personal data remains secure, with all necessary data privacy measures upheld.
### **What should I consider when choosing a driver’s license scanning software?**
A US Driver’s License Scanner SDK should deliver fast barcode scanning functionalities and accurately extract data for processing by your backend systems. It should increase your efficiency by reducing processing time and minimizing human errors.
Here are some important factors to consider:
**Performance and accuracy**: Make sure the scanning solution is able to scan barcodes quickly and accurately in all conditions. This includes scanning in low-light environments, scanning damaged or blurry barcodes, or scanning barcodes up close or from long distances. It should also extract data accurately, minimizing the risk of errors.
**Compatibility**: Look out for software that works seamlessly with your development environment and is compatible with the devices you plan to use, both mobile or desktop.
**Data privacy**: Since PDF417 codes include personal data, it is important that the scanning software has measures in place that protects sensitive information. The Scanbot US Driver’s License Scanner SDK operates entirely offline, ensuring full data privacy.
**Developer support**: Make sure your software provider offers sufficient support for developers to facilitate smooth integration. With Scanbot SDK, you’ll have access to detailed [documentation](https://docs.scanbot.io/) and Slack and Teams channels for [direct assistance](https://docs.scanbot.io/support/).
**Pricing model**: Look for a pricing model that fits your business needs and scales without extra costs. Scanbot SDK offers an unlimited scanning model with a fixed annual fee, so you can use it without worrying about rising expenses.
### **How do I integrate the Scanbot US Driver’s License Scanner SDK into my app?**
Our US Driver’s License Scanner SDK comes with detailed [documentation](https://docs.scanbot.io/) that takes you through the integration process step by step. The entire integration doesn’t take longer than a few hours. If you need any additional support, we are happy to help you with our [free support channels](https://docs.scanbot.io/support/).
### **Which platforms is the Scanbot US Driver’s License Scanner SDK currently available for?**
Our US Driver’s License Scanner SDK supports development for Native Android and iOS, JavaScript (Web), Flutter, React Native, Cordova, Capacitor / Ionic, Xamarin, and .NET MAUI. Try the Scanbot US Driver’s License Scanner SDK by downloading the [demo app](https://scanbot.io/demo-apps/#data-capture-modules) or requesting a [free trial license](https://scanbot.io/trial/).
+
## Scanbot SDK Partnerships
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/partners/#main)

# Partner with Scanbot SDK
Simplify mobile data capture projects with our enterprise-grade scanning SDKs
Website
First name
\*
Last name
\*
Business email
\*
Company name
\*
Type of partnership
\*Please SelectLicensing partnerTechnology partnerBusiness partner
Please describe your company and what you want to achieve with us.
\*(required)
To get a quote, Scanbot SDK will process and use the information you provide to contact you about our products and to send you the monthly newsletter. You may
unsubscribe from these communications at any time. For more information, please review our
[Privacy Policy.](https://scanbot.io/en/privacy)
Submit
Trusted by
300+
global
industry leaders

assignment\_turned\_inBenefits
## Why partner with Scanbot SDK?
Through the Scanbot SDK Partnership Program, you join the leading edge of scanning innovation. Our solutions make it easy to seamlessly integrate barcode scanning, document scanning, and data extraction functionalities into mobile apps, websites, and hardware. By partnering with us, you can shorten time to value – and grow your revenue.

### Boost revenue with license sales
Grow your business by selling Scanbot SDK licenses and earn a commission on every sale.

### Full developer support
Talk directly to our support engineers and Customer Success Managers on Slack or MS Teams – no ticket required.

### Access our industry network
Tap into our industry connections to unlock new growth opportunities.
Partner Highlight
**Samsung**
and
**Scanbot SDK**
empower joint B2B customers with reliable mobile data capture powered by on-device intelligence. Together, we enhance enterprise solutions across
Samsung’s device portfolio, ensuring seamless performance and efficiency for any business application.
handshakePartnership types
## Partnership opportunities

### Licensing partner
Ideal for value-added resellers, system integrators, and consultants. Expand your product offering and deliver customized data capture solutions by integrating or recommending our SDKs in customer projects.

### Technology partner
Boost your product’s capabilities by embedding our SDKs directly into your platform. Enhance your solutions with fast, reliable scanning and deliver more value to your users.

### Business partner
Increase your market visibility through joint marketing and promotional efforts. Expand your reach alongside us through co-marketing initiatives.
#### Do you have a different kind of partnership in mind? We’re all ears! Let’s build something together.
[Send an email](mailto:partners@scanbot.io)
## Discover featured partners

Accenture UK, a consulting and tech services firm, uses our mobile SDKs to build and streamline enterprise mobile solutions for their clients.

Brodos AG, a leading mobile device and services provider in Germany, uses our mobile SDKs to enhance their device management and Device-as-a-Service solutions for over 11,000 business customers.

We are a GS1-certified solution partner and provide enterprise barcode scanning software that supports GS1 standards to retailers and industrial organizations.
+
## Scanbot SDK Trial
Scanbot SDK has been acquired by Apryse!
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
[Learn more](https://apryse.com/blog/apryse-acquires-scanbot-and-accusoft)
close
[Skip to content](https://scanbot.io/trial/#main)

# Generate a 7-day trial license for your project
Without the trial license, the Scanbot SDK will only run for one minute per session.
Trial license type
App SDK
Web SDK
App Identifier[Learn more](https://scanbot.io/techblog/where-to-find-bundle-id-application-id-package-name/)
about where to find your application identifier
Please enter your app identifier (iOS: “bundle identifier” / Android: “application ID” / Windows: “package name”). Your license will be
bound to this identifier.
Domain
Please enter the domain, where you want to use the Web SDK. Your license will be bound to this domain. If you need more domains please get
in touch.
Company locationEuropeRest of the World
By generating the Trial License Code and using the SDK, I accept the
[Evaluation Agreement](https://scanbot.io/wp-content/uploads/legal/scanbot-sdk-software-evaluation-license-agreement-europe-en-free.pdf)
Generate License
verified
## Great news!
Your 7-day trial license has been generated. You will be automatically redirected to the Trial results page in a few seconds.
Or
[Go to Trial results page](https://scanbot.io/trial/#)
+