Trust Source Management
Each trust source is identified by a unique sourceId. Loading a source validates its format, applies the selected
acceptance policy, and atomically activates the normalized entities, services, and certificate identities.
Supported inputs are:
- ETSI TS 119 612 national TSL XML;
- ETSI TS 119 612 EU List of Trusted Lists (LoTL) XML;
- ETSI TS 119 602 V1.1.1 annex A.1 JSON;
- ETSI TS 119 602 V1.1.1 annex A.2.1 XML;
- normative TS 119 602 JSON in a supported compact-JWS envelope.
Other JSON/XML shapes are rejected.
Load from URL
Endpoint: POST /v1/{target}/trust-registry-api/sources/load
curl -X POST \
'https://{orgID}.enterprise-sandbox.waltid.dev/v1/{target}/trust-registry-api/sources/load' \
-H 'Authorization: Bearer {yourToken}' \
-H 'Content-Type: application/json' \
-d '{
"sourceId": "austria-tsl",
"url": "https://www.signatur.rtr.at/vertrauensliste.xml",
"acceptancePolicy": "REQUIRE_VALID_SIGNATURE"
}'
Other public sources useful for interoperability testing are:
| Source | URL | Expected format |
|---|---|---|
| Italy national TSL | https://eidas.agid.gov.it/TL/TSL-IT.xml | ETSI_TS_119_612_TRUST_LIST_XML |
| EU LoTL | https://ec.europa.eu/tools/lotl/eu-lotl.xml | ETSI_TS_119_612_LIST_OF_TRUST_LISTS_XML |
The EU LoTL contains OtherTSLPointer entries. A successful load reports them in pointersLoaded, but does not fetch
the referenced national TSLs. Load every national TSL required by your verification policy as a separate source.
Load from Content
Provide one of url or content. This example reads a complete ETSI TS 119 602 annex A.1 JSON document from disk:
jq -n --rawfile content wallet-providers.json \
'{sourceId: "wallet-providers", content: $content, acceptancePolicy: "ALLOW_UNSIGNED"}' |
curl -X POST \
'https://{orgID}.enterprise-sandbox.waltid.dev/v1/{target}/trust-registry-api/sources/load' \
-H 'Authorization: Bearer {yourToken}' \
-H 'Content-Type: application/json' \
--data-binary @-
ALLOW_UNSIGNED is explicit in this example because the inline document has no signature. Use authenticated sources
for production trust decisions.
Request Fields
sourceId: Unique source identifier.url: Remote source URL. Mutually exclusive withcontent.content: TSL/LoTL XML, LoTE JSON/XML, or compact JWS. Mutually exclusive withurl.sourceUrl: Optional origin retained for refresh when loading inline content.acceptancePolicy: Optional per-load policy; the service default is used when omitted.trustedSignerCertificates: Optional PEM or Base64-DER signer certificates/trust anchors. These are configured independently of certificates embedded in a source.
Acceptance Policies
| Policy | Accepted source |
|---|---|
REQUIRE_AUTHENTICATED | Signature is valid and its signer is independently trusted |
REQUIRE_VALID_SIGNATURE | Signature integrity is valid; signer authorization is not established |
ALLOW_UNSIGNED | Validly signed or unsigned source; a present invalid signature is rejected |
ALLOW_UNVERIFIED | Verification may be skipped; use only for controlled development |
The service default is REQUIRE_VALID_SIGNATURE. For the strongest source admission, use
REQUIRE_AUTHENTICATED and configure the authorized signer certificate or its trust anchor independently.
Load Signed LoTE JSON
Signed LoTE JSON uses compact JWS with an embedded, normative TS 119 602 JSON payload. The supported envelope requires
ES256, ES384, or ES512 and a protected x5c header. Detached payloads, b64=false, and unsupported critical
headers are rejected.
curl -X POST \
'https://{orgID}.enterprise-sandbox.waltid.dev/v1/{target}/trust-registry-api/sources/load' \
-H 'Authorization: Bearer {yourToken}' \
-H 'Content-Type: application/json' \
-d '{
"sourceId": "signed-wallet-providers",
"content": "{compactJws}",
"acceptancePolicy": "REQUIRE_AUTHENTICATED",
"trustedSignerCertificates": ["{sourceSignerCertificatePemOrBase64Der}"]
}'
The first certificate in JWS x5c identifies the signing key but does not authorize the signer. Configure the signer
or its issuing trust anchor independently. Current compact-JWS support is not a claim of complete JAdES-B-B conformance.
Load Result
{
"sourceId": "austria-tsl",
"success": true,
"entitiesLoaded": 9,
"servicesLoaded": 42,
"identitiesLoaded": 42,
"pointersLoaded": 0,
"assurance": {
"signatureStatus": "VALID",
"signerTrust": "NOT_EVALUATED",
"authenticityState": "INTEGRITY_VERIFIED",
"acceptancePolicy": "REQUIRE_VALID_SIGNATURE",
"accepted": true
}
}
Always check success. A failed load includes errorCode and error; it does not replace an already active source.
errorCode | Meaning |
|---|---|
FETCH_FAILED | URL could not be fetched |
UNKNOWN_FORMAT | Input is not a supported standards format |
SOURCE_NOT_ACCEPTED | Source did not satisfy its acceptance policy |
SIGNATURE_VALIDATION_FAILED | Signature integrity or signer authorization failed |
PARSE_FAILED | Schema validation, XML validation, parsing, or normalization failed |
List and Monitor Sources
curl \
'https://{orgID}.enterprise-sandbox.waltid.dev/v1/{target}/trust-registry-api/sources' \
-H 'Authorization: Bearer {yourToken}'
Each TrustSource includes:
sourceFamily:TSLorLOTE;format: the exactTrustListFormatvalue;- issue date, next update, sequence number, and
freshnessState; assurance: signature, signer trust, acceptance policy, and admission state;- source-specific metadata such as the LoTL
pointerCount.
Use GET /v1/{target}/trust-registry-api/sources/health for source freshness and normalized record counts.
Refresh a Source
curl -X POST \
'https://{orgID}.enterprise-sandbox.waltid.dev/v1/{target}/trust-registry-api/sources/{sourceId}/refresh' \
-H 'Authorization: Bearer {yourToken}'
Refresh reuses the source URL, acceptance policy, and signer certificates stored at the successful load. If fetching, validation, or parsing fails, the previous active snapshot remains available.
List Trusted Entities
curl \
'https://{orgID}.enterprise-sandbox.waltid.dev/v1/{target}/trust-registry-api/entities?sourceFamily=TSL&entityType=TRUST_SERVICE_PROVIDER&country=AT&onlyCurrentlyTrusted=true' \
-H 'Authorization: Bearer {yourToken}'
sourceFamily accepts TSL or LOTE. Entity and service results are normalized from the validated source document.
Endpoint Summary
| Method | Endpoint | Permission | Purpose |
|---|---|---|---|
POST | /v1/{target}/trust-registry-api/sources/load | ES_TRUST_REGISTRY_MANAGE | Validate and load a source |
GET | /v1/{target}/trust-registry-api/sources | ES_TRUST_REGISTRY_READ | List active sources |
GET | /v1/{target}/trust-registry-api/sources/health | ES_TRUST_REGISTRY_READ | Monitor assurance and freshness |
POST | /v1/{target}/trust-registry-api/sources/{sourceId}/refresh | ES_TRUST_REGISTRY_MANAGE | Refresh a URL-backed source |
GET | /v1/{target}/trust-registry-api/entities | ES_TRUST_REGISTRY_READ | List normalized entities |
