Skip to content

GS1 Resolver

GS1 Resolver

The GS1 resolver is the public read surface for a DPP. The canonical URLs look like this:

https://qr3.app/01/{GTIN}
https://qr3.app/01/{GTIN}/10/{LOT}
https://qr3.app/01/{GTIN}/21/{SERIAL}
https://qr3.app/01/{GTIN}/10/{LOT}/21/{SERIAL}

When creating a DPP (POST /v1/dpp), the following rules apply: serial and lot must use safe GS1 path segments only: A-Z, a-z, 0-9, ., _, ~, -, with a length of 1 to 20 characters. Reserved URL separators are rejected so the canonical link stays resolvable.

Content negotiation

The same resolver returns different representations depending on the Accept header:

AcceptResponse
text/htmlconsumer HTML
application/ld+jsonJSON-LD
application/jsonraw DPP JSON
application/linkset+jsonlinkset with alternates

Public routes

  • GET /01/... is the canonical resolver
  • GET /dpp/:gtin/:serial?lot=... is an HTML alias
  • GET /v1/dpp/:id/qr.svg serves SVG
  • GET /v1/dpp/:id/qr.png serves PNG
  • GET /v1/dpp/:id/qr.pdf serves PDF
  • GET /v1/dpp/:id/qr.eps serves EPS

QR asset visibility follows the DPP status:

  • live is public without authentication
  • draft and archived require a valid auth context plus workspace access
  • Invalid auth returns 401
  • Non-visible or foreign-workspace passports return 404

Fallback

Without a local match, the GS1 resolver redirects with 307 to https://id.gs1.org. For the GTIN alias /dpp/:gtin/:serial?lot=..., this also applies to an invalid GTIN check digit: gtin, lot, and serial are encoded individually as URL path segments, including reserved separators. The redirect confirms neither GTIN validity nor data availability at GS1.

Exception: if a decoded identifier is only . or .., the alias without a local match responds with 422, application/problem+json, type https://docs.qr3.app/errors/validation, and the affected field in errors[], without a redirect. URL parsers normalize these segments even in encoded form. Values such as LOT.1 and ... remain eligible for delegation. This exception concerns only this alias without a match; creation validation, the canonical resolver, and existing matches remain unchanged.

GET /dpp/{GTIN}/UNKNOWN?lot=LOT%2F1
307 Location: https://id.gs1.org/01/{GTIN}/10/LOT%2F1/21/UNKNOWN
GET /dpp/{GTIN}/UNKNOWN?lot=.
422 Content-Type: application/problem+json

Practical flow

  1. Create the DPP in the dashboard.
  2. Use the GS1 URI as the QR target.
  3. Let consuming systems request the representation they need via Accept.