<?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.7 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ramseyer-grow-peering-api-04" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.20.0 -->
  <front>
    <title>Peering API</title>
    <seriesInfo name="Internet-Draft" value="draft-ramseyer-grow-peering-api-04"/>
    <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>
    <date year="2024" month="March" day="17"/>
    <keyword>BGP</keyword>
    <keyword>peering</keyword>
    <keyword>configuration</keyword>
    <abstract>
      <?line 67?>

<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-ramseyer-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 74?>

<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 Definitions</name>
      <t>All terms used in this document will be defined here:</t>
      <ul spacing="normal">
        <li>
          <t>Initiator: Network that wants to peer</t>
        </li>
        <li>
          <t>Receiver: Network that is receiving communications about peering</t>
        </li>
        <li>
          <t>Configured: peering session that is set up on one side</t>
        </li>
        <li>
          <t>Established: session is already defined as per BGP-4 specification  <xref section="8.2.2" sectionFormat="of" target="RFC4271"/></t>
        </li>
      </ul>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>As peering connections exchange real Internet traffic, this API requires a security component to verify that the requestor is authorized to operate the interconnection on behalf of such AS.
In this initial proposal, the API follows an authorization model based on OpenID Connect <xref target="oidc"/> and OAuth 2.0 (<xref target="RFC6749"/>) where the Authorization Server is PeeringDB. The choice of OpenID Connect is to use the standardized token 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 when used as bearer access tokens (<xref target="RFC9068"/>) and for which best common practices also exist (<xref target="RFC8725"/>).
After further discussion, the authors decided to offer alternate authentication options to accommodate the security concerns of different parties.
As peers may require varying security standards, this document proposes to support PeeringDB OIDC as the base requirement, with optional security extensions in addition (RPKI (<xref target="RFC6480"/>) or alternative OIDC Authorization Servers, for example).
This document hopes that, through the RFC process, the Working Group can come to a consensus on a base "authorization standard," to ease adoption for peering participants.</t>
      <t>Of particular interest is RPKI.
PeeringDB OIDC allows the API to identify who the requesting party is, while RPKI-signing allows such requesting party to prove that they own some of the Internet-assigned resources referenced in the request.
This combination provides a low entry barrier to create an identity federation across the participating ASs' API with a stronger guarantee of resource ownership against potential for misattribution and repudiation.
The authors recognize that not all partners have the time or engineering resources to support all authorization standards, so the API reference implementations will offer an extensible security mechanism to meet varying identity and security requirements.
For RPKI-based authentication, this document refers to RPKI Signed Checklists (RSCs) (<xref target="RFC9323"/>).</t>
      <t>The Peering API does not enforce any kind of peering policy on the incoming requests.
It is left to the server implementation to enforce the AS-specific peering policy.
The authors encourage each peer to consider the needs of their peering policy and implement request validation as desired.</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="rest"/>) 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-request-flow">
        <name>Example Request Flow</name>
        <t>The diagram below outlines the proposed API flow.</t>
        <artwork><![CDATA[
OIDC Authentication

+-----------+                 +-------+                    +-----------+
| 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 |
      |<--------------------------|

Operations, loop until peering is complete.

List Locations

+-----------+                                                  +-------+
| Initiator |                                                  | Peer  |
+-----------+                                                  +-------+
      |                                                            |
      | QUERY peering locations (peer type, ASN, auth code)        |
      |----------------------------------------------------------->|
      |                                                            |
      |                               Reply with peering locations |
      |                            or errors (401, 406, 451, etc.) |
      |<-----------------------------------------------------------|


Request session status

+-----------+                                                  +-------+
| Initiator |                                                  | Peer  |
+-----------+                                                  +-------+
      |                                                            |
      | QUERY request status using request ID & auth code          |
      |----------------------------------------------------------->|
      |                                                            |
      |                                  Reply with session status |
      |                                      (200, 404, 202, etc.) |
      |<-----------------------------------------------------------|
]]></artwork>
      </section>
      <section anchor="auth">
        <name>AUTH</name>
        <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>
      </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:
            </t>
            <ul spacing="normal">
              <li>
                <t>Structure:
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>Local ASN (receiver)</t>
                  </li>
                  <li>
                    <t>Local IP</t>
                  </li>
                  <li>
                    <t>Peer ASN (initiator)</t>
                  </li>
                  <li>
                    <t>Peer IP</t>
                  </li>
                  <li>
                    <t>Peer Type (public or private)</t>
                  </li>
                  <li>
                    <t>MD5 (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.</t>
              </li>
            </ul>
          </li>
        </ul>
        <ol spacing="normal" type="1"><li>
            <t>ADD SESSIONS (SERVER BATCHED RESPONSE)</t>
          </li>
        </ol>
        <ul spacing="normal">
          <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.
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.</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:
            </t>
            <ul spacing="normal">
              <li>
                <t>Session ID</t>
              </li>
              <li>
                <t>Local ASN (server)</t>
              </li>
              <li>
                <t>Local IP</t>
              </li>
              <li>
                <t>Peer ASN (client)</t>
              </li>
              <li>
                <t>Peer IP</t>
              </li>
              <li>
                <t>Peer Type</t>
              </li>
              <li>
                <t>MD5 (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 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>peer_type (public or private)</t>
          </li>
          <li>
            <t>md5 (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>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="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>
                          </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>
                          </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="extensions">
      <name>Possible Extensions</name>
      <t>The authors acknowledge that route-server configuration may also be of interest for this proposed API, and look forward to future discussions in this area.</t>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <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="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="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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <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>
        <reference anchor="RFC6480">
          <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="RFC9323">
          <front>
            <title>A Profile for RPKI Signed Checklists (RSCs)</title>
            <author fullname="J. Snijders" initials="J." surname="Snijders"/>
            <author fullname="T. Harrison" initials="T." surname="Harrison"/>
            <author fullname="B. Maddison" initials="B." surname="Maddison"/>
            <date month="November" year="2022"/>
            <abstract>
              <t>This document defines a Cryptographic Message Syntax (CMS) protected content type for use with the Resource Public Key Infrastructure (RPKI) to carry a general-purpose listing of checksums (a 'checklist'). The objective is to allow for the creation of an attestation, termed an "RPKI Signed Checklist (RSC)", which contains one or more checksums of arbitrary digital objects (files) that are signed with a specific set of Internet Number Resources. When validated, an RSC confirms that the respective Internet resource holder produced the RSC.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9323"/>
          <seriesInfo name="DOI" value="10.17487/RFC9323"/>
        </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>
      </references>
    </references>
    <?line 504?>

<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 (Meta)</t>
        </li>
        <li>
          <t>Jakub Heichman (Meta)</t>
        </li>
        <li>
          <t>Stefan Prattner (20c)</t>
        </li>
        <li>
          <t>Ben Ryall (Meta)</t>
        </li>
        <li>
          <t>Erica Salvaneschi (Cloudflare)</t>
        </li>
        <li>
          <t>Job Snijders (Fastly)</t>
        </li>
        <li>
          <t>David Tuber (Cloudflare)</t>
        </li>
        <li>
          <t>Aaron Rose (Amazon)</t>
        </li>
        <li>
          <t>Prithvi Nath Manikonda (Amazon)</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
