Skip to content

SDKs & Installation

Zero external dependencies. Runs seamlessly on Node.js 18+, Bun, Deno, modern browsers, and edge runtimes (Cloudflare Workers, Vercel Edge).

Terminal window
npm install @didis/client
import { DidisClient, DidisError } from "@didis/client";
// Initializes against the default public API (https://did.is/api)
const didis = new DidisClient();
async function main() {
try {
const res = await didis.resolve("did:web:identity.foundation");
console.log(`Outcome: ${res.verdict.outcome}`);
console.log(`Headline: ${res.verdict.headline}\n`);
console.log("Evidence Dimensions:");
for (const dim of res.dimensions) {
console.log(` [${dim.state.padEnd(16)}] ${dim.label}: ${dim.statement}`);
}
console.log("\nKeys:");
for (const key of res.evidence.keys) {
console.log(` ${key.id} (${key.curve ?? "unknown curve"}) -> ${key.status}`);
}
} catch (err) {
if (err instanceof DidisError) {
console.error(`DID.is Error (${err.status}): [${err.problem.code}] ${err.problem.detail}`);
if (err.problem.retryAfter) {
console.error(`Rate limited. Retry after ${err.problem.retryAfter}s`);
}
} else {
console.error("Network failure:", err);
}
}
}
main();

Full sync and async support built on httpx. Fully typed for Python 3.11+.

Terminal window
pip install didis-py
from didis import DidisClient, DidisError
def main() -> None:
# Synchronous client (defaults to https://did.is/api)
with DidisClient() as client:
try:
res = client.resolve("did:web:identity.foundation")
print(f"Outcome: {res['verdict']['outcome']}")
print(f"Headline: {res['verdict']['headline']}\n")
print("Evidence Dimensions:")
for dim in res["dimensions"]:
print(f" [{dim['state']:<16}] {dim['label']}: {dim['statement']}")
print("\nKeys:")
for key in res["evidence"]["keys"]:
print(f" {key['id']} ({key.get('curve', 'unknown')}) -> {key['status']}")
except DidisError as err:
print(f"DID.is Error ({err.status}): [{err.problem.get('code')}] {err.problem.get('detail')}")
if __name__ == "__main__":
main()
import asyncio
from didis import AsyncDidisClient, DidisError
async def main() -> None:
async with AsyncDidisClient() as client:
try:
res = await client.resolve("did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK")
print(f"Resolved: {res['verdict']['headline']}")
except DidisError as err:
print(f"Error ({err.status}): {err.problem.get('title')}")
if __name__ == "__main__":
asyncio.run(main())