<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.27 (Ruby 3.4.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-grow-peering-api-01" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.0 -->
  <front>
    <title>Peering API</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-grow-peering-api-01"/>
    <author fullname="Carlos Aguado">
      <organization>Amazon</organization>
      <address>
        <email>crlsa@amazon.com</email>
      </address>
    </author>
    <author fullname="Matt Griswold">
      <organization>FullCtl</organization>
      <address>
        <email>grizz@20c.com</email>
      </address>
    </author>
    <author fullname="Jenny Ramseyer">
      <organization>Meta</organization>
      <address>
        <email>ramseyer@meta.com</email>
      </address>
    </author>
    <author fullname="Arturo Servin">
      <organization>Google</organization>
      <address>
        <email>arturolev@google.com</email>
      </address>
    </author>
    <author fullname="Tom Strickx">
      <organization>Cloudflare</organization>
      <address>
        <email>tstrickx@cloudflare.com</email>
      </address>
    </author>
    <author fullname="Q Misell">
      <organization>AS207960 Cyfyngedig</organization>
      <address>
        <email>q@as207960.net</email>
      </address>
    </author>
    <date year="2025" month="July" day="04"/>
    <keyword>BGP</keyword>
    <keyword>peering</keyword>
    <keyword>configuration</keyword>
    <abstract>
      <?line 79?>

<t>We propose an API standard for BGP Peering, also known as interdomain interconnection through global Internet Routing.
This API offers a standard way to request public (settlement-free) peering, verify the status of a request or BGP session, and list potential connection locations.
The API is backed by PeeringDB OIDC, the industry standard for peering authentication.
We also propose future work to cover private peering, and alternative authentication methods.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://bgp.github.io/draft-ietf-peering-api/draft-peering-api-ramseyer-protocol.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-grow-peering-api/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/bgp/draft-ietf-peering-api"/>.</t>
    </note>
  </front>
  <middle>
    <?line 86?>

<section anchor="problems">
      <name>Introduction</name>
      <t>The Peering API is a mechanism that allows networks to automate interdomain interconnection  between two Autonomous Systems (AS) through the Border Gateway Protocol 4 (<xref target="RFC4271"/>).
Using the API, networks will be able to automatically request and accept peering interconnections between Autonomous Systems in public or private scenarios in a time faster than it would take to configure sessions manually.
By speeding up the peering turn-up process and removing the need for manual involvement in peering, the API and automation will ensure that networks can get interconnected as fast, reliably, cost-effectively, and efficiently as possible.
As a result, this improves end-user performance for all applications using networks interconnection supporting the Peering API.</t>
      <section anchor="justification">
        <name>Business Justification</name>
        <t>By using the Peering API, entities requesting and accepting peering can significantly improve the process to turn up interconnections by:</t>
        <ul spacing="normal">
          <li>
            <t>Reducing in person-hours spent configuring peering</t>
          </li>
          <li>
            <t>Reducing configuration mistakes by reducing human interaction</t>
          </li>
          <li>
            <t>And by peering, reducing network latency through expansion of interconnection relationships</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="conventions">
      <name>Conventions and Terminology</name>
      <t>All terms used in this document will be defined here:</t>
      <dl>
        <dt>Initiator</dt>
        <dd>
          <t>Network that wants to peer</t>
        </dd>
        <dt>Receiver</dt>
        <dd>
          <t>Network that is receiving communications about peering</t>
        </dd>
        <dt>Configured</dt>
        <dd>
          <t>peering session that is set up on one side</t>
        </dd>
        <dt>Established</dt>
        <dd>
          <t>session is already defined as per BGP-4 specification  <xref section="8.2.2" sectionFormat="of" target="RFC4271"/></t>
        </dd>
      </dl>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.
These words may also appear in this document in
lower case as plain English words, absent their normative meanings.
<?line -8?>
      </t>
    </section>
    <section anchor="audience">
      <name>Audience</name>
      <t>The Peering API aims to simplify peering interconnection configuration.
To that end, the API can be called by either a human or some automation.
A network engineer can submit API requests through a client-side tool, and configure sessions by hand or through existing tooling.
Alternately, an automated service can request BGP sessions through some trigger or regularly scheduled request (for example, upon joining a new peering location, or through regular polling of potential peers).
That automated client can then configure the client sessions through its own tooling.
For ease of exchanging peering requests, the authors suggest peers to maintain both a client and a server for the API.
Toward the goal of streamlining peering configuration, the authors encourage peers to automate their network configuration wherever possible, but do not require full automation to use this API.</t>
    </section>
    <section anchor="protocol">
      <name>Protocol</name>
      <t>The Peering API follows the Representational State Transfer (<xref target="BCP56"/>) architecture where sessions, locations, and maintenance events are the resources the API represents and is modeled after the OpenAPI standard <xref target="openapi"/>.
Using the token bearer model (<xref target="RFC6750"/>), a client application can request to add or remove peering sessions, list potential interconnection locations, and query for upcoming maintenance events on behalf of the AS resource owner.</t>
      <section anchor="example-peering-request-negotiation">
        <name>Example Peering Request Negotiation</name>
        <t>Diagram of the Peering Request Process</t>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="864" width="504" viewBox="0 0 504 864" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,48 L 8,80" fill="none" stroke="black"/>
              <path d="M 8,144 L 8,224" fill="none" stroke="black"/>
              <path d="M 8,272 L 8,336" fill="none" stroke="black"/>
              <path d="M 8,384 L 8,464" fill="none" stroke="black"/>
              <path d="M 8,624 L 8,704" fill="none" stroke="black"/>
              <path d="M 72,232 L 72,264" fill="none" stroke="black"/>
              <path d="M 104,784 L 104,848" fill="none" stroke="black"/>
              <path d="M 136,624 L 136,704" fill="none" stroke="black"/>
              <path d="M 144,544 L 144,560" fill="none" stroke="black"/>
              <path d="M 168,48 L 168,80" fill="none" stroke="black"/>
              <path d="M 168,144 L 168,224" fill="none" stroke="black"/>
              <path d="M 168,272 L 168,336" fill="none" stroke="black"/>
              <path d="M 168,384 L 168,464" fill="none" stroke="black"/>
              <path d="M 184,736 L 184,776" fill="none" stroke="black"/>
              <path d="M 208,784 L 208,848" fill="none" stroke="black"/>
              <path d="M 224,624 L 224,704" fill="none" stroke="black"/>
              <path d="M 288,712 L 288,736" fill="none" stroke="black"/>
              <path d="M 328,384 L 328,464" fill="none" stroke="black"/>
              <path d="M 336,48 L 336,80" fill="none" stroke="black"/>
              <path d="M 336,160 L 336,208" fill="none" stroke="black"/>
              <path d="M 336,272 L 336,336" fill="none" stroke="black"/>
              <path d="M 360,624 L 360,704" fill="none" stroke="black"/>
              <path d="M 400,104 L 400,136" fill="none" stroke="black"/>
              <path d="M 400,560 L 400,816" fill="none" stroke="black"/>
              <path d="M 408,344 L 408,376" fill="none" stroke="black"/>
              <path d="M 496,48 L 496,80" fill="none" stroke="black"/>
              <path d="M 496,160 L 496,208" fill="none" stroke="black"/>
              <path d="M 496,272 L 496,336" fill="none" stroke="black"/>
              <path d="M 496,384 L 496,464" fill="none" stroke="black"/>
              <path d="M 24,32 L 152,32" fill="none" stroke="black"/>
              <path d="M 352,32 L 480,32" fill="none" stroke="black"/>
              <path d="M 176,64 L 328,64" fill="none" stroke="black"/>
              <path d="M 24,96 L 152,96" fill="none" stroke="black"/>
              <path d="M 352,96 L 480,96" fill="none" stroke="black"/>
              <path d="M 8,144 L 168,144" fill="none" stroke="black"/>
              <path d="M 352,144 L 480,144" fill="none" stroke="black"/>
              <path d="M 176,176 L 328,176" fill="none" stroke="black"/>
              <path d="M 8,224 L 168,224" fill="none" stroke="black"/>
              <path d="M 352,224 L 480,224" fill="none" stroke="black"/>
              <path d="M 8,272 L 168,272" fill="none" stroke="black"/>
              <path d="M 336,272 L 496,272" fill="none" stroke="black"/>
              <path d="M 176,304 L 328,304" fill="none" stroke="black"/>
              <path d="M 8,336 L 168,336" fill="none" stroke="black"/>
              <path d="M 336,336 L 496,336" fill="none" stroke="black"/>
              <path d="M 8,384 L 168,384" fill="none" stroke="black"/>
              <path d="M 328,384 L 496,384" fill="none" stroke="black"/>
              <path d="M 176,416 L 320,416" fill="none" stroke="black"/>
              <path d="M 8,464 L 168,464" fill="none" stroke="black"/>
              <path d="M 328,464 L 496,464" fill="none" stroke="black"/>
              <path d="M 144,560 L 400,560" fill="none" stroke="black"/>
              <path d="M 8,624 L 136,624" fill="none" stroke="black"/>
              <path d="M 224,624 L 360,624" fill="none" stroke="black"/>
              <path d="M 144,672 L 216,672" fill="none" stroke="black"/>
              <path d="M 8,704 L 136,704" fill="none" stroke="black"/>
              <path d="M 224,704 L 360,704" fill="none" stroke="black"/>
              <path d="M 184,736 L 288,736" fill="none" stroke="black"/>
              <path d="M 104,784 L 208,784" fill="none" stroke="black"/>
              <path d="M 216,816 L 400,816" fill="none" stroke="black"/>
              <path d="M 104,848 L 208,848" fill="none" stroke="black"/>
              <path d="M 56,544 L 92,616" fill="none" stroke="black"/>
              <path d="M 108,472 L 128,512" fill="none" stroke="black"/>
              <path d="M 48,512 L 68,472" fill="none" stroke="black"/>
              <path d="M 24,32 C 15.16936,32 8,39.16936 8,48" fill="none" stroke="black"/>
              <path d="M 152,32 C 160.83064,32 168,39.16936 168,48" fill="none" stroke="black"/>
              <path d="M 352,32 C 343.16936,32 336,39.16936 336,48" fill="none" stroke="black"/>
              <path d="M 480,32 C 488.83064,32 496,39.16936 496,48" fill="none" stroke="black"/>
              <path d="M 24,96 C 15.16936,96 8,88.83064 8,80" fill="none" stroke="black"/>
              <path d="M 152,96 C 160.83064,96 168,88.83064 168,80" fill="none" stroke="black"/>
              <path d="M 352,96 C 343.16936,96 336,88.83064 336,80" fill="none" stroke="black"/>
              <path d="M 480,96 C 488.83064,96 496,88.83064 496,80" fill="none" stroke="black"/>
              <path d="M 352,144 C 343.16936,144 336,151.16936 336,160" fill="none" stroke="black"/>
              <path d="M 480,144 C 488.83064,144 496,151.16936 496,160" fill="none" stroke="black"/>
              <path d="M 352,224 C 343.16936,224 336,216.83064 336,208" fill="none" stroke="black"/>
              <path d="M 480,224 C 488.83064,224 496,216.83064 496,208" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="416,376 404,370.4 404,381.6" fill="black" transform="rotate(90,408,376)"/>
              <polygon class="arrowhead" points="408,136 396,130.4 396,141.6" fill="black" transform="rotate(90,400,136)"/>
              <polygon class="arrowhead" points="336,304 324,298.4 324,309.6" fill="black" transform="rotate(0,328,304)"/>
              <polygon class="arrowhead" points="336,64 324,58.4 324,69.6" fill="black" transform="rotate(0,328,64)"/>
              <polygon class="arrowhead" points="224,816 212,810.4 212,821.6" fill="black" transform="rotate(180,216,816)"/>
              <polygon class="arrowhead" points="224,672 212,666.4 212,677.6" fill="black" transform="rotate(0,216,672)"/>
              <polygon class="arrowhead" points="192,776 180,770.4 180,781.6" fill="black" transform="rotate(90,184,776)"/>
              <polygon class="arrowhead" points="184,416 172,410.4 172,421.6" fill="black" transform="rotate(180,176,416)"/>
              <polygon class="arrowhead" points="184,176 172,170.4 172,181.6" fill="black" transform="rotate(180,176,176)"/>
              <polygon class="arrowhead" points="100,616 88,610.4 88,621.6" fill="black" transform="rotate(63.43494882292201,92,616)"/>
              <polygon class="arrowhead" points="80,264 68,258.4 68,269.6" fill="black" transform="rotate(90,72,264)"/>
              <g class="text">
                <text x="68" y="52">Step</text>
                <text x="96" y="52">1</text>
                <text x="396" y="52">Step</text>
                <text x="424" y="52">2</text>
                <text x="72" y="68">Network</text>
                <text x="112" y="68">1</text>
                <text x="400" y="68">Network</text>
                <text x="440" y="68">1</text>
                <text x="68" y="84">Identifies</text>
                <text x="132" y="84">need</text>
                <text x="388" y="84">Checks</text>
                <text x="448" y="84">details</text>
                <text x="76" y="164">Step</text>
                <text x="104" y="164">4</text>
                <text x="404" y="164">Step</text>
                <text x="432" y="164">3</text>
                <text x="72" y="180">Network</text>
                <text x="112" y="180">1</text>
                <text x="400" y="180">Network</text>
                <text x="440" y="180">1</text>
                <text x="44" y="196">gets</text>
                <text x="100" y="196">approval</text>
                <text x="404" y="196">Public</text>
                <text x="444" y="196">or</text>
                <text x="80" y="212">token</text>
                <text x="376" y="212">Private</text>
                <text x="440" y="212">Peering</text>
                <text x="76" y="292">Step</text>
                <text x="104" y="292">5</text>
                <text x="404" y="292">Step</text>
                <text x="432" y="292">6</text>
                <text x="56" y="308">Network</text>
                <text x="96" y="308">1</text>
                <text x="128" y="308">finds</text>
                <text x="400" y="308">Network</text>
                <text x="440" y="308">1</text>
                <text x="44" y="324">common</text>
                <text x="112" y="324">locations</text>
                <text x="384" y="324">request</text>
                <text x="448" y="324">peering</text>
                <text x="76" y="404">Step</text>
                <text x="104" y="404">8</text>
                <text x="404" y="404">Step</text>
                <text x="432" y="404">7</text>
                <text x="80" y="420">Network</text>
                <text x="120" y="420">2</text>
                <text x="400" y="420">Network</text>
                <text x="440" y="420">2</text>
                <text x="48" y="436">accepts</text>
                <text x="92" y="436">or</text>
                <text x="132" y="436">reject</text>
                <text x="412" y="436">verifies</text>
                <text x="76" y="452">sessions</text>
                <text x="416" y="452">credentials</text>
                <text x="44" y="532">Accept</text>
                <text x="140" y="532">Reject</text>
                <text x="60" y="644">Step</text>
                <text x="88" y="644">9</text>
                <text x="276" y="644">Step</text>
                <text x="308" y="644">10</text>
                <text x="52" y="660">Sessions</text>
                <text x="104" y="660">are</text>
                <text x="264" y="660">Network</text>
                <text x="304" y="660">1</text>
                <text x="324" y="660">or</text>
                <text x="344" y="660">2</text>
                <text x="72" y="676">provisioned</text>
                <text x="260" y="676">checks</text>
                <text x="320" y="676">session</text>
                <text x="76" y="692">status</text>
                <text x="256" y="692">until</text>
                <text x="292" y="692">it</text>
                <text x="316" y="692">is</text>
                <text x="340" y="692">up</text>
                <text x="148" y="804">Step</text>
                <text x="180" y="804">11</text>
                <text x="160" y="820">Process</text>
                <text x="156" y="836">Terminates</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
 .-----------------.                      .-----------------.
|     Step 1        |                    |     Step 2        |
|    Network 1      |------------------->|    Network 1      |
|  Identifies need  |                    |   Checks details  |
 '-----------------'                      '-----------------'
                                                 |
                                                 v
+-------------------+                     .-----------------.
|      Step 4       |                    |      Step 3       |
|    Network 1      |<-------------------|    Network 1      |
|  gets approval    |                    |     Public or     |
|      token        |                    | Private Peering   |
+-------------------+                     '-----------------'
        |
        v
+-------------------+                    +-------------------+
|      Step 5       |                    |      Step 6       |
|  Network 1 finds  |------------------->|    Network 1      |
| common locations  |                    |  request peering  |
+-------------------+                    +-------------------+
                                                  |
                                                  v
+-------------------+                   +--------------------+
|      Step 8       |                   |       Step 7       |
|     Network 2     |<------------------|     Network 2      |
| accepts or reject |                   |      verifies      |
|    sessions       |                   |     credentials    |
+-------------------+                   +--------------------+
       /     \
      /       \
     /         \
  Accept      Reject
      \          |
       \         +-------------------------------+
        \                                        |
         \                                       |
          v                                      |
+---------------+          +----------------+    |
|    Step 9     |          |    Step 10     |    |
| Sessions are  |          | Network 1 or 2 |    |
|  provisioned  |--------->| checks session |    |
|     status    |          | until it is up |    |
+---------------+          +----------------+    |
                                   |             |
                      +------------+             |
                      |                          |
                      v                          |
            +------------+                       |
            |   Step 11  |                       |
            |   Process  |<----------------------+
            | Terminates |
            +------------+
]]></artwork>
        </artset>
        <ul spacing="normal">
          <li>
            <t>Step 1 (Human): Network 1 identifies that it would be useful to peer with Network 2 to interchange traffic more optimally.</t>
          </li>
          <li>
            <t>Step 2 (Human): Network 1 checks technical and other peering details about Network 2 to check if peering is possible.</t>
          </li>
          <li>
            <t>Step 3 (Human): Network 1 decides in type (Public or PNI) of peering and facility.</t>
          </li>
          <li>
            <t>Step 4 (API): Network 1 gets approval/token that is authorized to ‘speak’ on behalf of Network 1’s ASN.</t>
          </li>
          <li>
            <t>Step 5 (API): Network 1 checks PeeringDB for common places between Network 1 and Network 2; GET /locations</t>
          </li>
          <li>
            <t>Step 6 (API): Network 1 request peering with Network 2; POST /add_sessions</t>
          </li>
          <li>
            <t>Step 7 (API): Network 2 verifies Network 1 credentials, check requirements for peering.</t>
          </li>
          <li>
            <t>Step 8 (API): Network 2 accepts or rejects session(s). API Server gives yes/no for request.</t>
          </li>
          <li>
            <t>Step 9 (API): If yes, sessions are provisioned, Networks 1 or Network 2 can check status; API: GET /sessions</t>
          </li>
          <li>
            <t>Step 10 (API): API keeps polling until sessions are up</t>
          </li>
          <li>
            <t>Step 11 (API): Process Terminates</t>
          </li>
        </ul>
      </section>
      <section anchor="example-api-flow">
        <name>Example API Flow</name>
        <t>The diagram below outlines the proposed API flow.</t>
        <section anchor="list-locations">
          <name>List Locations</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="192" width="584" viewBox="0 0 584 192" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
                <path d="M 56,72 L 56,176" fill="none" stroke="black"/>
                <path d="M 104,32 L 104,64" fill="none" stroke="black"/>
                <path d="M 512,32 L 512,64" fill="none" stroke="black"/>
                <path d="M 544,72 L 544,176" fill="none" stroke="black"/>
                <path d="M 576,32 L 576,64" fill="none" stroke="black"/>
                <path d="M 8,32 L 104,32" fill="none" stroke="black"/>
                <path d="M 512,32 L 576,32" fill="none" stroke="black"/>
                <path d="M 8,64 L 104,64" fill="none" stroke="black"/>
                <path d="M 512,64 L 576,64" fill="none" stroke="black"/>
                <path d="M 64,112 L 536,112" fill="none" stroke="black"/>
                <path d="M 64,176 L 536,176" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="544,112 532,106.4 532,117.6" fill="black" transform="rotate(0,536,112)"/>
                <polygon class="arrowhead" points="72,176 60,170.4 60,181.6" fill="black" transform="rotate(180,64,176)"/>
                <g class="text">
                  <text x="56" y="52">Initiator</text>
                  <text x="540" y="52">Peer</text>
                  <text x="88" y="100">QUERY</text>
                  <text x="144" y="100">peering</text>
                  <text x="216" y="100">locations</text>
                  <text x="280" y="100">(peer</text>
                  <text x="328" y="100">type,</text>
                  <text x="372" y="100">ASN,</text>
                  <text x="412" y="100">auth</text>
                  <text x="456" y="100">code)</text>
                  <text x="328" y="148">Reply</text>
                  <text x="372" y="148">with</text>
                  <text x="424" y="148">peering</text>
                  <text x="496" y="148">locations</text>
                  <text x="292" y="164">or</text>
                  <text x="332" y="164">errors</text>
                  <text x="384" y="164">(401,</text>
                  <text x="428" y="164">406,</text>
                  <text x="468" y="164">451,</text>
                  <text x="512" y="164">etc.)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+-----------+                                                  +-------+
| Initiator |                                                  | Peer  |
+-----------+                                                  +-------+
      |                                                            |
      | QUERY peering locations (peer type, ASN, auth code)        |
      |----------------------------------------------------------->|
      |                                                            |
      |                               Reply with peering locations |
      |                            or errors (401, 406, 451, etc.) |
      |<-----------------------------------------------------------|
]]></artwork>
          </artset>
        </section>
        <section anchor="request-session-status">
          <name>Request session status</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="192" width="584" viewBox="0 0 584 192" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
                <path d="M 56,72 L 56,176" fill="none" stroke="black"/>
                <path d="M 104,32 L 104,64" fill="none" stroke="black"/>
                <path d="M 512,32 L 512,64" fill="none" stroke="black"/>
                <path d="M 544,72 L 544,176" fill="none" stroke="black"/>
                <path d="M 576,32 L 576,64" fill="none" stroke="black"/>
                <path d="M 8,32 L 104,32" fill="none" stroke="black"/>
                <path d="M 512,32 L 576,32" fill="none" stroke="black"/>
                <path d="M 8,64 L 104,64" fill="none" stroke="black"/>
                <path d="M 512,64 L 576,64" fill="none" stroke="black"/>
                <path d="M 64,112 L 536,112" fill="none" stroke="black"/>
                <path d="M 64,176 L 536,176" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="544,112 532,106.4 532,117.6" fill="black" transform="rotate(0,536,112)"/>
                <polygon class="arrowhead" points="72,176 60,170.4 60,181.6" fill="black" transform="rotate(180,64,176)"/>
                <g class="text">
                  <text x="56" y="52">Initiator</text>
                  <text x="540" y="52">Peer</text>
                  <text x="88" y="100">QUERY</text>
                  <text x="144" y="100">request</text>
                  <text x="204" y="100">status</text>
                  <text x="256" y="100">using</text>
                  <text x="312" y="100">request</text>
                  <text x="356" y="100">ID</text>
                  <text x="376" y="100">&amp;</text>
                  <text x="404" y="100">auth</text>
                  <text x="444" y="100">code</text>
                  <text x="352" y="148">Reply</text>
                  <text x="396" y="148">with</text>
                  <text x="448" y="148">session</text>
                  <text x="508" y="148">status</text>
                  <text x="384" y="164">(200,</text>
                  <text x="428" y="164">404,</text>
                  <text x="468" y="164">202,</text>
                  <text x="512" y="164">etc.)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+-----------+                                                  +-------+
| Initiator |                                                  | Peer  |
+-----------+                                                  +-------+
      |                                                            |
      | QUERY request status using request ID & auth code          |
      |----------------------------------------------------------->|
      |                                                            |
      |                                  Reply with session status |
      |                                      (200, 404, 202, etc.) |
      |<-----------------------------------------------------------|
]]></artwork>
          </artset>
        </section>
        <section anchor="request">
          <name>REQUEST</name>
          <ol spacing="normal" type="1"><li>
              <t>ADD SESSION (CLIENT BATCHED REQUEST)</t>
            </li>
          </ol>
          <ul spacing="normal">
            <li>
              <t>The initiator's client provides a set of the following information, where local always refers to the receiver and peer always refers to the initiator:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Structure:
                  </t>
                  <ol spacing="normal" type="1"><li>
                      <t>Local ASN</t>
                    </li>
                    <li>
                      <t>Local IP</t>
                    </li>
                    <li>
                      <t>Peer ASN</t>
                    </li>
                    <li>
                      <t>Peer IP</t>
                    </li>
                    <li>
                      <t>Local BGP Role according to <xref target="RFC9234"/></t>
                    </li>
                    <li>
                      <t>Peer BGP Role according to <xref target="RFC9234"/></t>
                    </li>
                    <li>
                      <t>Local insert ASN (optional to support route servers)</t>
                    </li>
                    <li>
                      <t>Peer insert ASN (optional to support route servers)</t>
                    </li>
                    <li>
                      <t>Local monitoring session (optional to support monitoring systems)</t>
                    </li>
                    <li>
                      <t>Peer monitoring session (optional to support monitoring systems)</t>
                    </li>
                    <li>
                      <t>Peer Type (public or private)</t>
                    </li>
                    <li>
                      <t>Session Secret (optional with encoding agreed outside of this specification)</t>
                    </li>
                    <li>
                      <t>Location (Commonly agreed identifier of the BGP speaker, e.g. PeeringDB IX lan ID)</t>
                    </li>
                  </ol>
                </li>
              </ul>
            </li>
            <li>
              <t>The receiver's expected actions:
              </t>
              <ul spacing="normal">
                <li>
                  <t>The server confirms requested clientASN in list of authorized ASNs.</t>
                </li>
                <li>
                  <t>Optional: checks traffic levels, prefix limit counters, other desired internal checks.
      2. ADD SESSIONS (SERVER BATCHED RESPONSE)</t>
                </li>
              </ul>
            </li>
            <li>
              <t>APPROVAL CASE
              </t>
              <ul spacing="normal">
                <li>
                  <t>Server returns a list with the structure for each of the acceptable peering sessions. Note: this structure may also contain additional attributes such as the server generated session ID.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>PARTIAL APPROVAL CASE
              </t>
              <ul spacing="normal">
                <li>
                  <t>Server returns a list with the structure for each of the acceptable peering sessions as in the approval case. The server also returns a list of sessions that have not deemed as validated or acceptable to be created. The set of sessions accepted and rejected is disjoint and the join of both sets matches the cardinality of the requested sessions.</t>
                </li>
              </ul>
            </li>
            <li>
              <t>REJECTION CASE
              </t>
              <ul spacing="normal">
                <li>
                  <t>Server returns an error message which indicates that all of the sessions requested have been rejected and the reason for it.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="clientconfig">
          <name>CLIENT CONFIGURATION</name>
          <t>The client then configures the chosen peering sessions asynchronously using their internal mechanisms.
The client SHOULD pull and use additional information on the new peering from public sources as required to ensure routing security, e.g., AS-SETs to configure appropriate filters.
For every session that the server rejected, the client removes that session from the list to be configured.</t>
        </section>
        <section anchor="serverconfig">
          <name>SERVER CONFIGURATION</name>
          <t>The server configures all sessions that are in its list of approved peering sessions from its reply to the client.
The server SHOULD pull and use additional information on the new peering from public sources to ensure routing security, e.g., AS-SETs to configure appropriate filters.</t>
        </section>
        <section anchor="monitoring">
          <name>MONITORING</name>
          <t>Both client and server wait for sessions to establish.
At any point, client may send a "GET STATUS" request to the server, to request the status of the session (by session ID).
The client will send a structure along with the request, as follows:</t>
          <ul spacing="normal">
            <li>
              <t>structure (where local refers to the server and peer refers to the client):
              </t>
              <ul spacing="normal">
                <li>
                  <t>Session ID</t>
                </li>
                <li>
                  <t>Local ASN</t>
                </li>
                <li>
                  <t>Local IP</t>
                </li>
                <li>
                  <t>Peer ASN</t>
                </li>
                <li>
                  <t>Peer IP</t>
                </li>
                <li>
                  <t>Local BGP Role (<xref target="RFC9234"/>)</t>
                </li>
                <li>
                  <t>Peer BGP Role (<xref target="RFC9234"/>)</t>
                </li>
                <li>
                  <t>Local insert ASN (optional, as defined above)</t>
                </li>
                <li>
                  <t>Peer insert ASN (optional, as defined above)</t>
                </li>
                <li>
                  <t>Local monitoring session (optional, as defined above)</t>
                </li>
                <li>
                  <t>Peer monitoring session (optional, as defined above)</t>
                </li>
                <li>
                  <t>Peer Type</t>
                </li>
                <li>
                  <t>Session secret (optional, as defined above)</t>
                </li>
                <li>
                  <t>Location</t>
                </li>
                <li>
                  <t>Status</t>
                </li>
              </ul>
            </li>
          </ul>
          <t>The server then responds with the same structure, with the information that it understands (status, etc).</t>
        </section>
        <section anchor="completion">
          <name>COMPLETION</name>
          <t>If both sides report that the session is established, then peering is complete.
If one side does not configure sessions within the server's acceptable configuration window (TimeWindow), then the server is entitled to remove the configured sessions and report "Unestablished" to the client.</t>
        </section>
      </section>
    </section>
    <section anchor="authentication">
      <name>Authentication</name>
      <t>Authentication to this API is performed with Bearer tokens. Two methods are defined below to obtain a bearer token,
the choice of which is supported is up to operator preference however the authors recommend the use of RPKI Attested
OAuth over reliance on an external OIDC provider.</t>
      <section anchor="oauth-with-rpki-attested-oauth">
        <name>OAuth with RPKI Attested OAuth</name>
        <t>It is envisioned the primary authentication mechanism for this API will be with RPKI Attested OAuth as defined
in <xref target="draft-blahaj-grow-rpki-oauth"/>.</t>
        <t>When a client wishes to authenticate to a Peering API server using RPKI Attested OAuth, it first makes a <tt>POST</tt> request
to the server's <tt>/oauth/client_register</tt> endpoint, containing the following JSON body:</t>
        <sourcecode type="json"><![CDATA[
{
  "idp_base": "https://example.com/idp/"
}
]]></sourcecode>
        <t>The <tt>idp_base</tt> URL provided MUST host an OAuth Discovery document as per <xref target="draft-blahaj-grow-rpki-oauth"/>.</t>
        <t>The Peering API server registers with the well-known scope <tt>urn:ietf:params:oauth:scope:peering-api</tt>.</t>
        <t>After successfully registering, the Peering API server stores its OAuth Client ID and Client Secret, along with the
ASNs that this IdP is authoritative for. Future Bearer tokens can be checked against this list for which ASNs they
are allowed to submit requests on behalf of.</t>
        <t>The Peering API server then returns the following JSON body to the client:</t>
        <sourcecode type="json"><![CDATA[
{
  "client_id": "example-id"
}
]]></sourcecode>
        <t>A client may then request that its IdP perform an OAuth Token Exchange <xref target="RFC8693"/> towards this Client ID,
and use the resulting Bearer token to authenticate to the Peering API server.</t>
      </section>
      <section anchor="oauth-with-peering-db">
        <name>OAuth with Peering DB</name>
        <t>As an alternative, this document allows, but does not recommend, the use of PeeringDB OAuth.</t>
        <t>First, the initiating OAuth2 Client is also the Resource Owner (RO) so it can follow the OAuth2 client credentials grant <xref section="4.4" sectionFormat="of" target="RFC6749"/>.
In this example, the client will use PeeringDB OIDC credentials to acquire a JWT access token that is scoped for use with the receiving API.
On successful authentication, PeeringDB provides the Resource Server (RS) with the client's email (for potential manual discussion), along with the client's usage entitlements (known as OAuth2 scopes), to confirm the client is permitted to make API requests on behalf of the initiating AS.</t>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="416" width="584" viewBox="0 0 584 416" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
              <path d="M 56,72 L 56,400" fill="none" stroke="black"/>
              <path d="M 104,32 L 104,64" fill="none" stroke="black"/>
              <path d="M 248,32 L 248,64" fill="none" stroke="black"/>
              <path d="M 280,72 L 280,104" fill="none" stroke="black"/>
              <path d="M 280,120 L 280,152" fill="none" stroke="black"/>
              <path d="M 280,168 L 280,400" fill="none" stroke="black"/>
              <path d="M 312,32 L 312,64" fill="none" stroke="black"/>
              <path d="M 480,32 L 480,64" fill="none" stroke="black"/>
              <path d="M 528,72 L 528,304" fill="none" stroke="black"/>
              <path d="M 576,32 L 576,64" fill="none" stroke="black"/>
              <path d="M 8,32 L 104,32" fill="none" stroke="black"/>
              <path d="M 248,32 L 312,32" fill="none" stroke="black"/>
              <path d="M 480,32 L 576,32" fill="none" stroke="black"/>
              <path d="M 8,64 L 104,64" fill="none" stroke="black"/>
              <path d="M 248,64 L 312,64" fill="none" stroke="black"/>
              <path d="M 480,64 L 576,64" fill="none" stroke="black"/>
              <path d="M 64,112 L 520,112" fill="none" stroke="black"/>
              <path d="M 64,160 L 520,160" fill="none" stroke="black"/>
              <path d="M 64,208 L 272,208" fill="none" stroke="black"/>
              <path d="M 288,256 L 520,256" fill="none" stroke="black"/>
              <path d="M 288,304 L 520,304" fill="none" stroke="black"/>
              <path d="M 64,400 L 272,400" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="528,256 516,250.4 516,261.6" fill="black" transform="rotate(0,520,256)"/>
              <polygon class="arrowhead" points="528,112 516,106.4 516,117.6" fill="black" transform="rotate(0,520,112)"/>
              <polygon class="arrowhead" points="296,304 284,298.4 284,309.6" fill="black" transform="rotate(180,288,304)"/>
              <polygon class="arrowhead" points="280,208 268,202.4 268,213.6" fill="black" transform="rotate(0,272,208)"/>
              <polygon class="arrowhead" points="72,400 60,394.4 60,405.6" fill="black" transform="rotate(180,64,400)"/>
              <polygon class="arrowhead" points="72,160 60,154.4 60,165.6" fill="black" transform="rotate(180,64,160)"/>
              <g class="text">
                <text x="56" y="52">Initiator</text>
                <text x="276" y="52">Peer</text>
                <text x="528" y="52">PeeringDB</text>
                <text x="84" y="100">OIDC</text>
                <text x="164" y="100">Authentication</text>
                <text x="408" y="148">Provide</text>
                <text x="460" y="148">auth</text>
                <text x="500" y="148">code</text>
                <text x="84" y="196">Send</text>
                <text x="124" y="196">auth</text>
                <text x="164" y="196">code</text>
                <text x="196" y="196">to</text>
                <text x="228" y="196">Peer</text>
                <text x="324" y="244">Exchange</text>
                <text x="380" y="244">auth</text>
                <text x="420" y="244">code</text>
                <text x="456" y="244">for</text>
                <text x="496" y="244">token</text>
                <text x="444" y="292">Return</text>
                <text x="496" y="292">token</text>
                <text x="308" y="340">Peer</text>
                <text x="372" y="340">determines</text>
                <text x="336" y="356">permissions</text>
                <text x="408" y="356">based</text>
                <text x="444" y="356">on</text>
                <text x="480" y="356">token</text>
                <text x="84" y="388">Send</text>
                <text x="116" y="388">OK</text>
                <text x="148" y="388">back</text>
                <text x="180" y="388">to</text>
                <text x="232" y="388">Initiator</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+-----------+                 +-------+                    +-----------+
| Initiator |                 | Peer  |                    | PeeringDB |
+-----------+                 +-------+                    +-----------+
      |                           |                              |
      | OIDC Authentication       |                              |
      |--------------------------------------------------------->|
      |                           |                              |
      |                           |            Provide auth code |
      |<---------------------------------------------------------|
      |                           |                              |
      | Send auth code to Peer    |                              |
      |-------------------------->|                              |
      |                           |                              |
      |                           | Exchange auth code for token |
      |                           |----------------------------->|
      |                           |                              |
      |                           |                 Return token |
      |                           |<-----------------------------|
      |                           |
      |                           | Peer determines
      |                           | permissions based on token
      |                           |
      | Send OK back to Initiator |
      |<--------------------------|
]]></artwork>
        </artset>
      </section>
    </section>
    <section anchor="endpoints_and_specs">
      <name>API Endpoints and Specifications</name>
      <t>Each peer needs a public API endpoint that will implement the API protocol.
This API should be publicly listed in peeringDB and also as a potential expansion of <xref target="RFC9092"/> which could provide endpoint integration to WHOIS (<xref target="RFC3912"/>).
Each API endpoint should be fuzz-tested and protected against abuse.  Attackers should not be able to access internal systems using the API.
Every single request should come in with a unique GUID called RequestID that maps to a peering request for later reference.
This GUID format should be standardized across all requests.
This GUID should be provided by the receiver once it receives the request and must be embedded in all communication.
If there is no RequestID present then that should be interpreted as a new request and the process starts again.
An email address is needed for communication if the API fails or is not implemented properly (can be obtained through PeeringDB).</t>
      <t>For a programmatic specification of the API, please see the public Github (<xref target="autopeer"/>).</t>
      <t>This initial draft fully specifies the Public Peering endpoints.
Private Peering and Maintenance are under discussion, and the authors invite collaboration and discussion from interested parties.</t>
      <section anchor="datatypes">
        <name>DATA TYPES</name>
        <t>Please see specification (<xref target="autopeer"/>) for OpenAPI format.</t>
        <t>Peering Location</t>
        <t>Contains string field listing the desired peering location in format <tt>pdb:ix:$IX_ID</tt>, and an enum specifying peering type (public or private).</t>
        <t>Session Status</t>
        <t>Status of BGP Session, both as connection status and approval status (Established, Pending, Approved, Rejected, Down, Unestablished, etc)</t>
        <t>Session Array</t>
        <t>Array of potential BGP sessions, with request UUID.
  Request UUID is optional for client, and required for server.
  Return URL is optional, and indicates the client's Peering API endpoint.
  The client's return URL is used by the server to request additional sessions.
  Client may provide initial UUID for client-side tracking, but the server UUID will be the final definitive ID.
  RequestID will not change across the request.</t>
        <t>BGP Session</t>
        <t>A structure that describes a BGP session and contains the following elements:</t>
        <ul spacing="normal">
          <li>
            <t>local_asn (ASN of requestor)</t>
          </li>
          <li>
            <t>local_ip (IP of requestor, v4 or v6)</t>
          </li>
          <li>
            <t>peer_asn (server ASN)</t>
          </li>
          <li>
            <t>peer_ip (server-side IP)</t>
          </li>
          <li>
            <t>local_bgp_role (BGP role according to <xref target="RFC9234"/>)</t>
          </li>
          <li>
            <t>peer_bgp_role (BGP role according to <xref target="RFC9234"/>)</t>
          </li>
          <li>
            <t>local_insert_asn (optional, to support route servers, defaults to true)</t>
          </li>
          <li>
            <t>peer_insert_asn (optional, to support route servers, defaults to true)</t>
          </li>
          <li>
            <t>local_monitoring_session (optional, to support monitoring systems, defaults to false)</t>
          </li>
          <li>
            <t>peer_monitoring_session (optional, to support monitoring systems, defaults to false)</t>
          </li>
          <li>
            <t>peer_type (public or private)</t>
          </li>
          <li>
            <t>session_secret (optional, as defined above)</t>
          </li>
          <li>
            <t>location (Peering Location, as defined above)</t>
          </li>
          <li>
            <t>status (Session Status, as defined above)</t>
          </li>
          <li>
            <t>session_id (of individual session and generated by the server)</t>
          </li>
        </ul>
        <t>As not all elements are reflected in the <xref target="autopeer"/> OpenAPI definition to date, we define the missing fields here to be reflected in <xref target="autopeer"/> in the future.</t>
        <ul spacing="normal">
          <li>
            <t>local_bgp_role and peer_bgp_role: these field describe the BGP roles of the local and peer side of the session according to <xref target="RFC9234"/> represented by an integer. The roles for both sides MUST be set in a way that does not violate role correctness as defined in Section 4.2 of <xref target="RFC9234"/>.</t>
          </li>
          <li>
            <t>local_insert_asn and peer_insert_asn: these fields define whether the local or peer side will insert their ASN into the AS path attribute of forwarded BGP routes. They are mostly relevant to route servers. The fields are boolean and optional. If not provided, they default to true.</t>
          </li>
          <li>
            <t>local_monitoring_session and peer_monitoring_session: these fields define whether the local or peer side of the session will forward routes to other ASes or not. As the role of monitoring systems is not defined in <xref target="RFC9234"/>, we add this role via a boolean, optional flag. If not provided, they default to false. local_monitoring_session and peer_monitoring_sessions MUST NOT be true at the same time for the same session to avoid a role mismatch.</t>
          </li>
        </ul>
        <t>Error</t>
        <t>API Errors, for field validation errors in requests, and request-level errors.</t>
        <t>The above is sourced largely from the linked OpenAPI specification.</t>
      </section>
      <section anchor="discovery">
        <name>Discovery</name>
        <t>This document does not specify how to discover an ASN's Peering API endpoint.
Some possible options are:</t>
        <ul spacing="normal">
          <li>
            <t>Via the RPKI using <xref target="rpki-discovery"/></t>
          </li>
          <li>
            <t>Publication in WHOIS/RDAP</t>
          </li>
          <li>
            <t>Manual configuration</t>
          </li>
        </ul>
        <t>The preferred method is via the RPKI.</t>
      </section>
      <section anchor="endpoints">
        <name>Endpoints</name>
        <t>(As defined in <xref target="autopeer"/>).
On each call, there should be rate limits, allowed senders, and other optional restrictions.</t>
        <section anchor="public_peering_ix">
          <name>Public Peering over an Internet Exchange (IX)</name>
          <ul spacing="normal">
            <li>
              <t><tt>/sessions</tt>: ADD/RETRIEVE sessions visible to the calling PEER
              </t>
              <ul spacing="normal">
                <li>
                  <t>Batch create new session resources
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>Establish new BGP sessions between peers, at the desired exchange.</t>
                    </li>
                    <li>
                      <t>Below is based on OpenAPI specification: <xref target="autopeer"/>.</t>
                    </li>
                    <li>
                      <t><tt>POST /sessions</tt>
                      </t>
                      <ul spacing="normal">
                        <li>
                          <t>Request body: Session Array</t>
                        </li>
                        <li>
                          <t>Responses:
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>200 OK:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Contents: Session Array (all sessions in request accepted for configuration). Should not all the sessions be accepted, the response also contains a list of sessions and the respective errors.</t>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>400:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Error</t>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>403:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Unauthorized to perform the operation</t>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>422:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Please contact us, human intervention required</t>
                                </li>
                              </ul>
                            </li>
                          </ul>
                        </li>
                      </ul>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>List all session resources. The response is paginated.
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>Given a request ID, query for the status of that request.</t>
                    </li>
                    <li>
                      <t>Given an ASN without request ID, query for status of all connections between client and server.</t>
                    </li>
                    <li>
                      <t>Below is based on OpenAPI specification: <xref target="autopeer"/>.</t>
                    </li>
                    <li>
                      <t><tt>GET /sessions</tt>
                      </t>
                      <ul spacing="normal">
                        <li>
                          <t>Request parameters:
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>asn (requesting client's asn)</t>
                            </li>
                            <li>
                              <t>request_id (optional, UUID of request)</t>
                            </li>
                            <li>
                              <t>max_results (integer to indicate an upper bound for a given response page)</t>
                            </li>
                            <li>
                              <t>next_token (opaque and optional string received on a previous response page and which allows the server to produce the next page of results. Its absence indicates to the server that the first page is expected)</t>
                            </li>
                          </ul>
                        </li>
                        <li>
                          <t>Response:
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>200: OK
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Contents: Session Array of sessions in request_id, if provided. Else, all existing and in-progress sessions between client ASN and server.
                                  </t>
                                  <ul spacing="normal">
                                    <li>
                                      <t>next_token (opaque and optional string the server expects to be passed back on the request for the next page. Its absence indicates to the client that no more pages are available)</t>
                                    </li>
                                  </ul>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>400:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Error (example: request_id is invalid)</t>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>403:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Unauthorized to perform the operation</t>
                                </li>
                              </ul>
                            </li>
                          </ul>
                        </li>
                      </ul>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
            <li>
              <t><tt>/sessions/{session_id}</tt>: Operate on individual sessions
              </t>
              <ul spacing="normal">
                <li>
                  <t>Retrieve an existing session resource
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>Below is based on OpenAPI specification: <xref target="autopeer"/>.</t>
                    </li>
                    <li>
                      <t><tt>GET /sessions/{session_id}</tt>
                      </t>
                      <ul spacing="normal">
                        <li>
                          <t>Request parameters:
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>session_id returned by the server on creation or through the session list operation.</t>
                            </li>
                          </ul>
                        </li>
                        <li>
                          <t>Responses:
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>200 OK:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Contents: Session structure with current attributes</t>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>400:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Error (example: session_id is invalid)</t>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>403:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Unauthorized to perform the operation</t>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>404:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>The session referred by the specified session_id does not exist or is not visible to the caller</t>
                                </li>
                              </ul>
                            </li>
                          </ul>
                        </li>
                      </ul>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>Delete a session.
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>Given a session ID, delete it which effectively triggers an depeering from the initiator.</t>
                    </li>
                    <li>
                      <t>Below is based on OpenAPI specification: <xref target="autopeer"/>.</t>
                    </li>
                    <li>
                      <t><tt>DELETE /sessions/{session_id}</tt>
                      </t>
                      <ul spacing="normal">
                        <li>
                          <t>Request parameters:
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>session_id returned by the server on creation or through the session list operation.</t>
                            </li>
                          </ul>
                        </li>
                        <li>
                          <t>Response:
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>204: OK
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Contents: empty response as the session is processed and hard deleted</t>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>400:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Error (example: session_id is invalid)</t>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>403:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Unauthorized to perform the operation</t>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>404:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>The session referred by the specified session_id does not exist or is not visible to the caller</t>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>422:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Please contact us, human intervention required</t>
                                </li>
                              </ul>
                            </li>
                          </ul>
                        </li>
                      </ul>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="utility_api">
          <name>UTILITY API CALLS</name>
          <t>Endpoints which provide useful information for potential interconnections.</t>
          <ul spacing="normal">
            <li>
              <t><tt>/locations</tt>: LIST POTENTIAL PEERING LOCATIONS
              </t>
              <ul spacing="normal">
                <li>
                  <t>List potential peering locations, both public and private. The response is paginated.
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>Below is based on OpenAPI specification: <xref target="autopeer"/>.</t>
                    </li>
                    <li>
                      <t><tt>GET /locations</tt>
                      </t>
                      <ul spacing="normal">
                        <li>
                          <t>Request parameters:
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>asn (Server ASN, with which to list potential connections)</t>
                            </li>
                            <li>
                              <t>location_type (Optional: Peering Location)</t>
                            </li>
                            <li>
                              <t>max_results (integer to indicate an upper bound for a given response page)</t>
                            </li>
                            <li>
                              <t>next_token (opaque and optional string received on a previous response page and which allows the server to produce the next page of results. Its absence indicates to the server that the first page is expected)</t>
                            </li>
                          </ul>
                        </li>
                        <li>
                          <t>Response:
                          </t>
                          <ul spacing="normal">
                            <li>
                              <t>200: OK
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Contents: List of Peering Locations.
                                  </t>
                                  <ul spacing="normal">
                                    <li>
                                      <t>next_token (opaque and optional string the server expects to be passed back on the request for the next page. Its absence indicates to the client that no more pages are available)</t>
                                    </li>
                                  </ul>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>400:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Error</t>
                                </li>
                              </ul>
                            </li>
                            <li>
                              <t>403:
                              </t>
                              <ul spacing="normal">
                                <li>
                                  <t>Unauthorized to perform the operation</t>
                                </li>
                              </ul>
                            </li>
                          </ul>
                        </li>
                      </ul>
                    </li>
                  </ul>
                </li>
              </ul>
            </li>
          </ul>
        </section>
        <section anchor="private-peering-draft">
          <name>Private Peering (DRAFT)</name>
          <ul spacing="normal">
            <li>
              <t>ADD/AUGMENT PNI</t>
            </li>
            <li>
              <t>Parameters:
              </t>
              <ul spacing="normal">
                <li>
                  <t>Peer ASN</t>
                </li>
                <li>
                  <t>Facility</t>
                </li>
                <li>
                  <t>email address (contact)</t>
                </li>
                <li>
                  <t>Action type: add/augment</t>
                </li>
                <li>
                  <t>LAG struct:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>IPv4</t>
                    </li>
                    <li>
                      <t>IPv6</t>
                    </li>
                    <li>
                      <t>Circuit ID</t>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>Who provides LOA? (and where to provide it).</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Response:
              </t>
              <ul spacing="normal">
                <li>
                  <t>200:
                  </t>
                  <ul spacing="normal">
                    <li>
                      <t>LAG struct, with server data populated</t>
                    </li>
                    <li>
                      <t>LOA or way to receive it</t>
                    </li>
                    <li>
                      <t>Request ID</t>
                    </li>
                  </ul>
                </li>
                <li>
                  <t>40x: rejections</t>
                </li>
              </ul>
            </li>
            <li>
              <t>REMOVE PNI
              </t>
              <ul spacing="normal">
                <li>
                  <t>As ADD/AUGMENT in parameters. Responses will include a requestID and status.</t>
                </li>
              </ul>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="session_negotiation">
      <name>Public Peering Session Negotiation</name>
      <t>As part of public peering configuration, this draft must consider how the client and server should handshake at which sessions to configure peering.
At first, a client will request sessions A, B, and C.
The server may choose to accept all sessions A, B, and C.
At this point, configuration proceeds as normal.
However, the server may choose to reject session B.
At that point, the server will reply back with A and C marked as "Accepted," and B as "Rejected."
The server will then configure A and C, and wait for the client to configure A and C.
If the client configured B as well, it will not come up.</t>
      <t>This draft encourages peers to set up garbage collection for unconfigured or down peering sessions, to remove stale configuration and maintain good router hygiene.</t>
      <t>Related to rejection, if the server would like to configure additional sessions with the client, the server may either reject all the session that do not meet the criteria caused by such absence in the client's request or approve the client's request and issue a separate request to the client's server requesting those additional peering sessions D and E.
The server will configure D and E on their side, and D and E will become part of the sessions requested in the UUID.
The client may choose whether or not to accept those additional sessions.
If they do, the client should configure D and E as well.
If they do not, the client will not configure D and E, and the server should garbage-collect those pending sessions.</t>
      <t>As part of the IETF discussion, the authors would like to discuss how to coordinate which side unfilters first.
Perhaps this information could be conveyed over a preferences vector.</t>
    </section>
    <section anchor="private_peering">
      <name>Private Peering</name>
      <t>Through future discussion with the IETF, the specification for private peering will be solidified.
Of interest for discussion includes Letter of Authorization (LOA) negotiation, and how to coordinate unfiltering and configuration checks.</t>
    </section>
    <section anchor="maintenance">
      <name>Maintenance</name>
      <t>This draft does not want to invent a new ticketing system.
However, there is an opportunity in this API to provide maintenance notifications to peering partners.
If there is interest, this draft would extend to propose a maintenance endpoint, where the server could broadcast upcoming and current maintenance windows.</t>
      <t>A maintenance message would follow a format like:</t>
      <ul spacing="normal">
        <li>
          <t>Title: string</t>
        </li>
        <li>
          <t>Start Date: date maintenance start(s/ed): UTC</t>
        </li>
        <li>
          <t>End Date: date maintenance ends: UTC</t>
        </li>
        <li>
          <t>Area: string or enum</t>
        </li>
        <li>
          <t>Details: freeform string</t>
        </li>
      </ul>
      <t>The "Area" field could be a freeform string, or could be a parseable ENUM, like (BGP, PublicPeering, PrivatePeering, Configuration, Caching, DNS, etc).</t>
      <t>Past maintenances will not be advertised.</t>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>This document describes a mechanism to standardize the discovery, creation and maintenance of peering relationships across autonomous systems (AS) using an out-of-band application programming interface (API). With it, AS operators take a step to operationalize their peering policy with new and existing peers in ways that improve or completely replace manual business validations, ultimately leading to the automation of the interconnection. However, this improvement can only be fully materialized when operators are certain that such API follows the operational trust and threat models they are comfortable with, some of which are documented in BGP operations and security best practices (<xref target="RFC7454"/>). To that extent, this document assumes the peering API will be deployed following a strategy of defense in-depth and proposes the following common baseline threat model below.</t>
      <section anchor="threats">
        <name>Threats</name>
        <t>Each of the following threats assume a scenario where an arbitrary actor is capable of reaching the peering API instance of a given operator, the client and the operator follow their own endpoint security and maintenance practices, and the trust anchors in use are already established following guidelines outside of the scope of this document.</t>
        <ul spacing="normal">
          <li>
            <t>T1: A malicious actor with physical access to the IX fabric and peering API of the receiver can use ASN or IP address information to impersonate a different IX member to discover, create, update or delete peering information which leads to loss of authenticity, confidentiality, and authorization of the spoofed IX member.</t>
          </li>
          <li>
            <t>T2: A malicious actor with physical access to the IX fabric can expose a peering API for an IX member different of its own to accept requests on behalf of such third party and supplant it, leading to a loss of authenticity, integrity, non-repudiability, and confidentiality between IX members.</t>
          </li>
          <li>
            <t>T3: A malicious actor without physical access to the IX fabric but with access the the peering API can use any ASN to impersonate any autonomous system and overload the receiver's peering API internal validations leading to a denial of service.</t>
          </li>
        </ul>
      </section>
      <section anchor="mitigations">
        <name>Mitigations</name>
        <t>The following list of mitigations address different parts of the threats identified above:</t>
        <ul spacing="normal">
          <li>
            <t>M1: Authorization controls - A initiator using a client application is authorized using the claims presented in the request prior to any interaction with the peering API (addresses T1, T2).</t>
          </li>
          <li>
            <t>M2: Proof of holdership - The initiator of a request through a client can prove their holdership of an Internet Number Resource (addresses T1, T3).</t>
          </li>
          <li>
            <t>M3: Request integrity and proof of possession - The peering API can verify HTTP requests signed with a key that is cryptographically bound to the authorized initiator (addresses T1, T2).</t>
          </li>
        </ul>
        <t>The Peering API does not enforce any kind of peering policy on the incoming requests. It is left to the peering API instance implementation to enforce the AS-specific peering policy. This document encourages each peer to consider the needs of their peering policy and implement request validation as desired.</t>
      </section>
      <section anchor="authorization">
        <name>Authorization controls</name>
        <t>The peering API instance receives HTTP requests from a client application from a peering initiator. Those requests can be authorized using the authorization model based on OAuth 2.0 (<xref target="RFC6749"/>) with the OpenID Connect <xref target="oidc"/> core attribute set. The choice of OpenID Connect is to use a standardized and widely adopted authorization exchange format based on JSON Web Tokens (<xref target="RFC7519"/>) which allows interoperation with existing web-based application flows. JWT tokens also supply sufficient claims to implement receiver-side authorization decisions by third parties when used as bearer access tokens (<xref target="RFC9068"/>). The peering API instance (a resource server in OAuth2 terms) should follow the bearer token usage (<xref target="RFC6750"/>) which describes the format and validation of an access token obtained from the Oauth 2.0 Authorization Server. The resource server should follow the best practices for JWT access validation (<xref target="RFC8725"/>) and in particular verify that the access token is constrained to the resource server via the audience claim. Upon successful access token validation, the resource server should decide whether to proceed with the request based on the presence of expected and matching claims in the access token or reject it altogether. The core identity and authorization claims present in the access token may be augmented with specific claims vended by the Authorization Service. This document proposes to use PeeringDB's access token claims as a baseline to use for authorization, however the specific matching of those claims to an authorization business decision is specific to each operator and outside of this specification. Resource servers may also use the claims in the access token to present the callers' identity to the application and for auditing purposes.</t>
      </section>
      <section anchor="resource-holdership">
        <name>Proof of holdership</name>
        <t>The peering API defined in this document uses ASNs as primary identifiers to identify each party on a peering session
besides other resources such as IP addresses. ASNs are explicitly expected in some API payloads but are also implicitly
expected when making authorization business decisions such as listing resources that belong to an operator. Given that
ASNs are Internet Number Resources assigned by RIRs and that the OAuth2 Authorization Server in use may not be operated
by any of those RIRs, as it is the case of PeeringDB or any other commercial OAuth2 service, JWT claims that contain an
ASN need be proved to be legitimately used by the initiator. This document proposes to attest ASN resource holdership
using a mechanism based on RPKI (<xref target="RFC6480"/>) and in particular with the use of RPKI Attested OAuth
(<xref target="draft-blahaj-grow-rpki-oauth"/>).</t>
      </section>
      <section anchor="integrity-and-possession">
        <name>Request integrity and proof of possession</name>
        <t>The API described in this document follows REST (<xref target="rest"/>) principles over an HTTP channel to model the transfer of requests and responses between peers. Implementations of this API should use the best common practices for the API transport (<xref target="RFC9325"/>) such as TLS. However, even in the presence of a TLS channel with OAuth2 bearer tokens alone, neither the client application nor the API can guarantee the end-to-end integrity of the message request or the authenticity of its content. One mechanism to add cryptographic integrity and authenticity validation can be the use a mutual authentication scheme to negotiate the parameters of the TLS channel. This requires the use of a web PKI (<xref target="RFC5280"/>) to carry claims for use in authorization controls, to bind such PKI to ASNs for proof of holdership, and the use of client certificates on the application.</t>
        <t>Instead, this document proposes to address the message integrity property by cryptographically signing the parameters of the request with a key pair that creates a HTTP message signature to be included in the request (<xref target="RFC9421"/>). The client application controls the lifecycle of this key pair. The authenticity property of the messages signed with such key pair is addressed by binding the public key of the pair to the JWT access token in one of its claims of the access token using a mechanism that demonstrates proof of possession of the private key <xref target="RFC9449"/>. With these two mechanisms, the resource server should authenticate, authorize, and validate the integrity of the request using a JWT access token that can rightfully claim to represent a given ASN.</t>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <section anchor="oauth-uri">
        <name>OAuth URI</name>
        <t>This document adds one new entry to the "OAuth URI" registry:</t>
        <table>
          <thead>
            <tr>
              <th align="left">URN</th>
              <th align="left">Common Name</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>urn:ietf:params:oauth:scope:peering-api</tt></td>
              <td align="left">Well-known scope for the BGP Peering API</td>
              <td align="left">This document</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="autopeer" target="https://github.com/bgp/autopeer/">
          <front>
            <title>Github repository with the API specification and diagrams</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="oidc" target="https://openid.net/specs/openid-connect-core-1_0.html">
          <front>
            <title>OpenID.Core</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="rest" target="http://roy.gbiv.com/pubs/dissertation/top.htm">
          <front>
            <title>Architectural Styles and the Design of Network-based Software Architectures</title>
            <author initials="R. T." surname="Fielding" fullname="Roy Thomas Fielding">
              <organization/>
            </author>
            <date year="2000"/>
          </front>
        </reference>
        <reference anchor="openapi" target="https://spec.openapis.org/oas/v3.1.0">
          <front>
            <title>OpenAPI-v3.1.0</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="draft-blahaj-grow-rpki-oauth" target="https://datatracker.ietf.org/doc/draft-blahaj-grow-rpki-oauth/">
          <front>
            <title>Attesting the Identities of Parties in OpenID Connect (OIDC) using the Resource Public Key Infrastructure (RPKI)</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RFC2119" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
          <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" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
          <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="RFC6750">
          <front>
            <title>The OAuth 2.0 Authorization Framework: Bearer Token Usage</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="D. Hardt" initials="D." surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>This specification describes how to use bearer tokens in HTTP requests to access OAuth 2.0 protected resources. Any party in possession of a bearer token (a "bearer") can use it to get access to the associated resources (without demonstrating possession of a cryptographic key). To prevent misuse, bearer tokens need to be protected from disclosure in storage and in transport. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6750"/>
          <seriesInfo name="DOI" value="10.17487/RFC6750"/>
        </reference>
        <reference anchor="RFC8693">
          <front>
            <title>OAuth 2.0 Token Exchange</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="A. Nadalin" initials="A." surname="Nadalin"/>
            <author fullname="B. Campbell" initials="B." role="editor" surname="Campbell"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
            <date month="January" year="2020"/>
            <abstract>
              <t>This specification defines a protocol for an HTTP- and JSON-based Security Token Service (STS) by defining how to request and obtain security tokens from OAuth 2.0 authorization servers, including security tokens employing impersonation and delegation.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8693"/>
          <seriesInfo name="DOI" value="10.17487/RFC8693"/>
        </reference>
        <reference anchor="RFC6749">
          <front>
            <title>The OAuth 2.0 Authorization Framework</title>
            <author fullname="D. Hardt" initials="D." role="editor" surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6749"/>
          <seriesInfo name="DOI" value="10.17487/RFC6749"/>
        </reference>
        <reference anchor="RFC7519">
          <front>
            <title>JSON Web Token (JWT)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7519"/>
          <seriesInfo name="DOI" value="10.17487/RFC7519"/>
        </reference>
        <reference anchor="RFC9068">
          <front>
            <title>JSON Web Token (JWT) Profile for OAuth 2.0 Access Tokens</title>
            <author fullname="V. Bertocci" initials="V." surname="Bertocci"/>
            <date month="October" year="2021"/>
            <abstract>
              <t>This specification defines a profile for issuing OAuth 2.0 access tokens in JSON Web Token (JWT) format. Authorization servers and resource servers from different vendors can leverage this profile to issue and consume access tokens in an interoperable manner.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9068"/>
          <seriesInfo name="DOI" value="10.17487/RFC9068"/>
        </reference>
        <reference anchor="RFC8725">
          <front>
            <title>JSON Web Token Best Current Practices</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="D. Hardt" initials="D." surname="Hardt"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>JSON Web Tokens, also known as JWTs, are URL-safe JSON-based security tokens that contain a set of claims that can be signed and/or encrypted. JWTs are being widely used and deployed as a simple security token format in numerous protocols and applications, both in the area of digital identity and in other application areas. This Best Current Practices document updates RFC 7519 to provide actionable guidance leading to secure implementation and deployment of JWTs.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="225"/>
          <seriesInfo name="RFC" value="8725"/>
          <seriesInfo name="DOI" value="10.17487/RFC8725"/>
        </reference>
        <reference anchor="RFC9421" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9421.xml">
          <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>
        <reference anchor="RFC9449">
          <front>
            <title>OAuth 2.0 Demonstrating Proof of Possession (DPoP)</title>
            <author fullname="D. Fett" initials="D." surname="Fett"/>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="T. Lodderstedt" initials="T." surname="Lodderstedt"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="D. Waite" initials="D." surname="Waite"/>
            <date month="September" year="2023"/>
            <abstract>
              <t>This document describes a mechanism for sender-constraining OAuth 2.0 tokens via a proof-of-possession mechanism on the application level. This mechanism allows for the detection of replay attacks with access and refresh tokens.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9449"/>
          <seriesInfo name="DOI" value="10.17487/RFC9449"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="rpki-discovery" target="https://datatracker.ietf.org/doc/draft-misell-grow-rpki-peering-api-discovery/">
          <front>
            <title>A Profile for Peering API Discovery via the RPKI</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RFC4271">
          <front>
            <title>A Border Gateway Protocol 4 (BGP-4)</title>
            <author fullname="Y. Rekhter" initials="Y." role="editor" surname="Rekhter"/>
            <author fullname="T. Li" initials="T." role="editor" surname="Li"/>
            <author fullname="S. Hares" initials="S." role="editor" surname="Hares"/>
            <date month="January" year="2006"/>
            <abstract>
              <t>This document discusses the Border Gateway Protocol (BGP), which is an inter-Autonomous System routing protocol.</t>
              <t>The primary function of a BGP speaking system is to exchange network reachability information with other BGP systems. This network reachability information includes information on the list of Autonomous Systems (ASes) that reachability information traverses. This information is sufficient for constructing a graph of AS connectivity for this reachability from which routing loops may be pruned, and, at the AS level, some policy decisions may be enforced.</t>
              <t>BGP-4 provides a set of mechanisms for supporting Classless Inter-Domain Routing (CIDR). These mechanisms include support for advertising a set of destinations as an IP prefix, and eliminating the concept of network "class" within BGP. BGP-4 also introduces mechanisms that allow aggregation of routes, including aggregation of AS paths.</t>
              <t>This document obsoletes RFC 1771. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4271"/>
          <seriesInfo name="DOI" value="10.17487/RFC4271"/>
        </reference>
        <referencegroup anchor="BCP56" target="https://www.rfc-editor.org/info/bcp56">
          <reference anchor="RFC9205" target="https://www.rfc-editor.org/info/rfc9205">
            <front>
              <title>Building Protocols with HTTP</title>
              <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
              <date month="June" year="2022"/>
              <abstract>
                <t>Applications often use HTTP as a substrate to create HTTP-based APIs. This document specifies best practices for writing specifications that use HTTP to define new application protocols. It is written primarily to guide IETF efforts to define application protocols using HTTP for deployment on the Internet but might be applicable in other situations.</t>
                <t>This document obsoletes RFC 3205.</t>
              </abstract>
            </front>
            <seriesInfo name="BCP" value="56"/>
            <seriesInfo name="RFC" value="9205"/>
            <seriesInfo name="DOI" value="10.17487/RFC9205"/>
          </reference>
        </referencegroup>
        <reference anchor="RFC9234">
          <front>
            <title>Route Leak Prevention and Detection Using Roles in UPDATE and OPEN Messages</title>
            <author fullname="A. Azimov" initials="A." surname="Azimov"/>
            <author fullname="E. Bogomazov" initials="E." surname="Bogomazov"/>
            <author fullname="R. Bush" initials="R." surname="Bush"/>
            <author fullname="K. Patel" initials="K." surname="Patel"/>
            <author fullname="K. Sriram" initials="K." surname="Sriram"/>
            <date month="May" year="2022"/>
            <abstract>
              <t>Route leaks are the propagation of BGP prefixes that violate assumptions of BGP topology relationships, e.g., announcing a route learned from one transit provider to another transit provider or a lateral (i.e., non-transit) peer or announcing a route learned from one lateral peer to another lateral peer or a transit provider. These are usually the result of misconfigured or absent BGP route filtering or lack of coordination between autonomous systems (ASes). Existing approaches to leak prevention rely on marking routes by operator configuration, with no check that the configuration corresponds to that of the External BGP (eBGP) neighbor, or enforcement of the two eBGP speakers agreeing on the peering relationship. This document enhances the BGP OPEN message to establish an agreement of the peering relationship on each eBGP session between autonomous systems in order to enforce appropriate configuration on both sides. Propagated routes are then marked according to the agreed relationship, allowing both prevention and detection of route leaks.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9234"/>
          <seriesInfo name="DOI" value="10.17487/RFC9234"/>
        </reference>
        <reference anchor="RFC9092">
          <front>
            <title>Finding and Using Geofeed Data</title>
            <author fullname="R. Bush" initials="R." surname="Bush"/>
            <author fullname="M. Candela" initials="M." surname="Candela"/>
            <author fullname="W. Kumari" initials="W." surname="Kumari"/>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <date month="July" year="2021"/>
            <abstract>
              <t>This document specifies how to augment the Routing Policy Specification Language inetnum: class to refer specifically to geofeed data comma-separated values (CSV) files and describes an optional scheme that uses the Routing Public Key Infrastructure to authenticate the geofeed data CSV files.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9092"/>
          <seriesInfo name="DOI" value="10.17487/RFC9092"/>
        </reference>
        <reference anchor="RFC3912">
          <front>
            <title>WHOIS Protocol Specification</title>
            <author fullname="L. Daigle" initials="L." surname="Daigle"/>
            <date month="September" year="2004"/>
            <abstract>
              <t>This document updates the specification of the WHOIS protocol, thereby obsoleting RFC 954. The update is intended to remove the material from RFC 954 that does not have to do with the on-the-wire protocol, and is no longer applicable in today's Internet. This document does not attempt to change or update the protocol per se, or document other uses of the protocol that have come into existence since the publication of RFC 954. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3912"/>
          <seriesInfo name="DOI" value="10.17487/RFC3912"/>
        </reference>
        <reference anchor="RFC7454">
          <front>
            <title>BGP Operations and Security</title>
            <author fullname="J. Durand" initials="J." surname="Durand"/>
            <author fullname="I. Pepelnjak" initials="I." surname="Pepelnjak"/>
            <author fullname="G. Doering" initials="G." surname="Doering"/>
            <date month="February" year="2015"/>
            <abstract>
              <t>The Border Gateway Protocol (BGP) is the protocol almost exclusively used in the Internet to exchange routing information between network domains. Due to this central nature, it is important to understand the security measures that can and should be deployed to prevent accidental or intentional routing disturbances.</t>
              <t>This document describes measures to protect the BGP sessions itself such as Time to Live (TTL), the TCP Authentication Option (TCP-AO), and control-plane filtering. It also describes measures to better control the flow of routing information, using prefix filtering and automation of prefix filters, max-prefix filtering, Autonomous System (AS) path filtering, route flap dampening, and BGP community scrubbing.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="194"/>
          <seriesInfo name="RFC" value="7454"/>
          <seriesInfo name="DOI" value="10.17487/RFC7454"/>
        </reference>
        <reference anchor="RFC6480" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6480.xml">
          <front>
            <title>An Infrastructure to Support Secure Internet Routing</title>
            <author fullname="M. Lepinski" initials="M." surname="Lepinski"/>
            <author fullname="S. Kent" initials="S." surname="Kent"/>
            <date month="February" year="2012"/>
            <abstract>
              <t>This document describes an architecture for an infrastructure to support improved security of Internet routing. The foundation of this architecture is a Resource Public Key Infrastructure (RPKI) that represents the allocation hierarchy of IP address space and Autonomous System (AS) numbers; and a distributed repository system for storing and disseminating the data objects that comprise the RPKI, as well as other signed objects necessary for improved routing security. As an initial application of this architecture, the document describes how a legitimate holder of IP address space can explicitly and verifiably authorize one or more ASes to originate routes to that address space. Such verifiable authorizations could be used, for example, to more securely construct BGP route filters. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6480"/>
          <seriesInfo name="DOI" value="10.17487/RFC6480"/>
        </reference>
        <reference anchor="RFC9325">
          <front>
            <title>Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="P. Saint-Andre" initials="P." surname="Saint-Andre"/>
            <author fullname="T. Fossati" initials="T." surname="Fossati"/>
            <date month="November" year="2022"/>
            <abstract>
              <t>Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS) are used to protect data exchanged over a wide range of application protocols and can also form the basis for secure transport protocols. Over the years, the industry has witnessed several serious attacks on TLS and DTLS, including attacks on the most commonly used cipher suites and their modes of operation. This document provides the latest recommendations for ensuring the security of deployed services that use TLS and DTLS. These recommendations are applicable to the majority of use cases.</t>
              <t>RFC 7525, an earlier version of the TLS recommendations, was published when the industry was transitioning to TLS 1.2. Years later, this transition is largely complete, and TLS 1.3 is widely available. This document updates the guidance given the new environment and obsoletes RFC 7525. In addition, this document updates RFCs 5288 and 6066 in view of recent attacks.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="195"/>
          <seriesInfo name="RFC" value="9325"/>
          <seriesInfo name="DOI" value="10.17487/RFC9325"/>
        </reference>
        <reference anchor="RFC5280">
          <front>
            <title>Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile</title>
            <author fullname="D. Cooper" initials="D." surname="Cooper"/>
            <author fullname="S. Santesson" initials="S." surname="Santesson"/>
            <author fullname="S. Farrell" initials="S." surname="Farrell"/>
            <author fullname="S. Boeyen" initials="S." surname="Boeyen"/>
            <author fullname="R. Housley" initials="R." surname="Housley"/>
            <author fullname="W. Polk" initials="W." surname="Polk"/>
            <date month="May" year="2008"/>
            <abstract>
              <t>This memo profiles the X.509 v3 certificate and X.509 v2 certificate revocation list (CRL) for use in the Internet. An overview of this approach and model is provided as an introduction. The X.509 v3 certificate format is described in detail, with additional information regarding the format and semantics of Internet name forms. Standard certificate extensions are described and two Internet-specific extensions are defined. A set of required certificate extensions is specified. The X.509 v2 CRL format is described in detail along with standard and Internet-specific extensions. An algorithm for X.509 certification path validation is described. An ASN.1 module and examples are provided in the appendices. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5280"/>
          <seriesInfo name="DOI" value="10.17487/RFC5280"/>
        </reference>
      </references>
    </references>
    <?line 710?>

<section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The authors would like to thank their collaborators, who implemented API versions and provided valuable feedback on the design.</t>
      <ul spacing="normal">
        <li>
          <t>Ben Blaustein</t>
        </li>
        <li>
          <t>Jakub Heichman (Meta)</t>
        </li>
        <li>
          <t>Prithvi Nath Manikonda (Amazon)</t>
        </li>
        <li>
          <t>Q Misell (Glauca Digital)</t>
        </li>
        <li>
          <t>Stefan Pratter (20C)</t>
        </li>
        <li>
          <t>Aaron Rose (Amazon)</t>
        </li>
        <li>
          <t>Ben Ryall (Meta)</t>
        </li>
        <li>
          <t>Erica Salvaneschi (Cloudflare)</t>
        </li>
        <li>
          <t>Job Snijders</t>
        </li>
        <li>
          <t>David Tuber (Cloudflare)</t>
        </li>
        <li>
          <t>Matthias Wichtlhuber (DE-CIX)</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
ROcjyx6sTDwIIrTH4xr9N6gaUn2S0rRGec+vo8CyjjXxi9vUy3cnsabPRnP4
LbX2SNPjBFMhk4zljVjVWQKP1fNXoLFIYqgEysAPtD3LeMVSVzOTkBgMZpKL
mRKtDLJZ1B0brTw4mKwz8k/GkyIv2WhuhBG/sbfVRrMcr8OYgRxNEaS90A+l
b33l9Lm6JOjp5VhPp4wllCDsJ3yT8aoig2yC8rW3fMmnMzanYC1hKrNkhvqD
+3UCYOEFkhjudjfqZSIbxtNpQdvJeVQirwazw3hYQxAzipzNC55n5UhGE0oB
awF6aIlayCYkspxwuqiVm9BCiJ6VGBthlCAV5mgknud22LaCUTCrtNRS/IDp
WCpQAR2YIlVEB7yFLESmXJFIsTotA8g+SYiuUZEsl+lGzbwiBOZLL8+PIibR
+ulJ0W0LcmPZSrLrpEIjYJrG47zwC2GZRuJxwY1k2lxxqSJYxFlv1FOjv1/2
h8xNP3xFxYPWIGv7dSeiSweaEH4hWGhfTe4lkwUMYhZozcXAuk/ZcENea/LW
YEkpYnKGwI03vhl1h8gtFPd2NR2fJO9P/vvgb28GZ2+leA1gXVYvZZ5rPzO3
2hFjAXO0oRVixVbyFyIIugWGpqoPZwuXfikf8a/Q4MZPLb+1+r5d+RJ2n4ws
PXGOtSU3Bf86A4WnrQJjLRu63eR6RRGvcW70R5hy7aeDi0ndUOmrV+zEv/K+
I23Z8BGiRlKk2mI5Ficn+6lY4bcSClrBvNbcxHcxe6qdbzkwqI9djfyXiqBf
qo8hLNDYYZw/y/P/+R7yU2dFMceaIc1XwqLDZH0sj0VbgRYHbyh625hUyeSD
Hno2oCZkqApgaV4mN4DIpczvPR4N6OWhEO2f5yQjfmsqRCCD9XbSlBNgUgkt
UFp05ROOtSEn25u4zLDM0TnihoyeF/veC8lKtQaXweO2uj5Garh+zC8itXBH
AhPoz3uCPfADBuXg0u9/PF+9KciFhsso7owN8zr9/GayHHKv8WwdQu4KB2vj
PsZ1ypVTsD6ov64v0hVPy7ni3mxxxd0ZGRZ2PAPxzp/kf1jHu1gjvSFDvbmv
X9Cy6laT9e9qYdhlyIZ3vi3zSaYwlxnxHiD52vEEohsXyxRwE+CnPZYrUEQy
VESnLUh3qQTzsO/NP9zsuWZ4AUvJGEME/NY4t6gZaT7mUCupKItEYgQjBL3L
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

-->

</rfc>
