> ## Documentation Index
> Fetch the complete documentation index at: https://docs.satyakod.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Factory and warehouse scanners

> Serialise parts for your own line scanners, MES and ERP: serial-only codes, printing, reading and checking without internet.

Use this when your own systems do the scanning: a fixed-mount reader on a packing line, handheld
scanners at receiving, or a vision system at end-of-line inspection. Each unit gets a unique,
signed serial your systems can read and check, with or without a connection to Satyakod.

```mermaid theme={null}
flowchart LR
  A[New batch: offline,<br/>Code 128 or DataMatrix] --> B[Sign]
  B --> C[Print on the line<br/>ZPL to Zebra]
  C --> D[Line scanner reads<br/>the 16-character serial]
  D --> E[Your MES checks it<br/>with the batch key]
  E --> F[(Your records)]
  E -. when online .-> G[Upload scans to Satyakod]
```

## 1. Create the batch

In **Batches → New batch**:

1. Pick the product. A GTIN isn't needed for serial-only codes.

2. **Where codes are checked**: *Offline*, or *Online and offline* if the same units will also be
   checked by consumers or partners.

3. **Code symbology**:

   | Code | Best for |
   | - | - |
   | **Code 128 · serial only** | Linear scanners and laser readers; long, narrow labels |
   | **DataMatrix · serial only** | Small parts and direct part marking; any 2D imager |
   | **QR Code · serial only** | Camera-based readers and phones running your own app |
   | **GS1 DataMatrix** | When your systems or customers expect GS1 data (GTIN, lot, dates) |

4. Lot, dates and sale regions are kept with the batch in Satyakod. Serial-only codes don't
   carry them: your systems look them up from the batch, which the serial identifies.

## 2. Print

Send the job to the print line's Zebra printer from the batch, or download the **Printer job**
(ZPL). Each serial-only label carries the code, the product name, the serial in groups of four for
people to read, and the batch id. The **Serial list** (CSV) has every serial with its index.

> [!TIP]
>
> Print a few labels from the **Proof sheet** first and scan them with the line's reader at line speed
> before the full run.

## 3. Read

Configure the scanner to send just the decoded text, as most do by default (keyboard wedge, serial
port or the reader's own API), with your usual suffix such as Enter. It sends the 16-character
serial, for example `0021A0512PXK20J9`.

From the serial alone, without a key, your system can read:

* the **batch**: the first 24 bits are the number in the batch id (1045 for `B-1045`);
* the **item index** in the batch: the next 24 bits.

See [Serial numbers](https://docs.satyakod.com/concepts/serial-numbers.md) for the format.

## 4. Check

To confirm a serial is genuine without internet, an admin downloads the batch's
**verification key** and your system checks each serial with it:
[Offline verification](https://docs.satyakod.com/integrations/offline-verification.md), with examples in Python, Node.js and C#.
The serial list works too, as a lookup of issued serials.

## 5. Sync (optional)

Upload the scans when you're online with [`POST /v1/verify/offline`](https://docs.satyakod.com/api-reference/verify-offline).
They appear in **Scans**, feed clone detection and alerts, and count in the monthly report, each
at the time it was scanned.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.