Skip to main content
A card holder = one person in one organization whose card transactions you want in your EMS. Create the card holder with an email. OpenCard sends a PDPC link, the person signs with eID, and transactions start when identification completes.
Card holders come after client setup (billing, TPA, organization, webhook). See the full onboarding flow if you have not finished Phase 1 yet.
Client already receives transactions from the issuer another way? See Current card issuer integration.

Create

Use this for every employee whose card spend should appear in your EMS.

What happens

  1. Card holder + PDPC record created
  2. 📧 Email queued — subject: We need your approval.
  3. Link: https://{env}/accounts/{accountId}/pdpcs/{pdpcId}/sign/{token}
  4. User reads PDPC → checks consent → identifies with eID
  5. On eID success → identity linked → card_holder.identified webhook
  6. Retroactive transactions dispatched (everything since last card invoice)
  7. New transactions flow in real time

Timeline

Subscribe to card_holder.identified — that’s your signal that transactions are coming (including a retroactive batch). Don’t wait for card_holder.signed.pdpc alone; identification is what unlocks the pipe.
Full eID details → eID Signing

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. Change reference ID only (no PDPC email if already identified / no email on record):
Change reference ID and email (may resend PDPC email — see below):
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

Supports filters q, reference_id, where_ssn_set, where_signed_pdpc, where_email_delivered. Response (per item):
Names for a card holder list come from this endpoint — read identity. You do not need a separate GET .../tpas/{tpaId}/identities call for that.

meta in API responses

Check consent status without polling webhooks: