Single, Batch, and Multiple Issuance
Procivis One enables you to receive single credentials, credentials issued as part of a batch, and multiple credentials in one issuance flow. The wallet also groups credentials that represent the same underlying credential when it is issued in more than one format. This page explains how these types differ, and how the wallet decides whether credentials get grouped together.
Single credentials
A single credential is issued once. The wallet then reuses this credential
across multiple presentations. In the list and detail credential endpoints,
these credentials appear as "type": "SINGLE".
Batch credentials
Multiple credentials are issued at once. When you receive a batch
credential the system creates a batch parent — a logical record that tracks
and manages the batch — along with the individual batch items themselves,
which are the credentials actually issued and presented. In the list and
detail credential endpoints, these appear as "type": "BATCH_PARENT" and
"type": "BATCH_ITEM". The wallet automatically generates a unique
holder-binding key for each batch item.
A batch parent is created when either:
- the issuer offers more than one credential (a batch size greater than 1), or
- the issuer offers a single credential, or omits batch-size metadata, but the credential has an expiry date and a refresh token is available
The second condition exists because an expiry date plus a refresh token together mean the credential can be renewed later — the wallet groups it as a batch so future refreshes stay connected to it, rather than treating it as a one-off credential.
If you specify an identifier when accepting the offer instead of letting the system auto-generate one, the system will not bind multiple credentials from an offered batch. It binds a single credential to that identifier instead, since there's no benefit to holding multiple copies against the same identifier.
When you use the batch parent for submitting presentations, the Core
automatically chooses the oldest (unused) batch item closest to expiration.
Once presented, the system updates the credential's consumedAt field,
found in the credential detail endpoint, and then never uses that credential
again.
Batch check and refresh
Use:
POST /api/credential/v1/revocation-checkto check status andPOST /api/interaction/v1/{interactionId}/issuance/refreshto request a new batch of credentials from the issuer
New batch items are automatically connected to the original batch parent.
Multiple credentials issuance
When an issuer offers multiple credentials in one issuance flow,
POST /api/interaction/v1/issuance-accept iterates through all offered
configurations and accepts all supported configurations, returning the
resulting credentials in the credentialIds array.
If any configuration is not supported it is skipped, a warning is logged,
and partiallySuccessful is returned true. If no configuration is
supported, the call fails. Configurations can be skipped for different
reasons:
- No
formatprovider enabled matching the format of the offer - Format string is unknown
- Identifier or key offered does not match the configuration
Multi-format issuance and credential grouping
When the same credential is offered in more than one format within a
single issuance — for example, both SD-JWT VC and mdoc — the wallet tries
to recognize them as the same underlying credential and group them
together, so you do not end up with a separate wallet entry per format.
Grouped credentials use the same batch parent / batch item model described
above: the different formats become BATCH_ITEMs under a shared
BATCH_PARENT, following the same
batch parent conditions — the group only forms if
the offer's batch size is greater than 1, or the credentials have an
expiry date and a refresh token available. Otherwise each format is issued
as its own separate SINGLE credential.
Credentials can only be grouped this way if the wallet first determines they share the same credential schema.
How the wallet matches schemas
-
Same ecosystem schema ID: the wallet treats the credentials as the same schema.
- If the incoming credential has claim differences that do not conflict with what the wallet already knows — for example, a few additional optional claims — the wallet updates its existing schema record to include them.
- If the differences conflict with what the wallet expects — a claim the wallet considers required is missing, or the incoming credential changes whether a claim is required — acceptance of that credential fails.
-
No ecosystem schema ID, or different IDs: the wallet looks for an existing schema to group with, checking, in order:
The credential schema name matches exactly.
The claim translation names match in at least one language, even if the underlying technical claim keys differ.
The required flag on those claims matches.
If all of these match, the wallet groups the credentials as the same schema, even without a shared ecosystem schema ID.
Two credentials of the same format with different ecosystem schema IDs are always treated as different credentials. This matching logic is only for reconciling different formats of what is otherwise the same credential — it never merges same-format credentials that simply have different translations.
Scope of grouping
Grouping happens per issuance. When you accept an issuance, the wallet groups whatever it can within that single "handle invitation" interaction; credentials from separate issuance interactions are never grouped together, even where the schema would otherwise match. Once a batch parent is formed, any future refresh (see Batch check and refresh) stays within that same group.
If you specify an identifier instead of letting the system auto-pick, the wallet still requests one credential per offered format and binds all of them to that identifier. Whether they are then grouped into a batch parent still depends on the expiry-date/refresh-token condition above.
Rejecting grouped credentials
After accepting an issuance, you can reject at a more granular level than rejecting the offer as a whole. With grouped or batch credentials, you can reject:
- a single, ungrouped credential — the issuer is notified, and the interaction cannot be continued (no further refresh)
- all items of a particular format — has the same effect, and shuts that format off entirely
- a single batch item — equivalent to marking that item consumed; only that item is removed