<?xml version="1.0" encoding="utf-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.4.18 -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

<?rfc toc="yes"?>
<?rfc tocindent="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc strict="yes"?>
<?rfc compact="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>

<rfc ipr="trust200902" docName="draft-ietf-httpapi-idempotency-key-header-01" category="std">

  <front>
    <title>The Idempotency-Key HTTP Header Field</title>

    <author initials="J." surname="Jena" fullname="Jayadeba Jena">
      <organization></organization>
      <address>
        <email>jayadebaj@gmail.com</email>
      </address>
    </author>
    <author initials="S." surname="Dalal" fullname="Sanjay Dalal">
      <organization></organization>
      <address>
        <email>sanjay.dalal@cal.berkeley.edu</email>
        <uri>https://github.com/sdatspun2</uri>
      </address>
    </author>

    <date year="2022" month="May" day="08"/>

    
    
    

    <abstract>


<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>


  </front>

  <middle>


<section anchor="introduction" title="Introduction">

<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. The result SHOULD be the same.</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" title="Notational Conventions">

<t>{::boilerplate bcp14-tagged}</t>

<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 Section 7.1.1.1 of <xref target="RFC7231"/>.</t>

<t>The term “resource” is to be interpreted as defined in Section 2 of <xref target="RFC7231"/>, that is identified by an URI. The term “resource server” is to be interpreted as “origin server” as defined in Section 3 of <xref target="RFC7231"/>.</t>

</section>
</section>
<section anchor="the-idempotency-key-http-request-header-field" title="The Idempotency-Key HTTP Request Header Field">

<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" title="Syntax">

<t><spanx style="verb">Idempotency-Key</spanx> is an Item Structured Header <xref target="RFC8941"/>. Its value MUST be a String. Refer to Section 3.3.3 of <xref target="RFC8941"/> for ABNF of <spanx style="verb">sf-string</spanx>:</t>

<figure><artwork><![CDATA[
Idempotency-Key = sf-string
]]></artwork></figure>

<t>Clients MUST NOT 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><![CDATA[
Idempotency-Key: "8e03978e-40d5-43e8-bc93-6894a57f9324"
]]></artwork></figure>

</section>
<section anchor="uniqueness-of-idempotency-key" title="Uniqueness of Idempotency Key">

<t>The idempotency key that is supplied as part of every <spanx style="verb">POST</spanx> request MUST be unique and MUST NOT be reused with another request with a different request payload.</t>

<t>Uniqueness of the key MUST be defined by the resource owner and MUST be implemented by the clients of the resource server. It is RECOMMENDED 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" title="Idempotency Key Validity and Expiry">

<t>The resource MAY enforce time based idempotency keys, thus, be able to purge or delete a key upon its expiry. The resource server SHOULD define such expiration policy and publish it in the documentation.</t>

</section>
<section anchor="idempotency-fingerprint" title="Idempotency Fingerprint">

<t>An idempotency fingerprint MAY 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 MAY 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" title="Responsibilities">

<t>Client</t>

<t>Clients of HTTP API requiring idempotency, SHOULD understand the idempotency related requirements as published by the server and use appropriate algorithm to generate idempotency keys.</t>

<t>For each request, client SHOULD</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 MUST publish idempotency related specification. This specification MUST include expiration related policy if applicable. Server is responsible for managing the lifecycle of the idempotency key.</t>

<t>For each request, server SHOULD</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" title="Idempotency Enforcement Scenarios">

<t><list style="symbols">
  <t>First time request (idempotency key and fingerprint has not been seen)  <vspace blankLines='1'/>
The resource server SHOULD 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 SHOULD 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 MUST respond with a resource conflict error. See Error Scenarios for details.</t>
</list></t>

</section>
<section anchor="error-scenarios" title="Error Scenarios">

<t>If the <spanx style="verb">Idempotency-Key</spanx> request header is missing for a documented idempotent operation requiring this header, the resource server SHOULD reply with an HTTP <spanx style="verb">400</spanx> status code with body containing a link pointing to relevant documentation. Alternately, using the HTTP header <spanx style="verb">Link</spanx>, the client can be informed about the error as shown below.</t>

<figure><artwork><![CDATA[
HTTP/1.1 400 Bad Request
Link: <https://developer.example.com/idempotency>;
  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 SHOULD 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 Section 11.2 of <xref target="RFC4918"/>. The server can also inform the client by using the HTTP header <spanx style="verb">Link</spanx> as shown below.</t>

<figure><artwork><![CDATA[
HTTP/1.1 422 Unprocessable Entity
Link: <https://developer.example.com/idempotency>;
rel="describedby"; type="text/html"
]]></artwork></figure>

<t>If the request is retried, while the original request is still being processed, the resource server SHOULD reply with an HTTP <spanx style="verb">409</spanx> status code with body containing a link or the HTTP header <spanx style="verb">Link</spanx> pointing to the relevant documentation.</t>

<figure><artwork><![CDATA[
HTTP/1.1 409 Conflict
Link: <https://developer.example.com/idempotency>;
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 MUST correct the requests (with the execption of 409 where no correction is required) before performing a retry operation, or the the resource server MUST 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 SHOULD act appropriately by following the resource server’s documentation.</t>

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

<section anchor="the-idempotency-key-http-request-header-field-1" title="The Idempotency-Key HTTP Request Header Field">

<t>The Idempotency-Key field name should be added to the “Hypertext Transfer Protocol (HTTP) Field Name Registry”.</t>

<t><list style="hanging">
  <t hangText="Field Name:">
  Idempotency-Key</t>
  <t hangText="Status:">
  permanent</t>
  <t hangText="Specification document:">
  This specification, Section 2</t>
</list></t>

</section>
</section>
<section anchor="implementation-status" title="Implementation Status">

<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" title="Implementing the Concept">

<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" title="Security Considerations">

<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 MAY 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 MAY 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" title="Examples">

<t>The first example shows an idempotency-key header field with key value using UUID version 4 scheme:</t>

<figure><artwork><![CDATA[
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><![CDATA[
Idempotency-Key: "clkyoesmbgybucifusbbtdsbohtyuuwz"
]]></artwork></figure>

</section>


  </middle>

  <back>

    <references title='Normative References'>





<reference anchor='RFC7231' target='https://www.rfc-editor.org/info/rfc7231'>
<front>
<title>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</title>
<author fullname='R. Fielding' initials='R.' role='editor' surname='Fielding'><organization/></author>
<author fullname='J. Reschke' initials='J.' role='editor' surname='Reschke'><organization/></author>
<date month='June' year='2014'/>
<abstract><t>The Hypertext Transfer Protocol (HTTP) is a stateless \%application- level protocol for distributed, collaborative, hypertext information systems.  This document defines the semantics of HTTP/1.1 messages, as expressed by request methods, request header fields, response status codes, and response header fields, along with the payload of messages (metadata and body content) and mechanisms for content negotiation.</t></abstract>
</front>
<seriesInfo name='RFC' value='7231'/>
<seriesInfo name='DOI' value='10.17487/RFC7231'/>
</reference>



<reference anchor='RFC5234' target='https://www.rfc-editor.org/info/rfc5234'>
<front>
<title>Augmented BNF for Syntax Specifications: ABNF</title>
<author fullname='D. Crocker' initials='D.' role='editor' surname='Crocker'><organization/></author>
<author fullname='P. Overell' initials='P.' surname='Overell'><organization/></author>
<date month='January' year='2008'/>
<abstract><t>Internet technical specifications often need to define a formal syntax.  Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications.  The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power.  The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges.  This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='STD' value='68'/>
<seriesInfo name='RFC' value='5234'/>
<seriesInfo name='DOI' value='10.17487/RFC5234'/>
</reference>



<reference anchor='RFC8941' target='https://www.rfc-editor.org/info/rfc8941'>
<front>
<title>Structured Field Values for HTTP</title>
<author fullname='M. Nottingham' initials='M.' surname='Nottingham'><organization/></author>
<author fullname='P-H. Kamp' initials='P-H.' surname='Kamp'><organization/></author>
<date month='February' year='2021'/>
<abstract><t>This document describes a set of data types and associated algorithms that are intended to make it easier and safer to define and handle HTTP header and trailer fields, known as &quot;Structured Fields&quot;, &quot;Structured Headers&quot;, or &quot;Structured Trailers&quot;. It is intended for use by specifications of new HTTP fields that wish to use a common syntax that is more restrictive than traditional HTTP field values.</t></abstract>
</front>
<seriesInfo name='RFC' value='8941'/>
<seriesInfo name='DOI' value='10.17487/RFC8941'/>
</reference>



<reference anchor='RFC4122' target='https://www.rfc-editor.org/info/rfc4122'>
<front>
<title>A Universally Unique IDentifier (UUID) URN Namespace</title>
<author fullname='P. Leach' initials='P.' surname='Leach'><organization/></author>
<author fullname='M. Mealling' initials='M.' surname='Mealling'><organization/></author>
<author fullname='R. Salz' initials='R.' surname='Salz'><organization/></author>
<date month='July' year='2005'/>
<abstract><t>This specification defines a Uniform Resource Name namespace for UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally Unique IDentifier).  A UUID is 128 bits long, and can guarantee uniqueness across space and time.  UUIDs were originally used in the Apollo Network Computing System and later in the Open Software Foundation\'s (OSF) Distributed Computing Environment (DCE), and then in Microsoft Windows platforms.</t><t>This specification is derived from the DCE specification with the kind permission of the OSF (now known as The Open Group).  Information from earlier versions of the DCE specification have been incorporated into this document.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='4122'/>
<seriesInfo name='DOI' value='10.17487/RFC4122'/>
</reference>



<reference anchor='RFC4918' target='https://www.rfc-editor.org/info/rfc4918'>
<front>
<title>HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)</title>
<author fullname='L. Dusseault' initials='L.' role='editor' surname='Dusseault'><organization/></author>
<date month='June' year='2007'/>
<abstract><t>Web Distributed Authoring and Versioning (WebDAV) consists of a set of methods, headers, and content-types ancillary to HTTP/1.1 for the management of resource properties, creation and management of resource collections, URL namespace manipulation, and resource locking (collision avoidance).</t><t>RFC 2518 was published in February 1999, and this specification obsoletes RFC 2518 with minor revisions mostly due to interoperability experience.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='4918'/>
<seriesInfo name='DOI' value='10.17487/RFC4918'/>
</reference>



<reference anchor='RFC7230' target='https://www.rfc-editor.org/info/rfc7230'>
<front>
<title>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</title>
<author fullname='R. Fielding' initials='R.' role='editor' surname='Fielding'><organization/></author>
<author fullname='J. Reschke' initials='J.' role='editor' surname='Reschke'><organization/></author>
<date month='June' year='2014'/>
<abstract><t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems.  This document provides an overview of HTTP architecture and its associated terminology, defines the &quot;http&quot; and &quot;https&quot; Uniform Resource Identifier (URI) schemes, defines the HTTP/1.1 message syntax and parsing requirements, and describes related security concerns for implementations.</t></abstract>
</front>
<seriesInfo name='RFC' value='7230'/>
<seriesInfo name='DOI' value='10.17487/RFC7230'/>
</reference>




    </references>

    <references title='Informative References'>





<reference anchor='RFC7942' target='https://www.rfc-editor.org/info/rfc7942'>
<front>
<title>Improving Awareness of Running Code: The Implementation Status Section</title>
<author fullname='Y. Sheffer' initials='Y.' surname='Sheffer'><organization/></author>
<author fullname='A. Farrel' initials='A.' surname='Farrel'><organization/></author>
<date month='July' year='2016'/>
<abstract><t>This document describes a simple process that allows authors of Internet-Drafts to record the status of known implementations by including an Implementation Status section.  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.</t><t>This process is not mandatory.  Authors of Internet-Drafts are encouraged to consider using the process for their documents, and working groups are invited to think about applying the process to all of their protocol specifications.  This document obsoletes RFC 6982, advancing it to a Best Current Practice.</t></abstract>
</front>
<seriesInfo name='BCP' value='205'/>
<seriesInfo name='RFC' value='7942'/>
<seriesInfo name='DOI' value='10.17487/RFC7942'/>
</reference>




    </references>


<section anchor="imported-abnf" title="Imported ABNF">

<t>The following core rules are included by reference, as defined in Appendix B.1 of <xref target="RFC5234"/>: 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><![CDATA[
 obs-text      = <obs-text, see [RFC7230], Section 3.2.6>
]]></artwork></figure>

</section>
<section numbered="false" anchor="acknowledgments" title="Acknowledgments">

<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>

<!-- ##markdown-source:
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

-->

</rfc>

