Issue Supplier Credentials to a Business Wallet
How does supplier credential issuance work?
Issuing a supplier credential involves three parties: the issuing authority's portal, its backend, and the Credenco Business Wallet, which creates and signs the credential. Unlike personal wallet issuance, this works entirely in the browser - the authority's portal redirects SecureStaff BV to the credential offer, and the company accepts it with a single click.
Key Concepts
| Concept | Description |
|---|---|
| Business Wallet | A browser-based wallet that stores verifiable credentials for organizations - no mobile app required |
| Credential Offer URL | The URL returned by the API that the user navigates to in their browser to accept the credential |
| OpenID4VCI | The open standard protocol used for credential issuance between the business wallet and the Credenco platform |
| Correlation ID | A business key you provide to track the issuance process and check its status |
Sequence Diagram
The diagram below shows the complete interaction between all parties - from the moment SecureStaff BV requests a credential to the moment it appears in their business wallet. This flow is identical for every credential type.
Step-by-Step Integration
Prerequisites
Before you begin, make sure you have:
- A Credenco Business Wallet account (sign up here)
- An Issuer Template configured - Create Issuer Template
- A Credential Template configured - Create Credential Template
- API access enabled - Set up API authentication
Step 1: Start the Credential Issuance
When a supplier requests a credential from your portal, your backend calls the Start issue Credential API.
Example: Issuing a KVK registration extract credential
Request:
curl -X POST https://your-wallet.credenco.com/api/v2/credential/issue \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"correlation_id": "kvk-securestaff-2026",
"template_id": "kvk_registration_extract",
"claims": {
"kvk_number": "12345678",
"legal_name": "SecureStaff BV",
"legal_form": "Besloten Vennootschap",
"registration_date": "2018-04-15",
"address": "Herengracht 100, 1015 BS Amsterdam",
"authorized_signatory": "Jan van der Berg"
}
}'
Note: There is no qr_code parameter in the request. When qr_code is omitted, the response returns a request_uri - a URL that the user navigates to in their browser. This is the standard flow for business wallets.
Response:
{
"correlation_id": "kvk-securestaff-2026",
"request_uri": "openid-credential-offer://?credential_offer_uri=https://your-wallet.credenco.com/openid4vc/credentialOffer?id=a3b7c9d1-4e5f-6a7b-8c9d-0e1f2a3b4c5d",
"status_uri": "https://your-wallet.credenco.com/api/v2/issue/kvk-securestaff-2026"
}
| Field | Description |
|---|---|
correlation_id | Your business key to track this issuance |
request_uri | The credential offer URL - redirect the user's browser to this URL |
status_uri | Endpoint to poll for status updates |
Step 2: Redirect the User to the Credential Offer
The request_uri in the response is a URL that opens the credential in the supplier's business wallet. Redirect the user's browser to this URL:
// In your frontend, after receiving the response from your backend:
window.location.href = response.request_uri;
Or render it as a link:
<a href="openid-credential-offer://?credential_offer_uri=...">
Open in your Business Wallet
</a>
The supplier's browser navigates to their business wallet, which displays the credential details. The supplier reviews and clicks "Accept" to store the credential.
Step 3: Check the Issuance Status
After the redirect, your backend can poll the Get issue status API to track progress:
curl https://your-wallet.credenco.com/api/v2/credential/issue/kvk-securestaff-2026 \
-H "x-api-key: YOUR_API_KEY"
Response (after credential is accepted):
{
"status": "issue_completed",
"correlation_id": "kvk-securestaff-2026",
"last_updated": 1751155200000,
"revocation_uuid": "7f3a2b1c-9d8e-4f5a-6b7c-8d9e0f1a2b3c"
}
| Status | Meaning |
|---|---|
issue_request_created | The credential offer has been created, waiting for the wallet to pick it up |
credential_offer_retrieved | The business wallet has retrieved the offer |
issue_completed | The credential has been successfully issued and accepted |
error | Something went wrong during the issuance process |
Tip: Save the revocation_uuid from the completed response. You'll need it if you ever want to revoke the credential in the future.
Optional: Use Callbacks Instead of Polling
Instead of polling the status endpoint, you can provide a callback URL in the issue request. Credenco will notify your backend automatically when the status changes:
{
"correlation_id": "kvk-securestaff-2026",
"template_id": "kvk_registration_extract",
"claims": { ... },
"callback": {
"url": "https://your-backend.com/webhooks/credential-status",
"status": ["issue_completed", "error"]
}
}
Your callback endpoint will receive a POST request with the status update whenever the issuance completes or fails.
Credential Examples
Each authority issues a different credential type. Below are example claims payloads for each of the five supplier onboarding documents.
KVK Registration Extract
Issued by the Chamber of Commerce (KVK).
{
"template_id": "kvk_registration_extract",
"claims": {
"kvk_number": "12345678",
"legal_name": "SecureStaff BV",
"legal_form": "Besloten Vennootschap",
"registration_date": "2018-04-15",
"address": "Herengracht 100, 1015 BS Amsterdam",
"authorized_signatory": "Jan van der Berg"
}
}
Tax Compliance Statement
Issued by the Tax Authority (Belastingdienst).
{
"template_id": "tax_compliance_statement",
"claims": {
"rsin": "987654321",
"company_name": "SecureStaff BV",
"compliance_status": "compliant",
"valid_from": "2026-01-01",
"valid_until": "2026-12-31"
}
}
VAT Registration
Issued by the Tax Authority (Belastingdienst).
{
"template_id": "vat_registration",
"claims": {
"vat_number": "NL123456789B01",
"company_name": "SecureStaff BV",
"registration_date": "2018-04-20"
}
}
Bank Account Details
Issued by the supplier's bank (e.g., ABN AMRO).
{
"template_id": "bank_account_details",
"claims": {
"bank_name": "ABN AMRO",
"iban": "NL91ABNA0417164300",
"account_holder": "SecureStaff BV",
"bic": "ABNANL2A"
}
}
Insurance Certificate
Issued by the insurer (e.g., Allianz).
{
"template_id": "insurance_certificate",
"claims": {
"insurer": "Allianz",
"policy_number": "AVB-2026-00412",
"coverage_type": "Professional Liability",
"insured_party": "SecureStaff BV",
"valid_from": "2026-01-01",
"valid_until": "2027-01-01",
"coverage_amount": "2.500.000"
}
}
Complete Flow at a Glance
Calls the Issue API with the credential details - no QR code parameter
The portal redirects the supplier's browser to the credential offer URL
The business wallet shows the credential - the supplier clicks Accept
The credential is stored in the business wallet via OpenID4VCI
API Reference
| API | Method | Endpoint | Description |
|---|---|---|---|
| Start issue Credential | POST | /api/v2/credential/issue | Start the credential issuance and get a credential offer URL |
| Get issue status | GET | /api/v2/credential/issue/{correlationId} | Check the status of an issuance process |
| Revoke Credential | POST | /api/v2/credential/revoke | Revoke a previously issued credential |
What's Next?
Now that you understand how to issue supplier credentials to a business wallet, you might want to explore:
- Verify Supplier Credentials - See how the broker verifies all five credentials at once
- Create Credential Templates - Design the credential types your organization issues
- API Authentication - Set up OAuth2 or API key authentication
- Verify Credentials - Request and verify credentials from holders