


A 1.5 MB local service answers plain HTTP on the user's own machine. Any web app in the browser can scan through it. No plug-in, no applet, no SDK you are locked into.
curl http://127.0.0.1:18625/scanners
copy

1
2
3


Browsers removed the plug-ins, applets and ActiveX controls that used to reach a scanner. We did not replace them with another thing that lives inside the page.
The MSI installs for the signed in user, without administrator rights. From then on every internal web app on that machine talks to the same local endpoint. No second application for anyone to keep up to date.
Our web component is one way to call it. Anything else running in that browser is another.
$ curl http://127.0.0.1:18625/scanners [ { "id": "brother-ads-2800w", "name": "Brother ADS-2800W", "source": "TWAIN" } ]
The contract is five endpoints on the loopback address, not a client library you inherit. Change the framework, or drop our web component entirely, and the same calls still work.
/statusis the service running
GET/readyone verdict, service and licence
GET/scannersdevices this machine can see
POST/scanner-optionswhat that device supports
POST/scanone scan
The dialog only ever offers what the connected scanner actually supports. The plans stack, so each one carries everything below it.
The web component is a custom element. Drop it in the page, listen for one event, and you have the file. Everything else is optional.
full integration guide at scanbridge.dev/install →import '@scanner/web' <scanner-widget license-key="SB-…" // issued by us, bound to your domain file-type="pdf" lang="en"> </scanner-widget> const scanner = document.querySelector('scanner-widget') scanner.addEventListener('saved', e => { upload(e.detail.blob) }) scanner.addEventListener('closed', onClosed) scanner.show()
// event.detail, for file-type="pdf" { "fileType": "pdf", "blob": Blob // application/pdf } // for png or jpg, one entry per page { "fileType": "png", "pages": [ { id, name, url, mimeType, blob } ] }
Two ways it gets onto the machine, and the widget handles both. Neither of them ends with a support ticket.

The widget notices the service is not answering and offers the installer itself. Download, install, then Verify. No link to send, nothing to explain.
One MSI, pushed to your users the usual way. Those users never see the dialog on the left at all.
Nothing is uploaded to make scanning work. What your application does with the file afterwards is your decision, not ours.
You set the licence key once, in your own bundle. The helper activates it quietly on the first scan.
The licence carries an allow-list of origins. A key copied out of your bundle does not work on somebody else's host.
Without a valid verdict the scan flow does not open. There is no client-side switch that lets it through anyway.
An activated machine keeps working without a connection until the licence really expires. A revocation on the server always beats the cached answer.
The browser is not the limit. The operating system is. Better you find that out here than three meetings into a purchase order.
One licence covers one production application and every internal user inside it. Nobody counts heads. Prices in USD.
These come up before the paperwork starts, every time. If yours is not here, the address is at the bottom of this page.
Yes. Every key we issue covers localhost alongside the production domain you name. Additional live domains, staging included, are arranged with us.
Yes. The widget is a plain custom element, so anything that renders HTML can mount it: React, Angular, Vue, or a server rendered page. Ready made snippets for each are in the install docs.
You talk to us and we issue it, bound to your domain. A trial key is the same procedure without the invoice.
As many as you need. The licence covers one application, not a count of machines or users, so the installer goes on every workstation that has a scanner, for each user who scans there.
No. A standard user can run it, because it installs for that user rather than for the whole machine. Who runs it is your policy, not our requirement.
No. You set license-key once in your page. The service activates that machine silently at the first scan.
The rule never changes: the browser and the service run on the same Windows machine, and that machine has to see the scanner as a TWAIN or WIA device. If your remote session forwards the scanner that far, we find it, because we ask the driver and never the hardware. If you are planning a terminal server rollout, talk to us before you buy.
Tell us the domain the licence should run on and what you are building. A trial key is the same request, without the invoice.