GS1 Digital Link conformance
What this platform implements from the GS1 Digital Link: URI Syntax standard and the GS1-conformant resolver requirements — stated requirement by requirement, and, for §8 compression, proven below by running our test vectors through the exact library we ship, live in your browser.
Resolver redirect conformance
Our resolver at gtin.codes is measured against the GS1 Digital Link redirect requirements (§7). Each row cites the requirement id and states exactly what the resolver does. Supported is implemented and tested; Deferred marks a spec MAY we have consciously not built yet. These behaviours are verified by our resolver's automated conformance suite on every commit (they run server-side, so — unlike the compression checks below — they can't execute in your browser).
| Requirement | Status | What our resolver does |
|---|---|---|
REQ-001 Support GET, HEAD and OPTIONS | Supported | GET/HEAD resolve; OPTIONS answers the CORS preflight |
REQ-002 Serve over HTTPS | Supported | TLS terminated at the edge on the gtin.codes custom domain |
REQ-003 CORS header on redirects | Supported | Access-Control-Allow-Origin: * on every response, redirects included |
REQ-010 · 012 307 redirect with an absolute Location | Supported | Temporary Redirect to the stored, absolute target URL |
REQ-011 · 061 No 200 error body; unknown key → 404 | Supported | An unknown GTIN returns 404 carrying a hosted landing page, never a 200 error |
REQ-020 · 021 Path identifiers are the lookup key, never auto-appended | Supported | GTIN/lot/serial resolve the record; only the query string is forwarded |
REQ-030 Query-string forwarding | Supported | The entire incoming query string is passed on to the target |
REQ-031 linkType forwarded, not stripped | Supported | linkType rides through to the target after it selects the link |
REQ-032 Per-target query suppression | Deferred (MAY) | We always forward; suppression is a spec MAY we have not yet implemented |
REQ-033 · 034 Merge onto a target that already has a query; last value wins | Supported | Incoming pairs merge with & and override the template on a key collision |
REQ-040 · 041 Link header advertising available links | Supported | Each link carries its href, rel (linkType) and a human-readable title |
REQ-042 anchor equals the request URI | Supported | Every advertised link is anchored to the canonical request URI |
REQ-043 owl:sameAs only for a compressed request | Supported | A compressed scan additionally exposes its uncompressed URI as owl:sameAs |
REQ-050 · 051 linkType selection with default fallback | Supported | A matching linkType redirects; otherwise the product's default link |
REQ-052 linkType=all is a list; unavailable item → 406 | Supported | application/linkset+json for a known item; 406 when the item is unknown |
REQ-060 Invalid syntax → 400, no redirect | Supported | A bad GTIN or check digit returns 400 with a pointer to our parser |
REQ-062 Optional 303 / 410 responses | Deferred (MAY) | Not implemented; unknown keys use 404 (REQ-061) instead |
URI syntax & §8 compression
| Capability | Status | Scope | Where |
|---|---|---|---|
| Uncompressed Digital Link URIs — parse & build | Supported | AIs 01, 22, 10, 21 in the path; numeric AIs as query attributes | resolver · tools · app |
| Fully-compressed URIs (§8) — parse | Supported | AI vocabulary below; precise error for anything else | resolver · tools |
| Partially-compressed URIs (§8) — parse | Supported | /01/{gtin14}/{compressed} | resolver · tools |
| Compressed URI generation (§8) | Supported | Fully-compressed form only | tools · app |
| AI vocabulary in compressed data | Partial by design | 01, 10, 11, 13, 15, 17, 21, 22 — other AIs are rejected with a named error, never mis-read | all |
| Resolver: compressed scans resolve in place | Supported | Same redirect/linkset/fallback outcomes as the uncompressed twin | resolver |
| Resolver: linkset (?linkType=all) | Supported | application/linkset+json | resolver |
| Resolver: malformed-URI hint | Supported | 400 with a pointer to this site's parser | resolver |
Live test results
The vectors below were generated with GS1's own reference implementation (GS1DigitalLinkToolkit.js). Our encoder must match its output byte for byte, and our decoder must read both compressed forms back to the identical canonical URI. Your browser just ran every check against the same code our resolver and tools use — each one is listed as its own row.
Running…
| Check | Result |
|---|
What §8 compression is
A compressed Digital Link packs the same GS1 Application Identifiers into a short base64url path segment, so the URI is shorter and the QR code carrying it is often more compact (not guaranteed for every value). Compression changes the URI's spelling, not its meaning: a conformant reader extracts identical data from either form. Try both in the builder and parser.
Our compressed-data vocabulary is the set of AIs this platform manages: GTIN (01), CPV (22), lot (10), serial (21) and the date AIs 11/13/15/17. A compressed URI containing any other AI is rejected with an error naming that AI — never silently mis-read.