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:
- A Paradym account and project.
- Your
PARADYM_API_KEYandPARADYM_PROJECT_IDin your local.envfile. - 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:
- A verifier root certificate.
- An issuer root certificate.
- An SD-JWT VC credential template for EUDI PID.
- A trusted entity named Utopia Government.
- 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

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.

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.

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 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

Add IDs to your local environment
Copy the IDs of:
EUDI PID (Utopia Government)credential templateVerify 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 devYou 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.