Universal DID Native Addressing (UDNA) defines a lightweight, extensible addressing scheme that makes Decentralized Identifiers (DIDs) native to resource location and service discovery on the Web. UDNA extends DID from identity resolution to resource addressing, providing a uniform udna:// URI scheme that encodes a DID and a resource path, enabling secure, cryptographically verifiable interactions across decentralized systems. This specification builds on W3C Recommendations ([[DID-CORE]], [[VC-DATA-MODEL]]) and the DIDComm v2 messaging protocol ([[DIDCOMM]]). It is an incubation deliverable of the UDNA W3C Community Group and does not represent consensus of the broader W3C Membership.

UDNA completes the addressing stack for decentralized identity: where DNS maps names to IP addresses, and DIDs map identifiers to DID Documents, UDNA maps identity to resources.

This document is a Community Group Draft produced by the W3C Community Group for DID Native Addressing. It is not a W3C Standard nor on the W3C Standards Track. Publication by the W3C does not imply endorsement by the W3C Membership. This is a draft document and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.

This specification is being developed to explore the intersection of decentralized identifiers, native addressing, and universal service discovery. The goal is to mature the proposal toward a future W3C Working Group deliverable. The CG welcomes issues and pull requests on GitHub. Before contributing, please review the W3C Community Contributor License Agreement.

The CG has received early reviews from implementers of Solid, DIDComm, and Hyperledger Aries, and expects to conduct multiple interoperability events during 2026.

Architecture Overview

This section is informative.

UDNA operates as a bridge layer between URI-based resource addressing and decentralized identity infrastructure. It completes the addressing stack for decentralized identity:

The following diagrams illustrate the core resolution flow from a UDNA address to a concrete resource endpoint, and the component relationships within the UDNA ecosystem.

Figure 1: UDNA Resolution Flow — Sequence Diagram
Client UDNA Resolver DID Registry udna://did:web:example.com/api/data GET did:web:example.com DID Document + service endpoints Parse service endpoints Select matching service Construct target URL Validate result ResolutionResult { targetUrl, didDoc, ... } ResolutionError { error, description } Success path → Error path - - →
Figure 2: UDNA Component Model
DID Registry (Ledger, Web, etc.) Stores DID Documents UDNA Resolver Parsing → DID Resolution → Service Selection → URL Construction Exposes resolve(udnaURI) API Target Service (HTTP, DIDComm, etc.) Receives final URL Client App / Browser Gateway (Optional) DID Resolution resolve() targetUrl → via gateway Extension Registry Batch Operations Gateway Forwarding Resource Integrity

Introduction

The Web's addressing model is built on URLs that bind authority to domain names, which in turn rely on centralized DNS and certificate authorities. While this has enabled massive growth, it introduces identity silos, privacy leaks, and intermediary dependency. Decentralized Identifiers (DIDs) offer self-sovereign, cryptographically verifiable identities, but they lack a native addressing scheme to directly locate resources, APIs, or services tied to a DID.

UDNA fills this gap. UDNA extends DID from identity resolution to resource addressing. By introducing the udna:// URI scheme and a deterministic resolution mechanism, UDNA allows any entity with a DID to publish service endpoints, resources, and sub-paths that can be resolved in a secure, privacy-preserving way. Conceptually:

UDNA leverages [[DID-CORE]] for identity, [[DIDCOMM]] for secure messaging, and [[VC-DATA-MODEL]] for authorization policies.

As well as sections marked as non-normative, all authoring guidelines, diagrams, examples, and notes in this specification are non-normative. Everything else in this specification is normative.

The key words MAY, MUST, MUST NOT, OPTIONAL, RECOMMENDED, REQUIRED, SHALL, SHALL NOT, SHOULD, and SHOULD NOT in this document are to be interpreted as described in BCP 14 [[RFC2119]] [[RFC8174]] when, and only when, they appear in all capitals, as shown here.

Conformance Classes

This specification defines the following conformance classes:

UDNA Resolver
An implementation that accepts a [=UDNA Address=] and returns a [=ResolutionResult=] or [=ResolutionError=]. A conformant resolver MUST implement the Processing Model and produce outputs conforming to the Resolution Result Data Model and Error Handling sections.
UDNA Client
An application that constructs and dereferences [=UDNA Address=]es, either by using a [=UDNA Resolver=] directly or by interacting with a [=UDNA Gateway=]. A conformant client MUST construct UDNA addresses according to and SHOULD validate [=ResolutionResult=] objects against the validity rules in .
UDNA Gateway (OPTIONAL)
An intermediary service that exposes UDNA resolution through HTTP endpoints, enabling clients without native UDNA support to dereference UDNA addresses. A conformant gateway MUST NOT modify the semantics of the resolved targetUrl and MUST preserve all path, query, and fragment components from the original UDNA address. Gateways are defined further in .

Terminology

This section defines the terms used throughout this specification.

UDNA Address
A URI conforming to the udna scheme, composed of a DID component, an optional service segment, and a resource path. Formally specified in .
DID Resolution
The process defined in [[DID-CORE]] by which a DID string is dereferenced to obtain a DID Document containing public keys and service endpoints.
Native Addressing
An addressing model where the identifier of an entity (a DID) is an integral part of the resource locator, enabling direct, verifiable interactions without external naming authorities.
Service Endpoint
A network address defined within a DID Document under the service array property, expressed as a URI string, a set of URI strings, or a DIDComm endpoint object.
UDNARoot Service
The default service entry used by UDNA resolution when no explicit service segment is present. Identified by type: "UDNARoot" or the fragment identifier #udna-root in the DID Document. A DID Document MUST contain at most one UDNARoot service entry.
ResolutionResult
A structured object returned on successful resolution, containing the constructed target URL, the resolved DID Document, metadata, and cryptographic verification materials. Defined in .
ResolutionError
A structured error object returned when resolution fails. Defined in .
Processing Model
The normative sequence of steps a resolver MUST execute to transform a UDNA address into a ResolutionResult or ResolutionError. Defined in .

UDNA URI Scheme

Scheme Syntax

The udna URI scheme follows the ABNF syntax below (extending [[RFC3986]]):

udna-URI   = "udna://" did-string [ "/" service-id ] path [ "?" query ] [ "#" fragment ]
did-string = scheme ":" method-specific-id
             ; a valid DID per [[DID-CORE]]
service-id = *( unreserved / pct-encoded )
path       = *( "/" segment )
query      = *( pchar / "/" / "?" )
fragment   = *( pchar / "/" / "?" )
        

A complete example illustrating all components:

udna://did:example:123456/service/api/resource?version=1#section
        

Components

DID (mandatory)
A valid DID string per [[DID-CORE]], e.g., did:key:z6Mkp… or did:web:example.com. The DID forms the authority component of the [=UDNA Address=].
Service segment (optional)
Identifies a specific service endpoint by matching the id fragment of a service entry in the resolved DID Document. If omitted, the resolver selects the [=UDNARoot Service=].
Path
A hierarchical path that is opaque to the UDNA resolution layer but meaningful to the target service after resolution.
Query and Fragment
Standard URI semantics per [[URL]], interpreted by the target service after resolution is complete.

Processing Model

This section defines the normative processing steps that a [=UDNA Resolver=] MUST execute. It is separated from the data model to enable independent evolution of processing logic and output structures.

Resolution Algorithm

To resolve a [=UDNA Address=], a conformant [=UDNA Resolver=] MUST perform the following steps in order:

  1. Parse the UDNA address to extract the DID string, service segment (if present), path, query, and fragment components per the syntax in . If parsing fails, return a [=ResolutionError=] of type invalidUri.
  2. Validate that the extracted DID string is a valid DID per [[DID-CORE]]. If invalid, return a [=ResolutionError=] of type invalidDid.
  3. Resolve the DID to a DID Document using the appropriate DID method resolver, as specified in [[DID-CORE]]. If the DID method is not supported, return a [=ResolutionError=] of type methodNotSupported. If resolution fails, return a [=ResolutionError=] of type notFound.
  4. Perform service selection:
    • If a service segment is present, locate the entry in the DID Document's service array whose id fragment matches the given segment. If no match is found, return a [=ResolutionError=] of type serviceNotFound.
    • If no service segment is provided, select the entry whose type contains "UDNARoot" or whose id fragment equals udna-root. If neither is found, return a [=ResolutionError=] of type defaultServiceNotFound.
  5. Obtain the serviceEndpoint value from the selected service entry. This value MAY be a URI string, a set of URI strings, or a DIDComm endpoint object. If the value is unsupported or malformed, return a [=ResolutionError=] of type invalidEndpoint.
  6. Construct the final target URL by appending the path, query, and fragment to the resolved endpoint base URI. If the endpoint is a URI template ([[RFC6570]]), template expansion MUST be applied using available context variables. If template expansion fails, return a [=ResolutionError=] of type templateExpansionFailed.
  7. Build a [=ResolutionResult=] containing: targetUrl, didDocument, didDocumentMetadata, service, and verificationMethods.
  8. Validate the built ResolutionResult against the validity rules. If validation fails, return a [=ResolutionError=] with an appropriate error description.
  9. Return the validated [=ResolutionResult=].

Resolvers SHOULD implement caching with appropriate TTL derived from DID Document metadata (created, updated). Resolvers MUST respect HTTP cache headers when resolving did:web identifiers.

Example Resolution

ResolutionResult Validity

A [=ResolutionResult=] is considered valid if and only if ALL of the following conditions are satisfied:

VR-1: targetUrl MUST be a valid absolute URI as defined by [[RFC3986]].
VR-2: didDocument MUST conform to the DID Document data model defined in [[DID-CORE]], Section 4.
VR-3: service MUST correspond to an entry present in the didDocument.service array, matched by id fragment.
VR-4: didDocumentMetadata MUST include the created or updated timestamp fields as specified in [[DID-CORE]].
VR-5: verificationMethods MUST be a subset of the verification methods present in the didDocument, filtered to those relevant to the selected service or DID subject.

A resolver that produces an invalid ResolutionResult SHALL report the violation as an internal error and MUST NOT return the invalid result to the caller.

Resolution Result Data Model

Conformant [=UDNA Resolvers=] MUST return resolution results conforming to the following structure. The data model extends DID Resolution metadata ([[DID-CORE]]) with UDNA-specific fields.

Structure

{
  "@context": "https://w3c-cg.github.io/udna/contexts/udna-v1.jsonld",
  "type": "UDNAResolutionResult",
  "targetUrl": "https://api.example.com/udna/app/profile#me",
  "didDocument": {
    "@context": "https://www.w3.org/ns/did/v1",
    "id": "did:web:example.com",
    "service": [ ... ]
  },
  "didDocumentMetadata": {
    "created": "2025-01-01T00:00:00Z",
    "updated": "2025-06-01T00:00:00Z",
    "deactivated": false
  },
  "service": {
    "id": "#udna-root",
    "type": "UDNARoot",
    "serviceEndpoint": "https://api.example.com/udna"
  },
  "verificationMethods": [
    {
      "id": "did:web:example.com#keys-1",
      "type": "Ed25519VerificationKey2020",
      "controller": "did:web:example.com",
      "publicKeyMultibase": "zH3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV"
    }
  ]
}
        
@context
A JSON-LD context URI that defines the vocabulary for the UDNA resolution result. The context is defined at w3c-cg.github.io/udna/contexts/udna-v1.jsonld .
type
MUST be "UDNAResolutionResult".
targetUrl
The fully constructed URL derived from the selected service endpoint, path, query, and fragment. This is the concrete resource location.
didDocument
The resolved DID Document per [[DID-CORE]]. MUST be present when resolution succeeds.
didDocumentMetadata
Metadata about the DID Document resolution, including timestamps and deactivation status, as defined in [[DID-CORE]].
service
The specific service entry selected by the resolution algorithm. This enables clients to inspect service-level metadata and endpoint configuration.
verificationMethods
An array of verification methods from the DID Document that are associated with the selected service or the DID subject. Clients MAY use these to authenticate the resolved endpoint or verify responses.

Error Handling

When resolution fails, a conformant [=UDNA Resolver=] MUST return a [=ResolutionError=] object using the following structure:

Error Structure

{
  "error": "serviceNotFound",
  "errorDescription": "No matching service entry found for 'api'",
  "did": "did:web:example.com",
  "serviceSegment": "api"
}
        
error
A machine-readable error code drawn from the error codes registry.
errorDescription
A human-readable description of the error condition.
did
The DID string that was being resolved when the error occurred.
serviceSegment
The service segment that failed to match, if applicable. MAY be omitted for errors not related to service selection.

Error Codes

Standard UDNA Resolution Error Codes
Error Code Description
notFound The DID could not be resolved to a DID Document.
serviceNotFound A service segment was provided but no matching service entry exists.
defaultServiceNotFound No service segment was provided and no UDNARoot service is declared.
invalidUri The provided UDNA address could not be parsed.
invalidDid The DID string extracted from the UDNA address is not a valid DID.
methodNotSupported The DID method is not supported by this resolver.
invalidEndpoint The selected service endpoint is malformed or unsupported.
templateExpansionFailed URI template expansion failed for the selected endpoint.

Content Negotiation

When UDNA resolution produces an HTTP-based targetUrl, clients MAY use standard HTTP content negotiation ([[RFC9110]], Section 12) when interacting with the resolved endpoint. This section defines content types relevant to UDNA interactions.

Services exposed via UDNA SHOULD support the following media types:

Clients MAY include an Accept header to indicate preferred content types. Services SHOULD respond with an appropriate Content-Type header and SHOULD return HTTP status 406 Not Acceptable if unable to satisfy the client's content type preferences.

Resolver API Interface

To promote interoperability across implementations, a conformant [=UDNA Resolver=] MUST expose at minimum the following function signature:

function resolve(udnaURI: string): Promise<ResolutionResult | ResolutionError>;
    

Implementations MAY additionally provide:

The canonical reference implementation in JavaScript is available at github.com/w3c-cg/udna.

Gateway Model

UDNA resolution can be exposed through an HTTP gateway, enabling clients that do not implement native UDNA resolution to dereference UDNA addresses via standard HTTP requests. This pattern is similar to IPFS gateways and Solid pod access patterns.

A conformant [=UDNA Gateway=] MUST satisfy the following normative constraint:

GW-1: Gateways MUST NOT modify the semantics of the resolved targetUrl. The path, query, and fragment components from the original UDNA address MUST be preserved in the final constructed URL without alteration or filtering.

The canonical gateway resolution pattern is:

GET https://udna-gateway.example/resolve?uri=udna://did:web:example.com/app/profile

→ 302 Redirect to: https://api.example.com/udna/app/profile
    

Gateways serve as a progressive adoption path, allowing existing Web infrastructure to participate in UDNA resolution without native protocol support. The full gateway behavior is defined in a separate extension specification ("Gateway Forwarding").

Browser Integration

This section is informative.

UDNA addresses are designed for eventual native support in browser environments. The following integration model provides a concrete direction for browser vendors and extension developers:

  1. Protocol Registration: A browser or operating system registers udna:// as a recognized URI scheme.
  2. Native Resolver: The browser attempts to resolve udna:// URIs using an internal or system-configured [=UDNA Resolver=].
  3. Gateway Fallback: If no native resolver is available, the browser falls back to a configured [=UDNA Gateway=] via HTTPS.
  4. Extension Hook: Browser extensions MAY register as custom protocol handlers for udna://, enabling user-selected resolution strategies.

This model ensures UDNA addresses remain resolvable even in environments without native DID infrastructure, while preserving the option for fully decentralized resolution when available.

Resolution Hints

This section is informative.

Some DID methods introduce significant resolution latency. The UDNA CG is exploring an OPTIONAL "resolution hints" mechanism that allows UDNA addresses to carry lightweight metadata to accelerate resolution.

Resolution hints, if adopted in a future version of this specification, MUST satisfy the following invariants:

Test Vectors

This section provides deterministic test vectors to validate inter-implementation consistency of the Processing Model. All vectors assume the DID Document specified in each case.

TV-1: Basic UDNARoot Resolution

Context DID Document:

{
  "@context": "https://www.w3.org/ns/did/v1",
  "id": "did:web:example.com",
  "service": [{
    "id": "#udna-root",
    "type": "UDNARoot",
    "serviceEndpoint": "https://api.example.com/udna"
  }]
}
        
Input: udna://did:web:example.com/app/profile
Expected targetUrl: https://api.example.com/udna/app/profile

TV-2: Named Service Resolution

Context DID Document:

{
  "@context": "https://www.w3.org/ns/did/v1",
  "id": "did:example:123",
  "service": [
    {
      "id": "#udna-root",
      "type": "UDNARoot",
      "serviceEndpoint": "https://example.com/default"
    },
    {
      "id": "#api",
      "type": "UDNAApiService",
      "serviceEndpoint": "https://api.example.com/v2"
    }
  ]
}
        
Input: udna://did:example:123/api/users
Expected targetUrl: https://api.example.com/v2/users

TV-3: Query and Fragment Preservation

Context DID Document: Same as TV-1.

Input: udna://did:web:example.com/docs/spec?version=1.0#section-5
Expected targetUrl: https://api.example.com/udna/docs/spec?version=1.0#section-5

TV-4: Service Not Found Error

Context DID Document: Same as TV-2.

Input: udna://did:example:123/chat/messages
Expected error: serviceNotFound

TV-5: Default Service Not Found Error

Context DID Document:

{
  "@context": "https://www.w3.org/ns/did/v1",
  "id": "did:example:456",
  "service": [
    {
      "id": "#custom",
      "type": "CustomService",
      "serviceEndpoint": "https://custom.example.com"
    }
  ]
}
        
Input: udna://did:example:456/app
Expected error: defaultServiceNotFound

Security and Privacy Considerations

UDNA inherits the security properties of the underlying DID methods and DIDComm. The following considerations apply specifically to the UDNA addressing layer.

Threat Model

The UDNA resolution process is subject to the following threat categories:

UDNA Threat Model Summary
Threat Severity Mitigation
Malicious DID Document injection High DID method authentication; cryptographic verification of DID Document integrity
Service endpoint impersonation High Clients MUST verify endpoint ownership via DID-linked verification methods
Resolver cache poisoning Medium Resolvers SHOULD respect DID Document TTL and HTTP cache-control headers
Service confusion attacks Medium Resolvers MUST match service segments against exact id fragments
Replay of stale DID Documents Low Resolvers SHOULD check updated and deactivated metadata
Correlation via DID reuse Medium Clients SHOULD use pairwise DIDs where strong unlinkability is required
Gateway interception High Gateways MUST NOT modify targetUrl semantics; clients SHOULD verify resolution independently when possible

Endpoint Confidentiality

UDNA addresses may expose service endpoints in plaintext within the resolved DID Document. For private services, implementers SHOULD use DIDComm-based routing or encrypted serviceEndpoint values.

Authentication

When accessing resolved endpoints, clients SHOULD demonstrate proof-of-possession of a private key associated with the resolving DID, or delegate access via a Verifiable Credential issued under [[VC-DATA-MODEL]].

Correlation and Privacy

UDNA addresses do not inherently create persistent trackable identifiers because DIDs can be rotated. However, repeated resolution of the same DID across different network contexts could enable correlation. To mitigate this, implementers SHOULD use pairwise DIDs per relationship where strong privacy is required.

Denial of Service

Resolvers SHOULD enforce rate limiting on DID resolution requests and employ aggressive caching policies to mitigate amplification attacks against DID method infrastructure.

Extensibility and Versioning

UDNA follows a minimal core + extension model. Core behavior is defined by this specification; optional capabilities are registered via the udna-ext query parameter (?udna-ext=https://…). The following extensions are known at the time of publication:

Batch Operations
Enables resolving multiple [=UDNA Address=]es in a single roundtrip, reducing resolution overhead in high-frequency use cases.
Gateway Forwarding
Defines behavior for relays and gateways that bridge UDNA resolution to legacy HTTP URLs, enabling progressive adoption in existing infrastructure.
Resource Integrity
Allows embedding cryptographic integrity hashes (e.g., SHA-256) for content-addressed resources referenced via a [=UDNA Address=].

Versioning of the core scheme is indicated via the udna-version query parameter. The default value for this specification is 1.0. Future versions MUST be backward-compatible at the resolution layer unless a breaking version increment is declared.

Relationship with Other Web Standards

UDNA is not intended to replace the following protocols but to unify them under a common addressing layer that respects decentralized identity. Implementations MAY embed UDNA support as a complementary naming and discovery mechanism.

Relationship of UDNA to related specifications and protocols.
Framework / Protocol Focus UDNA Role
[[DID-CORE]] Identifier and DID Document UDNA uses DID as the naming authority and cryptographic trust anchor.
[[DIDCOMM]] Secure encrypted messaging UDNA addresses can resolve to DIDComm service endpoints for encrypted channel establishment. UDNA does not require DIDComm, but MAY resolve to DIDComm endpoints.
Solid (WebID) [[SOLID]] Personal linked-data pods UDNA MAY be used as an alternative addressing mechanism alongside WebID URLs, enabling DID-based access control for Solid pods.
ActivityPub Federated social web UDNA provides identity-native addressing for actors and objects, removing dependency on domain-based actor URIs.
IPFS / IPNS Content-addressed distributed storage UDNA addresses can reference IPFS resources and supply DID identity context for access control.

Incubation Roadmap and Next Steps

The UDNA Community Group is actively incubating this specification. The following are current priorities for the 2026 incubation cycle:

Example Implementations

This appendix is informative.

Resolving a UDNA Address in JavaScript

DID Document with UDNA Service Endpoints

IANA Considerations

This document requests registration of the udna URI scheme with IANA. The scheme syntax conforms to the rules defined in and the URI generic syntax of [[RFC3986]]. The CG will submit a formal registration request to IANA upon reaching draft stability and completing at least two interoperability events.

URI Scheme Name
udna
Status
Provisional (pending IANA submission)
URI Scheme Syntax
Defined in of this specification.
URI Scheme Semantics
Defined in of this specification.
Contact
public-did-native-addr@w3.org
References
This document.

JSON-LD Context

The UDNA JSON-LD context is hosted at:

https://w3c-cg.github.io/udna/contexts/udna-v1.jsonld

The current content of the context is:

{
  "@context": {
    "@version": 1.1,
    "@protected": true,
    "id": "@id",
    "type": "@type",
    "UDNAResolutionResult": {
      "@id": "https://w3c-cg.github.io/udna/vocab#UDNAResolutionResult",
      "@context": {
        "@protected": true,
        "targetUrl": {
          "@id": "https://w3c-cg.github.io/udna/vocab#targetUrl",
          "@type": "@id"
        },
        "didDocument": {
          "@id": "https://w3c-cg.github.io/udna/vocab#didDocument",
          "@type": "@json"
        },
        "didDocumentMetadata": {
          "@id": "https://w3c-cg.github.io/udna/vocab#didDocumentMetadata",
          "@type": "@json"
        },
        "service": {
          "@id": "https://w3c-cg.github.io/udna/vocab#service",
          "@type": "@json"
        },
        "verificationMethods": {
          "@id": "https://w3c-cg.github.io/udna/vocab#verificationMethods",
          "@container": "@set"
        }
      }
    }
  }
}
    

Acknowledgments

The editor, Amir Hameed Mir, and the UDNA Community Group thank contributors from the Decentralized Identity Foundation (DIF), W3C DID Working Group alumni, and participants of the Solid and ActivityPub communities. Special thanks to the early implementers who stress-tested the addressing model and provided interoperability feedback during the initial incubation phase.