<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE rfc [
  <!ENTITY nbsp "&#160;">
]>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     category="std"
     consensus="true"
     docName="draft-linkgenetic-linkid-uri-01"
     ipr="trust200902"
     xml:lang="en"
     tocInclude="true"
     sortRefs="true"
     symRefs="true"
     version="3">

  <front>
    <title abbrev="LinkID URI">The LinkID URI Scheme and Resolution Model</title>
    <seriesInfo name="Internet-Draft" value="draft-linkgenetic-linkid-uri-01"/>
    <author fullname="Christian Nyffenegger" initials="C." surname="Nyffenegger">
      <organization>Link Genetic GmbH</organization>
      <address>
        <postal>
          <street>Leugrueb 21</street>
          <city>Zumikon</city>
          <code>8126</code>
          <country>Switzerland</country>
        </postal>
        <email>christian.nyffenegger@linkgenetic.com</email>
        <uri>https://www.linkgenetic.com</uri>
      </address>
    </author>
    <date year="2026" month="October" day="8"/>
    <area>Applications and Real-Time</area>
    <keyword>URI scheme</keyword>
    <keyword>persistent identifier</keyword>
    <keyword>resolution</keyword>
    <keyword>UUID</keyword>

    <abstract>
      <t>This document specifies the "linkid" URI scheme and a resolution
      model for persistent, location-independent identifiers.  A LinkID
      consists of the scheme name followed by a UUID and identifies a
      resource independently of its current network location.  Resolution
      maps the LinkID to a current actionable URI using one or more
      resolvers.  Resource names, locations, versions and operator
      relationships are associated data, not part of the identifier.  The
      document defines syntax, comparison, resolution semantics and an
      HTTPS binding, and requests an update of the existing IANA URI
      scheme registration.</t>
    </abstract>

    <note removeInRFC="true">
      <name>About This Document</name>
      <t>This is an individual submission.  Discussion takes place on the
      DISPATCH mailing list (dispatch@ietf.org).  Source and issue
      tracking: <eref target="https://github.com/Link-Genetic-Inc/lid"/>.</t>
    </note>
  </front>

  <middle>

    <section anchor="intro">
      <name>Introduction</name>
      <t>Hyperlinks commonly couple resource identity to a current network
      location.  When domains, paths, repositories, content-management
      systems or hosting infrastructure change, references fail even though
      the referenced resource may still exist.</t>
      <t>LinkID separates persistent identity from mutable location.  The
      core invariant is: identity is persistent, location is mutable, and
      resolution is the controlled mapping between the two.</t>
      <t>Persistence is not a purely technical property.  HTTP(S) URIs can
      be highly persistent when managed responsibly, and any persistent
      identifier system can fail if the organization behind it disappears.
      This document therefore does not claim that indirection alone
      guarantees persistence.  It aims to ensure that a LinkID and its
      authorized mapping survive changes of custody and hosting, by
      separating identifier syntax from resolver operation.</t>
      <t>LinkID does not replace HTTP(S) or existing persistent identifier
      systems; see <xref target="related"/>.</t>
    </section>

    <section anchor="terms">
      <name>Conventions and Terminology</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>",
      "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>",
      "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>",
      "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>",
      "<bcp14>NOT RECOMMENDED</bcp14>", "<bcp14>MAY</bcp14>", and
      "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
      described in BCP&nbsp;14 <xref target="RFC2119"/> <xref target="RFC8174"/>
      when, and only when, they appear in all capitals, as shown here.</t>
      <dl newline="false" spacing="normal">
        <dt>LinkID:</dt>
        <dd>A persistent identifier expressed using the "linkid" URI scheme.</dd>
        <dt>Identifier authority:</dt>
        <dd>The party authorized to maintain a LinkID's mapping and
        associated records.  Authority is established independently of the
        UUID text; it is not encoded in the identifier.</dd>
        <dt>Resolver:</dt>
        <dd>A service or software component that maps a LinkID to a
        resolution result.</dd>
        <dt>Resolution result:</dt>
        <dd>The authorized current mapping and lifecycle status for a
        LinkID returned by a resolver (<xref target="result"/>).</dd>
        <dt>Actionable URI:</dt>
        <dd>A URI in a resolution result that a client can use to access or
        interact with the identified resource.</dd>
      </dl>
    </section>

    <section anchor="syntax">
      <name>URI Scheme Syntax</name>
      <t>The syntax is specified using ABNF <xref target="RFC5234"/>; HEXDIG
      is imported from that specification.  The UUID text representation is
      defined by <xref target="RFC9562"/>.</t>
      <sourcecode type="abnf"><![CDATA[
linkid-URI = "linkid:" uuid
uuid       = 8HEXDIG "-" 4HEXDIG "-" 4HEXDIG "-"
             4HEXDIG "-" 12HEXDIG
]]></sourcecode>
      <t>A LinkID URI has no authority, namespace, path, query or fragment
      component.  Whitespace, percent-encoded characters, braces and
      suffixes are not permitted.</t>
      <t>The scheme name is case-insensitive <xref target="RFC3986"/>, and
      UUID hexadecimal text is case-insensitive <xref target="RFC9562"/>.
      Producers <bcp14>MUST</bcp14> emit the complete URI in lowercase.
      Consumers <bcp14>MUST</bcp14> accept either case.  Two LinkIDs are
      equivalent if and only if their UUID values are equal.  Lowercasing a
      conforming LinkID yields its canonical form.  Canonicalization
      <bcp14>MUST NOT</bcp14> turn a non-conforming string into a LinkID by
      discarding characters.</t>
      <t>Matching the grammar does not establish that the UUID was
      allocated, that a resource exists, or who controls it.</t>

      <section anchor="opaque">
        <name>Opacity</name>
        <t>The UUID is opaque.  Clients <bcp14>MUST NOT</bcp14> infer a
        resource type, name, location, owner or resolver from it.</t>
      </section>

      <section anchor="examples">
        <name>Example</name>
        <sourcecode><![CDATA[
linkid:00c538ea-846b-47a6-a3d4-70a9ebd29d7c
]]></sourcecode>
        <t>An associated target could be
        https://example.org/handbook/2026/section-3; after an authorized
        migration, https://example.org/manual/section-3.  The LinkID remains
        unchanged.  Independently identified resources, such as a document,
        a passage of it, or an image, each have their own UUID.  Names are
        metadata, not identifier suffixes.  Query parameters or fragments
        needed by a target belong to the target URI.</t>
      </section>
    </section>

    <section anchor="semantics">
      <name>Identifier Semantics</name>
      <t>A LinkID identifies a resource; it does not encode the resource's
      network location.  Once assigned, a LinkID <bcp14>MUST NOT</bcp14>
      be reassigned to an unrelated resource.  The actionable URI
      associated with a LinkID <bcp14>MAY</bcp14> change without changing
      the LinkID.</t>
      <t>One LinkID has one persistent identity.  Multiple target
      addresses, historical addresses, language or format variants, and
      authorized fallback addresses can be associated with it without
      creating alternative identifier forms.  Changing an address or
      transferring stewardship does not create a new identity; a resource
      version that is identified separately receives its own UUID.</t>
      <t>A resolver <bcp14>MUST NOT</bcp14> select an unrelated resource
      merely because it is reachable.  Automatic recovery does not override
      the authority governing the original mapping.</t>
      <t>Successful resolution establishes the currently authorized
      mapping.  It does not establish that destination content is safe,
      correct, trustworthy or unchanged.</t>
    </section>

    <section anchor="resolution">
      <name>Resolution Model</name>
      <t>A client resolves a LinkID by validating it against
      <xref target="syntax"/>, selecting a resolver, requesting the
      resolution result, validating that result, applying local policy, and
      returning or navigating to the actionable URI.</t>
      <t>A LinkID <bcp14>MUST NOT</bcp14> depend semantically on a single
      resolver operator: the meaning of a LinkID does not change when the
      resolver that serves it changes.</t>

      <section anchor="selection">
        <name>Resolver Selection</name>
        <t>Clients use trusted resolvers designated by local, enterprise or
        application configuration.  The UUID does not indicate an operator
        or resolver.  Implementations <bcp14>MAY</bcp14> ship with default
        resolvers but <bcp14>MUST</bcp14> allow users or administrators to
        configure alternatives.</t>
        <t>A change of resolver <bcp14>MUST NOT</bcp14> change an assigned
        UUID or authorize a new mapping.  Use of an alternative resolver does
        not prove that it holds an authoritative record for a LinkID.
        Interoperable discovery of the authoritative resolver for a given
        LinkID is not defined in this revision; see <xref target="open"/>.</t>
      </section>

      <section anchor="result">
        <name>Resolution Result</name>
        <t>A resolution result conveys at least the LinkID, its lifecycle
        status (<xref target="states"/>) and, where applicable, the
        actionable URI.  A client <bcp14>MUST</bcp14> verify that the
        returned identifier matches the requested UUID before using a
        target.  A client <bcp14>MUST NOT</bcp14> treat a mapping as
        active merely because a response was successful or a target is
        present; it <bcp14>MUST</bcp14> check the status and local policy
        before navigation.  Unrecognized members <bcp14>MUST</bcp14> be
        ignored and <bcp14>MUST NOT</bcp14> grant authority.</t>
      </section>

      <section anchor="https">
        <name>HTTPS Binding</name>
        <t>A resolver exposes a resolution endpoint identified by a URI
        Template <xref target="RFC6570"/> using the "https" scheme and
        containing the variable "identifier", for example:</t>
        <sourcecode><![CDATA[
https://resolver.example/resolve/{identifier}
]]></sourcecode>
        <t>The client expands the template with the complete LinkID and
        issues an HTTP GET request <xref target="RFC9110"/> with
        "Accept: application/json".  On success the resolver returns 200
        (OK) and a JSON object <xref target="RFC8259"/> with the following
        members:</t>
        <dl newline="true" spacing="normal">
          <dt>id (string, REQUIRED):</dt>
          <dd>The canonical LinkID.</dd>
          <dt>status (string, REQUIRED):</dt>
          <dd>The lifecycle status.  Values defined in
          <xref target="states"/> <bcp14>SHOULD</bcp14> be used.</dd>
          <dt>target_url (string or null, REQUIRED):</dt>
          <dd>The actionable URI, or null if none is authorized.</dd>
        </dl>
        <sourcecode type="json"><![CDATA[
{
  "id": "linkid:00c538ea-846b-47a6-a3d4-70a9ebd29d7c",
  "status": "active",
  "target_url": "https://example.org/resource"
}
]]></sourcecode>
        <t>Unsuccessful responses are JSON objects with an "error" member
        that names the reason.  Resolvers <bcp14>SHOULD</bcp14> use the
        following status codes and error values:</t>
        <table>
          <name>Error Responses</name>
          <thead><tr><th>HTTP status</th><th>error</th><th>Condition</th></tr></thead>
          <tbody>
            <tr><td>400</td><td>invalid_identifier</td><td>Input does not conform to <xref target="syntax"/>.</td></tr>
            <tr><td>403</td><td>policy_denied</td><td>policy-denied</td></tr>
            <tr><td>404</td><td>not_found</td><td>unknown</td></tr>
            <tr><td>404</td><td>no_target</td><td>Known LinkID without an authorized or reachable target (inactive)</td></tr>
            <tr><td>410</td><td>gone</td><td>revoked or tombstoned</td></tr>
            <tr><td>503</td><td>temporarily_unavailable</td><td>temporarily-unavailable</td></tr>
          </tbody>
        </table>
        <t>Resolvers <bcp14>MAY</bcp14> use more specific error values and
        other 4xx status codes.  Clients <bcp14>MUST</bcp14> treat only
        404 with "not_found" as the unknown condition; any other error for a
        known LinkID <bcp14>MUST NOT</bcp14> be interpreted as unknown and
        <bcp14>MUST NOT</bcp14> lead to navigation.</t>
        <t>Clients <bcp14>MUST NOT</bcp14> interpret an HTML page, a
        transport failure or an intermediary error as a resolution result.
        A server error is not evidence that a LinkID is unknown.</t>
        <t>Resolvers <bcp14>MAY</bcp14> offer separate interactive endpoints
        that redirect browsers to an actionable URI.  LinkID resolution
        <bcp14>MUST NOT</bcp14> be defined solely as an HTTP redirect
        service, and an HTTPS resolver URI <bcp14>MUST NOT</bcp14> be
        treated as the LinkID itself.</t>
        <t>Public resolvers <bcp14>MUST</bcp14> use HTTPS with validation
        of the server identity.  This does not imply that public lookup
        requires user authentication.</t>
      </section>
    </section>

    <section anchor="states">
      <name>Resolution States</name>
      <t>Resolvers <bcp14>SHOULD</bcp14> distinguish the following
      conditions where applicable.</t>
      <table>
        <name>Resolution States</name>
        <thead><tr><th>State</th><th>Meaning</th><th>Navigation</th></tr></thead>
        <tbody>
          <tr><td>active</td><td>Current mapping is valid.</td><td>Use an authorized target.</td></tr>
          <tr><td>unknown</td><td>No record for the LinkID.</td><td>Do not guess a target.</td></tr>
          <tr><td>inactive</td><td>Assigned, no current location.</td><td>None.</td></tr>
          <tr><td>deprecated</td><td>Identity superseded.</td><td>Only an explicitly authorized mapping.</td></tr>
          <tr><td>revoked</td><td>Withdrawn by the identifier authority.</td><td>None.</td></tr>
          <tr><td>tombstoned</td><td>Resource no longer exists; identity preserved.</td><td>No replacement assumed.</td></tr>
          <tr><td>temporarily-unavailable</td><td>Resolution currently not possible.</td><td>Do not infer unknown.</td></tr>
          <tr><td>policy-denied</td><td>Refused by policy.</td><td>Do not bypass policy.</td></tr>
          <tr><td>integrity-failure</td><td>Record failed validation.</td><td>Do not use the record.</td></tr>
        </tbody>
      </table>
      <t>An unknown LinkID <bcp14>MUST NOT</bcp14> be redirected to
      unrelated content.  A revoked or tombstoned LinkID
      <bcp14>MUST NOT</bcp14> be reassigned.</t>
    </section>

    <section anchor="governance">
      <name>Allocation and Governance</name>
      <t>New LinkIDs <bcp14>MUST</bcp14> use UUID version 4 as defined in
      <xref target="RFC9562" section="5.4"/>, with the random bits generated
      by a cryptographically secure random source.  Random generation
      allows allocation by independent parties without coordination.
      Implementations <bcp14>MUST NOT</bcp14> knowingly allocate an
      assigned UUID to an unrelated resource; a detected collision
      <bcp14>MUST NOT</bcp14> overwrite the existing identity.  Previously
      assigned identifiers <bcp14>MUST NOT</bcp14> be renumbered to satisfy
      this rule.</t>
      <t>Registration agencies, enterprises and resolver operators can have
      separate responsibilities and allocation policies.  These are
      administrative relationships associated with records, not
      subdivisions of the identifier.</t>
      <t>A transfer of stewardship or hosting <bcp14>MUST NOT</bcp14>
      change an assigned UUID.  It requires authorization and preservation
      of mapping provenance; changing a resolver address alone does not
      transfer control.  Where continuity cannot be established, resolution
      fails safely rather than granting an unrelated operator authority.
      A service interruption does not prove that the resource has ceased to
      exist.</t>
      <t>DOI, ARK, URN and Handle identifiers retain their own syntax and
      governance.  An association with them is held in metadata or targets,
      not embedded in the LinkID.</t>
      <t>Accreditation of resolver operators, service levels and dispute
      resolution are outside the scope of this document.</t>
    </section>

    <section anchor="related">
      <name>Relationship to Existing Identifier Systems</name>
      <dl newline="true" spacing="normal">
        <dt>URNs <xref target="RFC8141"/>:</dt>
        <dd>URNs provide persistent names within registered namespaces but
        do not define a general resolution mechanism.  LinkID combines a
        persistent identifier with a defined resolution model.</dd>
        <dt>Handle System and DOI <xref target="RFC3650"/> <xref target="ISO26324"/>:</dt>
        <dd>DOIs resolve through the Handle System.  LinkID does not
        replace DOI names or governance; a LinkID can be associated with a
        DOI-identified resource through its targets or metadata.</dd>
        <dt>ARK <xref target="ARK"/>:</dt>
        <dd>ARKs encode a Name Assigning Authority Number and use
        organization-operated resolvers.  A LinkID does not encode an
        assigning authority.</dd>
        <dt>PURL <xref target="PURL"/>:</dt>
        <dd>PURLs are HTTP URIs redirected by a PURL server and bound to its
        domain.  A LinkID is not bound to a resolver's domain.</dd>
      </dl>
    </section>

    <section anchor="interop">
      <name>Interoperability Considerations</name>
      <section anchor="interop-name">
        <name>Existing Uses of "LinkId"</name>
        <t>The string "LinkId" is used in existing specifications
        independently of this scheme.  For example, <xref target="MS-ASDOC"/>
        defines a "LinkId" XML element that carries a document link, such
        as a UNC file path.  Such uses are unrelated to the "linkid" URI
        scheme.</t>
        <t>A LinkID is recognized by the scheme component
        (<xref target="RFC3986" section="3.1"/>) and validated against
        <xref target="syntax"/>.  The string "LinkId" in any non-scheme
        position does not constitute a LinkID and <bcp14>MUST NOT</bcp14>
        be interpreted as one.</t>
      </section>
      <section anchor="interop-detect">
        <name>Contextual Recognition</name>
        <t>Because scheme names are case-insensitive, a field label followed
        by a value (for example "LinkId: 4711") can be mistaken for a linkid
        URI by a generic parser.  Therefore:</t>
        <ul>
          <li>Implementations <bcp14>MUST NOT</bcp14> treat a string as a
          LinkID unless it appears in a context that expects a URI and
          conforms to <xref target="syntax"/>.</li>
          <li>Implementations <bcp14>SHOULD NOT</bcp14> scan free text for
          LinkIDs without such a context.</li>
          <li>A string beginning with "linkid:" in any case that does not
          conform to <xref target="syntax"/> <bcp14>MUST</bcp14> be rejected
          and <bcp14>MUST NOT</bcp14> be passed to a resolver.</li>
        </ul>
        <t>Documentation and user interfaces <bcp14>SHOULD</bcp14> refer to
        "LinkID URIs" or "linkid: URIs".</t>
      </section>
      <section anchor="interop-indep">
        <name>Independent Implementations</name>
        <t>A conforming client needs a URI validator, resolver configuration,
        an HTTPS client and a JSON parser.  A conforming resolver needs
        authorized records and the binding in <xref target="https"/>.
        Neither requires a particular operator's hostname, SDK or software.
        Technical compatibility does not confer authority over existing
        LinkIDs.</t>
      </section>
    </section>

    <section anchor="usecases">
      <name>Use Cases</name>
      <t>Use cases include Web and domain migration; long-lived documents
      (PDF, office formats) with embedded references; enterprise knowledge
      systems; government, legal and public-record references; scientific
      publications and datasets; archives and custody transfer;
      machine-to-machine references; and tombstoning of resources that no
      longer exist.</t>
    </section>

    <section anchor="caching">
      <name>Caching and Failure Handling</name>
      <t>Resolution results <bcp14>MAY</bcp14> be cached according to HTTP
      caching <xref target="RFC9111"/>.  Cached results <bcp14>MUST NOT</bcp14>
      be treated as authoritative after their freshness lifetime.  HTTP
      freshness is not an assertion about identifier lifetime or
      destination health.</t>
      <t>Clients and resolvers <bcp14>MUST</bcp14> detect and bound
      resolution and redirect loops.  Failures <bcp14>MUST</bcp14> fail
      safely: a client <bcp14>MUST NOT</bcp14> guess a destination for an
      unknown LinkID.</t>
    </section>

    <section anchor="security">
      <name>Security Considerations</name>
      <t>LinkID resolution introduces an indirection layer.  Unauthorized
      modification of a mapping redirects every reference using the
      affected LinkID.  Interfaces for updating records
      <bcp14>MUST</bcp14> be strongly authenticated and access controlled,
      and changes <bcp14>SHOULD</bcp14> be auditable.</t>
      <t>Public resolvers <bcp14>MUST</bcp14> protect against resolver
      impersonation, mapping hijacking, open redirects, phishing, malicious
      destination schemes, denial of service, replay of stale records,
      identifier enumeration and resolution loops.  Clients
      <bcp14>SHOULD</bcp14> restrict the schemes of actionable URIs they
      follow (for example to "https").</t>
      <t>Resolvers that fetch or inspect destinations <bcp14>MUST</bcp14>
      defend against server-side request forgery, including requests to
      loopback, link-local, cloud metadata and internal addresses, and
      <bcp14>MUST</bcp14> account for redirects and DNS rebinding.</t>
      <t>Misconfigured or compromised resolver configuration can misdirect
      lookups even though the LinkID is unchanged.  Discovering an endpoint
      or a public key does not establish authority over an identifier.
      High-assurance deployments <bcp14>SHOULD</bcp14> protect the
      integrity of resolution results cryptographically; a common format is
      an open issue (<xref target="open"/>).</t>
    </section>

    <section anchor="privacy">
      <name>Privacy Considerations</name>
      <t>Resolution requests reveal interest in particular resources.
      Resolver operators <bcp14>SHOULD</bcp14> minimize collection and
      retention of personal data and <bcp14>SHOULD</bcp14> publish their
      logging and retention policies.  Public resolution
      <bcp14>SHOULD NOT</bcp14> require user authentication unless required
      by the resource or applicable policy.</t>
      <t>A LinkID contains no credentials or resource names, but can become
      a correlatable reference when linked to personal information.
      Operators <bcp14>SHOULD NOT</bcp14> place secrets in public metadata
      or unnecessarily forward client information to targets.</t>
    </section>

    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>The "linkid" URI scheme is registered in the "Uniform Resource
      Identifier (URI) Schemes" registry with Provisional status.  This
      document requests that IANA update the registration as follows, in
      accordance with <xref target="RFC7595"/>.  The syntax below narrows
      the previously registered syntax to the UUID form.</t>
      <dl newline="false" spacing="compact">
        <dt>Scheme name:</dt><dd>linkid</dd>
        <dt>Status:</dt><dd>Permanent</dd>
        <dt>URI scheme syntax:</dt><dd>See <xref target="syntax"/>.</dd>
        <dt>URI scheme semantics:</dt><dd>See <xref target="semantics"/> and <xref target="resolution"/>.</dd>
        <dt>Encoding considerations:</dt><dd>ASCII only; no percent-encoding within the identifier.</dd>
        <dt>Applications/protocols:</dt><dd>Persistent identification and
        resolution of Web, document, archival, scientific, government,
        enterprise and machine-to-machine resources.</dd>
        <dt>Interoperability considerations:</dt><dd>See <xref target="interop"/>.</dd>
        <dt>Security considerations:</dt><dd>See <xref target="security"/>.</dd>
        <dt>Contact:</dt><dd>Christian Nyffenegger &lt;christian.nyffenegger@linkgenetic.com&gt;</dd>
        <dt>Change controller:</dt><dd>IETF &lt;iesg@ietf.org&gt;</dd>
        <dt>Reference:</dt><dd>This document</dd>
      </dl>
      <t>No other IANA action is requested.</t>
    </section>
  </middle>

  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
<reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119"><front><title>Key words for use in RFCs to Indicate Requirement Levels</title><author initials="S." surname="Bradner" fullname="S. Bradner"/><date year="1997" month="March"/></front><seriesInfo name="RFC" value="2119"/><seriesInfo name="BCP" value="14"/><seriesInfo name="DOI" value="10.17487/RFC2119"/></reference><reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174"><front><title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title><author initials="B." surname="Leiba" fullname="B. Leiba"/><date year="2017" month="May"/></front><seriesInfo name="RFC" value="8174"/><seriesInfo name="BCP" value="14"/><seriesInfo name="DOI" value="10.17487/RFC8174"/></reference><reference anchor="RFC3986" target="https://www.rfc-editor.org/info/rfc3986"><front><title>Uniform Resource Identifier (URI): Generic Syntax</title><author initials="T." surname="Berners-Lee" fullname="T. Berners-Lee"/><author initials="R." surname="Fielding" fullname="R. Fielding"/><author initials="L." surname="Masinter" fullname="L. Masinter"/><date year="2005" month="January"/></front><seriesInfo name="RFC" value="3986"/><seriesInfo name="STD" value="66"/><seriesInfo name="DOI" value="10.17487/RFC3986"/></reference><reference anchor="RFC5234" target="https://www.rfc-editor.org/info/rfc5234"><front><title>Augmented BNF for Syntax Specifications: ABNF</title><author initials="D." surname="Crocker" fullname="D. Crocker"/><author initials="P." surname="Overell" fullname="P. Overell"/><date year="2008" month="January"/></front><seriesInfo name="RFC" value="5234"/><seriesInfo name="STD" value="68"/><seriesInfo name="DOI" value="10.17487/RFC5234"/></reference><reference anchor="RFC6570" target="https://www.rfc-editor.org/info/rfc6570"><front><title>URI Template</title><author initials="J." surname="Gregorio" fullname="J. Gregorio"/><author initials="R." surname="Fielding" fullname="R. Fielding"/><author initials="M." surname="Hadley" fullname="M. Hadley"/><author initials="M." surname="Nottingham" fullname="M. Nottingham"/><author initials="D." surname="Orchard" fullname="D. Orchard"/><date year="2012" month="March"/></front><seriesInfo name="RFC" value="6570"/><seriesInfo name="DOI" value="10.17487/RFC6570"/></reference><reference anchor="RFC7595" target="https://www.rfc-editor.org/info/rfc7595"><front><title>Guidelines and Registration Procedures for URI Schemes</title><author initials="D." surname="Thaler" fullname="D. Thaler"/><author initials="T." surname="Hansen" fullname="T. Hansen"/><author initials="T." surname="Hardie" fullname="T. Hardie"/><date year="2015" month="June"/></front><seriesInfo name="RFC" value="7595"/><seriesInfo name="BCP" value="35"/><seriesInfo name="DOI" value="10.17487/RFC7595"/></reference><reference anchor="RFC8259" target="https://www.rfc-editor.org/info/rfc8259"><front><title>The JavaScript Object Notation (JSON) Data Interchange Format</title><author initials="T." surname="Bray" fullname="T. Bray"/><date year="2017" month="December"/></front><seriesInfo name="RFC" value="8259"/><seriesInfo name="STD" value="90"/><seriesInfo name="DOI" value="10.17487/RFC8259"/></reference><reference anchor="RFC9110" target="https://www.rfc-editor.org/info/rfc9110"><front><title>HTTP Semantics</title><author initials="R." surname="Fielding" fullname="R. Fielding"/><author initials="M." surname="Nottingham" fullname="M. Nottingham"/><author initials="J." surname="Reschke" fullname="J. Reschke"/><date year="2022" month="June"/></front><seriesInfo name="RFC" value="9110"/><seriesInfo name="STD" value="97"/><seriesInfo name="DOI" value="10.17487/RFC9110"/></reference><reference anchor="RFC9111" target="https://www.rfc-editor.org/info/rfc9111"><front><title>HTTP Caching</title><author initials="R." surname="Fielding" fullname="R. Fielding"/><author initials="M." surname="Nottingham" fullname="M. Nottingham"/><author initials="J." surname="Reschke" fullname="J. Reschke"/><date year="2022" month="June"/></front><seriesInfo name="RFC" value="9111"/><seriesInfo name="STD" value="98"/><seriesInfo name="DOI" value="10.17487/RFC9111"/></reference><reference anchor="RFC9562" target="https://www.rfc-editor.org/info/rfc9562"><front><title>Universally Unique IDentifiers (UUIDs)</title><author initials="K." surname="Davis" fullname="K. Davis"/><author initials="B." surname="Peabody" fullname="B. Peabody"/><author initials="P." surname="Leach" fullname="P. Leach"/><date year="2024" month="May"/></front><seriesInfo name="RFC" value="9562"/><seriesInfo name="DOI" value="10.17487/RFC9562"/></reference>
      </references>
      <references>
        <name>Informative References</name>
<reference anchor="RFC3650" target="https://www.rfc-editor.org/info/rfc3650"><front><title>Handle System Overview</title><author initials="S." surname="Sun" fullname="S. Sun"/><author initials="L." surname="Lannom" fullname="L. Lannom"/><author initials="B." surname="Boesch" fullname="B. Boesch"/><date year="2003" month="November"/></front><seriesInfo name="RFC" value="3650"/><seriesInfo name="DOI" value="10.17487/RFC3650"/></reference><reference anchor="RFC8141" target="https://www.rfc-editor.org/info/rfc8141"><front><title>Uniform Resource Names (URNs)</title><author initials="P." surname="Saint-Andre" fullname="P. Saint-Andre"/><author initials="J." surname="Klensin" fullname="J. Klensin"/><date year="2017" month="April"/></front><seriesInfo name="RFC" value="8141"/><seriesInfo name="DOI" value="10.17487/RFC8141"/></reference><reference anchor="RFC7942" target="https://www.rfc-editor.org/info/rfc7942"><front><title>Improving Awareness of Running Code: The Implementation Status Section</title><author initials="Y." surname="Sheffer" fullname="Y. Sheffer"/><author initials="A." surname="Farrel" fullname="A. Farrel"/><date year="2016" month="July"/></front><seriesInfo name="BCP" value="205"/><seriesInfo name="RFC" value="7942"/><seriesInfo name="DOI" value="10.17487/RFC7942"/></reference><reference anchor="RFC8615" target="https://www.rfc-editor.org/info/rfc8615"><front><title>Well-Known Uniform Resource Identifiers (URIs)</title><author initials="M." surname="Nottingham" fullname="M. Nottingham"/><date year="2019" month="May"/></front><seriesInfo name="RFC" value="8615"/><seriesInfo name="DOI" value="10.17487/RFC8615"/></reference>
        <reference anchor="ARK" target="https://datatracker.ietf.org/doc/draft-kunze-ark/">
          <front>
            <title>The ARK Identifier Scheme</title>
            <author initials="J." surname="Kunze" fullname="John Kunze"/>
            <author initials="E." surname="Bermès" fullname="Emmanuelle Bermès" asciiSurname="Bermes" asciiFullname="Emmanuelle Bermes"/>
            <date/>
          </front>
          <refcontent>Work in Progress, Internet-Draft, draft-kunze-ark</refcontent>
        </reference>
        <reference anchor="ISO26324">
          <front>
            <title>Information and documentation - Digital object identifier system</title>
            <author><organization>ISO</organization></author>
            <date/>
          </front>
          <seriesInfo name="ISO" value="26324"/>
        </reference>
        <reference anchor="PURL" target="https://purl.archive.org/">
          <front>
            <title>Persistent URL Service</title>
            <author><organization>Internet Archive</organization></author>
            <date/>
          </front>
        </reference>
        <reference anchor="MS-ASDOC" target="https://learn.microsoft.com/en-us/openspecs/exchange_server_protocols/ms-asdoc/">
          <front>
            <title>[MS-ASDOC]: Exchange ActiveSync: Document Class Protocol</title>
            <author><organization>Microsoft Corporation</organization></author>
            <date/>
          </front>
        </reference>
      </references>
    </references>

    <section anchor="implstatus" removeInRFC="true">
      <name>Implementation Status</name>
      <t>This section records the status of known implementations at the
      time of posting, following <xref target="RFC7942"/>.  The description
      is provided for the information of reviewers; inclusion does not
      imply endorsement by the IETF.</t>
      <dl newline="false" spacing="normal">
        <dt>Organization:</dt><dd>Link Genetic GmbH</dd>
        <dt>Implementation:</dt><dd>LinkID platform and public resolver
        (proprietary); client SDKs and this specification at
        <eref target="https://github.com/Link-Genetic-Inc/lid"/></dd>
        <dt>Licensing:</dt><dd>Platform and resolver: proprietary.  SDKs:
        see the repository.</dd>
        <dt>Contact:</dt><dd>christian.nyffenegger@linkgenetic.com</dd>
      </dl>
      <t>Coverage and maturity:</t>
      <ul>
        <li>Allocation: all identifier-creating paths, including DOI
        rescue and test data generation, generate UUID version 4
        identifiers from a cryptographically secure source.  Records
        allocated before this revision, including some with non-UUID
        identifiers, are retained and remain resolvable without
        renumbering.</li>
        <li>Resolution: a public JSON endpoint,
        /api/public/resolve/{identifier}, returns the members id (always
        in canonical form), status and target_url as defined in
        <xref target="https"/>, and 400 invalid_identifier and 404
        not_found.  It additionally uses more specific errors: 403
        region_blocked, 404 no_target and no_reachable_target, 410 for
        erased, expired, archived and inactive records, and 451 for
        suspended records.  It returns further implementation-specific
        members (scheme, uuid, last_verified_at, registration_agency,
        version) and accepts legacy "lid:" input for compatibility.
        Separate browser routes redirect to targets.</li>
        <li>Multiple targets: the data model supports multiple,
        historical, language-specific and fallback targets per LinkID.
        A consistent target-selection algorithm across endpoints is not yet
        defined.</li>
        <li>Discovery and integrity: implementation-specific resolver
        descriptors and a signed record format exist under /.well-known/
        paths.  They are not registered under <xref target="RFC8615"/> and
        are not part of this specification.</li>
        <li>Federation: independently operated, interoperating resolvers
        have not yet been demonstrated.</li>
      </ul>
    </section>

    <section anchor="open">
      <name>Open Issues</name>
      <t>The author seeks community input on:</t>
      <ol>
        <li>Interoperable discovery of the authoritative resolver for a
        LinkID, given that the UUID carries no authority information
        (for example: configuration only, operator descriptors, a shared
        directory, or replication).</li>
        <li>A signature format for resolution results and how clients
        establish trust in identifier-authority keys.</li>
        <li>Which multi-target and lifecycle information should be exposed
        in an interoperable response, and how target selection (language,
        format, priority, fallback) should be described.</li>
        <li>Representation of stewardship transfer and lifecycle history.</li>
        <li>Transition handling for identifiers allocated under the broader
        syntax of the existing provisional registration and revision -00.</li>
        <li>Which governance and operational aspects belong in an IETF
        specification and which in a separate operational framework.</li>
      </ol>
    </section>

    <section anchor="changes" numbered="false" removeInRFC="true">
      <name>Changes since -00</name>
      <ul>
        <li>Narrowed the syntax to "linkid:" followed by a UUID; removed
        non-UUID examples.</li>
        <li>Required UUID version 4 for new allocations, without renumbering
        existing identifiers.</li>
        <li>Separated identity from names, targets, versions, fallbacks and
        operator relationships.</li>
        <li>Defined resolver selection, the resolution result and an HTTPS
        binding aligned with the existing implementation.</li>
        <li>Added allocation, stewardship transfer and continuity rules.</li>
        <li>Added relationship to URN, Handle/DOI, ARK and PURL.</li>
        <li>Added interoperability considerations on existing uses of
        "LinkId" and contextual recognition (URI review feedback).</li>
        <li>Changed the change controller to the IETF.</li>
        <li>Added Implementation Status and Open Issues appendices; updated
        contact address and references.</li>
      </ul>
    </section>

    <section anchor="ack" numbered="false">
      <name>Acknowledgments</name>
      <t>The author thanks Ted Hardie for the URI review, and the
      participants in the uri-review and DISPATCH discussions and in the
      W3C TPAC 2025 breakout session for their feedback.</t>
    </section>
  </back>
</rfc>
