<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.38 (Ruby 3.3.8) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>

<?rfc strict="yes"?>
<?rfc compact="yes"?>

<rfc ipr="trust200902" docName="draft-callec-api-advisory-01" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="api-advisory">A Well-Known URI for API Change Advisories</title>

    <author initials="M. F." surname="Callec" fullname="Mateo Florian Callec">
      <organization>Independent</organization>
      <address>
        <postal>
          <country>France</country>
        </postal>
        <email>mateo@callec.net</email>
      </address>
    </author>

    <date year="2026" month="May" day="24"/>

    <area>Applications and Real-Time</area>
    <workgroup>Network Working Group</workgroup>
    <keyword>well-known</keyword> <keyword>API</keyword> <keyword>advisory</keyword> <keyword>change management</keyword> <keyword>JSON</keyword> <keyword>Atom</keyword>

    <abstract>


<?line 50?>

<t>This document defines a well-known URI, <spanx style="verb">/.well-known/api-advisory.json</spanx>, at which API providers <bcp14>MAY</bcp14> publish a machine-readable JSON discovery file. That file identifies the API and provides the URL of an Atom Syndication Format feed carrying structured change advisories. The Atom feed enables automated scanners and API consumers to discover pricing changes, deprecations, security advisories, and other relevant events without relying on manual monitoring of blogs or mailing lists. Advisory metadata is conveyed through a dedicated XML namespace defined in this document.</t>



    </abstract>



  </front>

  <middle>


<?line 54?>

<section anchor="introduction"><name>Introduction</name>

<t>API providers routinely make changes that affect their consumers: endpoints are deprecated, pricing models shift, authentication mechanisms are rotated, security vulnerabilities are disclosed. Today, this information is conveyed through provider blogs, developer mailing lists, and dashboard notifications, all of which require consumers to monitor multiple out-of-band channels and cannot be discovered programmatically.</t>

<t>This document defines a well-known URI (<xref target="RFC8615"/>) at which a provider <bcp14>MAY</bcp14> publish a JSON discovery file. That file, in turn, points to an Atom feed (<xref target="RFC4287"/>) that carries the advisory entries. Delegating feed semantics, pagination, ordering, and syndication to Atom avoids reinventing those mechanisms and allows implementers to reuse existing Atom libraries. The advisory-specific metadata is conveyed through a dedicated XML namespace defined in <xref target="advisory-namespace"/>.</t>

<t>Scanners and API clients can poll the well-known URI to locate the feed, then poll the feed itself to detect changes relevant to their integration, without any prior coordination with the provider.</t>

<section anchor="requirements-language"><name>Requirements Language</name>

<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>

<?line -18?>

</section>
<section anchor="terminology"><name>Terminology</name>

<t>The following terms are used throughout this document.</t>

<t><strong>API provider:</strong> An entity that operates an HTTP-based service accessible at one or more FQDNs and that exposes a defined programmatic interface to external consumers.</t>

<t><strong>FQDN:</strong> Fully Qualified Domain Name, as used in the HTTP Host header (<xref target="RFC9110"/>).</t>

<t><strong>Advisory:</strong> A single structured announcement published by an API provider to inform consumers of a change that affects their integration.</t>

</section>
<section anchor="scope-and-limitations"><name>Scope and Limitations</name>

<t>This document is an independent submission and does not represent IETF consensus. It is published as a pre-draft proposal to gather community feedback on the problem space and the proposed approach.</t>

</section>
</section>
<section anchor="the-well-known-uri"><name>The Well-Known URI</name>

<t>The well-known URI defined by this document is:</t>

<figure><artwork><![CDATA[
/.well-known/api-advisory.json
]]></artwork></figure>

<t>It <bcp14>MUST</bcp14> be served using HTTPS. The discovery file <bcp14>MUST</bcp14> be served from the exact FQDN on which the API being described is hosted. If the API is reachable at <spanx style="verb">api.example.net</spanx>, the discovery file <bcp14>MUST</bcp14> be available at:</t>

<figure><artwork><![CDATA[
https://api.example.net/.well-known/api-advisory.json
]]></artwork></figure>

<t>The file <bcp14>MUST NOT</bcp14> be considered authoritative for any other FQDN, including parent domains or subdomains. If the discovery file is served at <spanx style="verb">api.example.net</spanx>, it does not extend to <spanx style="verb">v1.api.example.net</spanx>, to <spanx style="verb">example.net</spanx>, or to any other hostname. Each FQDN requiring advisory coverage <bcp14>MUST</bcp14> host its own discovery file.</t>

<texttable title="FQDN scope examples">
      <ttcol align='left'>File location</ttcol>
      <ttcol align='left'>Applies to</ttcol>
      <ttcol align='left'>Does NOT apply to</ttcol>
      <c><spanx style="verb">api.example.net/.well-known/api-advisory.json</spanx></c>
      <c><spanx style="verb">api.example.net</spanx></c>
      <c><spanx style="verb">v1.api.example.net</spanx>, <spanx style="verb">example.net</spanx></c>
      <c><spanx style="verb">v1.api.example.net/.well-known/api-advisory.json</spanx></c>
      <c><spanx style="verb">v1.api.example.net</spanx></c>
      <c><spanx style="verb">api.example.net</spanx></c>
      <c><spanx style="verb">example.net/.well-known/api-advisory.json</spanx></c>
      <c><spanx style="verb">example.net</spanx></c>
      <c><spanx style="verb">api.example.net</spanx></c>
</texttable>

</section>
<section anchor="discovery-file-format"><name>Discovery File Format</name>

<t>The discovery file is a JSON object. Producers <bcp14>MUST</bcp14> serve it with the Content-Type <spanx style="verb">application/json</spanx>.</t>

<section anchor="top-level-fields"><name>Top-Level Fields</name>

<texttable title="Discovery file top-level fields">
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">protocol_version</spanx></c>
      <c><bcp14>MUST</bcp14></c>
      <c>string</c>
      <c>Version of this specification (currently <spanx style="verb">"1.0"</spanx>)</c>
      <c><spanx style="verb">namespace</spanx></c>
      <c><bcp14>MUST</bcp14></c>
      <c>string</c>
      <c>The FQDN this file is authoritative for</c>
      <c><spanx style="verb">last_updated</spanx></c>
      <c><bcp14>MUST</bcp14></c>
      <c>string (<xref target="RFC3339"/>)</c>
      <c>Datetime of the last change to this file</c>
      <c><spanx style="verb">api_name</spanx></c>
      <c><bcp14>MUST</bcp14></c>
      <c>string</c>
      <c>Human-readable name of the API</c>
      <c><spanx style="verb">feed_url</spanx></c>
      <c><bcp14>MUST</bcp14></c>
      <c>string (URI)</c>
      <c>URL of the Atom feed carrying advisories</c>
</texttable>

<t>The <spanx style="verb">namespace</spanx> field <bcp14>MUST</bcp14> exactly match the FQDN from which the file is served, as it would appear in an HTTP Host header (<xref target="RFC9110"/>). Consumers <bcp14>MUST</bcp14> reject or ignore a file where <spanx style="verb">namespace</spanx> does not match the request host.</t>

<t>The <spanx style="verb">protocol_version</spanx> field allows consumers to detect files produced by future revisions of this specification. Consumers <bcp14>MUST</bcp14> check this field before processing any other field. If the value of <spanx style="verb">protocol_version</spanx> is not a version the consumer implements, the consumer <bcp14>MUST NOT</bcp14> process the file and <bcp14>SHOULD</bcp14> surface an error or warning to the operator. The only version defined by this document is <spanx style="verb">"1.0"</spanx>.</t>

<t>The <spanx style="verb">feed_url</spanx> field <bcp14>MUST</bcp14> be an absolute URI (<xref target="RFC3986"/>) using the <spanx style="verb">https</spanx> scheme. It points to an Atom feed document as defined in <xref target="atom-feed-format"/>. The feed URL <bcp14>MAY</bcp14> be on a different FQDN than the discovery file, for example if the provider hosts its advisory feed on a dedicated infrastructure domain.</t>

</section>
<section anchor="example-discovery-file"><name>Example Discovery File</name>

<figure><sourcecode type="json"><![CDATA[
{
  "protocol_version": "1.0",
  "namespace": "api.example.com",
  "last_updated": "2026-05-13T20:45:00Z",
  "api_name": "Example Payments API",
  "feed_url":
    "https://api.example.com/.well-known/api-advisory-feed.atom"
}
]]></sourcecode></figure>

</section>
</section>
<section anchor="atom-feed-format"><name>Atom Feed</name>

<t>Advisories are published as entries in an Atom Syndication Format feed (<xref target="RFC4287"/>). The feed <bcp14>MUST</bcp14> be served using HTTPS. Producers <bcp14>MUST</bcp14> serve the feed with the Content-Type <spanx style="verb">application/atom+xml</spanx>.</t>

<t>Using Atom delegates feed semantics, ordering, and pagination to a well-understood and widely implemented standard, allowing API providers to reuse existing Atom server infrastructure and consumers to reuse existing Atom client libraries.</t>

<section anchor="feed-level-elements"><name>Feed-Level Elements</name>

<t>The Atom <spanx style="verb">&lt;feed&gt;</spanx> element <bcp14>MUST</bcp14> include the following child elements as defined by <xref target="RFC4287"/>:</t>

<t><list style="symbols">
  <t><spanx style="verb">&lt;id&gt;</spanx>: A permanent, universally unique IRI identifying the feed.</t>
  <t><spanx style="verb">&lt;title&gt;</spanx>: A human-readable title for the feed.</t>
  <t><spanx style="verb">&lt;updated&gt;</spanx>: The datetime of the most recent advisory entry, in <xref target="RFC3339"/> format.</t>
  <t><spanx style="verb">&lt;link rel="self"&gt;</spanx>: The URL of the feed itself.</t>
</list></t>

<t>Producers <bcp14>SHOULD</bcp14> also include <spanx style="verb">&lt;link rel="alternate"&gt;</spanx> pointing to a human-readable page about the API.</t>

</section>
<section anchor="entry-level-elements"><name>Entry-Level Elements</name>

<t>Each advisory is represented as an Atom <spanx style="verb">&lt;entry&gt;</spanx> element. Entries <bcp14>MUST</bcp14> be ordered from most recent to oldest by <spanx style="verb">&lt;updated&gt;</spanx> value. This ordering allows consumers to stop processing the feed as soon as they encounter an entry with an <spanx style="verb">&lt;updated&gt;</spanx> value older than their last known checkpoint.</t>

<t>Each entry <bcp14>MUST</bcp14> include:</t>

<t><list style="symbols">
  <t><spanx style="verb">&lt;id&gt;</spanx>: A permanent, universally unique IRI identifying the advisory (see <xref target="advisory-id"/>).</t>
  <t><spanx style="verb">&lt;title&gt;</spanx>: A human-readable title for the advisory.</t>
  <t><spanx style="verb">&lt;updated&gt;</spanx>: The datetime when the advisory was last modified.</t>
  <t><spanx style="verb">&lt;published&gt;</spanx>: The datetime when the advisory was first published.</t>
  <t><spanx style="verb">&lt;summary&gt;</spanx> or <spanx style="verb">&lt;content&gt;</spanx>: A human-readable description of the advisory.</t>
</list></t>

<t>Each entry <bcp14>MUST</bcp14> also include one <spanx style="verb">&lt;api:advisory&gt;</spanx> element from the advisory namespace (<xref target="advisory-namespace"/>) carrying structured metadata.</t>

<t>Producers <bcp14>MAY</bcp14> include <spanx style="verb">&lt;link rel="alternate"&gt;</spanx> on each entry pointing to a full documentation page or blog post.</t>

<t>Producers <bcp14>MAY</bcp14> include <spanx style="verb">&lt;link rel="enclosure"&gt;</spanx> on each entry for attachments such as migration guides.</t>

</section>
<section anchor="localization"><name>Localization</name>

<t>Atom natively supports per-element <spanx style="verb">xml:lang</spanx> attributes (<xref target="RFC4287"/>, Section 2). Producers <bcp14>MAY</bcp14> provide multilingual <spanx style="verb">&lt;title&gt;</spanx> and <spanx style="verb">&lt;summary&gt;</spanx> elements by repeating those elements with distinct <spanx style="verb">xml:lang</spanx> attributes, following standard Atom practice.</t>

</section>
</section>
<section anchor="advisory-namespace"><name>Advisory XML Namespace</name>

<t>This document defines the XML namespace:</t>

<figure><artwork><![CDATA[
https://iana.org/api-advisory/1.0
]]></artwork></figure>

<t>(This namespace URI is a placeholder pending IANA registration.) In the examples in this document, the prefix <spanx style="verb">api:</spanx> is used for this namespace.</t>

<section anchor="the-apiadvisory-element"><name>The <spanx style="verb">&lt;api:advisory&gt;</spanx> Element</name>

<t>Each Atom <spanx style="verb">&lt;entry&gt;</spanx> <bcp14>MUST</bcp14> contain exactly one <spanx style="verb">&lt;api:advisory&gt;</spanx> element. This element carries the structured metadata specific to this specification.</t>

<section anchor="child-elements-of-apiadvisory"><name>Child Elements of <spanx style="verb">&lt;api:advisory&gt;</spanx></name>

<texttable title="Child elements of api:advisory">
      <ttcol align='left'>Element</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">&lt;api:id&gt;</spanx></c>
      <c><bcp14>MUST</bcp14></c>
      <c>string</c>
      <c>Advisory identifier (see <xref target="advisory-id"/>)</c>
      <c><spanx style="verb">&lt;api:advisory_datetime&gt;</spanx></c>
      <c><bcp14>MUST</bcp14></c>
      <c>string (<xref target="RFC3339"/>)</c>
      <c>Datetime when first published</c>
      <c><spanx style="verb">&lt;api:effective_datetime&gt;</spanx></c>
      <c><bcp14>MUST</bcp14></c>
      <c>string (<xref target="RFC3339"/>)</c>
      <c>Datetime when the change takes effect</c>
      <c><spanx style="verb">&lt;api:status&gt;</spanx></c>
      <c><bcp14>MUST</bcp14></c>
      <c>string (enum)</c>
      <c>Lifecycle status (see <xref target="status"/>)</c>
      <c><spanx style="verb">&lt;api:superseded_by&gt;</spanx></c>
      <c><bcp14>MUST</bcp14> when status is <spanx style="verb">superseded</spanx></c>
      <c>string</c>
      <c>ID of the replacing advisory</c>
      <c><spanx style="verb">&lt;api:category&gt;</spanx></c>
      <c><bcp14>MUST</bcp14></c>
      <c>string (enum)</c>
      <c>Type of change (see <xref target="categories"/>)</c>
      <c><spanx style="verb">&lt;api:priority&gt;</spanx></c>
      <c><bcp14>MUST</bcp14></c>
      <c>string (enum)</c>
      <c>Severity level (see <xref target="priority"/>)</c>
      <c><spanx style="verb">&lt;api:action_required&gt;</spanx></c>
      <c><bcp14>MUST</bcp14></c>
      <c>boolean (<spanx style="verb">true</spanx>/<spanx style="verb">false</spanx>)</c>
      <c>Whether the consumer must act</c>
      <c><spanx style="verb">&lt;api:suggested_action&gt;</spanx></c>
      <c><bcp14>SHOULD</bcp14></c>
      <c>string</c>
      <c>Recommended action (English)</c>
      <c><spanx style="verb">&lt;api:scope&gt;</spanx></c>
      <c><bcp14>MUST</bcp14></c>
      <c>element</c>
      <c>Affected portion of the API (see <xref target="scope"/>)</c>
</texttable>

</section>
</section>
</section>
<section anchor="advisory-id"><name>Advisory Identifier</name>

<t>Advisory identifiers follow the pattern <spanx style="verb">ADV-YYYY-N</spanx>, where <spanx style="verb">YYYY</spanx> is a year and <spanx style="verb">N</spanx> is a positive integer sequence number.</t>

<t>The Atom <spanx style="verb">&lt;entry&gt;&lt;id&gt;</spanx> element <bcp14>MUST</bcp14> be a URI. Producers <bcp14>MUST</bcp14> construct this URI by appending the advisory identifier to a stable base IRI specific to their feed, for example:</t>

<figure><artwork><![CDATA[
https://api.example.com/advisories/ADV-2026-003
]]></artwork></figure>

<t>The <spanx style="verb">&lt;api:id&gt;</spanx> element inside <spanx style="verb">&lt;api:advisory&gt;</spanx> carries the short-form identifier string (e.g. <spanx style="verb">ADV-2026-003</spanx>) for use in structured processing and cross-reference.</t>

<section anchor="uniqueness-scope"><name>Uniqueness Scope</name>

<t>Advisory IDs <bcp14>MUST</bcp14> be unique within a single advisory feed. Uniqueness is NOT required across different feeds hosted on different FQDNs. Teams managing separate FQDNs are not expected to coordinate their ID sequences. A globally unambiguous advisory is identified by the tuple <spanx style="verb">(namespace, normalized_id)</spanx>, not by <spanx style="verb">normalized_id</spanx> alone.</t>

</section>
<section anchor="normalization"><name>Normalization</name>

<t>Because the format is intentionally lenient to accommodate different producer conventions, consumers <bcp14>MUST</bcp14> normalize IDs before any comparison or deduplication. Normalization <bcp14>MUST</bcp14> follow these steps:</t>

<t><list style="numbers" type="1">
  <t>Split the raw string on the <spanx style="verb">-</spanx> character. The result <bcp14>MUST</bcp14> contain exactly three elements; if not, the ID is malformed and <bcp14>MUST</bcp14> be rejected.</t>
  <t>Convert the first element to upper-case and verify it equals <spanx style="verb">"ADV"</spanx>; if not, the ID <bcp14>MUST</bcp14> be rejected as having an unknown prefix.</t>
  <t>Parse the second and third elements as base-10 integers, discarding any leading zeros. If either element is not a valid integer, the ID <bcp14>MUST</bcp14> be rejected.</t>
</list></t>

<t>The canonical form for storage, comparison, and deduplication is the tuple <spanx style="verb">(prefix, year, seq)</spanx>. Two IDs are equal if and only if their normalized tuples are identical.</t>

</section>
<section anchor="accepted-variants"><name>Accepted Variants</name>

<t>The following raw strings all normalize to the same identity:</t>

<texttable title="Equivalent advisory ID representations">
      <ttcol align='left'>Raw string</ttcol>
      <ttcol align='left'>prefix</ttcol>
      <ttcol align='left'>year</ttcol>
      <ttcol align='left'>seq</ttcol>
      <c><spanx style="verb">ADV-2026-001</spanx></c>
      <c><spanx style="verb">ADV</spanx></c>
      <c>2026</c>
      <c>1</c>
      <c><spanx style="verb">adv-2026-001</spanx></c>
      <c><spanx style="verb">ADV</spanx></c>
      <c>2026</c>
      <c>1</c>
      <c><spanx style="verb">ADV-2026-1</spanx></c>
      <c><spanx style="verb">ADV</spanx></c>
      <c>2026</c>
      <c>1</c>
      <c><spanx style="verb">ADV-002026-001</spanx></c>
      <c><spanx style="verb">ADV</spanx></c>
      <c>2026</c>
      <c>1</c>
      <c><spanx style="verb">adv-002026-1</spanx></c>
      <c><spanx style="verb">ADV</spanx></c>
      <c>2026</c>
      <c>1</c>
</texttable>

</section>
<section anchor="producer-recommendations"><name>Producer Recommendations</name>

<t>Producers <bcp14>SHOULD</bcp14> emit IDs in the form <spanx style="verb">ADV-YYYY-NNN</spanx> (upper-case prefix, 4-digit year, sequence number zero-padded to at least 3 digits) for human readability. This is a <bcp14>SHOULD</bcp14>, not a <bcp14>MUST</bcp14>; parsers <bcp14>MUST</bcp14> handle all valid variants.</t>

</section>
<section anchor="reference-implementation"><name>Reference Implementation</name>

<t>The following JavaScript functions implement normalization, equality testing, and key generation for use in deduplication structures such as <spanx style="verb">Map</spanx> or <spanx style="verb">Set</spanx>. They are provided for illustrative purposes and do not form a normative part of this specification.</t>

<figure><sourcecode type="javascript"><![CDATA[
/**
 * Parses and normalizes an advisory ID string into its three
 * components. The returned tuple {prefix, year, seq} MUST be used
 * for all comparisons (never compare raw ID strings directly).
 *
 * @param {string} id  Raw advisory ID (e.g. "ADV-2026-001")
 * @returns {{ prefix: string, year: number, seq: number }}
 * @throws {Error}     If the ID is malformed or contains
 *                     non-numeric segments
 */
function parseAdvisoryId(id) {
  const blocks = id.split("-");
  if (blocks.length !== 3)
    throw new Error(`Malformed advisory ID: "${id}"`);

  const prefix = blocks[0].toUpperCase();
  if (prefix !== "ADV")
    throw new Error(`Unknown prefix "${prefix}" in ID: "${id}"`);

  const year = parseInt(blocks[1], 10);
  const seq  = parseInt(blocks[2], 10);

  if (isNaN(year) || isNaN(seq))
    throw new Error(`Non-numeric segment in ID: "${id}"`);

  return { prefix, year, seq };
}

/**
 * Returns true if two raw ID strings refer to the same advisory,
 * regardless of casing or zero-padding.
 */
function advisoryIdsEqual(a, b) {
  const pa = parseAdvisoryId(a);
  const pb = parseAdvisoryId(b);
  return pa.prefix === pb.prefix
      && pa.year   === pb.year
      && pa.seq    === pb.seq;
}

/**
 * Returns a stable string key suitable for use in a Map or Set.
 * For cross-namespace deduplication, prefix this key with the
 * namespace: `${namespace}::${advisoryIdKey(id)}`.
 *
 * @param {string} id  Raw advisory ID
 * @returns {string}   Canonical key, e.g. "ADV-2026-1"
 */
function advisoryIdKey(id) {
  const { prefix, year, seq } = parseAdvisoryId(id);
  return `${prefix}-${year}-${seq}`;
}
]]></sourcecode></figure>

</section>
</section>
<section anchor="pagination"><name>Pagination</name>

<t>Atom natively supports feed pagination through the use of <spanx style="verb">&lt;link&gt;</spanx> elements with <spanx style="verb">rel="next"</spanx> and <spanx style="verb">rel="prev"</spanx> relation types. Producers with a large number of advisories <bcp14>SHOULD</bcp14> use these standard link relations to split the feed across multiple pages, rather than defining a custom pagination mechanism.</t>

<t>Because entries are ordered most recent first, <spanx style="verb">rel="next"</spanx> points toward older entries and <spanx style="verb">rel="prev"</spanx> points toward more recent entries.</t>

<t>The feed URL returned in the <spanx style="verb">feed_url</spanx> field of the discovery file (<xref target="discovery-file-format"/>) <bcp14>MUST</bcp14> point to the first (most recent) page of the feed.</t>

</section>
<section anchor="caching"><name>Caching</name>

<t>Producers <bcp14>SHOULD</bcp14> set a <spanx style="verb">Cache-Control</spanx> header (see <xref target="RFC7234"/>) on the advisory feed response. A recommended value is:</t>

<figure><artwork><![CDATA[
Cache-Control: public, max-age=3600
]]></artwork></figure>

<t>A <spanx style="verb">max-age</spanx> of less than 60 seconds is <bcp14>NOT RECOMMENDED</bcp14>, as it provides no meaningful benefit over uncached responses. Consumers <bcp14>SHOULD</bcp14> respect the <spanx style="verb">Cache-Control</spanx> header when polling, and <bcp14>SHOULD</bcp14> also compare the feed-level <spanx style="verb">&lt;updated&gt;</spanx> element to the value observed on their last successful fetch to determine whether the feed content has actually changed.</t>

</section>
<section anchor="status"><name>Advisory Status</name>

<t>Each advisory <bcp14>MUST</bcp14> carry an <spanx style="verb">&lt;api:status&gt;</spanx> element indicating its current lifecycle state. Producers <bcp14>MUST NOT</bcp14> remove advisory entries from the feed once published; instead they <bcp14>MUST</bcp14> update the <spanx style="verb">&lt;api:status&gt;</spanx> element to reflect the advisory's current state and update the Atom <spanx style="verb">&lt;updated&gt;</spanx> element accordingly. This preserves the historical record and allows consumers that previously processed an advisory to detect status changes on subsequent polls.</t>

<section anchor="status-values"><name>Status Values</name>

<texttable title="Advisory status values">
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>Meaning</ttcol>
      <c><spanx style="verb">active</spanx></c>
      <c>The advisory is current and applicable</c>
      <c><spanx style="verb">withdrawn</spanx></c>
      <c>The advisory was retracted and should be disregarded</c>
      <c><spanx style="verb">superseded</spanx></c>
      <c>The advisory has been replaced by a newer one</c>
</texttable>

<t>When <spanx style="verb">&lt;api:status&gt;</spanx> is <spanx style="verb">superseded</spanx>, the <spanx style="verb">&lt;api:superseded_by&gt;</spanx> element <bcp14>MUST</bcp14> be present and <bcp14>MUST</bcp14> contain the normalized ID of the replacing advisory. The replacing advisory <bcp14>MUST</bcp14> exist within the same feed (or a subsequent page of the same paginated feed). Consumers <bcp14>SHOULD</bcp14> fetch and process the replacement advisory before acting on the superseded one.</t>

</section>
</section>
<section anchor="priority"><name>Priority Levels</name>

<t>The <spanx style="verb">&lt;api:priority&gt;</spanx> element indicates the urgency of the advisory.</t>

<texttable title="Priority values">
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>Meaning</ttcol>
      <c><spanx style="verb">critical</spanx></c>
      <c>Immediate action required; breaking or security impact</c>
      <c><spanx style="verb">high</spanx></c>
      <c>Action required before the effective datetime</c>
      <c><spanx style="verb">medium</spanx></c>
      <c>Action recommended; graceful degradation is possible</c>
      <c><spanx style="verb">low</spanx></c>
      <c>Minor or optional change</c>
      <c><spanx style="verb">info</spanx></c>
      <c>No action needed; informational only</c>
</texttable>

</section>
<section anchor="categories"><name>Categories</name>

<t>The <spanx style="verb">&lt;api:category&gt;</spanx> element indicates the type of change being announced.</t>

<texttable title="Category values">
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>Meaning</ttcol>
      <c><spanx style="verb">pricing_change</spanx></c>
      <c>Free tier ending, price change, or quota change</c>
      <c><spanx style="verb">legal_update</spanx></c>
      <c>Terms of service, privacy policy, or data residency</c>
      <c><spanx style="verb">compliance_update</spanx></c>
      <c>Change imposed by an external regulation (e.g. GDPR, PCI-DSS)</c>
      <c><spanx style="verb">deprecation</spanx></c>
      <c>A feature or endpoint marked for future removal</c>
      <c><spanx style="verb">sunset</spanx></c>
      <c>A feature or endpoint being permanently removed</c>
      <c><spanx style="verb">end_of_life</spanx></c>
      <c>An entire API version being permanently decommissioned</c>
      <c><spanx style="verb">breaking_change</spanx></c>
      <c>A non-backward-compatible API change</c>
      <c><spanx style="verb">maintenance</spanx></c>
      <c>Planned downtime or degraded availability</c>
      <c><spanx style="verb">incident</spanx></c>
      <c>An ongoing or recently resolved incident</c>
      <c><spanx style="verb">migration_required</spanx></c>
      <c>Consumers must migrate to a new system</c>
      <c><spanx style="verb">security_advisory</spanx></c>
      <c>Vulnerability or key rotation requiring consumer action</c>
      <c><spanx style="verb">credential_rotation</spanx></c>
      <c>API keys, certificates, or OAuth secrets are being rotated</c>
      <c><spanx style="verb">performance_update</spanx></c>
      <c>SLA or throughput limit change</c>
      <c><spanx style="verb">new_feature</spanx></c>
      <c>A new endpoint or capability (non-breaking)</c>
      <c><spanx style="verb">ownership_transfer</spanx></c>
      <c>The API has been acquired, transferred, or rebranded</c>
      <c><spanx style="verb">endpoint_moved</spanx></c>
      <c>A path or domain has changed</c>
      <c><spanx style="verb">rate_limit_change</spanx></c>
      <c>Request quotas or throttling has been updated</c>
      <c><spanx style="verb">data_retention_update</spanx></c>
      <c>Data storage duration or policy has changed</c>
      <c><spanx style="verb">region_change</spanx></c>
      <c>Geographic availability has changed (new region, closure, or data relocation)</c>
</texttable>

</section>
<section anchor="scope"><name>Scope</name>

<t>The <spanx style="verb">&lt;api:scope&gt;</spanx> element describes which portion of the API is affected by an advisory. It uses a progressive model: a consumer can stop reading <spanx style="verb">&lt;api:scope&gt;</spanx> as soon as the <spanx style="verb">&lt;api:level&gt;</spanx> child element indicates an impact broad enough to be relevant.</t>

<section anchor="multiple-distinct-apis-at-the-same-fqdn"><name>Multiple Distinct APIs at the Same FQDN</name>

<t>A single FQDN <bcp14>MAY</bcp14> host multiple distinct APIs (for example, <spanx style="verb">/payments/**</spanx> and <spanx style="verb">/identity/**</spanx>). The scope mechanism defined in this section handles this case explicitly. An advisory with <spanx style="verb">&lt;api:level&gt;global&lt;/api:level&gt;</spanx> applies to all APIs hosted at the FQDN. An advisory with <spanx style="verb">&lt;api:level&gt;routes&lt;/api:level&gt;</spanx> targets a specific API or set of endpoints by path prefix or explicit route list. Producers operating multiple distinct APIs at the same FQDN <bcp14>SHOULD</bcp14> use route-level scope to avoid ambiguity, and <bcp14>SHOULD</bcp14> use path prefixes that clearly identify the target API (e.g., <spanx style="verb">/payments/**</spanx> or <spanx style="verb">/identity/**</spanx>). Consumers <bcp14>MUST NOT</bcp14> assume that a <spanx style="verb">global</spanx>-scoped advisory applies only to the API they are currently integrating with; they <bcp14>SHOULD</bcp14> surface it as affecting the entire FQDN.</t>

</section>
<section anchor="scope-child-elements"><name>Scope Child Elements</name>

<texttable title="Scope child elements">
      <ttcol align='left'>Element</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">&lt;api:level&gt;</spanx></c>
      <c><bcp14>MUST</bcp14></c>
      <c>string (enum)</c>
      <c>Granularity of the scope</c>
      <c><spanx style="verb">&lt;api:versions&gt;</spanx></c>
      <c><bcp14>MUST</bcp14> when level is <spanx style="verb">versions</spanx>; <bcp14>MAY</bcp14> when level is <spanx style="verb">routes</spanx></c>
      <c>element</c>
      <c>Affected API versions</c>
      <c><spanx style="verb">&lt;api:routes&gt;</spanx></c>
      <c><bcp14>MUST</bcp14> when level is <spanx style="verb">routes</spanx></c>
      <c>element</c>
      <c>Affected routes</c>
</texttable>

</section>
<section anchor="level-values"><name>Level Values</name>

<texttable title="Scope level values">
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>Meaning</ttcol>
      <c><spanx style="verb">global</spanx></c>
      <c>The entire FQDN is affected; <spanx style="verb">&lt;api:versions&gt;</spanx> and <spanx style="verb">&lt;api:routes&gt;</spanx> are ignored</c>
      <c><spanx style="verb">versions</spanx></c>
      <c>Only the listed versions are affected; <spanx style="verb">&lt;api:routes&gt;</spanx> is ignored</c>
      <c><spanx style="verb">routes</spanx></c>
      <c>Only the listed routes are affected; <spanx style="verb">&lt;api:versions&gt;</spanx> is an optional additional filter</c>
</texttable>

</section>
<section anchor="versions-element"><name>Versions Element</name>

<t>When <spanx style="verb">&lt;api:level&gt;</spanx> is <spanx style="verb">versions</spanx>, the <spanx style="verb">&lt;api:versions&gt;</spanx> element <bcp14>MUST</bcp14> be present and <bcp14>MUST</bcp14> contain one or more <spanx style="verb">&lt;api:version&gt;</spanx> child elements. When <spanx style="verb">&lt;api:level&gt;</spanx> is <spanx style="verb">routes</spanx>, <spanx style="verb">&lt;api:versions&gt;</spanx> <bcp14>MAY</bcp14> be present and, if so, <bcp14>MUST</bcp14> contain one or more <spanx style="verb">&lt;api:version&gt;</spanx> child elements.</t>

<t>Each <spanx style="verb">&lt;api:version&gt;</spanx> element <bcp14>MUST</bcp14> contain a single version identifier string as its text content. The version identifier is an opaque string and is compared case-sensitively. Producers <bcp14>SHOULD</bcp14> use the same version identifiers as those exposed in the API itself (e.g., <spanx style="verb">v1</spanx>, <spanx style="verb">v2</spanx>).</t>

</section>
<section anchor="route-elements"><name>Route Elements</name>

<t>When <spanx style="verb">&lt;api:level&gt;</spanx> is <spanx style="verb">routes</spanx>, the <spanx style="verb">&lt;api:routes&gt;</spanx> element <bcp14>MUST</bcp14> be present and <bcp14>MUST</bcp14> contain one or more <spanx style="verb">&lt;api:route&gt;</spanx> child elements. Each <spanx style="verb">&lt;api:route&gt;</spanx> element <bcp14>MUST</bcp14> contain:</t>

<texttable title="Route child elements">
      <ttcol align='left'>Child element</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">&lt;api:method&gt;</spanx></c>
      <c><bcp14>MUST</bcp14></c>
      <c>HTTP method, or <spanx style="verb">*</spanx> to match all methods</c>
      <c><spanx style="verb">&lt;api:path&gt;</spanx></c>
      <c><bcp14>MUST</bcp14></c>
      <c>Route path pattern (see <xref target="path-patterns"/>)</c>
</texttable>

</section>
<section anchor="path-patterns"><name>Path Pattern Syntax</name>

<t>The <spanx style="verb">&lt;api:path&gt;</spanx> element contains a pattern that is matched against the path component of request URIs. This section defines the syntax and matching semantics of these patterns normatively.</t>

<section anchor="syntax"><name>Syntax</name>

<t>Path patterns are defined using the following ABNF grammar (<xref target="RFC5234"/>). The rule <spanx style="verb">pchar</spanx> is imported from Section 3.3 of <xref target="RFC3986"/> and covers unreserved characters, percent-encoded characters, sub-delimiters, colons, and at-signs.</t>

<figure><sourcecode type="abnf"><![CDATA[
path-pattern     = "/" *( segment "/" ) terminal

segment          = 1*pchar
                   ; A literal path segment; no wildcards allowed.
                   ; MUST NOT be empty.

terminal         = segment
                 / wildcard-single
                 / wildcard-multi

wildcard-single  = "*"
                   ; Matches exactly one non-empty segment.

wildcard-multi   = "**"
                   ; Matches one or more segments at any depth.

pchar            = unreserved / pct-encoded / sub-delims / ":" / "@"
                   ; Imported from Section 3.3 of RFC 3986.
]]></sourcecode></figure>

<t>A path pattern <bcp14>MUST</bcp14> begin with a <spanx style="verb">/</spanx> character. The empty string and patterns that do not begin with <spanx style="verb">/</spanx> are malformed and <bcp14>MUST</bcp14> be rejected by consumers.</t>

<t>Wildcards (<spanx style="verb">*</spanx> and <spanx style="verb">**</spanx>) are only permitted as an entire terminal segment; they <bcp14>MUST NOT</bcp14> appear embedded within a literal segment (e.g., <spanx style="verb">/v2/web*</spanx> is invalid). A pattern containing an embedded wildcard <bcp14>MUST</bcp14> be rejected by consumers.</t>

</section>
<section anchor="matching-semantics"><name>Matching Semantics</name>

<t>For the purpose of pattern matching, a subject path is split into a sequence of segments by splitting on <spanx style="verb">/</spanx> and discarding empty strings produced by leading, trailing, or consecutive <spanx style="verb">/</spanx> characters. A pattern is split into its component segments in the same way.</t>

<t>The following rules apply:</t>

<t><list style="symbols">
  <t>A <strong>literal segment</strong> matches a subject segment if and only if the two strings are identical after percent-decoding both (case-sensitive comparison).</t>
  <t>A <strong><spanx style="verb">*</spanx> wildcard</strong> (wildcard-single) matches exactly one subject segment. It <bcp14>MUST NOT</bcp14> match an empty segment. It <bcp14>MUST NOT</bcp14> match across a <spanx style="verb">/</spanx> boundary, i.e., it matches at most one path component.</t>
  <t>A <strong><spanx style="verb">**</spanx> wildcard</strong> (wildcard-multi) matches one or more consecutive subject segments. It <bcp14>MUST NOT</bcp14> match zero segments. It may match segments at any depth, i.e., it consumes one or more path components including their intervening <spanx style="verb">/</spanx> characters.</t>
  <t>A pattern matches a subject path if and only if the entire sequence of subject segments is consumed by the pattern segments, with no subject segments remaining after the last pattern segment is applied.</t>
</list></t>

<t>Consumers <bcp14>MUST</bcp14> apply these rules deterministically. Where a <spanx style="verb">**</spanx> wildcard could match a variable number of segments, it <bcp14>MUST</bcp14> be treated greedily: it consumes the maximum number of segments that still allows the overall pattern to match. In practice, because <spanx style="verb">**</spanx> is only permitted as a terminal segment in this grammar, no backtracking is required.</t>

</section>
<section anchor="matching-examples"><name>Matching Examples</name>

<t>The following table illustrates the matching rules. All examples assume case-sensitive comparison after percent-decoding.</t>

<texttable title="Path pattern matching examples">
      <ttcol align='left'>Pattern</ttcol>
      <ttcol align='left'>Subject path</ttcol>
      <ttcol align='left'>Match?</ttcol>
      <ttcol align='left'>Reason</ttcol>
      <c><spanx style="verb">/v2/webhooks</spanx></c>
      <c><spanx style="verb">/v2/webhooks</spanx></c>
      <c>Yes</c>
      <c>Exact literal match</c>
      <c><spanx style="verb">/v2/webhooks</spanx></c>
      <c><spanx style="verb">/v2/webhooks/</spanx></c>
      <c>Yes</c>
      <c>Trailing slash discarded before matching</c>
      <c><spanx style="verb">/v2/webhooks</spanx></c>
      <c><spanx style="verb">/v2/webhooks/123</spanx></c>
      <c>No</c>
      <c>Extra segment not covered</c>
      <c><spanx style="verb">/v2/webhooks/*</spanx></c>
      <c><spanx style="verb">/v2/webhooks/abc</spanx></c>
      <c>Yes</c>
      <c><spanx style="verb">*</spanx> matches single segment <spanx style="verb">abc</spanx></c>
      <c><spanx style="verb">/v2/webhooks/*</spanx></c>
      <c><spanx style="verb">/v2/webhooks/abc/def</spanx></c>
      <c>No</c>
      <c><spanx style="verb">*</spanx> does not match across <spanx style="verb">/</spanx></c>
      <c><spanx style="verb">/v2/webhooks/*</spanx></c>
      <c><spanx style="verb">/v2/webhooks/</spanx></c>
      <c>No</c>
      <c><spanx style="verb">*</spanx> does not match an empty segment</c>
      <c><spanx style="verb">/v2/webhooks/**</spanx></c>
      <c><spanx style="verb">/v2/webhooks/abc</spanx></c>
      <c>Yes</c>
      <c><spanx style="verb">**</spanx> matches one segment</c>
      <c><spanx style="verb">/v2/webhooks/**</spanx></c>
      <c><spanx style="verb">/v2/webhooks/abc/def/ghi</spanx></c>
      <c>Yes</c>
      <c><spanx style="verb">**</spanx> matches multiple segments</c>
      <c><spanx style="verb">/v2/webhooks/**</spanx></c>
      <c><spanx style="verb">/v2/webhooks</spanx></c>
      <c>No</c>
      <c><spanx style="verb">**</spanx> requires at least one segment</c>
      <c><spanx style="verb">/v1/**</spanx></c>
      <c><spanx style="verb">/v1/users/123/orders</spanx></c>
      <c>Yes</c>
      <c><spanx style="verb">**</spanx> matches remaining segments</c>
      <c><spanx style="verb">/v1/**</spanx></c>
      <c><spanx style="verb">/v2/users</spanx></c>
      <c>No</c>
      <c>Literal <spanx style="verb">v1</spanx> does not match <spanx style="verb">v2</spanx></c>
      <c><spanx style="verb">/v2/web*</spanx></c>
      <c><spanx style="verb">/v2/webhooks</spanx></c>
      <c>Invalid</c>
      <c>Embedded wildcard; pattern <bcp14>MUST</bcp14> be rejected</c>
</texttable>

</section>
</section>
<section anchor="scope-semantics"><name>Scope Semantics</name>

<t>The following normative rules apply:</t>

<t><list style="symbols">
  <t>When <spanx style="verb">&lt;api:level&gt;</spanx> is <spanx style="verb">"global"</spanx>, <spanx style="verb">&lt;api:versions&gt;</spanx> and <spanx style="verb">&lt;api:routes&gt;</spanx> <bcp14>MUST</bcp14> be omitted or, if present, <bcp14>MUST</bcp14> be ignored by consumers.</t>
  <t>When <spanx style="verb">&lt;api:level&gt;</spanx> is <spanx style="verb">"versions"</spanx>, <spanx style="verb">&lt;api:versions&gt;</spanx> is <bcp14>REQUIRED</bcp14>; <spanx style="verb">&lt;api:routes&gt;</spanx> <bcp14>MUST</bcp14> be omitted or, if present, <bcp14>MUST</bcp14> be ignored by consumers.</t>
  <t>When <spanx style="verb">&lt;api:level&gt;</spanx> is <spanx style="verb">"routes"</spanx>, <spanx style="verb">&lt;api:routes&gt;</spanx> is <bcp14>REQUIRED</bcp14>; <spanx style="verb">&lt;api:versions&gt;</spanx> is <bcp14>OPTIONAL</bcp14> and, if present, acts as an additional filter: the advisory applies only to the listed routes within the listed versions.</t>
</list></t>

</section>
</section>
<section anchor="example"><name>Example</name>

<t>The following example shows a complete Atom feed (first page) containing three advisories in reverse chronological order. It demonstrates: the advisory namespace; the <spanx style="verb">&lt;api:status&gt;</spanx> element including a <spanx style="verb">superseded</spanx> advisory; localization via <spanx style="verb">xml:lang</spanx>; and feed-level pagination via <spanx style="verb">rel="next"</spanx>.</t>

<section anchor="discovery-file"><name>Discovery File</name>

<figure><sourcecode type="json"><![CDATA[
{
  "protocol_version": "1.0",
  "namespace": "api.example.com",
  "last_updated": "2026-05-13T20:45:00Z",
  "api_name": "Example Payments API",
  "feed_url":
    "https://api.example.com/.well-known/api-advisory-feed.atom"
}
]]></sourcecode></figure>

</section>
<section anchor="atom-feed"><name>Atom Feed</name>

<figure><sourcecode type="xml"><![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"
      xmlns:api="https://iana.org/api-advisory/1.0">

  <id>https://api.example.com/advisories/feed</id>
  <title>Example Payments API Advisories</title>
  <updated>2026-05-13T14:00:00Z</updated>
  <link rel="self"
  href="https://api.example.com/.well-known/api-advisory-feed.atom"/>
  <link rel="alternate" href="https://docs.example.com/advisories"/>
  <link rel="next"
    href=
"https://api.example.com/.well-known/api-advisory-feed.atom?page=2"/>

  <!-- ADV-2026-003: active, deprecation (revised deadline) -->
  <entry>
    <id>https://api.example.com/advisories/ADV-2026-003</id>
    <title xml:lang="en">
      Deprecation of query parameter authentication (revised)
    </title>
    <title xml:lang="fr">
      Depreciation de l'authentification par parametre (revisee)
    </title>
    <published>2026-05-13T14:00:00Z</published>
    <updated>2026-05-13T14:00:00Z</updated>
    <summary xml:lang="en">
      The migration deadline has been extended to January 1, 2027.
    </summary>
    <link rel="alternate"
      href="https://docs.example.com/auth-migration"/>
    <api:advisory>
      <api:id>ADV-2026-003</api:id>
      <api:advisory_datetime>
        2026-05-13T14:00:00Z
      </api:advisory_datetime>
      <api:effective_datetime>
        2027-01-01T00:00:00Z
      </api:effective_datetime>
      <api:status>active</api:status>
      <api:category>deprecation</api:category>
      <api:priority>high</api:priority>
      <api:action_required>true</api:action_required>
      <api:suggested_action>
        Replace the api_key query parameter with a Bearer token.
      </api:suggested_action>
      <api:scope>
        <api:level>global</api:level>
      </api:scope>
    </api:advisory>
  </entry>

  <!-- ADV-2026-002: superseded by ADV-2026-003 -->
  <entry>
    <id>https://api.example.com/advisories/ADV-2026-002</id>
    <title xml:lang="en">
      Deprecation of query parameter authentication
    </title>
    <title xml:lang="fr">
      Depreciation de l'authentification par parametre de requete
    </title>
    <published>2026-05-13T09:00:00Z</published>
    <updated>2026-05-13T14:00:00Z</updated>
    <summary xml:lang="en">
      Authentication via the api_key query parameter is deprecated.
    </summary>
    <link rel="alternate"
      href="https://docs.example.com/auth-migration"/>
    <api:advisory>
      <api:id>ADV-2026-002</api:id>
      <api:advisory_datetime>
        2026-05-13T09:00:00Z
      </api:advisory_datetime>
      <api:effective_datetime>
        2026-10-01T00:00:00Z
      </api:effective_datetime>
      <api:status>superseded</api:status>
      <api:superseded_by>ADV-2026-003</api:superseded_by>
      <api:category>deprecation</api:category>
      <api:priority>medium</api:priority>
      <api:action_required>true</api:action_required>
      <api:suggested_action>
        Migrate to the Authorization HTTP header.
      </api:suggested_action>
      <api:scope>
        <api:level>global</api:level>
      </api:scope>
    </api:advisory>
  </entry>

  <!-- ADV-2026-001: active, pricing change on webhooks routes -->
  <entry>
    <id>https://api.example.com/advisories/ADV-2026-001</id>
    <title xml:lang="en">
      Webhooks endpoint moving to paid model
    </title>
    <published>2026-05-10T10:00:00Z</published>
    <updated>2026-05-10T10:00:00Z</updated>
    <summary xml:lang="en">
      Webhook usage will be billed at $0.01 per call.
    </summary>
    <link rel="alternate"
      href="https://example.com/blog/pricing-2026"/>
    <api:advisory>
      <api:id>ADV-2026-001</api:id>
      <api:advisory_datetime>
        2026-05-10T10:00:00Z
      </api:advisory_datetime>
      <api:effective_datetime>
        2026-12-01T00:00:00Z
      </api:effective_datetime>
      <api:status>active</api:status>
      <api:category>pricing_change</api:category>
      <api:priority>high</api:priority>
      <api:action_required>true</api:action_required>
      <api:suggested_action>
        Review your webhook usage and update your billing plan.
      </api:suggested_action>
      <api:scope>
        <api:level>routes</api:level>
        <api:versions>
          <api:version>v2</api:version>
        </api:versions>
        <api:routes>
          <api:route>
            <api:method>POST</api:method>
            <api:path>/v2/webhooks</api:path>
          </api:route>
          <api:route>
            <api:method>*</api:method>
            <api:path>/v2/webhooks/**</api:path>
          </api:route>
        </api:routes>
      </api:scope>
    </api:advisory>
  </entry>

</feed>
]]></sourcecode></figure>

<t>The HTTP response for the feed <bcp14>SHOULD</bcp14> include:</t>

<figure><artwork><![CDATA[
Cache-Control: public, max-age=3600
]]></artwork></figure>

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

<section anchor="well-known-uri-registration"><name>Well-Known URI Registration</name>

<t>This document requests the registration of the following well-known URI in the "Well-Known URIs" registry established by <xref target="RFC8615"/>:</t>

<t><list style="symbols">
  <t>URI suffix: <spanx style="verb">api-advisory.json</spanx></t>
  <t>Change controller: IETF</t>
  <t>Specification document: this document</t>
  <t>Related information: The resource is a JSON discovery object as defined in <xref target="discovery-file-format"/>, pointing to an Atom feed as defined in <xref target="atom-feed-format"/>.</t>
</list></t>

</section>
<section anchor="xml-namespace-registration"><name>XML Namespace Registration</name>

<t>This document requests the registration of the following XML namespace:</t>

<t><list style="symbols">
  <t>URI: <spanx style="verb">https://iana.org/api-advisory/1.0</spanx></t>
  <t>Registrant Contact: the author of this document</t>
  <t>XML: None; the namespace does not have an associated schema at this time.</t>
</list></t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<section anchor="https-requirement"><name>HTTPS Requirement</name>

<t>Consumers <bcp14>MUST</bcp14> only fetch discovery files and advisory feeds over HTTPS. A file or feed served over plain HTTP is subject to manipulation in transit and <bcp14>MUST NOT</bcp14> be trusted.</t>

</section>
<section anchor="namespace-validation"><name>Namespace Validation</name>

<t>Consumers <bcp14>MUST</bcp14> verify that the <spanx style="verb">namespace</spanx> field in the discovery file exactly matches the FQDN from which the file was retrieved. Failure to do so may allow a malicious party to serve a discovery file for a different domain, causing consumers to subscribe to an advisory feed for the wrong API.</t>

</section>
<section anchor="feed-url-validation"><name>Feed URL Validation</name>

<t>Consumers <bcp14>MUST</bcp14> verify that the <spanx style="verb">feed_url</spanx> value uses the <spanx style="verb">https</spanx> scheme before fetching the feed. Consumers <bcp14>SHOULD</bcp14> also verify that the feed URL is not a redirect to a non-HTTPS location.</t>

</section>
<section anchor="availability"><name>Availability</name>

<t>A discovery file or advisory feed that is temporarily or permanently unavailable <bcp14>MUST</bcp14> be treated as a transient error. Consumers <bcp14>MUST NOT</bcp14> interpret the absence of a discovery file or feed as confirmation that no advisories exist. Producers <bcp14>SHOULD</bcp14> ensure that both the discovery and feed endpoints are subject to the same availability guarantees as their API.</t>

</section>
<section anchor="content-integrity"><name>Content Integrity</name>

<t>This specification does not define a mandatory mechanism for signing advisory feeds. Consumers relying on advisory content for automated decisions (e.g., automated circuit-breaking) <bcp14>SHOULD</bcp14> consider whether additional integrity guarantees are appropriate for their threat model. One approach is HTTP Message Signatures (<xref target="RFC9421"/>), which allows producers to sign HTTP responses (including the advisory feed response) using asymmetric keys. Consumers can then verify the signature before processing the feed content, without relying solely on HTTPS for authenticity.</t>

</section>
<section anchor="historical-record-preservation"><name>Historical Record Preservation</name>

<t>Producers <bcp14>MUST NOT</bcp14> remove advisory entries from the feed after they have been published. Removing a <spanx style="verb">superseded</spanx> or <spanx style="verb">withdrawn</spanx> entry may cause consumers that had previously observed it to re-process it as a new advisory on a subsequent poll, depending on their deduplication implementation.</t>

</section>
</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">



<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="RFC8615">
  <front>
    <title>Well-Known Uniform Resource Identifiers (URIs)</title>
    <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
    <date month="May" year="2019"/>
    <abstract>
      <t>This memo defines a path prefix for "well-known locations", "/.well-known/", in selected Uniform Resource Identifier (URI) schemes.</t>
      <t>In doing so, it obsoletes RFC 5785 and updates the URI schemes defined in RFC 7230 to reserve that space. It also updates RFC 7595 to track URI schemes that support well-known URIs in their registry.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8615"/>
  <seriesInfo name="DOI" value="10.17487/RFC8615"/>
</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>
<reference anchor="RFC9110">
  <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="RFC5234">
  <front>
    <title>Augmented BNF for Syntax Specifications: ABNF</title>
    <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker"/>
    <author fullname="P. Overell" initials="P." surname="Overell"/>
    <date month="January" year="2008"/>
    <abstract>
      <t>Internet technical specifications often need to define a formal syntax. Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications. The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power. The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges. This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="68"/>
  <seriesInfo name="RFC" value="5234"/>
  <seriesInfo name="DOI" value="10.17487/RFC5234"/>
</reference>
<reference anchor="RFC3986">
  <front>
    <title>Uniform Resource Identifier (URI): Generic Syntax</title>
    <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
    <author fullname="R. Fielding" initials="R." surname="Fielding"/>
    <author fullname="L. Masinter" initials="L." surname="Masinter"/>
    <date month="January" year="2005"/>
    <abstract>
      <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="66"/>
  <seriesInfo name="RFC" value="3986"/>
  <seriesInfo name="DOI" value="10.17487/RFC3986"/>
</reference>
<reference anchor="RFC4287">
  <front>
    <title>The Atom Syndication Format</title>
    <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
    <author fullname="R. Sayre" initials="R." role="editor" surname="Sayre"/>
    <date month="December" year="2005"/>
    <abstract>
      <t>This document specifies Atom, an XML-based Web content and metadata syndication format. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="4287"/>
  <seriesInfo name="DOI" value="10.17487/RFC4287"/>
</reference>



    </references>

    <references title='Informative References' anchor="sec-informative-references">



<reference anchor="RFC7234">
  <front>
    <title>Hypertext Transfer Protocol (HTTP/1.1): 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="2014"/>
    <abstract>
      <t>The Hypertext Transfer Protocol (HTTP) is a stateless \%application- level protocol for distributed, collaborative, hypertext information systems. This document defines HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7234"/>
  <seriesInfo name="DOI" value="10.17487/RFC7234"/>
</reference>
<reference anchor="RFC9421">
  <front>
    <title>HTTP Message Signatures</title>
    <author fullname="A. Backman" initials="A." role="editor" surname="Backman"/>
    <author fullname="J. Richer" initials="J." role="editor" surname="Richer"/>
    <author fullname="M. Sporny" initials="M." surname="Sporny"/>
    <date month="February" year="2024"/>
    <abstract>
      <t>This document describes a mechanism for creating, encoding, and verifying digital signatures or message authentication codes over components of an HTTP message. This mechanism supports use cases where the full HTTP message may not be known to the signer and where the message may be transformed (e.g., by intermediaries) before reaching the verifier. This document also describes a means for requesting that a signature be applied to a subsequent HTTP message in an ongoing HTTP exchange.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9421"/>
  <seriesInfo name="DOI" value="10.17487/RFC9421"/>
</reference>



    </references>

</references>


<?line 727?>

<section numbered="false" anchor="acknowledgements"><name>Acknowledgements</name>

<t>The author would like to thank Dale R. Worley for his review and feedback on the mailing list, in particular for suggesting the use of Atom (<xref target="RFC4287"/>) as the advisory delivery mechanism.</t>

</section>


  </back>

<!-- ##markdown-source:
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
QPBzM9WZODBTh7s9Ak6kiF5l92muCuNl5FlxDtd5E7hFWwAZdRATd0vAy3C6
EmSKD4GFoYQgotaRH8o4azI9ivmmJ6Pkk0RMR3j2u4GKTkgVpRlztJh5zo1/
38wqm7xT29/fxM64ZIPQ43m2OMcYx3FPBwqOzLsYbJtkw10x6XoZdfZa8b5Z
ED9YSPEUF8hS749clXohT9Lxy0uOumWFZBaXK/Gou5glN8KlNbR6UboNFtam
Ih39RXHqww7LkEk8nlrugJng4p+EtyAYGmIuiK72Y66JQ6tyw8rdxEtvg0C9
VP9WRsD2nsKf3mRsoaWsatHGxa752tDf1mWTRLBB/meuqbksUfhuJa1Mr0Dy
IBfJHJk9JM82PAxnJBBfw88616gy1HieoX5GMJqWWSGC4YtycqfQ338kybZW
61qcK394/PLVyLx8dDJ+fHqq8dWgGAOTCvFjwumgZeVLDpB1VL1Tn5fPrCdt
SXOo0CTjpbm+u4DfJ7jlG1W2KnOp3dvy7C2UNI8hV0grieG6TPXtMVImZ7m1
6IZy/BSg7ZjdNrhuCLN5zOZQwxTOt78DXCFpm4wVwBgdX+a4KQ5f3mUh2Z2V
MgvUiNynY/+o44I5+8V1C2WxKJWxxSrmXddlfsH2uLTVeV0mlQ/GM269oOTw
ujSyEn2Fc6PekOWxVASo6HjrRBQG+Cko6LDBOnAa5roPrSThlFsXxlfmVfll
2clPxOu68MYIZDQMImO20moNltOZzY/Hazqw0UpI18ohSFCmlSZkWMIfS4SY
jE+fHfOlOzlTrtYw2OAAD5FDW36rtKVYJRh4CoNbIFm5ve4wxpUUlM4JiQTL
82z1liyBoj6zlVPw2JPX7clcMEAqWJvxD8bijJ6kAdHy1G+ZkGVJRFjnTCVy
pRiDqqkrfYDAt7y1gD5f6R0Ylh21g0PTcJ0Mvy61+pRnST68xZV5DlMGgHzM
qUwSezLpWh3fNKQIl54V2QVGaFfzB4tr1avzbB6TeNhzB6CXnkQHkjcYyi13
q7GTcKEyOxL2cl2ZbH5O0QhFvEv5cPLdXY+t9VJTT7oHAhQuG0REYWvgnDTw
E8gdZdoh4vgXViqmHOGE73gAVSA4XbjSWGG8mjhhWF/ygQpZB2FKSaCQcNda
VPqsKhNU0hHXSSmxRCkNIbbyc+eQeOzSD2ljNSI1mO4UFhUC9jidas4A321B
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

-->

</rfc>

