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"]
}
verificationMethod entries upon resolutionAll 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.
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:
Accept | Format |
|---|---|
application/did+ld+json | DID Document as JSON-LD (recommended). |
application/did+json | DID 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...",
"..."
]
}
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
| Code | Cause |
|---|---|
400 Bad Request | The identifier does not have a valid did:isbe:... format, or valid-at is not a number. |
404 Not Found | The DID does not exist in the registry. |
406 Not Acceptable | Accept header not supported. |
More details in Troubleshooting.