> ## 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.

# Serial numbers

> The format of a Satyakod serial: what its 16 characters carry and how to read them.

Every code carries a 16-character serial such as `0021A0512PXK20J9`, often printed in groups of
four (`0021-A051-2PXK-20J9`). It is the same in every code family, and fits GS1 Application
Identifier `(21)`.

## Characters

Serials use Crockford base32: the digits and the letters except I, L, O and U.

```text theme={null}
0123456789ABCDEFGHJKMNPQRSTVWXYZ
```

When reading a serial typed or spoken by a person, treat `O` as `0` and `I` and `L` as `1`, and
ignore hyphens and spaces. Case doesn't matter.

## What the 80 bits carry

Decoded, the 16 characters are an 80-bit number, most significant bit first:

| Bits | Field | Size |
| - | - | - |
| 79–56 | Batch sequence: the number in the batch id (`B-1045` → 1045) | 24 bits |
| 55–32 | Item index in the batch, from 0 | 24 bits |
| 31–0 | Tag: the first 4 bytes of an HMAC-SHA256 signature | 32 bits |

The batch sequence and index are readable by anyone: your systems can tell which batch a serial
belongs to and where it falls in it without a key. The tag can only be made with your workspace's
key, so it is what proves a serial genuine. Checking it needs either Satyakod (online) or the
batch's verification key ([offline](https://docs.satyakod.com/integrations/offline-verification.md)).

A guessed serial has a 1 in 4.3 billion chance of carrying a valid tag, and online checks are rate
limited, so serials can't be guessed in practice.

## Limits

* Up to 16,777,216 codes per batch.
* Serials are never reused: each batch has its own sequence number.


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