<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>

<!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-02" 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="October" day="29"/>

    <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="RFC9111"/>) 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="RFC9111">
  <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="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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
g2MDMH4Zm7s17YGEZHgWZ0E5tf8HQAJrM1+IAAA=

-->

</rfc>

