Standards

Conformant, and open about how.

A QR code on a label has to work with every scanner, till and app — not just ours. PaqLink builds to the published GS1 standards and documents exactly which parts it implements.

GS1 Digital Link URI syntax

  • Uncompressed URIs only — the form retail point-of-sale systems require.
  • GTIN as 14 digits, zero-padded, check digit verified before anything is generated.
  • Qualifiers in canonical order: consumer product variant (22) → batch/lot (10) → serial (21).
  • Attributes as query parameters — expiry (17) and other date AIs validated as real dates, measures and counts validated to their formats.
  • Character-set enforcement (GS1 CSET 82) on every text value.

GS1-Conformant Resolver

  • 307 redirects to the default destination, forwarding the original AI parameters.
  • Linksets (RFC 9264) on request, and a Link header pointing to them on every redirect.
  • linkType routing — ask for gs1:sustainabilityInfo and get that link, not the default.
  • Resolver description at /.well-known/gs1resolver.
  • Correct error semantics: 400 for malformed URIs, 404 for unknown GTINs, CORS enabled.

Link types you can publish

Every product carries a default link (its product page or e-label). You can attach these additional GS1 link types to the same code, and any conformant client can request them directly.

gs1:pip (product information — default) gs1:sustainabilityInfo (Sustainability & recycling)gs1:instructions (Usage instructions)gs1:recallStatus (Recall status)gs1:recipeInfo (Recipes)gs1:promotion (Promotion)gs1:review (Reviews)

Printing specifications

Exports are sized in real millimetres. Module size (X-dimension) is kept within the GS1 general specifications window for retail point-of-sale scanning — 0.396 mm minimum, 0.495 mm target, 0.990 mm maximum — with the four-module quiet zone included in the file. PNG exports are 600 dpi.

Testing

The URI syntax implementation is shared between the app, the resolver and the free tools, and every copy is tested against the same set of vectors. We run GS1's public resolver conformance test suite against the live resolver before every resolver release, and publish the results here.

Live conformance results

27 of 27 tests pass — run 28 August 2026 against https://paqlink.com/01/… with suite revision 32597c1. Zero failures, zero warnings, including the optional (SHOULD) checks. Raw request/response logs are kept with the source.

Show all 27 tests
TestConformance statement (from the suite)Result
isURLNot listed as a conformance criterion but the DL URI must be a valid URLPASS
validDLGiven input must be a GS1 Digital Link URIPASS
isHttpsSHALL support HTTP Over TLS (HTTPS)PASS
plausibleDLFollowing GS1 Digital Link: URI syntax, we can check whether a URL plausibly is, or definitely is not, a DL URIPASS
basicWalkUpFor each supported primary key, a resolver SHALL support all its key qualifiers.PASS
tlsOKSHALL support HTTP Over TLS (HTTPS)PASS
rdFileSHALL provide a resolver description file at /.well-known/gs1resolverPASS
httpVersionSHALL support HTTP 1.1 (or higher)PASS
corsCheckSHALL support CORSPASS
methodsCheckSHALL support HTTP 1.1 (or higher) GET, HEAD and OPTIONS requests.PASS
reportWith400SHALL extract and syntactically validate the URI and report errors with an HTTP response code of 400PASS
noErrorWith200A GS1 conformant resolver SHALL NOT use a 200 OK response code with a resource that indicates an error conditionPASS
trailingSlashSHOULD tolerate trailing slashes at the end of GS1 Digital Link URIs, i.e. the resolver SHOULD NOT fail if one is presentPASS
legacyLinkHeadersThe inclusion of all possible links in the HTTP Link header was deprecated in version 1.0.0 of the GS1-Conformant resolver standard, February 2024PASS
qsPassedOnBy default, SHALL pass on all key=value pairs in the query string of the request URI (if present) when redirectingPASS
ltLinksetNoRedirectOn receiving a request for the linkset, by setting the linkType parameter to linkset, the resolver SHALL NOT redirect the query and SHALL return the linkset. PASS
ltAcceptHeaderOn receiving a request for the linkset, by setting the HTTP Accept Header to application/linkset+json, the resolver SHALL NOT redirect the query and SHALL return the linkset. PASS
validLinksetLinkset must be valid according to published JSON schemaPASS
linksetJsonldCheckWhen requesting the linkset the HTTP response headers SHOULD include a Link header pointing to a JSON-LD context filePASS
declaredContentTypeIf the HTTP Accept header is application/linkset+json, the resolver SHALL return the linkset serialised as JSON as defined by RFC9264PASS
defaultLinkExistsFor each identified entity there SHALL be exactly one default link, the list of link types for which SHALL include gs1:defaultLink. This default is defined without any of the optional attributes, that is, it SHALL include a title, but SHALL NOT include other attributes.PASS
loForgs1pipIf the requested type of link is available, the resolver SHALL redirect to itPASS
loForgs1epilIf the requested type of link is available, the resolver SHALL redirect to itPASS
singleDefaulLinkFor each identified entity there SHALL be exactly one default link, the list of link types for which SHALL include gs1:defaultLink. This default is defined without any of the optional attributes, that is, it SHALL include a title, but SHALL NOT include other attributes.PASS
defaultTargetOne of the links SHALL be recognised by the resolver as the default and the resolver SHALL redirect to that URL unless there is information supplied within the query to the contrary.PASS
linkTypesDefinedLink types SHOULD be given as a URI defined in the GS1 Web vocabularyPASS
specificLinkTypeNotFoundIf the requested type of link is not available, the resolver SHALL return a 404 Not Found message.PASS

What conformance means — and doesn't

GS1® is a registered trademark of GS1 AISBL. QR Code® is a registered trademark of Denso Wave Incorporated.

See it for yourself.

Paste any QR's contents into the checker, or generate a conformant code free.

Free tools