This page covers Path A (email + eID). If the person already exists in OpenCard, use Path B (
identity_id) instead — no email, no waiting. → Card Holder OnboardingPrerequisites
Before creating card holders:- ✅ TPA created (ideally fully signed)
- ✅ Organization created and linked to that TPA
Create card holder (Path A — with email)
| Field | Required | Notes |
|---|---|---|
reference_id | ✅ | Your internal user ID — comes back in every webhook |
email | ✅* | Required unless identity_id provided |
identity_id | ✅* | Link existing identity from TPA (skips email if already identified) |
skip_pdpc_email | ❌ | true = no email sent (you handle consent yourself) |
language | ❌ | PDPC legal text language. Defaults from TPA country |
What happens server-side
- Card holder record created
- PDPC record created, linked to TPA + card holder
- PDPC
token= random 40-char string - Legal text snapshot from latest
type=pdpctemplate - If
identity_idprovided → immediatelyidentify()+card_holder.identifiedwebhook - Unless
skip_pdpc_email→ email queued 📧
The email
| Subject | We need your approval. |
| Link | https://{env}/accounts/{accountId}/pdpcs/{pdpcId}/sign/{token} |
| Language | Card holder’s language setting |
Cardholder signs PDPC
Web flow (not API). Cardholder:- Clicks email link
- Reads PDPC legal text
- Checks ✅ “I have read the text above”
- Clicks “Approve & Identify”
- Assently CoreID loads in
authmode (identity verification, not document signing) - Signs with eID — see eID Signing
- Completes eID
- Validates
identityTokenfrom Assently IdentityService::findOrCreateBySsn(ssn, country, client)- Links identity to card holder →
card_holder.identifiedwebhook (if not already) CardHolderService::signPdpc():signed=true,signed_at=now()- Encrypted
ssn+namestored on PDPC - Signed PDF generated → cloud storage
- 📧 Email with signed PDF to cardholder
- 🔔
card_holder.signed.pdpcwebhook
Card holder lifecycle webhooks
| Event | When | Your action |
|---|---|---|
card_holder.created | API create | Store mapping reference_id → OpenCard |
card_holder.identified | eID identity linked | User verified |
card_holder.signed.pdpc | PDPC signed | Start expecting transactions for this user |
card_holder.deleted | API delete | Remove from your system |
card_holder.email.delivered | PDPC email delivered | Track delivery |
card_holder.email.failed | Email bounced | Resend or fix email |
Update / resend
skip_pdpc_email=false → resends PDPC email.
Delete card holder
card_holder.deleted webhook. Transactions already delivered stay in your system — you handle cleanup.
PDPC legal text variables
Templates use placeholders replaced at creation time:| Placeholder | Replaced with |
|---|---|
{{issuer.name_display}} | Card issuer display name |
{{organization.name}} | {tpa.name} ({tpa.organization_number}) |
{{issuer.name_legal}} | Card issuer legal name |
{{system.name}} | {account.name_system}, {account.name_legal} ({account.organization_number}) |

