Skip to main content

DID Resolution

The DID Registry API allows you to resolve a DID, that is, obtain its DID Document both in its current state and at any point in the past. This is essential for verifying credentials: a verifier needs to know which key was active at the time of signing.

Basic Resolution

GET /api/v1/identifiers/{identifier}

Where {identifier} is the complete DID (URL-encode if it contains special characters).

Example

curl -H "Accept: application/did+ld+json" \
"https://did-registry.portal.redisbe.com/api/v1/identifiers/did:isbe:uc:z12kVar5p6bD5WCjEJcQ18Zyt8XV"

Response (200 OK):

{
"@context": [
"https://www.w3.org/ns/did/v1",
"https://w3id.org/security/suites/jws-2020/v1"
],
"id": "did:isbe:uc:z12kVar5p6bD5WCjEJcQ18Zyt8XV",
"controller": ["0xAe0E493C67f75381b0954644836A3C16c79D0dFD"],
"verificationMethod": [
{
"id": "did:isbe:uc:z12kVar5p6bD5WCjEJcQ18Zyt8XV#9lfZ28jdUsYo75lVHmGNIc6oUpkjSFtxiCLjDGn28IM",
"type": "JsonWebKey2020",
"controller": "did:isbe:uc:z12kVar5p6bD5WCjEJcQ18Zyt8XV",
"publicKeyJwk": {
"kty": "EC",
"crv": "secp256k1",
"x": "EkP1CscPyZbMySohGc5ktvcLv0yh/Tsl/Fyk/T6jUlsK",
"y": "FD4PfiOzITnM4zo9IgfvkN7DC4VxRSB4f-PKcTfcMyE"
}
},
{
"id": "did:isbe:uc:z12kVar5p6bD5WCjEJcQ18Zyt8XV#WqpsDjTHnYVNvX8qx4a1FER8NgnEBS6DjLbDVrX-Fg4",
"type": "JsonWebKey2020",
"controller": "did:isbe:uc:z12kVar5p6bD5WCjEJcQ18Zyt8XV",
"publicKeyJwk": {
"kty": "EC",
"crv": "P-256",
"x": "...",
"y": "..."
}
}
],
"assertionMethod": [
"did:isbe:uc:z12kVar5p6bD5WCjEJcQ18Zyt8XV#WqpsDjTHnYVNvX8qx4a1FER8NgnEBS6DjLbDVrX-Fg4"
],
"alsoKnownAs": ["urn:oid:organizationIdentifier:ISBE"]
}
Type of verificationMethod entries upon resolution

All verification methods are returned with type: "JsonWebKey2020" and the key material in publicKeyJwk, regardless of the curve. The actual curve is identified in the crv field inside the JWK (secp256k1, P-256). This is consistent with the W3C JSON Web Key 2020 model and also applies to the initial control key of the DID.

Resolution at a Specific Instant (valid-at)

To verify older credentials, you need to know which keys were active on a specific date. Add the valid-at parameter as a Unix timestamp in seconds:

curl -H "Accept: application/did+ld+json" \
"https://did-registry.portal.redisbe.com/api/v1/identifiers/did:isbe:uc:z12kVar5p6bD5WCjEJcQ18Zyt8XV?valid-at=1742000000"

The response will contain only the verificationMethod entries whose [notBefore, notAfter] window includes that timestamp.

Use case

Imagine you receive a credential signed on March 15, 2026. If you verify it in May, a key may have rotated in the meantime. Resolve the DID with valid-at=<timestamp of the VC's iat> to get exactly the keys that were in effect at the time of signing.

Supported Content Types

The endpoint supports two formats through the Accept header:

AcceptFormat
application/did+ld+jsonDID Document as JSON-LD (recommended).
application/did+jsonDID Document as plain JSON.

If you request an unsupported type, the API responds with 406 Not Acceptable.

Paginated Listing of DIDs

For administrative or auditing cases, the API also exposes a paginated list:

GET /api/v1/identifiers?page=1&pageSize=50

Response:

{
"page": 1,
"pageSize": 50,
"total": 1234,
"howMany": 50,
"items": [
"did:isbe:uc:z12kVar5p6bD5WCjEJcQ18Zyt8XV",
"did:isbe:uc:z2ABCdef...",
"..."
]
}
Privacy

This list does not expose sensitive information: only the identifiers. To obtain the DID Document for each, you must call the individual resolution endpoint.

Common Errors

CodeCause
400 Bad RequestThe identifier does not have a valid did:isbe:... format, or valid-at is not a number.
404 Not FoundThe DID does not exist in the registry.
406 Not AcceptableAccept header not supported.

More details in Troubleshooting.