At a glance
Path 🅰️ — Email + eID (self-service)
Use when the person doesn’t exist in OpenCard yet — typical for new employees joining a client.Create
What happens
- Card holder + PDPC record created
- 📧 Email queued — subject:
We need your approval. - Link:
https://{env}/accounts/{accountId}/pdpcs/{pdpcId}/sign/{token} - User reads PDPC → checks consent → identifies with eID
- On eID success → identity linked →
card_holder.identifiedwebhook - Retroactive transactions dispatched (everything since last card invoice)
- New transactions flow in real time
Timeline
Path 🅱️ — identity_id (instant)
Use when the person already exists in OpenCard on this TPA — e.g. they have corporate cards from the issuer, or were onboarded to another organization under the same TPA.
An identity = a physical person (SSN-linked via eID). They may already have cards attached. You skip the email entirely and link directly.
Step 1: List identities on the TPA
Response (per identity):
Step 2: Create card holder with identity_id
What happens
- Card holder created
- Immediately linked to existing identity →
identify()called - 🔔
card_holder.identifiedwebhook fires right away - 🚀
SendRetroactiveWebhookEventsJobdispatched — all historical transaction states for their cards on this TPA are replayed to your webhook - New transactions flow in real time from this point
Timeline
Validation rules
identity_idmust exist- Identity must belong to a client linked to this TPA — you can’t use identities from a different client’s TPA
- Either
emailoridentity_idrequired (not both required, but one must be present) reference_idmust be unique within the organization (create and update)
Which path should I use?
Two ways to link a person in your EMS to card spend in OpenCard:
Choose 🅱️ when you can reliably match people across systems — bulk onboard, no inbox friction, but the two registers must stay in sync.
Choose 🅰️ when you want the person to prove who they are before you receive their transactions — self-service activate flows, new hires without a shared employee id, or when you don’t maintain dual registers.
Client already receives transactions from the issuer another way? See Current card issuer integration.
Webhooks to handle
Your integration should key off
card_holder.identified as the moment transactions are expected.
Update / delete
Update
reference_id is required. email is optional — omit it to keep the current value (including null for identity-linked holders without email).
Change reference ID only (no PDPC email if already identified / no email on record):
PDPC email is resent only when all of: PDPC unsigned or no
identity_id, skip_pdpc_email is false, and the card holder has an email address.
reference_id must be unique within the organization. Duplicate → 400 Bad Request with message Card holder reference … already exists (same as create).
List card holders
q, reference_id, where_ssn_set, where_signed_pdpc, where_email_delivered).
Response (per item):

