Skip to main content

Event Catalog

The Business Wallet emits a small, deliberately focused set of domain events to integration channels. Every event:

  • Is wrapped in a CloudEvents 1.0 envelope.
  • Has a type ending in .v<major> — backwards-compatible additions reuse the same major version, breaking changes mint a new one.
  • Has a public JSON Schema at ${WALLET_BASE_URL}/api/public/schemas/integration/<slug>/v1.json (no authentication required) which is also pinned in the envelope's dataschema attribute.

Catalog at a glance

Event typeTriggersubject pattern
com.credenco.businesswallet.wallet.created.v1A Business Wallet is created.wallets/{walletExternalKey}
com.credenco.businesswallet.identifier.created.v1A wallet identifier (DID, X509, or JWK) is created.wallets/{walletExternalKey}/identifiers/{identifierExternalKey}

All event types follow the naming convention com.credenco.businesswallet.<aggregate>.<verb>.v<major>. The trailing .v<major> segment is the major version. Backward-compatible additions (new optional fields) ship as the same .v1 type; breaking changes ship as a new type (.v2) so existing consumers keep working.

JSON Schemas are served at ${WALLET_BASE_URL}/api/public/schemas/integration/<slug>/v1.json (no authentication required) and are pinned per-event via the dataschema envelope attribute.


com.credenco.businesswallet.wallet.created.v1

Trigger. Fired exactly once when a Business Wallet is created — either via the UI, the public API, or onboarding. The event is published atomically with the wallet itself, so consumers will never observe a wallet that the wallet itself does not yet know about.

Subject. wallets/{walletExternalKey}

Data fields.

FieldTypeDescription
walletExternalKeystring (UUID)Stable external identifier of the wallet. Match this against your own records.
displayNamestringHuman-readable name shown in the wallet UI.
emailstring | nullPrimary contact email, if provided during creation.
websitestring | nullPrimary website URL, if provided.
phoneNumberstring | nullPrimary phone number, if provided.
addressobject | nullPostal address with street, postalCode, city, country. Any inner field may be null.
createdAtstring (RFC 3339)UTC timestamp of wallet creation.
createdBystringSubject (sub) of the principal that created the wallet — a human user ID or an OAuth2 client ID.

Sample envelope (binary CloudEvents over HTTP).

POST /webhooks/credenco HTTP/1.1
Host: receiver.example.com
Content-Type: application/json
ce-specversion: 1.0
ce-type: com.credenco.businesswallet.wallet.created.v1
ce-source: /credenco/wallets
ce-id: 9c7d6b1f-1d17-4c2c-8a5d-2e0f6b1a4f10
ce-time: 2026-05-01T09:42:17.812Z
ce-subject: wallets/3f2504e0-4f89-41d3-9a0c-0305e82c3301
ce-dataschema: https://wallet.acc.credenco.com/api/public/schemas/integration/wallet-created/v1.json
ce-datacontenttype: application/json
ce-walletexternalkey: 3f2504e0-4f89-41d3-9a0c-0305e82c3301
ce-correlationid: 5b1e2dca-6c3a-4b9b-9f0d-7c12da3a1b88
X-Credenco-Signature: t=1746094937,v1=2c1f8e30…

{
"walletExternalKey": "3f2504e0-4f89-41d3-9a0c-0305e82c3301",
"displayName": "Acme Healthcare B.V.",
"email": "ops@acme-healthcare.example",
"website": "https://acme-healthcare.example",
"phoneNumber": "+31 20 555 0100",
"address": {
"street": "Tolnasingel 3",
"postalCode": "2411 PV",
"city": "Bodegraven",
"country": "NL"
},
"createdAt": "2026-05-01T09:42:17.812Z",
"createdBy": "auth0|admin@acme-healthcare.example"
}

JSON Schema. https://wallet.acc.credenco.com/api/public/schemas/integration/wallet-created/v1.json


com.credenco.businesswallet.identifier.created.v1

Trigger. Fired exactly once when a wallet identifier (DID, X509 certificate, or JWK) is created. Like wallet.created.v1, the event is published atomically with the underlying change so it is never lost.

Subject. wallets/{walletExternalKey}/identifiers/{identifierExternalKey}

Data fields.

FieldTypeDescription
walletExternalKeystring (UUID)External identifier of the owning wallet.
identifierExternalKeystring (UUID)Stable external identifier of the identifier itself.
identifierTypeenumOne of DID, X509, JWK.
identifierstringThe actual identifier value — a DID URI, an X509 subject, or a JWK thumbprint.
displayNamestringHuman-readable label set by the operator.
didTypestring | nullPopulated only when identifierType = DID (e.g. did:web, did:key, did:ebsi). null for X509 and JWK.
didEnvironmentstring | nullPopulated only when identifierType = DID and the DID method has environments (e.g. pilot, production for did:ebsi). null otherwise.
createdAtstring (RFC 3339)UTC timestamp of identifier creation.
createdBystringSubject of the principal that created the identifier.

Sample envelope (binary CloudEvents over HTTP).

POST /webhooks/credenco HTTP/1.1
Host: receiver.example.com
Content-Type: application/json
ce-specversion: 1.0
ce-type: com.credenco.businesswallet.identifier.created.v1
ce-source: /credenco/wallets
ce-id: 7e2b1a86-9c1e-4d2e-b6a4-1f8db4a90f22
ce-time: 2026-05-01T09:43:02.401Z
ce-subject: wallets/3f2504e0-4f89-41d3-9a0c-0305e82c3301/identifiers/c4a4e34b-1d6d-4b9a-9e6f-3a7d6f8b1e02
ce-dataschema: https://wallet.acc.credenco.com/api/public/schemas/integration/identifier-created/v1.json
ce-datacontenttype: application/json
ce-walletexternalkey: 3f2504e0-4f89-41d3-9a0c-0305e82c3301
ce-correlationid: 5b1e2dca-6c3a-4b9b-9f0d-7c12da3a1b88
X-Credenco-Signature: t=1746094982,v1=8d4a91c2…

{
"walletExternalKey": "3f2504e0-4f89-41d3-9a0c-0305e82c3301",
"identifierExternalKey": "c4a4e34b-1d6d-4b9a-9e6f-3a7d6f8b1e02",
"identifierType": "DID",
"identifier": "did:web:acme-healthcare.example",
"displayName": "Primary issuer DID",
"didType": "did:web",
"didEnvironment": null,
"createdAt": "2026-05-01T09:43:02.401Z",
"createdBy": "auth0|admin@acme-healthcare.example"
}

JSON Schema. https://wallet.acc.credenco.com/api/public/schemas/integration/identifier-created/v1.json


Versioning

The trailing .v1 segment in every event type is the major version. We follow these rules:

  • Adding a new optional field to the data payload is backward compatible and ships as the same v1 type. Build your receivers so that unknown fields are ignored.
  • Removing a field, renaming a field, or changing a field's type is breaking and ships as a new major version (v2). The old v1 type is kept emitting in parallel for at least one major release cycle so you have time to migrate.
  • New event types are added freely; existing receivers are never auto-subscribed to them.

Pin the schema you tested against in your receiver code by storing the dataschema attribute alongside any persisted event.