Official Python SDK for the UVerify API
Project description
uverify-sdk (Python)
Official Python SDK for the UVerify API.
Requirements
- Python 3.8+
requests≥ 2.28
Installation
pip install uverify-sdk
Quick Start
from uverify_sdk import UVerifyClient
client = UVerifyClient()
# Verify a document hash
certificates = client.verify("a3b4c5d6...")
for cert in certificates:
print(cert.transaction_hash, cert.creation_time)
Usage
Creating the client
from uverify_sdk import UVerifyClient
# Connect to the public API (default)
client = UVerifyClient()
# Connect to a self-hosted instance
client = UVerifyClient(base_url="http://localhost:9090")
# Add custom headers and set a custom timeout
client = UVerifyClient(headers={"X-Custom-Header": "value"}, timeout=60)
# Register default signing callbacks so you don't pass them on every call
client = UVerifyClient(
sign_message=lambda msg: wallet.sign_data(address, msg),
sign_tx=lambda tx: wallet.sign_tx(tx),
)
Verify a certificate
# By data hash
certificates = client.verify("sha256-or-sha512-hex-hash")
# By transaction hash + data hash
cert = client.verify_by_transaction("cardano-tx-hash", "data-hash")
Issue certificates
issue_certificates handles the full flow — build, sign, submit — in one call
and returns the Cardano transaction hash on success.
metadata can be a plain dict; the SDK serialises it to JSON automatically.
from uverify_sdk.models import CertificateData
tx_hash = client.issue_certificates(
address="addr1...",
certificates=[
CertificateData(
hash="sha256-hash-of-document",
algorithm="SHA-256",
metadata={"issuer": "Acme Corp", "date": "2024-01-01"},
)
],
sign_tx=lambda tx: wallet.sign_tx(tx), # omit if set in constructor
)
print("Certified at tx:", tx_hash)
Optionally pass a state_id to issue under a specific state:
tx_hash = client.issue_certificates(
address="addr1...",
certificates=[CertificateData(hash="sha256-hash")],
state_id="my-state-id",
)
User state management
# Retrieve current state
state = client.get_user_info("addr1...")
print("Certificates remaining:", state.countdown if state else None)
# Invalidate a state
client.invalidate_state("addr1...", "state-id")
# Opt out entirely
client.opt_out("addr1...", "state-id")
A per-call signing callback can be passed as the sign_message keyword argument
to any of these methods if you didn't register one in the constructor.
Low-level access via .core
For advanced flows (multi-sig, custom submission logic) use the .core attribute
to call each step individually:
from uverify_sdk.models import BuildTransactionRequest, CertificateData
# Build
response = client.core.build_transaction(
BuildTransactionRequest(
type="default",
address="addr1...",
state_id="your-state-id",
certificates=[CertificateData(hash="sha256-hash", algorithm="SHA-256")],
)
)
# Sign with your wallet, then submit
witness_set = wallet.sign_tx(response.unsigned_transaction)
tx_hash = client.core.submit_transaction(response.unsigned_transaction, witness_set)
from uverify_sdk.models import UserActionRequest, ExecuteUserActionRequest
# Two-step user state action (manual)
challenge = client.core.request_user_action(
UserActionRequest(address="addr1...", action="USER_INFO")
)
sig = wallet.sign_data(address, challenge.message)
result = client.core.execute_user_action(
ExecuteUserActionRequest(
address=challenge.address,
action=challenge.action,
message=challenge.message,
signature=challenge.signature,
timestamp=challenge.timestamp,
user_signature=sig.signature,
user_public_key=sig.key,
)
)
print(result.state)
Error Handling
from uverify_sdk import UVerifyApiError, UVerifyValidationError
try:
tx_hash = client.issue_certificates("addr1...", certs)
except UVerifyApiError as e:
# HTTP error from the API (status code, response body available)
print(f"API error {e.status_code}: {e}")
except UVerifyValidationError as e:
# Missing sign callback — pass one to the method or set it in the constructor
print(e)
API Reference
High-level helpers
| Method | Description |
|---|---|
verify(hash) |
Look up all on-chain certificates for a data hash |
verify_by_transaction(tx_hash, data_hash) |
Fetch a specific certificate by tx hash + data hash |
issue_certificates(address, certificates, sign_tx?, state_id?) |
Build, sign, and submit a certificate transaction; returns tx hash |
get_user_info(address, sign_message?) |
Retrieve the current user state |
invalidate_state(address, state_id, sign_message?) |
Mark a state as invalid |
opt_out(address, state_id, sign_message?) |
Remove the user's state entirely |
Low-level core (.core)
| Method | Endpoint |
|---|---|
core.build_transaction(request) |
POST /api/v1/transaction/build |
core.submit_transaction(tx, witness_set?) |
POST /api/v1/transaction/submit |
core.request_user_action(request) |
POST /api/v1/user/request/action |
core.execute_user_action(request) |
POST /api/v1/user/state/action |
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file uverify_sdk-0.1.2.tar.gz.
File metadata
- Download URL: uverify_sdk-0.1.2.tar.gz
- Upload date:
- Size: 15.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
687bae51d7db09b28b5ca4383e1f3bd4072cb5301bb17ceba650d64486476321
|
|
| MD5 |
ce771bfcce999388f0de65a9d54a6609
|
|
| BLAKE2b-256 |
8e09b25db7e1a068d4378ddc56665c9548f44b93e129a9fb5c87a2181a7f8774
|
Provenance
The following attestation bundles were made for uverify_sdk-0.1.2.tar.gz:
Publisher:
publish-python.yml on UVerify-io/uverify-sdks
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
uverify_sdk-0.1.2.tar.gz -
Subject digest:
687bae51d7db09b28b5ca4383e1f3bd4072cb5301bb17ceba650d64486476321 - Sigstore transparency entry: 1032750302
- Sigstore integration time:
-
Permalink:
UVerify-io/uverify-sdks@bfbe0335d31af09f51cdf8af0ec3da3530c5f42b -
Branch / Tag:
refs/heads/main - Owner: https://github.com/UVerify-io
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-python.yml@bfbe0335d31af09f51cdf8af0ec3da3530c5f42b -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file uverify_sdk-0.1.2-py3-none-any.whl.
File metadata
- Download URL: uverify_sdk-0.1.2-py3-none-any.whl
- Upload date:
- Size: 14.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
54ee5ff38d2e3c5ee3e4e6ac27a1ab168fec4acf189e441e5ed736d6cafe2055
|
|
| MD5 |
8a534ee1c263532de845d0fc56b2abb1
|
|
| BLAKE2b-256 |
317155a9ff23db5ec89e97b411b67544206ecfca02b08ff8910083d7a7c6cec7
|
Provenance
The following attestation bundles were made for uverify_sdk-0.1.2-py3-none-any.whl:
Publisher:
publish-python.yml on UVerify-io/uverify-sdks
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
uverify_sdk-0.1.2-py3-none-any.whl -
Subject digest:
54ee5ff38d2e3c5ee3e4e6ac27a1ab168fec4acf189e441e5ed736d6cafe2055 - Sigstore transparency entry: 1032750371
- Sigstore integration time:
-
Permalink:
UVerify-io/uverify-sdks@bfbe0335d31af09f51cdf8af0ec3da3530c5f42b -
Branch / Tag:
refs/heads/main - Owner: https://github.com/UVerify-io
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-python.yml@bfbe0335d31af09f51cdf8af0ec3da3530c5f42b -
Trigger Event:
workflow_dispatch
-
Statement type: