ONE PRODUCT · ONE IDENTITY DATASHEET · DEMO · DRAFT 0.1ENQUIRE →
Concept

A short code that identifies one item, for good

Q-UPID stands for Qualified Unique Part Identifier. Every part gets one code. The code carries no meaning of its own, so it never has to change when a supplier, description or ERP system changes. It checks itself, so a mistyped code is caught before it reaches a database.

The code is printed as text and as a 2D code. Scanning it opens this page. The page asks an open API for the record and confirms the code is genuine.

  1. Scan the code. The 2D code holds a web address.
  2. The datasheet opens. It shows the item, its identifier and its status.
  3. The check runs. The page recomputes the check character. VERIFIED appears only if it matches.
No meaning insideLetters and digits are issued in sequence or at random, never derived from the description.
PersistentThe same code stays with the item through renames, mergers and system migrations.
Self-checkingA check character catches every single-character error, every swap of two characters and every repeated-pair error such as AA typed as BB.
OpenThe format, the validator and the API are meant to be published so anyone can verify a code.
Format

Anatomy of Q-AC4F82M-3

Q
Prefix. Marks a Q-UPID.
AC4F82M
Identity. 7 characters from a 27-symbol alphabet.
3
Check character, GF(27).

The alphabet is . It leaves out 0, 5, B, I, O, Q, X, Y and Z, which are easily confused with other characters when read aloud or printed small.

Seven characters from 27 symbols give distinct identities.

Working check

Recompute the check character

Each character has a value (its position in the alphabet, from 0) and a weight. Values are combined as numbers in GF(27), the field with 27 elements: write a value as three base-3 digits, add two values digit by digit with no carry, and multiply by a weight with the rule in the reference code below. The seven identity weights are 17, 13, 23, 15, 5, 9 and 3, and the check character has weight 1. The check character is chosen so the weighted total is zero. Field arithmetic is used instead of ordinary arithmetic mod 27 so that no swap or repeated-pair error can cancel out.

Open API

Ask for the record yourself

These are the planned public routes. In this demonstration they run inside your browser against three sample records, so you can see the exact request and response. No server is involved.


  

  

Planned base address: https://api.q-upid.com/v1 (not live yet).

Provenance

A history that shows tampering

Each event stores a fingerprint (SHA-256) of its own content plus the fingerprint of the event before it. Change any past event and every later fingerprint stops matching. The fingerprints below are computed in your browser now.

This demo chains the events but does not yet sign them. Signing with a registry key is the planned next step.

Reference implementation

The validator in a few lines

JavaScript
Python
Error checking

What the check catches

It catches every single-character error, every swap of two characters wherever they sit (including a swap with the check character) and every repeated-pair error such as AA typed as BB. These are the most common typing and reading mistakes.

One check character cannot catch everything. About 1 in 26 errors that change two unrelated characters passes the check (3.85%), and about 1 in 27 errors that change three characters passes (3.70%). These rates come from testing every such error pattern.

The records, history and API on this page are samples. Nothing here is a live registry.