rfc9727xml2.original.xml | rfc9727.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="UTF-8"?> | <?xml version='1.0' encoding='utf-8'?> | |||
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?> | ||||
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.5 (Ruby 2.6 | ||||
.10) --> | ||||
<!DOCTYPE rfc [ | <!DOCTYPE rfc [ | |||
<!ENTITY nbsp " "> | <!ENTITY nbsp " "> | |||
<!ENTITY zwsp "​"> | <!ENTITY zwsp "​"> | |||
<!ENTITY nbhy "‑"> | <!ENTITY nbhy "‑"> | |||
<!ENTITY wj "⁠"> | <!ENTITY wj "⁠"> | |||
]> | ]> | |||
<?rfc tocindent="yes"?> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" submissionType | |||
<?rfc strict="yes"?> | ="IETF" docName="draft-ietf-httpapi-api-catalog-08" number="9727" category="std" | |||
<?rfc compact="yes"?> | consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3" x | |||
<?rfc comments="yes"?> | ml:lang="en" updates="" obsoletes=""> | |||
<?rfc inline="yes"?> | ||||
<rfc ipr="trust200902" docName="draft-ietf-httpapi-api-catalog-08" category="std " consensus="true" tocInclude="true" sortRefs="true" symRefs="true"> | ||||
<front> | <front> | |||
<title abbrev="api-catalog well-known URI">api-catalog: a well-known URI and | <title abbrev="api-catalog: A Well-Known URI">api-catalog: A Well-Known URI | |||
link relation to help discovery of APIs</title> | and Link Relation to Help Discovery of APIs</title> | |||
<seriesInfo name="RFC" value="9727"/> | ||||
<author initials="K." surname="Smith" fullname="Kevin Smith"> | <author initials="K." surname="Smith" fullname="Kevin Smith"> | |||
<organization>Vodafone</organization> | <organization>Vodafone</organization> | |||
<address> | <address> | |||
<email>kevin.smith@vodafone.com</email> | <email>kevin.smith@vodafone.com</email> | |||
<uri>https://www.vodafone.com</uri> | <uri>https://www.vodafone.com</uri> | |||
</address> | </address> | |||
</author> | </author> | |||
<date month="June" year="2025"/> | ||||
<area>WIT</area> | ||||
<workgroup>httpapi</workgroup> | ||||
<date /> | <keyword>API</keyword> | |||
<area>IETF</area> | ||||
<keyword>internet-draft</keyword> | ||||
<abstract> | <abstract> | |||
<t>This document defines the "api-catalog" well-known URI and link | ||||
<?line 83?> | relation. It is intended to facilitate automated discovery and usage of | |||
published Application Programming Interfaces (APIs). A request to the | ||||
<t>This document defines the "api-catalog" well-known URI and link | api-catalog resource will return a document providing information about, | |||
relation. It is intended to facilitate automated discovery and | and links to, the Publisher's APIs.</t> | |||
usage of published APIs. A request to the api-catalog resource | ||||
will return a document providing information about, and links to, | ||||
the publisher's APIs.</t> | ||||
</abstract> | </abstract> | |||
<note title="About This Document" removeInRFC="true"> | ||||
<t> | ||||
The latest revision of this draft can be found at <eref target="https:// | ||||
ietf-wg-httpapi.github.io/api-catalog/draft-ietf-httpapi-api-catalog.html"/>. | ||||
Status information for this document may be found at <eref target="https | ||||
://datatracker.ietf.org/doc/draft-ietf-httpapi-api-catalog/"/>. | ||||
</t> | ||||
<t> | ||||
Discussion of this document takes place on the | ||||
Building Blocks for HTTP APIs Working Group mailing list (<eref target=" | ||||
mailto:httpapi@ietf.org"/>), | ||||
which is archived at <eref target="https://mailarchive.ietf.org/arch/bro | ||||
wse/httpapi/"/>. | ||||
Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/httpapi | ||||
/"/>. | ||||
</t> | ||||
<t>Source for this draft and an issue tracker can be found at | ||||
<eref target="https://github.com/ietf-wg-httpapi/api-catalog"/>.</t> | ||||
</note> | ||||
</front> | </front> | |||
<middle> | <middle> | |||
<?line 91?> | <section anchor="introduction"> | |||
<name>Introduction</name> | ||||
<section anchor="introduction"><name>Introduction</name> | <t>An application may publish APIs | |||
<t>An application may publish Application Programming Interfaces (APIs) | ||||
to encourage requests for interaction from external parties. Such | to encourage requests for interaction from external parties. Such | |||
APIs must be discovered before they may be used - i.e., the external | APIs must be discovered before they may be used, i.e., the external | |||
party needs to know what APIs a given publisher exposes, their | party needs to know what APIs a given Publisher exposes, their | |||
purpose, any policies for usage, and the endpoint to interact with | purpose, any policies for usage, and the endpoint to interact with | |||
each API. To facilitate automated discovery of this information, | each API. To facilitate automated discovery of this information | |||
and automated usage of the APIs, this document proposes:</t> | and automated usage of the APIs, this document proposes:</t> | |||
<ul spacing="normal"> | ||||
<t><list style="symbols"> | <li> | |||
<t>a well-known URI <xref target="WELL-KNOWN"/>, 'api-catalog', encoded as a U | <t>a well-known URI <xref target="RFC8615"/>, "api-catalog", that is e | |||
RI | ncoded as a URI | |||
reference to an API catalog document describing a Publisher's API | reference to an API catalog document describing a Publisher's API | |||
endpoints.</t> | endpoints.</t> | |||
<t>a link relation <xref target="WEB-LINKING"/>, 'api-catalog', of which the t | </li> | |||
arget | <li> | |||
<t>a link relation <xref target="RFC8288"/>, "api-catalog", of which t | ||||
he target | ||||
resource is the Publisher's API catalog document.</t> | resource is the Publisher's API catalog document.</t> | |||
</list></t> | </li> | |||
</ul> | ||||
<section anchor="goals"><name>Goals and non-goals</name> | <section anchor="goals"> | |||
<name>Goals and Non-Goals</name> | ||||
<t>The primary goal is to facilitate the automated discovery of a | <t>The primary goal of this document is to facilitate the automated discovery | |||
Publisher's public API endpoints, along with metadata that describes | of a Publisher's public API endpoints, along with metadata that describes the | |||
the purpose and usage of each API, by specifying a well-known URI | purpose and usage of each API, by specifying a well-known URI that returns an | |||
that returns an API catalog document. The API catalog document is | API catalog document. The API catalog document is primarily machine-readable | |||
primarily machine-readable to enable automated discovery and usage of | to enable automated discovery and usage of APIs, and it may also include links | |||
APIs, and it may also include links to human-readable documentation | to human-readable documentation (see the example in <xref | |||
(see the example in <xref target="api-catalog-example-rfc8615"/>).</t> | target="api-catalog-example-rfc8615"/>).</t> | |||
<t>Non-goals: This document does not mandate paths for API endpoints, i. | ||||
<t>Non-goals: this document does not mandate paths for API endpoints. | e., it does not mandate that my_example_api's endpoint should be | |||
i.e., it does not mandate that my_example_api's endpoint should be | <tt>https://www.example.com/.well-known/api-catalog/my_example_api</tt>, nor | |||
<spanx style="verb">https://www.example.com/.well-known/api-catalog/my_example_a | ||||
pi</spanx>, nor | ||||
even to be hosted at www.example.com (although it is not forbidden to | even to be hosted at www.example.com (although it is not forbidden to | |||
do so).</t> | do so).</t> | |||
</section> | ||||
</section> | <section anchor="notational-conventions"> | |||
<section anchor="notational-conventions"><name>Notational Conventions</name> | <name>Notational Conventions</name> | |||
<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp | ||||
<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL | 14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECO | |||
"MAY", and "OPTIONAL" in this document are to be interpreted as | MMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be i | |||
only when, they | nterpreted as | |||
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and | ||||
only when, they | ||||
appear in all capitals, as shown here. | appear in all capitals, as shown here. | |||
These words may also appear in this document in | These words may also appear in this document in | |||
lower case as plain English words, absent their normative meanings. | lower case as plain English words, absent their normative meanings. | |||
<?line -8?></t> | </t> | |||
<t>The terms "content negotiation" and "status code" are from <xref targ | ||||
<t>The terms "content negotiation" and "status code" are from <xref target="HTTP | et="RFC9110"/>. | |||
"/>. | The term "well-known URI" is from <xref target="RFC8615"/>. | |||
The term "well-known URI" is from <xref target="WELL-KNOWN"/>. | The term "link relation" is from <xref target="RFC8288"/>.</t> | |||
The term "link relation" is from <xref target="WEB-LINKING"/>.</t> | <t>The term "Publisher" refers to an organisation, company, or | |||
individual that publishes one or more APIs for use by external third | ||||
<t>The term "Publisher" refers to an organisation, company or individual | parties. A fictional Publisher named "example" is used throughout | |||
that publishes one or more APIs for usage by external third parties. | this document. The examples use the Fully Qualified Domain Names | |||
A fictional Publisher named "example" is used throughout this document. | (FQDNs) "www.example.com", "developer.example.com", "apis.example.com", | |||
The examples use the FQDNs "www.example.com", "developer.example.com" | "apis.example.net", "gaming.example.com", and | |||
,"apis.example.com", "apis.example.net", "gaming.example.com", | "iot.example.net", where the .com and .net Top-Level Domains (TLDs) and | |||
"iot.example.net",where the use of the .com and .net TLDs and various | various | |||
subdomains are simply to illustrate that the "example" Publisher may | subdomains are simply used to illustrate that the "example" Publisher ma | |||
have their API portfolio distributed across various domains for which | y | |||
they are the authority. For scenarios where the Publisher "example" | have their API portfolio distributed across various domains for which | |||
is not the authority for a given <em>.example.</em> domain then that is made | they are the authority. | |||
explicit in the text.</t> | Scenarios where the Publisher "example" is | |||
not the authority for a given <em>.example.</em> domain are | ||||
<t>In this document, "API" means the specification resources required | made explicit in the text.</t> | |||
for an external party (or in the case of 'private' APIs, an internal | <t>In this document, "API" refers to the specification resources require | |||
party) to implement software which uses the Publisher's Application | d | |||
Programming Interface.</t> | for an external party (or in the case of "private" APIs, an internal | |||
party) to implement software that uses the Publisher's API.</t> | ||||
<t>The specification recommends the use of TLS, hence "HTTPS" and | <t>The specification recommends the use of TLS. Hence, "HTTPS" and | |||
"https://" are used throughout.</t> | "https://" are used throughout.</t> | |||
</section> | ||||
</section> | </section> | |||
</section> | <section anchor="usage"> | |||
<section anchor="usage"><name>Using the 'api-catalog' well-known URI</name> | <name>Using the "api-catalog" Well-Known URI</name> | |||
<t>The api-catalog well-known URI is intended for HTTPS servers that | ||||
<t>The api-catalog well-known URI is intended for HTTPS servers that | ||||
publish APIs.</t> | publish APIs.</t> | |||
<ul spacing="normal"> | ||||
<t><list style="symbols"> | <li> | |||
<t>The API catalog MUST be named "api-catalog" in a well-known location | <t>The API catalog <bcp14>MUST</bcp14> be named "api-catalog" in a wel | |||
as described by <xref target="WELL-KNOWN"/>.</t> | l-known location | |||
<t>The location of the API catalog document is decided by the Publisher: | as described by <xref target="RFC8615"/>.</t> | |||
the /.well-known/api-catalog URI provides a convenient reference to | </li> | |||
<li> | ||||
<t>The location of the API catalog document is decided by the Publishe | ||||
r. | ||||
The /.well-known/api-catalog URI provides a convenient reference to | ||||
that location.</t> | that location.</t> | |||
</list></t> | </li> | |||
</ul> | ||||
<t>A Publisher supporting this URI:</t> | <t>A Publisher supporting this URI:</t> | |||
<ul spacing="normal"> | ||||
<t><list style="symbols"> | <li> | |||
<t>SHALL resolve an HTTPS GET request to /.well-known/api-catalog and | <t><bcp14>SHALL</bcp14> resolve an HTTPS GET request to /.well-known/a | |||
return an API catalog document ( as described in <xref target="api-catalog"/> ). | pi-catalog and | |||
</t> | return an API catalog document (as described in <xref target="api-catalog"/>).</ | |||
<t>SHALL resolve an HTTPS HEAD request to /.well-known/api-catalog | t> | |||
</li> | ||||
<li> | ||||
<t><bcp14>SHALL</bcp14> resolve an HTTPS HEAD request to /.well-known/ | ||||
api-catalog | ||||
with a response including a Link header with the relation(s) defined | with a response including a Link header with the relation(s) defined | |||
in <xref target="link-relation"/></t> | in <xref target="link-relation"/>.</t> | |||
</list></t> | </li> | |||
</ul> | ||||
</section> | </section> | |||
<section anchor="link-relation"><name>The api-catalog link relation</name> | <section anchor="link-relation"> | |||
<name>The api-catalog Link Relation</name> | ||||
<t>This document introduces a new link relation <xref target="WEB-LINKING"/>, | <t>This document introduces a new link relation <xref target="RFC8288"/>, | |||
"api-catalog". This identifies a target resource that represents a | "api-catalog". This identifies a target resource that represents a | |||
list of APIs available from the Publisher of the link context. | list of APIs available from the Publisher of the link context. | |||
The target resource URI may be /.well-known/api-catalog , or any | The target resource URI may be /.well-known/api-catalog or any | |||
other URI chosen by the Publisher. For example, the Publisher | other URI chosen by the Publisher. For example, the Publisher | |||
'example' could include the api-catalog link relation in the HTTP | "example" could include the api-catalog link relation in the HTTP | |||
header and/or content payload when responding to a request to | header and/or content payload when responding to a request to | |||
<spanx style="verb">https://www.example.com</spanx> :</t> | <tt>https://www.example.com</tt>:</t> | |||
<sourcecode type="http-message"><![CDATA[ | ||||
<figure><sourcecode type="http-message"><![CDATA[ | ||||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Content-Type: text/html; charset=UTF-8 | Content-Type: text/html; charset=UTF-8 | |||
Location: /index.html | Location: /index.html | |||
Link: </my_api_catalog.json>; rel=api-catalog | Link: </my_api_catalog.json>; rel=api-catalog | |||
Content-Length: 356 | Content-Length: 356 | |||
<!DOCTYPE HTML> | <!DOCTYPE HTML> | |||
<html> | <html> | |||
<head> | <head> | |||
<title>Welcome to Example Publisher</title> | <title>Welcome to Example Publisher</title> | |||
</head> | </head> | |||
<body> | <body> | |||
<p> | <p> | |||
<a href="my_api_catalog.json" rel="api-catalog"> | <a href="my_api_catalog.json" rel="api-catalog"> | |||
Example Publisher's APIs | Example Publisher's APIs | |||
</a> | </a> | |||
</p> | </p> | |||
<p>(remainder of content)</p> | <p>(remainder of content)</p> | |||
</body> | </body> | |||
</html> | </html> | |||
]]></sourcecode> | ||||
]]></sourcecode></figure> | <section anchor="using-additional-link-relations"> | |||
<name>Using Additional Link Relations</name> | ||||
<section anchor="using-additional-link-relations"><name>Using additional link re | <t>When used in an API catalog document, the "item" <xref target="RF | |||
lations</name> | C6573"/> link relation identifies a target resource that represents an | |||
<t><list style="symbols"> | ||||
<t>"item" <xref target="RFC6573"/>. When used in an API catalog document, the | ||||
"item" link relation identifies a target resource that represents an | ||||
API that is a member of the API catalog.</t> | API that is a member of the API catalog.</t> | |||
<t>Other link relations may be utilised in an API catalog to convey | <t>Other link relations may be utilised in an API catalog to convey | |||
metadata descriptions for API links.</t> | metadata descriptions for API links.</t> | |||
</list></t> | </section> | |||
</section> | ||||
</section> | <section anchor="api-catalog"> | |||
</section> | <name>The API Catalog Document</name> | |||
<section anchor="api-catalog"><name>The API catalog document</name> | <t>The API catalog is a document listing a Publisher's APIs. The | |||
<t>The API catalog is a document listing a Publisher's APIs. The | ||||
Publisher may host the API catalog document at any URI(s) | Publisher may host the API catalog document at any URI(s) | |||
they choose. As illustration, the API catalog document URI of | they choose. | |||
<spanx style="verb">https://www.example.com/my_api_catalog.json</spanx> can be r | For example, the API catalog document URI of | |||
equested | <tt>https://www.example.com/my_api_catalog.json</tt> can be requested directl | |||
directly, or via a request to | y or | |||
<spanx style="verb">https://www.example.com/.well-known/api-catalog</spanx>, whi | via a request to <tt>https://www.example.com/.well-known/api-catalog</tt>, wh | |||
ch the | ich | |||
Publisher will resolve to <spanx style="verb">https://www.example.com/my_api_cat | the Publisher will resolve to <tt>https://www.example.com/my_api_catalog</tt> | |||
alog</spanx>.</t> | .</t> | |||
<section anchor="api-catalog-contents"> | ||||
<section anchor="api-catalog-contents"><name>API catalog contents</name> | <name>API Catalog Contents</name> | |||
<t>The API catalog MUST include hyperlinks to API endpoints, | <t> The API catalog <bcp14>MUST</bcp14> include hyperlinks to API | |||
and is RECOMMENDED to include useful metadata, such as usage | endpoints. It is <bcp14>RECOMMENDED</bcp14> that the API catalog also includes | |||
policies, API version information, links to the OpenAPI Specification | useful metadata, such as usage policies, API version information, links to the | |||
<xref target="OAS"></xref> definitions for each API, etc. If the Publisher does | OpenAPI Specification <xref target="OAS"/> definitions for each API, etc. If the | |||
not | Publisher does not | |||
include that metadata directly in the API catalog document, they | include that metadata directly in the API catalog document, they | |||
SHOULD make that metadata available at the API endpoint URIs they | <bcp14>SHOULD</bcp14> make that metadata available at the API endpoint URIs they | |||
have listed (see <xref target="api-catalog-example-linkset-bookmarks"/> for | have listed (see <xref target="api-catalog-example-linkset-bookmarks"/> for | |||
an example).</t> | an example).</t> | |||
</section> | ||||
</section> | <section anchor="api-catalog-formats"> | |||
<section anchor="api-catalog-formats"><name>API catalog formats</name> | <name>API Catalog Formats</name> | |||
<t>The Publisher <bcp14>MUST</bcp14> publish the API catalog document in | ||||
<t>The Publisher MUST publish the API catalog document in the Linkset | the Linkset | |||
format <spanx style="verb">application/linkset+json</spanx> (section 4.2 of <xre | format <tt>application/linkset+json</tt> (<xref section="4.2" sectionFormat="of" | |||
f target="RFC9264"/>). | target="RFC9264"/>). | |||
The Linkset SHOULD include a profile parameter (section 5 of | The Linkset <bcp14>SHOULD</bcp14> include a profile parameter (<xref section="5" | |||
<xref target="RFC9264"/>) with a Profile URI <xref target="RFC7284"/> value of ' | sectionFormat="of" target="RFC9264"/>) with a Profile URI <xref target="RFC7284 | |||
THIS-RFC-URL' | "/> value of "https://www.rfc-editor.org/info/rfc9727" | |||
to indicate the Linkset is representing an API catalog document as | to indicate the Linkset is representing an API catalog document as | |||
defined above. Appendix A includes example API catalog documents | defined above. <xref target="api-catalog-example-linkset"/> includes example API catalog documents | |||
based on the Linkset format.</t> | based on the Linkset format.</t> | |||
<t>The Publisher MAY make additional formats available via | <t>The Publisher <bcp14>MAY</bcp14> make additional formats available vi | |||
content negotiation (section 5.3 of <xref target="HTTP"/>) to their | a | |||
content negotiation (<xref section="12" sectionFormat="of" target="RFC9110"/>) t | ||||
o their | ||||
/.well-known/api-catalog location. A non-exhaustive list of such | /.well-known/api-catalog location. A non-exhaustive list of such | |||
formats that support the automated discovery, and machine (and | formats that support the automated discovery and machine (and | |||
human) usage of a Publisher's APIs, is listed at | human) usage of a Publisher's APIs is listed at | |||
<xref target="api-catalog-other-formats"/>. If a Publisher already lists their | <xref target="api-catalog-other-formats"/>. If a Publisher already lists their | |||
APIs in a format other than Linkset but wish to utilise the | APIs in a format other than Linkset, but wishes to utilise the | |||
/.well-known/api-catalog URI, then:</t> | /.well-known/api-catalog URI, then:</t> | |||
<ul spacing="normal"> | ||||
<t><list style="symbols"> | <li> | |||
<t>They MUST also implement a Linkset with, at minimum, hyperlinks to | <t>They <bcp14>MUST</bcp14> also implement a Linkset with, at minimu | |||
API endpoints - see the example of | m, hyperlinks to | |||
<xref target="api-catalog-example-linkset-bookmarks"/> in Appendix A.</t> | API endpoints; see <xref target="api-catalog-example-linkset-bookmarks"/>.</t> | |||
<t>They MAY support content negotiation at the | </li> | |||
/.well-known/api-catalog URI to allow their existing format to be | <li> | |||
returned.</t> | <t>They <bcp14>MAY</bcp14> support content negotiation at the | |||
</list></t> | /.well-known/api-catalog URI to allow for the return of their existing format.</ | |||
t> | ||||
</section> | </li> | |||
<section anchor="nest"><name>Nesting API catalog links</name> | </ul> | |||
</section> | ||||
<t>An API catalog may itself contain links to other API catalogs, by | <section anchor="nest"> | |||
using the 'api-catalog' relation type for each link. | <name>Nesting API Catalog Links</name> | |||
An example of this is given in | <t>An API catalog may itself contain links to other API catalogs by usin | |||
<xref target="api-catalog-example-linkset-nesting"/>.</t> | g | |||
the "api-catalog" relation type for each link. An example of this is | ||||
</section> | given in <xref target="api-catalog-example-linkset-nesting"/>.</t> | |||
</section> | </section> | |||
<section anchor="operations"><name>Operational considerations</name> | </section> | |||
<section anchor="operations"> | ||||
<section anchor="multiple_domains"><name>Accounting for APIs distributed across | <name>Operational Considerations</name> | |||
multiple domains</name> | <section anchor="multiple_domains"> | |||
<name>Accounting for APIs Distributed Across Multiple Domains</name> | ||||
<t>A Publisher ("example") may have their APIs hosted across multiple | <t>A Publisher ("example") may have their APIs hosted across multiple | |||
domains that they manage: e.g., at <spanx style="verb">www.example.com</spanx>, | domains that they manage, e.g., at <tt>www.example.com</tt>, | |||
<spanx style="verb">developer.example.com</spanx>, <spanx style="verb">apis.exam | <tt>developer.example.com</tt>, <tt>apis.example.com</tt>, | |||
ple.com</spanx>, | <tt>apis.example.net</tt>, etc. They may also use a third-party API | |||
<spanx style="verb">apis.example.net</spanx> etc. They may also use a third-part | hosting provider that hosts APIs on a distinct domain.</t> | |||
y API | <t>To account for this scenario, it is <bcp14>RECOMMENDED</bcp14> that:< | |||
hosting provider which hosts APIs on a distinct domain.</t> | /t> | |||
<ul spacing="normal"> | ||||
<t>To account for this scenario, it is RECOMMENDED that:</t> | <li> | |||
<t>The Publisher also publish the api-catalog well-known URI at each | ||||
<t><list style="symbols"> | of their API domains, e.g., <tt>https://apis.example.com/.well-known/api-catalo | |||
<t>The Publisher also publish the api-catalog well-known URI at each | g</tt>, | |||
of their API domains e.g. | <tt>https://developer.example.net/.well-known/api-catalog</tt>, etc.</t> | |||
<spanx style="verb">https://apis.example.com/.well-known/api-catalog</spanx>, | </li> | |||
<spanx style="verb">https://developer.example.net/.well-known/api-catalog</span | <li> | |||
x> etc.</t> | <t>An HTTPS GET request to any of these URIs returns the same result | |||
<t>An HTTPS GET request to any of these URIs returns the same result, | , | |||
namely, the API catalog document.</t> | namely, the API catalog document.</t> | |||
<t>Since the physical location of the API catalog document is decided | </li> | |||
by the Publisher, and may change, the Publisher choose one of their | <li> | |||
<t>The Publisher choose one of their | ||||
instances of /.well-known/api-catalog as a canonical reference to | instances of /.well-known/api-catalog as a canonical reference to | |||
the location of the latest API catalog. The Publisher's other | the location of the latest API catalog since the physical location of the API ca talog document is decided by the Publisher and may change. The Publisher's other | |||
instances of /.well-known/api-catalog should redirect to this | instances of /.well-known/api-catalog should redirect to this | |||
canonical instance of /.well-known/api-catalog to ensure the latest | canonical instance of /.well-known/api-catalog to ensure the latest | |||
API catalog is returned.</t> | API catalog is returned.</t> | |||
</list></t> | </li> | |||
</ul> | ||||
<t>For example, if the Publisher's primary API portal is | <t>For example, if the Publisher's primary API portal is | |||
<spanx style="verb">https://apis.example.com</spanx>, then | <tt>https://apis.example.com</tt>, then | |||
<spanx style="verb">https://apis.example.com/.well-known/api-catalog</spanx> sho | <tt>https://apis.example.com/.well-known/api-catalog</tt> should resolve to | |||
uld resolve to | ||||
the location of the Publisher's latest API catalog document. If the | the location of the Publisher's latest API catalog document. If the | |||
Publisher is also the domain authority for <spanx style="verb">www.example.net</ spanx>, | Publisher is also the domain authority for <tt>www.example.net</tt>, | |||
which also hosts a selection of their APIs, then a request to | which also hosts a selection of their APIs, then a request to | |||
<spanx style="verb">https://www.example.net/.well-known/api-catalog</spanx> shou | <tt>https://www.example.net/.well-known/api-catalog</tt> should redirect | |||
ld redirect | to <tt>https://apis.example.com/.well-known/api-catalog</tt>.</t> | |||
to <spanx style="verb">https://apis.example.com/.well-known/api-catalog</spanx> | ||||
.</t> | ||||
<t>If the Publisher is not the domain authority for | <t>If the Publisher is not the domain authority for <tt>www.example.net</tt>, | |||
<spanx style="verb">www.example.net</spanx> - or any third-party domain that hos | then the Publisher’s API Catalog <bcp14>MAY</bcp14> include a link to the | |||
ts any | API catalog of the third-party that is the domain authority for <tt>www.exampl | |||
of the Publisher's APIs - then the Publisher MAY include a link in | e.net</tt>. For example, the API catalog available | |||
its own API catalog to that third-party domain's API catalog. | at <tt>https://apis.example.com/.well-known/api-catalog</tt> may list APIs | |||
For example, the API catalog available | hosted at <tt>apis.example.com</tt> and also link to the API catalog hosted | |||
at <spanx style="verb">https://apis.example.com/.well-known/api-catalog</spanx>) | at <tt>https://www.example.net/.well-known/api-catalog</tt> using the | |||
may list APIs | ||||
hosted at <spanx style="verb">apis.example.com</spanx> and also link to the API | ||||
catalog hosted | ||||
at <spanx style="verb">https://www.example.net/.well-known/api-catalog</spanx> u | ||||
sing the | ||||
"api-catalog" link relation:</t> | "api-catalog" link relation:</t> | |||
<sourcecode type="json"><![CDATA[ | ||||
<figure><sourcecode type="json"><![CDATA[ | ||||
{ | { | |||
"linkset": [ | "linkset": [ | |||
{ | { | |||
"anchor": "https://www.example.com/.well-known/api-catalog", | "anchor": "https://www.example.com/.well-known/api-catalog", | |||
"item": [ | "item": [ | |||
{ | { | |||
"href": "https://developer.example.com/apis/foo_api" | "href": "https://developer.example.com/apis/foo_api" | |||
}, | }, | |||
{ | { | |||
"href": "https://developer.example.com/apis/bar_api" | "href": "https://developer.example.com/apis/bar_api" | |||
}, | }, | |||
{ | { | |||
"href": "https://developer.example.com/apis/cantona_api" | "href": "https://developer.example.com/apis/cantona_api" | |||
} | } | |||
], | ], | |||
"api-catalog": "https://www.example.net/.well-known/api-catalog" | "api-catalog": "https://www.example.net/.well-known/api-catalog" | |||
} | } | |||
] | ] | |||
} | } | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
</section> | ||||
</section> | <section anchor="internal-use"> | |||
<section anchor="internal-use"><name>Internal use of api-catalog for private API | <name>Internal Use of api-catalog for Private APIs</name> | |||
s</name> | <t>A Publisher may wish to use the api-catalog well-known URI on their | |||
internal network to signpost authorised users (e.g., company | ||||
<t>A Publisher may wish to use the api-catalog well-known URI on their | ||||
internal network, to signpost authorised users (e.g. company | ||||
employees) towards internal/private APIs not intended for third-party | employees) towards internal/private APIs not intended for third-party | |||
use. This scenario may incur additional security considerations, as | use. This scenario may incur additional security considerations as | |||
noted in <xref target="security"/>.</t> | noted in <xref target="security"/>.</t> | |||
</section> | ||||
</section> | <section anchor="scalability"> | |||
<section anchor="scalability"><name>Scalability guidelines</name> | <name>Scalability Guidelines</name> | |||
<t>In cases where a Publisher has a large number of APIs potentially | ||||
<t>In cases where a Publisher has a large number of APIs, potentially | deployed across multiple domains, two challenges may arise:</t> | |||
deployed across multiple domains, then two challenges may arise:</t> | <ul spacing="normal"> | |||
<li> | ||||
<t><list style="symbols"> | <t>Maintaining the catalog entries to ensure they are up to date and | |||
<t>Maintaining the catalog entries to ensure they are up to date and | correcting any errors.</t> | |||
any errors corrected.</t> | </li> | |||
<t>Restricting the catalog size to help reduce network and | <li> | |||
<t>Restricting the catalog size to help reduce network and | ||||
client-processing overheads.</t> | client-processing overheads.</t> | |||
</list></t> | </li> | |||
</ul> | ||||
<t>In both cases a Publisher may benefit from grouping their APIs, | <t>In both cases, a Publisher may benefit from grouping their APIs, | |||
providing an API catalog document for each group - and use the main | providing an API catalog document for each group and using the main | |||
API catalog hosted at /.well-known/api-catalog to provide links to | API catalog hosted at /.well-known/api-catalog to provide links to | |||
these. For example a Publisher may decide to group their APIs | these. For example, a Publisher may decide to group their APIs | |||
according to a business category (e.g. 'gaming APIs', 'anti-fraud | according to a business category (e.g., "gaming APIs", "anti-fraud | |||
APIs etc.) or a technology category (e.g. ''IOT', 'networks', 'AI' | APIs", etc.), a technology category (e.g., "IOT", "networks", "AI", | |||
etc.), or any other criterion. This grouping may already be implicit | etc.), or any other criterion. | |||
where the Publisher has already published their APIs across multiple | ||||
domains, e.g. at <spanx style="verb">gaming.example.com</spanx>, <spanx style="v | ||||
erb">iot.example.net</spanx>, etc.</t> | ||||
<t><xref target="nest"/> shows how the API catalog at | This grouping may be implicit where the Publisher has already published | |||
their APIs across multiple domains, e.g., at <tt>gaming.example.com</tt>, | ||||
<tt>iot.example.net</tt>, etc.</t> | ||||
<t><xref target="nest"/> shows how the API catalog at | ||||
/.well-known/api-catalog can use the api-catalog link relation to | /.well-known/api-catalog can use the api-catalog link relation to | |||
point to other API catalogs.</t> | point to other API catalogs.</t> | |||
<t>The Publisher <bcp14>SHOULD</bcp14> consider caching and compression | ||||
<t>The Publisher SHOULD consider caching and compression | ||||
techniques to reduce the network overhead of large API catalogs.</t> | techniques to reduce the network overhead of large API catalogs.</t> | |||
</section> | ||||
</section> | <section anchor="maintenance"> | |||
<section anchor="maintenance"><name>Monitoring and maintenance</name> | <name>Monitoring and Maintenance</name> | |||
<t>Publishers are <bcp14>RECOMMENDED</bcp14> to follow operational best | ||||
<t>Publishers are RECOMMENDED to follow operational best practice when | practice when | |||
hosting API catalog(s), including but not limited to:</t> | hosting API catalog(s), including, but not limited to:</t> | |||
<ul spacing="normal"> | ||||
<t><list style="symbols"> | <li> | |||
<t>Availability. The Publisher should monitor availability of the API | <t>Availability. The Publisher should monitor availability of the AP | |||
catalog, and consider alternate means to resolve requests to | I | |||
catalog and consider alternate means to resolve requests to | ||||
/.well-known/api-catalog during planned downtime of hosts.</t> | /.well-known/api-catalog during planned downtime of hosts.</t> | |||
<t>Performance. Although the performance of APIs listed in an API | </li> | |||
<li> | ||||
<t>Performance. Although the performance of APIs listed in an API | ||||
catalog can demand high transactions per second and low-latency | catalog can demand high transactions per second and low-latency | |||
response, the retrieval of the API catalog itself to discover those | response, the retrieval of the API catalog itself to discover those | |||
APIs is less likely to incur strict performance demands. That said, | APIs is less likely to incur strict performance demands. That said, | |||
the Publisher should monitor the response time to fulfil a request | the Publisher should monitor the response time to fulfil a request | |||
for the API catalog, and determine any necessary improvements (as | for the API catalog and determine any necessary improvements (as | |||
with any other Web resource the Publisher serves). For large API | with any other Web resource the Publisher serves). For large API | |||
catalogs, the Publisher should consider the techniques described in | catalogs, the Publisher should consider the techniques described in | |||
<xref target="scalability"/>.</t> | <xref target="scalability"/>.</t> | |||
<t>Usage. Since the goal of the api-catalog well-known URI is to | </li> | |||
<li> | ||||
<t>Usage. Since the goal of the api-catalog well-known URI is to | ||||
facilitate discovery of APIs, the Publisher may wish to correlate | facilitate discovery of APIs, the Publisher may wish to correlate | |||
requests to the /.well-known/api-catalog URI with subsequent requests | requests to the /.well-known/api-catalog URI with subsequent requests | |||
to the API URIs listed in the catalog.</t> | to the API URIs listed in the catalog.</t> | |||
<t>Current data. The Publisher should include the removal of stale API | </li> | |||
<li> | ||||
<t>Current data. The Publisher should include the removal of stale A | ||||
PI | ||||
entries from the API catalog as part of their API release lifecycle. | entries from the API catalog as part of their API release lifecycle. | |||
The Publisher MAY decide to include metadata regarding legacy API | The Publisher <bcp14>MAY</bcp14> decide to include metadata regarding legacy API | |||
versions or deprecated APIs to help users of those APIs discover | versions or deprecated APIs to help users of those APIs discover | |||
up-to-date alternatives.</t> | up-to-date alternatives.</t> | |||
<t>Correct metadata. The Publisher should include human and/or | </li> | |||
<li> | ||||
<t>Correct metadata. The Publisher should include human and/or | ||||
automated checks for syntax errors in the API catalog. Automated | automated checks for syntax errors in the API catalog. Automated | |||
checks include format validation (e.g. to ensure valid JSON syntax) | checks include format validation (e.g., to ensure valid JSON syntax) | |||
and linting to enforce business rules - such as removing duplicate | and linting to enforce business rules, such as removing duplicate | |||
entries and ensuring descriptions are correctly named with valid | entries and ensuring descriptions are correctly named with valid | |||
values. A proofread of the API catalog as part of the API release | values. A proofread of the API catalog as part of the API release | |||
lifecycle is RECOMMENDED to detect any errors in business grammar | lifecycle is <bcp14>RECOMMENDED</bcp14> to detect any errors in business grammar | |||
(for example, an API entry that is described with valid syntax, but | (for example, an API entry that is described with valid syntax, but | |||
has been allocated an incorrect or outdated description.)</t> | has been allocated an incorrect or outdated description.)</t> | |||
<t>Security best practice, as set out in <xref target="security"/>.</t> | </li> | |||
</list></t> | <li> | |||
<t>Security best practice. See <xref target="security"/>.</t> | ||||
</section> | </li> | |||
<section anchor="integration"><name>Integration with existing API management fra | </ul> | |||
meworks</name> | </section> | |||
<section anchor="integration"> | ||||
<t>A Publisher may already utilise an API management framework to | <name>Integration with Existing API Management Frameworks</name> | |||
<t>A Publisher may already utilise an API management framework to | ||||
produce their API portfolio. These frameworks typically include the | produce their API portfolio. These frameworks typically include the | |||
publication of API endpoint URIs, deprecation and redirection of | publication of API endpoint URIs, deprecation and redirection of | |||
legacy API versions, API usage policies and documentation, etc. | legacy API versions, API usage policies and documentation, etc. | |||
The api-catalog well-known URI and API catalog document are intended | The api-catalog well-known URI and API catalog document are intended | |||
to complement API management frameworks by facilitating the discovery | to complement API management frameworks by facilitating the discovery | |||
of the framework's outputs - API endpoints, usage policies and | of the framework's outputs -- API endpoints, usage policies, and | |||
documentation - and are not intended to replace any existing | documentation -- and are not intended to replace any existing | |||
API discovery mechanisms the framework has implemented.</t> | API discovery mechanisms the framework has implemented.</t> | |||
<t>Providers of such frameworks may include the production of an API | ||||
<t>Providers of such frameworks may include the production of an API | ||||
catalog and the publication of the /.well-known/api-catalog URI as a | catalog and the publication of the /.well-known/api-catalog URI as a | |||
final pre-release (or post-release) step in the release management | final pre-release (or post-release) step in the release management | |||
workflow. The following steps are recommended:</t> | workflow. The following steps are recommended.</t> | |||
<t>If the /.well-known/api-catalog URI has not been published previously | ||||
<t>If the /.well-known/api-catalog URI has not been published previously | , the framework provider should:</t> | |||
, the framework provider should:</t> | <ul spacing="normal"> | |||
<li> | ||||
<t><list style="symbols"> | <t>Collate and check the metadata for each API that will be included | |||
<t>Collate and check the metadata for each API that will be included | ||||
in the API catalog. This metadata is likely to already exist in the | in the API catalog. This metadata is likely to already exist in the | |||
framework.</t> | framework.</t> | |||
<t>Determine which metadata to include in the API catalog, following | </li> | |||
<li> | ||||
<t>Determine which metadata to include in the API catalog following | ||||
the requirements set out in <xref target="api-catalog-contents"/> and the | the requirements set out in <xref target="api-catalog-contents"/> and the | |||
considerations set out in <xref target="operations"/>.</t> | considerations set out in <xref target="operations"/>.</t> | |||
<t>Map the chosen metadata to the format(s) described in | </li> | |||
<xref target="api-catalog-formats"/>. Where only the hyperlinks to APIs are to b | <li> | |||
e | <t>Map the chosen metadata to the format(s) described in | |||
included in the API catalog, then the structure suggested in | <xref target="api-catalog-formats"/>. The structure suggested in | |||
<xref target="api-catalog-example-linkset-bookmarks"/> may be followed. Where | <xref target="api-catalog-example-linkset-bookmarks"/> may be followed where onl | |||
possible the API catalog should include further metadata per the | y the hyperlinks to APIs are to be | |||
guidance in <xref target="api-catalog-contents"/>, in which case the structure | included in the API catalog. Where | |||
possible, the API catalog should include further metadata per the | ||||
guidance in <xref target="api-catalog-contents"/>; in which case, the structure | ||||
suggested in <xref target="api-catalog-example-linkset"/> can be utilised and | suggested in <xref target="api-catalog-example-linkset"/> can be utilised and | |||
adapted (ensuring compliance to <xref target="RFC9264"/>) to reflect the nature | adapted (ensuring compliance to <xref target="RFC9264"/>) to reflect the nature | |||
of the chosen metadata.</t> | of the chosen metadata.</t> | |||
<t>Publish the /.well-known/api-catalog URI following the guidance set | </li> | |||
<li> | ||||
<t>Publish the /.well-known/api-catalog URI following the guidance s | ||||
et | ||||
out in <xref target="usage"/>.</t> | out in <xref target="usage"/>.</t> | |||
</list></t> | </li> | |||
</ul> | ||||
<t>If the /.well-known/api-catalog URI has previously been published, | <t>If the /.well-known/api-catalog URI has previously been published, | |||
the framework provider should:</t> | the framework provider should:</t> | |||
<ul spacing="normal"> | ||||
<t><list style="symbols"> | <li> | |||
<t>Include a step in the release management lifecycle to refresh the | <t>Include a step in the release management lifecycle to refresh the | |||
API catalog following any changes in API hyperlinks or published | API catalog following any changes in API hyperlinks or published | |||
metadata. This could include placing triggers on certain metadata | metadata. This could include placing triggers on certain metadata | |||
fields, so that as they are updated in pre-production on the API | fields, so that as they are updated in pre-production on the API | |||
framework, the updates are pushed to a pre-production copy of the API | framework, the updates are pushed to a pre-production copy of the API | |||
catalog to be pushed live when the release is published by the | catalog to be pushed live when the release is published by the | |||
framework.</t> | framework.</t> | |||
</list></t> | </li> | |||
</ul> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="conform-rfc8615"><name>Conformance to RFC8615</name> | <section anchor="conform-rfc8615"> | |||
<name>Conformance to RFC 8615</name> | ||||
<t>The requirements in section 3 of <xref target="WELL-KNOWN"/> for defining | <t>The requirements in <xref section="3" sectionFormat="of" target="RFC861 | |||
Well-Known Uniform Resource Identifiers are met as described in the | 5"/> for defining | |||
following sub-sections.</t> | Well-Known URIs are met as described in the | |||
following subsections.</t> | ||||
<section anchor="path-suffix"><name>Path suffix</name> | <section anchor="path-suffix"> | |||
<name>Path Suffix</name> | ||||
<t>The api-catalog URI SHALL be appended to the /.well-known/ | <t>The api-catalog URI <bcp14>SHALL</bcp14> be appended to the /.well-kn | |||
own/ | ||||
path-prefix for "well-known locations".</t> | path-prefix for "well-known locations".</t> | |||
</section> | ||||
</section> | <section anchor="formats-and-associated-media-types"> | |||
<section anchor="formats-and-associated-media-types"><name>Formats and associate | <name>Formats and Associated Media Types</name> | |||
d media types</name> | <t>A /.well-known/api-catalog location <bcp14>MUST</bcp14> support the L | |||
inkset | ||||
<t>A /.well-known/api-catalog location MUST support the Linkset | <xref target="RFC9264"/> format of application/linkset+json and <bcp14>MAY</bcp1 | |||
<xref target="RFC9264"/> format of application/linkset+json, and MAY | 4> | |||
also support the other formats via content negotiation.</t> | also support the other formats via content negotiation.</t> | |||
</section> | ||||
</section> | </section> | |||
<section anchor="registration-of-the-api-catalog-well-known-uri"><name>Registrat | <section anchor="iana"> | |||
ion of the api-catalog well-known URI</name> | <name>IANA Considerations</name> | |||
<section anchor="the-api-catalog-well-known-uri"> | ||||
<t>See <xref target="iana"/> considerations below.</t> | <name>The api-catalog Well-Known URI</name> | |||
<t>This specification registers the "api-catalog" well-known URI in | ||||
</section> | the "Well-Known URIs" registry as defined by <xref | |||
</section> | target="RFC8615"/>.</t> | |||
<section anchor="iana"><name>IANA Considerations</name> | <dl spacing="compact" newline="false"> | |||
<dt>URI Suffix:</dt><dd>api-catalog</dd> | ||||
<section anchor="the-api-catalog-well-known-uri"><name>The api-catalog well-know | <dt>Reference:</dt><dd>RFC 9727</dd> | |||
n URI</name> | <dt>Status:</dt><dd>permanent</dd> | |||
<dt>Change Controller:</dt><dd>IETF</dd> | ||||
<t>This specification registers the "api-catalog" well-known URI in the | </dl> | |||
Well-Known URI Registry as defined by <xref target="WELL-KNOWN"/>.</t> | </section> | |||
<section anchor="the-api-catalog-link-relation"> | ||||
<t><list style="symbols"> | <name>The api-catalog Link Relation</name> | |||
<t>URI suffix: api-catalog</t> | <t>This specification registers the "api-catalog" link relation in the " | |||
<t>Change Controller: IETF</t> | Link Relation Types" registry by | |||
<t>Specification document(s): THIS-RFC</t> | following the procedures per <xref section="2.1.1.1" sectionFormat="of" | |||
<t>Status: permanent</t> | target="RFC8288"/>.</t> | |||
</list></t> | <dl spacing="compact" newline="false"> | |||
<dt>Relation Name:</dt><dd>api-catalog</dd> | ||||
</section> | <dt>Description:</dt><dd>Refers to a list of APIs available from the | |||
<section anchor="the-api-catalog-link-relation"><name>The api-catalog link relat | Publisher of the link context.</dd> | |||
ion</name> | <dt>Reference:</dt><dd>RFC 9727</dd> | |||
</dl> | ||||
<t>This specification registers the "api-catalog" link relation by | </section> | |||
following the procedures per section 2.1.1.1 of <xref target="WEB-LINKING"/></t> | ||||
<t><list style="symbols"> | ||||
<t>Relation Name: api-catalog</t> | ||||
<t>Description: Refers to a list of APIs available from the publisher | ||||
of the link context.</t> | ||||
<t>Reference: THIS-RFC</t> | ||||
</list></t> | ||||
</section> | ||||
<section anchor="the-api-catalog-profile-uri"><name>The api-catalog Profile URI< | ||||
/name> | ||||
<t>This specification registers "THIS-RFC-URL" in the "Profile URIs" | ||||
registry according to <xref target="RFC7284"/>.</t> | ||||
<t><list style="symbols"> | ||||
<t>Profile URI: THIS-RFC-URL</t> | ||||
<t>Common Name: API catalog</t> | ||||
<t>Description: A profile URI to request or signal a Linkset | ||||
representing an API catalog.</t> | ||||
<t>Reference: THIS-RFC</t> | ||||
</list></t> | ||||
<t>RFC Editor's Note: IANA is kindly requested to replace all instances | ||||
of THIS-RFC and THIS-RFC-URL with the actual RFC number/URL once | ||||
assigned.</t> | ||||
</section> | ||||
</section> | ||||
<section anchor="security"><name>Security Considerations</name> | ||||
<t>For all scenarios:</t> | ||||
<t><list style="symbols"> | <section anchor="the-api-catalog-profile-uri"> | |||
<t>TLS SHOULD be used, i.e. make /.well-known/api-catalog available | <name>The api-catalog Profile URI</name> | |||
exclusively over HTTPS, to ensure no tampering of the API catalog</t> | <t>This specification registers "https://www.rfc-editor.org/info/rfc9727 | |||
<t>The Publisher SHOULD take into account the Security Considerations | " in the "Profile URIs" | |||
from section 4 of <xref target="WELL-KNOWN"/>.</t> | registry according to <xref target="RFC7284"/>.</t> | |||
<t>The Publisher SHOULD perform a security and privacy review of the | <dl spacing="compact" newline="false"> | |||
API catalog prior to deployment, to ensure it does not leak personal, | <dt>Profile URI:</dt><dd>https://www.rfc-editor.org/info/rfc9727</dd> | |||
business or other sensitive metadata, nor expose any vulnerability | <dt>Common Name:</dt><dd>API catalog</dd> | |||
<dt>Description:</dt><dd>A Profile URI to request or signal a | ||||
Linkset representing an API catalog.</dd> | ||||
<dt>Reference:</dt><dd>RFC 9727</dd> | ||||
</dl> | ||||
</section> | ||||
</section> | ||||
<section anchor="security"> | ||||
<name>Security Considerations</name> | ||||
<t>For all scenarios:</t> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
<t>TLS <bcp14>SHOULD</bcp14> be used, i.e., make /.well-known/api-cata | ||||
log available | ||||
exclusively over HTTPS, to ensure no tampering of the API catalog.</t> | ||||
</li> | ||||
<li> | ||||
<t>The Publisher <bcp14>SHOULD</bcp14> take into account the security | ||||
considerations | ||||
from <xref section="4" sectionFormat="of" target="RFC8615"/>.</t> | ||||
</li> | ||||
<li> | ||||
<t>The Publisher <bcp14>SHOULD</bcp14> perform a security and privacy | ||||
review of the | ||||
API catalog prior to deployment to ensure it does not leak personal, | ||||
business, or other sensitive metadata, nor expose any vulnerability | ||||
related to the APIs listed.</t> | related to the APIs listed.</t> | |||
<t>The Publisher SHOULD enforce read-only privileges for external | </li> | |||
requests to .well-known/api-catalog, and for internal systems and | <li> | |||
<t>The Publisher <bcp14>SHOULD</bcp14> enforce read-only privileges fo | ||||
r external | ||||
requests to .well-known/api-catalog and for internal systems and | ||||
roles that monitor the .well-known/api-catalog URI. Write privileges | roles that monitor the .well-known/api-catalog URI. Write privileges | |||
SHOULD only be granted to roles that perform updates to the API | <bcp14>SHOULD</bcp14> only be granted to roles that perform updates to the API | |||
catalog and/or the forwarding rewrite rules for the | catalog and/or the forwarding rewrite rules for the | |||
.well-known/api-catalog URI.</t> | .well-known/api-catalog URI.</t> | |||
<t>As with any Web offering, it is RECOMMENDED to apply rate-limiting | </li> | |||
measures to help mitigate abuse and prevent Denial-of-Service | <li> | |||
<t>As with any Web offering, it is <bcp14>RECOMMENDED</bcp14> to apply | ||||
rate-limiting | ||||
measures to help mitigate abuse and prevent denial-of-service | ||||
attacks on the API catalog endpoint.</t> | attacks on the API catalog endpoint.</t> | |||
</list></t> | </li> | |||
</ul> | ||||
<t>For the public-facing APIs scenario: security teams SHOULD | <t>For the public-facing APIs scenario, security teams <bcp14>SHOULD</bcp1 | |||
4> | ||||
additionally audit the API catalog to ensure no APIs intended solely | additionally audit the API catalog to ensure no APIs intended solely | |||
for internal use have been mistakenly included. For example, a | for internal use have been mistakenly included. For example, a | |||
catalog hosted on <spanx style="verb">https://developer.example.com</spanx> shou ld not expose | catalog hosted on <tt>https://developer.example.com</tt> should not expose | |||
unnecessary metadata about any internal domains | unnecessary metadata about any internal domains | |||
(e.g. <spanx style="verb">https://internal.example.com</spanx>).</t> | (e.g., <tt>https://internal.example.com</tt>).</t> | |||
<t>For the internal/private APIs scenario, the Publisher <bcp14>SHOULD</bc | ||||
<t>For the internal/private APIs scenario: the Publisher SHOULD take | p14> take | |||
steps to ensure that appropriate controls - such as CORS policies and | steps to ensure that appropriate controls, such as Cross-Origin Resource Sharing | |||
access control lists - are in place to ensure only authorised roles | (CORS) policies and | |||
access control lists, are in place to ensure only authorised roles | ||||
and systems may access an internal api-catalog well-known URI.</t> | and systems may access an internal api-catalog well-known URI.</t> | |||
<t>A comprehensive API catalog that is regularly audited may assist | ||||
<t>A comprehensive API catalog that is regularly audited may assist | the Publisher in decommissioning "zombie" APIs, i.e., legacy/obsolete | |||
the Publisher in decommissioning 'zombie' APIs i.e., legacy/obsolete | ||||
APIs that should no longer be available. Such APIs represent a | APIs that should no longer be available. Such APIs represent a | |||
security vulnerability as they are unlikely to be supported, | security vulnerability as they are unlikely to be supported, | |||
monitored, patched or updated.</t> | monitored, patched, or updated.</t> | |||
<t>Note the registration of domain names and associated policies is out | ||||
<t>Note the registration of domain names and associated policies is out | ||||
of scope of this document.</t> | of scope of this document.</t> | |||
</section> | ||||
</section> | ||||
</middle> | </middle> | |||
<back> | <back> | |||
<displayreference target="RFC9110" to="HTTP"/> | ||||
<displayreference target="RFC8288" to="WEB-LINKING"/> | ||||
<displayreference target="RFC8615" to="WELL-KNOWN"/> | ||||
<displayreference target="I-D.kelly-json-hal" to="HAL"/> | ||||
<references> | ||||
<name>References</name> | ||||
<references anchor="sec-normative-references"> | ||||
<name>Normative References</name> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9 | ||||
110.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
615.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
288.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2 | ||||
119.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
174.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6 | ||||
573.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9 | ||||
264.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7 | ||||
284.xml"/> | ||||
</references> | ||||
<references anchor="sec-informative-references"> | ||||
<name>Informative References</name> | ||||
<references title='Normative References' anchor="sec-normative-references"> | <reference anchor="OAS" target="https://spec.openapis.org/oas/latest"> | |||
<front> | ||||
<reference anchor="HTTP"> | <title>OpenAPI Specification v3.1.0</title> | |||
<front> | <author initials="D" surname="Miller" role="editor"> | |||
<title>HTTP Semantics</title> | <organization/> | |||
<author fullname="R. Fielding" initials="R." role="editor" surname="Fielding | </author> | |||
"/> | <author initials="H" surname="Andrews" role="editor"> | |||
<author fullname="M. Nottingham" initials="M." role="editor" surname="Nottin | <organization/> | |||
gham"/> | </author> | |||
<author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/ | <author initials="J" surname="Whitlock" role="editor"> | |||
> | <organization/> | |||
<date month="June" year="2022"/> | </author> | |||
<abstract> | <author initials="L" surname="Mitchell" role="editor"> | |||
<t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level | <organization/> | |||
protocol for distributed, collaborative, hypertext information systems. This do | </author> | |||
cument describes the overall architecture of HTTP, establishes common terminolog | <author initials="M" surname="Gardiner" role="editor"> | |||
y, and defines aspects of the protocol that are shared by all versions. In this | <organization/> | |||
definition are core protocol elements, extensibility mechanisms, and the "http" | </author> | |||
and "https" Uniform Resource Identifier (URI) schemes.</t> | <author initials="M" surname="Quintero" role="editor"> | |||
<t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 723 | <organization/> | |||
3, 7235, 7538, 7615, 7694, and portions of 7230.</t> | </author> | |||
</abstract> | <author initials="M" surname="Kistler" role="editor"> | |||
</front> | <organization/> | |||
<seriesInfo name="STD" value="97"/> | </author> | |||
<seriesInfo name="RFC" value="9110"/> | <author initials="R" surname="Handl" role="editor"> | |||
<seriesInfo name="DOI" value="10.17487/RFC9110"/> | <organization/> | |||
</reference> | </author> | |||
<reference anchor="WELL-KNOWN"> | <author initials="R" surname="Ratovsky" role="editor"> | |||
<front> | <organization/> | |||
<title>Well-Known Uniform Resource Identifiers (URIs)</title> | </author> | |||
<author fullname="M. Nottingham" initials="M." surname="Nottingham"/> | <date year="2024" month="October" day="24"/> | |||
<date month="May" year="2019"/> | </front> | |||
<abstract> | <annotation>Latest version available at <eref | |||
<t>This memo defines a path prefix for "well-known locations", "/.well-kno | target="https://spec.openapis.org/oas/latest.html" brackets="angle"/>. | |||
wn/", in selected Uniform Resource Identifier (URI) schemes.</t> | </annotation> | |||
<t>In doing so, it obsoletes RFC 5785 and updates the URI schemes defined | </reference> | |||
in RFC 7230 to reserve that space. It also updates RFC 7595 to track URI schemes | ||||
that support well-known URIs in their registry.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8615"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8615"/> | ||||
</reference> | ||||
<reference anchor="WEB-LINKING"> | ||||
<front> | ||||
<title>Web Linking</title> | ||||
<author fullname="M. Nottingham" initials="M." surname="Nottingham"/> | ||||
<date month="October" year="2017"/> | ||||
<abstract> | ||||
<t>This specification defines a model for the relationships between resour | ||||
ces on the Web ("links") and the type of those relationships ("link relation typ | ||||
es").</t> | ||||
<t>It also defines the serialisation of such links in HTTP headers with th | ||||
e Link header field.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8288"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8288"/> | ||||
</reference> | ||||
<reference anchor="RFC2119"> | ||||
<front> | ||||
<title>Key words for use in RFCs to Indicate Requirement Levels</title> | ||||
<author fullname="S. Bradner" initials="S." surname="Bradner"/> | ||||
<date month="March" year="1997"/> | ||||
<abstract> | ||||
<t>In many standards track documents several words are used to signify the | ||||
requirements in the specification. These words are often capitalized. This docu | ||||
ment defines these words as they should be interpreted in IETF documents. This d | ||||
ocument specifies an Internet Best Current Practices for the Internet Community, | ||||
and requests discussion and suggestions for improvements.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="BCP" value="14"/> | ||||
<seriesInfo name="RFC" value="2119"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC2119"/> | ||||
</reference> | ||||
<reference anchor="RFC8174"> | ||||
<front> | ||||
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title> | ||||
<author fullname="B. Leiba" initials="B." surname="Leiba"/> | ||||
<date month="May" year="2017"/> | ||||
<abstract> | ||||
<t>RFC 2119 specifies common key words that may be used in protocol specif | ||||
ications. This document aims to reduce the ambiguity by clarifying that only UPP | ||||
ERCASE 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="RFC6573"> | ||||
<front> | ||||
<title>The Item and Collection Link Relations</title> | ||||
<author fullname="M. Amundsen" initials="M." surname="Amundsen"/> | ||||
<date month="April" year="2012"/> | ||||
<abstract> | ||||
<t>RFC 5988 standardized a means of indicating the relationships between r | ||||
esources on the Web. This specification defines a pair of reciprocal link relati | ||||
on types that may be used to express the relationship between a collection and i | ||||
ts members. This document is not an Internet Standards Track specification; it i | ||||
s published for informational purposes.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="6573"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC6573"/> | ||||
</reference> | ||||
<reference anchor="RFC9264"> | ||||
<front> | ||||
<title>Linkset: Media Types and a Link Relation Type for Link Sets</title> | ||||
<author fullname="E. Wilde" initials="E." surname="Wilde"/> | ||||
<author fullname="H. Van de Sompel" initials="H." surname="Van de Sompel"/> | ||||
<date month="July" year="2022"/> | ||||
<abstract> | ||||
<t>This specification defines two formats and associated media types for r | ||||
epresenting sets of links as standalone documents. One format is based on JSON, | ||||
and the other is aligned with the format for representing links in the HTTP "Lin | ||||
k" header field. This specification also introduces a link relation type to supp | ||||
ort the discovery of sets of links.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="9264"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC9264"/> | ||||
</reference> | ||||
<reference anchor="RFC7284"> | ||||
<front> | ||||
<title>The Profile URI Registry</title> | ||||
<author fullname="M. Lanthaler" initials="M." surname="Lanthaler"/> | ||||
<date month="June" year="2014"/> | ||||
<abstract> | ||||
<t>This document defines a registry for profile URIs to be used in specifi | ||||
cations standardizing profiles.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="7284"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC7284"/> | ||||
</reference> | ||||
</references> | ||||
<references title='Informative References' anchor="sec-informative-reference | <reference anchor="APIsjson" target="https://apisjson.org/format/apisjso | |||
s"> | n_0.19.txt"> | |||
<front> | ||||
<title>API Discovery Format</title> | ||||
<author initials="K" surname="Lane"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="S" surname="Willmott"> | ||||
<organization/> | ||||
</author> | ||||
<date year="2024" month="November" day="6"/> | ||||
</front> | ||||
<annotation>Latest version available at <eref | ||||
target="https://apisjson.org/" | ||||
brackets="angle"/>.</annotation> | ||||
</reference> | ||||
<reference anchor="OAS" target="https://spec.openapis.org/oas/latest"> | <!-- IESG State: Expired as of 02/05/25 --> | |||
<front> | <xi:include href="https://datatracker.ietf.org/doc/bibxml3/reference.I-D. | |||
<title>OpenAPI Specification 3.1.0</title> | kelly-json-hal.xml"/> | |||
<author initials="" surname="Darrel Miller"> | ||||
<organization></organization> | ||||
</author> | ||||
<author initials="" surname="Jeremy Whitlock"> | ||||
<organization></organization> | ||||
</author> | ||||
<author initials="" surname="Marsh Gardiner"> | ||||
<organization></organization> | ||||
</author> | ||||
<author initials="" surname="Mike Ralphson"> | ||||
<organization></organization> | ||||
</author> | ||||
<author initials="" surname="Ron Ratovsky"> | ||||
<organization></organization> | ||||
</author> | ||||
<author initials="" surname="Uri Sarid"> | ||||
<organization></organization> | ||||
</author> | ||||
<date year="2021" month="February" day="15"/> | ||||
</front> | ||||
</reference> | ||||
<reference anchor="APIsjson" target="http://apisjson.org/format/apisjson_0.16.tx | ||||
t"> | ||||
<front> | ||||
<title>APIs.json</title> | ||||
<author initials="" surname="Kin Lane"> | ||||
<organization></organization> | ||||
</author> | ||||
<author initials="" surname="Steve Willmott"> | ||||
<organization></organization> | ||||
</author> | ||||
<date year="2020" month="September" day="15"/> | ||||
</front> | ||||
</reference> | ||||
<reference anchor="HAL" target="https://datatracker.ietf.org/doc/html/draft-kell | ||||
y-json-hal-11"> | ||||
<front> | ||||
<title>JSON Hypertext Application Language</title> | ||||
<author initials="" surname="Mike Kelly"> | ||||
<organization></organization> | ||||
</author> | ||||
<date year="2020" month="September" day="15"/> | ||||
</front> | ||||
</reference> | ||||
<reference anchor="RESTdesc" target="http://apisjson.org/format/apisjson_0.16.tx | ||||
t"> | ||||
<front> | ||||
<title>RESTdesc</title> | ||||
<author initials="" surname="Ruben Verborgh"> | ||||
<organization></organization> | ||||
</author> | ||||
<author initials="" surname="Erik Mannens"> | ||||
<organization></organization> | ||||
</author> | ||||
<author initials="" surname="Rick Van de Walle"> | ||||
<organization></organization> | ||||
</author> | ||||
<author initials="" surname="Thomas Steiner"> | ||||
<organization></organization> | ||||
</author> | ||||
<date year="2023" month="September" day="15"/> | ||||
</front> | ||||
</reference> | ||||
<reference anchor="WebAPIext" target="https://webapi-discovery.github.io/rfcs/rf | ||||
c0001.html"> | ||||
<front> | ||||
<title>WebAPI type extension</title> | ||||
<author initials="" surname="Mike Ralphson"> | ||||
<organization></organization> | ||||
</author> | ||||
<author initials="" surname="Nick Evans"> | ||||
<organization></organization> | ||||
</author> | ||||
<date year="2020" month="July" day="08"/> | ||||
</front> | ||||
</reference> | ||||
<reference anchor="RFC8631"> | <reference anchor="RESTdesc" target="https://restdesc.org/about/descript | |||
<front> | ions"> | |||
<title>Link Relation Types for Web Services</title> | <front> | |||
<author fullname="E. Wilde" initials="E." surname="Wilde"/> | <title>RESTdesc</title> | |||
<date month="July" year="2019"/> | <author initials="R" surname="Verborgh"> | |||
<abstract> | <organization/> | |||
<t>Many resources provided on the Web are part of sets of resources that a | </author> | |||
re provided in a context that is managed by one particular service provider. Oft | <author initials="E" surname="Mannens"> | |||
en, these sets of resources are referred to as "Web services" or "Web APIs". Thi | <organization/> | |||
s specification defines link relations that represent relationships from Web ser | </author> | |||
vices or APIs to resources that provide documentation, descriptions, metadata, o | <author initials="R" surname="Van de Walle"> | |||
r status information for these resources. Documentation is primarily intended fo | <organization/> | |||
r human consumers, whereas descriptions are primarily intended for automated con | </author> | |||
sumers. Metadata provides information about a service's context. This specificat | <author initials="T" surname="Steiner"> | |||
ion also defines a link relation to identify status resources that are used to r | <organization/> | |||
epresent information about service status.</t> | </author> | |||
</abstract> | <date year="2025"/> | |||
</front> | </front> | |||
<seriesInfo name="RFC" value="8631"/> | </reference> | |||
<seriesInfo name="DOI" value="10.17487/RFC8631"/> | ||||
</reference> | ||||
<reference anchor="WebAPIext" target="https://webapi-discovery.github.io | ||||
/rfcs/rfc0001.html"> | ||||
<front> | ||||
<title>WADG0001 WebAPI type extension</title> | ||||
<author initials="M" surname="Ralphson" role="editor"> | ||||
<organization/> | ||||
</author> | ||||
<author initials="N" surname="Evans" role="editor"> | ||||
<organization/> | ||||
</author> | ||||
<date year="2020" month="July" day="08"/> | ||||
</front> | ||||
<refcontent>Draft Community Group Report</refcontent> | ||||
</reference> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
631.xml"/> | ||||
</references> | ||||
</references> | </references> | |||
<?line 568?> | <section anchor="api-catalog-example-linkset"> | |||
<name>Example API Catalog Documents</name> | ||||
<section anchor="api-catalog-example-linkset"><name>Example API catalog document | <t>This section is informative and provides and example of an API | |||
s</name> | ||||
<t>This section is informative and provides and example of an API | ||||
catalog document using the Linkset format.</t> | catalog document using the Linkset format.</t> | |||
<section anchor="api-catalog-example-rfc8615"> | ||||
<section anchor="api-catalog-example-rfc8615"><name>Using Linkset with RFC8615 r | <name>Using Linkset with Link Relations Defined in RFC 8631</name> | |||
elations</name> | <t>This example uses the Linkset format <xref target="RFC9264"/> and the | |||
following | ||||
<t>This example uses the Linkset format <xref target="RFC9264"/>, and the follow | ||||
ing | ||||
link relations defined in <xref target="RFC8631"/>:</t> | link relations defined in <xref target="RFC8631"/>:</t> | |||
<dl spacing="normal"> | ||||
<t><list style="symbols"> | <dt>"service-desc":</dt><dd>Used to link to a description of the API that | |||
<t>"service-desc", used to link to a description of the API that is | is primarily intended for machine consumption (for example, the <xref | |||
primarily intended for machine consumption (for example the <xref target="OAS">< | target="OAS"/> specification, YAML, or JSON file).</dd> | |||
/xref> | <dt>"service-doc":</dt><dd>Used to link to API documentation that is | |||
specification YAML or JSON file).</t> | primarily | |||
<t>"service-doc", used to link to API documentation that is primarily | ||||
intended for human consumption (an example of human-readable | intended for human consumption (an example of human-readable | |||
documentation is the IETF <eref target="https://datatracker.ietf.org/api/submiss | documentation is the IETF <eref target="https://datatracker.ietf.org/api/submiss | |||
ion">Internet-Draft submission API | ion" brackets="angle">Internet-Draft submission API | |||
instructions</eref>).</t> | instructions</eref>).</dd> | |||
<t>"service-meta", used to link to additional metadata about the API, | <dt>"service-meta":</dt><dd>Used to link to additional metadata abou | |||
and is primarily intended for machine consumption.</t> | t the API | |||
<t>"status", used to link to the API status (e.g. API "health" | and is primarily intended for machine consumption.</dd> | |||
indication etc.) for machine and/or human consumption.</t> | <dt>"status":</dt><dd>Used to link to the API status (e.g., API "hea | |||
</list></t> | lth" | |||
indication) for machine and/or human consumption.</dd> | ||||
<t>Client request:</t> | </dl> | |||
<t>Client request:</t> | ||||
<figure><sourcecode type="http-message"><![CDATA[ | <sourcecode type="http-message"><![CDATA[ | |||
GET .well-known/api-catalog HTTP/1.1 | GET .well-known/api-catalog HTTP/1.1 | |||
Host: example.com | Host: example.com | |||
Accept: application/linkset+json | Accept: application/linkset+json | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<t>Server response:</t> | ||||
<t>Server response:</t> | <sourcecode type="http-message"><![CDATA[ | |||
<figure><sourcecode type="http-message"><![CDATA[ | ||||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Date: Mon, 01 Jun 2023 00:00:01 GMT | Date: Mon, 01 Jun 2023 00:00:01 GMT | |||
Server: Apache-Coyote/1.1 | Server: Apache-Coyote/1.1 | |||
Content-Type: application/linkset+json; | Content-Type: application/linkset+json; | |||
profile="THIS-RFC-URL" | profile="https://www.rfc-editor.org/info/rfc9727" | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="ison"><![CDATA[ | ||||
<figure><artwork><![CDATA[ | ||||
{ | { | |||
"linkset": [ | "linkset": [ | |||
{ | { | |||
"anchor": "https://developer.example.com/apis/foo_api", | "anchor": "https://developer.example.com/apis/foo_api", | |||
"service-desc": [ | "service-desc": [ | |||
{ | { | |||
"href": "https://developer.example.com/apis/foo_api/spec", | "href": "https://developer.example.com/apis/foo_api/spec", | |||
"type": "application/yaml" | "type": "application/yaml" | |||
} | } | |||
], | ], | |||
skipping to change at line 915 ¶ | skipping to change at line 766 ¶ | |||
], | ], | |||
"service-doc": [ | "service-doc": [ | |||
{ | { | |||
"href": "https://apis.example.net/apis/cantona_api/doc", | "href": "https://apis.example.net/apis/cantona_api/doc", | |||
"type": "text/html" | "type": "text/html" | |||
} | } | |||
] | ] | |||
} | } | |||
] | ] | |||
} | } | |||
]]></artwork></figure> | ]]></sourcecode> | |||
</section> | ||||
</section> | <section anchor="api-catalog-example-linkset-bookmarks"> | |||
<section anchor="api-catalog-example-linkset-bookmarks"><name>Using Linkset with | <name>Using Linkset with Bookmarks</name> | |||
bookmarks</name> | <t>This example also uses the Linkset format <xref target="RFC9264"/> an | |||
d lists the | ||||
<t>This example also uses the Linkset format <xref target="RFC9264"/>, listing t | ||||
he | ||||
API endpoints in an array of bookmarks. Each link shares the same | API endpoints in an array of bookmarks. Each link shares the same | |||
context anchor (the well-known URI of the API catalog) and "item" | context anchor (the well-known URI of the API catalog) and "item" | |||
<xref target="RFC9264"/> link relation (to indicate they are an item in the | <xref target="RFC9264"/> link relation (to indicate they are an item in the | |||
catalog). The intent is that by following a bookmark link, a | catalog). The intent is that by following a bookmark link, a | |||
machine-client can discover the purpose and usage policy for each | machine client can discover the purpose and usage policy for each | |||
API, hence the document targeted by the bookmark link should support | API; hence, the document targeted by the bookmark link should support | |||
this.</t> | this.</t> | |||
<t>Client request:</t> | ||||
<t>Client request:</t> | <sourcecode type="http-message"><![CDATA[ | |||
<figure><sourcecode type="http-message"><![CDATA[ | ||||
GET .well-known/api-catalog HTTP/1.1 | GET .well-known/api-catalog HTTP/1.1 | |||
Host: example.com | Host: example.com | |||
Accept: application/linkset+json | Accept: application/linkset+json | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<t>Server response:</t> | ||||
<t>Server response:</t> | <sourcecode type="http-message"><![CDATA[ | |||
<figure><sourcecode type="http-message"><![CDATA[ | ||||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Date: Mon, 01 Jun 2023 00:00:01 GMT | Date: Mon, 01 Jun 2023 00:00:01 GMT | |||
Server: Apache-Coyote/1.1 | Server: Apache-Coyote/1.1 | |||
Content-Type: application/linkset+json; | Content-Type: application/linkset+json; | |||
profile="THIS-RFC-URL" | profile="https://www.rfc-editor.org/info/rfc9727" | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="json"><![CDATA[ | ||||
<figure><artwork><![CDATA[ | ||||
{ "linkset": | { "linkset": | |||
[ | [ | |||
{ "anchor": "https://www.example.com/.well-known/api-catalog", | { "anchor": "https://www.example.com/.well-known/api-catalog", | |||
"item": [ | "item": [ | |||
{"href": "https://developer.example.com/apis/foo_api"}, | {"href": "https://developer.example.com/apis/foo_api"}, | |||
{"href": "https://developer.example.com/apis/bar_api"}, | {"href": "https://developer.example.com/apis/bar_api"}, | |||
{"href": "https://developer.example.com/apis/cantona_api"} | {"href": "https://developer.example.com/apis/cantona_api"} | |||
] | ] | |||
} | } | |||
] | ] | |||
} | } | |||
]]></artwork></figure> | ]]></sourcecode> | |||
</section> | ||||
</section> | <section anchor="api-catalog-other-formats"> | |||
<section anchor="api-catalog-other-formats"><name>Other API catalog formats</nam | <name>Other API Catalog Formats</name> | |||
e> | <t>A non-exhaustive list of other API catalog document formats includes: | |||
</t> | ||||
<t>A non-exhaustive list of other API catalog document formats includes:</t> | <ul spacing="normal"> | |||
<li> | ||||
<t><list style="symbols"> | <t>An APIs.json document <xref target="APIsjson"/>.</t> | |||
<t>An APIs.json document <xref target="APIsjson"></xref>.</t> | </li> | |||
<t>A RESTDesc semantic description for hypermedia APIs <xref target="RESTdesc" | <li> | |||
></xref>.</t> | <t>A RESTDesc semantic description for hypermedia APIs <xref target= | |||
<t>A Hypertext Application Language document <xref target="HAL"></xref>.</t> | "RESTdesc"/>.</t> | |||
<t>An extension to the Schema.org WebAPI type <xref target="WebAPIext"></xref> | </li> | |||
.</t> | <li> | |||
</list></t> | <t>A Hypertext Application Language document <xref target="I-D.kelly | |||
-json-hal"/>.</t> | ||||
</section> | </li> | |||
<section anchor="api-catalog-example-linkset-nesting"><name>Nesting API catalog | <li> | |||
links</name> | <t>An extension to the Schema.org WebAPI type <xref target="WebAPIex | |||
t"/>.</t> | ||||
<t>In this example, a request to the /.well-known/api-catalog URI | </li> | |||
returns an array of links of relation type 'api-catalog'. This can be | </ul> | |||
useful to Publishers with a large number of APIs, who wish to group | </section> | |||
<section anchor="api-catalog-example-linkset-nesting"> | ||||
<name>Nesting API Catalog Links</name> | ||||
<t>In this example, a request to the /.well-known/api-catalog URI | ||||
returns an array of links of relation type "api-catalog". This can be | ||||
useful to Publishers with a large number of APIs who wish to group | ||||
them in smaller catalogs (as described in <xref target="scalability"/>).</t> | them in smaller catalogs (as described in <xref target="scalability"/>).</t> | |||
<t>Client request:</t> | ||||
<t>Client request:</t> | <sourcecode type="http-message"><![CDATA[ | |||
<figure><sourcecode type="http-message"><![CDATA[ | ||||
GET .well-known/api-catalog HTTP/1.1 | GET .well-known/api-catalog HTTP/1.1 | |||
Host: example.com | Host: example.com | |||
Accept: application/linkset+json | Accept: application/linkset+json | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<t>Server response:</t> | ||||
<t>Server response:</t> | <sourcecode type="http-message"><![CDATA[ | |||
<figure><sourcecode type="http-message"><![CDATA[ | ||||
HTTP/1.1 200 OK | HTTP/1.1 200 OK | |||
Date: Mon, 01 Jun 2023 00:00:01 GMT | Date: Mon, 01 Jun 2023 00:00:01 GMT | |||
Server: Apache-Coyote/1.1 | Server: Apache-Coyote/1.1 | |||
Content-Type: application/linkset+json; | Content-Type: application/linkset+json; | |||
profile="THIS-RFC-URL" | profile="https://www.rfc-editor.org/info/rfc9727" | |||
]]></sourcecode></figure> | ]]></sourcecode> | |||
<sourcecode type="json"><![CDATA[ | ||||
<figure><artwork><![CDATA[ | ||||
{ | { | |||
"linkset": [ | "linkset": [ | |||
{ | { | |||
"anchor": "https://www.example.com/.well-known/api-catalog", | "anchor": "https://www.example.com/.well-known/api-catalog", | |||
"api-catalog": [ | "api-catalog": [ | |||
{ | { | |||
"href": "https://apis.example.com/iot/api-catalog" | "href": "https://apis.example.com/iot/api-catalog" | |||
}, | }, | |||
{ | { | |||
"href": "https://ecommerce.example.com/api-catalog" | "href": "https://ecommerce.example.com/api-catalog" | |||
}, | }, | |||
{ | { | |||
"href": "https://developer.example.com/gaming/api-catalog" | "href": "https://developer.example.com/gaming/api-catalog" | |||
} | } | |||
] | ] | |||
} | } | |||
] | ] | |||
} | } | |||
]]></sourcecode> | ||||
]]></artwork></figure> | </section> | |||
</section> | ||||
</section> | <section anchor="acknowledgements" numbered="false"> | |||
</section> | <name>Acknowledgements</name> | |||
<section anchor="acknowledgements"><name>Acknowledgements</name> | <t>Thanks to <contact fullname="Jan Algermissen"/>, <contact | |||
fullname="Phil Archer"/>, <contact fullname="Tim Bray"/>, <contact | ||||
<t>Thanks to Jan Algermissen, Phil Archer, Tim Bray, Ben Bucksch, Sanjay | fullname="Ben Bucksch"/>, <contact fullname="Sanjay Dalal"/>, <contact | |||
Dalal, David Dong, Erik Kline, Mallory Knodel, Murray Kucherawy, Max | fullname="David Dong"/>, <contact fullname="Erik Kline"/>, <contact | |||
Maton, Darrel Miller, Mark Nottingham, Roberto Polli, Joey Salazar, | fullname="Mallory Knodel"/>, <contact fullname="Murray Kucherawy"/>, | |||
Rich Salz, Herbert Van De Sompel, Orie Steele, Tina Tsou, | <contact fullname="Max Maton"/>, <contact fullname="Darrel Miller"/>, | |||
Gunter Van Der Velde, Eric Vyncke, and Erik Wilde for their reviews, | <contact fullname="Mark Nottingham"/>, <contact fullname="Roberto | |||
suggestions and support.</t> | Polli"/>, <contact fullname="Joey Salazar"/>, <contact fullname="Rich | |||
Salz"/>, <contact fullname="Herbert Van De Sompel"/>, <contact | ||||
</section> | fullname="Orie Steele"/>, <contact fullname="Tina Tsou"/>, <contact | |||
fullname="Gunter Van de Velde"/>, <contact fullname="Éric Vyncke"/>, | ||||
and <contact fullname="Erik Wilde"/> for their reviews, suggestions, and | ||||
support.</t> | ||||
</section> | ||||
</back> | </back> | |||
<!-- ##markdown-source: | ||||
H4sIAAAAAAAAA+0923IbN5bvrOI/YOgHS1mSkpybw/FkRrGUWLEuHkmOK5VK | ||||
xSAJkj1qdnMa3ZIZleZb9lv2y/bcgAaaFzueZHcfdnZmLXU3gIODc79AvV6v | ||||
3SqTMjUD1dGLpDfSpU7z6UBpdWfStHeT5XeZen15onQ2VmmS3ajCpLpM8kyV | ||||
uZqZdKHGiR3lt6ZYqnyiDl+d2E67pYfDwtzCNPWcjQnbrXE+yvQcVh4XelL2 | ||||
ElNOerOyXOCYYFxv/yl8q0v48P7o8Pr4AWYvjB6ok+Prb9st+MpM82I5ULYc | ||||
t1vtVrIoBqosKls+2d//av9Ju3Vjlnd5MR6oJCtNkZmyRyvix7aEff0Cy2Qw | ||||
/dJYeDLXRfnLP6u8NHagsrzdWiQD9VOZj7qw41GSjU1WdpXNi7IwEws/Lefy | ||||
Q1kkI3g1yucLLT/M4WN4lWSAOvMzrnhrssoM2i2lpkVeLQDv31RJOk6yqfom | ||||
zUc3Vk3yQr24vn7lcKlUuVzgAb3Jixv87jscSC/mOknhhWDtb4jCfl5M6Z0u | ||||
RjN5Zwd7e/gpPkpuTd99t4cP9oZFfmfNnkyyR4OnSTmrhjCcTuVu6g5mLzgY | ||||
+hBowdgyWKcxoM8z9ZM8HLq3/cj7s3KedhBbuipneYHo6uFqCjAJp/Kyr67m | ||||
MC8/YiJ6aW6TLHwM+9NZ8ivR6kD9kI/1BE6Z3xlG3A2O6Vsc87db+aAPp8Yf | ||||
VQUcvNvW3d1dP/6k3cryYg7T3/Jx4pEN1OW3z786ONjHB2+OT097L88v3pzT | ||||
46dfHHzOj7/pnZ6cvzw5/46fP3n6lOg2m0TzXRxeDRgQYdCLhcmAJNTVwoyS | ||||
STJiLvy0f9Df5++YSZ7sPzno7T/p8WowWhdTU9Y7sTC8n8NcgHBLVJBru8fn | ||||
yCNqpMN/eozyI10A46uzJE1NEb353hRmvlRvZgAl0G/07kwXdqa+0wXQd2PY | ||||
WXJj1KVOFzObZ9GbS9jVpS7zW3uzjF68LhJ1pYuE2FwRe/wDBsdYwqf9f/g5 | ||||
PU72e/tfrcUJoAQxgUMIG3wK/tkv+/2DL/rluy24eQmEd6odbcnDq9LcGvUG | ||||
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 | ||||
</rfc> | </rfc> | |||
End of changes. 108 change blocks. | ||||
1033 lines changed or deleted | 660 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |