billing_id and card holders created before the webhook exists. Both are avoided by simply following the order below.
Grab coffee. ☕ Let’s go.
Step 0: Register (sandbox)
👉 sandbox-api.opencard.io/register You get an Account + admin user. Verify email. Log in. YouraccountId is in the dashboard URL or API responses.
Step 1: Create an account_client and get a token
access_token. All subsequent calls:
Scopes are space-separated. Request only what you need. Full list in Authentication. Always send
Accept: application/json so error responses stay JSON (not an HTML login page).GET /api/v1/application/payment-products returns 200. Auth works.
Step 2: Enable a payment product (once per account)
payment_product_id. You need it for the TPA in step 4.
→ Payment product setup
Step 3: Create a billing profile 🧾
The billing profile is the client’s invoice profile and the switch that turns on products. Theproduct_* flags decide which webhook events the client is allowed to subscribe to — so this must exist before the organization and the webhook.
id as billing_id.
→ Model: Billing
Step 4: Create the TPA 📜
TPA = Transaction Processing Authorisation. Legal permission for the client’s transaction data to flow. First, check who may sign for the company (optional, but saves a round-trip with the client):signature_combinations — the people you’ll add as signatories in step 5.
Then create the TPA:
Response → save
id as tpa_id.
→ TPA flow
Step 5: Add signatories → email goes out 📧
signature_combinations.
Don’t wait for the signature here — continue with steps 6 and 7 right away so the webhook is in place when tpa.signed fires.
Step 6: Create the organization 🏢
The organization is the runtime container for the client. It links the TPA (legal) and the billing (products) together.reference_id = your internal client ID. It comes back in every webhook.
Response → save id as organization_id.
→ Model: Organization
Step 7: Create the webhook 🔔
GET .../organizations/$ORG_ID/webhooks shows active: true. Until then no events are delivered.
→ Webhook setup
Step 8: TPA gets signed → your first webhook ✍️
The signatory clicks the link from step 5, reads the TPA and signs with eID. When every required signatory has signed:- Signed PDF is generated and stored
tpa.signedis POSTed to your webhook — this is your first real event- TPA status →
pending-activation, thenactivatedonce confirmed
X-Event: tpa.signed with organization.reference_id = client_acme_001.
→ eID signing · Event reference
Step 9: Create card holders 👤
Two paths — pick one. Full guide → Card holder onboarding.Path A: Email + eID (new employee)
card_holder.identified → transactions flow.
language is optional. If omitted, OpenCard picks the PDPC language from the TPA country and falls back to English where no translation exists.Path B: identity_id (instant — person already in OpenCard)
card_holder.identified fires instantly + retroactive transaction webhooks replay. ⚡
Verify: you received X-Event: card_holder.identified.
Step 10: Receive your first transaction 🎉
Once the issuer delivers transaction states for an identified card holder:POST .../webhooks/{webhookId}/test/card.transaction.authorized.
You did it. From zero to live transaction data.
Recap — what you stored
Repeat steps 3–9 for every new client. Steps 0–2 are once per account.
What’s next?
- Customer onboarding — the same flow as a production integration guide, with API reference links
- Transaction states — how to handle authorized vs cleared vs deleted
- All webhook events — full payload reference
- Receipt enrichment — digital receipts + true VAT

