Create an account

Give us an email address and we send you a code. That is the whole sign-up, and there is no password. Your trial clock does not start when you sign up; it starts the first time one of your installations activates successfully.

Tell us where your app lives

Add the address your app is served from — scheme, host and port, not a page path. Every website you add counts as live once you subscribe, including staging and preview sites. Localhost and 127.0.0.1 need no entry and are never billed; they still run on your account’s trial or subscription.

https://app.example.com — one entry covers every browser that loads it

Add the package

One dependency. It carries the decoder, its worker and its WebAssembly, so you can serve all decoder assets with your app. License checks still contact the license service.

npm i @scanlatch/sdk

Pass in your key and scan

Copy your key from your account. Create one instance, initialize it once, then hand it images or a camera. Tear it down when your screen goes away.

scan.tsTypeScript
import { createBrowserSdk } from '@scanlatch/sdk';

const sdk = createBrowserSdk({ key: accountKey });
await sdk.initialize();

const decoder = await sdk.createDecoder();
const results = await decoder.decode(image);

// a live camera works off the same instance
const scanner = sdk.createCameraScanner(video, { onDetections: show });
await scanner.start();

sdk.destroy();

How it behaves in the real world.

It keeps scanning when the network does not

Once a browser installation has completed one successful paid check, it carries on scanning when a later check cannot connect, times out, or meets a temporary outage. A trial always needs a connection. Unexpected protocol responses and signed denials block scanning; offline use also requires your app to make the SDK assets available locally.

No licensing request per barcode

The SDK checks in when it initializes. Paid checks then run about once a day during use; trials refresh short online leases throughout the trial. Decoding itself never leaves the browser, and we never receive what you scanned.

Give it somewhere to remember itself

The SDK keeps a small record in browser storage so an installation recognizes itself next time. If that record is cleared, the installation has to activate again, and on a paid plan it can be counted as a new one.

A billed unit is a browser installation

We count installations, not people and not hardware. One phone that loads your app in two different browsers is two installations; the same browser reopened tomorrow is still one.

This is a license, not a lock

The checks run in the browser, so someone who edits your app’s code can work around them. We built this for people who want to pay for what they use.

Start your free trial and try it on your own phone.

Two weeks, every supported format, no card.