didis-py
Official Python SDK for the DID.is public API: DID resolution with evidence, W3C DID Resolution, verifiable credentials, explicit policies, and MCP/A2A agent trust. Sync and async clients on httpx; Python 3.11+. Responses are plain dicts typed with TypedDict (didis.types), so editors and mypy know their shape.
The distribution is didis-py; the import name is didis.
Install
pip install didis-py
Usage
from didis import DidisClient, AsyncDidisClient, DidisError
# Defaults to the public API at https://did.is/api; pass base_url when self-hosting.
with DidisClient() as didis:
r = didis.resolve("did:web:identity.foundation")
print(r["verdict"]["headline"])
for d in r["dimensions"]:
print(d["label"], d["state"])
# DID Resolution v1 (W3C CR Draft HTTPS binding, unmodified)
w3c = didis.resolve_w3c("did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK")
# Live resolution stream (server-sent events)
for event, data in didis.stream("did:web:identity.foundation"):
if event == "stage":
print(data["label"], data["status"])
# Credentials: VC DM 2.0 / 1.1, Data Integrity (eddsa-jcs-2022, ecdsa-jcs-2019), VC-JOSE/VC-JWT
vc = didis.verify_credential(credential)
print(vc["status"], vc["headline"])
# Policies are explicit rules, never scores
out = didis.evaluate_policy(
"did:web:example.com",
{"rules": {"allowedMethods": ["web", "webvh"], "domainBinding": "required"}},
)
print(out["evaluation"]["status"])
# Agents
mcp = didis.inspect_mcp("https://mcp.example.com/mcp")
print(mcp["status"], mcp["inventoryHash"], len(mcp["tools"]))
decision = didis.authorize(chain, "payments.refund", trusted_roots=["did:web:example.com"])
print(decision["authorization"]["decision"])
try:
didis.resolve("did:web:does-not-exist.invalid")
except DidisError as e:
print(e.status, e.problem.get("code"), e.problem.get("detail"))
async def main() -> None:
async with AsyncDidisClient() as didis:
diff = await didis.diff("did:web:example.com")
print(diff)
Identifiers are percent-encoded exactly once (quote(did, safe="")). Non-2xx responses raise DidisError with the RFC 9457 problem body.
Webhooks
Monitoring routes need admin_token= and belong on servers only. Verify deliveries with:
from didis import verify_webhook_signature
ok = verify_webhook_signature(
secret,
request.headers["x-didis-timestamp"],
raw_body,
request.headers["x-didis-signature-256"],
)
Public API reference: https://did.is/developers. Monitoring routes need admin_token= and are only available on self-hosted deployments; they are not exposed by the public API.
License
MIT
Metadata
Release files for didis-py 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| didis_py-0.1.0.tar.gz | 11.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| didis_py-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 21.5 kB
Release files / didis_py-0.1.0.tar.gz
| Download URL | didis_py-0.1.0.tar.gz |
|---|---|
| Size | 11.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8e2b6ddade4b8975a549575993e0b85ee0eff204dfa3cdd11de7dc805de1dbbf
|
|
BLAKE2b-256 checksum How to use checksums |
313be6d8b1ceff752e86208193558996d03b8692c90b6c7422e29c95d0025074
|
| 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 Oct 5, 2026.
Transparency logRelease files / didis_py-0.1.0-py3-none-any.whl
| Download URL | didis_py-0.1.0-py3-none-any.whl |
|---|---|
| Size | 10.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c995d67dbc20f5918719f34d7695070cdc9e3b0ea24e831a103c31e0f8c7537f
|
|
BLAKE2b-256 checksum How to use checksums |
6857ad632744647e753cdda4a6f40c00af042f2fd88ced5cbf371ed4e770dbef
|
| 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 Oct 5, 2026.
Transparency log