# Batch scanning many QR codes

> Three workflows scale past a handful of scans: a hardware 2D imager in keyboard-wedge mode typing each result into a spreadsheet row, a phone scanner app with a batch mode, or posting images to a decode API in a loop. Whichever you pick, deduplicate results and timestamp every scan.

Source: https://useqr.app/docs/scanning/batch-scanning-many-qr-codes · Last reviewed 2026-08-21 · UseQR is free forever, no signup.

---

## Pick the workflow that matches the volume

The phone-camera flow (scan, banner, tap) is built for one code at a time. Past a
dozen scans it collapses under its own taps. Three workflows replace it, in ascending
order of setup effort:

### 1. Keyboard-wedge imager into a spreadsheet

A [hardware 2D imager](/docs/scanning/hardware-barcode-scanners-and-qr) in USB-HID
mode enumerates as a keyboard and *types* each decoded payload, with a configurable
Enter suffix. Setup is: open a spreadsheet, click a cell, scan. Each pull of the
trigger fills a row and drops to the next: **hundreds of scans an hour with zero
software written**. This is the default answer for goods-in, asset audits and
[inventory management](/docs/ecommerce/qr-code-inventory-management). Configure the
Enter suffix (and the keyboard layout, which silently garbles symbols when mismatched)
via the scanner's configuration barcodes.

### 2. Phone app with batch mode

Dedicated scanner apps offer a continuous mode that appends each detected code to a
list without stopping, then exports CSV. Slower and less rugged than an imager but
zero extra hardware, fine for occasional stocktakes and event check-ins in the
low hundreds. This is one of the few workflows that justifies installing a scanner
app at all, per [do you need a scanner app](/docs/scanning/do-you-need-a-qr-scanner-app).

### 3. A decode API in a loop

When the codes arrive as **images** (photos of received pallets, scanned paperwork,
screenshots) post them to a decode endpoint instead of re-photographing them:

```bash
for f in scans/*.jpg; do
  curl -s -F "file=@$f" https://useqr.app/api/v1/decode >> decoded.jsonl
done
```

Each response is JSON: `{"count": n, "codes": [{"text": "...", "format": "QRCode"}]}`.
The endpoint reads **up to 8 codes per image** (10 MB limit per image), so one photo
of several labels yields several results, useful in combination with the layout
advice in [scanning multiple codes in one frame](/docs/scanning/scanning-multiple-codes-in-one-frame).
Wiring this into real pipelines is covered in
[decoding QR codes programmatically](/docs/developers/decode-a-qr-code-programmatically).

## Dedup and timestamps: the unglamorous 80%

Every batch workflow produces the same two data-quality problems.

**Duplicates.** The same label gets scanned twice: a re-picked item, a nervous
double-trigger. Decide *before* the count what a duplicate means: in inventory it is
noise (dedupe on payload, keep the first), at event check-in it is signal (a second
scan of one ticket is exactly what you want to catch). Deduping in a spreadsheet is a
`COUNTIF` on the payload column.

**Timestamps.** A wedge scanner types only the payload, no time, no station. And the
classic spreadsheet trap: `NOW()` recalculates on every edit, so pasting it beside
each scan silently rewrites history. Use a sheet script that stamps the row on edit,
an app that exports its own timestamps, or the API loop above (add `date -Iseconds`
per line). Record **payload, ISO 8601 timestamp, station/operator**: the minimum
that makes a count auditable.

## Design the codes for batch scanning

Batch throughput is set when the codes are *made*, not scanned. Short payloads (an
ID, not a 200-character URL) produce low-version codes that decode faster and
tolerate wear, per [scan latency](/docs/scanning/scan-latency-why-some-codes-scan-instantly).
Generate them consistently with the [bulk generator](/bulk) or the workflow in
[making QR codes in bulk](/docs/how-to/how-to-make-qr-codes-in-bulk), and print label
runs with the [sticker sheet](/sticker-sheet) tool.

## FAQ

### How do I scan many QR codes into a spreadsheet?
Use a 2D imager in keyboard-wedge mode. It enumerates as a USB keyboard and types each decoded payload followed by Enter, so with the cursor in a cell each trigger pull fills a row. No software or integration is needed.

### Can a phone batch-scan QR codes?
Yes, dedicated scanner apps offer a continuous batch mode that appends every detected code to a list and exports CSV. It is slower than a hardware imager but needs no extra equipment, which suits occasional stocktakes and small events.

### How do I decode a folder of QR code images?
Loop them through a decode API: post each image and collect the JSON responses. A single request can return multiple codes from one image, so photos containing several labels decode in one pass.

### How should I handle duplicate scans?
Decide what a duplicate means first. For inventory, deduplicate on the payload and keep the earliest timestamp. For ticketing, a repeated payload is the fraud signal you are looking for, so log every occurrence with its own timestamp and station.

## Try it

- https://useqr.app/scan
- https://useqr.app/bulk
- https://useqr.app/sticker-sheet
