<?xml version="1.0" encoding="utf-8"?>
<!-- name="GENERATOR" content="github.com/mmarkdown/mmark Mmark Markdown Processor - mmark.miek.nl" -->
<rfc version="3" ipr="trust200902" docName="draft-ietf-rpp-requirements-03" submissionType="IETF" category="std" xml:lang="en" xmlns:xi="http://www.w3.org/2001/XInclude" indexInclude="true" tocDepth="4">

<front>
<title abbrev="RPP - Requirements">RESTful Provisioning Protocol (RPP) - Requirements</title><seriesInfo value="draft-ietf-rpp-requirements-03" stream="IETF" status="standard" name="Internet-Draft"></seriesInfo>
<author initials="M." surname="Wullink" fullname="Maarten Wullink"><organization>SIDN Labs</organization><address><postal><street></street>
</postal><email>maarten.wullink@sidn.nl</email>
<uri>https://sidn.nl/</uri>
</address></author><author initials="P." surname="Kowalik" fullname="Pawel Kowalik"><organization>DENIC</organization><address><postal><street></street>
</postal><email>pawel.kowalik@denic.de</email>
<uri>https://denic.de/</uri>
</address></author><date year="2025" month="December" day="5"></date>
<area>Internet</area>
<workgroup>Network Working Group</workgroup>

<abstract>
<t>This document describes the requirements for the development of the RESTful Provisioning Protocol (RPP).</t>
</abstract>

</front>

<middle>

<section anchor="introduction"><name>Introduction</name>
<t>This document describes the set of requirements for the RESTful Provisioning Protocol (RPP), an Application Programming Interface (API) for provisioning objects in a shared database. RPP is based on the HTTP <xref target="RFC9110"></xref> protocol and the architectural principles of <xref target="REST"></xref>.</t>
</section>

<section anchor="terminology"><name>Terminology</name>
<t>In this document the following terminology is used:</t>
<t>REST - Representational State Transfer (<xref target="REST"></xref>). An architectural style.</t>
<t>RESTful - A RESTful web service is a web service or API implemented using HTTP and the principles of <xref target="REST"></xref>.</t>
<t>RESTful Provisioning Protocol or RPP - The protocol which requirements are described in this document.</t>
<t>RPP Core - The collection of RFCs describing the RPP architecture, data model, HTTP based protocol elements such as URLs and headers. This also includes a description of allowed extension points.</t>
<t>URL - A Uniform Resource Locator as defined in <xref target="RFC3986"></xref>.</t>
<t>Resource - An object having a type, data, and possible relationship to other resources, identified by a URL.</t>
<t>Extension - A specification that adds functionality to RPP Core, within the extensibility framework defined herein. Extensions MAY provide additional features beyond those defined in RPP Core.</t>
<t>EPP RFCs - This is a reference to the EPP version 1.0 specifications <xref target="RFC5730"></xref>, <xref target="RFC5731"></xref>, <xref target="RFC5732"></xref> and <xref target="RFC5733"></xref>.</t>
<t>RPP Client - An HTTP user agent performing an RPP request.</t>
<t>RPP Server -  An HTTP server responsible for processing requests and returning results in any supported media type.</t>
<t>Repository Object Identifier (ROID) - A unique, persistent identifier assigned by the repository (Registry) to each object upon creation, remaining constant throughout the object's lifetime.</t>
<t>Object Transfer / Transfer Operation - is an Registry operation used to manage changes in client sponsorship of an existing object.</t>
<t>EPP AuthInfo - EPP password based Authorisation Information defined in <xref target="RFC5731"></xref> and <xref target="RFC5733"></xref>.</t>
<t>Registry - An administrative authority responsible for maintaining and operating an authoritative repository of provisioned objects within a defined namespace or domain. For the DNS Top-Level Domain (TLD) use case, &quot;Registry&quot; specifically denotes the administrative operation of a zone that allows registration of names within that zone (see also definition in  <xref target="RFC8499"></xref>).</t>
<t>Registrar - An entity that acts as an intermediary between registrants and the Registry, providing registration services and maintaining the Sponsoring Client relationship for registered objects.</t>
<t>Registrant - An individual or organization on whose behalf a domain name or other object is registered in the Registry.</t>
<t>Registry Operator - An entity performing technical operation of one or more Registries.</t>
<t>Thin Registry - A Registry model in which the Registry stores and serves only the minimal data necessary for Delegation and identification of an object (for example, domain name, registrar identifier, status, and Name Server Delegation). Registrant and contact data are maintained by the registrar and are not held by the Registry.</t>
<t>Thick Registry - A Registry model in which the Registry stores and serves the complete data set for an object, including registrant, administrative, and technical contact information, and other relevant attributes required for provisioning.</t>
<t>Sponsoring Client - The RPP Client that currently has sponsorship of the object.</t>
<t>Initiating Client - In the Transfer Operation - the client that starts the transfer request.</t>
<t>Gaining Client - In the Transfer Operation - the client seeking to gain sponsorship of the object.</t>
<t>Functional Equivalent - A feature or capability in RPP that provides the same functionality as a corresponding EPP feature, though the implementation mechanism may differ.</t>

<section anchor="dns-terms"><name>DNS Terms</name>
<t>Where DNS-specific terminology is used in this document, the definitions from <xref target="RFC8499"></xref> apply unless otherwise specified. Key DNS terms used in this specification include:</t>

<ul spacing="compact">
<li>Fully Qualified Domain Name (FQDN)</li>
<li>A-label and U-label (see also <xref target="RFC5890"></xref>)</li>
<li>Name Server</li>
<li>Zone and Delegation</li>
<li>In-bailiwick and Out-of-bailiwick</li>
<li>Top-Level Domain (TLD)</li>
<li>Subordinate Host (as used in EPP)</li>
<li>DNS Operator</li>
</ul>
</section>
</section>

<section anchor="conventions-used-in-this-document"><name>Conventions Used in This Document</name>
<t>The key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL NOT&quot;,&quot;SHOULD&quot;, &quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;, &quot;MAY&quot;, and &quot;OPTIONAL&quot; in this document are to be interpreted as described in <xref target="RFC2119"></xref>.</t>
</section>

<section anchor="general"><name>General</name>
<t><strong>R1.1</strong> A well defined architecture MUST be defined for RPP, including a description of the responsibilities of the defined protocol layers.</t>
<t><strong>R1.2</strong> <em>Removed</em></t>
<t><strong>R1.3</strong> Wherever applicable RPP SHOULD leverage existing best practices and well adopted standards for building and documenting RESTful APIs. There MUST be a clear justification when deviating from this.</t>
<t><strong>R1.4</strong> RPP MUST include support for application level status codes, and MAY reuse the EPP status codes defined in <xref target="RFC5730"></xref>.</t>
<t><strong>R1.5</strong> RPP MUST include support for providing detailed information about application status codes, for example as described in <xref target="RFC7807"></xref>.</t>
<t><strong>R1.6</strong> RPP MUST support additional information about a successful operation (information or warning) to convey additional information to the client for example about deprecation or partial success.</t>
<t><strong>R1.7</strong> RPP MUST support both Thin and Thick Registry models, and MUST allow for flexibility in how much data and what type of data is stored and returned by the server, according to the chosen Registry model. The data elements returned is based on what the client is authorized to receive.</t>
</section>

<section anchor="http"><name>HTTP</name>
<t><strong>R2.1</strong> The Hypertext Transfer Protocol (HTTP) <xref target="RFC9110"></xref> MUST be used as the transport mechanism for RPP.</t>
<t><strong>R2.2</strong> RPP SHOULD use the best common practices for designing HTTP based applications, described in <xref target="BCP56"></xref>. There MUST be a clear justification when deviating from this.</t>
<t><strong>R2.3</strong> Consistent, predictable and meaningful URL structures MUST be used for identifying, accessing object resources and enable request routing.</t>
<t><strong>R2.4</strong> RPP MUST use the existing HTTP status codes and MUST define application level status codes and map these to HTTP status codes. RPP MUST NOT redefine existing HTTP status code semantics and when overloading (generic) HTTP status codes with multiple RPP status codes, the provided RPP status code MUST be used by the client to determine the exact nature of the problem.</t>
<t><strong>R2.5</strong> RPP MUST support deployment architectures where intermediary proxies route client requests to multiple backend servers (e.g., different TLD Registries). The protocol MUST enable routing decisions based on URL patterns and HTTP headers, maintaining statelessness and allowing proxies to operate without parsing request bodies.</t>
</section>

<section anchor="rest"><name>REST</name>
<t><strong>R3.1</strong> RPP architecture MUST use the principles of the <xref target="REST"></xref> architectural style. A RPP Server MUST conform to at least level 2 of the <xref target="RICHARDSON"></xref> Maturity Model (RMM).</t>
<t><strong>R3.2</strong> RPP architecture MUST follow Resource-Oriented Architecture <xref target="ROI"></xref>.</t>
<t><strong>R3.3</strong> RPP specification MUST strive to minimise round trips between client and server. Approaches, where client would need to make multiple requests each time to discover resource URL or server capabilities in order to perform operation SHOULD be used sparingly and be always well justified.</t>
<t><strong>R3.4</strong> <em>Merged with R12.1</em></t>
<t><strong>R3.5</strong> RPP specifications SHOULD incorporate a machine-readable and well-established API specification, such as <xref target="OpenAPI"></xref> or <xref target="RAML"></xref>. This will facilitate documentation, testing, code generation, and user-friendly extension descriptions. RPP MUST NOT require what API specification technology is to be used. The RPP Core documents and Extension documents may also choose different API specification solutions, this choice is left to the document authors.</t>
<t><strong>R3.6</strong> RPP architecture MUST define a common pattern to allow a single resource to be addressable via multiple, alternative identifiers in its URL. The protocol MUST specify that one address is canonical, and any alternative addresses for the same resource MUST be treated as aliases resolving to the canonical resource.</t>
</section>

<section anchor="data_model"><name>Data Model</name>
<t><xref target="data_model"></xref> defines the requirements to data and relationships to be modeled in RPP.</t>
<t><strong>R4.1</strong> The base data model structures MUST be data format agnostic. It MUST be possible to map the base data model to multiple data formats such as JSON, XML or YAML.</t>
<t><strong>R4.2</strong> Commonly used EPP extensions SHOULD be added to the RPP Core data model. An example of this is the DNSSEC extension.</t>
<t><strong>R4.3</strong> The RPP Core specification MUST only mandate data fields that are strictly necessary for the technical provisioning and maintenance of an object. All other data fields MUST be optional at the protocol level. A server MUST be able to designate any protocol-optional field as mandatory according to its local server policy.</t>
<t><strong>R4.4</strong> RPP MUST have a mechanism for defining and signaling profiles that enable compatibility across different implementations. Profiles MUST have unambiguous identifiers (e.g., unique names or codes) and clearly describe:</t>

<ul spacing="compact">
<li>The required components of the data model that must be implemented</li>
<li>Defined functional subsets that enable compatibility across different implementations.</li>
<li>Versions used by the components, data models and extensions support by the client and the server</li>
</ul>
<t><strong>R4.5</strong> RPP architecture MUST include loose coupling between the server and the client, allowing for non-coordinated introduction of non-breaking version changes on both sides.</t>
<t><strong>R4.6</strong> RPP MUST enforce the use of strict validation, where unknown properties, query parameters, url segments and RPP specific headers are treated as an error.</t>
<t><strong>R4.7</strong> RPP MUST support linking of objects of the same or different types, with flexible cardinality (one-to-one, one-to-many, many-to-many). The links MUST also support to have attributes of their own (e.g., a link between a domain and a contact object with a different contact role).</t>
<t><strong>R4.8</strong> RPP MUST allow a client to reference a shared object (e.g., a host or contact) sponsored by a different client, while ensuring the Sponsoring Client retains full administrative control over the shared object.</t>
<t><strong>R4.9</strong> RPP MUST support the definition of first-class, read-only resources whose state is managed by the server. These resources MAY expose logically associated information as sub-resources.</t>
<t><strong>R4.10</strong> RPP data model MUST support composition by defining a pattern where a resource can contain child resources of same or different type, with flexible cardinality (one-to-one, one-to-many, many-to-many),that are integral to it. Such resources MAY be embedded directly in the parent resource representation or exposed as sub-resources within the parent's URL structure.</t>
</section>

<section anchor="data_representation"><name>Data Representation</name>
<t><xref target="data_representation"></xref> defines requirements to wire format of the data defined in <xref target="data_model"></xref>.</t>
<t><strong>R5.1</strong> RPP MUST use JSON as the default data format.</t>
<t><strong>R5.2</strong> It MUST be possible to extend RPP to include support other data formats (e.g. XML, YAML).</t>
<t><strong>R5.3</strong> Validation of request and response message MUST be supported for both clients and the servers, in order to determine if the content is valid and no required attributes are missing.</t>
<t><strong>R5.4</strong> RPP MUST define a default media type however the protocol SHALL be extensible to enable support for other media types.</t>
<t><strong>R5.5</strong> A client MUST be able to signal to the server what media type the server should expect for the request content and to use for the response content.</t>
<t><strong>R5.6</strong> <em>Removed</em>
</t>
<t><strong>R5.7</strong> RPP SHOULD consider mechanisms for supporting data formats outside of core RPP domain. Especially formats, which lose their properties if transformed, like Verifiable Credentials for contacts which are digitally signed.</t>
<t><strong>R5.8</strong> RPP MUST support partial update of data objects.</t>
<t><strong>R5.9</strong> RPP MUST support full update of data objects.</t>
<t><strong>R5.10</strong> A generated RPP response representation that includes an object identifier (for example a contact handle) MAY also include a URL reference to the location of the object representation.</t>
<t><strong>R5.11</strong> RPP MUST support representation of a collections of resources.</t>
<t><strong>R5.12</strong> The representation of the links (see R4.7) MUST be expressed using the RPP Server's internal identifiers. The RPP SHOULD also consider using URIs and/or <xref target="RFC6570"></xref> URI templates for uniform addressing of link targets, both internal and external to the RPP Server.</t>
<t><strong>R5.13</strong> RPP MUST define a structured data model for all object types that require DNS representation (e.g., Host, Domain). The data model MUST support commonly used DNS record types (such as A, AAAA, CNAME, MX, NS, DS, TXT) and their standard attributes, such as TTL. See R10.14 for extensibility requirements.</t>
<t><strong>R5.14</strong> RPP MUST include support for a client requesting different depth of data representations, depending on the use case:</t>

<ul spacing="compact">
<li>Minimal representation (ID, or ID+name)</li>
<li>Full representation (all data of the object)</li>
<li>Full representation + dereferenced referrals (for example domain with contact and host details)</li>
</ul>
<t><strong>R5.15</strong> RPP MAY return different representations of the same object in different contexts:</t>

<ul spacing="compact">
<li>GET request to the resource itself</li>
<li>GET request to get a collection of objects</li>
<li>Responses to PUT/POST/PATCH requests</li>
</ul>
<t><strong>R5.16</strong> The data representation in a RPP response MUST only contain data related to the object, transactional information MUST be represented as one or more separate HTTP headers.</t>
</section>

<section anchor="operations-and-request-handling"><name>Operations and request handling</name>
<t><strong>R6.1</strong> <em>Moved to <xref target="data_representation"></xref> as R5.14</em></t>
<t><strong>R6.2</strong> <em>Moved to <xref target="data_representation"></xref> as R5.15</em></t>
<t><strong>R6.3</strong> <em>Moved to <xref target="data_representation"></xref> as R5.16</em></t>
<t><strong>R6.4</strong> RPP SHOULD support search for resource collections and SHOULD support filtering (e.g., by name prefix, status, registrar) and pagination. This requirement MAY be relaxed when adding the described functionality results in a negative impact on performance, stability and/or security.</t>
<t><strong>R6.5</strong> RPP operations that modify repository state MUST be atomic. A single request MUST either succeed completely or fail completely, leaving the repository in its original state.</t>
<t><strong>R6.6</strong> RPP MUST provide services for the client to assure a re-tried operation changing resource state is executed only once if a request has been terminated or timed out before complete response has been received by the client (idempotency).</t>
<t><strong>R6.7</strong> The protocol specification MUST define the expected server state for a request that times or terminates out before a response is fully sent out to the client.</t>
<t><strong>R6.8</strong> For every request the server MUST generate a permanent, server-unique transaction identifier. This identifier MUST be returned to the client in the response.</t>
<t><strong>R6.9</strong> RPP MUST support informational and validation functions that are not directly tied to a persistent, provisioned object. These operations SHOULD be exposed as read-only resources that represent the result of a query or check.</t>
<t><strong>R6.10</strong> RPP MUST support a Functional Equivalent of the EPP Poll command described in EPP RFC <xref target="RFC5730"></xref>, allowing for clients discovering and retrieving service messages available on the server. The RPP equivalent MAY contain additional options or features for discovering and retrieving service messages, such as:</t>

<ul spacing="compact">
<li>Allowing clients to subscribe to specific types of service messages.</li>
<li>Allowing clients to receive multiple service messages in a single request.</li>
<li>Allowing clients to use multiple concurrent readers.</li>
<li>Support for streaming service messages to clients.</li>
</ul>
<t><strong>R6.11</strong> RPP MUST include a Functional Equivalent of <xref target="RFC9038"></xref> to allow clients retrieve service messages including information it may not understand due to missing Extension support.</t>
</section>

<section anchor="discoverability"><name>Discoverability</name>
<t><strong>R7.1</strong> RPP MAY include a bootstrap mechanism designed to allow clients to locate the network identifier for the RPP service of a Registry Operator, e.g. rpp.sidn.nl for the Registry Operator for the .nl ccTLD.</t>
<t>Solutions may include:</t>

<ul spacing="compact">
<li>IANA bootstrap Service Registry</li>
<li>DNS TXT records</li>
</ul>
<t><strong>R7.2</strong> An RPP Server MUST publish a service discovery document in the well-known directory, described in <xref target="RFC5785"></xref>. This document contains structured machine-readable information that is required or useful for the client to be able to generate valid RPP requests. The information may contain, but is not limited to:</t>

<ul spacing="compact">
<li>Available services,</li>
<li>Used Extensions</li>
<li>Versions used for services and extensions</li>
<li>Environment name (production, test etc.)</li>
<li>Server datetime</li>
<li>Maintenance notices</li>
<li>Supported profiles</li>
</ul>
<t><strong>R7.3</strong> Server provided functionality, such as the set of supported profiles, languages or extensions, MUST be discoverable using the discovery document.</t>
<t><strong>R7.4</strong> RPP MUST support versioning of:</t>

<ul spacing="compact">
<li>The protocol itself</li>
<li>Data object types</li>
<li>Representations</li>
<li>Operations</li>
<li>Profiles</li>
<li>Extensions</li>
</ul>
<t><strong>R7.5</strong> Versioning schema MUST carry information about breaking vs. non-breaking changes and allow clients to decide whether it is able to interact with the server. The versioning scheme SHOULD be like the scheme used for HTTP where minor version changes do not break compatibility.</t>
<t><strong>R7.6</strong> Notices related to scheduled server maintenance timeslots MAY be included in the discovery document, this could be a human-readable, non machine parsable character string.</t>
<t><strong>R7.7</strong> RPP MAY only support a subset of EPP functionality, the supported functionality MUST be discoverable by the client</t>
<t><strong>R7.8</strong> <em>Removed</em></t>
<t><strong>R7.9</strong> <em>Merged with R5.10</em></t>
<t><strong>R7.10</strong> <em>Removed</em>. Included in R7.3.</t>
</section>

<section anchor="epp-compatibility"><name>EPP compatibility</name>
<t><strong>R8.1</strong> RPP MUST provide functional equivalents for core EPP functionalities related to domain name, host, contact, and organisation objects as defined in <xref target="RFC5731"></xref>, <xref target="RFC5732"></xref>, <xref target="RFC5733"></xref> and <xref target="RFC8543"></xref>.</t>
<t><strong>R8.2</strong> The automatic or mechanical mapping or conversion between EPP and RPP data model MUST be possible.</t>
<t><strong>R8.3</strong> Compatibility definitions for a RPP to EPP mapping MAY be defined in compatibility profiles (see: R4.4).</t>
<t><strong>R8.4</strong> RPP MUST include an extension framework able to define equivalents of most commonly used EPP extensions, which are not a part of core protocol (see: R4.2)</t>
<t><strong>R8.5</strong> EPP AuthInfo MUST be supported in RPP. RPP MUST by default support the requirements for Secure Authorization Information for Transfer <xref target="RFC9154"></xref> operational practise.</t>
<t><strong>R8.6</strong> RPP MUST support client_id/password authentication to match EPP client authentication.</t>
<t><strong>R8.7</strong> Where applicable RPP MUST support longer authorisation information compared to EPP, metainformation about client software and operational environment as well security related information (events) in the responses providing a functional equivalence to Login Security Extension for the Extensible Provisioning Protocol <xref target="RFC8807"></xref>.</t>
</section>

<section anchor="security"><name>Security</name>
<t><strong>R9.1</strong> RPP MUST support state-of-the-art authentication and authorisation schemes allowing for easy integration in modern HTTP infrastructure.</t>
<t><strong>R9.2</strong> RPP MUST support robust authentication and authorisation mechanisms, such as OAuth 2.0 and OpenID Connect, to ensure that only authorised clients and users can access or modify resources.</t>
<t><strong>R9.3</strong> Support for a simplified and quicker object transfer process MAY be included, where approval from the losing registrar is to be obtained interactively by the registrant during the transfer process.</t>
<t><strong>R9.4</strong> RPP MUST include an authorisation model/framework that goes beyond the EPP AuthInfo used for object transfers. The following use cases MAY be supported:</t>

<ul spacing="compact">
<li>Object transfers without using an EPP AuthInfo</li>
<li>Registrants using OpenID Connect can interactively allow DNS Operator to update their NS records, directly in the Registry database or indirectly using a registrar.</li>
</ul>
<t><strong>R9.5</strong> All RPP communications MUST use HTTPS (TLS) to protect data in transit from eavesdropping and man-in-the-middle attacks.</t>
<t><strong>R9.6</strong> Security mechanisms SHOULD be flexible to allow operators to choose appropriate methods and support federated authentication scenarios.</t>
<t><strong>R9.7</strong> RPP MAY include a mechanism for cryptographic verification of request and response messages as an additional security layer.</t>
<t><strong>R9.8</strong> RPP MUST allow for multiple user accounts linked to a single registrar, registrar user management MAY be delegated to an administrator account linked to a registrar, allowing for self service account management by the registrar.</t>
<t><strong>R9.9</strong> RPP MUST support a granular authorisation matrix, where one or more permissions are coupled to a user account. Allowing for the creation of different types of user accounts, such a readonly users only allowed to fetch data about existing objects, and power users allowed to create and modify objects.</t>
<t><strong>R9.10</strong> RPP MUST include considerations regarding best practices in secure handling of credentials, such as usage of strong passwords and limited lifetime for passwords and other tokens.</t>
<t><strong>R9.11</strong> RPP MUST support the Least Privilege Principle, to allow server operators to ensure that clients have only the permissions necessary.</t>
<t><strong>R9.12</strong> RPP MUST support secure credentials management, ensuring that credentials are protected against replay and theft, and have limited lifetimes.</t>
<t><strong>R9.13</strong> Any protocol extensions MUST be subject to the same security review and requirements as the core protocol.</t>
<t><strong>R9.14</strong> There MUST be mechanisms to revoke or deprecate credentials, tokens, or permissions when no longer needed or if compromised.</t>
<t><strong>R9.15</strong> RPP MUST support mechanisms to prevent Denial-of-Service attacks, whether from malicious actors or misbehaving clients. These mechanisms can include rate limiting and throttling of requests with related protocol signalling.</t>
<t><strong>R9.16</strong>: RPP MUST support the registry operator to impersonate or to act on behalf of, any of the registry system accounts. This includes having elevated access for provisioning objects, performing normal operations and as well as operations not available to regular clients.</t>
</section>

<section anchor="extensibility"><name>Extensibility</name>
<t><strong>R10.1</strong> The protocol MUST be extensible to accommodate new functionalities, data elements, read-only resources, operations, informational and validation functions, alternative addressing of resources,  resource linking, and resource composition beyond the initial definitions in RPP Core.</t>
<t><strong>R10.2</strong> RPP MUST support the Extension of the data model by enabling the definition and provisioning of entirely new object types, and by providing a standardised mechanism for adding new persistent properties to any existing object type.</t>
<t><strong>R10.3</strong> RPP MUST define extensibility methods which promote transparency and reusability of extension objects, data elements or operations in order to minimise multiple concurrent extensions realising the same function.</t>
<t><strong>R10.4</strong> Extensions for new operations on existing resources MUST be supported.</t>
<t><strong>R10.5</strong> RPP MUST support extensions that define new status codes not already defined in the core RPP RFCs. Extension designers MAY add new status codes. If a newly created status code is generic enough to be useful for the wider RPP community, the designer SHOULD register it in the appropriate IANA Registry.</t>
<t><strong>R10.6</strong> RPP MUST support extensions adding new HTTP headers.</t>
<t><strong>R10.7</strong> RPP SHALL have mechanisms to assure conflict avoidance when extending the protocol, including but not limited to data model, representations, operations, parameters, error codes and signalling. There MUST be a mechanism of conflict-free, non-coordinated extending in private/vendor discretion as well as a coordinated process for core, generic or shared elements.</t>
<t><strong>R10.8</strong> When a public Registry for RPP extensions is required, then IANA MUST be used for this function.</t>
<t><strong>R10.9</strong> RPP extensions MUST include support for versioning, the version of the extension supported by the server MUST be included in the discovery document.</t>
<t><strong>R10.10</strong> <em>Removed</em>
</t>
<t><strong>R10.11</strong> The protocol MUST support mechanisms for extending standard processes, such like delete or create, with additional transient parameters or non-persistent data (e.g. intended premium price or tier).</t>
<t><strong>R10.12</strong> The protocol MUST support mechanisms for extending results of an operation with additional transient, non-persistent information not defined in the RPP Core (e.g. information about discount applied to a create request).</t>
<t><strong>R10.13</strong> The protocol MUST allow extensions to add additional information to object statuses (e.g. due date of a status).</t>
<t><strong>R10.14</strong> The data model MUST be designed to allow Extension for future or experimental DNS record types as well as future ways of Delegation over DNS (e.g. DELEG).</t>
<t><strong>R10.15</strong> RPP design MUST promote cohesive Extension patterns by defining a preferred &quot;standard way&quot; for common functionalities. Where multiple approaches to solve the same problem may exist, the protocol specification SHOULD provide clear guidance on the recommended approach to prevent ecosystem fragmentation and ensure consistent implementations across different deployments.</t>
<t><strong>R10.16</strong> RPP MUST support Extension(s) for the clients to update their authentication credentials.</t>
</section>

<section anchor="scalability"><name>Scalability</name>
<t><strong>R11.1</strong> RPP MUST be stateless and MUST NOT maintain application state on the server required for processing future RPP requests. Every client request needs to provide all the information required for the server to be able to successfully process the request. The client MAY maintain application session state, for example by using a JWT token.</t>
<t><strong>R11.2</strong> RPP MUST support cacheability of responses, if applicable to the operation semantics and MUST not include transaction related identifiers and values.</t>
<t><strong>R11.3</strong> RPP MUST support load balancing at the level of request messages (URL) and load balancing MUST be possible without processing HTTP body.</t>
<t><strong>R11.4</strong> <em>Moved to <xref target="performance"></xref> as R12.5</em></t>
<t><strong>R11.5</strong> RPP MUST support asynchronous processing for operations on multiple objects, otherwise resource intensive or involving manual steps. The client request results in a confirmation of receipt and a means for retrieving the final completed processing result at a later time.</t>
</section>

<section anchor="performance"><name>Performance</name>
<t><strong>R12.1</strong> In order to minimise message sizes and needed processing RPP SHOULD be designed not to include a HTTP message body in the request or response when this is not necessary, for example when the required data can be transmitted using the URL and/or HTTP headers.</t>
<t><strong>R12.2</strong> RPP SHOULD allow for common bulk operations, resource listing, and filtering capabilities. RPP MUST NOT mandate such functionalities where this may impact scalability or performance negatively.</t>
<t><strong>R12.3</strong> <em>Removed</em>
</t>
<t><strong>R12.4</strong> The protocol MUST be usable in both high volume and low volume operating environments.</t>
<t><strong>R12.5</strong> RPP MUST support cacheability of responses, if applicable to the operation semantics and MUST not include transaction related identifiers and values.</t>
</section>

<section anchor="internationalisation"><name>Internationalisation</name>
<t><strong>R13.1</strong> RPP MUST support internationalisation, for object types and messages defined in the core protocol and extensions</t>
<t><strong>R13.2</strong> RPP MUST support human-readable localised response messages.</t>
</section>

<section anchor="clients"><name>Clients</name>
<t><strong>R14.1</strong> RPP MUST support server applications as clients. This will be a primary use-case of Registry/registrar integration.</t>
<t><strong>R14.2</strong> RPP MUST support interaction from command-line tools or desktop applications capable of sending HTTP requests. These can be generic clients such as <tt>curl</tt> or <tt>Postman</tt> but also specialised RPP command line tools or scripts.</t>
<t><strong>R14.3</strong> RPP SHOULD support web browsers as clients, such as SPA (single page applications) without any proxy backend between web browser and the RPP Server.</t>
<t><strong>R14.4</strong> RPP SHOULD support mobile applications as clients, also here through direct integration without any proxy backend.</t>
</section>

<section anchor="req_for_object_type"><name>Requirements for object types</name>

<section anchor="common-requirements"><name>Common requirements</name>
<t>This section contains requirements commonly applicable to more or all object types.</t>

<section anchor="generic-requirements"><name>Generic requirements</name>
<t><strong>O1.1</strong> <em>Removed</em></t>
</section>

<section anchor="obj_transfers"><name>Object Transfers</name>
<t><strong>O2.1</strong> RPP MUST support two types of object transfer operations:</t>

<ul spacing="compact">
<li>Pull Transfer: Initiated by the Gaining Client.</li>
<li>Push Transfer: Initiated by the Sponsoring Client, who designates a Gaining Client.</li>
</ul>
<t><strong>O2.2</strong> A Gaining Client MUST provide valid authorisation information to initiate a Pull Transfer request.</t>
<t><strong>O2.3</strong> For Pull Transfers, the RPP MUST provide operations for the Sponsoring Client to explicitly approve or reject a pending transfer request. The RPP MUST reject any approval or rejection attempts not initiated by the Sponsoring Client.</t>
<t><strong>O2.4</strong> For Push Transfers, the RPP MUST provide operations for the Gaining Client to explicitly approve or reject a pending transfer request. The RPP MUST reject any approval or rejection attempts not initiated by the designated Gaining Client.</t>
<t><strong>O2.5</strong> RPP MUST provide an operation for the Initiating Client to cancel its own pending transfer request. The RPP MUST reject any cancellation attempts not initiated by the Initiating Client.</t>
<t><strong>O2.6</strong> RPP MUST provide an operation to query the status of a pending or recently completed transfer request. This operation MUST be accessible to the Sponsoring Client and the Gaining Client.</t>
<t><strong>O2.7</strong> The response to a successful object transfer MUST include a representation of the transferred object and a list of any associated objects that were also transferred.</t>
</section>
</section>

<section anchor="domain-object-type"><name>Domain Object Type</name>

<section anchor="data-model"><name>Data Model</name>
<t><strong>D1.1</strong> RPP domain object data model MUST include, at a minimum, the attributes defined in RFC5731: the fully qualified domain name, Repository Object Identifier, object status, the current Sponsoring Client identifier, creating registrar client ID, creation timestamp, last update client ID, last update timestamp, expiration timestamp, last transfer timestamp, Nameservers, subordinate hosts, the registrant, and other associated contacts.</t>
<t><strong>D1.2</strong> RPP MUST only accept valid domain names, which MUST be valid FQDNs.</t>
<t><strong>D1.3</strong> RPP MUST support internationalised domain names (IDN) and accept A-labels and U-labels, also know as IDNA2008 and defined in <xref target="RFC5890"></xref>.</t>
<t><strong>D1.4</strong> RPP MUST apply the rules of Label Equivalence as defined in Section 2.3.2.4 of <xref target="RFC5890"></xref> when processing domain names in requests and responses by both clients and servers.</t>
<t><strong>D1.5</strong> RPP domain object data model MUST allow for the association of zero, one or more objects representing the DNS configuration of the domain including Nameservers. These may be defined by a reference to separate repository objects (equivalent of EPP host objects) or aggregate object (equivalent of EPP host attribute).</t>
<t><strong>D1.6</strong> RPP MUST support domains that have linkage to at minimum registrant, administrative, technical, and billing contacts. In thin Registries, only identifiers MAY be stored; in thick Registries, contact data MAY be included per (privacy) policy. The list of contact link types MUST be extensible.</t>
<t><strong>D1.7</strong> <em>Removed</em>. Included in R8.5.</t>
<t><strong>D1.8</strong> RPP MUST provide functional equivalents for EPP domain status values (e.g., ok, inactive, client/server&lt;command&gt;Prohibited, pending&lt;command&gt;) and define their mapping to RPP responses and HTTP status codes. The protocol MUST define which statuses can be set by the server and which can be set by the Sponsoring Client.</t>
<t><strong>D1.9</strong> RPP MUST enforce referential integrity. the parent domain name for a subordinate host object MUST not be deleted. RPP MUST return a conflict error when deletion is disallowed and the domain representation MAY include an attribute with information about linked objects.</t>
<t><strong>D1.10</strong> RPP MUST provide a mechanism for clients to discover the server's supported Internationalized Domain Name (IDN) policies. Information such as the identifiers for supported IDN tables, applicable language tags, and variant disposition policies MUST be discoverable via the service discovery document (see R7.2).</t>
</section>

<section anchor="operations"><name>Operations</name>
<t><strong>D2.1</strong> RPP MUST provide operations to check, create, read, update, transfer, renew and delete domain name objects as defined in <xref target="RFC5731"></xref>.</t>
<t><strong>D2.2</strong> When creating or renewing a domain object, RPP MUST allow a client to specify a registration period. The protocol MUST provide a mechanism for the server to confirm the resulting registration expiration date in the response.</t>
<t><strong>D2.3</strong> RPP MUST support the Domain Registry Grace Period Mapping as defined by <xref target="RFC3915"></xref>, the restore report MAY be ignored or included in the initial restore request, making this a 1-step process vs the 2-step process in EPP.</t>
<t><strong>D2.4</strong> RPP SHOULD support searching and listing domains filtered by name (exact/prefix), and Sponsoring Client.</t>
<t><strong>D2.5</strong> Only the Sponsoring Client (or an authorised server administrator) MAY modify or delete a domain object; servers MUST enforce authorisation.</t>
<t><strong>D2.6</strong> RPP MUST prevent creation of duplicate domain objects within a Registry namespace (TLD) and return a HTTP 409 (Conflict) status on collision.</t>
<t><strong>D2.7</strong> The transfer of a domain object MUST also result in the transfer of any subordinate host objects (ns.foo.example when foo.example is transferred).</t>
<t><strong>D2.8</strong> RPP domain Transfer Operation MUST allow for an implicit renewal. If a transfer results in an extension of the registration period, the response to the successful transfer MUST include the new expiration date of the domain object.</t>
<t><strong>D2.9</strong> RPP domain Transfer Operation SHOULD support optional update of DNSSEC and Delegation information directly with the transfer request. This feature, as not standard EPP feature, SHALL be optional to be supported by server policy.</t>
</section>

<section anchor="data-representation"><name>Data Representation</name>
<t><strong>D3.1</strong> The JSON representation MUST include the canonical domain name and any U-label/A-label when IDN is used by the server.</t>
<t><strong>D3.2</strong> RPP domain object representation MUST include link relations to related objects, for example: self, hosts and contacts.</t>
<t><strong>D3.3</strong> The representation MUST adapt to the Registry model. In thin mode, only identifiers (e.g., contact IDs) MUST be returned; in thick mode, full contact data MUST be returned.</t>
</section>

<section anchor="specific-considerations"><name>Specific Considerations</name>

<section anchor="embedding-of-epp-extensions"><name>Embedding of EPP extensions</name>
<t><strong>D4.1</strong> RPP Core protocol MUST incorporate Functional Equivalent of the following list of widely used and considered essential EPP extensions as recommended in <xref target="TigerTeamRecc"></xref>:</t>

<ul spacing="compact">
<li>Domain Name System (DNS) Security Extensions Mapping for the Extensible Provisioning Protocol <xref target="RFC5910"></xref></li>
<li>Domain Registry Grace Period Mapping for the Extensible Provisioning Protocol <xref target="RFC3915"></xref></li>
<li>Extensible Provisioning Protocol (EPP) mapping for DNS Time-To-Live (TTL) values <xref target="RFC9803"></xref></li>
<li>Organization Extension for the Extensible Provisioning Protocol <xref target="RFC8544"></xref></li>
</ul>
</section>
</section>
</section>

<section anchor="host-object-type"><name>Host Object Type</name>

<section anchor="data-model-1"><name>Data Model</name>
<t><strong>H1.1</strong> RPP host object data model MUST include, at a minimum: fully qualified host name, all associated IP addresses (see: R5.13), Repository Object Identifier, object status, current Sponsoring Client identifier, creating client identifier, creation timestamp, last updating client identifier, last update timestamp, the last transfer timestamp.</t>
<t><strong>H1.2</strong> RPP MUST map the EPP host attribute model to the generic JSON DNS model defined by RPP (see: R5.13).</t>
<t><strong>H1.3</strong> Host names MUST be valid FQDNs.</t>
<t><strong>H1.4</strong> RPP MUST support internationalized domain names (IDN) for host names and accept A-labels and U-labels, also know as IDNA2008 and defined in <xref target="RFC5890"></xref>.</t>
<t><strong>H1.5</strong> RPP MUST apply the rules of Label Equivalence as defined in Section 2.3.2.4 of <xref target="RFC5890"></xref> when processing host names in requests and responses by both clients and servers.</t>
<t><strong>H1.6</strong> When used for linking a Name Server to a domain name, RPP MUST support both In-bailiwick and Out-of-bailiwick host objects.</t>
<t><strong>H1.7</strong> RPP MUST support zero or more IP addresses (IPv4 or IPv6) for host objects, when the host object is used for linking a Name Server to a domain name. Addresses MUST be syntactically valid, normalised, and unique within the host. The maximum number of allowed addressess and any disallowed ranges (e.g., <xref target="RFC1918"></xref>) are server policy. The server MAY require, make optional or disallow IP addresses depending on whether host is In-bailiwick or Out-of-bailiwick. This is also server policy.</t>
<t><strong>H1.8</strong> RPP MUST provide functional equivalents for EPP host status values (e.g., ok, linked, client/server&lt;command&gt;Prohibited, pending&lt;command&gt;) and define their mapping to RPP responses and HTTP status codes.</t>
</section>

<section anchor="operations-1"><name>Operations</name>
<t><strong>H2.1</strong> RPP MUST provide operations to check, create, read, update and delete host objects as defined in <xref target="RFC5732"></xref>, with partial update semantics available to allow for efficient updates. Transfer Operation of subordinate host object MUST be implicit with the Transfer Operation of parent domain name.</t>
<t><strong>H2.2</strong> RPP SHOULD support searching and listing hosts filtered by name (exact/prefix), IP address, and Sponsoring Client, with pagination, the server MAY use a maximum limit on results.</t>
<t><strong>H2.3</strong> Only the Sponsoring Client (or an authorised server administrator) MAY modify or delete a host; servers MUST enforce authorisation.</t>
<t><strong>H2.4</strong> RPP MUST assure that In-bailiwick host objects are created and managed by the same Sponsoring Client as the parent domain name.</t>
<t><strong>H2.5</strong> RPP MUST enforce referential integrity. A host referenced by any domain (linked) MUST NOT be deleted. Servers MUST return a conflict error when deletion is disallowed and the host representation MAY include an attribute with information about linked objects. RPP MUST allow for safe deletion of referenced hosts - with grace period, restore and prior removal of references as recommended in <xref target="RFC9874"></xref>.</t>
<t><strong>H2.6</strong> RPP MUST prevent creation of duplicate hosts within a Registry namespace (TLD) and return a conflict on collision.</t>
</section>

<section anchor="data-representation-1"><name>Data Representation</name>
<t><strong>H3.1</strong> RPP MUST support a JSON representation for both Host objects and for Host attributes as defined in the EPP RFCs.</t>
<t><strong>H3.2</strong> The JSON representation MUST include the canonical host name and any U-label/A-label when IDN is used.</t>
<t><strong>H3.3</strong> The representation SHOULD include link relations to related objects, for example: self, and parent domain for In-bailiwick hosts.</t>
</section>
</section>

<section anchor="contact-object-type"><name>Contact Object Type</name>

<section anchor="data-model-2"><name>Data Model</name>
<t><strong>C1.1</strong> RPP contact object data model MUST include, at a minimum an equivalent of RFC5733 contact data model: a unique identifier, repository object ID, current status, name, organisation, full postal address, voice and fax numbers, email addresses,the Sponsoring Client identifier, the creating client identifier, creation timestamp, the last updating client identifier, last update timestamp, last transfer timestamp, and authorisation information.</t>
<t><strong>C1.2</strong> RPP MUST support server-generated opaque IDs, support for client-supplied IDs is OPTIONAL.</t>
<t><strong>C1.3</strong> RPP SHOULD support an explicit indication of entity type (person or organisation) in the contact model.</t>
<t><strong>C1.4</strong> When RPP is used with thick Registries, full contact data MAY be returned, for thin Registries only the contact identifier MUST be returned.</t>
<t><strong>C1.5</strong> RPP MUST support disclosure and privacy preferences equivalent to EPP &quot;disclose&quot;.</t>
<t><strong>C1.6</strong> RPP MUST support contact object to refer to external identity provider (e.g. when digital identity schemes are used), where the personal data would not be persisted within RPP Server. RPP SHOULD allow to only store a stable identifier, reference or credential for future verification (see Privacy Considerations).</t>
<t><strong>C1.7</strong> RPP MUST enforce referential integrity. A contact MUST not be deleted when it is referenced by other objects. RPP MUST return a conflict error when deletion is disallowed and the contact representation MAY include an attribute with information about linked objects.</t>
<t><strong>C1.8</strong> RPP SHOULD consider renaming the EPP contact object type to &quot;entity&quot; to better align with the RDAP data model, defined in <xref target="RFC9083"></xref>.</t>
</section>

<section anchor="operations-2"><name>Operations</name>
<t><strong>C2.1</strong> RPP contact object type is mapped to the EPP equivalent and MUST support all operations (commands) defined for the contact object in <xref target="RFC5733"></xref>, such as check, create, read, update, and delete with the possible exception of transfer command, and include support for partial update semantics available to allow for efficient updates.</t>
<t><strong>C2.2</strong> RPP MAY support the contact transfer command from EPP.</t>
<t><strong>C2.3</strong> RPP SHOULD support searching and listing contacts filtered by name (exact/prefix), and Sponsoring Client, with pagination, the server MAY use a maximum limit on results.</t>
<t><strong>C2.4</strong> Functional equivalents for EPP contact statuses (e.g., ok, linked, client/serverUpdateProhibited, client/serverDeleteProhibited, pendingTransfer) MUST be supported, with clear mapping to HTTP/RPP responses. The protocol MUST define which statuses can be set by the server and which can be set by the Sponsoring Client.</t>
<t><strong>C2.5</strong> RPP MUST prevent creation of contacts with duplicate ids within Registry namespace (TLD) and return a HTTP 409 (Conflict) status on collision.</t>
<t><strong>C2.6</strong> The protocol MUST provide an operation to retrieve full contact representation. An authorisation mechanism MUST ensure that sensitive data, such as authorisation information, is only returned to the current Sponsoring Client.</t>
<t><strong>C2.7</strong> The protocol MUST provide an operation to retrieve an appropriate contact representation to non-Sponsoring Clients. The representation MAY vary depending if the authorisation information is provided - depending on server policy.</t>
</section>

<section anchor="data-representation-2"><name>Data Representation</name>
<t><strong>C3.1</strong> RPP SHOULD consider using JSContact <xref target="RFC9553"></xref> format for contact representation.</t>
<t><strong>C3.2</strong> RPP MUST support contact attribute disclosure preferences per field (or field group) and this MUST be mapped to the EPP disclosure preferences described in <xref target="RFC5733"></xref>.</t>
</section>

<section anchor="specific-considerations-1"><name>Specific Considerations</name>

<section anchor="internationalisation-1"><name>Internationalisation</name>
<t><strong>C4.1</strong> RPP MUST support internationalisation (character encoding) for contact objects in the following areas:</t>

<ul spacing="compact">
<li>name</li>
<li>address data</li>
<li>any other contact-related data containing human provided or readable text</li>
</ul>
<t><strong>C4.2</strong> RPP MUST support both the localized and internationalised version of the EPP postalInfo element from <xref target="RFC5733"></xref>.</t>
<t><strong>C4.3</strong> RPP MUST support internationalised Email addresses <xref target="RFC6530"></xref> in Contact objects. Functional Equivalent of <xref target="RFC9873"></xref> MUST be assured in EPP compatibility mode, however RPP MAY remove requirement for at least one all-ASCII Email address.</t>
<t><strong>C4.4</strong> RPP MUST support multiple localised expressions of the same data, e.g. fields mentioned in C4.1 having both international and localised variants.</t>
<t><strong>C4.5</strong> All future RPP contact object extensions MUST be able to handle internationalisation and localisation requirements.</t>
</section>
</section>
</section>

<section anchor="organisation-object-type"><name>Organisation Object Type</name>
<t><strong>G1.1</strong> RPP MUST support data model and operations defined for Organisations - Functional Equivalent of <xref target="RFC8543"></xref>.</t>
</section>
</section>

<section anchor="iana-considerations"><name>IANA Considerations</name>
<t>This document has several requirements for the RESTful Provisioning Protocol (RPP) that create considerations for IANA. Future architecture and design documents may identify additional needs for IANA Registries.</t>
<t>Therefore, the core RPP specifications MUST include &quot;IANA Considerations&quot; sections that formally request the creation of any necessary IANA Registries. These sections MUST also provide the initial registration of values defined within those core documents.</t>
</section>

<section anchor="security-considerations"><name>Security Considerations</name>
<t>The security section of this document defines the security related requirements for RPP, these requirements MUST be addressed in the design and implementation of RPP. Implementations MUST follow best practices, described in <xref target="BCP56"></xref> for HTTP API design.</t>
<t>RRP core specifications MUST include appropriate Security Considerations sections, specifying implementation and operational security requirements for both RPP clients and servers.</t>
</section>

<section anchor="privacy_considerations"><name>Privacy Considerations</name>
<t><strong>DP1.1</strong> The protocol MUST provide mechanisms to support the implementation of data privacy principles, such as those found in modern data protection frameworks (e.g., GDPR). These mechanisms MUST support, at a minimum, the principles of data minimisation and purpose limitation.</t>
<t><strong>DP.2</strong> To support data minimisation, the protocol MUST allow clients to provide and manage only the data that is strictly necessary for a specific purpose. The protocol MUST also allow for different representations of an object, so that a client can request a representation containing only the data it needs and server can return the data a client is authorised to access (See also R4.3 and R5.14).</t>
<t><strong>DP1.3</strong> The protocol's operations and data models MUST be sufficiently flexible to allow an operator to implement workflows for exercising data subject rights, such as access, rectification, and erasure of personal data, in a manner consistent with the operational and policy constraints of the provisioning environment.</t>
<t><strong>DP1.4</strong> The protocol MUST provide services to identify data collection policies and privacy practices. Information about data collection, retention, and privacy policies MUST be included in the service discovery document, enabling clients to understand how personal and sensitive data is handled.</t>
<t><strong>DP1.5</strong> Object type specification MAY define additional requirements related to data privacy (See: C1.5, C2.6 and C2.7 for contact object type).</t>
</section>

<section anchor="changes-history" removeInRFC="true"><name>Changes History</name>

<section anchor="version-02-to-03" numbered="false" toc="exclude"><name>Version -02 to -03</name>

<ul spacing="compact">
<li>Added reference to tiger team extension lists to A1.3 and A2.3</li>
<li>Add R9.16 to support registry operator use-case on authorization</li>
<li>Renamed section &quot;Operations and responses&quot; to &quot;Operations and request handling&quot; (Issue #140)</li>
<li>&quot;Common&quot; section of &quot;<xref target="req_for_object_type" format="title"></xref>&quot; clearly structured (Issue #140)</li>
<li>Corrected numbering in &quot;<xref target="privacy_considerations" format="title"></xref>&quot; section. DP1.5 added with a clear reference to other privacy-related requirements (Issue #140)</li>
<li>Added introduction to &quot;<xref target="data_model" format="title"></xref>&quot; and &quot;<xref target="data_representation" format="title"></xref>&quot; sections for clarity (Issue #140)</li>
<li>Moved R11.4 from &quot;<xref target="scalability" format="title"></xref>&quot; to &quot;<xref target="performance" format="title"></xref>&quot; as R12.5 for better section fit (Issue #140)</li>
<li>Functional Equivalent defined as term (Issue #140)</li>
<li>Changed R12.2, D2.4 and C2.3 from MAY to SHOULD (Issue #139)</li>
<li>Changed R8.6 from SHOULD to MUST (Issue #139)</li>
<li>Removed R7.10 and D1.7 (Issue #139)</li>
<li>Changed R6.4 from MUST to SHOULD (Issue #139)</li>
<li>Fixed Typos and references (Issue #139)</li>
<li>Moved R6.1, R6.2 and R6.3 to R5.14, R5.15 and R5.16 respectively (Issue #139)</li>
<li>Revised and added necessary teminology (Issue #26)</li>
<li>Updated R4.3 to only mandate data fields that are strictly necessary</li>
<li>Merged R7.9 and R5.10 (Issue #124)</li>
<li>Updated R4.4 to better describe profiles (Issue #15)</li>
<li>Removed mandatory password change facility in R9.10. Added extensibility requirement in R10.16 and an essential extension in A1.2 (Issue #70)</li>
<li>Replaced O1.1 with R5.13 and updated R10.14 (Issue #125)</li>
<li>Added requirements R2.5, R10.15 and R10.3 (changed) related to Generic Protocol Design Recommendations from the Tiger Team recommendations <xref target="TigerTeamRecc"></xref></li>
<li>Added Acknowledgements section</li>
</ul>
</section>

<section anchor="version-01-to-02" numbered="false" toc="exclude"><name>Version -01 to -02</name>

<ul spacing="compact">
<li>Added requirement for support of both thick and Thin Registry models (R1.7)</li>
<li>Added requirements for Host Object Type</li>
<li>Added R10.12 on future ways of Delegation</li>
<li>Added requirements for Domain Object Type</li>
<li>Added relevant and not yet covered requirements from <xref target="RFC3375"></xref> (R6.5-R6.8, R12.4, <xref target="obj_transfers"></xref>)</li>
<li>Added R6.4 RPP MUST include a functional equivalent of the EPP Poll command.</li>
<li>Added requirements for the contact object type</li>
<li>The security considerations section has been restructured and expanded to provide more detailed guidance on security best practices for RPP implementations.</li>
<li>Added additional security requirements.</li>
<li>R1.2 removed</li>
<li>added essential and optional extensions sections in <xref target="appendix_extensions"></xref></li>
<li>Added generic IANA considerations</li>
<li>Added requirement for support of both thick and Thin Registry models (R1.7)</li>
<li>Added requirements related to extensibility following the recommendation from the Tiger Team <xref target="TigerTeamRecc"></xref></li>
<li>Added requirements related to embedding of EPP extensions following the recommendation from the Tiger Team <xref target="TigerTeamRecc"></xref></li>
<li>Updated R4.6 to require the use of strict data validation</li>
</ul>
</section>

<section anchor="version-00-to-01" numbered="false" toc="exclude"><name>Version -00 to -01</name>

<ul spacing="compact">
<li>Added Privacy Considerations section</li>
<li>R1.5 has been changed to MUST instead of MAY.</li>
<li>R1.6 has been changed to MUST instead of SHOULD.</li>
<li>Updated the entire text to make consistent use of the British spelling style.</li>
<li>stripped down version history of pre-WG -00 to -01</li>
</ul>
</section>

<section anchor="version-01-to-00-wg" numbered="false" toc="exclude"><name>Version -01 to -00 (WG)</name>

<ul spacing="compact">
<li>The document has been adopted by the working group, the version number has been reset from -01 to -00.</li>
</ul>
</section>

<section anchor="version-00-to-01-1" numbered="false" toc="exclude"><name>Version -00 to -01</name>

<ul spacing="compact">
<li>Structurally reorganised the document, renumbering all requirements and adding new sections for Operations, Clients, and Internationalisation.</li>
<li>Replaced specific technology mandates with a general requirement to leverage RESTful best practices.</li>
<li>Introduced a formal framework for extensions, including versioning and discoverability.</li>
<li>Significantly expanded the security model to support granular, multi-user authorisation.</li>
<li>Mandated support for partial object updates and asynchronous processing for long-running operations.</li>
<li>Detailed the requirements for a machine-readable discovery document (/.well-known).</li>
<li>Added mandatory support for internationalisation (i18n) and specified considering JSContact for contact objects.</li>
</ul>
</section>
</section>

<section anchor="acknowledgements"><name>Acknowledgements</name>
<t>The authors wish to thank the following individuals for providing detailed comments and suggestions that improved the clarity and accuracy of the requirements.</t>

<ul spacing="compact">
<li>Andy Newton</li>
<li>James Gould</li>
<li>Marco Davids</li>
<li>Ruth Trevor-Allen</li>
</ul>
</section>

</middle>

<back>
<references><name>References</name>
<references><name>Normative References</name>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml9/reference.BCP.56.xml"/>
<reference anchor="OpenAPI" target="https://www.openapis.org/">
  <front>
    <title>OpenAPI Specification</title>
    <author>
      <organization>openapis.org</organization>
    </author>
    <date year="2025"></date>
  </front>
</reference>
<reference anchor="RAML" target="https://raml.org/">
  <front>
    <title>RESTful API Modeling Language</title>
    <author>
      <organization>raml.org</organization>
    </author>
    <date year="2025"></date>
  </front>
</reference>
<reference anchor="REST" target="http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm">
  <front>
    <title>Architectural Styles and the Design of Network-based Software Architectures</title>
    <author fullname="Roy Fielding" initials="R." surname="Fielding">
      <organization></organization>
    </author>
    <date year="2000"></date>
  </front>
</reference>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1918.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3915.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3986.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5730.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5731.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5732.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5733.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5785.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5890.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5910.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6530.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6570.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7807.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8499.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8543.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8544.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8807.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9038.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9083.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9110.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9154.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9553.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9803.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9873.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9874.xml"/>
<reference anchor="RICHARDSON" target="https://martinfowler.com/articles/richardsonMaturityModel.html">
  <front>
    <title>Richardson Maturity Model</title>
    <author fullname="Martin Fowler" initials="M." surname="Fowler">
      <organization></organization>
    </author>
    <date year="2010"></date>
  </front>
</reference>
<reference anchor="ROI" target="https://www.oreilly.com/library/view/restful-web-services/9780596529260/ch04.html">
  <front>
    <title>RESTful Web Services, Chapter 4</title>
    <author fullname="Leonard Richardson" initials="L." surname="Richardson">
      <organization></organization>
    </author>
    <author fullname="Sam Ruby" initials="S." surname="Ruby">
      <organization></organization>
    </author>
    <date year="2007"></date>
  </front>
</reference>
</references>
<references><name>Informative References</name>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3375.xml"/>
<reference anchor="TigerTeamRecc" target="https://mailarchive.ietf.org/arch/msg/rpp/rXMZqMrTmaxiNTlLNSM8_gGB_tQ/">
  <front>
    <title>EPP Extensibility and Extension Analysis</title>
    <author>
      <organization>RPP WG</organization>
    </author>
    <author fullname="Jim Gould" initials="J." surname="Gould">
      <organization>Verisign Labs</organization>
    </author>
    <author fullname="Jody Kolker" initials="J." surname="Kolker">
      <organization>GoDaddy</organization>
    </author>
    <author fullname="Pawel Kowalik" initials="P." surname="Kowalik">
      <organization>DENIC</organization>
    </author>
    <author fullname="Eric Skoglund" initials="E." surname="Skoglund">
      <organization>Internet Stiftelsen</organization>
    </author>
    <author fullname="Maarten Wullink" initials="M." surname="Wullink">
      <organization>SIDN Labs</organization>
    </author>
    <date year="2025"></date>
  </front>
</reference>
</references>
</references>

<section anchor="appendix_extensions"><name>Extensions</name>

<section anchor="essential-extensions"><name>Essential extensions</name>
<t>The following list of extensions is considered essential for the completeness of RPP as provisioning protocol for domain names.
The core RPP and its extensibility framework MUST enable creation of those extensions.</t>
<t><strong>A.1</strong> <em>Moved to <xref target="appendix_extensions_optional"></xref> as A2.2</em></t>
<t><strong>A1.1</strong> An extension that allows a DNS Operator to update the DNSSEC key material for a domain object. This extension MAY be used by the DNS Operator to update the DNSSEC key material for a domain object, without the need for the registrar to be involved in this process.</t>
<t><strong>A1.2</strong> An extension for the clients to update their EPP compatible (client_id/password) authentication credential.</t>
<t><strong>A1.3</strong> Extensions listed in <xref target="TigerTeamRecc"></xref> Section 4.2.3 EPP Extension Recommendations 2. Extension.</t>
</section>

<section anchor="appendix_extensions_optional"><name>Optional extensions</name>
<t>The following list of extensions is considered as possible need for certain deployments of RPP, however other solutions outside of RPP would be possible. Therefore RPP and its extensibility framework MAY enable creation of those extensions, however it is not a MUST criteria.</t>
<t><strong>A2.1</strong> An extension that allows generating a representation of a historical overview for an object, e.g. show all events linked to the object (create, update ...). The historical time window is determined by server policy and is included in the discovery service document.</t>
<t><strong>A2.2</strong> An extension for a Search API to allow for searching for objects in the Registry database. Includes advanced search capabilities for object info request.</t>
<t><strong>A2.3</strong> Extensions listed in <xref target="TigerTeamRecc"></xref> Section 4.2.3 EPP Extension Recommendations 3. Design.</t>
</section>
</section>

</back>

</rfc>
