Skip to main content

Scanner API
APIs

The Scanner API enables an extension to access scanner data and available scanning sources supported by the device.

Supporting targets

required

Provides read-only access to scanner data and allows subscribing to new scan events.

required

Provides read-only access to the available scanner sources on the POS device.

Was this section helpful?

Examples of receiving updates from the Scanner API

Anchor to example-conditional-scanner-source-rendering-exampleConditional scanner source rendering example
Was this section helpful?

Conditional scanner source rendering example

jsx

import {render} from 'preact';
import {useState, useEffect} from 'preact/hooks';

export default async () => {
render(<Extension />, document.body);
};

const Extension = () => {
const [scanData, setScanData] = useState('');
const [scanSource, setScanSource] = useState('');
const [hasCameraScanner, setHasCameraScanner] = useState(false);
const [hasExternalScanner, setHasExternalScanner] = useState(false);

useEffect(() => {
const unsubscribeData = shopify.scanner.scannerData.current.subscribe((result) => {
setScanData(result.data || '');
setScanSource(result.source || '');
});

const unsubscribeSources = shopify.scanner.sources.current.subscribe((sources) => {
setHasCameraScanner(sources.includes('camera'));
setHasExternalScanner(sources.includes('external'));
});

return () => {
unsubscribeData();
unsubscribeSources();
};
}, []);

return (
<s-page heading="Scanner Example">
<s-stack direction="block">
<s-text>Scanned data: {scanData}</s-text>
<s-text>Scanned data source: {scanSource}</s-text>
{hasCameraScanner && (
<s-text>Camera scanner is available</s-text>
)}
{hasExternalScanner && (
<s-text>External scanner is available</s-text>
)}
</s-stack>
</s-page>
);
};