Public API Reference

PassportLab Developer API

Open, unauthenticated endpoints for reading Digital Product Passports, resolving GS1 Digital Links, verifying supply chain data, and accessing EU compliance trust documents. No API key required.

v1.0.0 Swagger UI OpenAPI JSON Base URL: https://api.passportlab.io

1. Trust & Identity

Cryptographic identity documents for PassportLab. These endpoints are used by verifiers, wallets, and DID resolvers to retrieve the public signing key and conformance manifest.

GET/.well-known/did.jsonW3C DID:Web • UNTP v0.7.0

Returns the PassportLab DID:Web document containing the organisation's Ed25519 public key. Used by third-party verifiers to check digital signatures on W3C Verifiable Credentials and SD-JWTs without contacting PassportLab at verification time.

Request
GET /.well-known/did.json HTTP/1.1
Host: api.passportlab.io
Accept: application/json
Response 200 OK
{
  "@context": ["https://www.w3.org/ns/did/v1"],
  "id": "did:web:passportlab.io",
  "verificationMethod": [{
    "id": "did:web:passportlab.io#key-1",
    "type": "JsonWebKey2020",
    "controller": "did:web:passportlab.io",
    "publicKeyJwk": {
      "kty": "OKP",
      "crv": "Ed25519",
      "x": "..."
    }
  }],
  "assertionMethod": ["did:web:passportlab.io#key-1"]
}
Live document Fetching…
GET/.well-known/untp-conformance.jsonUNTP v0.7.0 • UN/CEFACT

UNTP (UN Transparency Protocol) conformance manifest. Declares PassportLab's conformance with the UN Transparency Protocol v0.7.0 and lists the credential types issued (DigitalProductPassport, DigitalConformityCredential, DigitalTraceabilityEvent, DigitalFacilityRecord).

Request
GET /.well-known/untp-conformance.json HTTP/1.1
Host: api.passportlab.io
Response 200 OK
{
  "conformsTo": "https://uncefact.github.io/spec-untp/docs/specification/",
  "version": "0.7.0",
  "implementationName": "PassportLab",
  "credentials": [
    {
      "type": "DigitalProductPassport",
      "version": "0.7.0",
      "issuerDid": "did:web:passportlab.io",
      "credentialFormats": ["W3C VC v2.0 (eddsa-jcs-2022)", "SD-JWT (vc+sd-jwt, EdDSA)"]
    }
  ]
}
Live document Fetching…

2. GS1 Digital Link Resolver

Resolves GS1-standard product identifiers (GTIN + serial number) to the corresponding Digital Product Passport. Compatible with any GS1-compliant scanner or resolver network. Supports Accept: application/linkset+json for GS1 link-set responses.

GET/api/v1/public/01/{gtin}/21/{serial}GS1 Digital Link 1.1 • ISO/IEC 15418

Resolves a GS1 Digital Link (GTIN + serial) to the associated DPP. Returns a redirect to the DPP public URL, or a JSON/linkset response depending on the Accept header. This is the URL embedded in QR codes printed on physical products.

Parameters

NameInTypeDescription
gtinpathstringGS1 GTIN-14 (14-digit global trade item number)
serialpathstringGS1 Serial Number (AI 21)

Headers

NameRequiredDescription
AcceptNoSet to application/linkset+json to receive a GS1 link-set document instead of a redirect
Request
GET /api/v1/public/01/09506000134352/21/SN-2024-001 HTTP/1.1
Host: api.passportlab.io
Accept: application/json
Response 200 OK
{
  "dppCode": "DPP-09506000134352-SN-2024-001",
  "gtin": "09506000134352",
  "serial": "SN-2024-001",
  "passportUrl": "https://www.passportlab.io/dpp/DPP-09506000134352-SN-2024-001",
  "apiUrl": "https://api.passportlab.io/api/v1/public/dpp/DPP-09506000134352-SN-2024-001",
  "productName": "Lithium Battery Pack 48V",
  "manufacturer": "ACME Energy GmbH"
}
GET/api/v1/public/01/{gtin}GS1 Digital Link 1.1

Lists all active Digital Product Passports registered under a GTIN. Useful when the serial number is not available (e.g. from a product class barcode). Falls back to the GS1 global resolver at id.gs1.org if no DPPs are registered for this GTIN.

Parameters

NameInTypeDescription
gtinpathstringGS1 GTIN-14
Request
GET /api/v1/public/01/09506000134352 HTTP/1.1
Host: api.passportlab.io
Response 200 OK
{
  "gtin": "09506000134352",
  "results": [
    {
      "dppCode": "DPP-09506000134352-SN-2024-001",
      "passportUrl": "https://www.passportlab.io/dpp/DPP-09506000134352-SN-2024-001",
      "apiUrl": "https://api.passportlab.io/api/v1/public/dpp/DPP-09506000134352-SN-2024-001"
    }
  ],
  "total": 1
}

3. DPP Public Access

Read the full content of a Digital Product Passport and retrieve its QR code. These endpoints are used by consumer apps, retailer systems, recyclers, and customs authorities to access product sustainability data.

GET/api/v1/public/dpp/{dpp_code}ESPR 2024/1781 • EU Battery Reg. 2023/1542

Returns the full public data of a Digital Product Passport. Includes product identity, materials, carbon footprint, repairability score, certifications, and all ESPR-mandated fields. The response language adapts to the Accept-Language header, using whichever ISO 639-1 translations the manufacturer supplied. Role-based field visibility applies when an X-Stakeholder-Key header is present.

Parameters

NameInTypeDescription
dpp_codepathstringDPP identifier (e.g. DPP-09506000134352-SN-001 or a UUID-based code)

Headers

NameRequiredDescription
Accept-LanguageNoISO 639-1 language code. Returns translated field labels for any language the manufacturer supplied a translation for (not limited to a fixed set).
X-Stakeholder-KeyNoStakeholder API key for role-filtered views (consumer, retailer, customs, msa, notified_body).
Request
GET /api/v1/public/dpp/DPP-09506000134352-SN-001 HTTP/1.1
Host: api.passportlab.io
Accept-Language: de
Response 200 OK
{
  "dppCode": "DPP-09506000134352-SN-001",
  "productName": "Lithium Battery Pack 48V",
  "manufacturer": "ACME Energy GmbH",
  "countryOfOrigin": "DE",
  "carbonFootprint": "12.4 kg CO₂e",
  "repairabilityScore": 8.2,
  "materials": [
    { "name": "Lithium", "percentage": 6.2, "recycledContent": 0 },
    { "name": "Cobalt", "percentage": 4.1, "recycledContent": 40 }
  ],
  "certifications": ["IEC 62619", "UN 38.3"],
  "vcUrl": "https://api.passportlab.io/api/v1/public/dpp/DPP-09506000134352-SN-001",
  "verifiedAt": "2025-11-14T09:22:00Z"
}
GET/api/v1/public/dpp/{dpp_code}/vcW3C VC v2.0 • UNTP v0.7.0 • eddsa-jcs-2022

Returns the raw W3C Verifiable Credential JSON (Content-Type: application/vc+ld+json). The proof is an eddsa-jcs-2022 DataIntegrityProof; the verificationMethod points to did:web:passportlab.io#key-1. Resolve /.well-known/did.json to get the Ed25519 public key and verify offline.

Parameters

NameInTypeDescription
dpp_codepathstringDPP identifier
Request
GET /api/v1/public/dpp/DPP-09506000134352-SN-001/vc HTTP/1.1
Host: api.passportlab.io
Accept: application/vc+ld+json
Response 200 OK
{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    "https://vocabulary.uncefact.org/untp/dpp/0.7.0/"
  ],
  "id": "https://www.passportlab.io/credentials/dpp/DPP-09506000134352-SN-001",
  "type": ["VerifiableCredential", "DigitalProductPassport"],
  "issuer": { "id": "did:web:passportlab.io" },
  "validFrom": "2025-11-14T09:22:00Z",
  "credentialSubject": { "...": "..." },
  "proof": {
    "type": "DataIntegrityProof",
    "cryptosuite": "eddsa-jcs-2022",
    "verificationMethod": "did:web:passportlab.io#key-1",
    "proofPurpose": "assertionMethod",
    "proofValue": "z5j4K..."
  }
}
GET/api/v1/public/dpp/{dpp_code}/vc.jwtvc+jwt • EdDSA • RFC 8037

Returns the DPP credential as a compact JWS (vc+jwt). The JWT header contains alg=EdDSA and kid=did:web:passportlab.io#key-1. Decode the header, resolve the DID document, get the publicKeyJwk for that kid, and verify the Ed25519 signature. Compatible with any standard JWT library that supports OKP keys.

Parameters

NameInTypeDescription
dpp_codepathstringDPP identifier
Request
GET /api/v1/public/dpp/DPP-09506000134352-SN-001/vc.jwt HTTP/1.1
Host: api.passportlab.io
Response 200 OK
eyJhbGciOiJFZERTQSIsInR5cCI6InZjK2p3dCIsImtpZCI6ImRpZDp3ZWI6cGFzc3BvcnRsYWIuaW8ja2V5LTEifQ
.eyJpc3MiOiJkaWQ6d2ViOnBhc3Nwb3J0bGFiLmlvIiwianRpIjoiaHR0cHM6Ly9wYXNzcG9ydGxhYi5pby9jcmVkZW50aWFscy9...
.signature
GET/api/v1/public/dpp/{dpp_code}/qr.pngGS1 Digital Link 1.1

Returns a PNG QR code image encoding the GS1 Digital Link URL for this product. Print it on packaging, labels, or product inserts. Scanning the QR code takes the end consumer to the public DPP view at passportlab.io/dpp/{code}.

Parameters

NameInTypeDescription
dpp_codepathstringDPP identifier
sizequeryintegerImage size in pixels (default: 300). Range: 100–2000.
Request
GET /api/v1/public/dpp/DPP-09506000134352-SN-001/qr.png?size=400 HTTP/1.1
Host: api.passportlab.io
Response 200 OK
HTTP/1.1 200 OK
Content-Type: image/png
Content-Length: 3214

<binary PNG data>

4. Verification

Verify the cryptographic integrity of a Digital Product Passport. These endpoints validate Ed25519 signatures, check W3C VC proof chains, and verify SD-JWT selective disclosure tokens issued by PassportLab.

GET/api/v1/verify/{dpp_code}W3C VC v2.0 • eddsa-jcs-2022

Verifies the cryptographic proof on a DPP and returns the verification result. Checks that the Ed25519 signature is valid against the PassportLab DID:Web public key. Returns the signing key, issuer DID, and whether the proof passes.

Parameters

NameInTypeDescription
dpp_codepathstringDPP identifier
Request
GET /api/v1/verify/DPP-09506000134352-SN-001 HTTP/1.1
Host: api.passportlab.io
Response 200 OK
{
  "valid": true,
  "dppCode": "DPP-09506000134352-SN-001",
  "issuer": "did:web:passportlab.io",
  "verificationMethod": "did:web:passportlab.io#key-1",
  "algorithm": "Ed25519",
  "signedAt": "2025-11-14T09:22:00Z",
  "productName": "Lithium Battery Pack 48V"
}
POST/api/v1/verifyW3C VC v2.0 • eddsa-jcs-2022

Verifies a raw W3C Verifiable Credential JSON-LD document. Submit any VC issued by PassportLab to check the proof. Returns validation status and the decoded credential subject.

Request
POST /api/v1/verify HTTP/1.1
Host: api.passportlab.io
Content-Type: application/json

{
  "@context": ["https://www.w3.org/ns/credentials/v2"],
  "type": ["VerifiableCredential", "DigitalProductPassport"],
  "issuer": "did:web:passportlab.io",
  "proof": {
    "type": "DataIntegrityProof",
    "cryptosuite": "eddsa-jcs-2022",
    "proofValue": "..."
  }
}
Response 200 OK
{
  "valid": true,
  "issuer": "did:web:passportlab.io",
  "credentialType": "DigitalProductPassport",
  "issuanceDate": "2025-11-14T09:22:00Z"
}
POST/api/v1/verify/sd-jwtSD-JWT VC • IETF draft-ietf-oauth-sd-jwt-vc

Verifies an SD-JWT Verifiable Credential. Accepts the compact serialisation (header.payload.signature~disclosure~...) and returns which fields were selectively disclosed, whether the EdDSA signature is valid, and the decoded claims.

Request
POST /api/v1/verify/sd-jwt HTTP/1.1
Host: api.passportlab.io
Content-Type: application/json

{
  "token": "eyJhbGciOiJFZERTQSJ9.eyJfc2QiOlsiLi4uIl19.signature~disclosure~"
}
Response 200 OK
{
  "valid": true,
  "algorithm": "EdDSA",
  "issuer": "did:web:passportlab.io",
  "disclosedClaims": {
    "productName": "Lithium Battery Pack 48V",
    "carbonFootprint": "12.4 kg CO₂e",
    "materials": [...]
  },
  "undisclosedFields": ["hsCode", "producerLei"]
}
GET/api/v1/public/customs/verify/{dpp_code}EU Customs Regulation 952/2013 • ESPR 2024/1781

Returns a summary of customs-relevant product data: HS tariff code, country of origin, materials declaration, and ESPR compliance status. Designed for use by customs authorities, EU border inspection posts, and trade compliance systems. No authentication required.

Parameters

NameInTypeDescription
dpp_codepathstringDPP identifier
Request
GET /api/v1/public/customs/verify/DPP-09506000134352-SN-001 HTTP/1.1
Host: api.passportlab.io
Response 200 OK
{
  "dppCode": "DPP-09506000134352-SN-001",
  "productName": "Lithium Battery Pack 48V",
  "manufacturer": "ACME Energy GmbH",
  "countryOfOrigin": "DE",
  "hsCode": "8507.60",
  "materials": [
    { "name": "Lithium", "percentage": 6.2 },
    { "name": "Cobalt", "percentage": 4.1 }
  ],
  "espr_compliant": true,
  "hasVerifiableCredential": true,
  "signatureValid": true
}

5. Supply Chain Events

EPCIS 2.0-compliant supply chain event log. Each DPP accumulates traceability events (ObjectEvent, TransformationEvent, AggregationEvent) from all stakeholders in the supply chain. These events are export-ready in EPCIS 2.0 Document format.

GET/api/v1/dpp/{dpp_code}/events/documentEPCIS 2.0 • GS1 CBV 2.0 • UNTP DigitalTraceabilityEvent

Returns the full EPCIS 2.0 Document for a DPP — all recorded supply chain events from manufacture to retail. Compatible with GS1-certified EPCIS repositories. The response follows the EPCIS 2.0 JSON-LD context. Stakeholder-key filtering applies: customs authorities and MSAs can access additional event metadata.

Parameters

NameInTypeDescription
dpp_codepathstringDPP identifier

Headers

NameRequiredDescription
X-Stakeholder-KeyNoStakeholder key for role-filtered event visibility (customs, msa, retailer, notified_body).
Request
GET /api/v1/dpp/DPP-09506000134352-SN-001/events/document HTTP/1.1
Host: api.passportlab.io
Accept: application/json
Response 200 OK
{
  "@context": ["https://ref.gs1.org/standards/epcis/2.0.0/epcis-context.jsonld"],
  "type": "EPCISDocument",
  "schemaVersion": "2.0",
  "creationDate": "2025-11-14T09:22:00Z",
  "epcisBody": {
    "eventList": [
      {
        "type": "ObjectEvent",
        "eventTime": "2025-10-01T08:00:00Z",
        "action": "ADD",
        "bizStep": "commissioning",
        "epcList": ["urn:epc:id:sgtin:0950600.013435.SN-2024-001"],
        "readPoint": { "id": "urn:epc:id:sgln:0950600.00000.0" }
      }
    ]
  }
}

6. Notified Bodies

Search the EU NANDO database of notified conformity assessment bodies. Use this to look up which laboratories and certification bodies are authorised to issue conformity certificates for specific EU legislation.

7. Interoperability Standards

PassportLab maps each credential and data format to the EU standard that governs it (EN 18223 §4 — Interoperability Requirements). Use this table to understand which protocol to use for each integration.

Standard / ProtocolRole in PassportLabEN 18223 reference
W3C VC v2.0 (eddsa-jcs-2022)Primary credential format for DPP assertions. Ed25519 signed, JSON-LD serialisation. Used by customs, MSAs, and notified bodies for offline verification.§4.2 — Verifiable Credentials
SD-JWT VC (IETF draft)Selective disclosure — share only the fields required by a given stakeholder (e.g. carbon footprint to customs, not supply chain origin to consumers).§4.3 — Selective Disclosure
GS1 Digital Link 1.1Physical-to-digital bridge. QR codes encode a GS1 DL URL (/01/{gtin}/21/{serial}) that resolves to the DPP. Compatible with any GS1-certified scanner.§4.4 — Product Identifiers
UNTP v0.7.0UN Transparency Protocol credential types: DigitalProductPassport, DigitalConformityCredential, DigitalTraceabilityEvent. Manifest at /.well-known/untp-conformance.json.§4.5 — Traceability Credentials
EPCIS 2.0 (GS1 CBV 2.0)Supply chain event log. All events (ObjectEvent, AggregationEvent, TransformationEvent) are exported as EPCIS 2.0 Documents with JSON-LD context.§4.6 — Event Log
AAS Part 2 (IEC 63278)Asset Administration Shell export (/aas.json). Five submodels: Nameplate, TechnicalData, CarbonFootprint, Circularity, EnergyConsumption. Required for Catena-X and IDSA data spaces.§4.7 — Digital Twin Shell
DID:Web (W3C)Platform-level and per-organisation decentralised identifiers. Resolves to an Ed25519 public key. Verifiers resolve /.well-known/did.json to verify signatures without contacting PassportLab.§4.2 — Issuer Identity
SHACL (W3C)Data shape validation. Shapes for battery, electronics, textile, steel, and construction categories published at /public/schemas/shacl/{category}.ttl.§4.8 — Data Validation