Skip to main content

TypeScript SDK Examples

Code examples for common operations using @idunion/tl-sdk.

Setup

Install the SDK and instantiate the client. The DefaultApi class accepts a Configuration object and an optional base path.

import { DefaultApi } from "@idunion/tl-sdk";

const tlClient = new DefaultApi(
{ isJsonMime: () => true },
process.env.TL_API_URL,
);

All write operations require a bearer token passed via Axios request options. Read operations on public endpoints (e.g. fetching the ETSI XML) do not require authentication.

const authHeader = (token: string) => ({
headers: { Authorization: `Bearer ${token}` },
});

Trust List Creation

Create a new Trust List by providing its name, description, the governance wallet, the verifier used for onboarding credential verification, and the list type.

import { DefaultApi, TlPayload, TlType } from "@idunion/tl-sdk";

const tlPayload: TlPayload = {
name: "My Wallet Provider Trust List",
description: "Trust List for certified wallet providers under the EUDIW framework",
governanceWalletId: "wallet-abc123", // wallet used for VC interactions
verifierId: "verifier-xyz456", // verifier that checks onboarding credentials
type: TlType.WalletProvider, // one of the TlType enum values
};

const { data: tl } = await tlClient.tlCreate(tlPayload, authHeader(token));

console.log("Created TL:", tl.id, tl.didBase);

Available TlType values:

ValueDescription
TlType.WalletProviderWallet Provider
TlType.QeaaProviderQEAA Provider
TlType.PuBeaaProviderPuB-EAA Provider
TlType.EaaProviderEAA Provider
TlType.PidProviderPID Provider
TlType.AccessCertificateAuthorityAccess Certificate Authority
TlType.RegistrationCertificatesProviderProvider of Registration Certificates

Direct Onboarding

In the direct onboarding flow the Trust List operator creates a Trust List Record (TLR) on behalf of the applicant. The applicant provides a CSR and organisation details out-of-band; the operator submits them via tlrCreate.

import { DefaultApi, TlrCreatePayload } from "@idunion/tl-sdk";

const tlId = "my-trust-list-id";

const payload: TlrCreatePayload = {
// applicant's Certificate Signing Request (PEM-encoded)
csr: "-----BEGIN CERTIFICATE REQUEST-----\n...\n-----END CERTIFICATE REQUEST-----",

// organisation details
orgName: "Example GmbH",
orgTradeName: "Example",
orgStreetAddress: "Musterstraße 1",
orgCity: "Berlin",
orgState: "Berlin",
orgPostalCode: "10115",
orgCountry: "DE",
orgEmail: "contact@example.com",
orgPhone: "+49 30 123456",
orgWebAddress: "https://example.com",
orgToC: "https://example.com/terms",

// wallet solution details (for Wallet Provider TLs)
walletSolutionName: "Example Wallet",
walletSolutionRefId: "wallet-ref-001",
walletSolutionUrl: "https://wallet.example.com",
};

const { data: tlr } = await tlClient.tlrCreate(tlId, payload, authHeader(token));

console.log("Created TLR:", tlr.id, tlr.did, tlr.status);

Onboarding via Verifiable Credential

The VC-based onboarding flow uses OID4VP. The operator initiates a session; the applicant scans a QR code and presents their Onboarding Credential. The operator polls for completion.

1. Initiate the onboarding session

import { DefaultApi, OnboardingPayload, OnboardingResponse } from "@idunion/tl-sdk";

const tlId = "my-trust-list-id";

const payload: OnboardingPayload = {
verifierId: "verifier-xyz456", // verifier configured on the TL
holderEntityId: "did:key:z6Mk...", // optional: pre-known did:key of the applicant
};

const { data: session } = await tlClient.onboardingInit(tlId, payload, authHeader(token));

// session.verifierState — opaque state token used to poll status
// session.verifierUrl — OID4VP presentation request URL (encode as QR code for the applicant)
console.log("Onboarding session started:", session.verifierState);
console.log("QR code URL:", session.verifierUrl);

2. Poll for status

Poll onboardingStatus using the verifierState returned in step 1. The applicant scans the QR code and presents their credential in their wallet; the status transitions from in_progress to completed (or error).

import { OnboardingStatus, OnboardingStatusStatusEnum } from "@idunion/tl-sdk";

function pollOnboardingStatus(
verifierState: string,
intervalMs = 5000,
): Promise<OnboardingStatus> {
return new Promise((resolve, reject) => {
const timer = setInterval(async () => {
const { data: status } = await tlClient.onboardingStatus(verifierState);

switch (status.status) {
case OnboardingStatusStatusEnum.Completed:
clearInterval(timer);
// status.did contains the newly registered DID
resolve(status);
break;

case OnboardingStatusStatusEnum.Error:
clearInterval(timer);
reject(new Error(status.message ?? "Onboarding failed"));
break;

case OnboardingStatusStatusEnum.InProgress:
// keep polling
break;
}
}, intervalMs);
});
}

const result = await pollOnboardingStatus(session.verifierState);
console.log("Onboarding complete. DID:", result.did);

Getting Trust List Records

All records for a Trust List

import { DefaultApi, TlrList, TlrStatusEnum } from "@idunion/tl-sdk";

const tlId = "my-trust-list-id";

const { data: tlrList } = await tlClient.tlrsGet(tlId, authHeader(token));

// tlrList.items — array of Tlr objects
for (const tlr of tlrList.items) {
console.log(tlr.orgName, tlr.did, tlr.status);
}

// Filter by status
const trusted = tlrList.items.filter(
(tlr) => tlr.status === TlrStatusEnum.Trusted,
);

TlrStatusEnum values:

ValueMeaning
TlrStatusEnum.OnboardedOnboarded via a VC (issuer not verified by IDunion SCE)
TlrStatusEnum.TrustedOnboarded via a VC whose issuer is verified by IDunion SCE
TlrStatusEnum.RevokedVerification Method was revoked
TlrStatusEnum.ExpiredVerification Method or Onboarding VC has expired

Single record

const tlrId = "some-tlr-id";

const { data: tlr } = await tlClient.tlrGet(tlId, tlrId, authHeader(token));

console.log(tlr.orgName, tlr.did, tlr.isRoot, tlr.status);

Search across all Trust Lists by organisation name

const { data: results } = await tlClient.tlrSearch("Example GmbH");

for (const tlr of results.items) {
console.log(tlr.tlName, tlr.orgName, tlr.did);
}

Getting the Trust List in XML Format

The SDK exposes etsiTlGet which returns the ETSI TS 119 602 Trust List as a structured object. To download the raw XML file, construct the URL from the didBase field of the Trust List.

Via SDK method

const tlId = "my-trust-list-id";

const { data: etsiTl } = await tlClient.etsiTlGet(tlId);

// etsiTl is the ETSI Trust List as a parsed object
console.log(etsiTl);

Direct XML URL from didBase

The Tl object returned by tlCreate / tlGet includes a didBase field (a did:web DID). Convert it to an HTTPS base URL and append the ETSI path to get the XML download link.

import { DefaultApi, Tl } from "@idunion/tl-sdk";

function tlXmlUrl(tl: Tl): string {
let host = tl.didBase
.replace("did:web:", "")
.replaceAll(":", "/");
host = decodeURIComponent(host);
const schema = host.startsWith("localhost") ? "http://" : "https://";
return `${schema}${host}/etsi/119_602_tl.xml`;
}

const { data: tl } = await tlClient.tlGet(tlId, authHeader(token));

const xmlUrl = tlXmlUrl(tl);
console.log("XML download URL:", xmlUrl);
// e.g. https://tl.example.com/my-trust-list-id/etsi/119_602_tl.xml