<?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.31 (Ruby 3.2.3) -->
<?rfc compact="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ferro-dnsop-apertodns-protocol-03" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.32.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-03"/>
    <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="March" day="16"/>
    <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>Status:</dt>
          <dd>
            <t>provisional</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 1248?>

<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>
    <section anchor="changes-from-02">
      <name>Changes from -02</name>
      <t>This section summarizes changes from
draft-ferro-dnsop-apertodns-protocol-02:</t>
      <ul spacing="normal">
        <li>
          <t>Added <tt>Status: provisional</tt> to the IANA Well-Known URI registration
as required by RFC 8615 Section 3.1</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
yE63F/1/LC+W8rycAAA=

-->

</rfc>
