Skip to content

Quickstart (Under 5 Minutes)

Resolve your first decentralized identifier and inspect its cryptographic evidence in under 5 minutes.

Terminal window
# 1. Resolve an Ed25519 did:key (instant, locally derived)
curl -s "https://did.is/api/v1/resolve/did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK" | jq .verdict
# 2. Resolve a domain-bound did:web (with TLS leaf inspection & DIF domain linkage)
curl -s "https://did.is/api/v1/resolve/did:web:identity.foundation" | jq '{
outcome: .verdict.outcome,
headline: .verdict.headline,
dimensions: [.dimensions[] | {id, state, statement}]
}'
# 3. W3C Standard DID Resolution v1 (CR Draft 1 Oct 2026)
curl -s -H "Accept: application/did-resolution" \
"https://did.is/api/1.0/identifiers/did:web:identity.foundation" | jq .didDocument

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())