Hold a barcode or QR code steady inside the frame. Results appear automatically.
Click, drag & drop, or paste an image
JPG, PNG, GIF, WebP, BMP — up to 15MB
No barcodes scanned yet
Use the camera or upload an image to start scanning
Scanning…
ℹ️ About Barcode Scanner
Barcode scanning turns the bars, spaces, or square modules in a camera frame or image file back into the encoded value. Linear (1D) barcodes such as UPC, EAN, Code 128, and Code 39 encode data along one axis; 2D symbols such as QR Code, Data Matrix, Aztec, and PDF417 use a matrix pattern and carry more data with built-in error correction. This scanner decodes both families entirely in your browser — no upload, no server round-trip. For retail and supply-chain identifiers, GS1 documents the common barcode families and data rules in its barcode standards and General Specifications.
How to scan
- Camera: point your device's camera at the code. The scanner reads continuously and reports the value the moment it locks on — no shutter button needed.
- Image file: drop in, paste, or pick a photo or screenshot. The tool first tries to find a code anywhere in the picture automatically.
- Drag-to-select a region: if auto-detection misses (busy background, several codes, glare, or a tiny symbol), drag a box directly over the barcode in the preview to decode just that area.
Supported barcode types
The browser engine (a JavaScript port of the ZXing "zebra crossing" library) decodes a wide range of symbologies:
- 2D / matrix: QR Code, Micro QR, Data Matrix, Aztec, PDF417 — see ISO/IEC 18004 (QR) and ISO/IEC 16022 (Data Matrix).
- Retail 1D: EAN-13, EAN-8, UPC-A, UPC-E — see ISO/IEC 15420.
- Industrial 1D: Code 128, Code 39, Code 93, Codabar, ITF (Interleaved 2 of 5), and GS1 DataBar (RSS-14 / Expanded) — see ISO/IEC 15417 (Code 128).
By default every format is tried at once. Narrow the list in Scanner Settings if you know the symbology — it speeds up decoding and avoids look-alike misreads.
Examples
- EAN-13 product code: scanning
4006381333931returns the 13-digit retail identifier printed below the bars. - UPC-A product code: scanning
036000291452returns the 12-digit identifier common on North American packaging. - Code 128 label: scanning
SHIP-2026-000184returns the alphanumeric shipment or asset value. - QR code: scanning a Wi-Fi or URL QR returns the embedded text, e.g.
https://onlinecybertools.com.
Tips for reliable decoding
- Include the quiet zone: when dragging a region, leave a little white space on each side of the code — most symbologies require it.
- Avoid glare and blur: flat, evenly lit, in-focus images decode best; curved packaging and motion blur are the usual culprits when a scan fails.
- Use Try harder: enabled by default, it spends extra effort on rotated, low-contrast, or partially damaged codes.
- Decoding is not a registry lookup: a decoded UPC/EAN identifies the number in the barcode; it does not query GS1 or any product database.
Browser scanner vs. API
The on-page scanner (camera, image upload, and drag-to-select) runs the ZXing engine in your browser and covers the full list above, including Data Matrix, Aztec, PDF417, and Micro QR. A separate, optional endpoint — POST /api/tools/osint/barcode-scanner — decodes an uploaded image server-side with the zbar engine for automation and scripts. The server engine covers a slightly smaller set: EAN-13/8, UPC-A/E, ISBN-10/13, Code 128/39/93, Codabar, ITF, GS1 DataBar (and Expanded), QR Code, and SQ Code. Data Matrix, Aztec, PDF417, MaxiCode, and Micro QR are browser-only. The decode is offloaded to a remote network worker when one is available, with a local fallback otherwise.
Camera and image privacy
Browser scanning is local. When you use the camera or the in-page image scanner, frames and images are decoded entirely in your browser with the bundled ZXing engine — nothing is uploaded, and the page's scanner never calls the server API. Camera access starts only after you grant browser permission. The opt-in /api/tools/osint/barcode-scanner endpoint is the one exception: an image you explicitly send to it is uploaded so it can be decoded server-side. Avoid scanning sensitive badges, IDs, or tickets on shared devices, and revoke the site's camera permission when you are done.
API Usage Example:
Decode a barcode/QR from an image server-side (zbar). Upload a file, or post a base64-encoded image as JSON. Optional formats narrows the symbologies tried.
# multipart upload (field "image")
curl -X POST /api/tools/osint/barcode-scanner \
-F "[email protected]" \
-F "formats=qr_code,code_128"
# or JSON with a base64 (or data: URI) image
curl -X POST /api/tools/osint/barcode-scanner \
-H "Content-Type: application/json" \
-d '{"image":"<base64-encoded-image>","formats":["ean_13","qr_code"]}'