Skip to Content
API and DashboardExample Project

Example Project: kyc-demo

This guide shows how to set up the kyc-demo  project manually in the Paradym dashboard.

You will create the same configuration as the automated project setup, but step by step in the UI.

Before you start

Make sure you have:

  1. A Paradym account and project.
  2. Your PARADYM_API_KEY and PARADYM_PROJECT_ID in your local .env file.
  3. The kyc-demo project checked out locally.
💡

This page focuses on manual setup in the dashboard so you can understand and control each part of the flow.

What you will create

You will set up:

  1. A verifier root certificate.
  2. An issuer root certificate.
  3. An SD-JWT VC credential template for EUDI PID.
  4. A trusted entity named Utopia Government.
  5. A presentation template for KYC verification.

Create a verifier certificate

Open the certificates page in your project and create a new certificate with these values:

  • Type: verifierRoot
  • Key type: P-256
  • Country: NL
  • Common name: Leave empty, it will default to the project name
  • Issuer alternative name URL: https://example.com

Create Verifier Root Certificate

Read more about certificates in this documentation.

Create an issuer certificate

Create a second certificate with these values:

  • Type: issuerRoot
  • Key type: P-256
  • Country: NL
  • Common name: Utopia Government
  • Issuer alternative name URL: https://example.com

After creating it, keep this certificate available. You will use it in the next steps.

Create Issuer Root Certificate

Read more about certificates in this documentation.

Create the EUDI PID credential template

This setup is purely for demonstration purposes, allowing us to issue an EUDI PID credential that we can later verify. In a real-world scenario, the EUDI PID would already be issued to the end user by a trusted entity.

Nested attributes can only be configured through the API.
For the moment, because of the complexity involved with defining templates with nested attributes in the dashboard, nested attribute in SD-JWT credential can only be configured through the SD-JWT VC Credential Templates  API.

Copy the request body:

{ "name": "EUDI PID (Utopia Government)", "description": "Compliant with EU Digital Identity", "issuer": { "signer": "certificate", "keyType": "P-256" }, "background": { "color": "#FFFFFF" }, "text": { "color": "#000000" }, "validUntil": { "start": "issuance", "future": { "years": 1 } }, "type": "urn:eudi:pid:1", "revocable": false, "attributes": { "family_name": { "type": "string", "name": "Family Name", "description": "Current last name(s) or surname(s) of the user", "required": true, "alwaysDisclosed": false }, "given_name": { "type": "string", "name": "Given Name", "description": "Current first name(s), including middle name(s) where applicable", "required": true, "alwaysDisclosed": false }, "birthdate": { "type": "date", "name": "Birth Date", "description": "Date of birth in ISO 8601-1 YYYY-MM-DD format", "required": true, "alwaysDisclosed": false }, "place_of_birth": { "type": "object", "name": "Place of Birth", "description": "Country, region, or locality where the user was born", "required": true, "alwaysDisclosed": false, "properties": { "country": { "type": "string", "name": "Birth Country", "description": "Alpha-2 country code as specified in ISO 3166-1", "required": false, "alwaysDisclosed": false }, "region": { "type": "string", "name": "Birth Region", "description": "State, province, district, or local area", "required": false, "alwaysDisclosed": false }, "locality": { "type": "string", "name": "Birth Locality", "description": "Municipality, city, town, or village", "required": false, "alwaysDisclosed": false } } }, "nationalities": { "type": "array", "name": "Nationalities", "description": "One or more Alpha-2 country codes representing nationality", "required": true, "alwaysDisclosed": false, "items": { "type": "string" } }, "address": { "type": "object", "name": "Resident Address", "description": "Address where the user currently resides", "required": false, "alwaysDisclosed": false, "properties": { "formatted": { "type": "string", "name": "Full Address", "description": "Complete formatted address", "required": false, "alwaysDisclosed": false }, "street_address": { "type": "string", "name": "Street Address", "description": "Street name where the user resides", "required": false, "alwaysDisclosed": false }, "house_number": { "type": "string", "name": "House Number", "description": "House number including any affix or suffix", "required": false, "alwaysDisclosed": false }, "locality": { "type": "string", "name": "City", "description": "Municipality, city, town, or village", "required": false, "alwaysDisclosed": false }, "region": { "type": "string", "name": "State/Region", "description": "State, province, district, or local area", "required": false, "alwaysDisclosed": false }, "postal_code": { "type": "string", "name": "Postal Code", "description": "Postal code of residence", "required": false, "alwaysDisclosed": false }, "country": { "type": "string", "name": "Country", "description": "Alpha-2 country code as specified in ISO 3166-1", "required": false, "alwaysDisclosed": false } } } } }

Go to SD-JWT VC Credential Templates  and create an SD-JWT VC template by pasting the request body and submitting it.

Please sign in to Paradym  before submitting the request. Your session will authenticate the request automatically.

Create Credential Template

Verify whether the credential template named EUDI PID (Utopia Government) is visible on the templates page.

Create the trusted entity

Go to Trusted Entities and create:

  • Name: Utopia Government
  • Certificate: add the issuer certificate created earlier

Create Trusted Entity

Create the presentation template

Go to Presentation Templates and create:

  • Name: Verify EUDI PID (Banking Example)
  • Description: Verify that the user has an EUDI PID credential issued by the trusted entity
  • Protocol: OpenID4VC
  • Verifier signer: certificate (P-256)

Then add one requested credential based on the EUDI PID structure and set:

  • Requested claims: same claim structure as the credential template
  • Trusted issuer: Utopia Government

Create Presentation Template

Add IDs to your local environment

Copy the IDs of:

  1. EUDI PID (Utopia Government) credential template
  2. Verify EUDI PID (Banking Example) presentation template

Then set them in .env:

PARADYM_CREDENTIAL_TEMPLATE_ID=<credential-template-id> PARADYM_PRESENTATION_TEMPLATE_ID=<presentation-template-id>

Run the example

When the two template IDs are set, start kyc-demo:

pnpm dev

You can now run the issuance and verification flow in the app using your manually configured project.

Troubleshooting

  • If verification fails, confirm the presentation template trusts Utopia Government.
  • If issuance fails, confirm the credential template uses certificate signing with P-256.
  • If the app cannot start a flow, confirm both template IDs are present in .env.
Last updated on