API reference
Base URL https://did.is/api. No authentication. This page is generated from the OpenAPI document; use that file for code generation.
Budgets: standard 20 requests per minute, intensive 10 requests per minute, per client. Every error is an RFC 9457 problem; see Errors and rate limits.
Every budgeted operation can answer 429 RATE_LIMITED and 503 CAPACITY_EXHAUSTED. Both carry a Retry-After header with the number of seconds to wait; read it on each response instead of using a fixed delay. Request bodies are limited to 512 KiB (413 PAYLOAD_TOO_LARGE).
| Method | Path | Budget |
|---|---|---|
| GET | /v1/resolve/{did} |
standard |
| GET | /1.0/identifiers/{did} |
standard |
| GET | /v1/stream/{did} |
intensive |
| GET | /v1/dereference/{didUrl} |
standard |
| GET | /v1/fast-verify/did/{did} |
standard |
| GET | /v1/history/{did} |
standard |
| GET | /v1/diff/{did} |
standard |
| GET | /v1/graph/{did} |
standard |
| POST | /v1/credentials/verify |
intensive |
| POST | /v1/policies/evaluate |
intensive |
| POST | /v1/fast-verify/jws |
standard |
| GET | /v1/mcp/inspect |
intensive |
| GET | /v1/a2a/inspect |
intensive |
| POST | /v1/agents/verify-delegation |
intensive |
| POST | /v1/agents/authorize |
intensive |
| GET | /v1/agents/verify-tool |
standard |
| GET | /v1/claims/{did} |
standard |
| GET | /v1/directory |
standard |
| GET | /health |
none |
| GET | /v1/status |
standard |
Resolution
Section titled “Resolution”Resolve with evidence
Section titled “Resolve with evidence”GET /v1/resolve/{did}Superset of the W3C result: verdict (plain-language headline and statements), seven independently evaluated evidence dimensions, the evidence graph, per-stage telemetry, key/linkage/TLS/history evidence and stated limitations. No scores.
Budget: standard.
| Parameter | In | Description |
|---|---|---|
did (required) |
path | The identifier to resolve. |
noCache |
query | Bypass and refresh the resolver cache. |
Responses: 200, 400, 429, 503.
curl -s "https://did.is/api/v1/resolve/did%3Aweb%3Aidentity.foundation"import { DidisClient } from "@didis/client";
const didis = new DidisClient(); // https://did.is/apiconst r = await didis.resolve("did:web:identity.foundation");console.log(r.verdict.headline);from didis import DidisClient
client = DidisClient() # https://did.is/apir = client.resolve("did:web:identity.foundation")print(r["verdict"]["headline"])// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, serde_json = "1"let v: serde_json::Value = reqwest::get("https://did.is/api/v1/resolve/did%3Aweb%3Aidentity.foundation") .await? .error_for_status()? .json() .await?;W3C DID Resolution (CR Draft)
Section titled “W3C DID Resolution (CR Draft)”GET /1.0/identifiers/{did}DID Resolution v1 · W3C Candidate Recommendation Draft (1 Oct 2026) HTTPS binding. Accept: application/did-resolution returns the full resolution result; application/did (or /) returns the DID document only. Errors are RFC 9457 problem objects in didResolutionMetadata.error with the specification’s status codes (400 invalid DID, 404 not found, 406 representation not supported, 410 deactivated, 501 method not supported). DID URLs (fragments, ?service=, ?versionId=) are dereferenced.
Budget: standard.
| Parameter | In | Description |
|---|---|---|
did (required) |
path | Raw or fully percent-encoded (did%3A…); decoded exactly once. |
Accept |
header | application/did-resolution | application/did |
Responses: 200, 400, 404, 406, 410, 429, 501, 503.
curl -s "https://did.is/api/1.0/identifiers/did%3Aweb%3Aidentity.foundation" \ -H 'Accept: application/did-resolution'import { DidisClient } from "@didis/client";
const didis = new DidisClient(); // https://did.is/apiconst result = await didis.resolveW3c("did:web:identity.foundation");from didis import DidisClient
client = DidisClient() # https://did.is/apiresult = client.resolve_w3c("did:web:identity.foundation")// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, serde_json = "1"let v: serde_json::Value = reqwest::get("https://did.is/api/1.0/identifiers/did%3Aweb%3Aidentity.foundation") .await? .error_for_status()? .json() .await?;Live resolution (SSE)
Section titled “Live resolution (SSE)”GET /v1/stream/{did}Server-sent events: one stage event per telemetry stage as it completes, then result (EnrichedResolution) or error (problem), then done.
Budget: intensive.
| Parameter | In | Description |
|---|---|---|
did (required) |
path | The identifier to resolve. |
noCache |
query | Resolve fresh. |
Responses: 200, 400, 429, 503.
curl -sN "https://did.is/api/v1/stream/did%3Aweb%3Aidentity.foundation?noCache=true"import { DidisClient } from "@didis/client";
const didis = new DidisClient(); // https://did.is/apifor await (const ev of didis.stream("did:web:identity.foundation")) { if (ev.event === "stage") console.log(ev.data.stage, ev.data.status);}from didis import DidisClient
client = DidisClient() # https://did.is/apifor event, data in client.stream("did:web:identity.foundation"): print(event, data.get("stage"))// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, serde_json = "1"let v: serde_json::Value = reqwest::get("https://did.is/api/v1/stream/did%3Aweb%3Aidentity.foundation?noCache=true") .await? .error_for_status()? .json() .await?;Dereference a DID URL
Section titled “Dereference a DID URL”GET /v1/dereference/{didUrl}Selects a verification method or service by fragment, a service endpoint by ?service= (with path-traversal-safe relativeRef), or a did:webvh version by versionId / versionTime / versionNumber. Encode ‘#’ as %23.
Budget: standard.
| Parameter | In | Description |
|---|---|---|
didUrl (required) |
path | e.g. did:web:example.com%23key-1 |
Responses: 200, 400, 404, 429, 503.
curl -s "https://did.is/api/v1/dereference/did%3Aweb%3Aidentity.foundation%23key-1"import { DidisClient } from "@didis/client";
const didis = new DidisClient(); // https://did.is/apiconst d = await didis.dereference("did:web:identity.foundation#key-1");from didis import DidisClient
client = DidisClient() # https://did.is/apid = client.dereference("did:web:identity.foundation#key-1")// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, serde_json = "1"let v: serde_json::Value = reqwest::get("https://did.is/api/v1/dereference/did%3Aweb%3Aidentity.foundation%23key-1") .await? .error_for_status()? .json() .await?;Fast DID verdict
Section titled “Fast DID verdict”GET /v1/fast-verify/did/{did}Compact projection for gateways and agents: outcome, headline, dimension states, keys and document hash. Served from cache when fresh.
Budget: standard.
| Parameter | In | Description |
|---|---|---|
did (required) |
path | The identifier. |
noCache |
query | Bypass and refresh the resolver cache. |
Responses: 200, 400, 429, 503.
curl -s "https://did.is/api/v1/fast-verify/did/did%3Aweb%3Aidentity.foundation"import { DidisClient } from "@didis/client";
const didis = new DidisClient(); // https://did.is/apiconst f = await didis.fastVerifyDid("did:web:identity.foundation");from didis import DidisClient
client = DidisClient() # https://did.is/apif = client.fast_verify_did("did:web:identity.foundation")// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, serde_json = "1"let v: serde_json::Value = reqwest::get("https://did.is/api/v1/fast-verify/did/did%3Aweb%3Aidentity.foundation") .await? .error_for_status()? .json() .await?;History and evidence
Section titled “History and evidence”Observation history
Section titled “Observation history”GET /v1/history/{did}Snapshots DID.is recorded for this identifier (coalesced when unchanged). Observations are records, not proofs of history.
Budget: standard.
| Parameter | In | Description |
|---|---|---|
did (required) |
path | The identifier. |
Responses: 200, 400, 429, 503.
curl -s "https://did.is/api/v1/history/did%3Aweb%3Aidentity.foundation"import { DidisClient } from "@didis/client";
const didis = new DidisClient(); // https://did.is/apiconst h = await didis.history("did:web:identity.foundation");from didis import DidisClient
client = DidisClient() # https://did.is/apih = client.history("did:web:identity.foundation")// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, serde_json = "1"let v: serde_json::Value = reqwest::get("https://did.is/api/v1/history/did%3Aweb%3Aidentity.foundation") .await? .error_for_status()? .json() .await?;Semantic diff
Section titled “Semantic diff”GET /v1/diff/{did}Compares two observations: keys added, removed and rotated (same id, new material), relationship changes, services, controller, alsoKnownAs, @context and domain-binding changes. Defaults to the latest two distinct observations.
Budget: standard.
| Parameter | In | Description |
|---|---|---|
did (required) |
path | The identifier. |
from |
query | Older document hash. |
to |
query | Newer document hash. |
Responses: 200, 400, 404, 429, 503.
curl -s "https://did.is/api/v1/diff/did%3Aweb%3Aidentity.foundation"import { DidisClient } from "@didis/client";
const didis = new DidisClient(); // https://did.is/apiconst diff = await didis.diff("did:web:identity.foundation");from didis import DidisClient
client = DidisClient() # https://did.is/apidiff = client.diff("did:web:identity.foundation")// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, serde_json = "1"let v: serde_json::Value = reqwest::get("https://did.is/api/v1/diff/did%3Aweb%3Aidentity.foundation") .await? .error_for_status()? .json() .await?;Evidence graph
Section titled “Evidence graph”GET /v1/graph/{did}The nodes and edges behind a verdict (subject, document, origin, TLS, keys, services, linkage) with the state of every relation. Use it to render or audit why a verdict was reached.
Budget: standard.
| Parameter | In | Description |
|---|---|---|
did (required) |
path | The identifier. |
Responses: 200, 400, 429, 503.
curl -s "https://did.is/api/v1/graph/did%3Aweb%3Aidentity.foundation"import { DidisClient } from "@didis/client";
const didis = new DidisClient(); // https://did.is/apiconst g = await didis.graph("did:web:identity.foundation");console.log(g.nodes.length, g.edges.length);from didis import DidisClient
client = DidisClient() # https://did.is/apig = client.graph("did:web:identity.foundation")print(len(g["nodes"]), len(g["edges"]))// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, serde_json = "1"let v: serde_json::Value = reqwest::get("https://did.is/api/v1/graph/did%3Aweb%3Aidentity.foundation") .await? .error_for_status()? .json() .await?;Credentials and policies
Section titled “Credentials and policies”Verify a credential
Section titled “Verify a credential”POST /v1/credentials/verifyData Integrity (eddsa-jcs-2022, ecdsa-jcs-2019), VC-JWT 1.1 and vc+jwt. The signing key must belong to the issuer DID and be authorised for assertionMethod. Bitstring Status List entries are fetched, their list credential verified, and evaluated fail-closed. Status precedence: MALFORMED > INVALID > UNSUPPORTED > REVOKED > SUSPENDED > EXPIRED > NOT_YET_VALID > INDETERMINATE > VALID.
Budget: intensive.
Request body (JSON):
| Field | Type | Description |
|---|---|---|
credential (required) |
object | Credential object, raw JSON string, or compact JWT. Raw text preserves member identity. |
expectedAudience |
string | Optional expected JWT recipient. Without it, audience is explicitly not verified. |
Responses: 200, 400, 413, 429, 503.
curl -s -X POST "https://did.is/api/v1/credentials/verify" \ -H 'Content-Type: application/json' \ -d '{"credential":{"@context":["https://www.w3.org/ns/credentials/v2"],"type":["VerifiableCredential"],"issuer":"did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK","validFrom":"2026-01-01T00:00:00Z","credentialSubject":{"id":"did:key:z6MkiTBz1ymuepAQ4HEHYSF1H8quG5GLdmQR63zLFKfvUwi3"}}}'import { DidisClient } from "@didis/client";
const didis = new DidisClient(); // https://did.is/apiconst credential = { "@context": ["https://www.w3.org/ns/credentials/v2"], type: ["VerifiableCredential"], issuer: "did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK", validFrom: "2026-01-01T00:00:00Z", credentialSubject: { id: "did:key:z6MkiTBz1ymuepAQ4HEHYSF1H8quG5GLdmQR63zLFKfvUwi3" },};const v = await didis.verifyCredential(credential);console.log(v.status, v.headline);from didis import DidisClient
client = DidisClient() # https://did.is/apicredential = { "@context": ["https://www.w3.org/ns/credentials/v2"], "type": ["VerifiableCredential"], "issuer": "did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK", "validFrom": "2026-01-01T00:00:00Z", "credentialSubject": {"id": "did:key:z6MkiTBz1ymuepAQ4HEHYSF1H8quG5GLdmQR63zLFKfvUwi3"},}v = client.verify_credential(credential)print(v["status"], v["headline"])// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, serde_json = "1"let v: serde_json::Value = reqwest::Client::new() .post("https://did.is/api/v1/credentials/verify") .json(&serde_json::json!({"credential":{"@context":["https://www.w3.org/ns/credentials/v2"],"type":["VerifiableCredential"],"issuer":"did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK","validFrom":"2026-01-01T00:00:00Z","credentialSubject":{"id":"did:key:z6MkiTBz1ymuepAQ4HEHYSF1H8quG5GLdmQR63zLFKfvUwi3"}}})) .send() .await? .error_for_status()? .json() .await?;Evaluate a policy
Section titled “Evaluate a policy”POST /v1/policies/evaluateEvaluates declarative rules (allowedMethods, allowedCurves, minKeyBits, requireKeyRelationship, domainBinding, tlsMinDaysRemaining, linkedAccounts, verifiableHistory, maxCacheAgeSeconds, credentialStatus, credentialIssuerMustBeSubject) against observed evidence. Unevaluable rules are INDETERMINATE, never PASS.
Budget: intensive.
Request body (JSON):
| Field | Type | Description |
|---|---|---|
did (required) |
string | Subject DID. |
policy (required) |
object | Rule set. |
credential |
object | Optional credential to evaluate. |
Responses: 200, 400, 413, 429, 503.
curl -s -X POST "https://did.is/api/v1/policies/evaluate" \ -H 'Content-Type: application/json' \ -d '{"did":"did:web:identity.foundation","policy":{"rules":{"didResolution":"required","domainBinding":"required"}}}'import { DidisClient } from "@didis/client";
const didis = new DidisClient(); // https://did.is/apiconst { evaluation } = await didis.evaluatePolicy("did:web:identity.foundation", { rules: { domainBinding: "required" } });from didis import DidisClient
client = DidisClient() # https://did.is/apires = client.evaluate_policy("did:web:identity.foundation", {"rules": {"domainBinding": "required"}})// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, serde_json = "1"let v: serde_json::Value = reqwest::Client::new() .post("https://did.is/api/v1/policies/evaluate") .json(&serde_json::json!({"did":"did:web:identity.foundation","policy":{"rules":{"didResolution":"required","domainBinding":"required"}}})) .send() .await? .error_for_status()? .json() .await?;Verify a JWS against a DID
Section titled “Verify a JWS against a DID”POST /v1/fast-verify/jwsResolves the DID in the JWS kid, requires the key in assertionMethod or authentication (or the relationship you name), and verifies the signature.
Budget: standard.
Request body (JSON):
| Field | Type | Description |
|---|---|---|
jws (required) |
string | Compact JWS with a DID URL kid. |
relationship |
string | Required verification relationship. |
Responses: 200, 400, 413, 429, 503.
curl -s -X POST "https://did.is/api/v1/fast-verify/jws" \ -H 'Content-Type: application/json' \ -d '{"jws":"eyJhbGciOiJFZERTQSIsImtpZCI6ImRpZDprZXk6ejZNa2hhWGdCWkR2b3REa0w1MjU3ZmFpenRpR2lDMlF0S0xHcGJubkVHdGEyZG9LI2tleS0xIn0.eyJzdWIiOiJkaWQ6a2V5Ono2TWtoYVhnQlpEdm90RGtMNTI1N2ZhaXp0aUdpQzJRdEtMR3Bibm5FR3RhMmRvSyJ9.c2lnbmF0dXJl"}'import { DidisClient } from "@didis/client";
const didis = new DidisClient(); // https://did.is/api// Compact JWS with a DID URL kid headerconst token = "eyJhbGciOiJFZERTQSIsImtpZCI6ImRpZDprZXk6ejZNa2hhWGdCWkR2b3REa0w1MjU3ZmFpenRpR2lDMlF0S0xHcGJubkVHdGEyZG9LI2tleS0xIn0.eyJzdWIiOiJkaWQ6a2V5Ono2TWtoYVhnQlpEdm90RGtMNTI1N2ZhaXp0aUdpQzJRdEtMR3Bibm5FR3RhMmRvSyJ9.c2lnbmF0dXJl";const j = await didis.fastVerifyJws(token);console.log(j.status, j.headline);from didis import DidisClient
client = DidisClient() # https://did.is/api# Compact JWS with a DID URL kid headertoken = "eyJhbGciOiJFZERTQSIsImtpZCI6ImRpZDprZXk6ejZNa2hhWGdCWkR2b3REa0w1MjU3ZmFpenRpR2lDMlF0S0xHcGJubkVHdGEyZG9LI2tleS0xIn0.eyJzdWIiOiJkaWQ6a2V5Ono2TWtoYVhnQlpEdm90RGtMNTI1N2ZhaXp0aUdpQzJRdEtMR3Bibm5FR3RhMmRvSyJ9.c2lnbmF0dXJl"j = client.fast_verify_jws(token)print(j["status"], j["headline"])// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, serde_json = "1"let v: serde_json::Value = reqwest::Client::new() .post("https://did.is/api/v1/fast-verify/jws") .json(&serde_json::json!({"jws":"eyJhbGciOiJFZERTQSIsImtpZCI6ImRpZDprZXk6ejZNa2hhWGdCWkR2b3REa0w1MjU3ZmFpenRpR2lDMlF0S0xHcGJubkVHdGEyZG9LI2tleS0xIn0.eyJzdWIiOiJkaWQ6a2V5Ono2TWtoYVhnQlpEdm90RGtMNTI1N2ZhaXp0aUdpQzJRdEtMR3Bibm5FR3RhMmRvSyJ9.c2lnbmF0dXJl"})) .send() .await? .error_for_status()? .json() .await?;Agents
Section titled “Agents”Inspect an MCP server
Section titled “Inspect an MCP server”GET /v1/mcp/inspectStreamable HTTP: server/discover (2026-07-28) with legacy initialize fallback; paginated tools/list; SHA-256 fingerprints of every tool definition (RFC 8785); declared annotations vs heuristic side-effect classes; risk signals; drift against the previous observation. 401 responses are reported, never bypassed.
Budget: intensive.
| Parameter | In | Description |
|---|---|---|
endpoint (required) |
query | The MCP endpoint. |
Responses: 200, 400, 429, 503.
curl -s "https://did.is/api/v1/mcp/inspect?endpoint=https%3A%2F%2Fmcp.example.com%2Fmcp"import { DidisClient } from "@didis/client";
const didis = new DidisClient(); // https://did.is/apiconst m = await didis.inspectMcp("https://mcp.example.com/mcp");from didis import DidisClient
client = DidisClient() # https://did.is/apim = client.inspect_mcp("https://mcp.example.com/mcp")// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, serde_json = "1"let v: serde_json::Value = reqwest::get("https://did.is/api/v1/mcp/inspect?endpoint=https%3A%2F%2Fmcp.example.com%2Fmcp") .await? .error_for_status()? .json() .await?;Inspect an A2A agent card
Section titled “Inspect an A2A agent card”GET /v1/a2a/inspectFetches /.well-known/agent-card.json (legacy agent.json fallback), validates the A2A 1.0 shape, and verifies signatures[] (JWS over the JCS card) with keys from a DID kid or an HTTPS jku.
Budget: intensive.
| Parameter | In | Description |
|---|---|---|
url (required) |
query | Agent origin or card URL. |
Responses: 200, 400, 429, 503.
curl -s "https://did.is/api/v1/a2a/inspect?url=https%3A%2F%2Fagent.example"import { DidisClient } from "@didis/client";
const didis = new DidisClient(); // https://did.is/apiconst a = await didis.inspectA2a("https://agent.example");from didis import DidisClient
client = DidisClient() # https://did.is/apia = client.inspect_a2a("https://agent.example")// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, serde_json = "1"let v: serde_json::Value = reqwest::get("https://did.is/api/v1/a2a/inspect?url=https%3A%2F%2Fagent.example") .await? .error_for_status()? .json() .await?;Verify a delegation chain
Section titled “Verify a delegation chain”POST /v1/agents/verify-delegationDID.is Delegation Receipt v1 (experimental): compact JWS receipts, root first. Verifies signatures via capabilityDelegation keys, issuer/audience and prf hash linkage, temporal containment, capability attenuation, acyclicity and depth ≤ 8. register: true stores VALID chains for /v1/agents/verify-tool.
Budget: intensive.
Request body (JSON):
| Field | Type | Description |
|---|---|---|
chain (required) |
array of string | Receipts, root first. |
trustedRoots |
array of string | Acceptable root DIDs. |
register |
boolean | Store if VALID. |
Responses: 200, 400, 413, 429, 503.
curl -s -X POST "https://did.is/api/v1/agents/verify-delegation" \ -H 'Content-Type: application/json' \ -d '{"chain":[],"trustedRoots":["did:web:bank.example"]}'import { DidisClient } from "@didis/client";
const didis = new DidisClient(); // https://did.is/api// Receipts in compact JWS format, root firstconst chain: string[] = [];const { result } = await didis.verifyDelegation(chain, { trustedRoots: ["did:web:bank.example"],});console.log(result.status, result.headline);from didis import DidisClient
client = DidisClient() # https://did.is/api# Receipts in compact JWS format, root firstchain: list[str] = []res = client.verify_delegation(chain, trusted_roots=["did:web:bank.example"])print(res["result"]["status"], res["result"]["headline"])// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, serde_json = "1"let v: serde_json::Value = reqwest::Client::new() .post("https://did.is/api/v1/agents/verify-delegation") .json(&serde_json::json!({"chain":[],"trustedRoots":["did:web:bank.example"]})) .send() .await? .error_for_status()? .json() .await?;Authorise a tool call
Section titled “Authorise a tool call”POST /v1/agents/authorizeStateless: verifies the chain and checks that its leaf capabilities grant the tool (exact name, , or ns: for tools named ns:…).
Budget: intensive.
Request body (JSON):
| Field | Type | Description |
|---|---|---|
chain (required) |
array of string | Receipts, root first. |
tool (required) |
string | Tool name. |
Responses: 200, 400, 413, 429, 503.
curl -s -X POST "https://did.is/api/v1/agents/authorize" \ -H 'Content-Type: application/json' \ -d '{"chain":[],"tool":"payments:transfer"}'import { DidisClient } from "@didis/client";
const didis = new DidisClient(); // https://did.is/api// Receipts in compact JWS format, root firstconst chain: string[] = [];const { authorization } = await didis.authorize(chain, "payments:transfer");console.log(authorization.decision, authorization.reason);from didis import DidisClient
client = DidisClient() # https://did.is/api# Receipts in compact JWS format, root firstchain: list[str] = []res = client.authorize(chain, "payments:transfer")print(res["authorization"]["decision"], res["authorization"]["reason"])// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, serde_json = "1"let v: serde_json::Value = reqwest::Client::new() .post("https://did.is/api/v1/agents/authorize") .json(&serde_json::json!({"chain":[],"tool":"payments:transfer"})) .send() .await? .error_for_status()? .json() .await?;Check a registered agent
Section titled “Check a registered agent”GET /v1/agents/verify-toolAnswers ALLOW or DENY for an agent and tool against delegation chains previously registered with verify-delegation (register: true). Without a registered VALID chain the answer is DENY.
Budget: standard.
| Parameter | In | Description |
|---|---|---|
agent (required) |
query | The acting agent. |
tool (required) |
query | Tool name. |
root |
query | Require this delegation root. |
Responses: 200, 400, 429, 503.
curl -s "https://did.is/api/v1/agents/verify-tool?agent=did%3Aweb%3Aagent.example&tool=payments:transfer"import { DidisClient } from "@didis/client";
const didis = new DidisClient(); // https://did.is/apiconst t = await didis.verifyTool("did:web:agent.example", "payments:transfer");if (!t.authorized) throw new Error(t.reason);from didis import DidisClient
client = DidisClient() # https://did.is/apit = client.verify_tool("did:web:agent.example", "payments:transfer")assert t["authorized"], t["reason"]// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, serde_json = "1"let v: serde_json::Value = reqwest::get("https://did.is/api/v1/agents/verify-tool?agent=did%3Aweb%3Aagent.example&tool=payments:transfer") .await? .error_for_status()? .json() .await?;Directory and claims
Section titled “Directory and claims”Verified control claims
Section titled “Verified control claims”GET /v1/claims/{did}Current, unexpired proofs that a controller demonstrated control of this DID (for example a key signature), each stating what it proves and what it does not. A claim is not legal identity.
Budget: standard.
| Parameter | In | Description |
|---|---|---|
did (required) |
path | The identifier. |
Responses: 200, 400, 429, 503.
curl -s "https://did.is/api/v1/claims/did%3Aweb%3Adid.is"const res = await fetch("https://did.is/api/v1/claims/did%3Aweb%3Adid.is");if (!res.ok) throw new Error((await res.json()).detail);const data = await res.json();import httpx
res = httpx.get("https://did.is/api/v1/claims/did%3Aweb%3Adid.is")res.raise_for_status()data = res.json()// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, serde_json = "1"let v: serde_json::Value = reqwest::get("https://did.is/api/v1/claims/did%3Aweb%3Adid.is") .await? .error_for_status()? .json() .await?;Search the directory
Section titled “Search the directory”GET /v1/directoryIdentifiers whose controller proved control and opted in to be listed. Listings cannot be bought. Unknown or repeated parameters are rejected.
Budget: standard.
| Parameter | In | Description |
|---|---|---|
q |
query | Free text, up to 100 characters. |
method |
query | DID method filter, e.g. web, key, webvh. |
limit |
query | 1–50 (default 20). |
cursor |
query | nextCursor from the previous page. |
Responses: 200, 400, 429, 503.
curl -s "https://did.is/api/v1/directory?method=web&limit=5"const res = await fetch("https://did.is/api/v1/directory?method=web&limit=5");if (!res.ok) throw new Error((await res.json()).detail);const data = await res.json();import httpx
res = httpx.get("https://did.is/api/v1/directory?method=web&limit=5")res.raise_for_status()data = res.json()// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, serde_json = "1"let v: serde_json::Value = reqwest::get("https://did.is/api/v1/directory?method=web&limit=5") .await? .error_for_status()? .json() .await?;Service
Section titled “Service”Health and capabilities
Section titled “Health and capabilities”GET /healthLiveness plus the supported DID methods and implemented standard versions. Not rate limited.
Budget: none.
Responses: 200, 400, 503.
curl -s "https://did.is/api/health"import { DidisClient } from "@didis/client";
const didis = new DidisClient(); // https://did.is/apiconst h = await didis.health();console.log(h.supportedMethods);from didis import DidisClient
client = DidisClient() # https://did.is/apih = client.health()print(h["supportedMethods"])// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, serde_json = "1"let v: serde_json::Value = reqwest::get("https://did.is/api/health") .await? .error_for_status()? .json() .await?;Service status
Section titled “Service status”GET /v1/statusMachine-readable component status behind did.is/status: resolution, console, billing, monitoring and more.
Budget: standard.
Responses: 200, 400, 429, 503.
curl -s "https://did.is/api/v1/status"const res = await fetch("https://did.is/api/v1/status");if (!res.ok) throw new Error((await res.json()).detail);const data = await res.json();import httpx
res = httpx.get("https://did.is/api/v1/status")res.raise_for_status()data = res.json()// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, serde_json = "1"let v: serde_json::Value = reqwest::get("https://did.is/api/v1/status") .await? .error_for_status()? .json() .await?;