Two things, not one
When you call Issue a credential, the platform creates two kinds of resources at once:- An issuance — the offer session. It has
offerUri/offerQrUri, a status that tracks the offer/acceptance flow (offered→completed, orfailed/expired), and any errors that happened along the way. - One or more credentials — the actual credentials that will end up in the user’s wallet. Each has its own id, its own status (
offered/issued/revoked), and is what you act on later (e.g. to revoke).
credentials[] array:
Which one do you need?
Lifecycles, side by side
Two resources, two state machines:Capture both ids at issuance time
The issuance and credential ids are both stable from the moment the issuance is created. You don’t need to wait for the user to accept. The cheapest thing you can do is store both ids against your own record when you issue:- issuance id — so you can ask “was this offer ever accepted?” later, or wire up the
openid4vc.issuance.completedwebhook. - credential id — so you can revoke it without having to hunt for it later.
Reading them back later
If you didn’t capture an id at issuance time, you can recover it: By issuance id, fetch the issuance back and readcredentials[].id from it:
filter[id], filter[status], filter[format], filter[credentialTemplateId], filter[exchange]. Standard cursor pagination via page[size], page[before], page[after].
Full schemas: Credentials API reference.
