This release is a pre-release and may not be stable for production use.
OpenID4VCI
Python implementation of the OpenID4VCI specification for eduTAP.
This implementation follows the final specification of OpenID4VCI 1.0 (https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html).
Scope: the Issuer role
The specification defines three roles: Wallet, Credential Issuer and Authorization Server. This library implements the Credential Issuer. The Wallet role belongs to Google Wallet, Apple Wallet, the EUDI Wallet and others; we talk to them, we do not implement them.
Whether the Authorization Server is this application or a separate deployment
is left open — the issuer metadata field authorization_servers carries
either answer.
Credential formats
Adapters exist for the three Credential Format Profiles of Appendix A. Note the exact format identifiers, because they are what a Wallet matches against:
| Profile | Identifier | Reference |
|---|---|---|
| ISO mdoc | mso_mdoc |
ISO/IEC 18013-5 |
| IETF SD-JWT VC | dc+sd-jwt |
https://datatracker.ietf.org/doc/draft-ietf-oauth-selective-disclosure-jwt-vc/ |
| W3C VCDM | jwt_vc_json, jwt_vc_json-ld, ldp_vc |
https://www.w3.org/TR/vc-data-model-2.0/ |
Earlier drafts used vc+sd-jwt for SD-JWT VC. Current profiles — among them
the OpenID4VC High Assurance Interoperability Profile
1.0
— use dc+sd-jwt.
Installation
pip install openid4vci
CBOR and COSE are only needed by the ISO mdoc profile, so they sit behind an
extra. Install it when you issue mso_mdoc:
pip install "openid4vci[mdoc]"
JOSE is not optional and ships with the base install: key possession proofs, signed issuer metadata and encrypted responses are all JWS/JWE/JWK.
Endpoints and their modules
| Section | Endpoint | Module |
|---|---|---|
| 4 | Credential Offer | models/offer.py |
| 5 / 6 | Authorization, Token | models/oauth.py |
| 7 | Nonce | models/nonce.py |
| 8 | Credential | models/credential.py |
| 9 | Deferred Credential | models/deferred.py |
| 10 | Encrypted requests and responses | crypto/encryption.py |
| 11 | Notification | models/notification.py |
| 12 | Metadata (issuer and authorization server) | models/metadata.py |
Status
The model layer is implemented and tested against the specification: every request, response and metadata document of Sections 4 to 12, with the rules the specification states in prose enforced by validators rather than left to the caller.
jwt key proof validation (Appendix F.1) is implemented, as is the FastAPI
router serving the Nonce, Credential, Deferred Credential and Notification
endpoints and the metadata document. The router owns the protocol mechanics
and delegates every decision to an IssuerBackend a deployment provides.
Message encryption (Section 10) and signing are implemented too. The signer is a protocol with a local implementation, so an HSM or a remote signing service can take its place.
Not implemented yet: the credential format adapters (adapters/) and the
di_vp and attestation proof types.
Built against the specification source at tag 1.0-final of
openid/OpenID4VCI. 1.0 is the Final
Specification and is not subject to further revision; 1.1 exists only as a
working group draft.
Documentation
Follows Diataxis, builds with Sphinx and MyST:
make docs
Relationship to the platform packages
Wallet vendors accept OpenID4VCI alongside their own proprietary provisioning APIs. The platform packages depend on this library and add only what is vendor-specific — the offer delivery mechanism, the metadata profile a given wallet accepts, and its trust anchors:
edutap.wallet_google_identity -> openid4vci
edutap.wallet_apple -> (own protocol)
The dependency points one way. Nothing vendor-specific belongs in this package.
Release files for openid4vci 1.0.0a1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| openid4vci-1.0.0a1.tar.gz | 71.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| openid4vci-1.0.0a1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 124.0 kB
Release files / openid4vci-1.0.0a1.tar.gz
| Download URL | openid4vci-1.0.0a1.tar.gz |
|---|---|
| Size | 71.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ea578a1792138ca2046fdcd556236c15dc7ea02e423c872377f86c716f7db85c
|
|
BLAKE2b-256 checksum How to use checksums |
e8b5f20ffd9c0879f5f31d0fd30f966761b780288403ad90e5ba721ef77d4560
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / openid4vci-1.0.0a1-py3-none-any.whl
| Download URL | openid4vci-1.0.0a1-py3-none-any.whl |
|---|---|
| Size | 52.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a678f399c2dff833693730c03f0dc82ecb4c5766844366b2eb9725ee740ea19b
|
|
BLAKE2b-256 checksum How to use checksums |
c2b86aaf693e612e56039a866c54aa24b363e6e2e723956653360ad5eb0b1ff6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency log