One thesis: GS1 Digital Link is not a new identifier and not a URL shortener for products — it is a second spelling of the exact AI map an element string carries, as an HTTP path with a fixed grammar, so the same identity can ride a POS lane as FNC1-delimited bytes and ride the web as a link, losslessly, in both directions.
The primary source is free: the GS1 Digital Link URI Syntax, version 1.6.0, ratified March 2025, downloadable from ref.gs1.org, royalty-free to implement under the GS1 IP Policy. Everything below is that grammar, worked.
The path grammar
A Digital Link URI has four zones, each with a rule:
https://id.gs1.org/01/00016000275270/10/ABC123/21/XYZ009?17=270331
└────┬───┘ └──────┬───────┘ └────────┬────────┘ └───┬───┘
domain primary key key qualifiers data
- Domain — any HTTPS host. The standard deliberately does not privilege one;
id.gs1.orgis GS1's canonical resolver, not a requirement of the syntax. The domain is a routing decision, never part of the identity. - Primary key — one AI and its value as the first path pair:
/01/{GTIN-14}here;/00/{SSCC},/414/{GLN}and the other key AIs for their schemes. The GTIN travels in its 14-digit form in the canonical URI. - Key qualifiers — AIs that narrow the key to a finer grain, as further path pairs, in a hierarchy the standard fixes: for a GTIN, CPV
/22/, then lot/10/, then serial/21/. The order is not stylistic; a URI with qualifiers out of order is invalid, which is what makes two independently-minted URIs for the same instance comparable byte for byte. - Data attributes — AIs that describe rather than identify (expiry
17, weights, prices) go in the query string, because two URIs that differ only in the query still name the same thing. Identity in the path, description after the?— the grammar encodes that distinction structurally.
There is also a compressed form — the same information, shorter path, defined by the companion compression spec — which resolve and generate treat as one more spelling of the same map.
The round trip is the proof
The claim "same AI map, two carriers" is checkable, so check it:
$ barcoding resolve ']C101000160002752701727033110ABC123<GS>21XYZ009' --json
{"scheme":"gs1.element-string","canonical":"00016000275270","check":"mod10 pass",
"ai":{"01":"00016000275270","17":"2027-03-31","10":"ABC123","21":"XYZ009"},
"digital_link":"https://id.gs1.org/01/00016000275270/10/ABC123/21/XYZ009?17=270331"}
$ barcoding resolve 'https://id.gs1.org/01/00016000275270/10/ABC123/21/XYZ009?17=270331' --json
{"scheme":"gs1.digital-link","canonical":"00016000275270","check":"mod10 pass",
"ai":{"01":"00016000275270","17":"2027-03-31","10":"ABC123","21":"XYZ009"}, … }
Element string in, AI map plus equivalent URI out; that URI back in, the identical AI map out. diff on the two ai objects is empty. That is the entire semantic content of Digital Link, demonstrated: one map, two syntaxes, mechanical translation both ways. (The write side honors the same law — generate emits either spelling from the map, and resolve(generate(x)) === x is a gate, not a slogan.)
Worth stating precisely because it is so often stated wrong: an element string in a QR code does not become web-resolvable by existing, and a Digital Link URI in a QR code does not stop being a GS1 payload by being a URL. A phone camera resolves the URI form because it is an HTTP URL; a POS lane or any GS1-aware parser reads the same URI and extracts the GTIN because the grammar is fixed. Which form a brand encodes is a real decision with different winners at the lane, on the phone, and on the line — a decision that belongs to the GTIN owner, and one this arc treats separately.
The generalization above it
Digital Link is also an instance of something bigger, and 2024 made that official: ISO/IEC 18975 standardizes identifier resolution over HTTP with structured paths, and Digital Link conforms to its approach. Read that direction of travel: identifier-in-a-path, resolved over the web is now an ISO-blessed pattern, not a GS1 idiosyncrasy — which is exactly what licenses a registry like this one to serve non-GS1 schemes through the same shaped door. A VIN in a path resolves on the same architecture a GTIN does; where the GS1 standard governs, the behavior is conformant to it, and where the registry extends past GS1's keys, the extension is explicit, never smuggled in under the standard's name.
What resolution adds
Everything above is syntax — parseable offline, no server involved, which is why resolve needs no network to do it. What the URI earns by being HTTP is the layer above syntax: point it at a live resolver and the response is not one redirect but a linkset — the typed list of every door this identifier opens, product page, traceability record, recall status, each link a machine-readable relation. That layer has its own standard (the GS1-Conformant Resolver standard, ratified January 2026), its own RFC (9264), and its own rules about what an honest linkset carries — and it is the next post in the arc.
The reference page for this grammar is /schemes/dl. The check that costs you ninety seconds: take any GS1 payload out of your own systems — a case-label scan, a 2D pack code — and run npx barcoding.dev resolve on it twice, once as scanned and once as the Digital Link URI it prints. If your current pipeline stores those two forms as different products, you now know exactly where next quarter's reconciliation bug lives.
Keys open the network half of the verb set. Get an API key — say what arrives at your door, and the provisioning order follows the list.
We answer in writing. We take at most five conversations a month, only when you ask for one, and only after you already have the written read.