<?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.31 (Ruby 3.2.3) -->
<?rfc strict="yes"?>
<?rfc compact="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ramos-asdf-api-translation-02" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.32.0 -->
  <front>
    <title abbrev="SDF for API translation">Semantic Definition Format (SDF) for API translation</title>
    <seriesInfo name="Internet-Draft" value="draft-ramos-asdf-api-translation-02"/>
    <author initials="E." surname="Ramos" fullname="Edgar Ramos">
      <organization>Ericsson</organization>
      <address>
        <postal>
          <street>Hirsalantie 11</street>
          <city>02420 Jorvas, Kirkkonummi</city>
          <country>Finland</country>
        </postal>
        <email>edgar.ramos@ericsson.com</email>
      </address>
    </author>
    <date year="2026" month="March" day="13"/>
    <area>Applications</area>
    <workgroup>ASDF Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 77?>
<t>This document defines an extension to the Semantic Definition Format (SDF) that enables API translation between applications and devices. The translation enables clarification of complex syntax for a service or device to utilize a different API from the one that was first designed to use.</t>
    </abstract>
  </front>
  <middle>
    <?line 80?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>In many cases, a service needed by an application can be provided through APIs by several suppliers. Semantic matching can be used to map the needs of the applications and adapt API calls to what the service suppliers could provide. The main purpose of this document is to describe methods that enable the translation of one device or application API to another equivalent API, utilizing syntax understandable by the deploying party.</t>
      <t>An API translator from the original API to the updated one or even mapping to a new service would allow an automatic adaptation to the target API. Also, it would enable the possibility to adapt to multiple APIs with the same data model, enabling the deployment of services from multiple sources. This feature enables use cases such as the usage of the cheapest or most robust service, deployment of national services when traveling, and execution of device services even from a different ecosystem origin.</t>
      <t>This document provides enabling elements for communication from devices or applications belonging to different ecosystems that do not share the same semantic modelling. Utilizing SDF syntax enhanced with an API format depiction, it is possible to provide an API description that is understandable with the syntax known by the device or application, if such semantics are defined in their data model. The final result uses a navigable description of the API's functions to provide the necessary information that is required by a device application to map external required services, their parameters, and results to an application logic using ontologically defined objects that can be matched to remote calls in another device application, for example.</t>
      <t>The API requires a mapping in applications functions by matching syntax in addition to the actual discovery of the API; therefore, the importance of the translation to an understandable model. This matching could be enabled by several mechanisms described, and it is dynamically adjusted to every new interface faced. Using SDF in conjunction with the given schema allows an automated way to match functionality to application intents.</t>
      <artwork><![CDATA[
┌──────────────────────┐                  ┌──────────────────────┐    
│                      │                  │                      │
│  Service platform    │                  │  Service platform    │
│        #1            │                  │        #2            │
│                      │                  │                      │
│       ┌──────────────┐                  │       ┌──────────────┐
│       │ Service API  ┼──┐               │       │ Service API  │
└───────└─────▲────────┘  │               └───────└─────▲──┬─────┘
              │           │                             │  │     
              │           │         ┌───────────┐       │  │      
              │           ▼───┐     │ SDF-API   │       │  │      
              └───────────┤   │     │TRANSLATION│       │  │      
                          │   ┼─────►  MODEL    ├───────┘  │      
                          │   ◄─────┐           ◄──────────┘      
                          └───┘     └───────────┘                 
                         Device                                   
]]></artwork>
      <t><strong>Example of a device using the API translation model to access the same service in a different platform with a different API</strong></t>
      <section anchor="terminology">
        <name>Terminology</name>
        <t>The definitions of <xref target="I-D.ietf-asdf-sdf"/> apply.
  The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in <xref target="RFC2119"/>. 
  As explained in <xref target="RFC8174"/> the words apply when, and only when, they appear in all capitals, as shown here.</t>
      </section>
    </section>
    <section anchor="discoverable-api-interfaces">
      <name>Discoverable API interfaces</name>
      <t>A device or application may expose its capabilities as an API list. This could be acquired in real-time by calling a command that provides such a list of commands. For example, the resource “.well-known/commands” <xref target="RFC8615"/> could be used as a specific way to request all the commands available. The reply then includes a list of the different API supported calls, which would be called in a hierarchical way from the root domain that is provided by the device, an application, or a mediating platform.
The reply would contain a description of the supported API with a semantic definition attached. Using the Semantic Definition Format (SDF), a reply for two commands may include what is given in the following example:</t>
      <sourcecode type="json"><![CDATA[
{
  "namespace": {
    "name": "Relevant_URL_or_namespace_used_as_semantic_reference_(example)",
    "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns",
    "demo": "https://example.com/iss-demo-setup/#",
  },
  "defaultNamespace": "demo",
  "sdfObject": {
    "target_object": {
      "sdfProperty": {
        "target_property": {
          "description": "possible description of the property",
          "sdfRelation": {
            "FeedType": {
              "relType": "rdf:type",
              "target": [
                "demo:Output"
              ]
            }
          },
          "contentFormat": "application/typeofcontent-info"
        }
      },
      "sdfAction": {
        "Name_of_the_command_1": {
          "description": "Description of the command and input required",
          "sdfRelation": {
            "FeedType": {
              "relType": "rdf:type",
              "target": "demo:command1"
            }
          },
          "sdfInputData": {
            "type": "object",
            "properties": {
              "input_1_required": {
                "description": "Description of what element is needed as first input",
                "sdfRelation": {
                  "FeedType": {
                    "relType": "rdf:type",
                    "target": [
                      "demo:input1"                    ]
                  }
                },
                "type": "number",
                "sdfChoice": {
                  "input_2_required": {
                    "description": "A number needed as an input of the command",
                    "const":"0",
                    "sdfRelation": {
                      "FeedType": {
                        "relType": "rdf:type",
                        "target": [
                          "demo":"input2",
                        ]
                      }
                    }
                  }
                }
              }
            }
          },
          "sdfOutputData": {
            "contentFormat": "application/typeofcontent-info"
          }
        },
        "Name_of_the_command_2": {
          "sdfRelation": {
            "FeedType": {
              "relType": "rdf:type",
              "target": "demo:command2"
            }
          },
          "sdfInputData": {
            "description": "Description of input required for second command",
            "sdfRelation": {
              "FeedType": {
                "relType": "rdf:type",
                "target": "demo:secondInput"
              }
            },
            "type": "typeoftheinput",
            "contentFormat": "application/typeofinput-info"
          }
        }
      }
    }
  }
}

]]></sourcecode>
      <t>In this example, one service is defined with a command1, which requires an input1 (an object) and input2 (a number). The other service requires a different call (command2), which requires only one input (secondInput).</t>
      <t>Further interaction capabilities can be included either in the initial response, as shown above in the "sdfAction" block, or could be discovered by further requests. For example, the descriptions of the two actions detailed above show if they require input, what the details of such input and the output are, and if there is additional information related to the nature of the output. Also, the description field could be tailor-made to provide a URI to a vocabulary that is understandable by the device or application. In this way, the device or application could make sense of the possible options, parameters, and actions that the command provides or requires.</t>
    </section>
    <section anchor="inputting-parameters-to-the-api">
      <name>Inputting parameters to the API</name>
      <t>Once the available function calls and input parameters required by the API have been provisioned to the requester device or application, it can make calls to the API when required by its application logic. The application would map the “need for a capability” to the concrete capability provided by the provider application or device through matching the syntax and data model. The functions are then mapped to the calls that the application can handle and has defined syntax. The parts of the API that are not understood by the requester device are normally ignored. The mapping semantics from a target device or application may be communicated to the application of the requesting device using an SDF mapping extension draft <xref target="bormann-mapping"/>. In such mapping, the actions and data can be expressed using the data model that are understandable by the requester and allows it to produce the API call and provide the required data. The only problem with this mapping is that if the API call structure is different, the logic required to call the target API might be complicated for certain device applications.</t>
      <t>With SDF notation, it is possible to explain the data model but not the mapping for a specific API call. That would require, in some cases, mapping of values and, depending on the API definition, reshuffling of the parameters or even the URI utilized.</t>
      <t>To tackle those challenges, we introduced a new SDF quality that can express URL template patterns from <xref target="RFC6570"/>. The quality <strong>"template-href"</strong>, includes the URL or the URL pattern that matches the command known by the requester device application. As explained in <xref target="RFC6570"/>, the pattern may have variable terms, which are also given an SDF definition and relationship so the requested device can understand how to map its own data model to what the target API requires. Also, we introduce a value mapper <strong>"template-value"</strong> that enables mapping of values to parameters in the target API. The <strong>sdfRelation</strong> <xref target="I-D.ietf-asdf-sdf"/> is used as a vehicle to support the mapping between APIs.</t>
      <t>The namespace <strong>"cmd"</strong> MUST be utilized to provide this API mapping values. 
In this example, we map a command_1 with several inputs to a command_2 that utilizes the inputs in a different way. The schema maps semantically the inputs and instructs the system how to make the API call based on the previously known API.</t>
      <sourcecode type="json"><![CDATA[
  {
 "info":{
    "title": "API mapping of two systems"
  },
  "namespace": {
    "targetSem": "https://example.org/targetSemantics/#",
    "targetDev": "https://example.org/targetDevice",
    "requestDev": "https://example.com/requesterDevice",
    "requestSem": "https://example.com/destinationSemantics/#"
  },
  "defaultNamespace": "requestSem",
  "sdfData": {
    "input_2_required": {
      "type": "number",
      "sdfChoice": {
        "requesterSemantic_1": {
          "const": 1
        },
        "requesterSemantic_2": {
          "const": 2
        }
      },
      "sdfRelation": {
        "FeedType": {
          "relType": "rdf:type",
          "target": [
            "targetDev:#/sdfObject/target_object/sdfAction/Name_of_the_command_1/sdfInputData/input2",
            "requestDev:#/sdfObject/request_object/sdfAction/requester_command/sdfInputData/semanticRequesterInput"
          ]
        }
      }
    }
  },
  "map": {
    "#/sdfObject/request_object/sdfAction/requester_command": {
      "cmd:template-href": "https://example.org/targetDevice/control/Name_of_the_command_1?input1={input_2_required}&input2={input_1}",
      "sdfRelation": {
        "FeedType": {
          "relType": "rdf:type",
          "target": [
            "targetDev:#/sdfObject/target_object/sdfAction/Name_of_the_command_1",
            "requestSem:requester_command"
          ]
        }
      }
    },
    "cmd :template-values": {
      "input2": "#/sdfData/input_1_required",
      "input1": "#/sdfObject/target_object/sdfAction/name_of_command1/sdfInputData/input_1"
    },
    "#/sdfObject/request_object/sdfAction/requester_command_2": {
      "cmd:template-href": "https://example.org/targetDevice/control/Name_of_the_command_2?secondInput={requesterSecondInput}",
      "sdfRelation": {
        "FeedType": {
          "relType": "rdf:type",
          "target": "targetDev:#/sdfObject/target_object/sdfAction/Name_of_the_command_2"
        }
      }
    },
    "cmd:template-values": {
      "secondInput": "#/sdfObject/request_object/sdfAction/requester_command_2/sdfInputData/requesterSecondInput"
    }
  }
}
]]></sourcecode>
    </section>
    <section anchor="methods-on-the-api-calls">
      <name>Methods on the API calls</name>
      <t>Sometimes, only calling an API is not enough. For example, in some cases, the API call requires additional actions such as submitting a payload. To handle this dimension on the API calls, the <strong>method</strong> command has been introduced.  This command SHALL enable the requested device to understand how to handle the API call, since in the previous example, the API URL has all the information required in the call itself. However, in some cases, the action necessary with the API may need to be specified in a manner that the requested device can understand. The keyword <strong>method</strong> is meant to describe how MUST be handled the API URL and what to expect of it. In some other examples, the <strong>method</strong> could result in an OBSERVE or another type of new action not yet specified, for example, how to address an XR-type application.</t>
      <t>An example could be the use of an LWM2M camera <xref target="lwm2m-cameraObject"/>. To use this model, a payload has to be submitted in the POST method. The following example describes such a translation from one camera API to the LWM2M model.</t>
      <sourcecode type="json"><![CDATA[
{
    "info": {
      "title": "LwM2M Camera Device to Requester dev. Application API mapping"
    },
    "namespace": {
      "sdm": "https://sdm.wide.ad.jp/sdmo/#/",
      "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns",
      "oma": "https://onedm.org/ecosystem/oma",
      "dev": "http://traffic-light202125.traffic-center.fi/10340/0/",
      "app": "http://owner.mycar.fi/"
    },
    "defaultNamespace": "dev",
    "map": {
      "#/sdfObject/video/sdfAction/playStream": {
        "cmd:template-href": "http://traffic-light202125.traffic-center.fi/10340/0/101",
        "cmd:method":"POST",
        "description": "Starts the recording of the camera",
        "sdfInputData": {
            "type": "number",
            "const":1
         },
        "sdfRelation": {
            "FeedType": {
            "relType": "rdf:type",
             "target": [
                "dev:#/sdfObject/Camera/sdfAction/Local_Recording_Control",
                "oma:#/sdfObject/10340/101",
                "sdm:playStream"              ]
            }
          }    
      },
      "#/sdfObject/video/sdfAction/StopStream": {
        "cmd:template-href": "http://traffic-light202125.traffic-center.fi/10340/0/101",
        "cmd:method":"POST",
        "description": "Stops the recording of the camera",
        "sdfInputData": {
              "type": "number",
              "const":0
        },
        "sdfRelation": {
          "FeedType": {
          "relType": "rdf:type",
          "target": [
            "dev:#/sdfObject/Camera/sdfAction/Local_Recording_Control",
            "oma:#/sdfObject/10340/101",
            "sdm:stopStream"
          ]
          }
        }
      },
      "#/sdfObject/Camera/sdfProperty/Input-video-stream":{  
        "cmd:template-href": "http://traffic-light202125.traffic-center.fi/10340/0/9",
        "sdfRelation": {
          "FeedType": {
            "relType": "rdf:type",
            "target": [
              "dev:#/sdfObject/Camera/sdfProperty/Recording_Location",
              "sdm:VideoMedia"
            ]
          }
       }
     }
    }
 } 
]]></sourcecode>
    </section>
    <section anchor="matching-api-to-application-logic">
      <name>Matching API to application logic</name>
      <t>Each application has a logic that requires either information from the API call or the execution of a service. With this translation tool, the application logic may need to consider the different types of APIs that may be present. For example, if the API requires a payload or the info is directly appended to the call. Also, on the way the API produces the output, and how to handle it.</t>
    </section>
    <section anchor="ontologies-describing-apis">
      <name>Ontologies describing APIs</name>
      <t>Every application domain has an ontology or vocabulary that indicates actions and their parameters. These actions can be translated to APIs but they do not necessarily explain the API itself. Just the result of the API action.</t>
      <t>Some ontologies describing APIs may need to be involved in some cases. Such as W3C Web of Things (WoT) Thing Description (TD)<xref target="wot"/>, Hydra Core Vocabulary (for hypermedia Web APIs) <xref target="hydra"/> and others with less focus in APIs but relevant like OWL S / WSMO (Semantic Web Services) <xref target="owls"/>, schema.org Actions <xref target="schema"/> and OGC SensorThings API <xref target="ogc"/> .</t>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document has the following actions for IANA.</t>
      <t>Note to RFC Editor: Please replace all occurrences of "{XXXX}" with the RFC number of this specification and delete this paragraph.</t>
      <section anchor="media-type">
        <name>Media Type</name>
        <t>IANA is requested to add the following Media-Type to the "Media Types registry <xref target="IANA.media-types"/>. --&gt;</t>
        <table align="left" anchor="new-media-type">
          <name>A media type for SDF mapping files</name>
          <thead>
            <tr>
              <th align="left">Name</th>
              <th align="left">Template</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">sdf-mapping+json</td>
              <td align="left">application/ sdf-mapping+json</td>
              <td align="left">RFC XXXX, section 5.1</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>Some wider issues are discussed in <xref target="RFC8576"/>.</t>
    </section>
    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>Thanks to Ari Keränen for the support in realizing this idea.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="I-D.ietf-asdf-sdf">
          <front>
            <title>Semantic Definition Format (SDF) for Data and Interactions of Things</title>
            <author fullname="Michael Koster" initials="M." surname="Koster">
              <organization>KTC Control AB</organization>
            </author>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <author fullname="Ari Keränen" initials="A." surname="Keränen">
              <organization>Ericsson</organization>
            </author>
            <date day="13" month="October" year="2025"/>
            <abstract>
              <t>   The Semantic Definition Format (SDF) is concerned with Things, namely
   physical objects that are available for interaction over a network.
   SDF is a format for domain experts to use in the creation and
   maintenance of data and interaction models that describe Things.  An
   SDF specification describes definitions of SDF Objects/SDF Things and
   their associated interactions (Events, Actions, Properties), as well
   as the Data types for the information exchanged in those
   interactions.  Tools convert this format to database formats and
   other serializations as needed.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-asdf-sdf-25"/>
        </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 document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="IANA.media-types" target="https://www.iana.org/assignments/media-types">
          <front>
            <title>Media Types</title>
            <author>
              <organization>IANA</organization>
            </author>
          </front>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC8576">
          <front>
            <title>Internet of Things (IoT) Security: State of the Art and Challenges</title>
            <author fullname="O. Garcia-Morchon" initials="O." surname="Garcia-Morchon"/>
            <author fullname="S. Kumar" initials="S." surname="Kumar"/>
            <author fullname="M. Sethi" initials="M." surname="Sethi"/>
            <date month="April" year="2019"/>
            <abstract>
              <t>The Internet of Things (IoT) concept refers to the usage of standard Internet protocols to allow for human-to-thing and thing-to-thing communication. The security needs for IoT systems are well recognized, and many standardization steps to provide security have been taken -- for example, the specification of the Constrained Application Protocol (CoAP) secured with Datagram Transport Layer Security (DTLS). However, security challenges still exist, not only because there are some use cases that lack a suitable solution, but also because many IoT devices and systems have been designed and deployed with very limited security capabilities. In this document, we first discuss the various stages in the lifecycle of a thing. Next, we document the security threats to a thing and the challenges that one might face to protect against these threats. Lastly, we discuss the next steps needed to facilitate the deployment of secure IoT systems. This document can be used by implementers and authors of IoT specifications as a reference for details about security considerations while documenting their specific security challenges, threat models, and mitigations.</t>
              <t>This document is a product of the IRTF Thing-to-Thing Research Group (T2TRG).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8576"/>
          <seriesInfo name="DOI" value="10.17487/RFC8576"/>
        </reference>
        <reference anchor="RFC8615">
          <front>
            <title>Well-Known Uniform Resource Identifiers (URIs)</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="May" year="2019"/>
            <abstract>
              <t>This memo defines a path prefix for "well-known locations", "/.well-known/", in selected Uniform Resource Identifier (URI) schemes.</t>
              <t>In doing so, it obsoletes RFC 5785 and updates the URI schemes defined in RFC 7230 to reserve that space. It also updates RFC 7595 to track URI schemes that support well-known URIs in their registry.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8615"/>
          <seriesInfo name="DOI" value="10.17487/RFC8615"/>
        </reference>
        <reference anchor="RFC6570">
          <front>
            <title>URI Template</title>
            <author fullname="J. Gregorio" initials="J." surname="Gregorio"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="M. Hadley" initials="M." surname="Hadley"/>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="D. Orchard" initials="D." surname="Orchard"/>
            <date month="March" year="2012"/>
            <abstract>
              <t>A URI Template is a compact sequence of characters for describing a range of Uniform Resource Identifiers through variable expansion. This specification defines the URI Template syntax and the process for expanding a URI Template into a URI reference, along with guidelines for the use of URI Templates on the Internet. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6570"/>
          <seriesInfo name="DOI" value="10.17487/RFC6570"/>
        </reference>
        <reference anchor="bormann-mapping" target="https://datatracker.ietf.org/doc/draft-bormann-asdf-sdf-mapping/">
          <front>
            <title>Semantic Definition Format (SDF): Mapping files</title>
            <author initials="C. B. and J." surname="Romann" fullname="Carsten Bormann and Jan Romann">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="lwm2m-cameraObject" target="https://raw.githubusercontent.com/OpenMobileAlliance/lwm2m-registry/prod/10340.xml">
          <front>
            <title>Camera - OMAobjectId: 10340 V1.0</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="wot" target="https://www.w3.org/TR/wot-thing-description11/">
          <front>
            <title>Web of Things (WoT) Thing Description 1.1</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="hydra" target="https://www.hydra-cg.com/spec/latest/core/">
          <front>
            <title>Hydra Core Vocabulary</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="owls" target="https://www.w3.org/submissions/OWL-S/">
          <front>
            <title>OWL-S: Semantic Markup for Web Service</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="schema" target="https://schema.org/Action">
          <front>
            <title>Schemas from schema.org</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="ogc" target="https://www.ogc.org/standards/sensorthings/">
          <front>
            <title>OGC SensorThings API Standard</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
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
5gyYTLDy1hU8wKYA92CUYRllDAzbrcqSSTYF7i4NshP8wIy+g5VYO+KwXylS
IgaeDD7b+FzPs0KL6Y5TZxeb4HdJcvXbAA9PEXmimMUDqWvtV1w7qEuSAnHc
eSMSgIOjKPZtGLgWS6BQFJswg4Nr7THo7/ADBNng1xG9VDxfgKeC4mtH+YcB
06wmg05GgG3l6Ucm8tyapMg/Nuc6BAWJDaibPYoi5g2rRLSGwEAoH0TfglVi
8moCHg15jIHeJAAg8V8R6KGxOgj4gxP/rZCoVJBpjOaHvT82/caz/aiswZqF
CjBwJA6cSffkJKYYwfA59Rv4u3/vpx/+5acfvv8f//M71fj7kCsjnL9tbsHb
tLy4abSsJT69WoCEoBbfvNaG0RW4HgzfBa4Ho3a4PiSO8vWd+NDKyfddqwrH
bx0Z0V7Agz9t2vTGWYTdDxu2bDz//X9shu8PbVR8r7X/vbl2PY1S3Wkj9/z3
dtDdl7obg37nz3TTb9nl939qrEDM2X3WI8bUmHbTupsI7P/zR29F+O/J0c6L
4/2dk+eHL+66TxMXT+IcC/9TqYPD3b19HvXjHSTlDvv86z/fqFdt75sb3r7X
D40Jd6PtHxpr3bDPLvsAt//ZI2Vra4/dAzyInQvE3omc3pWzmY5hOqpCdKx8
v5X1Hj0Dz+l1Npi91GpQvrVFsfUDdaLzeZyiK7SG2Loov11z3uRkJq5jbPO1
6k0jl3xKx+e6bydc6DXEUDlEnp2DV8cnnS7/V704pM9He//46vnR3i5+Pv5y
Z3/ffbAjjr88fLW/W34qZz49PDjYe7HLkw92/qnDjkXn8CXK/M5+hx1cP7wg
Jz9DX4XcikWu0R0IPOcE57yRjO1pn7i8A9HIWyCh9ZnfSBL3lOjOyBHSFCcx
EFnqvsKgNb7XQU58SRLwGhdxESTopULYNkM/Hl2zPqfrMdGxKw4ceV3IfucG
GYqYNwTpc3BsAFZMCMTgu8I+AYWqMTqZxgYbSWwKceKc7xaE4lMDiLkOkl4R
zylqR98M5TCg4AtxI4/YBWocddKakiPCQeAxPSu9XvY3wdOlSFb99P2P/RWE
VT0KYQZ2yk/f/xvT9tPh49MSMsqqIPAK05OYkLL+G/rPGNYiSSnOlYVUcBnE
CZKOw5lcI3MKDGLjNEyWEbncFmIKnypZKsy6gGcM25J73wVGxoDkykKET5lS
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

-->

</rfc>
