<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.4 (Ruby 2.6.4) -->
<?rfc tocindent="yes"?>
<?rfc strict="yes"?>
<?rfc compact="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc-ext html-pretty-print="prettyprint https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"?>
<rfc xmlns:x="http://purl.org/net/xml2rfc/ext"
      category="std"
      consensus="true"
      docName="draft-ietf-httpapi-idempotency-key-header-04"
      ipr="trust200902"
      sortRefs="true"
      symRefs="true"
      tocInclude="true">
   <x:feedback template="mailto:httpapi@ietf.org?subject={docname},%20%22{section}%22\&amp;amp;body=%3c{ref}%3e:"/>
   <front>
      <title>The Idempotency-Key HTTP Header Field</title>
      <author fullname="Jayadeba Jena" initials="J." surname="Jena">
         <address>
            <email>jayadebaj@gmail.com</email>
         </address>
      </author>
      <author fullname="Sanjay Dalal" initials="S." surname="Dalal">
         <address>
            <email>sanjay.dalal@cal.berkeley.edu</email>
            <uri>https://github.com/sdatspun2</uri>
         </address>
      </author>
      <date day="16" month="November" year="2023"/>
      <abstract><?line 36?>
         <t>The HTTP Idempotency-Key request header field can be used to carry idempotency key in order to make non-idempotent HTTP methods such as <spanx style="verb">POST</spanx> or <spanx style="verb">PATCH</spanx> fault-tolerant.</t>
      </abstract>
      <note removeInRFC="true" title="About This Document">
         <t>Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-httpapi-idempotency-key-header/"/>.</t>
         <t>Discussion of this document takes place on the HTTPAPI Working Group mailing list (<eref target="mailto:httpapi@ietf.org"/>), which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/httpapi/"/>. Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/httpapi/"/>. Working Group information can be found at <eref target="https://ietf-wg-httpapi.github.io/"/>.</t>
         <t>Source for this draft and an issue tracker can be found at <eref target="https://github.com/ietf-wg-httpapi/idempotency"/>.</t>
      </note>
   </front>
   <middle><?line 40?>
      <section anchor="introduction">
         <name>Introduction</name>
         <t>Idempotence is the property of certain operations in mathematics and computer science whereby they can be applied multiple times without changing the result beyond the initial application. It does not matter if the operation is called only once, or 10s of times over.</t>
         <t>Idempotency is important in building a fault-tolerant HTTP API. An HTTP request method is considered <spanx style="verb">idempotent</spanx> if the intended effect on the server of multiple identical requests with that method is the same as the effect for a single such request. According to <xref target="RFC7231"/>, HTTP methods <spanx style="verb">OPTIONS</spanx>, <spanx style="verb">HEAD</spanx>, <spanx style="verb">GET</spanx>, <spanx style="verb">PUT</spanx> and <spanx style="verb">DELETE</spanx> are idempotent while methods <spanx style="verb">POST</spanx> and <spanx style="verb">PATCH</spanx> are not.</t>
         <t>Let's say a client of an HTTP API wants to create (or update) a resource using a <spanx style="verb">POST</spanx> method. Since <spanx style="verb">POST</spanx> is NOT an idempotent method, calling it multiple times can result in duplication or wrong updates. Consider a scenario where the client sent a <spanx style="verb">POST</spanx> request to the server, but it got a timeout. Following questions arise : Is the resource actually created (or updated)? Did the timeout occur during sending of the request, or when receiving of the response? Can the client safely retry the request, or does it need to figure out what happened in the first place? If <spanx style="verb">POST</spanx> had been an idempotent method, such questions may not arise. Client would safely retry a request until it actually gets a valid response from the server.</t>
         <t>For many use cases of HTTP APIs, duplicated resources are a severe problem from a business perspective. For example, duplicate records for requests involving any kind of money transfer <spanx style="verb">MUST NOT</spanx> be allowed. In other cases, processing of duplicate webhook delivery is not expected.</t>
         <section anchor="notational-conventions">
            <name>Notational Conventions</name>
            <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as described in BCP 14 <xref target="RFC2119"/>
               <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shown here.</t>
            <?line -18?>
            <t>This specification uses the Augmented Backus-Naur Form (ABNF) notation of <xref target="RFC5234"/> and includes, by reference, the IMF-fixdate rule as defined in <xref target="RFC7231" x:fmt="of" x:sec="7.1.1.1"/>.</t>
            <t>The term "resource" is to be interpreted as defined in <xref target="RFC7231" x:fmt="of" x:sec="2"/>, that is identified by an URI. The term "resource server" is to be interpreted as "origin server" as defined in <xref target="RFC7231" x:fmt="of" x:sec="3"/>.</t>
         </section>
      </section>
      <section anchor="the-idempotency-key-http-request-header-field">
         <name>The Idempotency-Key HTTP Request Header Field</name>
         <t>An idempotency key is a unique value generated by the client which the resource server uses to recognize subsequent retries of the same request. The <spanx style="verb">Idempotency-Key</spanx> HTTP request header field carries this key.</t>
         <section anchor="syntax">
            <name>Syntax</name>
            <t>
               <spanx style="verb">Idempotency-Key</spanx> is an Item Structured Header <xref target="RFC8941"/>. Its value <bcp14>MUST</bcp14> be a String. Refer to <xref target="RFC8941" x:fmt="of" x:sec="3.3.3"/> for ABNF of <spanx style="verb">sf-string</spanx>:</t>
            <figure>
               <artwork>
Idempotency-Key = sf-string
</artwork>
            </figure>
            <t>Clients <bcp14>MUST NOT</bcp14> include more than one <spanx style="verb">Idempotency-Key</spanx> header field in the same request.</t>
            <t>The following example shows an idempotency key using <spanx style="verb">UUID</spanx>
               <xref target="RFC4122"/>:</t>
            <figure>
               <artwork>
Idempotency-Key: "8e03978e-40d5-43e8-bc93-6894a57f9324"
</artwork>
            </figure>
         </section>
         <section anchor="uniqueness-of-idempotency-key">
            <name>Uniqueness of Idempotency Key</name>
            <t>The idempotency key that is supplied as part of every <spanx style="verb">POST</spanx> request <bcp14>MUST</bcp14> be unique and <bcp14>MUST NOT</bcp14> be reused with another request with a different request payload.</t>
            <t>Uniqueness of the key <bcp14>MUST</bcp14> be defined by the resource owner and <bcp14>MUST</bcp14> be implemented by the clients of the resource server. It is <bcp14>RECOMMENDED</bcp14> that <spanx style="verb">UUID</spanx>
               <xref target="RFC4122"/> or a similar random identifier be used as an idempotency key.</t>
         </section>
         <section anchor="idempotency-key-validity-and-expiry">
            <name>Idempotency Key Validity and Expiry</name>
            <t>The resource <bcp14>MAY</bcp14> enforce time based idempotency keys, thus, be able to purge or delete a key upon its expiry. The resource server <bcp14>SHOULD</bcp14> define such expiration policy and publish it in the documentation.</t>
         </section>
         <section anchor="idempotency-fingerprint">
            <name>Idempotency Fingerprint</name>
            <t>An idempotency fingerprint <bcp14>MAY</bcp14> be used in conjunction with an idempotency key to determine the uniqueness of a request. Such a fingerprint is generated from request payload data by the resource server. An idempotency fingerprint generation algorithm <bcp14>MAY</bcp14> use one of the following or similar approaches to create a fingerprint.</t>
            <t>
               <list style="symbols">
                  <t>Checksum of the entire request payload.</t>
                  <t>Checksum of selected element(s) in the request payload.</t>
                  <t>Field value match for each field in the request payload.</t>
                  <t>Field value match for selected element(s) in the request payload.</t>
                  <t>Request digest/signature.</t>
               </list>
            </t>
         </section>
         <section anchor="responsibilities">
            <name>Responsibilities</name>
            <t>Client</t>
            <t>Clients of HTTP API requiring idempotency, <bcp14>SHOULD</bcp14> understand the idempotency related requirements as published by the server and use appropriate algorithm to generate idempotency keys.</t>
            <t>Clients <bcp14>MAY</bcp14> choose to send an Idempotency-Key field with any valid random sf-string to indicate the user's intent is to only perform this action once. Without a priori knowledge, a general client cannot assume the server will respect this request.</t>
            <t>For each request, client <bcp14>SHOULD</bcp14>
            </t>
            <t>
               <list style="symbols">
                  <t>Send a unique idempotency key in the HTTP <spanx style="verb">Idempotency-Key</spanx> request header field.</t>
               </list>
            </t>
            <t>Resource Server</t>
            <t>Resource server <bcp14>MUST</bcp14> publish idempotency related specification. This specification <bcp14>MUST</bcp14> include expiration related policy if applicable. Server is responsible for managing the lifecycle of the idempotency key.</t>
            <t>For each request, server <bcp14>SHOULD</bcp14>
            </t>
            <t>
               <list style="symbols">
                  <t>Identify idempotency key from the HTTP <spanx style="verb">Idempotency-Key</spanx> request header field.</t>
                  <t>Generate idempotency fingerprint if required.</t>
                  <t>Check for idempotency considering various scenarios including the ones described in section below.</t>
               </list>
            </t>
         </section>
         <section anchor="idempotency-enforcement-scenarios">
            <name>Idempotency Enforcement Scenarios</name>
            <t>
               <list style="symbols">
                  <t>First time request (idempotency key and fingerprint has not been seen) <vspace blankLines="1"/> The resource server <bcp14>SHOULD</bcp14> process the request normally and respond with an appropriate response and status code.</t>
                  <t>Duplicate request (idempotency key and fingerprint has been seen) <vspace blankLines="1"/> Retry <vspace blankLines="1"/> The request was retried after the original request completed. The resource server <bcp14>SHOULD</bcp14> respond with the result of the previously completed operation, success or an error. See Error Scenarios for details on errors. <vspace blankLines="1"/> Concurrent Request <vspace blankLines="1"/> The request was retried before the original request completed. The resource server <bcp14>SHOULD</bcp14> respond with a resource conflict error. See Error Scenarios for details.</t>
               </list>
            </t>
         </section>
         <section anchor="error-scenarios">
            <name>Error Scenarios</name>
            <t>If the <spanx style="verb">Idempotency-Key</spanx> request header is missing for a documented idempotent operation requiring this header, the resource server <bcp14>SHOULD</bcp14> reply with an HTTP <spanx style="verb">400</spanx> status code with body containing a link pointing to relevant documentation. Following examples shows an error response describing the problem using <xref target="RFC7807"/>.</t>
            <figure>
               <artwork>
HTTP/1.1 400 Bad Request
Content-Type: application/problem+json
Content-Language: en
{
  "type": "https://developer.example.com/idempotency",
  "title": "Idempotency-Key is missing",
  "detail": "This operation is idempotent and it requires correct
   usage of Idempotency Key.",
}
</artwork>
            </figure>
            <t>Alternately, using the HTTP header <spanx style="verb">Link</spanx>, the client can be informed about the error as shown below.</t>
            <figure>
               <artwork>
HTTP/1.1 400 Bad Request
Link: &lt;https://developer.example.com/idempotency&gt;;
  rel="describedby"; type="text/html"
</artwork>
            </figure>
            <t>If there is an attempt to reuse an idempotency key with a different request payload, the resource server <bcp14>SHOULD</bcp14> reply with a HTTP <spanx style="verb">422</spanx> status code with body containing a link pointing to relevant documentation. The status code <spanx style="verb">422</spanx> is defined in <xref target="RFC4918" x:fmt="of" x:sec="11.2"/>.</t>
            <figure>
               <artwork>
HTTP/1.1 422 Unprocessable Content
Content-Type: application/problem+json
Content-Language: en
{
  "type": "https://developer.example.com/idempotency",
  "title": "Idempotency-Key is already used",
  "detail": "This operation is idempotent and it requires
  correct usage of Idempotency Key. Idempotency Key MUST not be
  reused across different payloads of this operation.",
}
</artwork>
            </figure>
            <t>The server can also inform the client by using the HTTP header <spanx style="verb">Link</spanx> as shown below.</t>
            <figure>
               <artwork>
HTTP/1.1 422 Unprocessable Content
Link: &lt;https://developer.example.com/idempotency&gt;;
rel="describedby"; type="text/html"
</artwork>
            </figure>
            <t>If the request is retried, while the original request is still being processed, the resource server <bcp14>SHOULD</bcp14> reply with an HTTP <spanx style="verb">409</spanx> status code with body containing problem description.</t>
            <figure>
               <artwork>
HTTP/1.1 409 Conflict
Content-Type: application/problem+json
Content-Language: en
{
  "type": "https://developer.example.com/idempotency",
  "title": "A request is outstanding for this Idempotency-Key",
  "detail": "A request with the same Idempotency-Key for the
  same operation is being processed or is outstanding.",
}
</artwork>
            </figure>
            <t>Or, alternately using the HTTP header <spanx style="verb">Link</spanx> pointing to the relevant documentation</t>
            <figure>
               <artwork>
HTTP/1.1 409 Conflict
Link: &lt;https://developer.example.com/idempotency&gt;;
rel="describedby"; type="text/html"
</artwork>
            </figure>
            <t>Error scenarios above describe the status of failed idempotent requests after the resource server prcocesses them. Clients <bcp14>MUST</bcp14> correct the requests (with the exception of 409 where no correction is required) before performing a retry operation, or the the resource server <bcp14>MUST</bcp14> fail the request and return one of the above errors.</t>
            <t>For other 4xx/5xx errors, such as 401, 403, 500, 502, 503, 504, 429, or any other HTTP error code that is not listed here, the client <bcp14>SHOULD</bcp14> act appropriately by following the resource server's documentation.</t>
         </section>
      </section>
      <section anchor="iana-considerations">
         <name>IANA Considerations</name>
         <section anchor="the-idempotency-key-http-request-header-field-1">
            <name>The Idempotency-Key HTTP Request Header Field</name>
            <t>The Idempotency-Key field name should be added to the "Hypertext Transfer Protocol (HTTP) Field Name Registry".</t>
            <dl>
               <dt>Field Name:</dt>
               <dd>
                  <t>Idempotency-Key</t>
               </dd>
               <dt>Status:</dt>
               <dd>
                  <t>permanent</t>
               </dd>
               <dt>Specification document:</dt>
               <dd>
                  <t>This specification, Section 2</t>
               </dd>
            </dl>
         </section>
      </section>
      <section anchor="implementation-status">
         <name>Implementation Status</name>
         <t>Note to RFC Editor: Please remove this section before publication.</t>
         <t>This section records the status of known implementations of the protocol defined by this specification at the time of posting of this Internet-Draft, and is based on a proposal described in <xref target="RFC7942"/>. The description of implementations in this section is intended to assist the IETF in its decision processes in progressing drafts to RFCs. Please note that the listing of any individual implementation here does not imply endorsement by the IETF. Furthermore, no effort has been spent to verify the information presented here that was supplied by IETF contributors. This is not intended as, and must not be construed to be, a catalog of available implementations or their features. Readers are advised to note that other implementations may exist.</t>
         <t>According to RFC 7942, "this will allow reviewers and working groups to assign due consideration to documents that have the benefit of running code, which may serve as evidence of valuable experimentation and feedback that have made the implemented protocols more mature. It is up to the individual working groups to use this information as they see fit".</t>
         <t>Organization: Stripe</t>
         <t>
            <list style="symbols">
               <t>Description: Stripe uses custom HTTP header named <spanx style="verb">Idempotency-Key</spanx>
               </t>
               <t>Reference: https://stripe.com/docs/idempotency</t>
            </list>
         </t>
         <t>Organization: Adyen</t>
         <t>
            <list style="symbols">
               <t>Description: Adyen uses custom HTTP header named <spanx style="verb">Idempotency-Key</spanx>
               </t>
               <t>Reference: https://docs.adyen.com/development-resources/api-idempotency/</t>
            </list>
         </t>
         <t>Organization: Dwolla</t>
         <t>
            <list style="symbols">
               <t>Description: Dwolla uses custom HTTP header named <spanx style="verb">Idempotency-Key</spanx>
               </t>
               <t>Reference: https://docs.dwolla.com/</t>
            </list>
         </t>
         <t>Organization: Interledger</t>
         <t>
            <list style="symbols">
               <t>Description: Interledger uses custom HTTP header named <spanx style="verb">Idempotency-Key</spanx>
               </t>
               <t>Reference: https://github.com/interledger/</t>
            </list>
         </t>
         <t>Organization: WorldPay</t>
         <t>
            <list style="symbols">
               <t>Description: WorldPay uses custom HTTP header named <spanx style="verb">Idempotency-Key</spanx>
               </t>
               <t>Reference: https://developer.worldpay.com/docs/wpg/idempotency</t>
            </list>
         </t>
         <t>Organization: Yandex</t>
         <t>
            <list style="symbols">
               <t>Description: Yandex uses custom HTTP header named <spanx style="verb">Idempotency-Key</spanx>
               </t>
               <t>Reference: https://cloud.yandex.com/docs/api-design-guide/concepts/idempotency</t>
            </list>
         </t>
         <t>Organization: http4s.org</t>
         <t>
            <list style="symbols">
               <t>Description: Http4s is a minimal, idiomatic Scala interface for HTTP services.</t>
               <t>Reference: https://github.com/http4s/http4s</t>
            </list>
         </t>
         <t>Organization: Finastra</t>
         <t>
            <list style="symbols">
               <t>Description: Finastra uses custom HTTP header named <spanx style="verb">Idempotency-Key</spanx>
               </t>
               <t>Reference: https://developer.fusionfabric.cloud/</t>
            </list>
         </t>
         <t>Organization: Datatrans</t>
         <t>
            <list style="symbols">
               <t>Description: Datatrans focuses on the technical processing of payments, including hosting smart payment forms and correctly routing payment information.</t>
               <t>Reference: https://docs.datatrans.ch/docs/api-endpoints</t>
            </list>
         </t>
         <section anchor="implementing-the-concept">
            <name>Implementing the Concept</name>
            <t>This is a list of implementations that implement the general concept, but do so using different mechanisms:</t>
            <t>Organization: Django</t>
            <t>
               <list style="symbols">
                  <t>Description: Django uses custom HTTP header named <spanx style="verb">HTTP_IDEMPOTENCY_KEY</spanx>
                  </t>
                  <t>Reference: https://pypi.org/project/django-idempotency-key</t>
               </list>
            </t>
            <t>Organization: Twilio</t>
            <t>
               <list style="symbols">
                  <t>Description: Twilio uses custom HTTP header named <spanx style="verb">I-Twilio-Idempotency-Token</spanx> in webhooks</t>
                  <t>Reference: https://www.twilio.com/docs/usage/webhooks/webhooks-connection-overrides</t>
               </list>
            </t>
            <t>Organization: PayPal</t>
            <t>
               <list style="symbols">
                  <t>Description: PayPal uses custom HTTP header named <spanx style="verb">PayPal-Request-Id</spanx>
                  </t>
                  <t>Reference: https://developer.paypal.com/docs/business/develop/idempotency</t>
               </list>
            </t>
            <t>Organization: RazorPay</t>
            <t>
               <list style="symbols">
                  <t>Description: RazorPay uses custom HTTP header named <spanx style="verb">X-Payout-Idempotency</spanx>
                  </t>
                  <t>Reference: https://razorpay.com/docs/razorpayx/api/idempotency/</t>
               </list>
            </t>
            <t>Organization: OpenBanking</t>
            <t>
               <list style="symbols">
                  <t>Description: OpenBanking uses custom HTTP header called <spanx style="verb">x-idempotency-key</spanx>
                  </t>
                  <t>Reference: https://openbankinguk.github.io/read-write-api-site3/v3.1.6/profiles/read-write-data-api-profile.html#request-headers</t>
               </list>
            </t>
            <t>Organization: Square</t>
            <t>
               <list style="symbols">
                  <t>Description: To make an idempotent API call, Square recommends adding a property named <spanx style="verb">idempotency_key</spanx> with a unique value in the request body.</t>
                  <t>Reference: https://developer.squareup.com/docs/build-basics/using-rest-api</t>
               </list>
            </t>
            <t>Organization: Google Standard Payments</t>
            <t>
               <list style="symbols">
                  <t>Description: Google Standard Payments API uses a property named <spanx style="verb">requestId</spanx> in request body in order to provider idempotency in various use cases.</t>
                  <t>Reference: https://developers.google.com/standard-payments/payment-processor-service-api/rest/v1/TopLevel/capture</t>
               </list>
            </t>
            <t>Organization: BBVA</t>
            <t>
               <list style="symbols">
                  <t>Description: BBVA Open Platform uses custom HTTP header called <spanx style="verb">X-Unique-Transaction-ID</spanx>
                  </t>
                  <t>Reference: https://bbvaopenplatform.com/apiReference/APIbasics/content/x-unique-transaction-id</t>
               </list>
            </t>
            <t>Organization: WebEngage</t>
            <t>
               <list style="symbols">
                  <t>Description: WebEngage uses custom HTTP header called <spanx style="verb">x-request-id</spanx> to identify webhook POST requests uniquely to achieve events idempotency.</t>
                  <t>Reference: https://docs.webengage.com/docs/webhooks</t>
               </list>
            </t>
         </section>
      </section>
      <section anchor="security-considerations">
         <name>Security Considerations</name>
         <t>This section is meant to inform developers, information providers, and users of known security concerns specific to the idempotency keys.</t>
         <t>Resource servers that do not implement strong idempotency keys, such as UUIDs, or have appropriate controls to validate the idempotency keys, could be victim to various forms of security attacks from malicious clients:</t>
         <t>
            <list style="symbols">
               <t>Injection attacks-When the resource server does not validate the idempotency key in the client request and performs a idempotent cache lookup, there can be security attacks (primarily in the form of injection), compromising the server.</t>
               <t>Data leaks-When an idempotency implementation allows low entropy keys, attackers <bcp14>MAY</bcp14> determine other keys and use them to fetch existing idempotent cache entries, belonging to other clients.</t>
            </list>
         </t>
         <t>To prevent such situations, the specification recommends the following best practices for idempotency key implementation in the resource server.</t>
         <t>
            <list style="symbols">
               <t>Establish a fixed format for the idempotency key and publish the key’s specification.</t>
               <t>Always validate the key as per its published specification before processing any request.</t>
               <t>On the resource server, implement a unique composite key as the idempotent cache lookup key. For example, a composite key <bcp14>MAY</bcp14> be implemented by combining the idempotency key sent by the client with other client specific attributes known only to the resource server.</t>
            </list>
         </t>
      </section>
      <section anchor="examples">
         <name>Examples</name>
         <t>The first example shows an idempotency-key header field with key value using UUID version 4 scheme:</t>
         <figure>
            <artwork>
Idempotency-Key: "8e03978e-40d5-43e8-bc93-6894a57f9324"
</artwork>
         </figure>
         <t>Second example shows an idempotency-key header field with key value using some random string generator:</t>
         <figure>
            <artwork>
Idempotency-Key: "clkyoesmbgybucifusbbtdsbohtyuuwz"
</artwork>
         </figure>
      </section>
   </middle>
   <back>
      <references anchor="sec-normative-references" title="Normative References">
         <reference anchor="RFC7231">
            <front>
               <title>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</title>
               <author fullname="R. Fielding"
                        initials="R."
                        role="editor"
                        surname="Fielding"/>
               <author fullname="J. Reschke"
                        initials="J."
                        role="editor"
                        surname="Reschke"/>
               <date month="June" year="2014"/>
            </front>
            <seriesInfo name="RFC" value="7231"/>
            <seriesInfo name="DOI" value="10.17487/RFC7231"/>
         </reference>
         <reference anchor="RFC2119">
            <front>
               <title>Key words for use in RFCs to Indicate Requirement Levels</title>
               <author fullname="S. Bradner" initials="S." surname="Bradner"/>
               <date month="March" year="1997"/>
            </front>
            <seriesInfo name="BCP" value="14"/>
            <seriesInfo name="RFC" value="2119"/>
            <seriesInfo name="DOI" value="10.17487/RFC2119"/>
         </reference>
         <reference anchor="RFC8174">
            <front>
               <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
               <author fullname="B. Leiba" initials="B." surname="Leiba"/>
               <date month="May" year="2017"/>
            </front>
            <seriesInfo name="BCP" value="14"/>
            <seriesInfo name="RFC" value="8174"/>
            <seriesInfo name="DOI" value="10.17487/RFC8174"/>
         </reference>
         <reference anchor="RFC5234">
            <front>
               <title>Augmented BNF for Syntax Specifications: ABNF</title>
               <author fullname="D. Crocker"
                        initials="D."
                        role="editor"
                        surname="Crocker"/>
               <author fullname="P. Overell" initials="P." surname="Overell"/>
               <date month="January" year="2008"/>
            </front>
            <seriesInfo name="STD" value="68"/>
            <seriesInfo name="RFC" value="5234"/>
            <seriesInfo name="DOI" value="10.17487/RFC5234"/>
         </reference>
         <reference anchor="RFC8941">
            <front>
               <title>Structured Field Values for HTTP</title>
               <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
               <author fullname="P-H. Kamp" surname="P-H. Kamp"/>
               <date month="February" year="2021"/>
            </front>
            <seriesInfo name="RFC" value="8941"/>
            <seriesInfo name="DOI" value="10.17487/RFC8941"/>
         </reference>
         <reference anchor="RFC4122">
            <front>
               <title>A Universally Unique IDentifier (UUID) URN Namespace</title>
               <author fullname="P. Leach" initials="P." surname="Leach"/>
               <author fullname="M. Mealling" initials="M." surname="Mealling"/>
               <author fullname="R. Salz" initials="R." surname="Salz"/>
               <date month="July" year="2005"/>
            </front>
            <seriesInfo name="RFC" value="4122"/>
            <seriesInfo name="DOI" value="10.17487/RFC4122"/>
         </reference>
         <reference anchor="RFC7807">
            <front>
               <title>Problem Details for HTTP APIs</title>
               <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
               <author fullname="E. Wilde" initials="E." surname="Wilde"/>
               <date month="March" year="2016"/>
            </front>
            <seriesInfo name="RFC" value="7807"/>
            <seriesInfo name="DOI" value="10.17487/RFC7807"/>
         </reference>
         <reference anchor="RFC4918">
            <front>
               <title>HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)</title>
               <author fullname="L. Dusseault"
                        initials="L."
                        role="editor"
                        surname="Dusseault"/>
               <date month="June" year="2007"/>
            </front>
            <seriesInfo name="RFC" value="4918"/>
            <seriesInfo name="DOI" value="10.17487/RFC4918"/>
         </reference>
         <reference anchor="RFC7230">
            <front>
               <title>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</title>
               <author fullname="R. Fielding"
                        initials="R."
                        role="editor"
                        surname="Fielding"/>
               <author fullname="J. Reschke"
                        initials="J."
                        role="editor"
                        surname="Reschke"/>
               <date month="June" year="2014"/>
            </front>
            <seriesInfo name="RFC" value="7230"/>
            <seriesInfo name="DOI" value="10.17487/RFC7230"/>
         </reference>
      </references>
      <references anchor="sec-informative-references" title="Informative References">
         <reference anchor="RFC7942">
            <front>
               <title>Improving Awareness of Running Code: The Implementation Status Section</title>
               <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
               <author fullname="A. Farrel" initials="A." surname="Farrel"/>
               <date month="July" year="2016"/>
            </front>
            <seriesInfo name="BCP" value="205"/>
            <seriesInfo name="RFC" value="7942"/>
            <seriesInfo name="DOI" value="10.17487/RFC7942"/>
         </reference>
      </references>
      <?line 379?>
      <section anchor="imported-abnf">
         <name>Imported ABNF</name>
         <t>The following core rules are included by reference, as defined in <xref target="RFC5234" x:fmt="of" x:sec="B.1"/>: ALPHA (letters), CR (carriage return), CRLF (CR LF), CTL (controls), DIGIT (decimal 0-9), DQUOTE (double quote), HEXDIG (hexadecimal 0-9/A-F/a-f), LF (line feed), OCTET (any 8-bit sequence of data), SP (space), and VCHAR (any visible US-ASCII character).</t>
         <t>The rules below are defined in <xref target="RFC7230"/>:</t>
         <figure>
            <artwork>
 obs-text      = &lt;obs-text, see [RFC7230], Section 3.2.6&gt;
</artwork>
         </figure>
      </section>
      <section anchor="acknowledgments" numbered="false">
         <name>Acknowledgments</name>
         <t>The authors would like to thank Mark Nottingham for his support for this Internet Draft. We would like to acknowledge that this draft is inspired by Idempotency related patterns described in API documentation of <eref target="https://github.com/paypal/api-standards/blob/master/patterns.md#idempotency">PayPal</eref> and <eref target="https://stripe.com/docs/idempotency">Stripe</eref> as well as Internet Draft on <eref target="https://tools.ietf.org/html/draft-nottingham-http-poe-00">POST Once Exactly</eref> authored by Mark Nottingham.</t>
         <t>The authors take all responsibility for errors and omissions.</t>
      </section>
   </back>
</rfc>
