This document specifies the VSC Interoperability Toolkit: the normative API surface, data transformation rules, conformance classes, and test-suite architecture that enable any compliant implementation to translate between existing supply chain event data (principally [[EPCIS20]] / [[ISO19987]]) and verifiable, DID-anchored attestations built on [[VC-DATA-MODEL]] and [[DID-CORE]].
The toolkit is the second major deliverable of the Verifiable Supply Chain Community Group. It builds directly on the requirements established in [[VSC-REQUIREMENTS]] and on the prior art of the W3C CCG [[TRACE-INTEROP]] Final Report (December 2024). Implementers who satisfy the conformance criteria of this specification can demonstrate interoperability through the VSC Conformance Test Suite defined herein.
This document is a Community Group Draft produced by the Verifiable Supply Chain Community Group. It is not a W3C Standard and is not on the W3C Standards Track. It may be updated, replaced, or obsoleted at any time.
The specification is versioned at 0.1 (pre-interoperability-event). Version history is tracked in the CHANGELOG. Feedback is welcome via the GitHub issue tracker or the public-vsc mailing list. See for contribution guidelines.
This draft references [[TRACE-INTEROP]], which achieved W3C CCG Final Report status in December 2024 and represents the closest published prior art. VSC extends that work with EPCIS-specific transformation rules, sector-specific conformance profiles, and a multi-format proof strategy.
This section is non-normative.
The [[VSC-REQUIREMENTS]] document established that global supply chains face three structural gaps: fragmentation of event data formats, absence of cryptographic verifiability, and growing regulatory pressure from [[DSCSA]], [[EUDR]], [[EU-DPP]], and [[CBAM]]. The present specification addresses the fragmentation gap by providing a standardized, implementable bridge between the dominant supply chain event standard ([[EPCIS20]]) and the W3C Verifiable Credentials ecosystem.
The VSC Interoperability Toolkit ("the Toolkit") comprises three interlocking components:
The VSC Toolkit is intentionally downstream of and compatible with:
The key words MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, SHOULD NOT, RECOMMENDED, NOT RECOMMENDED, MAY, and OPTIONAL are to be interpreted as described in [[RFC2119]] and [[RFC8174]] when, and only when, they appear in all capitals.
This specification defines four conformance classes. An implementation declares which class(es) it conforms to; each class has its own mandatory test subset in the VSC Conformance Test Suite.
issue
request, generates a signed [=Verifiable Credential=], and
returns it. A VSC Issuer MUST implement the
POST /credentials/issue endpoint as specified in
and MUST support at least one
proof format listed in .
verify
request and returns a structured verification result. A VSC
Verifier MUST implement the POST /credentials/verify
and POST /presentations/verify endpoints as specified
in .
A single software system MAY simultaneously conform to multiple conformance classes. For example, a "VSC Broker" that translates, issues, and verifies credentials would conform to VSC-MAPPER, VSC-ISSUER, and VSC-VERIFIER.
Terms defined in [[VSC-REQUIREMENTS]] are used here with their established meanings. Additional toolkit-specific terms follow.
credentialSubject encapsulates the data of one [[EPCIS20]]
event and whose structure satisfies the VSC event schema for that
event type. A VSC Credential is produced by applying the
[=EPCIS-to-VC Mapping=] to a valid [[EPCIS20]] event document.
credentialSubject of a [=VSC Credential=].
PASS, FAIL, or SKIP).
This section is non-normative.
The Toolkit is positioned as an interoperability layer between existing supply chain systems and the W3C Verifiable Credentials ecosystem. The three principal components and their interactions are illustrated below.
┌─────────────────────────────────────────────────────────┐
│ EXISTING SUPPLY CHAIN SYSTEMS │
│ ERP · WMS · EPCIS Repository · Logistics Platform │
└──────────────────────┬──────────────────────────────────┘
│ EPCIS 2.0 JSON-LD / XML
▼
┌────────────────────────────────────────────────────────┐
│ VSC TRANSLATION API (§5) │
│ POST /epcis/translate → VSC Credential (JSON-LD) │
│ POST /credentials/issue → Signed VSC Credential │
│ POST /credentials/verify→ Verification Result │
│ POST /presentations/verify→Presentation Result │
│ GET /epcis/extract ← EPCIS 2.0 re-extraction │
└──────────┬─────────────────────────────────────────────┘
│
┌───────┴───────────────────────┐
│ EPCIS-VC MAPPING RULES (§6) │
│ Field map · type coercion │
│ CBV→VC vocab · round-trip │
└───────┬───────────────────────┘
│
┌───────┴───────────────────────┐
│ PROOF LAYER (§7) │
│ EdDSA (eddsa-rdfc-2022) │
│ ECDSA (ecdsa-rdfc-2019) │
│ VC-JWT (ES256/ES384) │
│ SD-JWT (selective disclose) │
└───────────────────────────────┘
│
┌───────┴───────────────────────┐
│ VSC CONFORMANCE TEST SUITE │
│ (§8) │
│ Conformance · Interop │
│ Positive · Negative │
│ Round-trip fidelity │
└───────────────────────────────┘
The Toolkit supports three deployment models. All are normatively equivalent; the API surface is the same in each.
The VSC Translation API is a profile of the [[VC-API]] (W3C CCG)
with additional EPCIS-specific endpoints. It is defined as an
[[OPENAPI]] 3.1.0 document (normative YAML artefact, maintained
separately as vsc-api.yaml in the repository).
This section specifies the normative behaviour of each endpoint.
All VSC Translation API endpoints MUST be protected. Implementations MUST support OAuth 2.0 Client Credentials Grant (RFC 6749 §4.4) as the baseline authorization mechanism, consistent with [[TRACE-INTEROP]]. Implementations SHOULD additionally support HTTP Message Signatures (RFC 9421) for machine-to-machine scenarios where OAuth infrastructure is unavailable.
Implementations MUST NOT expose endpoints over plain HTTP (non-TLS). TLS 1.2 or later is REQUIRED on all VSC Translation API connections.
The API MUST be versioned. The base path MUST include the major version number conforming to [[SEMVER]]:
Breaking changes MUST increment the major version. Non-breaking
additions MUST increment the minor version. The current version
of this specification defines the v1 API surface.
The following endpoints are specific to the VSC Toolkit and extend [[VC-API]].
A [=VSC Mapper=] implementing this endpoint MUST accept a single
[[EPCIS20]] event document in JSON-LD format and return an
unsigned [=VSC Credential=] whose credentialSubject
is constructed according to the [=EPCIS-to-VC Mapping=] rules
in .
Request body — A single [[EPCIS20]] event object.
The request MUST include a Content-Type: application/json
header. EPCIS XML submissions MUST first be converted to JSON-LD
per [[EPCIS20]] §9.8 before submission; XML-to-JSON-LD conversion
is out of scope for this endpoint.
Success response — HTTP 200 OK
with Content-Type: application/vc+ld+json. The body
is an unsigned VSC Credential conformant with [[VC-DATA-MODEL]].
Error responses — see .
Specific errors for this endpoint include:
VSC_ERR_UNKNOWN_EVENT_TYPE (unsupported event type),
VSC_ERR_MISSING_REQUIRED_FIELD (mandatory EPCIS field absent),
and VSC_ERR_INVALID_EPC_SYNTAX (malformed EPC URI).
// REQUEST — ObjectEvent (commissioning) POST /vsc/v1/epcis/translate Content-Type: application/json Authorization: Bearer <token> { "@context": ["https://ref.gs1.org/standards/epcis/epcis-context.jsonld"], "type": "ObjectEvent", "eventTime": "2026-04-15T09:00:00.000Z", "eventTimeZoneOffset": "+00:00", "epcList": ["https://id.gs1.org/01/09506000134376/21/12345"], "action": "ADD", "bizStep": "https://ref.gs1.org/cbv/BizStep-commissioning", "disposition": "https://ref.gs1.org/cbv/Disp-active", "readPoint": {"id": "https://id.gs1.org/414/9506000000000"}, "bizLocation": {"id": "https://id.gs1.org/414/9506000000000"} } // RESPONSE — Unsigned VSC Credential HTTP/1.1 200 OK Content-Type: application/vc+ld+json { "@context": [ "https://www.w3.org/ns/credentials/v2", "https://w3c-cg.github.io/vsc/contexts/v1" ], "type": ["VerifiableCredential", "VSCObjectEvent"], "issuer": "did:web:ISSUER_DID_PLACEHOLDER", "validFrom": "2026-04-15T09:00:00Z", "credentialSubject": { "epcisEventType": "ObjectEvent", "eventTime": "2026-04-15T09:00:00.000Z", "epcList": ["https://id.gs1.org/01/09506000134376/21/12345"], "action": "ADD", "bizStep": "https://ref.gs1.org/cbv/BizStep-commissioning", "disposition": "https://ref.gs1.org/cbv/Disp-active", "readPoint": "https://id.gs1.org/414/9506000000000", "bizLocation": "https://id.gs1.org/414/9506000000000" } }
A [=VSC Mapper=] implementing this endpoint MUST apply the
[=VC-to-EPCIS Mapping=] rules and return a valid [[EPCIS20]] event
document. The extracted document MUST satisfy [[Round-Trip Fidelity]]
for any credential produced by /epcis/translate.
If the submitted credential is signed, the implementation
SHOULD validate the proof before extraction. If proof validation
fails, the implementation SHOULD return
VSC_ERR_INVALID_PROOF unless the caller has included
"skipProofValidation": true in an optional
options request object.
A [=VSC Issuer=] implementing this endpoint MUST conform to the
[[VC-API]] POST /credentials/issue behaviour, with the
following VSC-specific constraints:
credential object
that is a valid unsigned VSC Credential (output of
/epcis/translate or manually constructed).
options object. The
following options are defined:
proofFormat (string, REQUIRED) — one of
"eddsa-rdfc-2022", "ecdsa-rdfc-2019",
"jwt", or "sd-jwt"
(see ).credentialStatus (boolean, OPTIONAL, default true)
— if true, the issuer MUST add a
credentialStatus entry using [[VC-BITSTRING-STATUS]].selectiveDisclosureFields (array of strings, OPTIONAL)
— field paths within credentialSubject that
MUST be made individually disclosable. Only applicable when
proofFormat is "sd-jwt".issuer in the credential MUST be a [[DID-CORE]]
URI whose DID document is publicly resolvable and contains a
verification method matching the proof's key material.
VSC-Proof-Format identifying the proof format
used, to support automated test harness detection.
A [=VSC Verifier=] MUST conform to the [[VC-API]] verification behaviour and additionally:
"VSCObjectEvent").
credentialStatus using [[VC-BITSTRING-STATUS]]
if present. A credential with a revoked status MUST be returned
as failed with error code VSC_ERR_CREDENTIAL_REVOKED.
VerificationResult as defined
in .
{
"verified": true | false,
"checks": ["proof", "status", "expiry", "schema"],
"warnings": [],
"errors": [
{
"code": "VSC_ERR_*",
"message": "Human-readable description",
"field": "credentialSubject.bizStep" // optional field pointer
}
],
"vscProfile": "pharmaceuticals-dscsa" // if a conformance profile was applied
}
Implementations MUST expose a discovery endpoint that returns a
[[JSON-SCHEMA]]-validated VSCConfiguration object.
Minimum required fields:
{
"vscVersion": "0.1",
"conformanceClasses": ["VSC-MAPPER", "VSC-ISSUER", "VSC-VERIFIER"],
"supportedEpcisEventTypes": [
"ObjectEvent", "AggregationEvent", "TransformationEvent",
"TransactionEvent", "AssociationEvent"
],
"supportedProofFormats": ["eddsa-rdfc-2022", "jwt"],
"supportedProfiles": ["base", "pharmaceuticals-dscsa"],
"didMethods": ["did:web", "did:key"],
"statusListSupport": true,
"translationEndpoints": {
"forward": "/vsc/v1/epcis/translate",
"reverse": "/vsc/v1/epcis/extract"
}
}
This section specifies the normative field-level mapping between [[EPCIS20]] event documents and [=VSC Credential=] documents. All rules apply to both the [=EPCIS-to-VC Mapping=] (forward) and the [=VC-to-EPCIS Mapping=] (reverse) unless stated otherwise.
The [=EPCIS-to-VC Mapping=] MUST add the following
@context entries to every produced credential, in
this order:
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://w3c-cg.github.io/vsc/contexts/v1",
"https://ref.gs1.org/standards/epcis/epcis-context.jsonld"
]
The EPCIS JSON-LD context MUST be the last entry to allow VSC terms to shadow any conflicting EPCIS terms.
The produced credential's type array MUST contain
"VerifiableCredential" as its first element and a
VSC event type string as its second element. The VSC event type
strings are:
| EPCIS 2.0 event type | VSC type string |
|---|---|
ObjectEvent | VSCObjectEvent |
AggregationEvent | VSCAggregationEvent |
TransformationEvent | VSCTransformationEvent |
TransactionEvent | VSCTransactionEvent |
AssociationEvent | VSCAssociationEvent |
The EPCIS eventTime field MUST be mapped to the
credential's validFrom property using
xsd:dateTimeStamp format
(YYYY-MM-DDTHH:MM:SS.sssZ).
The EPCIS recordTime field, if present, MUST be
preserved in credentialSubject.recordTime.
EPC values in epcList, inputEPCList,
outputEPCList, childEPCs, and
parentID MUST be expressed as [[GS1-DIGITALLINK]]
URIs where a GS1 identifier scheme applies. URN-format EPCs
(e.g., urn:epc:id:sgtin:...) SHOULD be converted
to their equivalent Digital Link URI form during the forward mapping.
The original URN SHOULD be preserved as a
credentialSubject.sourceEpcUrn extension property.
The bizStep and disposition fields
MUST use [[CBV20]] URI values
(e.g., https://ref.gs1.org/cbv/BizStep-shipping)
in both forward and reverse mappings. Short-form CBV code
strings (e.g., "shipping") MUST be expanded to
full URIs during forward mapping.
For any valid [[EPCIS20]] event document E, the
composition vcToEpcis(epcisToVc(E)) MUST produce a
document E' such that for every mandatory [[EPCIS20]]
field f: E[f] == E'[f] (value equality
after URI normalization). The [=VSC Test Harness=] MUST verify
this property for all five event types using the round-trip
test vectors in .
The following rules supplement the general rules for event-type-specific
fields. Fields not listed are passed through unchanged into
credentialSubject using their EPCIS JSON-LD property names.
| Event type | Key EPCIS fields | Mapping notes |
|---|---|---|
ObjectEvent |
epcList, action, bizStep, disposition, readPoint, bizLocation, sensorElementList |
action MUST be preserved verbatim ("ADD", "OBSERVE", or "DELETE").
sensorElementList, if present, MUST be preserved as a structured array in credentialSubject.
|
AggregationEvent |
parentID, childEPCs, childQuantityList, action |
parentID MUST be mapped per MAP-G4 (Digital Link URI).
The parent–child relationship MUST be preserved in credentialSubject.aggregation.
|
TransformationEvent |
inputEPCList, outputEPCList, inputQuantityList, outputQuantityList, transformationID |
transformationID MUST be used as credentialSubject.id if present,
enabling cross-enterprise matching of the same transformation event.
|
TransactionEvent |
bizTransactionList, epcList, sourceList, destinationList |
bizTransactionList entries MUST be preserved as an array in
credentialSubject.businessTransactions.
sourceList / destinationList parties SHOULD be expressed
as [[DID-CORE]] URIs where a DID is known; GLN-based [[GS1-DIGITALLINK]] URIs are
the fallback.
|
AssociationEvent |
parentID, childEPCs, childQuantityList |
For IoT device associations, the parentID SHOULD be the DID of the
device or contain a reference to the device's DID document.
|
To support [=Event Chain=] construction (VSC-REQUIREMENTS REQ-F4),
the VSC Translation API MUST accept an optional
predecessorCredentialId property in the
/epcis/translate request body. When provided, this
value MUST be included in the produced credential as:
"credentialSubject": {
...
"vscPredecessor": {
"id": "https://example.com/credentials/abc123",
"digestSRI": "sha256-BASE64URLENCODE(sha256(predecessorCredentialBytes))"
}
}
The digestSRI MUST use the
Subresource Integrity
hash format. Verifiers MUST check this digest when reconstructing
an event chain.
VSC implementations MUST support at least one of the mandatory proof formats below. Implementations MAY additionally support optional formats. All cryptosuites referenced are defined by W3C Recommendations (May 2025) or Candidate Recommendations.
| Proof format | Specification | Class requirement | Notes |
|---|---|---|---|
eddsa-rdfc-2022 |
[[VC-DI-EDDSA]] | REQUIRED for VSC-ISSUER baseline | Ed25519 / Ed448 over canonicalized JSON-LD (RDFC-1.0). This is the mandatory baseline for the VSC Conformance Test Suite, consistent with [[TRACE-INTEROP]]. |
ecdsa-rdfc-2019 |
[[VC-DI-ECDSA]] | RECOMMENDED for P-256 / P-384 key holders | ECDSA over JSON-LD. Common in enterprise PKI environments. |
VC-JWT (ES256 / ES384) |
[[VC-JOSE-COSE]], [[RFC7515]] | RECOMMENDED for REST/OpenID Connect integrations | JWT-secured VCs. Preferred by implementers with existing OAuth/OIDC infrastructure. [[RFC9052]] COSE MAY also be used. |
| SD-JWT | [[SD-JWT]], [[VC-JOSE-COSE]] | REQUIRED for profiles with selective disclosure obligations | Selective Disclosure JWT. Mandatory when a [=Conformance Profile=] requires per-field selective disclosure (e.g., EU-DPP profile). See [[SD-JWT]] for disclosure frame construction. |
BBS+ (bbs-2023) |
[[VC-DI]] BBS Cryptosuites (W3C CR) | OPTIONAL (currently W3C Candidate Recommendation) | Enables unlinkable selective disclosure proofs. Implementations SHOULD plan for adoption once the underlying IETF BBS signature scheme is finalized. |
The [=VSC Test Harness=] MUST test at minimum eddsa-rdfc-2022
proof generation and verification. Test vectors for other proof
formats are provided as optional test categories.
Profiles constrain the base specification for specific industry contexts. An implementation may claim conformance to one or more profiles in addition to a base conformance class. Profile-specific test vectors are defined in separate annexes of the VSC Conformance Test Suite.
vsc-base)
The base profile requires all five EPCIS event types,
eddsa-rdfc-2022 proof format, Bitstring Status List
revocation, and [[DID-WEB]] or did:key for issuers.
All other profiles extend the base profile.
pharmaceuticals-dscsa)| Attribute | Constraint |
|---|---|
| Required event types | TransactionEvent (mandatory), ObjectEvent |
| Required bizStep values | cbv:BizStep-shipping, cbv:BizStep-receiving, cbv:BizStep-returning |
| Required identifiers | SGTIN (item-level serialization per [[DSCSA]] §582) |
| Predecessor link | REQUIRED for all custody transfer credentials |
| Credential status | REQUIRED (Bitstring Status List) |
| Proof format | eddsa-rdfc-2022 or VC-JWT (ES256) |
| Regulatory metadata | MUST include credentialSubject.regulatoryContext: "dscsa" |
| Chain of custody | MUST support full chain reconstruction per [[GS1-DSCSA-GUIDE]] |
food-eudr)| Attribute | Constraint |
|---|---|
| Required event types | ObjectEvent (commissioning), TransactionEvent |
| Required fields | geoLocation (GeoJSON polygon), harvestDate, speciesIdentifier in credentialSubject |
| Selective disclosure | REQUIRED: SD-JWT MUST enable independent disclosure of geoLocation and supplier identity |
| Certification linkage | SHOULD reference a deforestation certification credential via vscPredecessor |
| Regulatory metadata | MUST include credentialSubject.regulatoryContext: "eudr" |
critical-minerals-cbam)| Attribute | Constraint |
|---|---|
| Required event types | TransformationEvent (bill-of-materials), ObjectEvent |
| Required fields | carbonFootprint (kg CO₂e), countryOfOrigin, hsCode in credentialSubject |
| Identifier scheme | Custom identifiers MAY be used where no GS1 identifier exists; MUST be expressed as URIs |
| Multi-tier linkage | REQUIRED: Tier-2 and Tier-3 TransformationEvent credentials MUST be linkable via vscPredecessor |
| Regulatory metadata | MUST include credentialSubject.regulatoryContext: "cbam" and/or "eu-dpp" |
The VSC Conformance Test Suite is the machine-executable complement
to the normative specification. It is maintained as a separate
artefact in the repository at
test-suite/ and versioned in lock-step with this
specification using [[SEMVER]].
The VSC-CTS is structured after the model of [[TRACE-INTEROP]] and the W3C VC Data Model 2.0 test suite. It uses:
test-suite/vectors/.
| Category ID | Description | Scope | Class | Status |
|---|---|---|---|---|
MAP-FWD |
Forward mapping: EPCIS → unsigned VSC Credential for all 5 event types | MAP-G1 – MAP-G6, MAP-LINK1 | VSC-MAPPER | Mandatory |
MAP-REV |
Reverse mapping: VSC Credential → EPCIS (round-trip fidelity) | MAP-G6, VC-to-EPCIS rules | VSC-MAPPER | Mandatory |
MAP-NEG |
Negative mapping: invalid EPCIS inputs → correct error codes | Error handling, §10 | VSC-MAPPER | Mandatory |
ISS-SIGN |
Credential issuance with eddsa-rdfc-2022 proof | §5.3, §7 | VSC-ISSUER | Mandatory |
ISS-STATUS |
Issuance with Bitstring Status List credential status | §5.3, REQ-F7 | VSC-ISSUER | Mandatory |
ISS-JWT |
Credential issuance with VC-JWT (ES256) proof | §7 | VSC-ISSUER | Optional |
ISS-SDJWT |
Credential issuance with SD-JWT and selective disclosure frame | §7 | VSC-ISSUER | Optional (mandatory for EUDR/DPP profiles) |
VFY-CRED |
Credential verification: valid, expired, revoked, bad-signature cases | §5.4 | VSC-VERIFIER | Mandatory |
VFY-PRES |
Presentation verification: chain-of-custody presentations, gap detection | §5.4, MAP-LINK1 | VSC-VERIFIER | Mandatory |
DISC |
Discovery endpoint returns valid VSCConfiguration | §5.5 | All | Mandatory |
INTEROP |
End-to-end: Issuer A → Verifier B across two independent implementations | REQ-NF3 | All | Mandatory for Interoperability Report |
PROF-PHARMA |
DSCSA profile: SGTIN serialization, chain reconstruction | §8.2 | VSC-ISSUER VSC-VERIFIER | Optional (profile-specific) |
PROF-EUDR |
EUDR profile: geo-polygon, SD-JWT selective disclosure | §8.3 | VSC-ISSUER | Optional (profile-specific) |
PROF-CBAM |
CBAM/DPP profile: carbon footprint, multi-tier linkage | §8.4 | VSC-ISSUER | Optional (profile-specific) |
Round-trip fidelity (MAP-G6) is verified using a canonical set of
[[EPCIS20]] test vectors, one per event type, stored in the
repository at test-suite/vectors/roundtrip/. Each
vector is a JSON file containing:
id — globally unique vector identifier (e.g., vsc-rt-obj-001)normativeRef — clause exercised (e.g., MAP-G6)epcisInput — the canonical [[EPCIS20]] eventexpectedVscTypes — the expected type array in the produced credentialmandatoryFields — list of credentialSubject paths that MUST be present and value-equal
The initial set of round-trip vectors covers all five event types
and at minimum the following bizStep values from [[CBV20]]:
commissioning, shipping,
receiving, inspecting,
transforming, and sensor_reporting.
The [=VSC Test Harness=] MUST produce two distinct report types:
reports/conformance/<impl-id>-<date>.json
and a human-readable HTML summary.
INTEROP test category scenarios.
Produced at reports/interoperability/<date>.json.
An implementation is eligible for listing in the VSC
Interoperability Registry only after passing the
Interoperability Report with at least one other independent
implementation.
The report JSON schema is defined in
test-suite/schemas/report-schema.json and follows
the structure established by [[TRACE-INTEROP]].
Any organization wishing to have their implementation tested against the VSC-CTS MUST:
test-suite/implementations/<org-name>.json
containing endpoint URLs, supported conformance classes,
supported proof formats, and OAuth 2.0 client credential
configuration (using GitHub Secrets for sensitive values).
All VSC Translation API error responses MUST use the
RFC 9457 Problem Details
JSON format with Content-Type: application/problem+json.
In addition, VSC error responses MUST include a vscCode
property containing a VSC-specific error code from the registry below.
HTTP/1.1 422 Unprocessable Entity
Content-Type: application/problem+json
{
"type": "https://w3c-cg.github.io/vsc-interop-toolkit/errors#VSC_ERR_MISSING_REQUIRED_FIELD",
"title": "Missing required EPCIS field",
"status": 422,
"detail": "The field 'eventTime' is required but was not present in the submitted ObjectEvent.",
"instance": "/vsc/v1/epcis/translate",
"vscCode": "VSC_ERR_MISSING_REQUIRED_FIELD",
"vscField": "eventTime"
}
| Code | HTTP status | Description |
|---|---|---|
VSC_ERR_UNKNOWN_EVENT_TYPE | 400 | The submitted document's type field does not match any of the five EPCIS 2.0 event types. |
VSC_ERR_MISSING_REQUIRED_FIELD | 422 | A mandatory EPCIS field is absent. vscField identifies the missing property path. |
VSC_ERR_INVALID_EPC_SYNTAX | 422 | An EPC value does not conform to [[GS1-DIGITALLINK]] URI syntax or the legacy URN format. |
VSC_ERR_INVALID_CBV_VALUE | 422 | A bizStep or disposition value is not a recognized [[CBV20]] URI. |
VSC_ERR_INVALID_PROOF | 400 | The submitted credential's cryptographic proof is invalid or cannot be verified. |
VSC_ERR_DID_RESOLUTION_FAILURE | 502 | The issuer DID could not be resolved. Indicates a network or DID method infrastructure problem. |
VSC_ERR_CREDENTIAL_REVOKED | 400 | The credential's Bitstring Status List entry indicates it has been revoked. |
VSC_ERR_CREDENTIAL_EXPIRED | 400 | The credential's validUntil has passed. |
VSC_ERR_CHAIN_GAP | 400 | A gap was detected in the event chain during presentation verification. vscField identifies the missing predecessor credential ID. |
VSC_ERR_UNSUPPORTED_PROOF_FORMAT | 400 | The requested proofFormat is not supported by this implementation. |
VSC_ERR_PROFILE_VIOLATION | 422 | The credential or presentation does not satisfy a required [=Conformance Profile=] constraint. vscField identifies the violated profile rule. |
VSC_ERR_ROUND_TRIP_LOSS | 500 | The VC-to-EPCIS extraction produced a document that fails round-trip fidelity. Indicates an implementation defect. |
All security considerations in [[VC-DATA-MODEL]], [[VC-DI]], and [[VC-JOSE-COSE]] apply to VSC credentials. In addition:
VSC_ERR_MISSING_REQUIRED_FIELD or
VSC_ERR_INVALID_EPC_SYNTAX before any credential
object is constructed, to prevent injection of crafted
credentialSubject content.
credentialSubject
fields between translation and issuance would break the
vscPredecessor.digestSRI link. Implementations
SHOULD sign the unsigned credential output of
/epcis/translate without modification.
All privacy considerations in [[VC-DATA-MODEL]] apply. Toolkit-specific considerations:
sourceList and destinationList entries
may identify specific supplier organizations. When these are mapped
to credentialSubject, implementations SHOULD support
SD-JWT selective disclosure to allow holders to redact supplier
identities when presenting to parties who do not require them.
https://vsc-test.example/ MUST be used.
/.well-known/vsc-configuration endpoint reveals
the supported DID methods and proof formats of an implementation.
This information may assist an adversary in targeting weaknesses.
Implementations SHOULD require authentication even for discovery
in production deployments.
This section is non-normative.
API specification, mapping rules, conformance classes, test suite architecture, error registry.
Two independent implementations complete MAP-FWD, ISS-SIGN, VFY-CRED categories. First public Interoperability Report published.
EUDR SD-JWT profile (ISS-SDJWT) and CBAM multi-tier linkage vectors finalized. Second interop event with sector-specific test vectors.
At least two independent implementations pass all Mandatory test categories. OPENAPI artefact frozen. Formal liaison notification to GS1 and UN/CEFACT.
This section is non-normative.
Join the group at w3.org/community/vsc (free GitHub account + W3C CLA acceptance). You are then eligible to file issues and submit pull requests.
Use the GitHub issue tracker with one of these labels:
api — Translation API endpoint behaviourmapping — EPCIS-VC field mapping ruletest-suite — test vector addition, category change, harness bugprofile — conformance profile constrainterror-code — new or changed VSC error codeeditorial — grammar, clarity, cross-referencessecurity or privacy — security or privacy considerationOne issue per discrete concern. Reference the relevant section number (e.g., "§6.2 MAP-G4") in your issue title.
feat/<short-desc>, fix/<short-desc>, test/<short-desc>.test-suite/vectors/.errors/registry.json.To register your implementation for conformance and interoperability testing, follow the process in . All registered implementations and their current test results are listed in the public IMPLEMENTATIONS.md.
class="informative-notice".<dfn> for new terms; subsequent uses are auto-linked by ReSpec.MAP-G7, CAT-FOO) for traceability.The editors thank participants of the Verifiable Supply Chain Community Group for their contributions. This specification builds on the substantial prior art of the W3C Credentials Community Group's [[TRACE-INTEROP]] Final Report (December 2024), the [[VC-API]], and the [[TRACE-VOCAB]], and on the GS1 [[EPCIS20]] and [[CBV20]] standards. The conformance profile requirements are informed by published regulatory guidance from the U.S. FDA ([[DSCSA]]), the European Union ([[EUDR]], [[EU-DPP]], [[CBAM]]), and GS1's [[GS1-DSCSA-GUIDE]].