Skip to content

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
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.

Terminal window
curl -s "https://did.is/api/v1/resolve/did%3Aweb%3Aidentity.foundation"
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.

Terminal window
curl -s "https://did.is/api/1.0/identifiers/did%3Aweb%3Aidentity.foundation" \
-H 'Accept: application/did-resolution'
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.

Terminal window
curl -sN "https://did.is/api/v1/stream/did%3Aweb%3Aidentity.foundation?noCache=true"
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.

Terminal window
curl -s "https://did.is/api/v1/dereference/did%3Aweb%3Aidentity.foundation%23key-1"
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.

Terminal window
curl -s "https://did.is/api/v1/fast-verify/did/did%3Aweb%3Aidentity.foundation"
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.

Terminal window
curl -s "https://did.is/api/v1/history/did%3Aweb%3Aidentity.foundation"
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.

Terminal window
curl -s "https://did.is/api/v1/diff/did%3Aweb%3Aidentity.foundation"
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.

Terminal window
curl -s "https://did.is/api/v1/graph/did%3Aweb%3Aidentity.foundation"
POST /v1/credentials/verify

Data 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.

Terminal window
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"}}}'
POST /v1/policies/evaluate

Evaluates 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.

Terminal window
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"}}}'
POST /v1/fast-verify/jws

Resolves 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.

Terminal window
curl -s -X POST "https://did.is/api/v1/fast-verify/jws" \
-H 'Content-Type: application/json' \
-d '{"jws":"eyJhbGciOiJFZERTQSIsImtpZCI6ImRpZDprZXk6ejZNa2hhWGdCWkR2b3REa0w1MjU3ZmFpenRpR2lDMlF0S0xHcGJubkVHdGEyZG9LI2tleS0xIn0.eyJzdWIiOiJkaWQ6a2V5Ono2TWtoYVhnQlpEdm90RGtMNTI1N2ZhaXp0aUdpQzJRdEtMR3Bibm5FR3RhMmRvSyJ9.c2lnbmF0dXJl"}'
GET /v1/mcp/inspect

Streamable 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.

Terminal window
curl -s "https://did.is/api/v1/mcp/inspect?endpoint=https%3A%2F%2Fmcp.example.com%2Fmcp"
GET /v1/a2a/inspect

Fetches /.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.

Terminal window
curl -s "https://did.is/api/v1/a2a/inspect?url=https%3A%2F%2Fagent.example"
POST /v1/agents/verify-delegation

DID.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.

Terminal window
curl -s -X POST "https://did.is/api/v1/agents/verify-delegation" \
-H 'Content-Type: application/json' \
-d '{"chain":[],"trustedRoots":["did:web:bank.example"]}'
POST /v1/agents/authorize

Stateless: 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.

Terminal window
curl -s -X POST "https://did.is/api/v1/agents/authorize" \
-H 'Content-Type: application/json' \
-d '{"chain":[],"tool":"payments:transfer"}'
GET /v1/agents/verify-tool

Answers 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.

Terminal window
curl -s "https://did.is/api/v1/agents/verify-tool?agent=did%3Aweb%3Aagent.example&tool=payments:transfer"
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.

Terminal window
curl -s "https://did.is/api/v1/claims/did%3Aweb%3Adid.is"
GET /v1/directory

Identifiers 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.

Terminal window
curl -s "https://did.is/api/v1/directory?method=web&limit=5"
GET /health

Liveness plus the supported DID methods and implemented standard versions. Not rate limited.

Budget: none.

Responses: 200, 400, 503.

Terminal window
curl -s "https://did.is/api/health"
GET /v1/status

Machine-readable component status behind did.is/status: resolution, console, billing, monitoring and more.

Budget: standard.

Responses: 200, 400, 429, 503.

Terminal window
curl -s "https://did.is/api/v1/status"