GS1 Digital Link Resolver Conformance Tester

Runs GS1's own resolver conformance test suite against any GS1 Digital Link resolver. The suite is loaded unchanged from its published source; this site only replaces the browser page and the helper script around it. Every verdict is the suite's own. The same check is available as an API whose findings are RFC 9457 problem objects.

Try , . A run takes a few seconds and sends HEAD, GET and OPTIONS requests to the resolver. Limit: 10 runs per 10 minutes per client.

Why this exists

GS1's hosted test page sends its HTTP probes through a small helper script on a third-party domain, because a browser cannot inspect redirects itself. When that helper is unavailable the page can no longer measure anything. This service answers those probes with a server-side HTTP client instead, redirects not followed, and leaves the suite's logic untouched. It is the same runner the OpenEPCIS resolver is tested with on every release.

API

Anonymous, rate-limited, CORS-open. One call runs the whole suite and returns the report.

Request

POST /api/conformance/resolver with a JSON body naming the digitalLink, or GET /api/conformance/resolver?dl=….

curl -sS https://ref.openepcis.org/api/conformance/resolver \
  -H 'Content-Type: application/json' \
  -d '{"digitalLink": "https://id.epc.is/01/09521000001428/21/WJ-2024-00142"}'

Report

Status 200, media type application/vnd.openepcis.resolver-conformance+json. results lists every test the suite ran with its verdict. problems repeats each warning and failure as an RFC 9457 Problem Details object: type dereferences to the test's entry in the test catalogue, title is the suite's message, detail the criterion it quotes, instance the Digital Link under test, and severity is error for a failure and warning for a warning. The verdict is pass, warn, fail or incomplete.

{
  "subject": "https://id.example/01/09506000134352",
  "verdict": "fail",
  "summary": { "pass": 30, "warn": 1, "fail": 2, "skip": 0, "total": 33 },
  "suite": { "name": "GS1 Digital Link resolver conformance test suite",
             "source": "https://github.com/gs1/GS1DL-resolver-testsuite", "commit": "32597c1", "date": "2026-08-07" },
  "startedAt": "2026-10-30T09:12:44.102Z", "durationMs": 3597, "timedOut": false,
  "results": [
    { "id": "corsCheck", "status": "fail", "criterion": "SHALL support CORS",
      "message": "CORS headers not detected", "type": "https://ref.openepcis.org/conformance/resolver/tests#corsCheck" },
    …
  ],
  "problems": [
    { "type": "https://ref.openepcis.org/conformance/resolver/tests#corsCheck",
      "title": "CORS headers not detected",
      "detail": "SHALL support CORS",
      "instance": "https://id.example/01/09506000134352",
      "severity": "error", "test": "corsCheck" }
  ]
}

Fail by status code

Add failOn=fail or failOn=warn and a verdict at that level answers 422 as application/problem+json, with the findings under errors. A CI step can then fail on the status code alone.

curl -sS --fail-with-body \
  'https://ref.openepcis.org/api/conformance/resolver?failOn=fail&dl=https%3A%2F%2Fid.epc.is%2F01%2F09521000001428%2F21%2FWJ-2024-00142'
HTTP/1.1 422 Unprocessable Content
Content-Type: application/problem+json

{
  "type": "https://ref.openepcis.org/conformance/resolver#not-conformant",
  "title": "Resolver not conformant",
  "status": 422,
  "detail": "2 of 33 tests failed for https://id.example/01/09506000134352.",
  "instance": "https://id.example/01/09506000134352",
  "verdict": "fail",
  "summary": { "pass": 30, "warn": 1, "fail": 2, "skip": 0, "total": 33 },
  "errors": [ … the same problems as in the report … ]
}

Problem types

Every response that is not a report is an application/problem+json document with one of these types.

StatusTypeMeaning
403https://ref.openepcis.org/conformance/resolver#target-not-publicThe host resolves to a private, loopback or link-local address. This service tests public resolvers only.
422https://ref.openepcis.org/conformance/resolver#not-conformantOnly with failOn: the verdict reached the requested level. The findings are under errors.
429https://ref.openepcis.org/conformance/resolver#rate-limitedToo many runs from one client, too many in total, or too many at once. Retry-After says when to come back.
502https://ref.openepcis.org/conformance/resolver#runner-failedThe suite could not be started or produced no report. Logged on the server.
503https://ref.openepcis.org/conformance/resolver#runner-unavailableThe headless suite is not installed on this server.
504https://ref.openepcis.org/conformance/resolver#incompleteOnly with failOn: the suite did not finish in time. Without failOn the report comes back with verdict incomplete.

Limits: 10 runs per 10 minutes per client address, 120 per 10 minutes in total, 2 at once. A run is given 60 seconds.

Test catalogue

28 tests, read from the suite at commit 32597c1. The type URI of every finding resolves to one of them.

Browse the tests