<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.10 (Ruby 3.0.4) -->
<?rfc tocindent="yes"?>
<?rfc strict="yes"?>
<?rfc compact="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-httpapi-ratelimit-headers-04" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.7 -->
  <front>
    <title>RateLimit Fields for HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpapi-ratelimit-headers-04"/>
    <author initials="R." surname="Polli" fullname="Roberto Polli">
      <organization>Team Digitale, Italian Government</organization>
      <address>
        <postal>
          <country>Italy</country>
        </postal>
        <email>robipolli@gmail.com</email>
      </address>
    </author>
    <author initials="A." surname="Martinez" fullname="Alejandro Martinez Ruiz">
      <organization>Red Hat</organization>
      <address>
        <email>alex@flawedcode.org</email>
      </address>
    </author>
    <date year="2022" month="May" day="30"/>
    <area>Applications and Real-Time</area>
    <workgroup>HTTPAPI</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document defines the RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset fields for HTTP,
thus allowing servers to publish current service limits and
clients to shape their request policy and avoid being throttled out.</t>
    </abstract>
    <note>
      <name>Note to Readers</name>
      <t><em>RFC EDITOR: please remove this section before publication</em></t>
      <t>Discussion of this draft takes place on the HTTP working group mailing list
(httpapi@ietf.org), which is archived at
<eref target="https://mailarchive.ietf.org/arch/browse/httpapi/">https://mailarchive.ietf.org/arch/browse/httpapi/</eref>.</t>
      <t>The source code and issues list for this draft can be found at
<eref target="https://github.com/ietf-wg-httpapi/ratelimit-headers">https://github.com/ietf-wg-httpapi/ratelimit-headers</eref>.</t>
      <t>References to <tt>ThisRFC</tt> in the IANA Considerations section would
be replaced with the RFC number when assigned.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>The widespreading of HTTP as a distributed computation protocol
requires an explicit way of communicating service status and
usage quotas.</t>
      <t>This was partially addressed by the <tt>Retry-After</tt> header field
defined in <xref target="SEMANTICS"/> to be returned in
429 (Too Many Request) (see <xref target="STATUS429"/>)
or 503 (Service Unavailable) responses.</t>
      <t>Widely deployed quota mechanisms limit the number of acceptable
requests in a given time window, e.g. 10 requests per second;
currently, there is no standard way to communicate service quotas
so that the client can throttle its requests
and prevent 4xx or 5xx responses.
See <xref target="rate-limiting"/> for further information on
the current usage of rate limiting in HTTP.</t>
      <t>This document defines syntax and semantics for the following fields:</t>
      <ul spacing="normal">
        <li>
          <tt>RateLimit-Limit</tt>: containing the requests quota in the time window;</li>
        <li>
          <tt>RateLimit-Remaining</tt>: containing the remaining requests quota in the current window;</li>
        <li>
          <tt>RateLimit-Reset</tt>: containing the time remaining in the current window, specified in seconds;</li>
        <li>
          <tt>RateLimit-Policy</tt>: containing the quota policy information.</li>
      </ul>
      <t>The behavior of <tt>RateLimit-Reset</tt> is compatible with the <tt>delay-seconds</tt> notation of <tt>Retry-After</tt>.</t>
      <t>The fields definition allows to describe complex policies, including the ones
using multiple and variable time windows and dynamic quotas, or implementing concurrency limits.</t>
      <section anchor="goals">
        <name>Goals</name>
        <t>The goals of the RateLimit fields are:</t>
        <dl>
          <dt>Interoperability:</dt>
          <dd>
            <t>Standardization of the names and semantics of rate-limit headers
to ease their enforcement and adoption;</t>
          </dd>
          <dt>Resiliency:</dt>
          <dd>
            <t>Improve resiliency of HTTP infrastructure by
providing clients with information useful
to throttle their requests and
prevent 4xx or 5xx responses;</t>
          </dd>
          <dt>Documentation:</dt>
          <dd>
            <t>Simplify API documentation by eliminating the need
to include detailed quota limits
and related fields in API documentation.</t>
          </dd>
        </dl>
        <t>The following features are out of the scope of this document:</t>
        <dl>
          <dt>Authorization:</dt>
          <dd>
            <t>RateLimit fields are not meant to support
authorization or other kinds of access controls.</t>
          </dd>
          <dt>Throttling scope:</dt>
          <dd>
            <t>This specification does not cover the throttling scope,
that may be the given resource-target, its parent path or the whole
Origin (see Section 7 of <xref target="RFC6454"/>).
This can be addressed using extensibility mechanisms
such as the parameter registry <xref target="iana-ratelimit-parameters"/>.</t>
          </dd>
          <dt>Response status code:</dt>
          <dd>
            <t>RateLimit fields may be returned in both
successful (see Section 15.3 of <xref target="SEMANTICS"/>) and non-successful responses.
This specification does not cover whether non Successful
responses count on quota usage,
nor it mandates any correlation between the RateLimit values
and the returned status code.</t>
          </dd>
          <dt>Throttling policy:</dt>
          <dd>
            <t>This specification does not mandate a specific throttling policy.
The values published in the fields, including the window size,
can be statically or dynamically evaluated.</t>
          </dd>
          <dt>Service Level Agreement:</dt>
          <dd>
            <t>Conveyed quota hints do not imply any service guarantee.
Server is free to throttle respectful clients under certain circumstances.</t>
          </dd>
        </dl>
      </section>
      <section anchor="notational-conventions">
        <name>Notational Conventions</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" 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>
        <t>This document uses the Augmented BNF defined in <xref target="RFC5234"/> and updated
by <xref target="RFC7405"/> along with the "#rule" extension
defined in Section 5.6.1 of <xref target="SEMANTICS"/>.</t>
        <t>The term Origin is to be interpreted as described in Section 7 of <xref target="RFC6454"/>.</t>
        <t>This document uses the following terminology from <xref section="3" sectionFormat="of" target="SF"/>
to specify syntax and parsing: List, Item, String, Token and Integer
together with the concept of bare item.</t>
      </section>
    </section>
    <section anchor="expressing-rate-limit-policies">
      <name>Expressing rate-limit policies</name>
      <section anchor="time-window">
        <name>Time window</name>
        <t>Rate limit policies limit the number of acceptable requests in a given time window.</t>
        <t>A time window is expressed in seconds, using the following syntax:</t>
        <artwork><![CDATA[
time-window = delay-seconds
delay-seconds = sf-integer
]]></artwork>
        <t>Where <tt>delay-seconds</tt> is a non-negative Integer
compatible with the "delay-seconds" rule defined in Section 10.2.3 of <xref target="SEMANTICS"/>.</t>
        <t>Subsecond precision is not supported.</t>
      </section>
      <section anchor="service-limit">
        <name>Service limit</name>
        <t>The service-limit is a value associated to the maximum number of requests
that the server is willing to accept
from one or more clients
on a given basis (originating IP, authenticated user, geographical, ..)
during a <tt>time-window</tt> as defined in <xref target="time-window"/>.</t>
        <t>The <tt>service-limit</tt> is expressed in <tt>quota-units</tt> and has the following syntax:</t>
        <artwork><![CDATA[
   service-limit = quota-units
   quota-units = sf-integer
]]></artwork>
        <t>where <tt>quota-units</tt> is a non-negative Integer.</t>
        <t>The <tt>service-limit</tt> SHOULD match the maximum number of acceptable requests.</t>
        <t>The <tt>service-limit</tt> MAY differ from the total number of acceptable requests
when weight mechanisms, bursts, or other server policies are implemented.</t>
        <t>If the <tt>service-limit</tt> does not match the maximum number of acceptable requests
the relation with that SHOULD be communicated out-of-band.</t>
        <t>Example: A server could</t>
        <ul spacing="normal">
          <li>count once requests like <tt>/books/{id}</tt></li>
          <li>count twice search requests like <tt>/books?author=WuMing</tt></li>
        </ul>
        <t>so that we have the following counters</t>
        <sourcecode type="example"><![CDATA[
GET /books/123           ; service-limit=4, remaining: 3, status=200
GET /books?author=WuMing ; service-limit=4, remaining: 1, status=200
GET /books?author=Eco    ; service-limit=4, remaining: 0, status=429
]]></sourcecode>
      </section>
      <section anchor="quota-policy">
        <name>Quota policy</name>
        <t>This specification allows describing a quota policy with the following syntax:</t>
        <artwork><![CDATA[
   quota-policy = sf-item
]]></artwork>
        <t>where the associated bare-item is a service-limit and parameters are supported.</t>
        <t>The following parameters are defined:</t>
        <dl>
          <dt>w:</dt>
          <dd>
            <t>The REQUIRED "w" parameter specifies a time window.
Its syntax is a "time-window" defined in <xref target="time-window"/>.</t>
          </dd>
        </dl>
        <t>Other parameters are allowed and can be regarded as comments.
They ought to be registered within the "Hypertext Transfer Protocol (HTTP) RateLimit Parameters Registry",
as described in <xref target="iana-ratelimit-parameters"/>.</t>
        <t>An example policy of 100 quota-units per minute.</t>
        <sourcecode type="example"><![CDATA[
   100;w=60
]]></sourcecode>
        <t>The definition of a quota-policy does not imply any specific
distribution of quota-units over time.
Such service specific details can be conveyed as parameters.</t>
        <t>Two policy examples containing further details via custom parameters</t>
        <sourcecode type="example"><![CDATA[
   100;w=60;comment="fixed window"
   12;w=1;burst=1000;policy="leaky bucket"
]]></sourcecode>
        <t>To avoid clashes, implementers SHOULD prefix unregistered parameters
with an <tt>x-&lt;vendor&gt;</tt> identifier, e.g. <tt>x-acme-policy</tt>, <tt>x-acme-burst</tt>.
While it is useful to define a clear syntax and semantics
even for custom parameters, it is important to note that
user agents are not required to process quota policy information.</t>
      </section>
    </section>
    <section anchor="providing-ratelimit-fields">
      <name>Providing RateLimit fields</name>
      <t>A server uses the <tt>RateLimit</tt> response fields
defined in this document to communicate its quota policies
according to the following rules:</t>
      <ul spacing="normal">
        <li>
          <tt>RateLimit-Limit</tt> and <tt>RateLimit-Reset</tt> are REQUIRED;</li>
        <li>
          <tt>RateLimit-Remaining</tt> is RECOMMENDED.</li>
      </ul>
      <t>The returned values refers to the metrics used to evaluate if the current request
respects the quota policy and MAY not apply to subsequent requests.</t>
      <t>Example: a successful response with the following fields</t>
      <sourcecode type="example"><![CDATA[
   RateLimit-Limit: 10
   RateLimit-Remaining: 1
   RateLimit-Reset: 7
]]></sourcecode>
      <t>does not guarantee that the next request will be successful. Server metrics may be subject to other
conditions like the one shown in the example from <xref target="service-limit"/>.</t>
      <t>A server MAY return <tt>RateLimit</tt> response fields independently
of the response status code.
This includes throttled responses.</t>
      <t>This document does not mandate any correlation between the <tt>RateLimit</tt>
values and the returned status code.</t>
      <t>Servers should be careful in returning <tt>RateLimit</tt> fields in
redirection responses (e.g. 3xx status codes) because
a low <tt>RateLimit-Remaining</tt> value could prevent the client
from issuing requests.
For example, given the rate limiting fields below,
a client could decide to wait 10 seconds before following
the <tt>Location</tt> header, because  <tt>RateLimit-Remaining</tt> is 0.</t>
      <sourcecode type="http-message"><![CDATA[
HTTP/1.1 301 Moved Permanently
Location: /foo/123
RateLimit-Remaining: 0
RateLimit-Limit: 10
RateLimit-Reset: 10

]]></sourcecode>
      <t>If a response contains both the <tt>Retry-After</tt> and the <tt>RateLimit-Reset</tt> fields,
the value of <tt>RateLimit-Reset</tt> SHOULD reference the same point in time as
<tt>Retry-After</tt>.</t>
      <t>When using a policy involving more than one <tt>time-window</tt>,
the server MUST reply with the <tt>RateLimit</tt> fields related to the window
with the lower <tt>RateLimit-Remaining</tt> values.</t>
      <t>A service returning <tt>RateLimit</tt> fields MUST NOT convey values
exposing an unwanted volume of requests
and SHOULD implement mechanisms to cap the ratio between <tt>RateLimit-Remaining</tt>
and <tt>RateLimit-Reset</tt> (see <xref target="sec-resource-exhaustion"/>);
this is especially important when quota-policies use a large <tt>time-window</tt>.</t>
      <t>Under certain conditions, a server MAY artificially lower <tt>RateLimit</tt> field values between subsequent requests,
e.g. to respond to Denial of Service attacks or in case of resource saturation.</t>
      <t>Servers usually establish whether the request is in-quota before creating a
response, so the RateLimit field values should be already available in that
moment.
Nonetheless servers MAY decide to send the <tt>RateLimit</tt> fields
in a trailer section.</t>
      <section anchor="performance-considerations">
        <name>Performance considerations</name>
        <t>Servers are not required to return <tt>RateLimit</tt> fields
in every response,
and clients need to take this into account.
For example, an implementer concerned with performance might
provide <tt>RateLimit</tt> fields only when a given quota is going
to expire.</t>
        <t>Implementers concerned with response fields' size, might take into account
their ratio with respect to the content length, or use header-compression
HTTP features such as <xref target="HPACK"/>.</t>
      </section>
    </section>
    <section anchor="receiving-fields">
      <name>Receiving RateLimit fields</name>
      <t>A client MUST process the received <tt>RateLimit</tt> fields.</t>
      <t>A client MUST validate the values received in the <tt>RateLimit</tt> fields before using them
and check if there are significant discrepancies
with the expected ones.
This includes a <tt>RateLimit-Reset</tt> moment too far in the future or a <tt>service-limit</tt> too high.</t>
      <t>A client receiving <tt>RateLimit</tt> fields MUST NOT assume that subsequent
responses contain the same <tt>RateLimit</tt> fields, or any <tt>RateLimit</tt> fields
at all.</t>
      <t>Malformed <tt>RateLimit</tt> fields MAY be ignored.</t>
      <t>A client SHOULD NOT exceed the <tt>quota-units</tt> expressed in <tt>RateLimit-Remaining</tt> before the <tt>time-window</tt> expressed
in <tt>RateLimit-Reset</tt>.</t>
      <t>A client MAY still probe the server if the <tt>RateLimit-Reset</tt> is considered too high.</t>
      <t>The value of <tt>RateLimit-Reset</tt> is generated at response time:
a client aware of a significant network latency MAY behave accordingly
and use other information (e.g. the <tt>Date</tt> response header field, or otherwise gathered metrics) to better
estimate the <tt>RateLimit-Reset</tt> moment intended by the server.</t>
      <t>The details provided in <tt>RateLimit-Policy</tt> are informative
and MAY be ignored.</t>
      <t>If a response contains both the <tt>RateLimit-Reset</tt> and <tt>Retry-After</tt> fields,
<tt>Retry-After</tt> MUST take precedence and
<tt>RateLimit-Reset</tt> MAY be ignored.</t>
      <t>This specification does not mandate a specific throttling behavior
and implementers can adopt their preferred policies, including:</t>
      <ul spacing="normal">
        <li>slowing down or preemptively back-off their request rate when
approaching quota limits;</li>
        <li>consuming all the quota according to the exposed limits and then wait.</li>
      </ul>
      <section anchor="intermediaries">
        <name>Intermediaries</name>
        <t>This section documents the considerations advised in
Section 16.3.2 of <xref target="SEMANTICS"/>.</t>
        <t>An intermediary that is not part of the originating service infrastructure
and is not aware of the quota-policy semantic used by the Origin Server
SHOULD NOT alter the RateLimit fields' values
in such a way as to communicate a more permissive quota-policy;
this includes removing the RateLimit fields.</t>
        <t>An intermediary MAY alter the RateLimit fields
in such a way as to communicate a more restrictive quota-policy when:</t>
        <ul spacing="normal">
          <li>it is aware of the quota-unit semantic used by the Origin Server;</li>
          <li>it implements this specification and enforces a quota-policy which
is more restrictive than the one conveyed in the fields.</li>
        </ul>
        <t>An intermediary
SHOULD forward a request even when presuming that it
might not be serviced;
the service returning the RateLimit fields is the sole responsible
of enforcing the communicated quota-policy,
and it is always free to service incoming requests.</t>
        <t>This specification does not mandate any behavior on intermediaries
respect to retries,
nor requires that intermediaries have any role in respecting quota-policies.
For example, it is legitimate for a proxy to retransmit a request
without notifying the client, and thus consuming quota-units.</t>
      </section>
      <section anchor="caching">
        <name>Caching</name>
        <t>As is the ordinary case for HTTP caching (<xref target="RFC7234"/>), a response with
RateLimit fields might be cached and re-used for subsequent requests.
A cached <tt>RateLimit</tt> response does not modify quota counters but could
contain stale information.
Clients interested in determining the freshness of the <tt>RateLimit</tt> fields
could rely on fields such as <tt>Date</tt>
and on the <tt>time-window</tt> of a <tt>quota-policy</tt>.</t>
      </section>
    </section>
    <section anchor="fields-definition">
      <name>Fields definition</name>
      <t>The following <tt>RateLimit</tt> response fields are defined</t>
      <section anchor="ratelimit-limit-field">
        <name>RateLimit-Limit</name>
        <t>The <tt>RateLimit-Limit</tt> response field indicates
the <tt>service-limit</tt> associated to the client
in the current <tt>time-window</tt>.</t>
        <t>If the client exceeds that limit, it MAY not be served.</t>
        <t>The field is a non-negative Integer.
Its value is named <tt>expiring-limit</tt>.</t>
        <artwork><![CDATA[
   RateLimit-Limit = expiring-limit
   expiring-limit = service-limit
]]></artwork>
        <t>The <tt>expiring-limit</tt> value MUST be set to the <tt>service-limit</tt> that is closer to reach its limit,
and the associated <tt>time-window</tt> MUST either be:</t>
        <ul spacing="normal">
          <li>inferred by the value of <tt>RateLimit-Reset</tt> at the moment of the reset, or</li>
          <li>communicated out-of-band (e.g. in the documentation).</li>
        </ul>
        <t>The <tt>RateLimit-Policy</tt> field (see <xref target="ratelimit-policy-field"/>),
might contain information on the associated <tt>time-window</tt>.</t>
        <sourcecode type="example"><![CDATA[
   RateLimit-Limit: 100
]]></sourcecode>
        <t>This field MUST NOT occur multiple times
and can be sent in a trailer section.</t>
      </section>
      <section anchor="ratelimit-policy-field">
        <name>RateLimit-Policy</name>
        <t>The <tt>RateLimit-Policy</tt> response field indicates
the <tt>quota</tt> associated to the client
and its value is informative.</t>
        <t>The field is a non-empty List of quota policies (see <xref target="quota-policy"/>).</t>
        <sourcecode type="abnf"><![CDATA[
   RateLimit-Policy = sf-list
]]></sourcecode>
        <t>A <tt>time-window</tt> associated to <tt>expiring-limit</tt> can be communicated
via <tt>RateLimit-Policy</tt>, like shown in the following example.</t>
        <sourcecode type="example"><![CDATA[
   RateLimit-Policy: 100;w=10
   RateLimit-Limit: 100
]]></sourcecode>
        <t>Policies using multiple quota limits MAY be returned using multiple
<tt>quota-policy</tt> items, like shown in the following two examples:</t>
        <sourcecode type="example"><![CDATA[
   RateLimit-Policy: 10;w=1, 50;w=60, 1000;w=3600, 5000;w=86400
   RateLimit-Policy: 10;w=1;burst=1000, 1000;w=3600
]]></sourcecode>
        <t>This field MUST NOT occur multiple times
and can be sent in a trailer section.</t>
      </section>
      <section anchor="ratelimit-remaining-field">
        <name>RateLimit-Remaining</name>
        <t>The <tt>RateLimit-Remaining</tt> response field indicates the remaining <tt>quota-units</tt> defined in <xref target="service-limit"/>
associated to the client.</t>
        <t>The field is a non-negative Integer expressed in <tt>quota-units</tt>.</t>
        <artwork><![CDATA[
   RateLimit-Remaining = quota-units
]]></artwork>
        <t>This field MUST NOT occur multiple times
and can be sent in a trailer section.</t>
        <t>Clients MUST NOT assume that a positive <tt>RateLimit-Remaining</tt> value is
a guarantee that further requests will be served.</t>
        <t>A low <tt>RateLimit-Remaining</tt> value is like a yellow traffic-light
for either the number of requests issued in the <tt>time-window</tt>
or the request throughput:
the red light may arrive suddenly
(see <xref target="providing-ratelimit-fields"/>).</t>
        <t>One example of <tt>RateLimit-Remaining</tt> use is below.</t>
        <sourcecode type="example"><![CDATA[
   RateLimit-Remaining: 50
]]></sourcecode>
      </section>
      <section anchor="ratelimit-reset-field">
        <name>RateLimit-Reset</name>
        <t>The <tt>RateLimit-Reset</tt> response field indicates
the number of seconds until the quota resets.</t>
        <t>The field is a non-negative Integer.</t>
        <artwork><![CDATA[
   RateLimit-Reset = delay-seconds
]]></artwork>
        <t>The delay-seconds format is used because:</t>
        <ul spacing="normal">
          <li>it does not rely on clock synchronization and is resilient to clock adjustment
and clock skew between client and server (see Section 5.6.7 of <xref target="SEMANTICS"/>);</li>
          <li>it mitigates the risk related to thundering herd when too many clients are serviced with the same timestamp.</li>
        </ul>
        <t>This field MUST NOT occur multiple times
and can be sent in a trailer section.</t>
        <t>An example of <tt>RateLimit-Reset</tt> use is below.</t>
        <sourcecode type="example"><![CDATA[
   RateLimit-Reset: 50
]]></sourcecode>
        <t>The client MUST NOT assume that all its <tt>service-limit</tt> will be restored
after the moment referenced by <tt>RateLimit-Reset</tt>.
The server MAY arbitrarily alter the <tt>RateLimit-Reset</tt> value between subsequent requests
e.g. in case of resource saturation or to implement sliding window policies.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="sec-throttling-does-not-prevent">
        <name>Throttling does not prevent clients from issuing requests</name>
        <t>This specification does not prevent clients to
make over-quota requests.</t>
        <t>Servers should always implement mechanisms
to prevent resource exhaustion.</t>
      </section>
      <section anchor="sec-information-disclosure">
        <name>Information disclosure</name>
        <t>Servers should not disclose to untrusted parties operational capacity information that
can be used to saturate its infrastructural resources.</t>
        <t>While this specification does not mandate whether non 2xx responses
consume quota, if 401 and 403 responses count on quota
a malicious client could probe the endpoint
to get traffic information of another
user.</t>
        <t>As intermediaries might retransmit requests and consume
quota-units without prior knowledge of the User Agent,
RateLimit fields might reveal the existence of an intermediary
to the User Agent.</t>
      </section>
      <section anchor="sec-remaining-not-granted">
        <name>Remaining quota-units are not granted requests</name>
        <t><tt>RateLimit-*</tt> fields convey hints from the server
to the clients in order to avoid being throttled out.</t>
        <t>Clients MUST NOT consider the <tt>quota-units</tt> returned in <tt>RateLimit-Remaining</tt>
as a service level agreement.</t>
        <t>In case of resource saturation, the server MAY artificially lower the returned
values or not serve the request regardless of the advertised quotas.</t>
      </section>
      <section anchor="sec-reset-reliability">
        <name>Reliability of RateLimit-Reset</name>
        <t>Consider that <tt>service-limit</tt> may not be restored after the moment referenced by <tt>RateLimit-Reset</tt>,
and the <tt>RateLimit-Reset</tt> value should not be considered fixed nor constant.</t>
        <t>Subsequent requests may return a higher <tt>RateLimit-Reset</tt> value to limit
concurrency or implement dynamic or adaptive throttling policies.</t>
      </section>
      <section anchor="sec-resource-exhaustion">
        <name>Resource exhaustion</name>
        <t>When returning <tt>RateLimit-Reset</tt> you must be aware that many throttled
clients may come back at the very moment specified.</t>
        <t>This is true for <tt>Retry-After</tt> too.</t>
        <t>For example, if the quota resets every day at <tt>18:00:00</tt>
and your server returns the <tt>RateLimit-Reset</tt> accordingly</t>
        <sourcecode type="example"><![CDATA[
   Date: Tue, 15 Nov 1994 08:00:00 GMT
   RateLimit-Reset: 36000
]]></sourcecode>
        <t>there's a high probability that all clients will show up at <tt>18:00:00</tt>.</t>
        <t>This could be mitigated by adding some jitter to the field-value.</t>
        <t>Resource exhaustion issues can be associated with quota policies
using a large <tt>time-window</tt>, because a user agent by chance or on purpose might
consume most of its quota-units in a significantly shorter interval.</t>
        <t>This behavior can be even triggered by the provided <tt>RateLimit</tt> fields.
The following example describes a service
with an unconsumed quota-policy of 10000 quota-units per 1000 seconds.</t>
        <sourcecode type="example"><![CDATA[
RateLimit-Limit: 10000
RateLimit-Policy: 10000;w=1000
RateLimit-Remaining: 10000
RateLimit-Reset: 10
]]></sourcecode>
        <t>A client implementing a simple ratio between <tt>RateLimit-Remaining</tt> and
<tt>RateLimit-Reset</tt> could infer an average throughput of
1000 quota-units per second,
while <tt>RateLimit-Limit</tt> conveys a quota-policy
with an average of 10 quota-units per second.
If the service cannot handle such load, it should return
either a lower <tt>RateLimit-Remaining</tt> value
or an higher <tt>RateLimit-Reset</tt> value.
Moreover, complementing large <tt>time-window</tt> quota-policies with
a short <tt>time-window</tt> one mitigates those risks.</t>
      </section>
      <section anchor="denial-of-service">
        <name>Denial of Service</name>
        <t><tt>RateLimit</tt> fields may assume unexpected values by chance or purpose.
For example, an excessively high <tt>RateLimit-Remaining</tt> value may be:</t>
        <ul spacing="normal">
          <li>used by a malicious intermediary to trigger a Denial of Service attack
or consume client resources boosting its requests;</li>
          <li>passed by a misconfigured server;</li>
        </ul>
        <t>or an high <tt>RateLimit-Reset</tt> value could inhibit clients to contact
the server.</t>
        <t>Clients MUST validate the received values to mitigate those risks.</t>
      </section>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <t>Clients that act upon a request to rate limit
are potentially re-identifiable (see <xref section="7.1" sectionFormat="of" target="DNS-PRIVACY"/>)
because they react to information that might only be given to them.
Note that this might apply to other fields too (e.g. Retry-After).</t>
      <t>Since rate limiting is usually implemented in contexts where
clients are either identified or profiled
(e.g. assigning different quota units to different users),
this is rarely a concern.</t>
      <t>Privacy enhancing infrastructures using RateLimit fields
can define specific techniques to mitigate the risks of re-identification.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA is requested to update one registry and create one new registry.</t>
      <t>Please add the following entries to the
"Hypertext Transfer Protocol (HTTP) Field Name Registry" registry
(<xref target="SEMANTICS"/>):</t>
      <table>
        <thead>
          <tr>
            <th align="left">Field Name</th>
            <th align="left">Status</th>
            <th align="left">Specification</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">RateLimit-Limit</td>
            <td align="left">permanent</td>
            <td align="left">
              <xref target="ratelimit-limit-field"/> of ThisRFC</td>
          </tr>
          <tr>
            <td align="left">RateLimit-Remaining</td>
            <td align="left">permanent</td>
            <td align="left">
              <xref target="ratelimit-remaining-field"/> of ThisRFC</td>
          </tr>
          <tr>
            <td align="left">RateLimit-Reset</td>
            <td align="left">permanent</td>
            <td align="left">
              <xref target="ratelimit-reset-field"/> of ThisRFC</td>
          </tr>
          <tr>
            <td align="left">RateLimit-Policy</td>
            <td align="left">permanent</td>
            <td align="left">
              <xref target="ratelimit-policy-field"/> of ThisRFC</td>
          </tr>
        </tbody>
      </table>
      <section anchor="iana-ratelimit-parameters">
        <name>RateLimit Parameters Registration</name>
        <t>IANA is requested to create a new registry to be called
"Hypertext Transfer Protocol (HTTP) RateLimit Parameters Registry",
to be located at
<eref target="https://www.iana.org/assignments/http-ratelimit-parameters">https://www.iana.org/assignments/http-ratelimit-parameters</eref>.
Registration is done on the advice of a Designated Expert, appointed
by the IESG or their delegate.
All entries are Specification Required
(<xref section="4.6" sectionFormat="comma" target="IANA"/>).</t>
        <t>Registration requests consist of the following information:</t>
        <ul spacing="normal">
          <li>Parameter name:
The parameter name, conforming to <xref target="SF"/>.</li>
          <li>Field name:
The RateLimit field for which the parameter is registered. If a parameter is intended to be used
with multiple fields, it has to be registered
for each one.</li>
          <li>Description:
A brief description of the parameter.</li>
          <li>Specification document:
A reference to the document that specifies the parameter, preferably
including a URI that can be used to retrieve a copy of the document.</li>
          <li>Comments (optional):
Any additional information that can be useful.</li>
        </ul>
        <t>The initial contents of this registry should be:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Field Name</th>
              <th align="left">Parameter name</th>
              <th align="left">Description</th>
              <th align="left">Specification</th>
              <th align="left">Comments (optional)</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">RateLimit-Policy</td>
              <td align="left">w</td>
              <td align="left">Time window</td>
              <td align="left">
                <xref target="quota-policy"/> of ThisRFC</td>
              <td align="left"> </td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="IANA">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton">
              <organization/>
            </author>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <author fullname="T. Narten" initials="T." surname="Narten">
              <organization/>
            </author>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters.  To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper.  For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed.  This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
        <reference anchor="SEMANTICS">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="Roy T. Fielding">
              <organization>Adobe</organization>
            </author>
            <author fullname="Mark Nottingham">
              <organization>Fastly</organization>
            </author>
            <author fullname="Julian Reschke">
              <organization>greenbytes GmbH</organization>
            </author>
            <date day="12" month="September" year="2021"/>
            <abstract>
              <t>   The Hypertext Transfer Protocol (HTTP) is a stateless application-
   level protocol for distributed, collaborative, hypertext information
   systems.  This document describes the overall architecture of HTTP,
   establishes common terminology, and defines aspects of the protocol
   that are shared by all versions.  In this definition are core
   protocol elements, extensibility mechanisms, and the "http" and
   "https" Uniform Resource Identifier (URI) schemes.

   This document updates RFC 3864 and obsoletes RFC 2818, RFC 7231, RFC
   7232, RFC 7233, RFC 7235, RFC 7538, RFC 7615, RFC 7694, and portions
   of RFC 7230.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-semantics-19"/>
        </reference>
        <reference anchor="RFC6454">
          <front>
            <title>The Web Origin Concept</title>
            <author fullname="A. Barth" initials="A." surname="Barth">
              <organization/>
            </author>
            <date month="December" year="2011"/>
            <abstract>
              <t>This document defines the concept of an "origin", which is often used as the scope of authority or privilege by user agents.  Typically, user agents isolate content retrieved from different origins to prevent malicious web site operators from interfering with the operation of benign web sites.  In addition to outlining the principles that underlie the concept of origin, this document details how to determine the origin of a URI and how to serialize an origin into a string.  It also defines an HTTP header field, named "Origin", that indicates which origins are associated with an HTTP request.   [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6454"/>
          <seriesInfo name="DOI" value="10.17487/RFC6454"/>
        </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">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="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="RFC7405">
          <front>
            <title>Case-Sensitive String Support in ABNF</title>
            <author fullname="P. Kyzivat" initials="P." surname="Kyzivat">
              <organization/>
            </author>
            <date month="December" year="2014"/>
            <abstract>
              <t>This document extends the base definition of ABNF (Augmented Backus-Naur Form) to include a way to specify US-ASCII string literals that are matched in a case-sensitive manner.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7405"/>
          <seriesInfo name="DOI" value="10.17487/RFC7405"/>
        </reference>
        <reference anchor="SF">
          <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 "Structured Fields", "Structured Headers", or "Structured Trailers". 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>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="DNS-PRIVACY">
          <front>
            <title>DNS Privacy Considerations</title>
            <author fullname="T. Wicinski" initials="T." role="editor" surname="Wicinski">
              <organization/>
            </author>
            <date month="July" year="2021"/>
            <abstract>
              <t>This document describes the privacy issues associated with the use of the DNS by Internet users. It provides general observations about typical current privacy practices. It is intended to be an analysis of the present situation and does not prescribe solutions. This document obsoletes RFC 7626.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9076"/>
          <seriesInfo name="DOI" value="10.17487/RFC9076"/>
        </reference>
        <reference anchor="UNIX">
          <front>
            <title>The Single UNIX Specification, Version 2 - 6 Vol Set for UNIX 98</title>
            <author initials="" surname="The Open Group" fullname="The Open Group">
              <organization/>
            </author>
            <date year="1997" month="February"/>
          </front>
        </reference>
        <reference anchor="STATUS429">
          <front>
            <title>Stream Control Transmission Protocol (SCTP) Stream Reconfiguration</title>
            <author fullname="R. Stewart" initials="R." surname="Stewart">
              <organization/>
            </author>
            <author fullname="M. Tuexen" initials="M." surname="Tuexen">
              <organization/>
            </author>
            <author fullname="P. Lei" initials="P." surname="Lei">
              <organization/>
            </author>
            <date month="February" year="2012"/>
            <abstract>
              <t>Many applications that use the Stream Control Transmission Protocol (SCTP) want the ability to "reset" a stream.  The intention of resetting a stream is to set the numbering sequence of the stream back to 'zero' with a corresponding notification to the application layer that the reset has been performed.  Applications requiring this feature want it so that they can "reuse" streams for different purposes but still utilize the stream sequence number so that the application can track the message flows.  Thus, without this feature, a new use of an old stream would result in message numbers greater than expected, unless there is a protocol mechanism to "reset the streams back to zero".  This document also includes methods for resetting the transmission sequence numbers, adding additional streams, and resetting all stream sequence numbers.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6525"/>
          <seriesInfo name="DOI" value="10.17487/RFC6525"/>
        </reference>
        <reference anchor="HPACK">
          <front>
            <title>HPACK: Header Compression for HTTP/2</title>
            <author fullname="R. Peon" initials="R." surname="Peon">
              <organization/>
            </author>
            <author fullname="H. Ruellan" initials="H." surname="Ruellan">
              <organization/>
            </author>
            <date month="May" year="2015"/>
            <abstract>
              <t>This specification defines HPACK, a compression format for efficiently representing HTTP header fields, to be used in HTTP/2.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7541"/>
          <seriesInfo name="DOI" value="10.17487/RFC7541"/>
        </reference>
        <reference anchor="RFC7234">
          <front>
            <title>Hypertext Transfer Protocol (HTTP/1.1): Caching</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham">
              <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 HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7234"/>
          <seriesInfo name="DOI" value="10.17487/RFC7234"/>
        </reference>
        <reference anchor="RFC6585">
          <front>
            <title>Additional HTTP Status Codes</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham">
              <organization/>
            </author>
            <author fullname="R. Fielding" initials="R." surname="Fielding">
              <organization/>
            </author>
            <date month="April" year="2012"/>
            <abstract>
              <t>This document specifies additional HyperText Transfer Protocol (HTTP) status codes for a variety of common situations.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6585"/>
          <seriesInfo name="DOI" value="10.17487/RFC6585"/>
        </reference>
        <reference anchor="RFC3339">
          <front>
            <title>Date and Time on the Internet: Timestamps</title>
            <author fullname="G. Klyne" initials="G." surname="Klyne">
              <organization/>
            </author>
            <author fullname="C. Newman" initials="C." surname="Newman">
              <organization/>
            </author>
            <date month="July" year="2002"/>
            <abstract>
              <t>This document defines a date and time format for use in Internet protocols that is a profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3339"/>
          <seriesInfo name="DOI" value="10.17487/RFC3339"/>
        </reference>
      </references>
    </references>
    <section anchor="rate-limiting">
      <name>Rate-limiting and quotas</name>
      <t>Servers use quota mechanisms to avoid systems overload,
to ensure an equitable distribution of computational resources
or to enforce other policies - e.g. monetization.</t>
      <t>A basic quota mechanism limits the number of acceptable
requests in a given time window, e.g. 10 requests per second.</t>
      <t>When quota is exceeded, servers usually do not serve the request
replying instead with a <tt>4xx</tt> HTTP status code (e.g. 429 or 403)
or adopt more aggressive policies like dropping connections.</t>
      <t>Quotas may be enforced on different basis (e.g. per user, per IP, per geographic area, ..) and
at different levels. For example, an user may be allowed to issue:</t>
      <ul spacing="normal">
        <li>10 requests per second;</li>
        <li>limited to 60 requests per minute;</li>
        <li>limited to 1000 requests per hour.</li>
      </ul>
      <t>Moreover system metrics, statistics and heuristics can be used
to implement more complex policies, where
the number of acceptable requests and the time window
are computed dynamically.</t>
      <t>To help clients throttling their requests, servers may expose
the counters used to evaluate quota policies via HTTP header fields.</t>
      <t>Those response headers may be added by HTTP intermediaries
such as API gateways and reverse proxies.</t>
      <t>On the web we can find many different rate-limit headers, usually
containing the number of allowed requests
in a given time window, and when the window is reset.</t>
      <t>The common choice is to return three headers containing:</t>
      <ul spacing="normal">
        <li>the maximum number of allowed requests in the time window;</li>
        <li>the number of remaining requests in the current window;</li>
        <li>the time remaining in the current window expressed in seconds or
as a timestamp;</li>
      </ul>
      <section anchor="interoperability-issues">
        <name>Interoperability issues</name>
        <t>A major interoperability issue in throttling is the lack
of standard headers, because:</t>
        <ul spacing="normal">
          <li>each implementation associates different semantics to the
same header field names;</li>
          <li>header field names proliferates.</li>
        </ul>
        <t>User Agents interfacing with different servers may thus
need to process different headers,
or the very same application interface that sits behind different
reverse proxies may reply with different throttling headers.</t>
      </section>
    </section>
    <section anchor="examples">
      <name>Examples</name>
      <section anchor="unparameterized-responses">
        <name>Unparameterized responses</name>
        <section anchor="throttling-information-in-responses">
          <name>Throttling information in responses</name>
          <t>The client exhausted its service-limit for the next 50 seconds.
The <tt>time-window</tt> is communicated out-of-band or inferred by the field values.</t>
          <t>Request:</t>
          <sourcecode type="http-message"><![CDATA[
GET /items/123 HTTP/1.1
Host: api.example

]]></sourcecode>
          <t>Response:</t>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 200 Ok
Content-Type: application/json
RateLimit-Limit: 100
Ratelimit-Remaining: 0
Ratelimit-Reset: 50

{"hello": "world"}
]]></sourcecode>
          <t>Since the field values are not necessarily correlated with
the response status code,
a subsequent request is not required to fail.
The example below shows that the server decided to serve the
request even if <tt>RateLimit-Remaining</tt> is 0.
Another server, or the same server under other load conditions,
could have decided to throttle the request instead.</t>
          <t>Request:</t>
          <sourcecode type="http-message"><![CDATA[
GET /items/456 HTTP/1.1
Host: api.example

]]></sourcecode>
          <t>Response:</t>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 200 Ok
Content-Type: application/json
RateLimit-Limit: 100
Ratelimit-Remaining: 0
Ratelimit-Reset: 48

{"still": "successful"}
]]></sourcecode>
        </section>
        <section anchor="use-with-custom-fields">
          <name>Use in conjunction with custom fields</name>
          <t>The server uses two custom fields,
namely <tt>acme-RateLimit-DayLimit</tt> and <tt>acme-RateLimit-HourLimit</tt>
to expose the following policy:</t>
          <ul spacing="normal">
            <li>5000 daily quota-units;</li>
            <li>1000 hourly quota-units.</li>
          </ul>
          <t>The client consumed 4900 quota-units in the first 14 hours.</t>
          <t>Despite the next hourly limit of 1000 quota-units, the closest limit
to reach is the daily one.</t>
          <t>The server then exposes the <tt>RateLimit-*</tt> fields to
inform the client that:</t>
          <ul spacing="normal">
            <li>it has only 100 quota-units left;</li>
            <li>the window will reset in 10 hours.</li>
          </ul>
          <t>Request:</t>
          <sourcecode type="http-message"><![CDATA[
GET /items/123 HTTP/1.1
Host: api.example

]]></sourcecode>
          <t>Response:</t>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 200 Ok
Content-Type: application/json
acme-RateLimit-DayLimit: 5000
acme-RateLimit-HourLimit: 1000
RateLimit-Limit: 5000
RateLimit-Remaining: 100
RateLimit-Reset: 36000

{"hello": "world"}
]]></sourcecode>
        </section>
        <section anchor="use-for-limiting-concurrency">
          <name>Use for limiting concurrency</name>
          <t>Throttling fields may be used to limit concurrency,
advertising limits that are lower than the usual ones
in case of saturation, thus increasing availability.</t>
          <t>The server adopted a basic policy of 100 quota-units
per minute,
and in case of resource exhaustion adapts the returned values
reducing both <tt>RateLimit-Limit</tt> and <tt>RateLimit-Remaining</tt>.</t>
          <t>After 2 seconds the client consumed 40 quota-units</t>
          <t>Request:</t>
          <sourcecode type="http-message"><![CDATA[
GET /items/123 HTTP/1.1
Host: api.example

]]></sourcecode>
          <t>Response:</t>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 200 Ok
Content-Type: application/json
RateLimit-Limit: 100
RateLimit-Remaining: 60
RateLimit-Reset: 58

{"elapsed": 2, "issued": 40}
]]></sourcecode>
          <t>At the subsequent request - due to resource exhaustion -
the server advertises only <tt>RateLimit-Remaining: 20</tt>.</t>
          <t>Request:</t>
          <sourcecode type="http-message"><![CDATA[
GET /items/123 HTTP/1.1
Host: api.example

]]></sourcecode>
          <t>Response:</t>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 200 Ok
Content-Type: application/json
RateLimit-Limit: 100
RateLimit-Remaining: 20
RateLimit-Reset: 56

{"elapsed": 4, "issued": 41}
]]></sourcecode>
        </section>
        <section anchor="use-in-throttled-responses">
          <name>Use in throttled responses</name>
          <t>A client exhausted its quota and the server throttles it
sending <tt>Retry-After</tt>.</t>
          <t>In this example, the values of <tt>Retry-After</tt> and <tt>RateLimit-Reset</tt> reference the same moment,
but this is not a requirement.</t>
          <t>The 429 (Too Many Request) HTTP status code is just used as an example.</t>
          <t>Request:</t>
          <sourcecode type="http-message"><![CDATA[
GET /items/123 HTTP/1.1
Host: api.example

]]></sourcecode>
          <t>Response:</t>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 429 Too Many Requests
Content-Type: application/json
Date: Mon, 05 Aug 2019 09:27:00 GMT
Retry-After: Mon, 05 Aug 2019 09:27:05 GMT
RateLimit-Reset: 5
RateLimit-Limit: 100
Ratelimit-Remaining: 0

{
"title": "Too Many Requests",
"status": 429,
"detail": "You have exceeded your quota"
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="parameterized-responses">
        <name>Parameterized responses</name>
        <section anchor="throttling-window-specified-via-parameter">
          <name>Throttling window specified via parameter</name>
          <t>The client has 99 <tt>quota-units</tt> left for the next 50 seconds.
The <tt>time-window</tt> is communicated by the <tt>w</tt> parameter, so we know the throughput is 100 <tt>quota-units</tt> per minute.</t>
          <t>Request:</t>
          <sourcecode type="http-message"><![CDATA[
GET /items/123 HTTP/1.1
Host: api.example

]]></sourcecode>
          <t>Response:</t>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 200 Ok
Content-Type: application/json
RateLimit-Limit: 100
RateLimit-Policy: 100;w=60
Ratelimit-Remaining: 99
Ratelimit-Reset: 50

{"hello": "world"}
]]></sourcecode>
        </section>
        <section anchor="dynamic-limits-with-parameterized-windows">
          <name>Dynamic limits with parameterized windows</name>
          <t>The policy conveyed by <tt>RateLimit-Limit</tt> states that
the server accepts 100 quota-units per minute.</t>
          <t>To avoid resource exhaustion, the server artificially lowers
the actual limits returned in the throttling headers.</t>
          <t>The  <tt>RateLimit-Remaining</tt> then advertises
only 9 quota-units for the next 50 seconds to slow down the client.</t>
          <t>Note that the server could have lowered even the other
values in <tt>RateLimit-Limit</tt>: this specification
does not mandate any relation between the field values
contained in subsequent responses.</t>
          <t>Request:</t>
          <sourcecode type="http-message"><![CDATA[
GET /items/123 HTTP/1.1
Host: api.example

]]></sourcecode>
          <t>Response:</t>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 200 Ok
Content-Type: application/json
RateLimit-Limit: 10
RateLimit-Policy: 100;w=60
Ratelimit-Remaining: 9
Ratelimit-Reset: 50

{
  "status": 200,
  "detail": "Just slow down without waiting."
}
]]></sourcecode>
        </section>
        <section anchor="dynamic-limits-for-pushing-back-and-slowing-down">
          <name>Dynamic limits for pushing back and slowing down</name>
          <t>Continuing the previous example, let's say the client waits 10 seconds and
performs a new request which, due to resource exhaustion, the server rejects
and pushes back, advertising <tt>RateLimit-Remaining: 0</tt> for the next 20 seconds.</t>
          <t>The server advertises a smaller window with a lower limit to slow
down the client for the rest of its original window after the 20 seconds elapse.</t>
          <t>Request:</t>
          <sourcecode type="http-message"><![CDATA[
GET /items/123 HTTP/1.1
Host: api.example

]]></sourcecode>
          <t>Response:</t>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 429 Too Many Requests
Content-Type: application/json
RateLimit-Limit: 0
RateLimit-Policy: 15;w=20
Ratelimit-Remaining: 0
Ratelimit-Reset: 20

{
  "status": 429,
  "detail": "Wait 20 seconds, then slow down!"
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="dynamic-limits-for-pushing-back-with-retry-after-and-slow-down">
        <name>Dynamic limits for pushing back with Retry-After and slow down</name>
        <t>Alternatively, given the same context where the previous example starts, we
can convey the same information to the client via <tt>Retry-After</tt>, with
the advantage that the server can now specify the policy's nominal limit and
window that will apply after the reset, e.g. assuming the resource exhaustion
is likely to be gone by then, so the advertised policy does not need to be
adjusted, yet we managed to stop requests for a while and slow down the rest of
the current window.</t>
        <t>Request:</t>
        <sourcecode type="http-message"><![CDATA[
GET /items/123 HTTP/1.1
Host: api.example

]]></sourcecode>
        <t>Response:</t>
        <sourcecode type="http-message"><![CDATA[
HTTP/1.1 429 Too Many Requests
Content-Type: application/json
Retry-After: 20
RateLimit-Limit: 15
RateLimit-Policy: 100;w=60
Ratelimit-Remaining: 15
Ratelimit-Reset: 40

{
  "status": 429,
  "detail": "Wait 20 seconds, then slow down!"
}
]]></sourcecode>
        <t>Note that in this last response the client is expected to honor
<tt>Retry-After</tt> and perform no requests for the specified amount of
time, whereas the previous example would not force the client to stop
requests before the reset time is elapsed, as it would still be free to
query again the server even if it is likely to have the request rejected.</t>
        <section anchor="missing-remaining-information">
          <name>Missing Remaining information</name>
          <t>The server does not expose <tt>RateLimit-Remaining</tt> values
(for example, because the underlying counters are not available).
Instead, it resets the limit counter every second.</t>
          <t>It communicates to the client the limit of 10 quota-units per second
always returning the couple <tt>RateLimit-Limit</tt> and <tt>RateLimit-Reset</tt>.</t>
          <t>Request:</t>
          <sourcecode type="http-message"><![CDATA[
GET /items/123 HTTP/1.1
Host: api.example

]]></sourcecode>
          <t>Response:</t>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 200 Ok
Content-Type: application/json
RateLimit-Limit: 10
Ratelimit-Reset: 1

{"first": "request"}
]]></sourcecode>
          <t>Request:</t>
          <sourcecode type="http-message"><![CDATA[
GET /items/123 HTTP/1.1
Host: api.example

]]></sourcecode>
          <t>Response:</t>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 200 Ok
Content-Type: application/json
RateLimit-Limit: 10
Ratelimit-Reset: 1

{"second": "request"}
]]></sourcecode>
        </section>
        <section anchor="use-with-multiple-windows">
          <name>Use with multiple windows</name>
          <t>This is a standardized way of describing the policy
detailed in <xref target="use-with-custom-fields"/>:</t>
          <ul spacing="normal">
            <li>5000 daily quota-units;</li>
            <li>1000 hourly quota-units.</li>
          </ul>
          <t>The client consumed 4900 quota-units in the first 14 hours.</t>
          <t>Despite the next hourly limit of 1000 quota-units, the closest limit
to reach is the daily one.</t>
          <t>The server then exposes the <tt>RateLimit</tt> fields to
inform the client that:</t>
          <ul spacing="normal">
            <li>it has only 100 quota-units left;</li>
            <li>the window will reset in 10 hours;</li>
            <li>the <tt>expiring-limit</tt> is 5000.</li>
          </ul>
          <t>Request:</t>
          <sourcecode type="http-message"><![CDATA[
GET /items/123 HTTP/1.1
Host: api.example

]]></sourcecode>
          <t>Response:</t>
          <sourcecode type="http-message"><![CDATA[
HTTP/1.1 200 OK
Content-Type: application/json
RateLimit-Limit: 5000
RateLimit-Policy: 1000;w=3600, 5000;w=86400
RateLimit-Remaining: 100
RateLimit-Reset: 36000

{"hello": "world"}
]]></sourcecode>
        </section>
      </section>
    </section>
    <section numbered="false" removeInRFC="true" anchor="faq">
      <name>FAQ</name>
      <ol spacing="normal" type="1"><li>
          <t>Why defining standard fields for throttling?  </t>
          <t>
To simplify enforcement of throttling policies.</t>
        </li>
        <li>
          <t>Can I use RateLimit-* in throttled responses (eg with status code 429)?  </t>
          <t>
Yes, you can.</t>
        </li>
        <li>
          <t>Are those specs tied to RFC 6585?  </t>
          <t>
No. <xref target="RFC6585"/> defines the <tt>429</tt> status code and we use it just as an example of a throttled request,
that could instead use even <tt>403</tt> or whatever status code.
The goal of this specification is to standardize the name and semantic of three ratelimit fields
widely used on the internet. Stricter relations with status codes or error response payloads
would impose behaviors to all the existing implementations making the adoption more complex.</t>
        </li>
        <li>
          <t>Why don't pass the throttling scope as a parameter?  </t>
          <t>
The word "scope" can have different meanings:
for example it can be an URL, or an authorization scope.
Since authorization is out of the scope of this document (see <xref target="goals"/>),
and that we rely only on <xref target="SEMANTICS"/>, in <xref target="goals"/> we defined "scope" in terms of
URL.  </t>
          <t>
Since clients are not required to process quota policies (see <xref target="receiving-fields"/>),
we could add a new "RateLimit-Scope" field to this spec.
See this discussion on a <eref target="https://github.com/httpwg/http-core/pull/317#issuecomment-585868767">similar thread</eref>  </t>
          <t>
Specific ecosystems can still bake their own prefixed parameters,
such as <tt>acme-auth-scope</tt> or <tt>acme-url-scope</tt> and ensure that clients process them.
This behavior cannot be relied upon when communicating between different ecosystems.  </t>
          <t>
We are open to suggestions: comment on <eref target="https://github.com/ioggstream/draft-polli-ratelimit-headers/issues/70">this issue</eref></t>
        </li>
        <li>
          <t>Why using delay-seconds instead of a UNIX Timestamp?
Why not using subsecond precision?  </t>
          <t>
Using delay-seconds aligns with <tt>Retry-After</tt>, which is returned in similar contexts,
eg on 429 responses.  </t>
          <t>
Timestamps require a clock synchronization protocol
(see Section 5.6.7 of <xref target="SEMANTICS"/>).
This may be problematic (e.g. clock adjustment, clock skew, failure of hardcoded clock synchronization servers,
IoT devices, ..).
Moreover timestamps may not be monotonically increasing due to clock adjustment.
See <eref target="https://community.ntppool.org/t/another-ntp-client-failure-story/1014/">Another NTP client failure story</eref>  </t>
          <t>
We did not use subsecond precision because:  </t>
          <ul spacing="normal">
            <li>that is more subject to system clock correction
like the one implemented via the adjtimex() Linux system call;</li>
            <li>response-time latency may not make it worth. A brief discussion on the subject is
on the <eref target="https://lists.w3.org/Archives/Public/ietf-http-wg/2019JulSep/0202.html">httpwg ml</eref></li>
            <li>almost all rate-limit headers implementations do not use it.</li>
          </ul>
        </li>
        <li>
          <t>Why not support multiple quota remaining?  </t>
          <t>
While this might be of some value, my experience suggests that overly-complex quota implementations
results in lower effectiveness of this policy. This spec allows the client to easily focusing on
RateLimit-Remaining and RateLimit-Reset.</t>
        </li>
        <li>
          <t>Shouldn't I limit concurrency instead of request rate?  </t>
          <t>
You can use this specification to limit concurrency
at the HTTP level (see {#use-for-limiting-concurrency})
and help clients to
shape their requests avoiding being throttled out.  </t>
          <t>
A problematic way to limit concurrency is connection dropping,
especially when connections are multiplexed (e.g. HTTP/2)
because this results in unserviced client requests,
which is something we want to avoid.  </t>
          <t>
A semantic way to limit concurrency is to return 503 + Retry-After
in case of resource saturation (e.g. thrashing, connection queues too long,
Service Level Objectives not meet, ..).
Saturation conditions can be either dynamic or static: all this is out of
the scope for the current document.</t>
        </li>
        <li>
          <t>Do a positive value of <tt>RateLimit-Remaining</tt> imply any service guarantee for my
future requests to be served?  </t>
          <t>
No. FAQ integrated in <xref target="ratelimit-remaining-field"/>.</t>
        </li>
        <li>
          <t>Is the quota-policy definition <xref target="quota-policy"/> too complex?  </t>
          <t>
You can always return the simplest form of the 3 fields</t>
        </li>
      </ol>
      <sourcecode type="example"><![CDATA[
RateLimit-Limit: 100
RateLimit-Remaining: 50
RateLimit-Reset: 60
]]></sourcecode>
      <t>The key runtime value is the first element of the list: <tt>expiring-limit</tt>, the others <tt>quota-policy</tt> are informative.
   So for the following field:</t>
      <sourcecode type="example"><![CDATA[
RateLimit-Limit: 100
RateLimit-Policy: 100;w=60;burst=1000;comment="sliding window", 5000;w=3600;burst=0;comment="fixed window"
]]></sourcecode>
      <t>the key value is the one referencing the lowest limit: <tt>100</tt></t>
      <ol spacing="normal" type="1"><li>Can we use shorter names? Why don't put everything in one field?</li>
      </ol>
      <t>The most common syntax we found on the web is <tt>X-RateLimit-*</tt> and
   when starting this I-D <eref target="https://github.com/ioggstream/draft-polli-ratelimit-headers/issues/34#issuecomment-519366481">we opted for it</eref></t>
      <t>The basic form of those fields is easily parseable, even by
   implementers processing responses using technologies like
   dynamic interpreter with limited syntax.</t>
      <t>Using a single field complicates parsing and takes
   a significantly different approach from the existing
   ones: this can limit adoption.</t>
      <ol spacing="normal" type="1"><li>
          <t>Why don't mention connections?  </t>
          <t>
Beware of the term "connection":
&amp;#65532;
&amp;#65532;   - it is just <em>one</em> possible saturation cause. Once you go that path
&amp;#65532;     you will expose other infrastructural details (bandwidth, CPU, .. see <xref target="sec-information-disclosure"/>)
&amp;#65532;     and complicate client compliance;
&amp;#65532;   - it is an infrastructural detail defined in terms of server and network
&amp;#65532;     rather than the consumed service.
  This specification protects the services first,
  and then the infrastructures through client cooperation (see <xref target="sec-throttling-does-not-prevent"/>).
&amp;#65532;
&amp;#65532;   RateLimit fields enable sending <em>on the same connection</em> different limit values
&amp;#65532;   on each response, depending on the policy scope (e.g. per-user, per-custom-key, ..)
&amp;#65532;</t>
        </li>
        <li>
          <t>Can intermediaries alter RateLimit fields?  </t>
          <t>
Generally, they should not because it might result in unserviced requests.
There are reasonable use cases for intermediaries mangling RateLimit fields though,
e.g. when they enforce stricter quota-policies,
or when they are an active component of the service.
In those case we will consider them as part of the originating infrastructure.</t>
        </li>
        <li>
          <t>Why the <tt>w</tt> parameter is just informative?
Could it be used by a client to determine the request rate?  </t>
          <t>
A non-informative <tt>w</tt> parameter might be fine in an environment
where clients and servers are tightly coupled. Conveying policies
with this detail on a large scale would be very complex and implementations
would be likely not interoperable. We thus decided to leave <tt>w</tt> as
an informational parameter and only rely on <tt>RateLimit-Limit</tt>,
<tt>RateLimit-Remaining</tt> and <tt>RateLimit-Reset</tt> for defining the throttling
behavior.</t>
        </li>
      </ol>
    </section>
    <section numbered="false" removeInRFC="true" anchor="ratelimit-fields-currently-used-on-the-web">
      <name>RateLimit fields currently used on the web</name>
      <t>Commonly used header field names are:</t>
      <ul spacing="normal">
        <li>
          <tt>X-RateLimit-Limit</tt>,
<tt>X-RateLimit-Remaining</tt>,
  <tt>X-RateLimit-Reset</tt>;</li>
        <li>
          <tt>X-Rate-Limit-Limit</tt>,
<tt>X-Rate-Limit-Remaining</tt>,
  <tt>X-Rate-Limit-Reset</tt>.</li>
      </ul>
      <t>There are variants too, where the window is specified
in the header field name, eg:</t>
      <ul spacing="normal">
        <li>
          <tt>x-ratelimit-limit-minute</tt>, <tt>x-ratelimit-limit-hour</tt>, <tt>x-ratelimit-limit-day</tt></li>
        <li>
          <tt>x-ratelimit-remaining-minute</tt>, <tt>x-ratelimit-remaining-hour</tt>, <tt>x-ratelimit-remaining-day</tt></li>
      </ul>
      <t>Here are some interoperability issues:</t>
      <ul spacing="normal">
        <li>
          <t><tt>X-RateLimit-Remaining</tt> references different values, depending on the implementation:  </t>
          <ul spacing="normal">
            <li>seconds remaining to the window expiration</li>
            <li>milliseconds remaining to the window expiration</li>
            <li>seconds since UTC, in UNIX Timestamp <xref target="UNIX"/></li>
            <li>a datetime, either <tt>IMF-fixdate</tt> <xref target="SEMANTICS"/> or <xref target="RFC3339"/></li>
          </ul>
        </li>
        <li>
          <t>different headers, with the same semantic, are used by different implementers:  </t>
          <ul spacing="normal">
            <li>X-RateLimit-Limit and X-Rate-Limit-Limit</li>
            <li>X-RateLimit-Remaining and X-Rate-Limit-Remaining</li>
            <li>X-RateLimit-Reset and X-Rate-Limit-Reset</li>
          </ul>
        </li>
      </ul>
      <t>The semantic of RateLimit-Remaining depends on the windowing algorithm.
A sliding window policy for example may result in having a
<tt>RateLimit-Remaining</tt>
value related to the ratio between the current and the maximum throughput.
e.g.</t>
      <sourcecode type="example"><![CDATA[
RateLimit-Limit: 12
RateLimit-Policy: 12;w=1
RateLimit-Remaining: 6          ; using 50% of throughput, that is 6 units/s
RateLimit-Reset: 1
]]></sourcecode>
      <t>If this is the case, the optimal solution is to achieve</t>
      <sourcecode type="example"><![CDATA[
RateLimit-Limit: 12
RateLimit-Policy: 12;w=1
RateLimit-Remaining: 1          ; using 100% of throughput, that is 12 units/s
RateLimit-Reset: 1
]]></sourcecode>
      <t>At this point you should stop increasing your request rate.</t>
    </section>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>Thanks to Willi Schoenborn, Alejandro Martinez Ruiz, Alessandro Ranellucci,
Amos Jeffries,
Martin Thomson,
Erik Wilde and Mark Nottingham for being the initial contributors
of these specifications.
Kudos to the first community implementers:
Aapo Talvensaari,
Nathan Friedly
and Sanyam Dogra.</t>
      <t>In addition to the people above, this document owes a lot to the extensive discussion
in the HTTPAPI workgroup, including
Rich Salz,
Darrel Miller
and Julian Reschke.</t>
    </section>
    <section numbered="false" removeInRFC="true" anchor="changes">
      <name>Changes</name>
      <section numbered="false" removeInRFC="true" anchor="since-draft-ietf-httpapi-ratelimit-headers-03">
        <name>Since draft-ietf-httpapi-ratelimit-headers-03</name>
        <ul spacing="normal">
          <li>Split policy informatio in RateLimit-Policy #81</li>
        </ul>
      </section>
      <section numbered="false" removeInRFC="true" anchor="since-draft-ietf-httpapi-ratelimit-headers-02">
        <name>Since draft-ietf-httpapi-ratelimit-headers-02</name>
        <ul spacing="normal">
          <li>Address throttling scope #83</li>
        </ul>
      </section>
      <section numbered="false" removeInRFC="true" anchor="since-draft-ietf-httpapi-ratelimit-headers-01">
        <name>Since draft-ietf-httpapi-ratelimit-headers-01</name>
        <ul spacing="normal">
          <li>Update IANA considerations #60</li>
          <li>Use Structured fields #58</li>
          <li>Reorganize document #67</li>
        </ul>
      </section>
      <section numbered="false" removeInRFC="true" anchor="since-draft-ietf-httpapi-ratelimit-headers-00">
        <name>Since draft-ietf-httpapi-ratelimit-headers-00</name>
        <ul spacing="normal">
          <li>Use I-D.httpbis-semantics, which includes referencing <tt>delay-seconds</tt>
instead of <tt>delta-seconds</tt>. #5</li>
        </ul>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
sgAA

-->

</rfc>
