<?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.13 (Ruby 3.1.2) -->
<?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-05" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.13.0 -->
  <front>
    <title>RateLimit Fields for HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpapi-ratelimit-headers-05"/>
    <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="July" day="06"/>
    <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 and RateLimit-Policy 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>
    </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 "Retry-After" header field
defined in <xref target="HTTP"/> 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>RateLimit-Limit: containing the requests quota in the time window;</li>
        <li>RateLimit-Remaining: containing the remaining requests quota in the current window;</li>
        <li>RateLimit-Reset: containing the time remaining in the current window, specified in seconds;</li>
        <li>RateLimit-Policy: containing the quota policy information.</li>
      </ul>
      <t>The behavior of the RateLimit-Reset field is compatible with the delay-seconds notation of Retry-After.</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 <xref section="7" sectionFormat="of" target="WEB-ORIGIN"/>).
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 <xref section="15.3" sectionFormat="of" target="HTTP"/>) 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 <xref section="5.6.1" sectionFormat="of" target="HTTP"/>.</t>
        <t>The term Origin is to be interpreted as described in Section 7 of <xref target="WEB-ORIGIN"/>.</t>
        <t>This document uses the following terminology from <xref section="3" sectionFormat="of" target="STRUCTURED-FIELDS"/>
to specify syntax and parsing: List, Item and Integer
together with the concept of bare item.</t>
        <t>The fields defined in this document are collectively named "RateLimit fields".</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 interval.</t>
        <t>The "time-window" is a non-negative Integer value expressing such interval in seconds
compatible with the "delay-seconds" rule defined in <xref section="10.2.3" sectionFormat="of" target="HTTP"/>.</t>
        <t>Subsecond precision is not supported.</t>
      </section>
      <section anchor="service-limit">
        <name>Service limit and quota units</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 <xref target="time-window"> time window</xref>.</t>
        <t>The service-limit is a non-negative Integer
expressed in "quota-units".</t>
        <t>The service-limit SHOULD match the maximum number of acceptable requests.</t>
        <t>The service-limit MAY differ from the total number of acceptable requests
when weight mechanisms, bursts, or other server policies are implemented.</t>
        <t>If the service-limit 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>A "quota-policy" describes a quota policy in terms of <xref target="service-limit">quota-units</xref>
and <xref target="time-window"> time-window</xref>.
Its value is an Item
where the associated bare item is a <xref target="service-limit"> service-limit</xref> and parameters are supported.</t>
        <t>The following parameters are defined:</t>
        <dl>
          <dt>w:</dt>
          <dd>
            <t>The REQUIRED "w" parameter value conveys
a "time-window" value as 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 RateLimit fields to communicate its quota policies
according to the following rules:</t>
      <ul spacing="normal">
        <li>RateLimit-Limit and RateLimit-Reset fields are REQUIRED;</li>
        <li>RateLimit-Remaining field 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 RateLimit fields independently
of the response status code.
This includes throttled responses.</t>
      <t>This document does not mandate any correlation between the RateLimit
field values and the returned status code.</t>
      <t>Servers should be careful in returning RateLimit fields in
redirection responses (e.g. 3xx status codes) because
a low RateLimit-Remaining field value could prevent the client
from issuing requests.
For example, given the RateLimit fields below,
a client could decide to wait 10 seconds before following
the "Location" header field (see <xref section="10.2.2" sectionFormat="of" target="HTTP"/>),
because the RateLimit-Remaining field value 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 Retry-After and the RateLimit-Reset fields,
the RateLimit-Reset field value SHOULD reference the same point in time as
the Retry-After field value.</t>
      <t>When using a policy involving more than one time-window,
the server MUST reply with the RateLimit fields related to the time window
with the lower RateLimit-Remaining field values.</t>
      <t>A service returning RateLimit fields MUST NOT convey values
exposing an unwanted volume of requests
and SHOULD implement mechanisms to cap the ratio between RateLimit-Remaining
and RateLimit-Reset field values (see <xref target="sec-resource-exhaustion"/>);
this is especially important when quota-policies use a large time-window.</t>
      <t>Under certain conditions, a server MAY artificially lower RateLimit 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 RateLimit fields
in a trailer section.</t>
      <section anchor="performance-considerations">
        <name>Performance considerations</name>
        <t>Servers are not required to return RateLimit fields
in every response,
and clients need to take this into account.
For example, an implementer concerned with performance might
provide RateLimit 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 validate the values received in the RateLimit fields before using them
and check if there are significant discrepancies
with the expected ones.
This includes a RateLimit-Reset field moment too far in the future
(e.g. similarly to receiving "Retry-after: 1000000")
or a service-limit too high.</t>
      <t>A client receiving RateLimit fields MUST NOT assume that subsequent
responses contain the same RateLimit fields, or any RateLimit fields
at all.</t>
      <t>Malformed RateLimit fields MAY be ignored.</t>
      <t>A client SHOULD NOT exceed the quota-units conveyed by the RateLimit-Remaining field before the time-window expressed
in RateLimit-Reset field.</t>
      <t>A client MAY still probe the server if the RateLimit-Reset field is considered too high.</t>
      <t>The value of RateLimit-Reset field is generated at response time:
a client aware of a significant network latency MAY behave accordingly
and use other information (e.g. the "Date" response header field, or otherwise gathered metrics) to better
estimate the RateLimit-Reset field moment intended by the server.</t>
      <t>The details provided in RateLimit-Policy field are informative
and MAY be ignored.</t>
      <t>If a response contains both the RateLimit-Reset and Retry-After fields,
the Retry-After field MUST take precedence and
the RateLimit-Reset field 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
<xref section="16.3.2" sectionFormat="of" target="HTTP"/>.</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>
        <t><xref target="privacy">Privacy considerations</xref> provide further guidance
on intermediaries.</t>
      </section>
      <section anchor="caching">
        <name>Caching</name>
        <t>As is the ordinary case for HTTP caching (<xref target="HTTP-CACHING"/>), a response with
RateLimit fields might be cached and re-used for subsequent requests.
A cached response containing RateLimit fields does not modify quota counters but could
contain stale information.
Clients interested in determining the freshness of the RateLimit fields
could rely on fields such as the Date header field
and on the time-window of a quota-policy.</t>
      </section>
    </section>
    <section anchor="fields-definition">
      <name>Fields definition</name>
      <t>The following RateLimit response fields are defined</t>
      <section anchor="ratelimit-limit-field">
        <name>RateLimit-Limit</name>
        <t>The "RateLimit-Limit" response field indicates
the <xref target="service-limit"> service-limit</xref> associated to the client
in the current <xref target="time-window"> time-window</xref>.</t>
        <t>If the client exceeds that limit, it MAY not be served.</t>
        <t>The field is an Item
and its value is a non-negative Integer
named "expiring-limit".
Parameters are not allowed.</t>
        <t>The expiring-limit MUST be set to the service-limit that is closer to reach its limit,
and the associated time-window MUST either be:</t>
        <ul spacing="normal">
          <li>inferred by the value of RateLimit-Reset field at the moment of the reset, or</li>
          <li>communicated out-of-band (e.g. in the documentation).</li>
        </ul>
        <t>The RateLimit-Policy field (see <xref target="ratelimit-policy-field"/>),
might contain information on the associated time-window.</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 RateLimit-Policy field response field indicates
the quota associated to the client
and its value is informative.</t>
        <t>The field is a non-empty List of Items.
Each item is a <xref target="quota-policy">quota policy</xref>.</t>
        <t>This field can convey the time-window associated to the expiring-limit,
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
quota-policy 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 RateLimit-Remaining field response field indicates the remaining quota-units defined in <xref target="service-limit"/>
associated to the client.</t>
        <t>The field is an Item
and its value is a non-negative Integer
expressed in <xref target="service-limit">quota-units</xref>.
Parameters are not allowed.</t>
        <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 RateLimit-Remaining field value is
a guarantee that further requests will be served.</t>
        <t>A low RateLimit-Remaining field value is like a yellow traffic-light
for either the number of requests issued in the time-window
or the request throughput:
the red light may arrive suddenly
(see <xref target="providing-ratelimit-fields"/>).</t>
        <t>One example of RateLimit-Remaining field use is below.</t>
        <sourcecode type="example"><![CDATA[
   RateLimit-Remaining: 50
]]></sourcecode>
      </section>
      <section anchor="ratelimit-reset-field">
        <name>RateLimit-Reset</name>
        <t>The RateLimit-Reset field response field indicates
the number of seconds until the quota resets.</t>
        <t>The field is a non-negative Integer compatible with
the delay-seconds rule, 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 <xref section="5.6.7" sectionFormat="of" target="HTTP"/>);</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 RateLimit-Reset field use is below.</t>
        <sourcecode type="example"><![CDATA[
   RateLimit-Reset: 50
]]></sourcecode>
        <t>The client MUST NOT assume that all its service-limit will be restored
after the moment referenced by RateLimit-Reset field.
The server MAY arbitrarily alter the RateLimit-Reset field 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>RateLimit fields convey hints from the server
to the clients in order to avoid being throttled out.</t>
        <t>Clients MUST NOT consider the <xref target="service-limit">quota-units</xref> returned in RateLimit-Remaining field
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 service-limit might not be restored after the moment referenced by RateLimit-Reset field,
and the RateLimit-Reset field value do not be considered fixed nor constant.</t>
        <t>Subsequent requests might return a higher RateLimit-Reset field 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 RateLimit-Reset field you must be aware that many throttled
clients may come back at the very moment specified.</t>
        <t>This is true for Retry-After too.</t>
        <t>For example, if the quota resets every day at <tt>18:00:00</tt>
and your server returns the RateLimit-Reset field 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 time-window, 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 RateLimit 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 RateLimit-Remaining field and
RateLimit-Reset field could infer an average throughput of
1000 quota-units per second,
while the RateLimit-Limit field 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 RateLimit-Remaining field value
or an higher RateLimit-Reset field value.
Moreover, complementing large time-window quota-policies with
a short time-window one mitigates those risks.</t>
      </section>
      <section anchor="denial-of-service">
        <name>Denial of Service</name>
        <t>RateLimit fields may assume unexpected values by chance or purpose.
For example, an excessively high RateLimit-Remaining field 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 RateLimit-Reset field 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">
      <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="HTTP"/>):</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 RFC nnnn</td>
          </tr>
          <tr>
            <td align="left">RateLimit-Remaining</td>
            <td align="left">permanent</td>
            <td align="left">
              <xref target="ratelimit-remaining-field"/> of RFC nnnn</td>
          </tr>
          <tr>
            <td align="left">RateLimit-Reset</td>
            <td align="left">permanent</td>
            <td align="left">
              <xref target="ratelimit-reset-field"/> of RFC nnnn</td>
          </tr>
          <tr>
            <td align="left">RateLimit-Policy</td>
            <td align="left">permanent</td>
            <td align="left">
              <xref target="ratelimit-policy-field"/> of RFC nnnn</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="STRUCTURED-FIELDS"/>.</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 RFC nnnn</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="HTTP">
          <front>
            <title>HTTP Semantics</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="2022"/>
            <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. </t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="WEB-ORIGIN">
          <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="STRUCTURED-FIELDS">
          <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="HTTP-CACHING">
          <front>
            <title>HTTP 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="2022"/>
            <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>
              <t>This document obsoletes RFC 7234.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="98"/>
          <seriesInfo name="RFC" value="9111"/>
          <seriesInfo name="DOI" value="10.17487/RFC9111"/>
        </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 4xx 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 time-window 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 RateLimit-Remaining field value 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 RateLimit 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 RateLimit-Limit and RateLimit-Remaining field values.</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 Retry-After.</t>
          <t>In this example, the values of Retry-After and RateLimit-Reset field 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 quota-units left for the next 50 seconds.
The time-window is communicated by the <tt>w</tt> parameter, so we know the throughput is 100 quota-units 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 the RateLimit-Limit field 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  RateLimit-Remaining field 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 the RateLimit-Limit field: 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 Retry-After, 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
Retry-After 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 RateLimit-Remaining field 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 RateLimit-Limit and RateLimit-Reset field.</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 RateLimit 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 expiring-limit 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 fields 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="HTTP"/>, 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 Retry-After, which is returned in similar contexts,
eg on 429 responses.  </t>
          <t>
Timestamps require a clock synchronization protocol
(see <xref section="5.6.7" sectionFormat="of" target="HTTP"/>).
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 RateLimit-Remaining field 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 quota-policy 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 RateLimit-Limit,
RateLimit-Remaining field and RateLimit-Reset field 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="HTTP"/> 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
RateLimit-Remaining field
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 delay-seconds
instead of delta-seconds. #5</li>
        </ul>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
5pMuwARfgSlpK25gZ8n/BsdU2EZIsgAA

-->

</rfc>
