Scanner API
The Scanner API provides barcode and QR code scanning on POS devices. Use it to show the camera scanner, subscribe to scan events, or detect available scanner hardware (camera, external, or embedded).
Anchor to Use casesUse cases
- Barcode scanning: Implement barcode scanning for product lookup or inventory management.
- QR codes: Build QR code scanning for customer engagement or loyalty programs.
- Custom workflows: Create scanning workflows that process data and trigger business logic.
- Real-time feedback: Implement real-time scanning feedback with immediate processing.
Supported targets
- pos.
cart. line-item-details. action. render - pos.
customer-details. action. render - pos.
draft-order-details. action. render - pos.
exchange. post. action. render - pos.
home. modal. render - pos.
order-details. action. render - pos.
product-details. action. render - pos.
purchase. post. action. render - pos.
register-details. action. render - pos.
return. post. action. render
Supported targets
- pos.
cart. line-item-details. action. render - pos.
customer-details. action. render - pos.
draft-order-details. action. render - pos.
exchange. post. action. render - pos.
home. modal. render - pos.
order-details. action. render - pos.
product-details. action. render - pos.
purchase. post. action. render - pos.
register-details. action. render - pos.
return. post. action. render
Anchor to PropertiesProperties
The shopify global object provides barcode and QR code scanning capabilities. Access the following properties on shopify to read scan data, control the camera scanner, and detect available scanner hardware.
- Anchor to hideCameraScannerhideCameraScannerhideCameraScanner() => void() => voidrequiredrequired
Hide the camera scanner.
- Anchor to scannerDatascannerDatascannerDataScannerDataScannerDatarequiredrequired
Access current scan data and subscribe to new scan events. Use to receive real-time scan results.
- Anchor to showCameraScannershowCameraScannershowCameraScanner() => void() => voidrequiredrequired
Show the camera scanner.
- Anchor to sourcessourcessourcesScannerSourcesScannerSourcesrequiredrequired
Access available scanner sources on the device. Use to check which scanners are available (camera, external, or embedded).
ScannerData
Represents the scanner interface for accessing scan events and subscription management. Provides real-time access to scanned data through a reactive signal pattern.
- current
Current available scanner sources with subscription support. The `value` property provides current sources, and `subscribe` listens for changes. Use to monitor which scanners are available.
ReadonlySignalLike<ScannerSubscriptionResult>
ReadonlySignalLike
Represents a reactive signal interface that provides both immediate value access and subscription-based updates. Enables real-time synchronization with changing data through the observer pattern.
- subscribe
Subscribes to value changes and calls the provided function whenever the value updates. Returns an unsubscribe function to clean up the subscription. Use to automatically react to changes in the signal's value.
(fn: (value: T) => void) => () => void - value
The current value of the signal. This property provides immediate access to the current value without requiring subscription setup. Use for one-time value checks or initial setup.
T
ScannerSubscriptionResult
Represents the data from a scanner event. Contains the scanned string data and the hardware source that captured the scan.
- data
The string data from the last scanner event received. Contains the scanned barcode, QR code, or other scannable data. Returns `undefined` when no scan data is available. Use to process scanned content and implement scan-based business logic.
string - source
The scanning source from which the scan event came. Returns one of the following scanner types: • `'camera'` - Built-in device camera used for scanning • `'external'` - External scanner hardware connected to the device • `'embedded'` - Embedded scanner hardware built into the device
ScannerSource
ScannerSource
The scanner source the POS device supports.
'camera' | 'external' | 'embedded'ScannerSources
Represents the available scanner hardware sources on the device. Provides reactive access to the list of scanners that can be used for scanning operations.
- current
Current available scanner sources with subscription support. The `value` property provides current sources, and `subscribe` listens for changes. Use to monitor which scanners are available.
ReadonlySignalLike<ScannerSource[]>
Anchor to Best practicesBest practices
- Deduplicate scan events: The subscription can fire multiple times for the same code, including stale data from a previous scan when re-subscribing after a component remount. Track the last processed value and skip duplicates.
- Manage camera lifecycle: Call
hideCameraScanner()before showing results or a loading state. CallshowCameraScanner()when the user is ready to scan again. - Clean up subscriptions: Call the unsubscribe function returned by
subscribe()in your cleanup or unmount handler to prevent memory leaks. - Validate scanned data: Check the format of scanned data before processing. Show clear feedback for invalid codes, network errors, and unsupported formats.
Anchor to LimitationsLimitations
- The Scanner API is only available in action (modal) targets.
showCameraScanner()displays a full-screen system camera overlay. It doesn't return a value or promise, so there's no way to detect if the camera activated successfully.- Calling
scannerData.current.subscribe()may immediately emit the value from a previous scan because unsubscribing does not clear the signal.