GS1 Digital Link Conformance
Daily automated run of the official GS1 Digital Link Resolver test suite against the Closient resolver. We don't reimplement the tests — we run GS1's own JavaScript and report exactly what it says.
26 / 29 tests passed (96.3%)
Last run:
· 7.25s
· Release dev
· Suite vendored
Environment: Testing (www.closient.dev)
Tested URI: https://www.closient.com/01/09506000164908
Per-category breakdown
Redirects
Transport
Link Types
CORS & Methods
URI Validation
Linkset Content
Resolver Description
30-day pass history
10 runs in the last 30 days. Bar height represents the share of tests passing.
Per-test detail (29)
| ID | Test | Status | Message |
|---|---|---|---|
isURL |
Not listed as a conformance criterion but the DL URI must be a valid URL | pass | Given GS1 Digital Link URI is a valid URL |
validDL |
Given input must be a GS1 Digital Link URI | pass | Given input is a valid GS1 Digital Link URI |
isHttps |
SHALL support HTTP Over TLS (HTTPS) | pass | Given GS1 Digital Link URI defines HTTPS as its scheme |
plausibleDL |
Following GS1 Digital Link: URI syntax, we can check whether a URL plausibly is, or definitely is not, a DL URI | pass | URL under test plausibly is a GS1 Digital Link URI (uncompressed) |
basicWalkUp |
For each supported primary key, a resolver SHALL support all its key qualifiers. | pass | Resolver handles unknown qualifers by walking up the tree |
tlsOK |
SHALL support HTTP Over TLS (HTTPS) | pass | Confirmed that server supports HTTP over TLS |
rdFile |
SHALL provide a resolver description file at /.well-known/gs1resolver | pass | Resolver description file found with at least minimum required data and is valid against the official GS1 schema |
httpVersion |
SHALL support HTTP 1.1 (or higher) | pass | Server at www.closient.com supports HTTP 1.1 |
corsCheck |
SHALL support CORS | pass | CORS headers detected |
linkOnRedirect |
SHOULD expose the direct link to the linkset in an HTTP Link header when redirecting. | pass | Link to the linkset detected when redirecting |
legacyLinkHeaders |
The inclusion of all possible links in the HTTP Link header was deprecated in version 1.0.0 of the GS1-Conformant resolver standard, February 2024 | pass | No unnecessary links found in HTTP Link header |
methodsCheck |
SHALL support HTTP 1.1 (or higher) GET, HEAD and OPTIONS requests. | pass | GET, HEAD an OPTIONS methods declared to be supported |
reportWith400 |
SHALL extract and syntactically validate the URI and report errors with an HTTP response code of 400 | pass | Non-conformant GS1 Digital Link URI correctly reported with 400 error |
noErrorWith200 |
A GS1 conformant resolver SHALL NOT use a 200 OK response code with a resource that indicates an error condition | pass | Error was correctly reported with a non-200 OK response code of HTTP 400 |
trailingSlash |
SHOULD tolerate trailing slashes at the end of GS1 Digital Link URIs, i.e. the resolver SHOULD NOT fail if one is present | warn | Resolver responds differently with or without a trailing slash |
qsPassedOn |
By default, SHALL pass on all key=value pairs in the query string of the request URI (if present) when redirecting | pass | Query passed on when redirecting |
ltLinksetNoRedirect |
On 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 | No redirect with linkType set to linkset |
ltAcceptHeader |
On 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 | Setting HTTP Accept header to application/linkset+json did not result in a redirect |
validLinkset |
Linkset must be valid according to published JSON schema | pass | Linkset validates against the published schema |
linksetJsonldCheck |
When requesting the linkset the HTTP response headers SHOULD include a Link header pointing to a JSON-LD context file | pass | Link to JSON-LD context file found |
declaredContentType |
If the HTTP Accept header is application/linkset+json, the resolver SHALL return the linkset serialised as JSON as defined by RFC9264 | pass | Content type for the linkset retrieved from the resolver matches the requested application/linkset+json |
defaultLinkExists |
For 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 | Default link found |
singleDefaulLink |
For 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 | Single default link found |
defaultTarget |
One 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. | fail | Resolver does not redirect to the default as expected |
loForgs1pip |
If the requested type of link is available, the resolver SHALL redirect to it | pass | Resolver correctly redirects to https://www.closient.com/pip/09506000164908/ for gs1:pip |
loForgs1productInfo |
If the requested type of link is available, the resolver SHALL redirect to it | pass | Resolver correctly redirects to https://www.closient.com/pip/09506000164908/ for gs1:productInfo |
loForgs1masterData |
If the requested type of link is available, the resolver SHALL redirect to it | pass | Resolver correctly redirects to https://www.closient.com/01/09506000164908 for gs1:masterData |
linkTypesDefined |
Link types SHOULD be given as a URI defined in the GS1 Web vocabulary | warn | gs1:productInfo is not a ratified GS1 link type |
specificLinkTypeNotFound |
If the requested type of link is not available, the resolver SHALL return a 404 Not Found message. | pass | Requesting a specific link type for which no link is available resulted in a 404 Not Found response |
Test it yourself
Every claim on this page can be checked from any terminal — no account, no API key. The commands below run against www.closient.dev using GS1's demo GTIN 09506000164908.
HTML redirect (what a consumer scan does)
curl -I https://www.closient.dev/01/09506000164908
Returns the 30x redirect plus RFC 8288 Link headers, including rel="linkset".
Linkset via content negotiation
curl -s -H "Accept: application/linkset+json" https://www.closient.dev/01/09506000164908
Returns the RFC 9264 linkset document instead of redirecting.
Linkset via query string
curl -s "https://www.closient.dev/01/09506000164908?linkType=linkset"
Same linkset, requested with ?linkType=linkset — no Accept header needed.
JSON-LD structured data
curl -s -H "Accept: application/ld+json" https://www.closient.dev/01/09506000164908
Returns a schema.org + GS1 Web Vocabulary JSON-LD document for the product.
Resolver description file
curl -s https://www.closient.dev/.well-known/gs1resolver
The GS1-required description of this resolver's capabilities.
Sample responses
Rendered live by this resolver for GTIN 09506000164908 — the same documents the commands above return.
Linkset (application/linkset+json)
{
"linkset": [
{
"anchor": "https://www.closient.dev/01/09506000164908",
"itemDescription": "GS1 Digital Link Conformance Demo Product",
"https://gs1.org/voc/defaultLink": [
{
"href": "https://www.closient.dev/pip/09506000164908/",
"title": "GS1 Digital Link Conformance Demo Product"
}
],
"https://gs1.org/voc/pip": [
{
"href": "https://www.closient.dev/pip/09506000164908/",
"title": "GS1 Digital Link Conformance Demo Product"
}
],
"https://gs1.org/voc/productInfo": [
{
"href": "https://www.closient.dev/pip/09506000164908/",
"title": "GS1 Digital Link Conformance Demo Product"
}
],
"https://gs1.org/voc/masterData": [
{
"href": "https://www.closient.dev/01/09506000164908",
"type": "application/json",
"title": "Master data (JSON)"
}
]
}
]
}
JSON-LD (application/ld+json)
{
"@context": {
"@vocab": "https://schema.org/",
"schema": "https://schema.org/",
"gs1": "https://gs1.org/voc/"
},
"@type": "Product",
"@id": "https://www.closient.dev/01/09506000164908",
"url": "https://www.closient.dev/01/09506000164908",
"gtin": "09506000164908",
"name": "GS1 Digital Link Conformance Demo Product",
"description": "Canonical GS1 example GTIN used by the official GS1 Digital Link Resolver conformance test suite. Auto-created so the public conformance report always has a catalogued target.",
"brand": {
"@type": "Brand",
"name": "GS1 Conformance Demo"
}
}
How other resolvers compare
Facts verified 2026-06-11 — verify yourself with the commands above, pointed at each resolver. Notably, id.orcascan.com does not return application/linkset+json.
| Capability | Closient | id.gs1.org | id.gs1uk.org | id.orcascan.com |
|---|---|---|---|---|
| Accept: application/linkset+json returns an RFC 9264 linkset |
Yes
200 with Content-Type: application/linkset+json
|
Yes
200 with Content-Type: application/linkset+json
|
Untested
No publicly resolvable demo GTIN found; tested GTINs return 404
|
No
application/linkset+json is not returned
|
| Accept: application/ld+json returns JSON-LD |
Yes
200 with Content-Type: application/ld+json
|
Partial
200, but labelled Content-Type: application/json
|
Untested
No publicly resolvable demo GTIN found
|
No
Not observed
|
| RFC 8288 Link headers on redirect, incl. rel="linkset" |
Yes
Full Link header set; rel="linkset" points at the linkset
|
Partial
Rich Link header (CURIE rels like gs1:pip) but no rel="linkset" observed
|
Untested
No publicly resolvable demo GTIN found
|
No
Not observed
|
| Public, continuously updated conformance results page |
Yes
This page — the official GS1 suite, run daily
|
No
Not published
|
No
Not published
|
No
Not published
|
| /.well-known/gs1resolver resolver description file |
Yes
200, JSON description of this resolver
|
Yes
200 with Content-Type: application/ld+json
|
Partial
File present but contains unedited GS1 Resolver CE template placeholders (resolverRoot https://id.mydomain.org, contact “My Organisation”)
|
No
404
|
Test source: gs1/GS1DL-resolver-testsuite — the unmodified JavaScript published by GS1 at https://ref.gs1.org/test-suites/resolver/. We run it in a headless browser against our resolver once a day and persist the result. No tests are reimplemented.
Want to run the suite against any GS1 Digital Link URI right now? Try the interactive test page.