<?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.7.24 (Ruby 3.3.6) -->
<?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-09" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.0 -->
  <front>
    <title>RateLimit header fields for HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpapi-ratelimit-headers-09"/>
    <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>
    <author initials="D." surname="Miller" fullname="Darrel Miller">
      <organization>Microsoft</organization>
      <address>
        <email>darrel@tavis.ca</email>
      </address>
    </author>
    <date year="2025" month="March" day="18"/>
    <area>Applications and Real-Time</area>
    <workgroup>HTTPAPI</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 57?>

<t>This document defines the RateLimit-Policy and RateLimit HTTP header fields for servers to advertise their quota policies and the current service limits, thereby allowing clients to avoid being throttled.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-httpapi-ratelimit-headers/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        HTTPAPI Working Group mailing list (<eref target="mailto:httpapi@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/httpapi/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/httpapi/"/>.
        Working Group information can be found at <eref target="https://datatracker.ietf.org/wg/httpapi/about/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-httpapi/ratelimit-headers"/>.</t>
    </note>
  </front>
  <middle>
    <?line 61?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Rate limiting of HTTP clients has become a widespread practice, especially for HTTP APIs. Typically, servers who do so limit the number of acceptable requests in a given time window (e.g. 10 requests per second). See <xref target="rate-limiting"/> for further information on the current usage of rate limiting in HTTP.</t>
      <t>Currently, there is no standard way for servers to communicate quotas so that clients can throttle their requests to prevent errors. This document defines a set of standard HTTP header fields to enable rate limiting:</t>
      <ul spacing="normal">
        <li>
          <t>RateLimit-Policy: a quota policy, defined by the server, that client HTTP requests will consume.</t>
        </li>
        <li>
          <t>RateLimit: the currently remaining quota available for a specific policy.</t>
        </li>
      </ul>
      <t>These fields enable establishing complex rate limiting policies, including using multiple and variable time windows and dynamic quotas, and implementing concurrency limits.</t>
      <section anchor="goals">
        <name>Goals</name>
        <t>The goals of this document are:</t>
        <dl>
          <dt>Interoperability:</dt>
          <dd>
            <t>Standardize 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 header fields are not meant to support authorization or other kinds of access controls.</t>
          </dd>
          <dt>Response status code:</dt>
          <dd>
            <t>RateLimit header 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 does it mandates any correlation between the RateLimit values and the returned status code.</t>
          </dd>
          <dt>Throttling algorithm:</dt>
          <dd>
            <t>This specification does not mandate a specific throttling algorithm. 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.
<?line -6?>
        </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 terms List, Item and Integer from <xref section="3" sectionFormat="of" target="STRUCTURED-FIELDS"/> to specify syntax and parsing, along with the concept of "bare item".</t>
        <t>The term "problem type" in this document is to be interpreted as described in <xref target="PROBLEM"/>.</t>
      </section>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <dl>
        <dt>Quota:</dt>
        <dd>
          <t>A quota is an allocation of capacity used by a resource server to limit client requests. That capacity is measured in quota units and may be reallocated at the end of a time window.</t>
        </dd>
        <dt>Quota Unit:</dt>
        <dd>
          <t>A quota unit is the unit of measurement used to measure the activity of a client.</t>
        </dd>
        <dt>Quota Partition:</dt>
        <dd>
          <t>A quota partition is a division of a server's capacity across different clients, users and owned resources.</t>
        </dd>
        <dt>Time Window:</dt>
        <dd>
          <t>A time window indicates a period of time associated to the allocated quota.</t>
        </dd>
        <dt>Quota Policy:</dt>
        <dd>
          <t>A quota policy is implemented by the server to regulate the activity within a specified quota partition, quantified in quota units, over a defined time window. This activity is restricted to a predefined limit, known as the quota. Quota policies can be advertised by servers, but they are not required to be, and more than one quota policy can affect a given request from a client to a server.</t>
        </dd>
        <dt>Service Limit:</dt>
        <dd>
          <t>A service limit is the currently remaining quota from a specific quota policy and, if defined, the remaining time before quota is reallocated.</t>
        </dd>
        <dt>List:</dt>
        <dd>
          <t>A <xref target="STRUCTURED-FIELDS"/> list of Items</t>
        </dd>
        <dt>Item:</dt>
        <dd>
          <t>A <xref target="STRUCTURED-FIELDS"/> item with a set of associated parameters</t>
        </dd>
      </dl>
    </section>
    <section anchor="ratelimit-policy-field">
      <name>RateLimit-Policy Field</name>
      <t>The "RateLimit-Policy" response header field is a non-empty List<xref target="RFC8941"/> of Quota Policy Items (<xref target="quotapolicy-item"/>). The Item<xref target="RFC8941"/> value MUST be a String<xref target="RFC8941"/>.</t>
      <t>The field value SHOULD remain consistent over a sequence of HTTP responses. It is this characteristic that differentiates it from the <xref target="ratelimit-field">RateLimit</xref> field that contains information that MAY change on every request. The "RateLimit-Policy" field enables clients to control their own flow of requests based on policy information provided by the server. Situations where throttling constraints are highly dynamic are better served using the (RateLimit field)[{#ratelimit-field}] that communicates the latest service information a client can react to. Both fields can be communicated by the server when appropriate.</t>
      <t>Lists of Quota Policy Items (<xref target="quotapolicy-item"/>) can be split over multiple "RateLimit-Policy" fields in the same HTTP response as described in <xref section="3.1" sectionFormat="of" target="STRUCTURED-FIELDS"/>.</t>
      <artwork><![CDATA[
   RateLimit-Policy: "burst";q=100;w=60,"daily";q=1000;w=86400
]]></artwork>
      <section anchor="quotapolicy-item">
        <name>Quota Policy Item</name>
        <t>A quota policy Item contains an identifier for the policy and a set of Parameters<xref target="RFC8941"/> that contain information about a server's capacity allocation for the policy.</t>
        <t>The following parameters are defined:</t>
        <dl>
          <dt>q:</dt>
          <dd>
            <t>The REQUIRED "q" parameter indicates the quota allocated by this policy measured in quota units.</t>
          </dd>
          <dt>qu:</dt>
          <dd>
            <t>The OPTIONAL "qu" parameter value conveys the quota units associated to the "q" parameter. The default quota unit is "requests".</t>
          </dd>
          <dt>w:</dt>
          <dd>
            <t>The OPTIONAL "w" parameter value conveys a time window.</t>
          </dd>
          <dt>pk:</dt>
          <dd>
            <t>The OPTIONAL "pk" parameter value conveys the partition key associated to the corresponding request.</t>
          </dd>
        </dl>
        <t>Other parameters are allowed and can be regarded as comments.</t>
        <t>Implementation- or service-specific parameters SHOULD be prefixed parameters with a vendor identifier, e.g. <tt>acme-policy</tt>, <tt>acme-burst</tt>.</t>
        <t>This field MUST NOT appear in a trailer section.</t>
        <section anchor="ratelimitpolicy-quota">
          <name>Quota Parameter</name>
          <t>The "q" parameter value MUST be a non-negative Integer. The value indicates the quota allocated for client activity (measured in quota units) for a given quota partition.</t>
        </section>
        <section anchor="ratelimitpolicy-quotaunit">
          <name>Quota Unit Parameter</name>
          <t>The "qu" parameter value conveys the quota units applicable to the quota (<xref target="ratelimitpolicy-quota"/>). The value MUST be a String. Allowed values are listed in the <xref target="ratelimit-quota-unit-registry">RateLimit Quota Units registry</xref>. This specification defines three quota units:</t>
          <dl>
            <dt>requests:</dt>
            <dd>
              <t>This value indicates the quota is based on the number of requests processed by the resource server. Whether a specific request actually consumes a quota unit is implementation-specific.</t>
            </dd>
            <dt>content-bytes:</dt>
            <dd>
              <t>This value indicates the quota is based on the number of content bytes processed by the resource server.</t>
            </dd>
            <dt>concurrent-requests:</dt>
            <dd>
              <t>This value indicates the quota is based on the number of concurrent requests processed by the resource server.</t>
            </dd>
          </dl>
        </section>
        <section anchor="ratelimitpolicy-window">
          <name>Window Parameter</name>
          <t>The "w" parameter value conveys a time window applicable to the quota (<xref target="ratelimitpolicy-quota"/>). The time window MUST be a non-negative, non-zero, Integer value expressing an interval in seconds, similar to the "delay-seconds" rule defined in <xref section="10.2.3" sectionFormat="of" target="HTTP"/>. Sub-second precision is not supported.</t>
        </section>
        <section anchor="ratelimitpolicy-partitionkey">
          <name>Partition Key Parameter</name>
          <t>The "pk" parameter value conveys the partition key associated to the request. The value MUST be a Byte Sequence. Servers MAY use the partition key to divide server capacity across different clients and resources. Quotas are allocated per partition key.</t>
        </section>
      </section>
      <section anchor="ratelimit-policy-field-examples">
        <name>RateLimit Policy Field Examples</name>
        <t>This field MAY convey the time window associated with the quota, as shown in this example:</t>
        <artwork><![CDATA[
   RateLimit-Policy: "default";q=100;w=10
]]></artwork>
        <t>These examples show multiple policies being returned:</t>
        <artwork><![CDATA[
   RateLimit-Policy: "permin";q=50;w=60,"perhr";q=1000;w=3600
]]></artwork>
        <t>The following example shows a policy with a partition key:</t>
        <artwork><![CDATA[
   RateLimit-Policy: "peruser";q=100;w=60;pk=:cHsdsRa894==:
]]></artwork>
        <t>The following example shows a policy with a partition key and a quota unit:</t>
        <artwork><![CDATA[
   RateLimit-Policy: "peruser";q=65535;qu="content-bytes";w=10;pk=:sdfjLJUOUH==:
]]></artwork>
      </section>
    </section>
    <section anchor="ratelimit-field">
      <name>RateLimit Field</name>
      <t>A server uses the "RateLimit" response header field to communicate the current service limit for a quota policy for a particular partition key.</t>
      <t>The field is expressed as a List<xref target="RFC8941"/> of Service Limit Items (<xref target="servicelimit-item"/>).</t>
      <t>Lists of Service Limit Items can be split over multiple "RateLimit" fields in the same HTTP response as described in <xref section="3.1" sectionFormat="of" target="STRUCTURED-FIELDS"/>.</t>
      <artwork><![CDATA[
   RateLimit: "default";r=50;t=30
]]></artwork>
      <section anchor="servicelimit-item">
        <name>Service Limit Item</name>
        <t>Each service limit Item<xref target="RFC8941"/> identifies the quota policy (<xref target="quotapolicy-item"/>) associated with the request and contains Parameters<xref target="RFC8941"/> with information about the current service limit.</t>
        <t>The following parameters are defined in this specification:</t>
        <dl>
          <dt>r:</dt>
          <dd>
            <t>This REQUIRED parameter value conveys the remaining quota units for the identified policy (<xref target="ratelimit-remaining-parameter"/>).</t>
          </dd>
          <dt>t:</dt>
          <dd>
            <t>This OPTIONAL parameter value conveys the time window reset time for the identified policy (<xref target="ratelimit-reset-parameter"/>).</t>
          </dd>
          <dt>pk:</dt>
          <dd>
            <t>The OPTIONAL "pk" parameter value conveys the partition key associated to the corresponding request.</t>
          </dd>
        </dl>
        <t>This field cannot appear in a trailer section. Other parameters are allowed and can be regarded as comments.</t>
        <t>Implementation- or service-specific parameters SHOULD be prefixed parameters with a vendor identifier, e.g. <tt>acme-policy</tt>, <tt>acme-burst</tt>.</t>
        <section anchor="ratelimit-remaining-parameter">
          <name>Remaining Parameter</name>
          <t>The "r" parameter indicates the remaining quota units for the identified policy (<xref target="ratelimit-remaining-parameter"/>).</t>
          <t>It is a non-negative Integer expressed in quota units.
Clients MUST NOT assume that a positive remaining value is a guarantee that further requests will be served.
When the remaining parameter value is low, it indicates that the server may soon throttle the client (see <xref target="providing-ratelimit-fields"/>).</t>
        </section>
        <section anchor="ratelimit-reset-parameter">
          <name>Reset Parameter</name>
          <t>The "t" parameter indicates the number of seconds until the quota associated with the quota policy resets.</t>
          <t>It is a non-negative Integer compatible with the delay-seconds rule, because:</t>
          <ul spacing="normal">
            <li>
              <t>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"/>);</t>
            </li>
            <li>
              <t>it mitigates the risk related to thundering herd when too many clients are serviced with the same timestamp.</t>
            </li>
          </ul>
          <t>The client MUST NOT assume that all its service limit will be reset at the moment indicated by the reset parameter. The server MAY arbitrarily alter the reset parameter value between subsequent requests; for example, in case of resource saturation or to implement sliding window policies.</t>
        </section>
        <section anchor="ratelimit-partitionkey">
          <name>Partition Key Parameter</name>
          <t>The "pk" parameter value conveys the partition key associated to the request. The value MUST be a Byte Sequence. Servers MAY use the partition key to divide server capacity across different clients and resources. Quotas are allocated per partition key.</t>
        </section>
      </section>
      <section anchor="ratelimit-field-examples">
        <name>RateLimit Field Examples</name>
        <t>This example shows a RateLimit field with a remaining quota of 50 units and a time window reset in 30 seconds:</t>
        <artwork><![CDATA[
   RateLimit: "default";r=50;t=30
]]></artwork>
        <t>This example shows a remaining quota of 999 requests for a partition key that has no time window reset:</t>
        <artwork><![CDATA[
   RateLimit: "default";r=999;pk=:dHJpYWwxMjEzMjM=:
]]></artwork>
        <t>This example shows a 300MB remaining quota for an application in the next 60 seconds:</t>
        <artwork><![CDATA[
   RateLimit: "default";r=300000000;t=60;pk=:QXBwLTk5OQ==:
]]></artwork>
      </section>
    </section>
    <section anchor="problem-types">
      <name>Problem Types</name>
      <section anchor="quota-exceeded">
        <name>Quota Exceeded</name>
        <t>This section defines the "https://iana.org/assignments/http-problem-types#quota-exceeded" problem type. A server MAY use this problem type if it wants to communicate to the client that the requests sent by the client exceed one or more Quota Policies. This problem type defines the extension member "violated-policies" as an array of strings, whose value is the names of policies where the quota was exceeded.</t>
        <sourcecode type="http-message"><![CDATA[
HTTP/1.1 429 Bad Request
Content-Type: application/problem+json

{
  "type": "https://iana.org/assignments/http-problem-types#quota-exceeded",
  "title": "Request cannot be satisifed as assigned quota has been exceeded",
  "violated-policies": ["daily","bandwidth"]
}
]]></sourcecode>
      </section>
      <section anchor="temporary-reduced-capacity">
        <name>Temporary Reduced Capacity</name>
        <t>This section defines the "https://iana.org/assignments/http-problem-types#temporary-reduced-capacity" problem type. A server MAY use this problem type if it wants to communicate to the client that the requests sent by the client exceed cannot currently be satisfied due to a temporary reduction in capacity due to service limitations. The server MAY chose to include a RateLimit-Policy field indicating the new temporarily lower quota. This problem type defines the extension member "violated-policies" as an array of strings, whose value is the names of policies where the quota was exceeded.</t>
        <sourcecode type="http-message"><![CDATA[
HTTP/1.1 503 Server Unavailable
Content-Type: application/problem+json

{
  "type": "https://iana.org/assignments/http-problem-types#temporary-reduced-capacity",
  "title": "Request cannot be satisifed due to temporary server capacity constraints",
  "violated-policies": ["hourly"]
}
]]></sourcecode>
      </section>
      <section anchor="abnormal-usage-detected">
        <name>Abnormal Usage Detected</name>
        <t>This section defines the "https://iana.org/assignments/http-problem-types#abnormal-usage-detected" problem type. A server MAY use this problem type  to communicate to the client that it has detected a pattern of requests that suggest unintentional or malicous behaviour on the part of the client. This problem type defines the extension member "violated-policies" as an array of strings, whose value is the names of policies where the quota was exceeded.</t>
        <sourcecode type="http-message"><![CDATA[
HTTP/1.1 429 Too Many Requests
Content-Type: application/problem+json

{
  "type": "https://iana.org/assignments/http-problem-types#abnormal-usage-detected",
  "title": "Request not satisifed due to detection of abnormal request pattern",
  "violated-policies": ["hourly"]
}
]]></sourcecode>
      </section>
    </section>
    <section anchor="providing-ratelimit-fields">
      <name>Server Behavior</name>
      <t>A server MAY return RateLimit header fields independently of the response status code. This includes throttled responses. This document does not mandate any correlation between the RateLimit header field values and the returned status code.</t>
      <t>Servers should be careful when returning RateLimit header fields in redirection responses (i.e., responses with 3xx status codes) because a low remaining parameter value could prevent the client from issuing requests. For example, given the RateLimit header 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 remaining parameter value is 0.</t>
      <sourcecode type="http-message"><![CDATA[
HTTP/1.1 301 Moved Permanently
Location: /foo/123
RateLimit: "problemPolicy";r=0;t=10

]]></sourcecode>
      <t>If a response contains both the Retry-After and the RateLimit header fields, the reset parameter value SHOULD reference the same point in time as the Retry-After field value.</t>
      <t>A service using RateLimit header fields MUST NOT convey values exposing an unwanted volume of requests and SHOULD implement mechanisms to cap the ratio between the remaining and the reset parameter values (see <xref target="sec-resource-exhaustion"/>); this is especially important when a quota policy uses a large time window.</t>
      <t>Under certain conditions, a server MAY artificially lower RateLimit header field values between subsequent requests, e.g. to respond to Denial of Service attacks or in case of resource saturation.</t>
      <section anchor="generating-partition-keys">
        <name>Generating Partition Keys</name>
        <t>Servers MAY choose to return partition keys that distinguish between quota allocated to different consumers or different resources. There are a wide range of strategies for partitioning server capacity, including per user, per application, per HTTP method, per resource, or some combination of those values. The server SHOULD document how the partition key is generated so that clients can predict the key value for a future request and determine if there is sufficient quota remaining to execute the request. Servers should avoid returning partition keys that contain sensitive information. Servers SHOULD only use information that is present in the request to generate the partition key.</t>
      </section>
      <section anchor="performance-considerations">
        <name>Performance Considerations</name>
        <t>Servers are not required to return RateLimit header fields in every response, and clients need to take this into account. For example, an implementer concerned with performance might provide RateLimit header fields only when a given quota is close to exhaustion.</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>Client Behavior</name>
      <t>The RateLimit header fields can be used by clients to determine whether the associated request respected the server's quota policy, and as an indication of whether subsequent requests will. However, the server might apply other criteria when servicing future requests, and so the quota policy may not completely reflect whether requests will succeed.</t>
      <t>For example, a successful response with the following fields:</t>
      <artwork><![CDATA[
   RateLimit: "default";r=1;t=7
]]></artwork>
      <t>does not guarantee that the next request will be successful. Servers' behavior may be subject to other conditions.</t>
      <t>A client is responsible for ensuring that RateLimit header field values returned
cause reasonable client behavior with respect to throughput and latency
(see <xref target="sec-resource-exhaustion"/> and <xref target="sec-dos"/>).</t>
      <t>A client receiving RateLimit header fields MUST NOT assume that future responses will contain the same RateLimit header fields, or any RateLimit header fields at all.</t>
      <t>Malformed RateLimit header fields MUST be ignored.</t>
      <t>A client SHOULD NOT exceed the quota units conveyed by the remaining parameter before the time window expressed in the reset parameter.</t>
      <t>The value of the reset parameter 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 reset parameter moment intended by the server.</t>
      <t>The details provided in the RateLimit-Policy header field are informative and MAY be ignored.</t>
      <t>If a response contains both the RateLimit and Retry-After fields, the Retry-After field MUST take precedence and the reset parameter 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>
          <t>slowing down or pre-emptively back-off their request rate when
approaching quota limits;</t>
        </li>
        <li>
          <t>consuming all the quota according to the exposed limits and then wait.</t>
        </li>
      </ul>
      <section anchor="consuming-partition-keys">
        <name>Consuming Partition Keys</name>
        <t>Partition keys are useful for a client if it is likely that single client will make requests that consume different quota allocations. E.g. a client making requests on behalf of different users or for different resources that have independent quota allocations.</t>
        <t>If a server documents the partition key generation algorithm, clients MAY generate a partition key for a future request. Using this key, and comparing to the key returned by the server, the client can determine if there is sufficient quota remaining to execute the request.</t>
        <t>For cases where the partition key generation algorithm of a server is unknown, clients MAY use heuristics to guess if a future request will be successful based on its similarity to previous requests.</t>
      </section>
      <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 header fields' values in such a way as to communicate a more permissive quota policy; this includes removing the RateLimit header fields.</t>
        <t>An intermediary MAY alter the RateLimit header fields in such a way as to communicate a more restrictive quota policy when:</t>
        <ul spacing="normal">
          <li>
            <t>it is aware of the quota unit semantic used by the Origin Server;</t>
          </li>
          <li>
            <t>it implements this specification and enforces a quota policy which
is more restrictive than the one conveyed in the fields.</t>
          </li>
        </ul>
        <t>An intermediary SHOULD forward a request even when presuming that it might not be serviced; the service returning the RateLimit header 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><xref target="HTTP-CACHING"/> defines how responses can be stored and reused for subsequent requests,
including those with RateLimit header fields.
Because the information in RateLimit header fields on a cached response may not be current, they SHOULD be ignored on responses that come from cache
(i.e., those with a positive current_age; see <xref section="4.2.3" sectionFormat="of" target="HTTP-CACHING"/>).</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 from making requests.
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-successful responses consume quota,
if error responses (such as 401 (Unauthorized) and 403 (Forbidden)) count against 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 header fields might reveal the existence of an intermediary
to the user agent.</t>
        <t>Where partition keys contain identifying information, either of the client application or the user, servers should be aware of the potential for impersonation and apply the appropriate security mechanisms.</t>
      </section>
      <section anchor="sec-remaining-not-granted">
        <name>Remaining quota units are not granted requests</name>
        <t>RateLimit header fields convey hints from the server
to the clients in order to help them avoid being throttled out.</t>
        <t>Clients MUST NOT consider the quota returned in the <xref target="ratelimit-remaining-parameter">remaining parameter</xref> 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 the reset parameter</name>
        <t>Consider that quota might not be restored after the moment referenced by the <xref target="ratelimit-reset-parameter">reset parameter</xref>,
and the reset parameter value may not be constant.</t>
        <t>Subsequent requests might return a higher reset parameter 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 reset values, servers 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 reset parameter accordingly</t>
        <artwork><![CDATA[
   Date: Tue, 15 Nov 1994 18:00:00 GMT
   RateLimit: "daily";r=1;t=36400
]]></artwork>
        <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 reset 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 header fields.
The following example describes a service
with an unconsumed quota policy of 10000 quota units per 1000 seconds.</t>
        <artwork><![CDATA[
RateLimit-Policy: "somepolicy";q=10000;w=1000
RateLimit: "somepolicy";r=10000;t=10
]]></artwork>
        <t>A client implementing a simple ratio between remaining parameter and reset parameter could infer an average throughput of 1000 quota units per second, while the quota parameter 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 remaining parameter value or a higher reset parameter value.
Moreover, complementing large time window quota policies with a short time window one mitigates those risks.</t>
        <section anchor="sec-dos">
          <name>Denial of Service</name>
          <t>RateLimit header fields may contain unexpected values by chance or on purpose.
For example, an excessively high remaining parameter value may be:</t>
          <ul spacing="normal">
            <li>
              <t>used by a malicious intermediary to trigger a Denial of Service attack
or consume client resources boosting its requests;</t>
            </li>
            <li>
              <t>passed by a misconfigured server;</t>
            </li>
          </ul>
          <t>or a high reset parameter value could inhibit clients to contact the server (e.g. similarly to receiving "Retry-after: 1000000").</t>
          <t>To mitigate this risk, clients can set thresholds that they consider reasonable in terms of quota units, time window, concurrent requests or throughput, and define a consistent behavior when the RateLimit exceed those thresholds.
For example this means capping the maximum number of request per second, or implementing retries when the reset parameter exceeds ten minutes.</t>
          <t>The considerations above are not limited to RateLimit header fields, but apply to all fields affecting how clients behave in subsequent requests (e.g. Retry-After).</t>
        </section>
      </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="5.2.1" sectionFormat="of" target="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 header 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 two registries and create one new registry.</t>
      <section anchor="update-http-field-name-registry">
        <name>Update HTTP Field Name Registry</name>
        <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</td>
              <td align="left">permanent</td>
              <td align="left">
                <xref target="ratelimit-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>
      <section anchor="update-http-problem-type-registry">
        <name>Update HTTP Problem Type registry</name>
        <t>IANA is asked to register the following entries in the "HTTP Problem Types" registry at https://www.iana.org/assignments/http-problem-types.</t>
        <section anchor="registration-of-quota-exceeded-problem-type">
          <name>Registration of "quota-exceeded" Problem Type</name>
          <t>Type URI: https://iana.org/assignments/http-problem-types#quota-exceeded</t>
          <t>Title: Quota Exceeded</t>
          <t>Recommended HTTP status code: 429</t>
          <t>Reference: <xref target="quota-exceeded"/> of this document</t>
        </section>
        <section anchor="registration-of-temporary-reduced-capacity-problem-type">
          <name>Registration of "temporary-reduced-capacity" Problem Type</name>
          <t>Type URI: https://iana.org/assignments/http-problem-types#temporary-reduced-capacity</t>
          <t>Title: Temporary Reduced Capacity</t>
          <t>Recommended HTTP status code: 503</t>
          <t>Reference: <xref target="temporary-reduced-capacity"/> of this document</t>
        </section>
        <section anchor="registration-of-abnormal-usage-detected-problem-type">
          <name>Registration of "abnormal-usage-detected" Problem Type</name>
          <t>Type URI: https://iana.org/assignments/http-problem-types#abnormal-usage-detected</t>
          <t>Title: Abnormal Usage Detected</t>
          <t>Recommended HTTP status code: 429</t>
          <t>Reference: <xref target="abnormal-usage-detected"/> of this document</t>
        </section>
      </section>
      <section anchor="ratelimit-quota-unit-registry">
        <name>RateLimit quota unit registry</name>
        <t>This specification establishes the registry "Hypertext Transfer Protocol (HTTP) RateLimit Quota Units" registry to be located at https://www.iana.org/assignments/http-ratelimit-quota-units. Registration is done on the advice of a Designated Expert, appointed by the IESG or their delegate. All entries are Specification Required (<xref target="IANA"/>, Section 4.6).</t>
        <t>The registry has the following initial content:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Quota Unit</th>
              <th align="left">Reference</th>
              <th align="left">Notes</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">request</td>
              <td align="left">RFC nnnn</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">content-bytes</td>
              <td align="left">RFC nnnn</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">concurrent-requests</td>
              <td align="left">RFC nnnn</td>
              <td align="left"> </td>
            </tr>
          </tbody>
        </table>
        <section anchor="registration-template">
          <name>Registration Template</name>
          <t>The registration template for the RateLimit Quota Units registry is as follows:</t>
          <ul spacing="normal">
            <li>
              <t>Quota Unit: The name of the quota unit.</t>
            </li>
            <li>
              <t>Reference: A reference to the document that specifies the quota unit.</t>
            </li>
            <li>
              <t>Notes: Any additional notes about the quota unit.</t>
            </li>
          </ul>
        </section>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-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"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <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"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <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="PROBLEM">
          <front>
            <title>Problem Details for HTTP APIs</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="E. Wilde" initials="E." surname="Wilde"/>
            <author fullname="S. Dalal" initials="S." surname="Dalal"/>
            <date month="July" year="2023"/>
            <abstract>
              <t>This document defines a "problem detail" to carry machine-readable details of errors in HTTP response content to avoid the need to define new error response formats for HTTP APIs.</t>
              <t>This document obsoletes RFC 7807.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9457"/>
          <seriesInfo name="DOI" value="10.17487/RFC9457"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <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"/>
            <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="WEB-ORIGIN">
          <front>
            <title>The Web Origin Concept</title>
            <author fullname="A. Barth" initials="A." surname="Barth"/>
            <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="STRUCTURED-FIELDS">
          <front>
            <title>Structured Field Values for HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="P-H. Kamp" surname="P-H. Kamp"/>
            <date month="February" year="2021"/>
            <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>
        <reference anchor="RFC8941">
          <front>
            <title>Structured Field Values for HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="P-H. Kamp" surname="P-H. Kamp"/>
            <date month="February" year="2021"/>
            <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 anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="PRIVACY">
          <front>
            <title>Privacy Considerations for Internet Protocols</title>
            <author fullname="A. Cooper" initials="A." surname="Cooper"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <author fullname="B. Aboba" initials="B." surname="Aboba"/>
            <author fullname="J. Peterson" initials="J." surname="Peterson"/>
            <author fullname="J. Morris" initials="J." surname="Morris"/>
            <author fullname="M. Hansen" initials="M." surname="Hansen"/>
            <author fullname="R. Smith" initials="R." surname="Smith"/>
            <date month="July" year="2013"/>
            <abstract>
              <t>This document offers guidance for developing privacy considerations for inclusion in protocol specifications. It aims to make designers, implementers, and users of Internet protocols aware of privacy-related design choices. It suggests that whether any individual RFC warrants a specific privacy considerations section will depend on the document's content.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6973"/>
          <seriesInfo name="DOI" value="10.17487/RFC6973"/>
        </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="HPACK">
          <front>
            <title>HPACK: Header Compression for HTTP/2</title>
            <author fullname="R. Peon" initials="R." surname="Peon"/>
            <author fullname="H. Ruellan" initials="H." surname="Ruellan"/>
            <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"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <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"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <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"/>
            <author fullname="C. Newman" initials="C." surname="Newman"/>
            <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>
    <?line 635?>

<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, etc.) and at different levels. For example, an user may be allowed to issue:</t>
      <ul spacing="normal">
        <li>
          <t>10 requests per second;</t>
        </li>
        <li>
          <t>limited to 60 requests per minute;</t>
        </li>
        <li>
          <t>limited to 1000 requests per hour.</t>
        </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>
          <t>the maximum number of allowed requests in the time window;</t>
        </li>
        <li>
          <t>the number of remaining requests in the current window;</t>
        </li>
        <li>
          <t>the time remaining in the current window expressed in seconds or
as a timestamp;</t>
        </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>
            <t>each implementation associates different semantics to the
same header field names;</t>
          </li>
          <li>
            <t>header field names proliferates.</t>
          </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="responses-without-defining-policies">
        <name>Responses without defining policies</name>
        <t>Some servers may not expose the policy limits in the RateLimit-Policy header field. Clients can still use the RateLimit header field to throttle their requests.</t>
        <section anchor="throttling-information-in-responses">
          <name>Throttling information in responses</name>
          <t>The client exhausted its quota for the next 50 seconds.
The limit and time-window is communicated out-of-band.</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: "default";r=0;t=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 remaining parameter 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: "default";r=0;t=48

{"still": "successful"}
]]></sourcecode>
        </section>
        <section anchor="use-with-multiple-policies">
          <name>Multiple policies in response</name>
          <t>The server uses two different policies to limit the client's requests:</t>
          <ul spacing="normal">
            <li>
              <t>5000 daily quota units;</t>
            </li>
            <li>
              <t>1000 hourly quota units.</t>
            </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 header fields to
inform the client that:</t>
          <ul spacing="normal">
            <li>
              <t>it has only 100 quota units left in the daily quota and the window will reset in 10 hours;</t>
            </li>
          </ul>
          <t>The server MAY choose to omit returning the hourly policy as it uses the same quota units as the daily policy and the daily policy is the one that is closest to being exhausted.</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: "dayLimit";r=100;t=36000

{"hello": "world"}
]]></sourcecode>
        </section>
        <section anchor="use-for-limiting-concurrency">
          <name>Use for limiting concurrency</name>
          <t>RateLimit header 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 limit and remaining parameter 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-Policy: "basic";q=100;w=60
RateLimit: "basic";r=60;t=58

{"elapsed": 2, "issued": 40}
]]></sourcecode>
          <t>At the subsequent request - due to resource exhaustion -
the server advertises only <tt>r=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-Policy: "basic";q=100;w=60
RateLimit: "basic";r=20;t=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 header 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/problem+json
Date: Mon, 05 Aug 2019 09:27:00 GMT
Retry-After: Mon, 05 Aug 2019 09:27:05 GMT
RateLimit: "default";r=0;t=5

{
"type": "https://iana.org/assignments/http-problem-types#quota-exceeded"
"title": "Too Many Requests",
"status": 429,
"policy-violations": ["default"]
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="responses-with-defined-policies">
        <name>Responses with defined policies</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: "fixedwindow";r=99;t=50
RateLimit-Policy: "fixedwindow";q=100;w=60
{"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 header 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 remaining parameter 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 header 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-Policy: "dynamic";q=100;w=60
RateLimit: "dynamic";r=9;t=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>r=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-Policy: "dynamic";q=15;w=20
RateLimit: "dynamic";r=0;t=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-Policy: "dynamic";q=100;w=60
RateLimit: "dynamic";r=15;t=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 remaining 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 limit and reset parameters.</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-Policy: quota;q=100;w=1
RateLimit: quota;t=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-Policy: quota;q=10
RateLimit: quota;t=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-multiple-policies"/>:</t>
          <ul spacing="normal">
            <li>
              <t>5000 daily quota units;</t>
            </li>
            <li>
              <t>1000 hourly quota units.</t>
            </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 header fields to inform the client that:</t>
          <ul spacing="normal">
            <li>
              <t>it has only 100 quota units left;</t>
            </li>
            <li>
              <t>the window will reset in 10 hours;</t>
            </li>
            <li>
              <t>the expiring-limit is 5000.</t>
            </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-Policy: "hour";q=1000;w=3600, "day";q=5000;w=86400
RateLimit: "day";r=100;t=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 and enable clients to constraint their requests to avoid being throttled.</t>
        </li>
        <li>
          <t>Can I use RateLimit header fields in throttled responses (e.g. 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.</t>
        </li>
        <li>
          <t>Why is the partition key necessary?  </t>
          <t>
Without a partition key, a server can effectively only have one scope (aka partition), which is impractical for most services, or it needs to communicate the scopes out-of-band.
This prevents the development of generic connector code that can be used to prevent requests from being throttled.
Many APIs rely on API keys, user identity or client identity to allocate quota.
As soon as a single client processes requests for more than one partition, the client needs to know the corresponding partition key to properly track requests against allocated quota.</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,
e.g. 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, etc.).
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>
              <t>that is more subject to system clock correction
like the one implemented via the adjtimex() Linux system call;</t>
            </li>
            <li>
              <t>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></t>
            </li>
            <li>
              <t>almost all rate-limit headers implementations do not use it.</t>
            </li>
          </ul>
        </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, etc.).
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 remaining parameter imply any service guarantee for my
future requests to be served?  </t>
          <t>
No. FAQ integrated in <xref target="ratelimit-remaining-parameter"/>.</t>
        </li>
        <li>
          <t>Is the quota-policy definition too complex?  </t>
          <t>
You can always return the simplest form</t>
        </li>
      </ol>
      <artwork><![CDATA[
RateLimit:"default";r=50;t=60
]]></artwork>
      <t>The policy key clearly connects the current usage status of a policy to the defined limits.
   So for the following field:</t>
      <artwork><![CDATA[
RateLimit-Policy: "sliding";q=100;w=60;burst=1000
RateLimit-Policy: "fixed";q=5000;w=3600;burst=0
RateLimit: "sliding";r=50;t=44
]]></artwork>
      <t>the value "sliding" identifies the policy being reported.</t>
      <ol spacing="normal" type="1"><li>
          <t>Can intermediaries alter RateLimit header fields?  </t>
          <t>
Generally, they should not because it might result in unserviced requests.
 There are reasonable use cases for intermediaries mangling RateLimit header 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 likely be not interoperable. We thus decided to leave <tt>w</tt> as
an informational parameter and only rely on the limit, remaining and reset parameters
for defining the throttling
behavior.</t>
        </li>
        <li>
          <t>Can I use RateLimit fields in trailers?
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.
Supporting trailers has the only advantage that it allows to provide more up-to-date information to the client in case of slow responses.
However, this complicates client implementations with respect to combining fields from headers and accounting for intermediaries that drop trailers.
Since there are no current implementations that use trailers, we decided to leave this as a future-work.</t>
        </li>
      </ol>
    </section>
    <section numbered="false" removeInRFC="true" anchor="ratelimit-header-fields-currently-used-on-the-web">
      <name>RateLimit header fields currently used on the web</name>
      <t>Commonly used header field names are:</t>
      <ul spacing="normal">
        <li>
          <t><tt>X-RateLimit-Limit</tt>,
<tt>X-RateLimit-Remaining</tt>,
<tt>X-RateLimit-Reset</tt>;</t>
        </li>
      </ul>
      <t>There are variants too, where the window is specified
in the header field name, e.g.:</t>
      <ul spacing="normal">
        <li>
          <t><tt>x-ratelimit-limit-minute</tt>, <tt>x-ratelimit-limit-hour</tt>, <tt>x-ratelimit-limit-day</tt></t>
        </li>
        <li>
          <t><tt>x-ratelimit-remaining-minute</tt>, <tt>x-ratelimit-remaining-hour</tt>, <tt>x-ratelimit-remaining-day</tt></t>
        </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>
              <t>seconds remaining to the window expiration</t>
            </li>
            <li>
              <t>milliseconds remaining to the window expiration</t>
            </li>
            <li>
              <t>seconds since UTC, in UNIX Timestamp <xref target="UNIX"/></t>
            </li>
            <li>
              <t>a datetime, either <tt>IMF-fixdate</tt> <xref target="HTTP"/> or <xref target="RFC3339"/></t>
            </li>
          </ul>
        </li>
        <li>
          <t>different headers, with the same semantic, are used by different implementers:  </t>
          <ul spacing="normal">
            <li>
              <t>X-RateLimit-Limit and X-Rate-Limit-Limit</t>
            </li>
            <li>
              <t>X-RateLimit-Remaining and X-Rate-Limit-Remaining</t>
            </li>
            <li>
              <t>X-RateLimit-Reset and X-Rate-Limit-Reset</t>
            </li>
          </ul>
        </li>
      </ul>
      <t>The semantic of RateLimit depends on the windowing algorithm.
A sliding window policy for example, may result in having a remaining parameter value related to the ratio between the current and the maximum throughput.
e.g.</t>
      <artwork><![CDATA[
RateLimit-Policy: "sliding";q=12;w=1
; using 50% of throughput, that is 6 units/s
RateLimit: "sliding";q=12;r=6;t=1

]]></artwork>
      <t>If this is the case, the optimal solution is to achieve</t>
      <artwork><![CDATA[
RateLimit-Policy: "sliding";q=12;w=1
; using 100% of throughput, that is 12 units/s
RateLimit: "sliding";q=12;r=1;t=1
]]></artwork>
      <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,
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-08">
        <name>Since draft-ietf-httpapi-ratelimit-headers-08</name>
        <ul spacing="normal">
          <li>
            <t>Added Problem Types</t>
          </li>
          <li>
            <t>Clarified when to use RateLimit-Policy vs RateLimit fields</t>
          </li>
        </ul>
      </section>
      <section numbered="false" removeInRFC="true" anchor="since-draft-ietf-httpapi-ratelimit-headers-07">
        <name>Since draft-ietf-httpapi-ratelimit-headers-07</name>
        <ul spacing="normal">
          <li>
            <t>Refactored both fields to lists of Items that identify policy and use parameters</t>
          </li>
          <li>
            <t>Added quota unit parameter</t>
          </li>
          <li>
            <t>Added partition key parameter</t>
          </li>
        </ul>
      </section>
      <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>
            <t>Split policy informatiom in RateLimit-Policy #81</t>
          </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>
            <t>Address throttling scope #83</t>
          </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>
            <t>Update IANA considerations #60</t>
          </li>
          <li>
            <t>Use Structured fields #58</t>
          </li>
          <li>
            <t>Reorganize document #67</t>
          </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>
            <t>Use I-D.httpbis-semantics, which includes referencing delay-seconds
instead of delta-seconds. #5</t>
          </li>
        </ul>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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
J2qHl785Zz98VSf61Qh2Fv1flm3/kebEAAA=

-->

</rfc>
