<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.2.3) -->
<?rfc compact="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ferro-dnsop-apertodns-protocol-02" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="ApertoDNS Protocol">ApertoDNS Protocol: A Modern Dynamic DNS Update Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-ferro-dnsop-apertodns-protocol-02"/>
    <author initials="A." surname="Ferro" fullname="Andrea Ferro">
      <organization>ApertoDNS</organization>
      <address>
        <postal>
          <country>Italy</country>
        </postal>
        <email>support@apertodns.com</email>
      </address>
    </author>
    <date year="2026" month="January" day="22"/>
    <area>Operations and Management</area>
    <workgroup>DNS Operations</workgroup>
    <keyword>dynamic dns</keyword>
    <keyword>ddns</keyword>
    <keyword>dns update</keyword>
    <keyword>REST API</keyword>
    <keyword>ACME</keyword>
    <keyword>DNS-01</keyword>
    <abstract>
      <?line 53?>

<t>This document specifies the ApertoDNS Protocol, a modern RESTful
protocol for dynamic DNS (DDNS) updates. It provides a secure,
provider-agnostic alternative to legacy protocols, with native
support for IPv4, IPv6, bulk updates, automatic IP detection,
TXT record management for ACME DNS-01 challenges, and
standardized authentication mechanisms.</t>
      <t>The protocol uses well-known URIs (RFC 8615), JSON payloads
(RFC 8259), and bearer token authentication (RFC 6750) to enable
interoperable dynamic DNS services across different providers.</t>
    </abstract>
  </front>
  <middle>
    <?line 66?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Dynamic DNS (DDNS) services allow users with dynamically assigned
IP addresses to maintain a consistent hostname that automatically
updates when their IP address changes. This capability is essential
for home users, small businesses, and IoT devices that need to be
reachable despite lacking static IP addresses.</t>
      <t>While RFC 2136 <xref target="RFC2136"/> defines DNS UPDATE for programmatic DNS
modifications, most consumer-facing DDNS services use simpler
HTTP-based protocols. The de facto standard for consumer DDNS
emerged organically without formal specification.</t>
      <t>This lack of standardization has led to:</t>
      <ul spacing="normal">
        <li>
          <t>Inconsistent implementations across providers</t>
        </li>
        <li>
          <t>Security vulnerabilities from ad-hoc designs</t>
        </li>
        <li>
          <t>Limited feature sets (e.g., no native IPv6 support)</t>
        </li>
        <li>
          <t>Vendor lock-in due to proprietary extensions</t>
        </li>
        <li>
          <t>No formal capability negotiation</t>
        </li>
      </ul>
      <t>This document specifies the ApertoDNS Protocol as a modern, secure,
and fully interoperable alternative designed for the current
Internet landscape.</t>
      <section anchor="protocol-versioning">
        <name>Protocol Versioning</name>
        <t>The protocol version specified in discovery responses (e.g., "1.3.0")
refers to the semantic version of the protocol specification itself.
This document represents the first IETF standardization of a protocol
that has been in production use since 2024. The version number in
the discovery endpoint reflects the feature set available, while
the Internet-Draft version (e.g., "-02") tracks the IETF document
revision process separately.</t>
      </section>
      <section anchor="requirements-language">
        <name>Requirements Language</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 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

</section>
      <section anchor="goals">
        <name>Goals</name>
        <t>The ApertoDNS Protocol is designed with the following goals:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Provider-agnostic</strong>: Any DDNS provider can implement this
protocol using their own domain and branding</t>
          </li>
          <li>
            <t><strong>Secure by default</strong>: HTTPS required, bearer token authentication</t>
          </li>
          <li>
            <t><strong>Modern</strong>: JSON responses, proper HTTP semantics, native IPv6</t>
          </li>
          <li>
            <t><strong>Discoverable</strong>: Self-describing via discovery endpoint</t>
          </li>
          <li>
            <t><strong>Extensible</strong>: Capability negotiation allows future enhancements</t>
          </li>
          <li>
            <t><strong>Backward compatible</strong>: Optional legacy endpoint for existing clients</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>This document uses the following terms:</t>
      <dl>
        <dt>DDNS:</dt>
        <dd>
          <t>Dynamic DNS. A service that automatically updates DNS records
when a client's IP address changes.</t>
        </dd>
        <dt>Provider:</dt>
        <dd>
          <t>An organization or service implementing this protocol to offer
DDNS services to users.</t>
        </dd>
        <dt>Hostname:</dt>
        <dd>
          <t>A fully qualified domain name (FQDN) managed by the provider
and associated with a user account.</t>
        </dd>
        <dt>Token:</dt>
        <dd>
          <t>An authentication credential issued by the provider, used to
authorize API requests.</t>
        </dd>
        <dt>Auto-detection:</dt>
        <dd>
          <t>Server-side determination of the client's IP address from the
incoming HTTP request, used when the client specifies "auto"
as the IP value.</t>
        </dd>
        <dt>Client:</dt>
        <dd>
          <t>Software or device that makes requests to a DDNS provider to
update DNS records.</t>
        </dd>
        <dt>A-label:</dt>
        <dd>
          <t>The ASCII-Compatible Encoding (ACE) form of an Internationalized
Domain Name label, as defined in <xref target="RFC5891"/>.</t>
        </dd>
        <dt>TXT Record:</dt>
        <dd>
          <t>A DNS resource record type used to store arbitrary text data,
commonly used for domain verification and ACME DNS-01 challenges.</t>
        </dd>
        <dt>ACME DNS-01:</dt>
        <dd>
          <t>A challenge type defined in <xref target="RFC8555"/> where domain ownership
is proven by provisioning a DNS TXT record.</t>
        </dd>
      </dl>
    </section>
    <section anchor="protocol-overview">
      <name>Protocol Overview</name>
      <t>The ApertoDNS Protocol is a RESTful API using JSON over HTTPS.
All protocol endpoints are located under the well-known URI path
<tt>/.well-known/apertodns/v1/</tt>.</t>
      <section anchor="base-url">
        <name>Base URL</name>
        <t>Conforming implementations <bcp14>MUST</bcp14> serve all endpoints under:</t>
        <artwork><![CDATA[
https://{provider-domain}/.well-known/apertodns/v1/
]]></artwork>
        <t>The use of well-known URIs <xref target="RFC8615"/> ensures consistent endpoint
discovery across providers.</t>
      </section>
      <section anchor="content-type">
        <name>Content Type</name>
        <t>All request and response bodies <bcp14>MUST</bcp14> use the <tt>application/json</tt>
media type <xref target="RFC8259"/> unless otherwise specified.</t>
      </section>
      <section anchor="response-format">
        <name>Response Format</name>
        <t>All responses <bcp14>MUST</bcp14> include a boolean <tt>success</tt> field at the top
level:</t>
        <sourcecode type="json"><![CDATA[
{
  "success": true,
  "data": { ... }
}
]]></sourcecode>
        <t>Or for errors:</t>
        <sourcecode type="json"><![CDATA[
{
  "success": false,
  "error": {
    "code": "error_code",
    "message": "Human-readable description"
  }
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="conformance-requirements">
      <name>Conformance Requirements</name>
      <t>This section defines the requirements for conforming implementations.</t>
      <section anchor="conformance-levels">
        <name>Conformance Levels</name>
        <t>This protocol defines two conformance levels:</t>
        <dl>
          <dt>Core Conformance:</dt>
          <dd>
            <t>A conforming implementation <bcp14>MUST</bcp14> implement the following endpoints:
/info, /health, and /update. A conforming implementation <bcp14>MUST</bcp14>
support bearer token authentication. A conforming implementation
<bcp14>MUST</bcp14> serve all endpoints over HTTPS.</t>
          </dd>
          <dt>Full Conformance:</dt>
          <dd>
            <t>In addition to core conformance requirements, a fully conforming
implementation <bcp14>MUST</bcp14> implement: /bulk-update, /status/{hostname},
and /domains endpoints.</t>
          </dd>
        </dl>
      </section>
      <section anchor="capability-advertisement">
        <name>Capability Advertisement</name>
        <t>Implementations <bcp14>MUST</bcp14> accurately advertise their capabilities in
the /info endpoint response. Implementations <bcp14>MUST NOT</bcp14> advertise
capabilities they do not support.</t>
      </section>
      <section anchor="interoperability">
        <name>Interoperability</name>
        <t>Implementations <bcp14>SHOULD</bcp14> accept requests from any conforming client.
Implementations <bcp14>MUST NOT</bcp14> require proprietary extensions for basic
DDNS functionality.</t>
      </section>
    </section>
    <section anchor="authentication">
      <name>Authentication</name>
      <section anchor="supported-methods">
        <name>Supported Methods</name>
        <t>Protected endpoints require authentication via one of the following
methods:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Bearer Token</strong> (<bcp14>RECOMMENDED</bcp14>) <xref target="RFC6750"/>:
<tt>Authorization: Bearer {token}</tt></t>
          </li>
          <li>
            <t><strong>API Key Header</strong>: <tt>X-API-Key: {token}</tt></t>
          </li>
          <li>
            <t><strong>HTTP Basic</strong> (legacy only): <tt>Authorization: Basic {credentials}</tt></t>
          </li>
        </ol>
        <t>Implementations <bcp14>MUST</bcp14> support bearer token authentication.
Implementations <bcp14>MAY</bcp14> support additional methods.</t>
      </section>
      <section anchor="token-format">
        <name>Token Format</name>
        <t>Tokens <bcp14>SHOULD</bcp14> follow the format:</t>
        <artwork><![CDATA[
{provider}_{environment}_{random}
]]></artwork>
        <t>Where:</t>
        <ul spacing="normal">
          <li>
            <t><tt>{provider}</tt>: Provider identifier (e.g., "apertodns", "example")</t>
          </li>
          <li>
            <t><tt>{environment}</tt>: Token environment ("live", "test", "sandbox")</t>
          </li>
          <li>
            <t><tt>{random}</tt>: Cryptographically secure random string (minimum 32
characters recommended)</t>
          </li>
        </ul>
        <t>Example: <tt>apertodns_live_Kj8mP2xL9nQ4wR7vY1zA3bC6dE0fG5hI</tt></t>
        <t>This format enables:</t>
        <ul spacing="normal">
          <li>
            <t>Easy identification of token source during debugging</t>
          </li>
          <li>
            <t>Environment separation (production vs. testing)</t>
          </li>
          <li>
            <t>Consistent token handling across providers</t>
          </li>
        </ul>
      </section>
      <section anchor="token-transmission">
        <name>Token Transmission</name>
        <t>Tokens <bcp14>MUST</bcp14> be transmitted only in HTTP headers. Tokens <bcp14>MUST NOT</bcp14>
appear in URLs, query parameters, or request bodies where they
might be logged.</t>
      </section>
      <section anchor="authorization-scopes">
        <name>Authorization Scopes</name>
        <t>Servers <bcp14>MAY</bcp14> implement scope-based authorization to limit token
permissions. When supported, the /info endpoint <bcp14>SHOULD</bcp14> include a
<tt>scopes_supported</tt> array in the authentication object.</t>
        <t>The following scopes are defined:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Scope</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">dns:update</td>
              <td align="left">Permission to update DNS A/AAAA records</td>
            </tr>
            <tr>
              <td align="left">domains:read</td>
              <td align="left">Permission to list user's domains</td>
            </tr>
            <tr>
              <td align="left">txt:read</td>
              <td align="left">Permission to read TXT records</td>
            </tr>
            <tr>
              <td align="left">txt:write</td>
              <td align="left">Permission to create/update TXT records</td>
            </tr>
            <tr>
              <td align="left">txt:delete</td>
              <td align="left">Permission to delete TXT records</td>
            </tr>
          </tbody>
        </table>
        <t>Tokens with insufficient scope <bcp14>MUST</bcp14> receive a 403 Forbidden response
when attempting operations outside their permitted scope.</t>
      </section>
    </section>
    <section anchor="endpoints">
      <name>Endpoints</name>
      <section anchor="discovery-endpoint-info">
        <name>Discovery Endpoint (/info)</name>
        <artwork><![CDATA[
GET /.well-known/apertodns/v1/info
]]></artwork>
        <t>The discovery endpoint returns provider information, capabilities,
and configuration. This endpoint <bcp14>MUST NOT</bcp14> require authentication.</t>
        <section anchor="response-fields">
          <name>Response Fields</name>
          <table>
            <thead>
              <tr>
                <th align="left">Field</th>
                <th align="left">Type</th>
                <th align="left">Required</th>
                <th align="left">Description</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">protocol</td>
                <td align="left">string</td>
                <td align="left">YES</td>
                <td align="left">
                  <bcp14>MUST</bcp14> be "apertodns"</td>
              </tr>
              <tr>
                <td align="left">protocol_version</td>
                <td align="left">string</td>
                <td align="left">YES</td>
                <td align="left">Semantic version (e.g., "1.3.0")</td>
              </tr>
              <tr>
                <td align="left">provider</td>
                <td align="left">object</td>
                <td align="left">YES</td>
                <td align="left">Provider information</td>
              </tr>
              <tr>
                <td align="left">capabilities</td>
                <td align="left">object</td>
                <td align="left">YES</td>
                <td align="left">Supported features</td>
              </tr>
              <tr>
                <td align="left">authentication</td>
                <td align="left">object</td>
                <td align="left">YES</td>
                <td align="left">Supported auth methods</td>
              </tr>
              <tr>
                <td align="left">endpoints</td>
                <td align="left">object</td>
                <td align="left">YES</td>
                <td align="left">Available endpoint paths</td>
              </tr>
              <tr>
                <td align="left">rate_limits</td>
                <td align="left">object</td>
                <td align="left">NO</td>
                <td align="left">Rate limiting configuration</td>
              </tr>
              <tr>
                <td align="left">server_time</td>
                <td align="left">string</td>
                <td align="left">NO</td>
                <td align="left">Current server time (ISO 8601)</td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="capability-fields">
          <name>Capability Fields</name>
          <t>The capabilities object <bcp14>MUST</bcp14> include the following fields:</t>
          <table>
            <thead>
              <tr>
                <th align="left">Field</th>
                <th align="left">Type</th>
                <th align="left">Description</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">ipv4</td>
                <td align="left">boolean</td>
                <td align="left">IPv4 address updates supported</td>
              </tr>
              <tr>
                <td align="left">ipv6</td>
                <td align="left">boolean</td>
                <td align="left">IPv6 address updates supported</td>
              </tr>
              <tr>
                <td align="left">auto_ip_detection</td>
                <td align="left">boolean</td>
                <td align="left">Automatic IP detection supported</td>
              </tr>
              <tr>
                <td align="left">bulk_update</td>
                <td align="left">boolean</td>
                <td align="left">Bulk update endpoint available</td>
              </tr>
              <tr>
                <td align="left">max_bulk_size</td>
                <td align="left">integer</td>
                <td align="left">Maximum hostnames per bulk request</td>
              </tr>
            </tbody>
          </table>
          <t>The capabilities object <bcp14>MAY</bcp14> include the following <bcp14>OPTIONAL</bcp14> fields:</t>
          <table>
            <thead>
              <tr>
                <th align="left">Field</th>
                <th align="left">Type</th>
                <th align="left">Description</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">webhooks</td>
                <td align="left">boolean</td>
                <td align="left">Provider-specific webhook support available</td>
              </tr>
              <tr>
                <td align="left">txt_records</td>
                <td align="left">boolean</td>
                <td align="left">TXT record management supported</td>
              </tr>
              <tr>
                <td align="left">txt_max_records</td>
                <td align="left">integer</td>
                <td align="left">Max TXT records per hostname (5)</td>
              </tr>
            </tbody>
          </table>
          <t>When <tt>webhooks</tt> is true, the provider offers webhook notifications
for DNS update events such as IP address changes. The webhook API
is implementation-specific and not standardized by this protocol
version. Providers offering webhooks <bcp14>SHOULD</bcp14> document their webhook
API separately.</t>
          <t>When <tt>txt_records</tt> is true, the provider supports TXT record
management via the /txt endpoint. This capability enables ACME
DNS-01 challenges <xref target="RFC8555"/> for automated certificate issuance.</t>
          <t>The capabilities object <bcp14>MAY</bcp14> include additional fields for future
extensions. Unknown capability fields <bcp14>SHOULD</bcp14> be ignored by clients.</t>
        </section>
        <section anchor="example-response">
          <name>Example Response</name>
          <sourcecode type="json"><![CDATA[
{
  "success": true,
  "data": {
    "protocol": "apertodns",
    "protocol_version": "1.4.0",
    "provider": {
      "name": "Example DDNS",
      "website": "https://example.com",
      "documentation": "https://example.com/docs",
      "support_email": "support@example.com",
      "privacy_policy": "https://example.com/privacy",
      "terms_of_service": "https://example.com/terms"
    },
    "capabilities": {
      "ipv4": true,
      "ipv6": true,
      "auto_ip_detection": true,
      "bulk_update": true,
      "webhooks": true,
      "txt_records": true,
      "max_bulk_size": 100,
      "txt_max_records": 5
    },
    "authentication": {
      "methods": ["bearer_token", "api_key_header"],
      "token_format": "{provider}_{environment}_{random}",
      "scopes_supported": [
        "dns:update", "domains:read",
        "txt:read", "txt:write", "txt:delete"
      ]
    },
    "endpoints": {
      "info": "/.well-known/apertodns/v1/info",
      "health": "/.well-known/apertodns/v1/health",
      "update": "/.well-known/apertodns/v1/update",
      "bulk_update": "/.well-known/apertodns/v1/bulk-update",
      "status": "/.well-known/apertodns/v1/status/{hostname}",
      "domains": "/.well-known/apertodns/v1/domains",
      "txt": "/.well-known/apertodns/v1/txt"
    },
    "rate_limits": {
      "update": {"requests": 60, "window_seconds": 60},
      "bulk_update": {"requests": 10, "window_seconds": 60}
    },
    "server_time": "2026-01-15T12:00:00.000Z"
  }
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="health-endpoint-health">
        <name>Health Endpoint (/health)</name>
        <artwork><![CDATA[
GET /.well-known/apertodns/v1/health
]]></artwork>
        <t>Returns service health status. This endpoint <bcp14>MUST NOT</bcp14> require
authentication and <bcp14>SHOULD</bcp14> be used for monitoring.</t>
        <section anchor="example-response-1">
          <name>Example Response</name>
          <sourcecode type="json"><![CDATA[
{
  "success": true,
  "data": {
    "status": "healthy",
    "timestamp": "2026-01-15T12:00:00.000Z"
  }
}
]]></sourcecode>
          <t>The <tt>status</tt> field <bcp14>MUST</bcp14> be one of: "healthy", "degraded", or
"unhealthy".</t>
        </section>
      </section>
      <section anchor="update-endpoint-update">
        <name>Update Endpoint (/update)</name>
        <artwork><![CDATA[
POST /.well-known/apertodns/v1/update
Authorization: Bearer {token}
Content-Type: application/json
]]></artwork>
        <t>Updates DNS records for a single hostname. This endpoint <bcp14>MUST</bcp14>
require authentication.</t>
        <section anchor="request-fields">
          <name>Request Fields</name>
          <table>
            <thead>
              <tr>
                <th align="left">Field</th>
                <th align="left">Type</th>
                <th align="left">Required</th>
                <th align="left">Description</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">hostname</td>
                <td align="left">string</td>
                <td align="left">YES</td>
                <td align="left">Fully qualified domain name</td>
              </tr>
              <tr>
                <td align="left">ipv4</td>
                <td align="left">string</td>
                <td align="left">NO</td>
                <td align="left">IPv4 address or "auto"</td>
              </tr>
              <tr>
                <td align="left">ipv6</td>
                <td align="left">string</td>
                <td align="left">NO</td>
                <td align="left">IPv6 address or "auto"</td>
              </tr>
              <tr>
                <td align="left">ttl</td>
                <td align="left">integer</td>
                <td align="left">NO</td>
                <td align="left">Time to live in seconds (60-86400)</td>
              </tr>
            </tbody>
          </table>
          <t>At least one of <tt>ipv4</tt> or <tt>ipv6</tt> <bcp14>SHOULD</bcp14> be provided. If neither
is provided, implementations <bcp14>SHOULD</bcp14> use auto-detection for IPv4.</t>
          <t>The special value "auto" instructs the server to detect the
client's IP address from the incoming request.</t>
        </section>
        <section anchor="auto-detection-limitations">
          <name>Auto-Detection Limitations</name>
          <t>Auto-detection is constrained by HTTP connection semantics: the
server can only detect the address family used by the client's
TCP connection. This is a fundamental characteristic of HTTP-based
protocols, not a limitation specific to this specification.</t>
          <t>The following constraints apply:</t>
          <ul spacing="normal">
            <li>
              <t>If the client connects via IPv4: only IPv4 can be auto-detected</t>
            </li>
            <li>
              <t>If the client connects via IPv6: only IPv6 can be auto-detected</t>
            </li>
            <li>
              <t>Cross-family detection is not possible (e.g., detecting IPv4
address when connected via IPv6)</t>
            </li>
          </ul>
          <t>When a client requests auto-detection for an address family that
does not match the connection's address family, the server <bcp14>MUST</bcp14>
return an error with the appropriate error code (<tt>ipv4_auto_failed</tt>
or <tt>ipv6_auto_failed</tt>).</t>
          <t>Clients requiring dual-stack updates (both IPv4 and IPv6) <bcp14>SHOULD</bcp14>
use one of the following approaches:</t>
          <ol spacing="normal" type="1"><li>
              <t>Provide explicit IP addresses for both fields</t>
            </li>
            <li>
              <t>Make separate update requests over each address family</t>
            </li>
            <li>
              <t>Use auto-detection for the matching address family and provide
an explicit address for the other</t>
            </li>
          </ol>
        </section>
        <section anchor="example-request">
          <name>Example Request</name>
          <sourcecode type="json"><![CDATA[
{
  "hostname": "home.example.com",
  "ipv4": "auto",
  "ttl": 300
}
]]></sourcecode>
        </section>
        <section anchor="example-response-2">
          <name>Example Response</name>
          <sourcecode type="json"><![CDATA[
{
  "success": true,
  "data": {
    "hostname": "home.example.com",
    "ipv4": "203.0.113.50",
    "previous_ipv4": "203.0.113.49",
    "ttl": 300,
    "changed": true,
    "updated_at": "2026-01-15T12:00:00.000Z"
  }
}
]]></sourcecode>
          <t>The <tt>changed</tt> field indicates whether the IP address was actually
modified (false if the new IP matches the existing record).</t>
        </section>
        <section anchor="backward-compatibility">
          <name>Backward Compatibility</name>
          <t>For backward compatibility during the transition from legacy field
names, servers <bcp14>MAY</bcp14> also include the following deprecated fields in
the response:</t>
          <ul spacing="normal">
            <li>
              <t><tt>ipv4_previous</tt>: Alias for <tt>previous_ipv4</tt> (deprecated)</t>
            </li>
            <li>
              <t><tt>ipv6_previous</tt>: Alias for <tt>previous_ipv6</tt> (deprecated)</t>
            </li>
          </ul>
          <t>Clients <bcp14>SHOULD</bcp14> use <tt>previous_ipv4</tt> and <tt>previous_ipv6</tt>. The deprecated
field names will be removed in a future protocol version.</t>
        </section>
        <section anchor="auto-detection-failure-response">
          <name>Auto-Detection Failure Response</name>
          <t>When auto-detection fails due to address family mismatch:</t>
          <sourcecode type="json"><![CDATA[
{
  "success": false,
  "error": {
    "code": "ipv4_auto_failed",
    "message": "Cannot detect IPv4: client connected via IPv6"
  }
}
]]></sourcecode>
        </section>
        <section anchor="record-deletion-via-null-values">
          <name>Record Deletion via Null Values</name>
          <t>Clients <bcp14>MAY</bcp14> delete specific DNS record types by setting the
corresponding field to <tt>null</tt> in the update request. This enables
selective removal of A or AAAA records without affecting other
record types.</t>
          <t>The following semantics apply:</t>
          <table>
            <thead>
              <tr>
                <th align="left">Field Value</th>
                <th align="left">Server Action</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>"203.0.113.1"</tt></td>
                <td align="left">Create or update the record</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>"auto"</tt></td>
                <td align="left">Auto-detect and update</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>null</tt></td>
                <td align="left">Delete the record</td>
              </tr>
              <tr>
                <td align="left">(field omitted)</td>
                <td align="left">No change to existing record</td>
              </tr>
            </tbody>
          </table>
          <t>Servers <bcp14>MUST</bcp14> distinguish between an explicit <tt>null</tt> value (delete
request) and an omitted field (no change requested).</t>
          <section anchor="example-delete-ipv6-record">
            <name>Example: Delete IPv6 Record</name>
            <t>Request to delete the AAAA record while preserving the A record:</t>
            <sourcecode type="json"><![CDATA[
{
  "hostname": "home.example.com",
  "ipv6": null
}
]]></sourcecode>
            <t>Response:</t>
            <sourcecode type="json"><![CDATA[
{
  "success": true,
  "data": {
    "hostname": "home.example.com",
    "ipv4": "203.0.113.50",
    "ipv6": null,
    "previous_ipv6": "2001:db8::1",
    "ttl": 300,
    "changed": true,
    "updated_at": "2026-01-21T12:00:00.000Z"
  }
}
]]></sourcecode>
          </section>
          <section anchor="example-delete-ipv4-record">
            <name>Example: Delete IPv4 Record</name>
            <t>Request to delete the A record:</t>
            <sourcecode type="json"><![CDATA[
{
  "hostname": "home.example.com",
  "ipv4": null
}
]]></sourcecode>
            <t>Response:</t>
            <sourcecode type="json"><![CDATA[
{
  "success": true,
  "data": {
    "hostname": "home.example.com",
    "ipv4": null,
    "ipv6": "2001:db8::1",
    "previous_ipv4": "203.0.113.50",
    "ttl": 300,
    "changed": true,
    "updated_at": "2026-01-21T12:00:00.000Z"
  }
}
]]></sourcecode>
            <t>When a record is deleted, the corresponding field in the response
<bcp14>MUST</bcp14> be <tt>null</tt>, and the <tt>previous_*</tt> field <bcp14>MUST</bcp14> contain the value
that was deleted.</t>
          </section>
        </section>
      </section>
      <section anchor="bulk-update-endpoint-bulk-update">
        <name>Bulk Update Endpoint (/bulk-update)</name>
        <artwork><![CDATA[
POST /.well-known/apertodns/v1/bulk-update
Authorization: Bearer {token}
Content-Type: application/json
]]></artwork>
        <t>Updates multiple hostnames in a single request. Providers
advertising <tt>bulk_update: true</tt> in capabilities <bcp14>MUST</bcp14> implement
this endpoint.</t>
        <section anchor="example-request-1">
          <name>Example Request</name>
          <sourcecode type="json"><![CDATA[
{
  "updates": [
    {"hostname": "home.example.com", "ipv4": "auto"},
    {"hostname": "office.example.com", "ipv4": "203.0.113.51"}
  ]
}
]]></sourcecode>
        </section>
        <section anchor="example-response-3">
          <name>Example Response</name>
          <sourcecode type="json"><![CDATA[
{
  "success": true,
  "data": {
    "summary": {
      "total": 2,
      "successful": 2,
      "failed": 0
    },
    "results": [
      {
        "hostname": "home.example.com",
        "success": true,
        "ipv4": "203.0.113.50",
        "changed": true
      },
      {
        "hostname": "office.example.com",
        "success": true,
        "ipv4": "203.0.113.51",
        "changed": true
      }
    ]
  }
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="status-endpoint-statushostname">
        <name>Status Endpoint (/status/{hostname})</name>
        <artwork><![CDATA[
GET /.well-known/apertodns/v1/status/{hostname}
Authorization: Bearer {token}
]]></artwork>
        <t>Returns current DNS record status for a hostname.</t>
        <section anchor="example-response-4">
          <name>Example Response</name>
          <sourcecode type="json"><![CDATA[
{
  "success": true,
  "data": {
    "hostname": "home.example.com",
    "ipv4": "203.0.113.50",
    "ipv6": "2001:db8::1",
    "ttl": 300,
    "updated_at": "2026-01-15T12:00:00.000Z"
  }
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="domains-endpoint-domains">
        <name>Domains Endpoint (/domains)</name>
        <artwork><![CDATA[
GET /.well-known/apertodns/v1/domains
Authorization: Bearer {token}
]]></artwork>
        <t>Returns list of hostnames available to the authenticated user,
with their current DNS record status. The response is a flat
array of hostname objects containing full details for each entry.</t>
        <section anchor="example-response-5">
          <name>Example Response</name>
          <sourcecode type="json"><![CDATA[
{
  "success": true,
  "data": [
    {
      "hostname": "home.example.com",
      "ipv4": "203.0.113.50",
      "ipv6": "2001:db8::1",
      "ttl": 300,
      "updated_at": "2026-01-15T12:00:00.000Z",
      "created_at": "2024-06-15T08:30:00.000Z"
    },
    {
      "hostname": "office.example.com",
      "ipv4": "203.0.113.51",
      "ipv6": "2001:db8::2",
      "ttl": 300,
      "updated_at": "2026-01-15T12:00:00.000Z",
      "created_at": "2024-06-15T08:35:00.000Z"
    }
  ]
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="txt-record-endpoint-txt">
        <name>TXT Record Endpoint (/txt)</name>
        <t>The TXT record endpoint enables management of DNS TXT records,
primarily for ACME DNS-01 challenges <xref target="RFC8555"/> used in automated
certificate issuance. Providers advertising <tt>txt_records: true</tt>
in capabilities <bcp14>MUST</bcp14> implement this endpoint.</t>
        <section anchor="design-rationale">
          <name>Design Rationale</name>
          <t>TXT record management is designed to support wildcard certificate
issuance, which requires multiple simultaneous TXT records during
the ACME validation process. The protocol supports:</t>
          <ul spacing="normal">
            <li>
              <t><strong>Accumulation</strong>: Multiple TXT values can coexist for the same
hostname prefix (e.g., <tt>_acme-challenge.example.com</tt>)</t>
            </li>
            <li>
              <t><strong>Selective deletion</strong>: Individual TXT values can be removed
without affecting others</t>
            </li>
            <li>
              <t><strong>Automatic cleanup</strong>: Providers <bcp14>MAY</bcp14> implement TTL-based
expiration for TXT records</t>
            </li>
          </ul>
        </section>
        <section anchor="set-txt-record-post">
          <name>Set TXT Record (POST)</name>
          <artwork><![CDATA[
POST /.well-known/apertodns/v1/txt
Authorization: Bearer {token}
Content-Type: application/json
]]></artwork>
          <t>Creates or adds a TXT record value for the specified hostname.
Multiple calls with different values <bcp14>MUST</bcp14> accumulate (not replace)
TXT records for the same hostname, up to the provider's limit.</t>
          <section anchor="request-fields-1">
            <name>Request Fields</name>
            <table>
              <thead>
                <tr>
                  <th align="left">Field</th>
                  <th align="left">Type</th>
                  <th align="left">Required</th>
                  <th align="left">Description</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left">hostname</td>
                  <td align="left">string</td>
                  <td align="left">YES</td>
                  <td align="left">FQDN for the TXT record</td>
                </tr>
                <tr>
                  <td align="left">value</td>
                  <td align="left">string</td>
                  <td align="left">YES</td>
                  <td align="left">TXT record value (max 255 chars)</td>
                </tr>
                <tr>
                  <td align="left">ttl</td>
                  <td align="left">integer</td>
                  <td align="left">NO</td>
                  <td align="left">Time to live in seconds (default: 60)</td>
                </tr>
              </tbody>
            </table>
          </section>
          <section anchor="example-request-2">
            <name>Example Request</name>
            <sourcecode type="json"><![CDATA[
{
  "hostname": "_acme-challenge.home.example.com",
  "value": "gfj9Xq...Rg85nM",
  "ttl": 60
}
]]></sourcecode>
          </section>
          <section anchor="example-response-6">
            <name>Example Response</name>
            <sourcecode type="json"><![CDATA[
{
  "success": true,
  "data": {
    "hostname": "_acme-challenge.home.example.com",
    "value": "gfj9Xq...Rg85nM",
    "ttl": 60,
    "record_count": 1,
    "timestamp": "2026-01-15T12:00:00.000Z"
  }
}
]]></sourcecode>
            <t>The <tt>record_count</tt> field indicates the total number of TXT values
currently stored for this hostname after the operation.</t>
          </section>
        </section>
        <section anchor="delete-txt-record-delete">
          <name>Delete TXT Record (DELETE)</name>
          <artwork><![CDATA[
DELETE /.well-known/apertodns/v1/txt
Authorization: Bearer {token}
Content-Type: application/json
]]></artwork>
          <t>Removes a specific TXT record value. If <tt>value</tt> is omitted, ALL
TXT records for the hostname are removed.</t>
          <section anchor="request-fields-2">
            <name>Request Fields</name>
            <table>
              <thead>
                <tr>
                  <th align="left">Field</th>
                  <th align="left">Type</th>
                  <th align="left">Required</th>
                  <th align="left">Description</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left">hostname</td>
                  <td align="left">string</td>
                  <td align="left">YES</td>
                  <td align="left">FQDN of the TXT record</td>
                </tr>
                <tr>
                  <td align="left">value</td>
                  <td align="left">string</td>
                  <td align="left">NO</td>
                  <td align="left">Specific value to delete (omit to delete all)</td>
                </tr>
              </tbody>
            </table>
          </section>
          <section anchor="example-request-selective-deletion">
            <name>Example Request (selective deletion)</name>
            <sourcecode type="json"><![CDATA[
{
  "hostname": "_acme-challenge.home.example.com",
  "value": "gfj9Xq...Rg85nM"
}
]]></sourcecode>
          </section>
          <section anchor="example-response-7">
            <name>Example Response</name>
            <sourcecode type="json"><![CDATA[
{
  "success": true,
  "data": {
    "hostname": "_acme-challenge.home.example.com",
    "deleted": true,
    "values_removed": 1,
    "remaining_count": 1,
    "timestamp": "2026-01-15T12:00:00.000Z"
  }
}
]]></sourcecode>
          </section>
        </section>
        <section anchor="get-txt-records-get">
          <name>Get TXT Records (GET)</name>
          <artwork><![CDATA[
GET /.well-known/apertodns/v1/txt/{hostname}
Authorization: Bearer {token}
]]></artwork>
          <t>Returns all TXT record values for a hostname.</t>
          <section anchor="example-response-8">
            <name>Example Response</name>
            <sourcecode type="json"><![CDATA[
{
  "success": true,
  "data": {
    "hostname": "_acme-challenge.home.example.com",
    "values": [
      "gfj9Xq...Rg85nM",
      "hK7pLm...Yt42xQ"
    ],
    "ttl": 60,
    "record_count": 2
  }
}
]]></sourcecode>
          </section>
        </section>
      </section>
    </section>
    <section anchor="error-handling">
      <name>Error Handling</name>
      <section anchor="http-status-codes">
        <name>HTTP Status Codes</name>
        <t>Implementations <bcp14>MUST</bcp14> use appropriate HTTP status codes as defined
in <xref target="RFC9110"/>:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Status</th>
              <th align="left">Usage</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">200</td>
              <td align="left">Successful request</td>
            </tr>
            <tr>
              <td align="left">400</td>
              <td align="left">Invalid request (bad hostname, invalid IP)</td>
            </tr>
            <tr>
              <td align="left">401</td>
              <td align="left">Missing or invalid authentication</td>
            </tr>
            <tr>
              <td align="left">403</td>
              <td align="left">Not authorized for requested resource</td>
            </tr>
            <tr>
              <td align="left">404</td>
              <td align="left">Resource not found</td>
            </tr>
            <tr>
              <td align="left">429</td>
              <td align="left">Rate limit exceeded</td>
            </tr>
            <tr>
              <td align="left">500</td>
              <td align="left">Server error</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="error-response-format">
        <name>Error Response Format</name>
        <sourcecode type="json"><![CDATA[
{
  "success": false,
  "error": {
    "code": "error_code",
    "message": "Human-readable description"
  }
}
]]></sourcecode>
      </section>
      <section anchor="standard-error-codes">
        <name>Standard Error Codes</name>
        <table>
          <thead>
            <tr>
              <th align="left">Code</th>
              <th align="left">HTTP Status</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">unauthorized</td>
              <td align="left">401</td>
              <td align="left">Missing authentication</td>
            </tr>
            <tr>
              <td align="left">invalid_token</td>
              <td align="left">401</td>
              <td align="left">Invalid or expired token</td>
            </tr>
            <tr>
              <td align="left">forbidden</td>
              <td align="left">403</td>
              <td align="left">Not authorized for resource</td>
            </tr>
            <tr>
              <td align="left">not_found</td>
              <td align="left">404</td>
              <td align="left">Hostname not found</td>
            </tr>
            <tr>
              <td align="left">rate_limited</td>
              <td align="left">429</td>
              <td align="left">Too many requests</td>
            </tr>
            <tr>
              <td align="left">invalid_hostname</td>
              <td align="left">400</td>
              <td align="left">Invalid hostname format</td>
            </tr>
            <tr>
              <td align="left">invalid_ip</td>
              <td align="left">400</td>
              <td align="left">Invalid IP address format</td>
            </tr>
            <tr>
              <td align="left">hostname_not_owned</td>
              <td align="left">403</td>
              <td align="left">User does not own hostname</td>
            </tr>
            <tr>
              <td align="left">ipv4_auto_failed</td>
              <td align="left">400</td>
              <td align="left">Cannot detect IPv4 from IPv6 connection</td>
            </tr>
            <tr>
              <td align="left">ipv6_auto_failed</td>
              <td align="left">400</td>
              <td align="left">Cannot detect IPv6 from IPv4 connection</td>
            </tr>
            <tr>
              <td align="left">validation_error</td>
              <td align="left">400</td>
              <td align="left">Request validation failed</td>
            </tr>
            <tr>
              <td align="left">invalid_ttl</td>
              <td align="left">400</td>
              <td align="left">TTL value out of acceptable range</td>
            </tr>
            <tr>
              <td align="left">txt_not_supported</td>
              <td align="left">400</td>
              <td align="left">Provider does not support TXT records</td>
            </tr>
            <tr>
              <td align="left">txt_limit_exceeded</td>
              <td align="left">400</td>
              <td align="left">Maximum TXT records per hostname exceeded</td>
            </tr>
            <tr>
              <td align="left">txt_invalid_name</td>
              <td align="left">400</td>
              <td align="left">TXT hostname must use allowed prefix</td>
            </tr>
            <tr>
              <td align="left">txt_value_too_long</td>
              <td align="left">400</td>
              <td align="left">TXT value exceeds 255 characters</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="rate-limiting-headers">
        <name>Rate Limiting Headers</name>
        <t>When rate limiting is applied, responses <bcp14>SHOULD</bcp14> include:</t>
        <ul spacing="normal">
          <li>
            <t><tt>Retry-After</tt>: Seconds until rate limit resets</t>
          </li>
          <li>
            <t><tt>X-RateLimit-Limit</tt>: Maximum requests per window</t>
          </li>
          <li>
            <t><tt>X-RateLimit-Remaining</tt>: Remaining requests in window</t>
          </li>
          <li>
            <t><tt>X-RateLimit-Reset</tt>: Unix timestamp when window resets</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="legacy-compatibility">
      <name>Legacy Compatibility</name>
      <t>For backward compatibility with existing DDNS clients,
providers <bcp14>MAY</bcp14> implement:</t>
      <artwork><![CDATA[
GET /nic/update?hostname={hostname}&myip={ip}
Authorization: Basic {credentials}
]]></artwork>
      <section anchor="legacy-response-codes">
        <name>Legacy Response Codes</name>
        <t>Responses <bcp14>MUST</bcp14> be plain text (not JSON):</t>
        <table>
          <thead>
            <tr>
              <th align="left">Response</th>
              <th align="left">Meaning</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">good {ip}</td>
              <td align="left">Update successful</td>
            </tr>
            <tr>
              <td align="left">nochg {ip}</td>
              <td align="left">No change needed</td>
            </tr>
            <tr>
              <td align="left">badauth</td>
              <td align="left">Authentication failed</td>
            </tr>
            <tr>
              <td align="left">notfqdn</td>
              <td align="left">Invalid hostname</td>
            </tr>
            <tr>
              <td align="left">nohost</td>
              <td align="left">Hostname not found</td>
            </tr>
            <tr>
              <td align="left">abuse</td>
              <td align="left">Account blocked</td>
            </tr>
          </tbody>
        </table>
        <t>This endpoint is provided for compatibility only. New
implementations <bcp14>SHOULD</bcp14> use the modern JSON endpoints.</t>
      </section>
    </section>
    <section anchor="comparison-with-rfc-2136">
      <name>Comparison with RFC 2136</name>
      <t>RFC 2136 <xref target="RFC2136"/> defines DNS UPDATE, a protocol for dynamic
updates to DNS zones. The ApertoDNS Protocol differs in several
key aspects:</t>
      <table>
        <thead>
          <tr>
            <th align="left">Aspect</th>
            <th align="left">RFC 2136</th>
            <th align="left">ApertoDNS Protocol</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Transport</td>
            <td align="left">DNS (UDP/TCP)</td>
            <td align="left">HTTPS</td>
          </tr>
          <tr>
            <td align="left">Format</td>
            <td align="left">DNS wire format</td>
            <td align="left">JSON</td>
          </tr>
          <tr>
            <td align="left">Auth</td>
            <td align="left">TSIG/SIG(0)</td>
            <td align="left">Bearer tokens</td>
          </tr>
          <tr>
            <td align="left">Discovery</td>
            <td align="left">None</td>
            <td align="left">/info endpoint</td>
          </tr>
          <tr>
            <td align="left">IPv6</td>
            <td align="left">Supported</td>
            <td align="left">Native support</td>
          </tr>
          <tr>
            <td align="left">Bulk ops</td>
            <td align="left">Per-message</td>
            <td align="left">Dedicated endpoint</td>
          </tr>
        </tbody>
      </table>
      <t>The ApertoDNS Protocol is designed for consumer DDNS services
where simplicity and HTTP integration are priorities, while
RFC 2136 is suited for direct DNS zone manipulation.</t>
    </section>
    <section anchor="concurrency-model">
      <name>Concurrency Model</name>
      <t>This section describes the behavior when multiple clients attempt
to update the same hostname concurrently.</t>
      <section anchor="last-write-wins-semantics">
        <name>Last-Write-Wins Semantics</name>
        <t>The protocol uses a last-write-wins model for concurrent updates.
When multiple clients update the same hostname:</t>
        <ul spacing="normal">
          <li>
            <t>The most recent update takes precedence</t>
          </li>
          <li>
            <t>No conflict detection or resolution is performed</t>
          </li>
          <li>
            <t>The <tt>previous_*</tt> fields reflect the value immediately before
the current update, regardless of which client set it</t>
          </li>
        </ul>
      </section>
      <section anchor="implications-for-clients">
        <name>Implications for Clients</name>
        <t>Clients operating in environments where multiple devices may update
the same hostname <bcp14>SHOULD</bcp14> be aware of the following:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Update intervals</strong>: Clients <bcp14>SHOULD</bcp14> implement appropriate
update intervals to minimize conflicts</t>
          </li>
          <li>
            <t><strong>Change detection</strong>: Clients <bcp14>MAY</bcp14> compare <tt>previous_*</tt> values
with expected values to detect concurrent modifications</t>
          </li>
          <li>
            <t><strong>Idempotent updates</strong>: When the new IP matches the existing
record, <tt>changed</tt> will be <tt>false</tt> regardless of which client
originally set the value</t>
          </li>
        </ol>
      </section>
      <section anchor="example-scenario">
        <name>Example Scenario</name>
        <t>Consider two clients (A and B) updating the same hostname:</t>
        <ol spacing="normal" type="1"><li>
            <t>Initial state: <tt>ipv4 = "203.0.113.10"</tt></t>
          </li>
          <li>
            <t>Client A sends update with <tt>ipv4 = "203.0.113.20"</tt> (succeeds,
<tt>previous_ipv4 = "203.0.113.10"</tt>)</t>
          </li>
          <li>
            <t>Client B sends update with <tt>ipv4 = "203.0.113.30"</tt> (succeeds,
<tt>previous_ipv4 = "203.0.113.20"</tt>)</t>
          </li>
          <li>
            <t>Final state: <tt>ipv4 = "203.0.113.30"</tt></t>
          </li>
        </ol>
        <t>Client A's update was overwritten by Client B. Neither client
receives an error, as this is expected behavior under last-write-wins
semantics.</t>
      </section>
      <section anchor="recommendations-for-conflict-sensitive-applications">
        <name>Recommendations for Conflict-Sensitive Applications</name>
        <t>Applications requiring stronger consistency guarantees <bcp14>SHOULD</bcp14>:</t>
        <ul spacing="normal">
          <li>
            <t>Use separate hostnames for each client/device</t>
          </li>
          <li>
            <t>Implement application-level coordination outside this protocol</t>
          </li>
          <li>
            <t>Consider using RFC 2136 <xref target="RFC2136"/> which supports prerequisite
conditions for updates</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="transport-security">
        <name>Transport Security</name>
        <t>All endpoints <bcp14>MUST</bcp14> be served over HTTPS using TLS 1.2 or higher.
Implementations <bcp14>MUST NOT</bcp14> support plaintext HTTP for any protocol
endpoint.</t>
        <t>Implementations <bcp14>SHOULD</bcp14> support TLS 1.3 and <bcp14>SHOULD</bcp14> disable older
cipher suites known to be weak.</t>
      </section>
      <section anchor="token-security">
        <name>Token Security</name>
        <ul spacing="normal">
          <li>
            <t>Tokens <bcp14>MUST</bcp14> be generated using cryptographically secure random
number generators (CSPRNG)</t>
          </li>
          <li>
            <t>Tokens <bcp14>SHOULD</bcp14> have configurable expiration</t>
          </li>
          <li>
            <t>Providers <bcp14>SHOULD</bcp14> support token revocation</t>
          </li>
          <li>
            <t>Tokens <bcp14>MUST NOT</bcp14> be logged in server access logs</t>
          </li>
          <li>
            <t>Tokens <bcp14>MUST NOT</bcp14> appear in URLs or error messages</t>
          </li>
        </ul>
      </section>
      <section anchor="hostname-validation">
        <name>Hostname Validation</name>
        <t>Before processing any update request, implementations <bcp14>MUST</bcp14> verify
that the authenticated user owns or has permission to modify the
requested hostname. Failure to validate ownership could allow
unauthorized DNS modifications.</t>
      </section>
      <section anchor="rate-limiting">
        <name>Rate Limiting</name>
        <t>Providers <bcp14>SHOULD</bcp14> implement rate limiting to prevent:</t>
        <ul spacing="normal">
          <li>
            <t>Brute-force token guessing</t>
          </li>
          <li>
            <t>Denial of service attacks</t>
          </li>
          <li>
            <t>Excessive DNS propagation load</t>
          </li>
        </ul>
        <t>Rate limits <bcp14>SHOULD</bcp14> be advertised in the discovery endpoint and
communicated via response headers.</t>
      </section>
      <section anchor="ip-address-validation">
        <name>IP Address Validation</name>
        <t>Implementations <bcp14>MUST</bcp14> reject IP addresses that are not globally
routable. This prevents DNS rebinding attacks and ensures that
dynamic DNS records point to legitimate public addresses.</t>
        <section anchor="rejected-ipv4-addresses">
          <name>Rejected IPv4 Addresses</name>
          <t>The following IPv4 address ranges <bcp14>MUST</bcp14> be rejected per <xref target="RFC6890"/>:</t>
          <table>
            <thead>
              <tr>
                <th align="left">Address Block</th>
                <th align="left">Attribute</th>
                <th align="left">Reference</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">0.0.0.0/8</td>
                <td align="left">"This network"</td>
                <td align="left">
                  <xref target="RFC791"/></td>
              </tr>
              <tr>
                <td align="left">10.0.0.0/8</td>
                <td align="left">Private-Use</td>
                <td align="left">
                  <xref target="RFC1918"/></td>
              </tr>
              <tr>
                <td align="left">100.64.0.0/10</td>
                <td align="left">Shared Address Space (CGNAT)</td>
                <td align="left">
                  <xref target="RFC6598"/></td>
              </tr>
              <tr>
                <td align="left">127.0.0.0/8</td>
                <td align="left">Loopback</td>
                <td align="left">
                  <xref target="RFC1122"/></td>
              </tr>
              <tr>
                <td align="left">169.254.0.0/16</td>
                <td align="left">Link-Local</td>
                <td align="left">
                  <xref target="RFC3927"/></td>
              </tr>
              <tr>
                <td align="left">172.16.0.0/12</td>
                <td align="left">Private-Use</td>
                <td align="left">
                  <xref target="RFC1918"/></td>
              </tr>
              <tr>
                <td align="left">192.0.0.0/24</td>
                <td align="left">IETF Protocol Assignments</td>
                <td align="left">
                  <xref target="RFC6890"/></td>
              </tr>
              <tr>
                <td align="left">192.0.2.0/24</td>
                <td align="left">Documentation (TEST-NET-1)</td>
                <td align="left">
                  <xref target="RFC5737"/></td>
              </tr>
              <tr>
                <td align="left">192.168.0.0/16</td>
                <td align="left">Private-Use</td>
                <td align="left">
                  <xref target="RFC1918"/></td>
              </tr>
              <tr>
                <td align="left">198.18.0.0/15</td>
                <td align="left">Benchmarking</td>
                <td align="left">
                  <xref target="RFC2544"/></td>
              </tr>
              <tr>
                <td align="left">198.51.100.0/24</td>
                <td align="left">Documentation (TEST-NET-2)</td>
                <td align="left">
                  <xref target="RFC5737"/></td>
              </tr>
              <tr>
                <td align="left">203.0.113.0/24</td>
                <td align="left">Documentation (TEST-NET-3)</td>
                <td align="left">
                  <xref target="RFC5737"/></td>
              </tr>
              <tr>
                <td align="left">224.0.0.0/4</td>
                <td align="left">Multicast</td>
                <td align="left">
                  <xref target="RFC5771"/></td>
              </tr>
              <tr>
                <td align="left">240.0.0.0/4</td>
                <td align="left">Reserved</td>
                <td align="left">
                  <xref target="RFC1112"/></td>
              </tr>
              <tr>
                <td align="left">255.255.255.255/32</td>
                <td align="left">Limited Broadcast</td>
                <td align="left">
                  <xref target="RFC919"/></td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="rejected-ipv6-addresses">
          <name>Rejected IPv6 Addresses</name>
          <t>The following IPv6 address ranges <bcp14>MUST</bcp14> be rejected per <xref target="RFC6890"/>:</t>
          <table>
            <thead>
              <tr>
                <th align="left">Address Block</th>
                <th align="left">Attribute</th>
                <th align="left">Reference</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">::/128</td>
                <td align="left">Unspecified</td>
                <td align="left">
                  <xref target="RFC4291"/></td>
              </tr>
              <tr>
                <td align="left">::1/128</td>
                <td align="left">Loopback</td>
                <td align="left">
                  <xref target="RFC4291"/></td>
              </tr>
              <tr>
                <td align="left">::ffff:0:0/96</td>
                <td align="left">IPv4-mapped</td>
                <td align="left">
                  <xref target="RFC4291"/></td>
              </tr>
              <tr>
                <td align="left">64:ff9b::/96</td>
                <td align="left">IPv4-IPv6 Translation</td>
                <td align="left">
                  <xref target="RFC6052"/></td>
              </tr>
              <tr>
                <td align="left">100::/64</td>
                <td align="left">Discard-Only</td>
                <td align="left">
                  <xref target="RFC6666"/></td>
              </tr>
              <tr>
                <td align="left">2001:db8::/32</td>
                <td align="left">Documentation</td>
                <td align="left">
                  <xref target="RFC3849"/></td>
              </tr>
              <tr>
                <td align="left">fc00::/7</td>
                <td align="left">Unique Local (ULA)</td>
                <td align="left">
                  <xref target="RFC4193"/></td>
              </tr>
              <tr>
                <td align="left">fe80::/10</td>
                <td align="left">Link-Local</td>
                <td align="left">
                  <xref target="RFC4291"/></td>
              </tr>
              <tr>
                <td align="left">ff00::/8</td>
                <td align="left">Multicast</td>
                <td align="left">
                  <xref target="RFC4291"/></td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="implementation-notes">
          <name>Implementation Notes</name>
          <t>Implementations <bcp14>SHOULD</bcp14> return the <tt>invalid_ip</tt> error code when
rejecting addresses from these ranges. Implementations <bcp14>MAY</bcp14> log
rejected addresses for security monitoring purposes.</t>
          <t>Note: The documentation ranges (192.0.2.0/24, 198.51.100.0/24,
203.0.113.0/24 for IPv4 and 2001:db8::/32 for IPv6) are used in
examples throughout this specification but <bcp14>MUST</bcp14> be rejected in
production deployments.</t>
          <t>Implementations <bcp14>MAY</bcp14> provide configuration options to allow specific
private ranges for internal deployments, but such configurations
<bcp14>MUST</bcp14> be explicitly enabled and <bcp14>SHOULD</bcp14> generate warnings.</t>
        </section>
      </section>
      <section anchor="input-validation">
        <name>Input Validation</name>
        <t>All user input <bcp14>MUST</bcp14> be validated:</t>
        <ul spacing="normal">
          <li>
            <t>Hostnames <bcp14>MUST</bcp14> conform to DNS naming rules</t>
          </li>
          <li>
            <t>IP addresses <bcp14>MUST</bcp14> be valid IPv4 or IPv6 format</t>
          </li>
          <li>
            <t>TTL values <bcp14>MUST</bcp14> be within acceptable ranges</t>
          </li>
          <li>
            <t>TXT values <bcp14>MUST NOT</bcp14> exceed 255 characters</t>
          </li>
        </ul>
      </section>
      <section anchor="txt-record-abuse-prevention">
        <name>TXT Record Abuse Prevention</name>
        <t>TXT records can potentially be abused for:</t>
        <ul spacing="normal">
          <li>
            <t><strong>DNS tunneling</strong>: Encoding data in TXT records for covert
communication</t>
          </li>
          <li>
            <t><strong>Data exfiltration</strong>: Using DNS queries to leak sensitive data</t>
          </li>
          <li>
            <t><strong>Resource exhaustion</strong>: Creating excessive TXT records</t>
          </li>
        </ul>
        <t>Implementations <bcp14>MUST</bcp14> implement safeguards:</t>
        <ul spacing="normal">
          <li>
            <t>Limit TXT value length to 255 characters (DNS standard)</t>
          </li>
          <li>
            <t>Limit number of TXT records per hostname (default: 5)</t>
          </li>
          <li>
            <t>Restrict TXT hostnames to approved prefixes (e.g., <tt>_acme-challenge.</tt>)</t>
          </li>
          <li>
            <t>Implement rate limiting on TXT operations</t>
          </li>
          <li>
            <t>Consider automatic expiration of TXT records (recommended: 24 hours)</t>
          </li>
        </ul>
      </section>
      <section anchor="internationalized-domain-names">
        <name>Internationalized Domain Names</name>
        <t>When handling Internationalized Domain Names (IDNs), the following
requirements apply as specified in <xref target="RFC5891"/>:</t>
        <ul spacing="normal">
          <li>
            <t>Clients <bcp14>SHOULD</bcp14> convert IDN hostnames to their A-label (ASCII
Compatible Encoding) form before sending requests</t>
          </li>
          <li>
            <t>Servers <bcp14>MUST</bcp14> accept hostnames in A-label form</t>
          </li>
          <li>
            <t>Servers <bcp14>MAY</bcp14> accept hostnames in U-label (Unicode) form and
convert them to A-labels internally</t>
          </li>
          <li>
            <t>Servers <bcp14>MUST</bcp14> store and return hostnames in a consistent form</t>
          </li>
        </ul>
        <t>For example, a client wishing to update an internationalized hostname
<bcp14>SHOULD</bcp14> send the request with the A-label form
(e.g., "xn--r8jz45g.example.com" for a Japanese hostname).</t>
        <t>Implementations that accept U-label input <bcp14>MUST</bcp14> perform IDNA2008
validation as specified in <xref target="RFC5891"/> before processing the request.</t>
      </section>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <t>This section addresses privacy considerations as recommended by
<xref target="RFC6973"/>.</t>
      <section anchor="data-minimization">
        <name>Data Minimization</name>
        <t>Providers <bcp14>SHOULD</bcp14> minimize the collection and retention of personal
data. Specifically:</t>
        <ul spacing="normal">
          <li>
            <t>IP address history <bcp14>SHOULD</bcp14> have configurable retention periods</t>
          </li>
          <li>
            <t>Update timestamps <bcp14>MAY</bcp14> be retained for operational purposes</t>
          </li>
          <li>
            <t>Providers <bcp14>SHOULD</bcp14> document their data retention policies</t>
          </li>
        </ul>
      </section>
      <section anchor="user-control">
        <name>User Control</name>
        <t>Users <bcp14>SHOULD</bcp14> have mechanisms to:</t>
        <ul spacing="normal">
          <li>
            <t>View their stored data</t>
          </li>
          <li>
            <t>Delete their accounts and associated data</t>
          </li>
          <li>
            <t>Export their data in a portable format</t>
          </li>
        </ul>
      </section>
      <section anchor="traffic-analysis">
        <name>Traffic Analysis</name>
        <t>DDNS updates inherently reveal:</t>
        <ul spacing="normal">
          <li>
            <t>That a user's IP address has changed</t>
          </li>
          <li>
            <t>The timing of IP address changes</t>
          </li>
          <li>
            <t>The association between a hostname and IP address</t>
          </li>
        </ul>
        <t>Providers should be aware that this information could be used to
track user behavior or network changes.</t>
      </section>
      <section anchor="encryption">
        <name>Encryption</name>
        <t>All communications <bcp14>MUST</bcp14> be encrypted via HTTPS, preventing
passive observation of update requests and tokens.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="well-known-uri-registration">
        <name>Well-Known URI Registration</name>
        <t>This document requests registration of the following well-known
URI suffix:</t>
        <dl>
          <dt>URI Suffix:</dt>
          <dd>
            <t>apertodns</t>
          </dd>
          <dt>Change Controller:</dt>
          <dd>
            <t>IETF</t>
          </dd>
          <dt>Specification Document:</dt>
          <dd>
            <t>This document</t>
          </dd>
          <dt>Related Information:</dt>
          <dd>
            <t>None</t>
          </dd>
        </dl>
        <t>The well-known URI <tt>/.well-known/apertodns/</tt> is used as the base
path for all protocol endpoints.</t>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC9110">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="RFC6750">
          <front>
            <title>The OAuth 2.0 Authorization Framework: Bearer Token Usage</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="D. Hardt" initials="D." surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>This specification describes how to use bearer tokens in HTTP requests to access OAuth 2.0 protected resources. Any party in possession of a bearer token (a "bearer") can use it to get access to the associated resources (without demonstrating possession of a cryptographic key). To prevent misuse, bearer tokens need to be protected from disclosure in storage and in transport. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6750"/>
          <seriesInfo name="DOI" value="10.17487/RFC6750"/>
        </reference>
        <reference anchor="RFC8615">
          <front>
            <title>Well-Known Uniform Resource Identifiers (URIs)</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="May" year="2019"/>
            <abstract>
              <t>This memo defines a path prefix for "well-known locations", "/.well-known/", in selected Uniform Resource Identifier (URI) schemes.</t>
              <t>In doing so, it obsoletes RFC 5785 and updates the URI schemes defined in RFC 7230 to reserve that space. It also updates RFC 7595 to track URI schemes that support well-known URIs in their registry.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8615"/>
          <seriesInfo name="DOI" value="10.17487/RFC8615"/>
        </reference>
        <reference anchor="RFC8259">
          <front>
            <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
            <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
              <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="90"/>
          <seriesInfo name="RFC" value="8259"/>
          <seriesInfo name="DOI" value="10.17487/RFC8259"/>
        </reference>
        <reference anchor="RFC5891">
          <front>
            <title>Internationalized Domain Names in Applications (IDNA): Protocol</title>
            <author fullname="J. Klensin" initials="J." surname="Klensin"/>
            <date month="August" year="2010"/>
            <abstract>
              <t>This document is the revised protocol definition for Internationalized Domain Names (IDNs). The rationale for changes, the relationship to the older specification, and important terminology are provided in other documents. This document specifies the protocol mechanism, called Internationalized Domain Names in Applications (IDNA), for registering and looking up IDNs in a way that does not require changes to the DNS itself. IDNA is only meant for processing domain names, not free text. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5891"/>
          <seriesInfo name="DOI" value="10.17487/RFC5891"/>
        </reference>
        <reference anchor="RFC8555">
          <front>
            <title>Automatic Certificate Management Environment (ACME)</title>
            <author fullname="R. Barnes" initials="R." surname="Barnes"/>
            <author fullname="J. Hoffman-Andrews" initials="J." surname="Hoffman-Andrews"/>
            <author fullname="D. McCarney" initials="D." surname="McCarney"/>
            <author fullname="J. Kasten" initials="J." surname="Kasten"/>
            <date month="March" year="2019"/>
            <abstract>
              <t>Public Key Infrastructure using X.509 (PKIX) certificates are used for a number of purposes, the most significant of which is the authentication of domain names. Thus, certification authorities (CAs) in the Web PKI are trusted to verify that an applicant for a certificate legitimately represents the domain name(s) in the certificate. As of this writing, this verification is done through a collection of ad hoc mechanisms. This document describes a protocol that a CA and an applicant can use to automate the process of verification and certificate issuance. The protocol also provides facilities for other certificate management functions, such as certificate revocation.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8555"/>
          <seriesInfo name="DOI" value="10.17487/RFC8555"/>
        </reference>
        <reference anchor="RFC6890">
          <front>
            <title>Special-Purpose IP Address Registries</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="L. Vegoda" initials="L." surname="Vegoda"/>
            <author fullname="R. Bonica" initials="R." role="editor" surname="Bonica"/>
            <author fullname="B. Haberman" initials="B." surname="Haberman"/>
            <date month="April" year="2013"/>
            <abstract>
              <t>This memo reiterates the assignment of an IPv4 address block (192.0.0.0/24) to IANA. It also instructs IANA to restructure its IPv4 and IPv6 Special-Purpose Address Registries. Upon restructuring, the aforementioned registries will record all special-purpose address blocks, maintaining a common set of information regarding each address block.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="153"/>
          <seriesInfo name="RFC" value="6890"/>
          <seriesInfo name="DOI" value="10.17487/RFC6890"/>
        </reference>
        <reference anchor="RFC791">
          <front>
            <title>Internet Protocol</title>
            <author fullname="J. Postel" initials="J." surname="Postel"/>
            <date month="September" year="1981"/>
          </front>
          <seriesInfo name="STD" value="5"/>
          <seriesInfo name="RFC" value="791"/>
          <seriesInfo name="DOI" value="10.17487/RFC0791"/>
        </reference>
        <reference anchor="RFC6598">
          <front>
            <title>IANA-Reserved IPv4 Prefix for Shared Address Space</title>
            <author fullname="J. Weil" initials="J." surname="Weil"/>
            <author fullname="V. Kuarsingh" initials="V." surname="Kuarsingh"/>
            <author fullname="C. Donley" initials="C." surname="Donley"/>
            <author fullname="C. Liljenstolpe" initials="C." surname="Liljenstolpe"/>
            <author fullname="M. Azinger" initials="M." surname="Azinger"/>
            <date month="April" year="2012"/>
            <abstract>
              <t>This document requests the allocation of an IPv4 /10 address block to be used as Shared Address Space to accommodate the needs of Carrier- Grade NAT (CGN) devices. It is anticipated that Service Providers will use this Shared Address Space to number the interfaces that connect CGN devices to Customer Premises Equipment (CPE).</t>
              <t>Shared Address Space is distinct from RFC 1918 private address space because it is intended for use on Service Provider networks. However, it may be used in a manner similar to RFC 1918 private address space on routing equipment that is able to do address translation across router interfaces when the addresses are identical on two different interfaces. Details are provided in the text of this document.</t>
              <t>This document details the allocation of an additional special-use IPv4 address block and updates RFC 5735. This memo documents an Internet Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="153"/>
          <seriesInfo name="RFC" value="6598"/>
          <seriesInfo name="DOI" value="10.17487/RFC6598"/>
        </reference>
        <reference anchor="RFC1122">
          <front>
            <title>Requirements for Internet Hosts - Communication Layers</title>
            <author fullname="R. Braden" initials="R." role="editor" surname="Braden"/>
            <date month="October" year="1989"/>
            <abstract>
              <t>This RFC is an official specification for the Internet community. It incorporates by reference, amends, corrects, and supplements the primary protocol standards documents relating to hosts. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="3"/>
          <seriesInfo name="RFC" value="1122"/>
          <seriesInfo name="DOI" value="10.17487/RFC1122"/>
        </reference>
        <reference anchor="RFC3927">
          <front>
            <title>Dynamic Configuration of IPv4 Link-Local Addresses</title>
            <author fullname="S. Cheshire" initials="S." surname="Cheshire"/>
            <author fullname="B. Aboba" initials="B." surname="Aboba"/>
            <author fullname="E. Guttman" initials="E." surname="Guttman"/>
            <date month="May" year="2005"/>
            <abstract>
              <t>To participate in wide-area IP networking, a host needs to be configured with IP addresses for its interfaces, either manually by the user or automatically from a source on the network such as a Dynamic Host Configuration Protocol (DHCP) server. Unfortunately, such address configuration information may not always be available. It is therefore beneficial for a host to be able to depend on a useful subset of IP networking functions even when no address configuration is available. This document describes how a host may automatically configure an interface with an IPv4 address within the 169.254/16 prefix that is valid for communication with other devices connected to the same physical (or logical) link.</t>
              <t>IPv4 Link-Local addresses are not suitable for communication with devices not directly connected to the same physical (or logical) link, and are only used where stable, routable addresses are not available (such as on ad hoc or isolated networks). This document does not recommend that IPv4 Link-Local addresses and routable addresses be configured simultaneously on the same interface. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3927"/>
          <seriesInfo name="DOI" value="10.17487/RFC3927"/>
        </reference>
        <reference anchor="RFC5771">
          <front>
            <title>IANA Guidelines for IPv4 Multicast Address Assignments</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="L. Vegoda" initials="L." surname="Vegoda"/>
            <author fullname="D. Meyer" initials="D." surname="Meyer"/>
            <date month="March" year="2010"/>
            <abstract>
              <t>This document provides guidance for the Internet Assigned Numbers Authority (IANA) in assigning IPv4 multicast addresses. It obsoletes RFC 3171 and RFC 3138 and updates RFC 2780. This memo documents an Internet Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="51"/>
          <seriesInfo name="RFC" value="5771"/>
          <seriesInfo name="DOI" value="10.17487/RFC5771"/>
        </reference>
        <reference anchor="RFC1112">
          <front>
            <title>Host extensions for IP multicasting</title>
            <author fullname="S.E. Deering" initials="S.E." surname="Deering"/>
            <date month="August" year="1989"/>
            <abstract>
              <t>This memo specifies the extensions required of a host implementation of the Internet Protocol (IP) to support multicasting. Recommended procedure for IP multicasting in the Internet. This RFC obsoletes RFCs 998 and 1054. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="5"/>
          <seriesInfo name="RFC" value="1112"/>
          <seriesInfo name="DOI" value="10.17487/RFC1112"/>
        </reference>
        <reference anchor="RFC919">
          <front>
            <title>Broadcasting Internet Datagrams</title>
            <author fullname="J.C. Mogul" initials="J.C." surname="Mogul"/>
            <date month="October" year="1984"/>
            <abstract>
              <t>This RFC proposes simple rules for broadcasting Internet datagrams on local networks that support broadcast, for addressing broadcasts, and for how gateways should handle them. This RFC suggests a proposed protocol for the ARPA-Internet community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="5"/>
          <seriesInfo name="RFC" value="919"/>
          <seriesInfo name="DOI" value="10.17487/RFC0919"/>
        </reference>
        <reference anchor="RFC6052">
          <front>
            <title>IPv6 Addressing of IPv4/IPv6 Translators</title>
            <author fullname="C. Bao" initials="C." surname="Bao"/>
            <author fullname="C. Huitema" initials="C." surname="Huitema"/>
            <author fullname="M. Bagnulo" initials="M." surname="Bagnulo"/>
            <author fullname="M. Boucadair" initials="M." surname="Boucadair"/>
            <author fullname="X. Li" initials="X." surname="Li"/>
            <date month="October" year="2010"/>
            <abstract>
              <t>This document discusses the algorithmic translation of an IPv6 address to a corresponding IPv4 address, and vice versa, using only statically configured information. It defines a well-known prefix for use in algorithmic translations, while allowing organizations to also use network-specific prefixes when appropriate. Algorithmic translation is used in IPv4/IPv6 translators, as well as other types of proxies and gateways (e.g., for DNS) used in IPv4/IPv6 scenarios. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6052"/>
          <seriesInfo name="DOI" value="10.17487/RFC6052"/>
        </reference>
        <reference anchor="RFC4193">
          <front>
            <title>Unique Local IPv6 Unicast Addresses</title>
            <author fullname="R. Hinden" initials="R." surname="Hinden"/>
            <author fullname="B. Haberman" initials="B." surname="Haberman"/>
            <date month="October" year="2005"/>
            <abstract>
              <t>This document defines an IPv6 unicast address format that is globally unique and is intended for local communications, usually inside of a site. These addresses are not expected to be routable on the global Internet. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4193"/>
          <seriesInfo name="DOI" value="10.17487/RFC4193"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC2136">
          <front>
            <title>Dynamic Updates in the Domain Name System (DNS UPDATE)</title>
            <author fullname="P. Vixie" initials="P." role="editor" surname="Vixie"/>
            <author fullname="S. Thomson" initials="S." surname="Thomson"/>
            <author fullname="Y. Rekhter" initials="Y." surname="Rekhter"/>
            <author fullname="J. Bound" initials="J." surname="Bound"/>
            <date month="April" year="1997"/>
            <abstract>
              <t>Using this specification of the UPDATE opcode, it is possible to add or delete RRs or RRsets from a specified zone. Prerequisites are specified separately from update operations, and can specify a dependency upon either the previous existence or nonexistence of an RRset, or the existence of a single RR. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2136"/>
          <seriesInfo name="DOI" value="10.17487/RFC2136"/>
        </reference>
        <reference anchor="RFC6973">
          <front>
            <title>Privacy Considerations for Internet Protocols</title>
            <author fullname="A. Cooper" initials="A." surname="Cooper"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <author fullname="B. Aboba" initials="B." surname="Aboba"/>
            <author fullname="J. Peterson" initials="J." surname="Peterson"/>
            <author fullname="J. Morris" initials="J." surname="Morris"/>
            <author fullname="M. Hansen" initials="M." surname="Hansen"/>
            <author fullname="R. Smith" initials="R." surname="Smith"/>
            <date month="July" year="2013"/>
            <abstract>
              <t>This document offers guidance for developing privacy considerations for inclusion in protocol specifications. It aims to make designers, implementers, and users of Internet protocols aware of privacy-related design choices. It suggests that whether any individual RFC warrants a specific privacy considerations section will depend on the document's content.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6973"/>
          <seriesInfo name="DOI" value="10.17487/RFC6973"/>
        </reference>
        <reference anchor="RFC1918">
          <front>
            <title>Address Allocation for Private Internets</title>
            <author fullname="Y. Rekhter" initials="Y." surname="Rekhter"/>
            <author fullname="B. Moskowitz" initials="B." surname="Moskowitz"/>
            <author fullname="D. Karrenberg" initials="D." surname="Karrenberg"/>
            <author fullname="G. J. de Groot" initials="G. J." surname="de Groot"/>
            <author fullname="E. Lear" initials="E." surname="Lear"/>
            <date month="February" year="1996"/>
            <abstract>
              <t>This document describes address allocation for private internets. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="5"/>
          <seriesInfo name="RFC" value="1918"/>
          <seriesInfo name="DOI" value="10.17487/RFC1918"/>
        </reference>
        <reference anchor="RFC4291">
          <front>
            <title>IP Version 6 Addressing Architecture</title>
            <author fullname="R. Hinden" initials="R." surname="Hinden"/>
            <author fullname="S. Deering" initials="S." surname="Deering"/>
            <date month="February" year="2006"/>
            <abstract>
              <t>This specification defines the addressing architecture of the IP Version 6 (IPv6) protocol. The document includes the IPv6 addressing model, text representations of IPv6 addresses, definition of IPv6 unicast addresses, anycast addresses, and multicast addresses, and an IPv6 node's required addresses.</t>
              <t>This document obsoletes RFC 3513, "IP Version 6 Addressing Architecture". [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4291"/>
          <seriesInfo name="DOI" value="10.17487/RFC4291"/>
        </reference>
        <reference anchor="RFC5737">
          <front>
            <title>IPv4 Address Blocks Reserved for Documentation</title>
            <author fullname="J. Arkko" initials="J." surname="Arkko"/>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="L. Vegoda" initials="L." surname="Vegoda"/>
            <date month="January" year="2010"/>
            <abstract>
              <t>Three IPv4 unicast address blocks are reserved for use in examples in specifications and other documents. This document describes the use of these blocks. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5737"/>
          <seriesInfo name="DOI" value="10.17487/RFC5737"/>
        </reference>
        <reference anchor="RFC3849">
          <front>
            <title>IPv6 Address Prefix Reserved for Documentation</title>
            <author fullname="G. Huston" initials="G." surname="Huston"/>
            <author fullname="A. Lord" initials="A." surname="Lord"/>
            <author fullname="P. Smith" initials="P." surname="Smith"/>
            <date month="July" year="2004"/>
            <abstract>
              <t>To reduce the likelihood of conflict and confusion when relating documented examples to deployed systems, an IPv6 unicast address prefix is reserved for use in examples in RFCs, books, documentation, and the like. Since site-local and link-local unicast addresses have special meaning in IPv6, these addresses cannot be used in many example situations. The document describes the use of the IPv6 address prefix 2001:DB8::/32 as a reserved prefix for use in documentation. This memo provides information for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3849"/>
          <seriesInfo name="DOI" value="10.17487/RFC3849"/>
        </reference>
        <reference anchor="RFC2544">
          <front>
            <title>Benchmarking Methodology for Network Interconnect Devices</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <author fullname="J. McQuaid" initials="J." surname="McQuaid"/>
            <date month="March" year="1999"/>
            <abstract>
              <t>This document is a republication of RFC 1944 correcting the values for the IP addresses which were assigned to be used as the default addresses for networking test equipment. This memo provides information for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2544"/>
          <seriesInfo name="DOI" value="10.17487/RFC2544"/>
        </reference>
        <reference anchor="RFC6666">
          <front>
            <title>A Discard Prefix for IPv6</title>
            <author fullname="N. Hilliard" initials="N." surname="Hilliard"/>
            <author fullname="D. Freedman" initials="D." surname="Freedman"/>
            <date month="August" year="2012"/>
            <abstract>
              <t>Remote triggered black hole filtering describes a method of mitigating the effects of denial-of-service attacks by selectively discarding traffic based on source or destination address. Remote triggered black hole routing describes a method of selectively re- routing traffic into a sinkhole router (for further analysis) based on destination address. This document updates the "IPv6 Special Purpose Address Registry" by explaining why a unique IPv6 prefix should be formally assigned by IANA for the purpose of facilitating IPv6 remote triggered black hole filtering and routing. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6666"/>
          <seriesInfo name="DOI" value="10.17487/RFC6666"/>
        </reference>
      </references>
    </references>
    <?line 1245?>

<section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Thanks to the dynamic DNS community for decades of service
enabling home users and small businesses to maintain stable
hostnames with dynamic IP addresses.</t>
      <t>Thanks to the IETF DNSOP working group participants for their
review and feedback on this specification.</t>
    </section>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t>Note to RFC Editor: Please remove this appendix before publication.</t>
      <t>This section records the status of known implementations of the
protocol defined by this specification.</t>
      <section anchor="apertodns">
        <name>ApertoDNS</name>
        <dl>
          <dt>Organization:</dt>
          <dd>
            <t>ApertoDNS</t>
          </dd>
          <dt>Implementation:</dt>
          <dd>
            <t>Reference implementation</t>
          </dd>
          <dt>Description:</dt>
          <dd>
            <t>Full protocol support including all endpoints, bulk updates,
webhooks, and legacy compatibility</t>
          </dd>
          <dt>Level of Maturity:</dt>
          <dd>
            <t>Production</t>
          </dd>
          <dt>Coverage:</dt>
          <dd>
            <t>Complete</t>
          </dd>
          <dt>Licensing:</dt>
          <dd>
            <t>Proprietary service, open protocol</t>
          </dd>
          <dt>Contact:</dt>
          <dd>
            <t>support@apertodns.com</t>
          </dd>
          <dt>URL:</dt>
          <dd>
            <t>https://apertodns.com</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="openapi-specification">
      <name>OpenAPI Specification</name>
      <t>A complete OpenAPI 3.0.3 specification for this protocol is
available at:</t>
      <t>https://github.com/apertodns/apertodns-protocol/blob/main/openapi.yaml</t>
      <t>This specification can be used to:</t>
      <ul spacing="normal">
        <li>
          <t>Generate client libraries in various programming languages</t>
        </li>
        <li>
          <t>Create interactive API documentation</t>
        </li>
        <li>
          <t>Validate implementations for conformance</t>
        </li>
      </ul>
    </section>
    <section anchor="example-update-flow">
      <name>Example Update Flow</name>
      <t>The following illustrates a typical update flow:</t>
      <ol spacing="normal" type="1"><li>
          <t>Client discovers provider capabilities:
~~~
GET /.well-known/apertodns/v1/info
~~~</t>
        </li>
        <li>
          <t>Client authenticates and requests update:
~~~
POST /.well-known/apertodns/v1/update
Authorization: Bearer example_live_abc123
Content-Type: application/json  </t>
          <t>
{"hostname": "home.example.com", "ipv4": "auto"}
~~~</t>
        </li>
        <li>
          <t>Provider validates token and hostname ownership</t>
        </li>
        <li>
          <t>Provider updates DNS record</t>
        </li>
        <li>
          <t>Provider returns result:
~~~json
{
  "success": true,
  "data": {
    "hostname": "home.example.com",
    "ipv4": "203.0.113.50",
    "changed": true
  }
}
~~~</t>
        </li>
        <li>
          <t>DNS propagates the new record</t>
        </li>
      </ol>
    </section>
    <section anchor="changes-from-legacy-ddns-protocols">
      <name>Changes from Legacy DDNS Protocols</name>
      <t>For implementers familiar with legacy HTTP-based DDNS protocols
(commonly referred to as "dyndns2" in client implementations
such as ddclient), key differences include:</t>
      <ul spacing="normal">
        <li>
          <t>JSON responses instead of plain text</t>
        </li>
        <li>
          <t>Bearer token authentication instead of HTTP Basic</t>
        </li>
        <li>
          <t>Explicit capability negotiation via /info endpoint</t>
        </li>
        <li>
          <t>Dedicated endpoints for different operations</t>
        </li>
        <li>
          <t>Standardized error codes and response formats</t>
        </li>
        <li>
          <t>Native IPv6 support with separate fields</t>
        </li>
        <li>
          <t>Bulk update support for multiple hostnames</t>
        </li>
        <li>
          <t>Well-known URI path for consistent discovery</t>
        </li>
      </ul>
    </section>
    <section anchor="changes-from-00">
      <name>Changes from -00</name>
      <t>This section summarizes changes from
draft-ferro-dnsop-apertodns-protocol-00:</t>
      <section anchor="version-123-changes">
        <name>Version 1.2.3 Changes</name>
        <ul spacing="normal">
          <li>
            <t>Added <tt>ipv4_auto_failed</tt> and <tt>ipv6_auto_failed</tt> error codes
to Section 8.3 (Standard Error Codes)</t>
          </li>
          <li>
            <t>Added "Auto-Detection Limitations" subsection to Section 7.3
(Update Endpoint) documenting HTTP connection semantics constraints</t>
          </li>
          <li>
            <t>Added <tt>validation_error</tt> and <tt>invalid_ttl</tt> error codes</t>
          </li>
          <li>
            <t>Added example response for auto-detection failure</t>
          </li>
          <li>
            <t>Updated protocol version in examples from "1.2.0" to "1.3.0"</t>
          </li>
          <li>
            <t>Added acknowledgment of IETF DNSOP working group</t>
          </li>
        </ul>
      </section>
      <section anchor="version-130-changes-txt-records">
        <name>Version 1.3.0 Changes (TXT Records)</name>
        <ul spacing="normal">
          <li>
            <t>Added TXT record management endpoint (/txt) for ACME DNS-01 challenges</t>
          </li>
          <li>
            <t>Added <tt>txt_records</tt> and <tt>txt_max_records</tt> capability fields</t>
          </li>
          <li>
            <t>Added TXT-related error codes: <tt>txt_not_supported</tt>,
<tt>txt_limit_exceeded</tt>, <tt>txt_invalid_name</tt>, <tt>txt_value_too_long</tt></t>
          </li>
          <li>
            <t>Added "TXT Record Abuse Prevention" section to Security Considerations</t>
          </li>
          <li>
            <t>Added RFC 8555 (ACME) to normative references</t>
          </li>
          <li>
            <t>Added TXT Record and ACME DNS-01 terminology definitions</t>
          </li>
          <li>
            <t>Updated protocol version to 1.3.0</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="changes-from-01">
      <name>Changes from -01</name>
      <t>This section summarizes changes from
draft-ferro-dnsop-apertodns-protocol-01:</t>
      <section anchor="version-132-changes-response-consistency">
        <name>Version 1.3.2 Changes (Response Consistency)</name>
        <ul spacing="normal">
          <li>
            <t>Standardized timestamp field naming across all endpoints:
            </t>
            <ul spacing="normal">
              <li>
                <t>Renamed <tt>timestamp</tt> to <tt>updated_at</tt> in /update response</t>
              </li>
              <li>
                <t>Renamed <tt>last_updated</tt> to <tt>updated_at</tt> in /status response</t>
              </li>
              <li>
                <t>This provides consistent naming for timestamp fields
across the protocol</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Changed /domains response structure from grouped domains
to flat array:
            </t>
            <ul spacing="normal">
              <li>
                <t>Previous: <tt>data.domains[].hostnames[]</tt> (grouped by parent domain)</t>
              </li>
              <li>
                <t>New: <tt>data[]</tt> (flat array of hostname objects with full details)</t>
              </li>
              <li>
                <t>Each hostname object now includes: hostname, ipv4, ipv6,
ttl, updated_at, created_at</t>
              </li>
              <li>
                <t>This reduces API calls needed to retrieve hostname information</t>
              </li>
            </ul>
          </li>
          <li>
            <t>Clarified that <tt>timestamp</tt> field remains unchanged for /health
and /txt endpoints</t>
          </li>
          <li>
            <t>Clarified that <tt>server_time</tt> field remains unchanged
for /info endpoint</t>
          </li>
        </ul>
      </section>
      <section anchor="version-132-changes-enhancements">
        <name>Version 1.3.2 Changes (Enhancements)</name>
        <ul spacing="normal">
          <li>
            <t>Added "Backward Compatibility" subsection to /update endpoint
documenting deprecated field aliases (<tt>ipv4_previous</tt>,
<tt>ipv6_previous</tt>) for transition from legacy field names</t>
          </li>
          <li>
            <t>Added "Authorization Scopes" section documenting optional scope-based
authorization with defined scopes: dns:update, domains:read, txt:read,
txt:write, txt:delete</t>
          </li>
          <li>
            <t>Updated example timestamps to 2026</t>
          </li>
        </ul>
      </section>
      <section anchor="version-140-changes-record-deletion-and-concurrency">
        <name>Version 1.4.0 Changes (Record Deletion and Concurrency)</name>
        <ul spacing="normal">
          <li>
            <t>Added "Record Deletion via Null Values" subsection to /update endpoint
documenting the ability to delete A or AAAA records by setting the
corresponding field to <tt>null</tt> in the update request</t>
          </li>
          <li>
            <t>Defined tri-state semantics for ipv4/ipv6 fields:
string value (update), <tt>null</tt> (delete), omitted (no change)</t>
          </li>
          <li>
            <t>Added examples for IPv4 and IPv6 record deletion</t>
          </li>
          <li>
            <t>Added "Concurrency Model" section documenting last-write-wins
semantics for concurrent updates to the same hostname</t>
          </li>
          <li>
            <t>Added recommendations for conflict-sensitive applications</t>
          </li>
          <li>
            <t>Expanded "IP Address Validation" section with explicit lists of
rejected IPv4 (15 ranges) and IPv6 (9 ranges) address blocks
per RFC 6890</t>
          </li>
          <li>
            <t>Added RFC 6890 to normative references</t>
          </li>
          <li>
            <t>Updated protocol version to 1.4.0</t>
          </li>
        </ul>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA819e1cj17Hv//0p9sVr3YAXEkg8hmGdnFwZGJsTZoYMjB3f
LC/UkhrRHqlb6W7B4GHyWc5nuZ/s1q+q9qNbDYMT5yQ+JzaS9rPeVbt27U6n
E1VpNUsOzdpgkRRVfvzmwpwXeZWP89mhGZjX+SQpMnN8n8XzdGzw8/vFJK4S
12otikejIrltHWItmuRj6koTTIr4uupcJ0WRdyZZmS86MTenvzsLbd7Z7kdj
GnyaF/eHpqwmUbooDk1VLMuqv739kn6OiyQ+NG+pa1yleVaaOJuY13EWT5N5
klXRXV58mBb5cnHIi/UNow/JPf04OYyM6ZiJbohml8/uDxpyyTvkj+9OLi7N
4PyUPwyOXp/wHzRyZ7sXRWVFs1/FszyjDd4nZbRIMTztRT4aU+ZFVSTXpft8
Pw8/jvP5Ih5X8jGKl9VNXvAC6X/GpBk1HHTNKwCNvxFQDrIJQSH4Oi+mcZb+
whulny0a+LdkHqeEynK5WNBa/o8Depfm5gbjfJlVgPdpFc/uoyjLizmNdJtg
Ie9eHfV7vZf650Hvxa7++bLX29Y/91/s2T8P9nt79s/+nu22d/CyZ7/d27MN
9g9eUrcoza5XJtzZt21evtjRP3svewf6527fjbf3YueF/rlzsGsn7O/t2nXu
0z80S6fTMfGorAqCdhRd3qSlIcpcgmRMuUjG6XWalKa6ScwqEW+a2MyFD0AO
18tZZAnW0NodLaHP+jH9e0MpqOwSTA21vU0nNHpsymS8LJLNSL8qOvE0y8uK
+sazisZnKBD5mFkyjcf3xk5Tbpq7tLox0iBSXPLkp+e3u5v49/6mGS1nH+zU
tOhllQOuY/rVTJIqGYM8NqPLP1+aIhkTK5i54xseC/SttG3GN/FslmRTHimb
CKnHxST9JZlg6BvqlI6Z4sw8odZZWs7LLmCbuHWbZUn7vktms86HLL/LzPt3
p6VZJ7QYUMrGpvmvi7dvzCK+n+XxpIzkFyKcDZ7UjBJi94IA8iHJmpNyW5De
BgCWZPFolhAxERhz8Dx9qiGmTIrbdAwsjIu8JOyn1ySLsHOLDCweZDJPJxMa
KvrKnBJf5JMlwy2KjlfR7AedzfI77LYoBVM6NX1/b+KyTKdZMokID/GEWLcE
VGjRxJlZRf8jyhiThErLCuu5IYoAnxM1xpXHIoaKFLnmjiABak1BAHZQ4AwI
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
mwAA

-->

</rfc>
