<?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-wullink-rpp-requirements-01" 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-wullink-rpp-requirements-01" 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/>
<area>Internet</area>
<workgroup>Network Working Group</workgroup>

<abstract>
<t>This document describes the requirement 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>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>RESTful Provisioning Protocol or RPP - The protocol described in this document.</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>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>
</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 definded protocol layers.</t>
<t><strong>R1.2.</strong> RPP MUST provide a clear, clean, easy to use and self-explanatory interface that can easily be integrated into existing software systems.
</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 MAY include support for providing detailed information about application status codes, for example as descibed in <xref target="RFC7807"></xref></t>
<t><strong>R1.6</strong>
RPP SHOULD 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>
</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 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>
</section>

<section anchor="rest"><name>REST</name>
<t><strong>R3.1.</strong> The 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> The RPP architecture MUST follow Resource-Oriented Architecture <xref target="ROI"></xref>.</t>
<t><strong>R3.3.</strong> The 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 [!@OpenAPI] 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>
</section>

<section anchor="data-model"><name>Data Model</name>
<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> RPP MUST allow an extension mechanism that allows clients to signal data omission or redaction, indicating data collected but not transmitted to the registry or redacted.</t>

<aside><t>TODO: <eref target="https://github.com/ietf-wg-rpp/rpp-requirements/issues/34">Issue #34</eref></t>
</aside>
<t><strong>R4.4</strong> RPP MUST have mechanisms to define profiles to indicate:</t>

<ul spacing="compact">
<li>Required parts of the data model</li>
<li>Mapping definition</li>
<li>Functional subsets for compatibility.</li>
</ul>

<aside><t>TODO: <eref target="https://github.com/ietf-wg-rpp/rpp-requirements/issues/15">Issue #15</eref></t>
</aside>
<t><strong>R4.5</strong> The 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> A RPP server and client MUST in default ignore unknown properties of representations however there MUST be a mechanism for a client to signal that a strict handling is wished where unknown fields are treated as error.</t>

<aside><t>TODO: <eref target="https://github.com/ietf-wg-rpp/rpp-requirements/issues/36">Issue #36</eref></t>
</aside>
</section>

<section anchor="data-representation"><name>Data Representation</name>
<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 extended 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>

<aside><t>TODO: <eref target="https://github.com/ietf-wg-rpp/rpp-requirements/issues/36">Issue #36</eref></t>
</aside>
<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>R.5.10</strong> A generated RPP response representation that includes an object identifier (for example a contact handle) MUST also include a URL reference to the location of the object representation.</t>
</section>

<section anchor="operations-and-responses"><name>Operations and responses</name>
<t><strong>R6.1</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>R6.2</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>R6.3</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>

<aside><t>TODO: <eref target="https://github.com/ietf-wg-rpp/rpp-requirements/issues/56">Issue #56</eref></t>
</aside>
</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 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> An RPP response that includes unique object identifiers, MAY also include URL references for these objects.</t>
<t><strong>R7.10</strong> Versions used by the RPP protocol and used extensions MUST be discoverable by the client.</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, and contact objects as defined in <xref target="RFC5731"></xref>, <xref target="RFC5732"></xref> and <xref target="RFC5733"></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>

<aside><t>TODO: <eref target="https://github.com/ietf-wg-rpp/rpp-requirements/issues/15">Issue #15</eref></t>
</aside>
<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 password based Authorization Information defined in <xref target="RFC5731"></xref> and <xref target="RFC5733"></xref> MUST be supported in RPP.</t>
<t><strong>R8.6</strong> RPP SHOULD support client_id/password authentication to match EPP client authentication.</t>
</section>

<section anchor="security"><name>Security</name>
<t><strong>R9.1</strong> RPP MUST support state-of-the-art authentication and authorization schemes allowing for easy integration in modern HTTP infrastructure.</t>
<t><strong>R9.2</strong> RPP MUST support modern authentication and authorization standards (OAuth, OpenId Connect)</t>
<t><strong>R9.3</strong> Support for an simplified and quicker object transfer process MAY be included, where approval from the losing registar 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 current EPP password based Authorization Information (AuthInfo) used for object transfers. The following use cases MAY be supported:</t>

<ul spacing="compact">
<li>Object transfers without using an EPP password based Authorization Information</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 registar.</li>
</ul>
<t><strong>R9.5</strong> RPP MUST employ strong authentication and utilize encrypted transport (HTTPS) to protect sensitive data.</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 allowing for multiple user accounts linked to a single registrar, registar user management MAY be delegated to an administrator account linked to a registrar, allowing for self service account management by the registar.</t>
<t><strong>R9.9</strong> RPP MUST support a granalar authorization 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 allow users to update their credentials and enforce strong passwords and limited lifetime for passwords and other tokens.</t>
</section>

<section anchor="extensibility"><name>Extensibility</name>
<t><strong>R10.1</strong> The protocol MUST be extensible to accommodate new functionalities, data elements, and operations beyond the initial scope.</t>
<t><strong>R10.2</strong> RPP MUST allow for flexibility in extending the data model e.g. adding new objects or a new attribute to an existing object MUST be possible.</t>
<t><strong>R10.3</strong> RPP SHOULD promote standardisation of commonly used extension attributes.</t>
<t><strong>R10.4</strong> Extensions for new operations on existing resources MUST be supported.</t>

<aside><t>TODO: <eref target="https://github.com/ietf-wg-rpp/rpp-requirements/issues/47">Issue #47</eref></t>
</aside>
<t><strong>R10.5</strong> RPP MUST support extensions that define new status codes not already defined in the core RPP RFCs.
</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 discresion 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 extention 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> Extension designers or RPP implementers MAY add new status codes, if a newly created status code is generic enough to be useful for the wider RPP community, then the extension designer SHOULD register the new status code in the RPP IANA registry.</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>

<aside><t>TODO: <eref target="https://github.com/ietf-wg-rpp/rpp-requirements/issues/50">Issue #50</eref></t>
</aside>
<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> Every request message MUST at most contain a single object for the server to operate on, with the exception of operations that are explicitely defined as a bulk operation.</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 MAY 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>
</section>

<section anchor="internationalisation"><name>Internationalisation</name>
<t><strong>R13.1</strong> RPP MUST support internationalization, for object types and messages defined in the core protocol and extensions</t>
<t><strong>R13.2</strong> RPP MUST support human-readable localized response mesages.</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. Whese can be generic clients such as <tt>curl</tt> or <tt>Postman</tt> but also specialized 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 webbrowser 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="requirements-for-object-types"><name>Requirements for object types</name>

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

<section anchor="internationalisation-1"><name>Internationalisation</name>
<t><strong>D13.1</strong> RPP MUST support Internationalized Domain Names (IDNs) - both UTF-8 as well as Punycode representation of a domain name MUST be supported, however one of them MAY be chose as primary for object URL</t>
</section>
</section>

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

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

<section anchor="data-representation-1"><name>Data Representation</name>
<t><strong>C5.1</strong> RPP SHOULD consider using JSContact <xref target="RFC9553"></xref> format for contact representation.</t>
</section>

<section anchor="internationalisation-2"><name>Internationalisation</name>
<t><strong>C13.1</strong> RPP MUST support internationalization (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 readible text</li>
</ul>
<t><strong>C13.2</strong> RPP MUST support internationalised Email addresses <xref target="RFC6530"></xref> in Contact objects.</t>
<t><strong>C13.3</strong> RPP MUST support multiple localised expressions of the same data, e.g. fields mentioned in C13.1 having both international and localised variants.</t>
</section>
</section>
</section>

<section anchor="iana-considerations"><name>IANA Considerations</name>

<aside><t>TODO: TBC if anything needed here</t>
</aside>
</section>

<section anchor="security-considerations"><name>Security Considerations</name>

<aside><t>TODO: TBC if anything needed here. There is a security section.</t>
</aside>
</section>

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

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

<section anchor="overall-structural-changes" numbered="false"><name>Overall Structural Changes</name>

<ul>
<li>Requirement Numbering: All requirements have been assigned a structured numbering format (e.g., Rx.x, Dx.x, Cx.x, Hx.x).</li>
<li><t>New Sections Added:</t>

<ul spacing="compact">
<li><tt>Operations and responses</tt></li>
<li><tt>Clients</tt></li>
<li><tt>Internationalisation</tt></li>
<li><tt>Requirements for object types</tt> (with subsections for Domain, Host, Contact)</li>
<li><tt>Appendix A. Extensions</tt></li>
</ul></li>
<li><t>Section Removed: The old <tt>Other</tt> section, which contained a list of discussion points, was removed and requirements placed in relevant sections or appendix.</t>
</li>
</ul>
</section>

<section anchor="major-changes-by-section-references-as-per-01" numbered="false"><name>Major Changes by Section (References as per -01)</name>

<section anchor="general-1" numbered="false"><name>General</name>

<ul spacing="compact">
<li>Modified R1.2: Removed the explicit requirement for language bindings.</li>
<li>Replaced Requirement (R1.3): Replaced the specific requirement to leverage HTTP, JSON, OpenAPI with a broader R1.3 (SHOULD leverage RESTful best practices, MUST justify deviation).</li>
<li>New Requirement R1.4: Added requirement: RPP MUST support application-level status codes (MAY reuse EPP codes).</li>
<li>New Requirement R1.5: Added requirement: RPP MAY support detailed status information (e.g., <xref target="RFC7807"></xref>).</li>
<li>New Requirement R1.6: Added requirement: RPP SHOULD support informational/warning messages on success.</li>
</ul>
</section>

<section anchor="http-1" numbered="false"><name>HTTP</name>

<ul spacing="compact">
<li>Modified R2.2: Added requirement: Deviation from HTTP best practices (<xref target="BCP56"></xref>) MUST be justified.</li>
<li>Rewritten R2.4: Significantly rewrote the status code requirement. Now MUST use existing HTTP codes AND define application-level codes, clarifying mapping and overload handling.</li>
</ul>
</section>

<section anchor="rest-1" numbered="false"><name>REST</name>

<ul spacing="compact">
<li>Modified R3.1: Removed the negative recommendation against Richardson Maturity Model (RMM) Level 3.</li>
<li>New Requirement R3.2: Added requirement: RPP MUST follow Resource-Oriented Architecture <xref target="ROI"></xref>.</li>
<li>New Requirement R3.3: Added requirement: RPP MUST strive to minimize client-server round trips.</li>
<li>Merged Requirement R3.4: Old requirement &quot;When the semantics... MUST be optional&quot; merged into R12.1.</li>
<li>Modified R3.5: Broadened API specification recommendation (SHOULD) to include <xref target="RAML"></xref>; added constraint: RPP MUST NOT mandate a specific API specification technology.</li>
</ul>
</section>

<section anchor="data-model-1" numbered="false"><name>Data Model</name>

<ul spacing="compact">
<li>Modified R4.2: Changed normative keyword from MAY to SHOULD regarding adding common EPP extensions (like DNSSEC) to the core data model.</li>
<li>Rewritten R4.3: Replaced old data omission requirement (SHOULD) with R4.3 (MUST allow <em>extension mechanism</em> for omission/redaction).</li>
<li>New Requirement R4.5: Added requirement: RPP architecture MUST include loose coupling for non-breaking version changes.</li>
<li>Rewritten R4.6: Replaced old text about server choice on validation strictness with R4.6 (MUST default to ignoring unknown properties, MUST provide mechanism for client to request strict handling).</li>
</ul>
</section>

<section anchor="data-representation-2" numbered="false"><name>Data Representation</name>

<ul spacing="compact">
<li>Split Requirement (R5.1, R5.2): Old requirement (MUST use JSON default, MAY support others) split into R5.1 (MUST use JSON default) and R5.2 (MUST be possible to extend RPP for other formats).</li>
<li>Rewritten R5.4: Replaced &quot;server MAY support multiple media types&quot; with R5.4 (MUST define default media type, SHALL be extensible for others).</li>
<li>Removed Requirement (Old R5.6): Requirement related to server profiles for data models/mappings explicitly removed (linked to Issue #11).</li>
<li>Modified R5.8: Changed partial update support from MAY to MUST. Removed specific mention of HTTP PATCH / JSON Merge Patch.</li>
<li>New Requirement R5.9: Added requirement: RPP MUST support full update of data objects.</li>
<li>New Requirement R5.10: Added requirement: Response with object ID MUST include object URL reference.</li>
<li>Removed Requirement: Requirement to use JSContact for contacts moved to C5.1.</li>
</ul>
</section>

<section anchor="operations-and-responses-1" numbered="false"><name>Operations and responses</name>

<ul spacing="compact">
<li>New Requirement R6.1: Added requirement: RPP MUST support client requests for different data representation depths (minimal, full, full+dereferenced).</li>
<li>New Requirement R6.2: Added requirement: RPP MAY return different representations in different contexts.</li>
<li>New Requirement R6.3: Added requirement: Response data MUST only contain object data; transactional info MUST be in HTTP headers.</li>
</ul>
</section>

<section anchor="discoverability-1" numbered="false"><name>Discoverability</name>

<ul spacing="compact">
<li>Rewritten R7.2: Significantly expanded the requirement for the discovery document (<tt>/.well-known</tt>), detailing mandatory structured machine-readable content (services, extensions, versions, etc.).</li>
<li>Expanded R7.4, R7.5 &amp; R7.10: Old API version discoverability expanded into R7.4 (MUST support versioning for protocol, objects, representations, etc.), R7.5 (Schema MUST show breaking changes) and &amp;.10 (versions MUST be discoverable).</li>
<li>Removed Requirement R7.8: Explicitly removed (linked to Issue #21).</li>
<li>New Requirement R7.9: Added requirement: Response with unique object IDs MAY include URL references.</li>
</ul>
</section>

<section anchor="epp-compatibility-1" numbered="false"><name>EPP compatibility</name>

<ul spacing="compact">
<li>New Requirement R8.3: Added requirement: RPP-to-EPP mapping definitions MAY be defined in compatibility profiles (references R4.4).</li>
<li>Removed Moved: Requirement about including common EPP extensions in core moved (superseded by R4.2).</li>
<li>New Requirement R8.4: Added requirement: RPP MUST include an <em>extension framework</em> for EPP extension equivalents not in core (references R4.2).</li>
<li>Rewritten R8.5: Replaced old EPP token requirement with R8.5 (MUST support EPP password-based Authorization Information per <xref target="RFC5731"></xref>/<xref target="RFC5733"></xref>).</li>
<li>New Requirement R8.6: Added requirement: RPP SHOULD support client_id/password authentication similar to EPP.</li>
</ul>
</section>

<section anchor="security-1" numbered="false"><name>Security</name>

<ul spacing="compact">
<li>Rewritten R9.4: Significantly rewrote and expanded the authorization model requirement (MUST go beyond AuthInfo), detailing potential use cases (transfers without AuthInfo, DNS operator updates via OIDC).</li>
<li>New Requirement R9.8: Added requirement: RPP MUST allow multiple user accounts per registrar, MAY delegate user management.</li>
<li>New Requirement R9.9: Added requirement: RPP MUST support a granular authorization matrix (permissions per user).</li>
<li>New Requirement R9.10: Added requirement: RPP MUST allow credential updates and enforce password strength/lifetime.</li>
</ul>
</section>

<section anchor="extensibility-1" numbered="false"><name>Extensibility</name>

<ul spacing="compact">
<li>Removed Requirement: Removed &quot;SHOULD aim for easy and natural extensibility to richer models&quot;.</li>
<li>New Requirement R10.3: Added requirement: RPP SHOULD promote standardization of common extension attributes.</li>
<li>Removed Requirement: Removed explicit prohibition of EPP-style command-response extensions.</li>
<li>New Requirement R10.5: Added requirement: RPP MUST support extensions defining new status codes.</li>
<li>New Requirement R10.6: Added requirement: RPP MUST support extensions adding new HTTP headers.</li>
<li>New Requirement R10.7: Added requirement: RPP SHALL have conflict avoidance mechanisms for extensions (private and coordinated).</li>
<li>Removed Requirement: Removed requirement for JSON namespace concept.</li>
<li>New Requirement R10.9: Added requirement: RPP extensions MUST support versioning, discoverable via discovery document.</li>
<li>Removed Requirement R10.10: Requirement for IANA registry of RPP status codes explicitly dropped (linked to Issue #20).</li>
<li>New Requirement R10.11: Added requirement: Extension designers MAY add status codes, SHOULD register generic ones with IANA.</li>
</ul>
</section>

<section anchor="scalability-1" numbered="false"><name>Scalability</name>

<ul spacing="compact">
<li>Modified R11.3: Refined load balancing requirement (MUST support at URL level, MUST be possible without body processing).</li>
<li>Rewritten R11.5: Expanded async processing clause into R11.5 (MUST support async for multi-object/intensive/manual ops, specifying response mechanism).</li>
</ul>
</section>

<section anchor="performance-1" numbered="false"><name>Performance</name>

<ul spacing="compact">
<li>Rewritten R12.1: Changed requirement from MUST allow optional body to SHOULD be designed not to include body when not needed (references merge from old R3.4).</li>
<li>Modified R12.2: Added constraint: RPP MUST NOT mandate bulk/listing/filtering features where they negatively impact scalability/performance.</li>
<li>Removed Requirement R12.3: Requirement allowing compound object creation explicitly removed (linked to Issue #12).</li>
</ul>
</section>

<section anchor="internationalisation-3" numbered="false"><name>Internationalisation</name>

<ul spacing="compact">
<li>New Requirement R13.1: Added requirement: RPP MUST support internationalization for core/extension objects and messages.</li>
<li>New Requirement R13.2: Added requirement: RPP MUST support human-readable localized response messages. (Moved from old Representation section).</li>
</ul>
</section>

<section anchor="clients-1" numbered="false"><name>Clients</name>

<ul spacing="compact">
<li>New Requirement R14.1: Added requirement: RPP MUST support server applications as clients.</li>
<li>New Requirement R14.2: Added requirement: RPP MUST support CLI/desktop tool interaction.</li>
<li>New Requirement R14.3: Added requirement: RPP SHOULD support web browsers (e.g., SPAs) directly.</li>
<li>New Requirement R14.4: Added requirement: RPP SHOULD support mobile applications directly.</li>
</ul>
</section>

<section anchor="requirements-for-object-types-1" numbered="false"><name>Requirements for object types</name>

<ul spacing="compact">
<li>New Requirement D13.1 (Domain): Added requirement: RPP MUST support IDNs (UTF-8 and Punycode). (Moved from old Representation section).</li>
<li>New Requirement C5.1 (Contact): Added requirement: RPP SHOULD consider using JSContact <xref target="RFC9553"></xref> for contacts. (Moved from old Data Representation section).</li>
<li>New Requirement C13.1 (Contact): Added requirement: RPP MUST support i18n for Contact text fields (name, address, etc.).</li>
<li>New Requirement C13.2 (Contact): Added requirement: RPP MUST support internationalised Email addresses <xref target="RFC6530"></xref>.</li>
<li>New Requirement C13.3 (Contact): Added requirement: RPP MUST support multiple localized expressions of contact data.</li>
</ul>
</section>

<section anchor="appendix-a-extensions" numbered="false"><name>Appendix A. Extensions</name>

<ul spacing="compact">
<li>New Requirement A.1: Added requirement: An extension for a Search API.</li>
<li>New Requirement A.2: Added requirement: An extension allowing DNS operators to update DNSSEC key material.</li>
</ul>
</section>
</section>
</section>
</section>

</middle>

<back>
<references><name>Normative References</name>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml9/reference.BCP.56.xml"/>
<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.2119.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.6530.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.9110.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9553.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>

<section anchor="extensions"><name>Extensions</name>
<t><strong>A.1</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>A.2</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>A.3</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 ist included in the discovery service document.</t>

<aside><t>TODO: <eref target="https://github.com/ietf-wg-rpp/rpp-requirements/issues/57">Issue #57</eref></t>
<t>TODO: This list is far from being finished</t>
</aside>
</section>

</back>

</rfc>
