<?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.29 (Ruby 3.4.4) -->
<?rfc tocindent="yes"?>
<?rfc strict="yes"?>
<?rfc compact="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-httpapi-ratelimit-headers-10" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.2 -->
  <front>
    <title>RateLimit header fields for HTTP</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpapi-ratelimit-headers-10"/>
    <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="September" day="27"/>
    <area>Applications and Real-Time</area>
    <workgroup>HTTPAPI</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 59?>

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

<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 mandate 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 clients that adhere to the server’s recommended limits 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 <xref section="7" sectionFormat="of" target="WEB-ORIGIN"/>.</t>
        <t>This document uses the terms List, Item and Integer from <xref section="3" sectionFormat="of" target="SF"/> 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="SF"/> list of Items</t>
        </dd>
        <dt>Item:</dt>
        <dd>
          <t>A <xref target="SF"/> 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="SF"/> of Quota Policy Items (<xref target="quotapolicy-item"/>). The Item<xref target="SF"/> value MUST be a String<xref target="SF"/>.</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 <xref target="ratelimit-field">RateLimit field</xref> 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="SF"/>.</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="SF"/> 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="SF"/> 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="SF"/>.</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="SF"/> identifies the quota policy (<xref target="quotapolicy-item"/>) associated with the request and contains Parameters<xref target="SF"/> 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 until additional quota is made available 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 MUST NOT 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 additional quota associated with the quota policy is made available.</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 fully restored 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 satisfied 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 that the client’s requests currently cannot be satisfied due to a temporary reduction in server capacity. The server MAY choose 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 satisfied 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 malicious 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 Retry-After field value SHOULD NOT reference a point in time earlier than the reset parameter.</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 be successful. 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 with respect to retries, nor does it require 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 made available 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">Structured Type</th>
              <th align="left">Status</th>
              <th align="left">Specification</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">RateLimit</td>
              <td align="left">List</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">List</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="SF">
          <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="September" year="2024"/>
            <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.</t>
              <t>This document obsoletes RFC 8941.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9651"/>
          <seriesInfo name="DOI" value="10.17487/RFC9651"/>
        </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="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>
      </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 638?>

<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, a 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,
"violated-policies": ["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 client requests not being handled,
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 requests not being handled.
 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 cases 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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
6RcsG+yRteve2r7Vwrdo4b6iA13vdLECxk9E2lM6TuAtpM7ZoZpJcuVg7C5D
oHTyHrFBFYWqOKdtf4dMID0Zz0tdnJVVMUgPcv0RDrfC/BnUGfRP6XGT/UQ/
GMO/HKtC53kzHmeD5GBRmvRbPZ3SJTsJfwTWR7kAo2OQPK+yc5xFQjXw8zn2
e0HZPFcLwlbr5tFRnyFqq1KCAsf6vNGxhwpk9h+bSelSHTi46/yeLdo/UMsy
PVX5hS6MAik1SN4o8vC/gFVP8hVlMZ6oYgVLeobNP7gow3ajsZMsdYkhJeox
KvqL63IDWg3doF66+4D1VY23Q1/o0NUocg+5HoY2UCGYAd4sg6sKk2N0EJ2o
/Ccuwfq2yUGsYnb+eH7Ox3w4x7vB+063Xym4c0e0m0mlpvXQOSjVMgukmrDZ
4eajWw/8u/SAumFE/fPg6SHe8UYpRGzxlbE6bYviL0xHxf7ixT78gsUe66ka
8/VEVJXmY+7k0EUyPqLOP0zAcodHWFCJ2wisC7v/oK+ZL4CwP8bBoKBA4ku3
uvMFWz0Btbp2VZ9OWV9EtyXZc7jzaOvLV7P9ZViCzTbCiDb78u482vniibe+
YGJpHEnNIVutgu882MQX4ECDBp+CEXf2HhG6lNVMFdlPQTerOw8efvGCN79k
wbCeo+GzEQ53lpmha+7hQnD+bj5WGTtBPLyIzvv+4ada2Z9GsLPk/wGs67gx
JMUAAA==

-->

</rfc>
