<?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.30 (Ruby 3.4.6) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-ietf-asdf-nipc-19" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="NIPC">An Application Layer Interface for Non-Internet-Connected Physical Components (NIPC)</title>

    <author initials="B." surname="Brinckman" fullname="Bart Brinckman">
      <organization>Cisco Systems</organization>
      <address>
        <postal>
          <city>Brussels</city>
          <country>Belgium</country>
        </postal>
        <email>bbrinckm@cisco.com</email>
      </address>
    </author>
    <author initials="R." surname="Mohan" fullname="Rohit Mohan">
      <organization>Cisco Systems</organization>
      <address>
        <postal>
          <street>170 West Tasman Drive</street>
          <city>San Jose</city>
          <code>95134</code>
          <country>USA</country>
        </postal>
        <email>rohitmo@cisco.com</email>
      </address>
    </author>
    <author initials="B." surname="Sanford" fullname="Braeden Sanford">
      <organization>Philips</organization>
      <address>
        <postal>
          <city>Cambridge</city>
          <country>USA</country>
        </postal>
        <email>braeden.sanford@philips.com</email>
      </address>
    </author>

    <date year="2026" month="April" day="21"/>

    
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 70?>

<t>This document describes an API that allows applications to perform operations against a gateway serving one or more devices described by an SDF model. The API consists of a RESTful application layer interface that performs operations on those devices, as well as a CBOR-based publish-subscribe interface for streaming data.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-asdf-nipc/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        A Semantic Definition Format for Data and Interactions of Things Working Group mailing list (<eref target="mailto:asdf@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/asdf/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/asdf/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-asdf/asdf-nipc"/>.</t>
    </note>


  </front>

  <middle>


<?line 74?>

<section anchor="introduction"><name>Introduction</name>

<section anchor="motivation"><name>Motivation</name>

<t>Low‑power sensors, actuators, and other connected devices deployed for building management, healthcare, workplace, manufacturing, logistics, and hospitality use cases are often resource and battery constrained. Many lack native IP connectivity and instead attach via heterogeneous non‑IP operational networks. Common non‑IP protocols include BLE <xref target="BLE53"/> and Zigbee <xref target="Zigbee22"/>. When IP is available, constrained application protocols such as CoAP <xref target="RFC7252"/> may be used. These devices still need to exchange data with IP‑based applications. Accordingly, applications on the IP network obtain telemetry from and issue operations to such devices through an application‑layer gateway. This gateway bridges the application network and one or more separate operational networks where devices are connected, allowing applications on the IP network to perform operations on devices connected to these other operational networks.</t>

<figure title="Gateway for non-Internet-Connected Devices" anchor="gw"><artset><artwork  type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="128" width="520" viewBox="0 0 520 128" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
<path d="M 8,32 L 8,80" fill="none" stroke="black"/>
<path d="M 120,32 L 120,80" fill="none" stroke="black"/>
<path d="M 240,32 L 240,80" fill="none" stroke="black"/>
<path d="M 320,32 L 320,80" fill="none" stroke="black"/>
<path d="M 440,32 L 440,80" fill="none" stroke="black"/>
<path d="M 512,32 L 512,80" fill="none" stroke="black"/>
<path d="M 8,32 L 120,32" fill="none" stroke="black"/>
<path d="M 240,32 L 320,32" fill="none" stroke="black"/>
<path d="M 440,32 L 512,32" fill="none" stroke="black"/>
<path d="M 128,48 L 232,48" fill="none" stroke="black"/>
<path d="M 328,48 L 432,48" fill="none" stroke="black"/>
<path d="M 8,80 L 120,80" fill="none" stroke="black"/>
<path d="M 240,80 L 320,80" fill="none" stroke="black"/>
<path d="M 440,80 L 512,80" fill="none" stroke="black"/>
<polygon class="arrowhead" points="440,48 428,42.4 428,53.6" fill="black" transform="rotate(0,432,48)"/>
<polygon class="arrowhead" points="336,48 324,42.4 324,53.6" fill="black" transform="rotate(180,328,48)"/>
<polygon class="arrowhead" points="240,48 228,42.4 228,53.6" fill="black" transform="rotate(0,232,48)"/>
<polygon class="arrowhead" points="136,48 124,42.4 124,53.6" fill="black" transform="rotate(180,128,48)"/>
<g class="text">
<text x="64" y="52">Application</text>
<text x="280" y="52">Gateway</text>
<text x="476" y="52">Device</text>
<text x="176" y="68">Application</text>
<text x="380" y="68">Device</text>
<text x="176" y="84">network</text>
<text x="384" y="84">network</text>
</g>
</svg>
</artwork><artwork  type="ascii-art"><![CDATA[
    +-------------+              +---------+              +--------+
    | Application |<------------>| Gateway |<------------>| Device |
    |             | Application  |         |    Device    |        |
    +-------------+   network    +---------+    network   +--------+

]]></artwork></artset></figure>

<t>There have been efforts to define Gateway functions for devices that support
a particular protocol, such as a BLE GATT REST API for BLE Gateways
(<xref target="Gatt-REST-API"/>), however they have been limited to a single protocol or
a particular use case. In absence of an open standard describing how
applications on an IP network communicate with devices on other operational networks, bespoke and
vendor-specific implementations have proliferated.
Each deployment then requires: (1) defining or adapting yet another API, and (2) deploying additional gateway functions, increasing operational and integration cost.
This specification defines a single, extensible application layer interface for cross-network and cross-protocol device interaction through a network gateway. The intent is to support multiple network and network protocols (and versions) concurrently, allow incremental addition of new protocols via mapping, and reduce redundant infrastructure by enabling multiple applications to share one standardized gateway function. Furthermore, by leveraging interaction models, the application and gateway are able to maintain a protocol-neutral interface, while the gateway handles the protocol-specific interactions with devices.</t>

<t>A standardized Application Layer Gateway interface has the following benefits:</t>

<t><list style="numbers" type="1">
  <t>Eliminates repeated bespoke integration effort across deployments.</t>
  <t>Avoids deploying multiple overlapping gateway functions for different networks, protocols or use cases.</t>
  <t>Reduces time and operational cost to integrate new networks and devices.</t>
  <t>Allows applications to interact with devices in a protocol-neutral way, leveraging interaction models.</t>
</list></t>

</section>
<section anchor="non-ip-gateway"><name>Non-IP Gateway</name>

<t>A Non-Internet-Connected Physical Components (NIPC) gateway is an application layer gateway (ALG) that implements APIs for applications to communicate with devices on different networks connected to the Gateway. These devices may leverage different protocols, IP based or non-IP based. NIPC APIs allow reading or writing properties of devices, invoking actions on devices, as well as enabling or disabling events on devices, by means of a supporting gateway, in a protocol-neutral way.</t>

<t>In order to perform NIPC operations on a device, 2 prerequisites must be fulfilled:</t>

<t><list style="symbols">
  <t>The gateway has access to a device object, that contains its identity, in the form of a unique UUID and any credentials &amp; trust material required to communicate with the device. Provisioning this device object is out of scope of this document. It may be performed via SCIM <xref target="RFC7644"/> with <xref target="I-D.ietf-scim-device-model"/>.</t>
  <t>An interaction model for the class of devices must be available to the gateway. This allows the gateway to understand how to interact with the device in a protocol-neutral way. The interaction model is provided to the gateway by means of an SDF model, as described in <xref target="RFC9880"/>.</t>
</list></t>

<t>Once these prerequisites are met, the gateway can resolve an SDF affordance referenced in the SDF model into the protocol-specific operations required for that device.</t>

<t>A NIPC gateway provides the following functions:</t>

<t><list style="symbols">
  <t>Authentication and authorization of application clients that will leverage the NIPC APIs.</t>
  <t>Maintain or have access to a repository of device objects, including device identity and trust material.</t>
  <t>Accept and validate SDF interaction model registrations.</t>
  <t>Expose APIs for property, action, and event operations.</t>
  <t>Perform implicit connection management to devices where required; optionally support explicit connection management.</t>
  <t>Stream events (publish/subscribe) to authorized data applications.</t>
  <t>Proxy payloads between networks without interpreting or modifying application data.</t>
  <t>Operate one or more channels to supported wired or wireless networks.</t>
  <t>Optionally provide a bridge between devices on one or more device networks connected to the NIPC-Gateway. This may include translating between different protocols, if multiple protocols are supported on the device network(s).</t>
</list></t>

<t>The gateway’s role is to provide gateway functions between application and device networks; it is not intended to be middleware that inspects, decodes, or transforms device payloads.</t>

<figure title="Basic Architecture" anchor="arch"><artset><artwork  type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="288" width="560" viewBox="0 0 560 288" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
<path d="M 8,64 L 8,112" fill="none" stroke="black"/>
<path d="M 8,144 L 8,224" fill="none" stroke="black"/>
<path d="M 104,64 L 104,112" fill="none" stroke="black"/>
<path d="M 104,144 L 104,224" fill="none" stroke="black"/>
<path d="M 208,32 L 208,72" fill="none" stroke="black"/>
<path d="M 208,104 L 208,152" fill="none" stroke="black"/>
<path d="M 208,200 L 208,256" fill="none" stroke="black"/>
<path d="M 232,64 L 232,112" fill="none" stroke="black"/>
<path d="M 232,144 L 232,208" fill="none" stroke="black"/>
<path d="M 312,64 L 312,112" fill="none" stroke="black"/>
<path d="M 336,144 L 336,208" fill="none" stroke="black"/>
<path d="M 368,144 L 368,176" fill="none" stroke="black"/>
<path d="M 432,144 L 432,176" fill="none" stroke="black"/>
<path d="M 464,144 L 464,176" fill="none" stroke="black"/>
<path d="M 536,144 L 536,176" fill="none" stroke="black"/>
<path d="M 552,32 L 552,256" fill="none" stroke="black"/>
<path d="M 208,32 L 552,32" fill="none" stroke="black"/>
<path d="M 8,64 L 104,64" fill="none" stroke="black"/>
<path d="M 232,64 L 312,64" fill="none" stroke="black"/>
<path d="M 104,80 L 224,80" fill="none" stroke="black"/>
<path d="M 112,96 L 232,96" fill="none" stroke="black"/>
<path d="M 8,112 L 104,112" fill="none" stroke="black"/>
<path d="M 232,112 L 312,112" fill="none" stroke="black"/>
<path d="M 8,144 L 104,144" fill="none" stroke="black"/>
<path d="M 232,144 L 336,144" fill="none" stroke="black"/>
<path d="M 368,144 L 432,144" fill="none" stroke="black"/>
<path d="M 464,144 L 536,144" fill="none" stroke="black"/>
<path d="M 104,160 L 136,160" fill="none" stroke="black"/>
<path d="M 176,160 L 224,160" fill="none" stroke="black"/>
<path d="M 336,160 L 360,160" fill="none" stroke="black"/>
<path d="M 432,160 L 456,160" fill="none" stroke="black"/>
<path d="M 368,176 L 432,176" fill="none" stroke="black"/>
<path d="M 464,176 L 536,176" fill="none" stroke="black"/>
<path d="M 112,192 L 128,192" fill="none" stroke="black"/>
<path d="M 192,192 L 232,192" fill="none" stroke="black"/>
<path d="M 232,208 L 336,208" fill="none" stroke="black"/>
<path d="M 8,224 L 104,224" fill="none" stroke="black"/>
<path d="M 208,256 L 552,256" fill="none" stroke="black"/>
<polygon class="arrowhead" points="464,160 452,154.4 452,165.6" fill="black" transform="rotate(0,456,160)"/>
<polygon class="arrowhead" points="368,160 356,154.4 356,165.6" fill="black" transform="rotate(0,360,160)"/>
<polygon class="arrowhead" points="232,160 220,154.4 220,165.6" fill="black" transform="rotate(0,224,160)"/>
<polygon class="arrowhead" points="232,80 220,74.4 220,85.6" fill="black" transform="rotate(0,224,80)"/>
<polygon class="arrowhead" points="120,192 108,186.4 108,197.6" fill="black" transform="rotate(180,112,192)"/>
<polygon class="arrowhead" points="120,96 108,90.4 108,101.6" fill="black" transform="rotate(180,112,96)"/>
<g class="text">
<text x="160" y="68">Request</text>
<text x="60" y="84">onboarding</text>
<text x="268" y="84">SCIM</text>
<text x="56" y="100">app</text>
<text x="268" y="100">Server</text>
<text x="140" y="116">Ctrl</text>
<text x="184" y="116">Endpt</text>
<text x="56" y="164">Control</text>
<text x="156" y="164">REST</text>
<text x="284" y="164">NIPC</text>
<text x="396" y="164">AP</text>
<text x="500" y="164">Device</text>
<text x="56" y="180">&amp;</text>
<text x="208" y="180">|</text>
<text x="288" y="180">Gateway</text>
<text x="56" y="196">Telemetry</text>
<text x="160" y="196">pub/sub</text>
<text x="60" y="212">Apps</text>
<text x="336" y="244">Network</text>
<text x="412" y="244">Deployment</text>
</g>
</svg>
</artwork><artwork  type="ascii-art"><![CDATA[
                         +------------------------------------------+
                         |                                          |
+-----------+   Request  |  +---------+                             |
| onboarding+-------------->|  SCIM   |                             |
|    app    |<--------------+ Server  |                             |
+-----------+  Ctrl Endpt|  +---------+                             |
                         |                                          |
+-----------+            |  +------------+   +-------+   +--------+ |
|  Control  +----REST------>|    NIPC    +-->|  AP   +-->| Device | |
|     &     |            |  |   Gateway  |   +-------+   +--------+ |
| Telemetry |<--pub/sub-----+            |                          |
|    Apps   |            |  +------------+                          |
+-----------+            |                                          |
                         |            Network Deployment            |
                         +------------------------------------------+

]]></artwork></artset></figure>

<t><xref target="arch"/> illustrates the basic components: applications, the NIPC application‑layer gateway (ALG), an access point (AP), and a device (D). The applications, ALG, and AP reside on an IP network; the AP provides a wireless or wired interface to the device. Applications often operate in a different administrative domain than the ALG and AP, so the ALG will have to support authorization. The ALG bridges the IP application domain and the device network, be it an IP-based or non-IP device network. This enables applications to perform operations on devices attached to those device networks. Applications use a JSON-based <xref target="RFC8259"/> RESTful NIPC APIs for property, action, and event operations, and a CBOR‑based <xref target="RFC8949"/> publish/subscribe interface for event streaming.</t>

</section>
<section anchor="terminology"><name>Terminology</name>

<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" in this document are to be interpreted as described in BCP
14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all
capitals, as shown here.</t>

</section>
<section anchor="glossary"><name>Glossary</name>

<t><list style="symbols">
  <t>NIPC: Non-Internet-Connected Physical Components, the application layer interface defined in this
document.</t>
  <t>NIPC Gateway: An application layer gateway that implements the NIPC
interface.</t>
  <t>SDF: Semantic Device Format, a standardized format to describe devices
and their interaction models, as defined in <xref target="RFC9880"/>.</t>
  <t>SDF Affordance: An interaction point on a device as defined in an SDF
model. Examples of affordances are properties, actions, and events.</t>
  <t>SDF Global Name: Absolute URI (with fragment) identifying an SDF affordance.</t>
  <t>SCIM: System for Cross-domain Identity Management, a standardized
protocol to manage identity information, as defined in <xref target="RFC7644"/>.</t>
  <t>ALG: Application Layer Gateway.</t>
  <t>IoT: Internet of Things.</t>
  <t>Protocol Mapping / sdfProtocolMap: Mapping from protocol-neutral SDF affordances to protocol-specific operations.</t>
  <t>BLE: Bluetooth Low Energy protocol.</t>
  <t>Zigbee: Low-power mesh networking protocol.</t>
  <t>GATT: Generic Attribute Profile used in BLE for services/characteristics/descriptors.</t>
  <t>Service (BLE): Top-level GATT grouping of characteristics.</t>
  <t>Characteristic (BLE): GATT data element supporting read/write/notify.</t>
  <t>Descriptor (BLE): Metadata element attached to a characteristic.</t>
  <t>Bonding (BLE): Procedure to establish trusted, reusable security keys.</t>
  <t>Service Discovery (BLE): Procedure to enumerate GATT services/characteristics/descriptors.</t>
  <t>Device ID / Group ID: UUID identifying a device or a group of devices.</t>
  <t>UUID: Universally unique identifier (128-bit).</t>
  <t>Data Application / Data App: Registered application receiving streamed event data.</t>
  <t>MQTT: Publish/subscribe messaging protocol used for streaming.</t>
  <t>Webhook: HTTP callback endpoint for push delivery.</t>
  <t>Websocket: Bidirectional TCP-based message channel over HTTP.</t>
  <t>Publish/Subscribe Interface: Streaming channel for events (CBOR-encoded payloads).</t>
  <t>CBOR: Concise Binary Object Representation; compact binary data format.</t>
  <t>CDDL: Concise Data Definition Language; schema language for CBOR data.</t>
  <t>JSON: JavaScript Object Notation; text encoding used for API payloads.</t>
  <t>Access Point (AP): Network element with a radio interface communicating with devices.</t>
</list></t>

</section>
</section>
<section anchor="architecture"><name>Architecture</name>

<section anchor="overview"><name>Overview</name>

<t>A Non‑Internet‑Connected Physical Components (NIPC) gateway is an application‑layer gateway (ALG) that exposes APIs enabling applications to perform operations on devices attached to networks connected to the gateway. NIPC defines two API categories:</t>

<t><list style="symbols">
  <t>Registrations: register SDF models for classes of devices and register data applications that receive streaming event data.</t>
  <t>Operations: perform protocol‑neutral device interactions (read/write properties, invoke actions, enable/disable events) across heterogeneous networks and protocols.</t>
</list></t>

<t>To execute NIPC operations on a device, both prerequisites MUST be met:</t>

<t><list style="numbers" type="1">
  <t>The NIPC gateway has access to device instance information: The device object contains its identity, in the form of a unique UUID and any credentials/trust material required to communicate with the device (e.g., via SCIM <xref target="RFC7644"/> with <xref target="I-D.ietf-scim-device-model"/>). This device object is identified by the device ID referenced in NIPC API paths.</t>
  <t>The NIPC gateway has access to an interaction model (device class information): An SDF model <xref target="RFC9880"/> is registered, providing protocol‑neutral affordances and mappings to protocol‑specific operations.</t>
</list></t>

<figure title="NIPC prerequisites" anchor="prereq"><artset><artwork  type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="240" width="352" viewBox="0 0 352 240" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
<path d="M 8,32 L 8,96" fill="none" stroke="black"/>
<path d="M 8,144 L 8,192" fill="none" stroke="black"/>
<path d="M 112,32 L 112,96" fill="none" stroke="black"/>
<path d="M 112,144 L 112,192" fill="none" stroke="black"/>
<path d="M 208,64 L 208,176" fill="none" stroke="black"/>
<path d="M 344,64 L 344,176" fill="none" stroke="black"/>
<path d="M 8,32 L 112,32" fill="none" stroke="black"/>
<path d="M 208,64 L 344,64" fill="none" stroke="black"/>
<path d="M 112,80 L 200,80" fill="none" stroke="black"/>
<path d="M 8,96 L 112,96" fill="none" stroke="black"/>
<path d="M 8,144 L 112,144" fill="none" stroke="black"/>
<path d="M 112,160 L 200,160" fill="none" stroke="black"/>
<path d="M 208,176 L 344,176" fill="none" stroke="black"/>
<path d="M 8,192 L 112,192" fill="none" stroke="black"/>
<polygon class="arrowhead" points="208,160 196,154.4 196,165.6" fill="black" transform="rotate(0,200,160)"/>
<polygon class="arrowhead" points="208,80 196,74.4 196,85.6" fill="black" transform="rotate(0,200,80)"/>
<g class="text">
<text x="60" y="52">SCIM</text>
<text x="60" y="68">object</text>
<text x="60" y="84">{ID}</text>
<text x="236" y="100">NIPC</text>
<text x="296" y="100">Operation</text>
<text x="248" y="116">-</text>
<text x="292" y="116">Property</text>
<text x="248" y="132">-</text>
<text x="284" y="132">Action</text>
<text x="248" y="148">-</text>
<text x="280" y="148">Event</text>
<text x="64" y="164">SDF</text>
<text x="64" y="180">model</text>
</g>
</svg>
</artwork><artwork  type="ascii-art"><![CDATA[
    +------------+
    |    SCIM    |
    |   object   |           +----------------+
    |    {ID}    +---------->|                |
    +------------+           | NIPC Operation |
                             |    - Property  |
                             |    - Action    |
    +------------+           |    - Event     |
    |     SDF    +---------->|                |
    |    model   |           +----------------+
    +------------+

]]></artwork></artset></figure>

<t>Once both prerequisites are met, authorized applications can perform NIPC operations on devices identified by their IDs. See <xref target="security-considerations"/> for authorization details. NIPC operations act on SDF affordances—properties, actions, and events defined in the registered SDF model. Certain NIPC operations may also be performed on groups of devices identified by a group ID.</t>

<section anchor="device-instance-information"><name>Device instance information</name>

<t>In order for the NIPC gateway to perform operations on a device, it must have access to the device's instance information. This includes the device’s identity and any credentials or trust material required to communicate with the device. The device object MUST include a unique identity (UUID) and sufficient information to bootstrap trust and establish connectivity, as NIPC operations assume connectivity can be established without separate API calls. While provisioning devices instance information can be performed in various ways, it is RECOMMENDED to use SCIM <xref target="RFC7644"/> with the device schema <xref target="I-D.ietf-scim-device-model"/>, which defines the necessary attributes and extensions to support NIPC. As per <xref section="4.2" sectionFormat="of" target="RFC7643"/>, group objects may also be declared, and leveraged in NIPC operations.</t>

</section>
<section anchor="device-class-information"><name>Device class information</name>

<t>Device class information is declared through SDF models, as defined in <xref target="RFC9880"/>. These SDF models define the protocol-neutral affordances of a class of devices, as well as protocol mappings <xref target="I-D.ietf-asdf-sdf-protocol-mapping"/> that relate these affordances to protocol-specific operations. The SDF model for a class of devices can be registered through NIPC registration APIs, as described in <xref target="nipc-registrations"/>.</t>

<t>The SDF model reference and/or data‑app registration MAY also be included in a device's SCIM object. See <xref target="I-D.ietf-scim-device-model"/> and <xref target="I-D.ietf-asdf-sdf-protocol-mapping"/> for details.</t>

</section>
</section>
<section anchor="nipc-registrations"><name>NIPC Registrations</name>

<t>NIPC registration APIs allow applications to register objects that are not tied to specific device instances.</t>

<t>NIPC supports two registration types:</t>

<t><list style="numbers" type="1">
  <t>SDF model registration: Registers an SDF interaction model for a class of devices.</t>
  <t>Data application authorization: Authorizes an application to receive streaming event data.</t>
</list></t>

<section anchor="sdf-model-registrations"><name>SDF model registrations</name>

<t>The SDF model for a class of devices determines how a gateway can interact with
these devices in a protocol-neutral way. To enable this, the SDF model
must contain protocol mappings, mapping protocol-neutral SDF affordances
to protocol-specific operations as defined in <xref target="I-D.ietf-asdf-sdf-protocol-mapping"/>.
The SDF affordances supported by the device, as well as its protocol-mappings,
are provided to the gateway by means of an SDF model.
SDF models are described in <xref target="RFC9880"/>.</t>

</section>
<section anchor="data-application-registrations"><name>Data application registrations</name>

<t>NIPC operations can enable or disable event reporting on a device. Events are reported through a publish-subscribe interface.
Applications that are authorized to perform NIPC operations on devices can define which applications are permitted to receive streaming event data for that device. The data-app registrations API maps an event to an application that is authorized to receive that data. The registration also defines what protocol will be used to deliver the data (e.g., MQTT, webhook, websocket). This registration basically allows applications to instruct the gateway to direct event data-streams to specific data-applications.</t>

</section>
</section>
<section anchor="nipc-ops"><name>NIPC Operations</name>

<section anchor="nipc-ops-overview"><name>Overview</name>

<t>NIPC APIs are exposed over HTTP <xref target="RFC9110"/>. Requests and responses use JSON <xref target="RFC8259"/> unless another media type is negotiated via Content-Type and Accept. A media type for an SDF affordance can also be stipulated in the SDF ContentFormat data quality, as described in <xref section="4.7" sectionFormat="of" target="RFC9880"/>. The default media type is “application/nipc+json” (see <xref target="iana-media-types"/>). SDF model registrations use “application/sdf+json”. Property APIs MAY use other media types appropriate to the property payload.</t>

<t>Failures use Problem Details <xref target="RFC9457"/> with media type application/problem+json.</t>

<t>NIPC operations are protocol-neutral operations on SDF affordances, more specifically properties, actions &amp; events. NIPC operations can happen against
affordances registered in an SDF model. Operations reference affordances by their SDF global name. If the underlying protocol requires a connection, the gateway establishes and tears down the connection implicitly unless an explicit connection is already in place.</t>

<t>NIPC exposes four operation groups:</t>

<t><list style="symbols">
  <t>Properties APIs: These APIs allow applications to perform operations on properties, such as to read or write values to them.</t>
  <t>Actions APIs: These APIs perform actions on devices, such as enabling or disabling a feature on a device.</t>
  <t>Events APIs: These APIs allow apps to enable or disable event reporting on devices. Events are reported over the events publish/subscribe interface.</t>
  <t>Trigger APIs: These APIs allow an event on one device or group to trigger an action on another device or group. Trigger APIs are not a fundamental operation, but rather tie 2 fundamental operations together; an event triggers an action.</t>
</list></t>

</section>
<section anchor="properties"><name>Properties</name>

<t>Property operations allow clients to read and write values for SDF properties.</t>

<t>An example of using a property API is reading the property temperature from a temperature sensor.</t>

<t>Requests and responses use application/nipc+json unless another media type is negotiated via Content‑Type and Accept.
When using JSON, binary property values are base64‑encoded with padding per <xref section="5" sectionFormat="of" target="RFC4648"/>.
Multiple properties MAY be read or written in a single request. When a single property is addressed via a query parameter, non‑JSON media types MAY be used for the payload.
On success, the response returns either 200 with per‑property status (JSON) or 204 No Content for single, non‑JSON writes.</t>

</section>
<section anchor="actions"><name>Actions</name>

<t>Action operations invoke SDF actions on devices.</t>

<t>An example of using an action API is to turn on a lightbulb.</t>

<t>A successful action request returns 202 Accepted with a Location header referencing the action instance.
Clients poll the instance URI to obtain status (e.g., IN_PROGRESS, COMPLETED).
Request bodies are optional and MAY carry action input in a media type appropriate to the underlying protocol (e.g., octet‑stream).</t>

</section>
<section anchor="events"><name>Events</name>

<t>Event operations enable and disable device event reporting.</t>

<t>An example of using an event API receiving an event that a button has been pressed.</t>

<t>Enabling an event returns 201 Created with a Location header referencing the event instance.
Disabling an event uses the instance identifier and returns 204 No Content on success (for a single device) or 200 Success with a per‑device status list (for a group).
Event payloads are delivered via the publish/subscribe interface encoded in CBOR <xref target="RFC8949"/>.</t>

</section>
<section anchor="triggers"><name>Triggers</name>

<t>Triggers allow an event on one device or group to trigger an action on another device or group. Triggers are not protocol-specific. As an example, an event on a BLE device can trigger an action on a Zigbee device.</t>

<t>An example of a Trigger is when a button is pressed (event), a lightbulb should turn on (action). Multiple buttons (group) can also turn on a lightbulb (device). A single button (device) could also turn on multiple lights (group).</t>

<t>Creating a trigger returns 201 Created with a Location header referencing the trigger instance.
Deleting a trigger uses the instance identifier and returns 204 No Content on success (for a single device) or 200 Success with a per‑device trigger list (for a group).</t>

</section>
<section anchor="groups"><name>Groups</name>

<t>Where supported by the underlying protocol, operations MAY target a group of devices identified by a group ID. Responses for group operations return per‑device results; failures for individual devices are reported using Problem Details entries within the array.</t>

</section>
<section anchor="connection-management-for-nipc-operations"><name>Connection management for NIPC Operations</name>

<t>For protocols that require connection setup, the gateway performs implicit connection management during an operation (establish on demand; tear down on completion). Gateways MAY support explicit connection management; when an explicit connection is active, operations reuse it and do not tear it down. Explicit connection management is described in <xref target="nipc-connection-management-apis"/>.</t>

</section>
<section anchor="extensions"><name>Extensions</name>

<t>NIPC supports API extensions for compound or specialized operations. Extensions can execute a set of NIPC operations in a single request or provide more efficient mechanisms for specific use cases (e.g., a bulk operation).</t>

<t>Extensions MUST use the “/extensions” path element. To ensure interoperability, extensions MUST be registered with IANA as defined in <xref target="iana-api-ext"/>.</t>

</section>
</section>
<section anchor="events-publish-subscribe-interface"><name>Events publish subscribe interface</name>

<t>Events are delivered via a publish/subscribe interface. NIPC events are encoded in CBOR (<xref target="RFC8949"/>) and can be transported over MQTT, Webhook or Websocket.</t>

<t>CBOR is used for the publish/subscribe interface as Non-IP payloads are typically binary. CBOR encodes binary payloads efficiently, and is more compact than JSON, therefore reducing the amount of data that needs to be transmitted to the application.</t>

<t>Event types include:</t>

<t><list style="symbols">
  <t>Streaming data from devices: Streaming data is activated/deactivated with the NIPC events API</t>
  <t>Broadcasts from devices (e.g., advertisements in BLE)</t>
  <t>Connection events: Devices connecting &amp; disconnecting</t>
</list></t>

</section>
<section anchor="paths"><name>Paths</name>

<section anchor="paths-general"><name>General</name>

<t>The NIPC HTTP protocol is described in terms of a path relative to a Base URI.
The Base URI MUST NOT contain a query string, as clients MAY append additional
path information and query parameters as part of forming the request.  The base
URI is a URL that most often consists of the "https" protocol scheme, a domain
name, and an initial path <xref target="RFC3986"/>.  That initial path for NIPC is
recommended to be /nipc.
For example:</t>

<figure><artwork><![CDATA[
  "https://example.com/nipc/"
]]></artwork></figure>

<t>Additionally a version number may be added, for example:</t>

<figure><artwork><![CDATA[
  "https://example.com/nipc/v1/"
]]></artwork></figure>

<t>After the base or version number, the path must contain a collection identifier.
The collection identifier can be one of the following:</t>

<t><list style="symbols">
  <t>/registrations: for NIPC registration APIs</t>
  <t>/devices: for NIPC operations on devices</t>
  <t>/groups: for NIPC operations on groups of devices</t>
  <t>/extensions: for NIPC extension APIs</t>
</list></t>

<t>The well-known URI <spanx style="verb">/.well-known/nipc</spanx> defined in <xref target="iana-well-known"/> can
be used to discover the base path of the NIPC APIs and the supported versions
and extensions. The response to a GET request on this URI MUST be a JSON
document that contains the base path, and optionally the supported versions and
extension APIs. The paths MUST be a URI template as defined in <xref target="RFC6570"/>.
The following is an example of a template defining the NIPC base path as well
as supported extensions on a server.</t>

<figure title="Example response for /.well-known/nipc" anchor="ex-wellknown"><sourcecode type="json" markers="true"><![CDATA[
{
  "base_path": "/nipc",
  "versions": [
    "/v1"
  ],
  "extensions": [
    "/extensions/{id}/bulk",
    "/extensions/{id}/properties/blob",
    "/extensions/{id}/properties/file",
    "/extensions/{id}/properties/read/conditional",
    "/extensions/{id}/events/conditional"
  ]
}
]]></sourcecode></figure>

<t>A formal CBOR definition of the well-known response is as follows:</t>

<figure><sourcecode type="cddl" markers="true" name="nipc_well_known.cddl"><![CDATA[
NipcWellKnown = {
  base_path: text,
  ? versions: [* uri / text],
  ? extensions: [* uri / text]
}
]]></sourcecode></figure>

</section>
<section anchor="nipc-registrations-paths"><name>NIPC Registrations</name>

<t>Registrations leverage the base path + /registrations. NIPC supports SDF model
registrations and data-app registrations.</t>

<t>paths:</t>

<t><list style="symbols">
  <t>/registrations/models</t>
  <t>/registrations/data-apps</t>
</list></t>

</section>
<section anchor="nipc-operations"><name>NIPC Operations</name>

<t>Every NIPC Operations API pertains to either a device or group of devices, identified by
an ID, hence the ID must be reflected as the first parameter in the path.
For example:</t>

<figure><artwork><![CDATA[
  "https://example.com/nipc/v1/{id}"
]]></artwork></figure>

<t>The second parameter in the path refers to the NIPC operation that the API will
perform on the device. This can be:</t>

<t><list style="symbols">
  <t>properties</t>
  <t>events</t>
  <t>actions</t>
  <t>triggers</t>
  <t>extensions</t>
</list></t>

<t>These are described in <xref target="nipc-ops"/>.</t>

</section>
</section>
<section anchor="schema"><name>Schema</name>

<t>The NIPC schema leans heavily on the SDF schema, as defined in
<xref target="RFC9880"/>. NIPC operations map directly to SDF affordances.</t>

<section anchor="sdf-model-registrations-1"><name>SDF model registrations</name>

<t>To execute NIPC operations, an SDF interaction model for the device class MUST be registered. The model MUST include protocol mappings that relate protocol‑neutral SDF affordances to protocol‑specific operations.</t>

<t>Registration is performed via POST /registrations/models with the SDF model in the request body. A registered model can be retrieved via GET /registrations/models using the model identifier (sdfName).</t>

</section>
<section anchor="nipc-operations-1"><name>NIPC Operations</name>

<t>NIPC operations require two parameters:</t>

<t><list style="numbers" type="1">
  <t>Device ID: the UUID identifying the target device (or group).</t>
  <t>sdfName: the SDF global name (absolute URI with fragment) of the affordance (property, action, or event) on which the operation acts.</t>
</list></t>

<section anchor="device-id"><name>Device ID</name>

<t>All NIPC operations are executed against a device or a group of devices.
Devices or groups of devices are identified by a unique UUID, adhering to <xref target="RFC9562"/>.</t>

<texttable title="Definition of a device or group of devices" anchor="devicedef">
      <ttcol align='left'>Attribute</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Example</ttcol>
      <c>id</c>
      <c>uuid</c>
      <c>1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30</c>
</texttable>

<t>ID is a UUID assigned to uniquely identify a device to the NIPC Gateway (e.g., by a SCIM server) and the application calling the APIs. The NIPC Gateway must have access to a device object identified by this device ID and the application must store this UUID in order to use it to identify the device on which it wants to perform NIPC operations.</t>

</section>
<section anchor="sdf-name"><name>SDF Name</name>

<t>Operations act on SDF affordances and reference them by SDF global name—an absolute URI with fragment that includes the namespace. The affordance referenced MAY be a property, action, or event; the reference is carried as a string.</t>

<t>For example:</t>

<texttable title="Example SDF names for NIPC operations" anchor="nipcopsdef">
      <ttcol align='left'>NIPC Operation</ttcol>
      <ttcol align='left'>Example SDF Name used in the API</ttcol>
      <c>Property</c>
      <c>https://example.com/heartrate#/<br />sdfObject/thermostat/sdfProperty/temperature</c>
      <c>Event</c>
      <c>https://example.com/heartrate#<br />/sdfObject/healthsensor/sdfEvent/fallDetected</c>
      <c>Action</c>
      <c>https://example.com/heartrate#/<br />sdfObject/thermostat/sdfAction/resetThermostat</c>
</texttable>

</section>
</section>
<section anchor="parameters"><name>Parameters</name>

<t>To minimize deployment risk arising from inconsistent URI path normalization and handling of percent‑encoded reserved characters in path elements (notably “/” encoded as “%2F”) across common HTTP servers and intermediaries (e.g., Jetty, Tomcat, Apache httpd, NGINX), NIPC uses query parameters (except the primary {id} path segment) rather than additional path segments for values that can legitimately contain reserved characters (such as SDF global names). Although <xref target="RFC3986"/> and <xref target="RFC9110"/> require that reserved characters not be normalized or decoded in ways that alter semantics, misinterpretation of these rules has led to security vulnerabilities (path confusion, cache poisoning, authorization bypass) and to conservative default configurations that reject encoded slashes. In proxy deployments, relaxing these defaults often triggers security review friction. Representing such values in the query component avoids reliance on tolerant path normalization behavior, reduces ambiguity for intermediaries, and aligns with prevailing “safe” operational profiles; a malformed or unsupported parameter can be rejected with a 4xx status without exposing downstream services to traversal or normalization discrepancies.</t>

</section>
<section anchor="responses"><name>Responses</name>

<t>A NIPC Gateway must respond to a NIPC operation request synchronously, and provide the result of the completed operation in the HTTP response.</t>

<t>Exceptions to this are the following:</t>

<t><list style="numbers" type="1">
  <t>Extensions: Extension APIs (see <xref target="apiextensions"/>) execute compound operations and thus require the gateway to execute multiple
NIPC operations. On acceptance, the gateway returns 202 Accepted. Clients poll the extension URI (GET) for execution status. If a callback URI was supplied in the request, the gateway MAY send the final result upon completion.</t>
  <t>Actions: Action requests return 202 Accepted with a Location header pointing to the action instance used for status tracking, and a Retry-After header indicating the number of seconds the client should wait before polling for status.</t>
</list></t>

<t>A failure response must contain an HTTP status code of 4xx or 5xx, and use <xref target="RFC9457"/> Problem Details with <spanx style="verb">application/problem+json</spanx> media type.</t>

<t>All NIPC failure responses must include the following attributes:</t>

<t><list style="symbols">
  <t>type: a URI identifying the error (see <xref target="errorhandling"/>)</t>
  <t>status: the 4xx or 5xx HTTP status code</t>
  <t>title: a brief, human‑readable summary</t>
  <t>detail: a human‑readable explanation specific to this occurrence
Additional attributes MAY be included as permitted by <xref target="RFC9457"/>.</t>
</list></t>

<figure><sourcecode type="cddl" markers="true" name="failure_response.cddl"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

FailureResponse = {
  type: FailureTypeURI,
  status: uint,
  title: text,
  detail: text
}

; Enumerated problem type URIs registered for NIPC
FailureTypeURI = (
  "https://www.iana.org/assignments/nipc-problem-types#invalid-id" /
  "https://www.iana.org/assignments/nipc-problem-types#invalid-sdf-\
                                                               url" /
  "https://www.iana.org/assignments/nipc-problem-types#extension-\
                                            operation-not-executed" /
  "https://www.iana.org/assignments/nipc-problem-types#sdf-model-\
                                                already-registered" /
  "https://www.iana.org/assignments/nipc-problem-types#sdf-model-in-\
                                                               use" /
  "https://www.iana.org/assignments/nipc-problem-types#unsupported-\
                                                        uri-scheme" /
  "https://www.iana.org/assignments/nipc-problem-types#property-not-\
                                                          readable" /
  "https://www.iana.org/assignments/nipc-problem-types#property-read\
                                                           -failed" /
  "https://www.iana.org/assignments/nipc-problem-types#property-not-\
                                                          writable" /
  "https://www.iana.org/assignments/nipc-problem-types#property-\
                                                      write-failed" /
  "https://www.iana.org/assignments/nipc-problem-types#event-already\
                                                          -enabled" /
  "https://www.iana.org/assignments/nipc-problem-types#event-not-\
                                                           enabled" /
  "https://www.iana.org/assignments/nipc-problem-types#event-not-\
                                                        registered" /
  "https://www.iana.org/assignments/nipc-problem-types#trigger-\
                                                   already-enabled" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-\
                                             ble-already-connected" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-\
                                                 ble-no-connection" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-\
                                            ble-connection-timeout" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-\
                                                ble-bonding-failed" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-\
                                             ble-connection-failed" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-\
                                      ble-service-discovery-failed" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-\
                             ble-invalid-service-or-characteristic" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-\
                                         zigbee-connection-timeout" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-\
                                zigbee-invalid-endpoint-or-cluster" /
  "https://www.iana.org/assignments/nipc-problem-types#extension-\
                                             transmit-invalid-data" /
  "https://www.iana.org/assignments/nipc-problem-types#extension-\
                                                 firmware-rollback" /
  "https://www.iana.org/assignments/nipc-problem-types#extension-\
                                            firmware-update-failed" /
  "about:blank"
)
]]></sourcecode></figure>

<t>Example of a failure response:</t>

<figure title="Example failure response" anchor="failure"><sourcecode type="json" markers="true"><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

{
  "type": "https://www.iana.org/assignments/nipc-problem-types#\
                                                         invalid-id",
  "status": 400,
  "title": "Invalid Device ID",
  "detail": "Device ID 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30 does \
                                        not exist or is not a device"
}
]]></sourcecode></figure>

</section>
</section>
</section>
<section anchor="nipc-registration-apis"><name>NIPC Registration APIs</name>

<section anchor="sdf-model-registrations-apis"><name>SDF model registrations APIs</name>

<t>SDF model registration APIs allow applications to register an SDF model for a class of devices.
These APIs use the <spanx style="verb">application/sdf+json</spanx> media type, as described in <xref section="7.1" sectionFormat="of" target="RFC9880"/>.</t>

<section anchor="register-an-sdf-model"><name>Register an SDF model</name>

<t>Method: <spanx style="verb">POST /registrations/models</spanx></t>

<t>Description: Registers one or more SDF models for a class of devices. If the SDF model is already registered, the gateway will return an error with the <spanx style="verb">sdf-model-already-registered</spanx> problem type.</t>

<t>Request Body:</t>

<t><list style="symbols">
  <t>The SDF document in JSON format containing one or more sdfThings or sdfObjects, similar to the example in <xref target="thermometer-sdf"/>.</t>
  <t>The SDF document MUST contain protocol mappings, as described in <xref target="I-D.ietf-asdf-sdf-protocol-mapping"/>.</t>
</list></t>

<t>Response:</t>

<t>A list containing objects where each object has an "sdfName" which is the global name of the top-level sdfThing or sdfObject in the SDF model. The response uses the <spanx style="verb">201 Created</spanx> status code.</t>

<figure><sourcecode type="cddl" markers="true" name="sdf_reference.cddl"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

SdfGlobalName = text    ; absolute URI with fragment referencing an \
                                                sdfThing or sdfObject

SdfReference = {
  sdfName: SdfGlobalName
}

SdfReferenceArray = [* SdfReference]
]]></sourcecode></figure>

<t>Example of a response:</t>

<figure title="Example of a response to an SDF model registration" anchor="exregresp"><sourcecode type="json" markers="true"><![CDATA[
[
 {
  "sdfName": "https://example.com/heartrate#/sdfObject/healthsensor"
 }
]
]]></sourcecode></figure>

</section>
<section anchor="get-all-sdf-models"><name>Get all SDF models</name>

<t>Method: <spanx style="verb">GET /registrations/models</spanx></t>

<t>Description: Gets all SDF models registered with the gateway.</t>

<t>Response:</t>

<t>A list containing objects where each object has an "sdfName" which is the global name of the top-level sdfThing or sdfObject in the SDF model.</t>

<figure><sourcecode type="cddl" markers="true" name="sdf_reference.cddl"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

SdfGlobalName = text    ; absolute URI with fragment referencing an \
                                                sdfThing or sdfObject

SdfReference = {
  sdfName: SdfGlobalName
}

SdfReferenceArray = [* SdfReference]
]]></sourcecode></figure>

<t>Example of a response:</t>

<figure title="Example of a response to get all SDF models" anchor="exgetallresp"><sourcecode type="json" markers="true"><![CDATA[
[
 {
  "sdfName": "https://example.com/heartrate#/sdfObject/healthsensor"
 },
 {
  "sdfName": "https://example.com/thermometer#/sdfObject/thermometer"
 }
]
]]></sourcecode></figure>

</section>
<section anchor="get-an-sdf-model"><name>Get an SDF model</name>

<t>Method: <spanx style="verb">GET /registrations/models{?sdfName}</spanx></t>

<t>Description: Gets an SDF model registered with the gateway.</t>

<t>Query Parameters:</t>

<t><list style="symbols">
  <t>sdfName: the name of the top-level sdfThing or sdfObject in the SDF model.</t>
</list></t>

<t>Response:</t>

<t><list style="symbols">
  <t>The SDF model is returned in JSON format, similar to the example in <xref target="thermometer-sdf"/>.</t>
</list></t>

</section>
<section anchor="delete-an-sdf-model"><name>Delete an SDF model</name>

<t>Method: <spanx style="verb">DELETE /registrations/models{?sdfName}</spanx></t>

<t>Description: Deletes an SDF model registered with the gateway.</t>

<t>Query Parameters:</t>

<t><list style="symbols">
  <t>sdfName: the name of the top-level sdfThing or sdfObject in the SDF model.</t>
</list></t>

<t>Response:</t>

<t><list style="symbols">
  <t>An object with an "sdfName" which is the global name of the top-level sdfThing or sdfObject in the SDF model</t>
</list></t>

<figure><sourcecode type="cddl" markers="true" name="sdf_reference.cddl"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

SdfGlobalName = text    ; absolute URI with fragment referencing an \
                                                sdfThing or sdfObject

SdfReference = {
  sdfName: SdfGlobalName
}

SdfReferenceArray = [* SdfReference]
]]></sourcecode></figure>

<t>Example of a response:</t>

<figure title="Example of a response to an SDF model registration" anchor="exregdelresp"><sourcecode type="json" markers="true"><![CDATA[
{
  "sdfName": "https://example.com/heartrate#/sdfObject/healthsensor"
}
]]></sourcecode></figure>

</section>
<section anchor="update-an-sdf-model"><name>Update an SDF model</name>

<t>Method: <spanx style="verb">PUT /registrations/models{?sdfName}</spanx></t>

<t>Description: Updates an SDF model registered with the gateway.</t>

<t>Query Parameters:</t>

<t><list style="symbols">
  <t>sdfName: the name of the top-level sdfThing or sdfObject in the SDF model.</t>
</list></t>

<t>Request Body:</t>

<t><list style="symbols">
  <t>An SDF model in JSON format, similar to the example in <xref target="thermometer-sdf"/>.</t>
</list></t>

<t>Response:</t>

<t><list style="symbols">
  <t>An object with an "sdfName" which is the global name of the top-level sdfThing or sdfObject in the SDF model</t>
</list></t>

<figure><sourcecode type="cddl" markers="true" name="sdf_reference.cddl"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

SdfGlobalName = text    ; absolute URI with fragment referencing an \
                                                sdfThing or sdfObject

SdfReference = {
  sdfName: SdfGlobalName
}

SdfReferenceArray = [* SdfReference]
]]></sourcecode></figure>

<t>Example of a response:</t>

<figure title="Example of a response to an SDF model registration" anchor="exregupresp"><sourcecode type="json" markers="true"><![CDATA[
{
  "sdfName": "https://example.com/heartrate#/sdfObject/healthsensor"
}
]]></sourcecode></figure>

</section>
</section>
<section anchor="data-application-registrations-apis"><name>Data application registrations APIs</name>

<t>Data-app registration APIs allow applications to register a data application that will receive streaming data from the gateway. These APIs operate on a data app ID. This ID corresponds to the endpoint app ID of the telemetry endpoint app that is registered with the SCIM server as an authorized endpoint that can receive data for a device. The endpoint app is defined in <xref section="6" sectionFormat="of" target="I-D.ietf-scim-device-model"/>.</t>

<t>Apart from the endpoint app ID, the API also configures the protocol the data-app supports. These should be one of the following:</t>

<t><list style="symbols">
  <t>mqttClient: The data-app is an MQTT client, which means that the NIPC gateway must act as an MQTT broker.</t>
  <t>mqttBroker: The data-app is an MQTT broker, which means that the NIPC gateway must act as an MQTT client. The MQTT broker configuration data, such as the URI, credentials and MQTT topic must also be provided in the registration API.</t>
  <t>webhook: The data-app supports a webhook the gateway can publish to. The registration API has to include the webhook URI &amp; credentials.</t>
  <t>websocket: The data-app supports a websocket interface. The registration API has to include the websocket URI &amp; credentials.</t>
</list></t>

<section anchor="register-data-app"><name>Register a data application</name>

<t>Method: <spanx style="verb">POST /registrations/data-apps{?dataAppId}</spanx></t>

<t>Description: Registers a data application with the gateway.</t>

<t>Query Parameters:</t>

<t><list style="symbols">
  <t>dataAppId: the ID of the data application</t>
</list></t>

<t>Request Body:</t>

<t><list style="symbols">
  <t>events: a list of events that the data application is authorized for.</t>
  <t>mqttClient: a boolean that denotes that the data application is an MQTT client.</t>
  <t>mqttBroker: The data app is an MQTT broker. This object contains the MQTT broker information:
  <list style="symbols">
      <t>URI: the URI of the MQTT broker.</t>
      <t>username: the username to authenticate with the MQTT broker.</t>
      <t>password: the password to authenticate with the MQTT broker.</t>
      <t>brokerCACert: the base64-encoded CA certificate of the MQTT broker (optional).</t>
      <t>customTopic: By default, the topic will be composed of <spanx style="verb">data-app/&lt;dataAppId&gt;/&lt;namespace&gt;/&lt;json_pointer_to_sdf_event&gt;</spanx>, as described in <xref target="nipc-event-apis"/>. In this attribute, a custom topic can be configured (optional).</t>
    </list></t>
  <t>webhook: The data app supports a webhook. This object contains a webhook URL along with any credentials that are required to authenticate the webhook.
  <list style="symbols">
      <t>URI: the webhook URI. The URI MUST include the scheme used by the webhook server (e.g., "https://"). It is up to the implementation to support different schemes. If a scheme is not supported, the NIPC gateway MUST return an error response with type "https://www.iana.org/assignments/nipc-problem-types#unsupported-uri-scheme".</t>
      <t>headers: An object that contains the headers to be sent with the webhook request. The headers can contain any authentication information required by the webhook server. Each header is represented as a key-value pair in the object.</t>
      <t>serverCACert: the CA certificate of the webhook server, encoded as per <xref target="RFC7468"/> and newlines encoded as '\n' (optional)</t>
    </list></t>
  <t>websocket: The data app supports a websocket. This object contains a websocket URL along with any credentials that are required to authenticate the websocket.
The websocket URL is the endpoint where the streaming data will be sent.
  <list style="symbols">
      <t>URI: the websocket URI. The URI MUST include the scheme used by the websocket server (e.g., "wss://"). It is up to the implementation to support different schemes. If a scheme is not supported, the NIPC gateway MUST return an error response with type "https://www.iana.org/assignments/nipc-problem-types#unsupported-uri-scheme".</t>
      <t>headers: An object that contains the headers to be sent with the websocket request. The headers can contain any authentication information required by the websocket server. Each header is represented as a key-value pair in the object.</t>
      <t>serverCACert: the CA certificate of the websocket server, encoded as per <xref target="RFC7468"/> and newlines encoded as '\n' (optional)</t>
    </list></t>
</list></t>

<figure><sourcecode type="cddl" markers="true" name="data_app.cddl"><![CDATA[
DataApp = {
  events: [* EventRef],
  ( DataAppMqttClient //
    DataAppMqttBroker //
    DataAppWebhook //
    DataAppWebsocket )
}

EventRef = {
  event: text    ; SDF global name (absolute URI with fragment)
}

DataAppMqttClient = {
  mqttClient: bool
}

DataAppMqttBroker = {
  mqttBroker: {
    URI: text,
    username: text,
    password: text,
    ? brokerCACert: text,   ; PEM-encoded CA certificate
    ? customTopic: text     ; optional custom MQTT topic
  }
}

DataAppWebhook = {
  webhook: {
    URI: text,
    ? headers: { * text => text },  ; key/value headers
    ? serverCACert: text
  }
}

DataAppWebsocket = {
  websocket: {
    URI: text,
    ? headers: { * text => text },  ; key/value headers
    ? serverCACert: text
  }
}
]]></sourcecode></figure>

<t>Example of a request body:</t>

<figure title="Example with mqttClient" anchor="exregmqttclientrsp"><sourcecode type="json" markers="true"><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

{
  "events": [
    {
      "event": "https://example.com/heartrate#/sdfObject/\
                                  healthsensor/sdfEvent/fallDetected"
    }
  ],
  "mqttClient": true
}
]]></sourcecode></figure>

<t>Example of a request body for a data application that is an MQTT broker:</t>

<figure title="Example with mqttBroker" anchor="exregmqttbrokerrsp"><sourcecode type="json" markers="true"><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

{
  "events": [
    {
      "event": "https://example.com/heartrate#/sdfObject/\
                                  healthsensor/sdfEvent/fallDetected"
    }
  ],
  "mqttBroker": {
    "URI": "mqtt.example.com:1883",
    "username": "user",
    "password": "password",
    "customTopic": "custom/topic"
  }
}
]]></sourcecode></figure>

<t>Response:</t>

<t><list style="symbols">
  <t>If successful, the response will be identical to the request body.</t>
</list></t>

</section>
<section anchor="update-a-data-application"><name>Update a data application</name>

<t>Method: <spanx style="verb">PUT /registrations/data-apps{?dataAppId}</spanx></t>

<t>Description: Updates a data application registration.</t>

<t>Query Parameters:</t>

<t><list style="symbols">
  <t>dataAppId: the ID of the data application</t>
</list></t>

<t>Request Body:</t>

<t><list style="symbols">
  <t>The request body is identical to the request body for the register data application API <xref target="register-data-app"/>.</t>
</list></t>

<t>Response:</t>

<t><list style="symbols">
  <t>If successful, the response will be identical to the request body.</t>
</list></t>

</section>
<section anchor="get-a-data-application"><name>Get a data application</name>

<t>Method: <spanx style="verb">GET /registrations/data-apps{?dataAppId}</spanx></t>

<t>Description: Gets a data application object registered with the gateway.</t>

<t>Query Parameters:</t>

<t><list style="symbols">
  <t>dataAppId: the ID of the data application</t>
</list></t>

<t>Response:</t>

<t>The response will be identical to the request body for the register data application API <xref target="register-data-app"/>.</t>

</section>
<section anchor="delete-a-data-application"><name>Delete a data application</name>

<t>Method: <spanx style="verb">DELETE /registrations/data-apps{?dataAppId}</spanx></t>

<t>Description: Deletes a data application registered with the gateway.</t>

<t>Query Parameters:</t>

<t><list style="symbols">
  <t>dataAppId: the ID of the data application</t>
</list></t>

<t>Response:</t>

<t><list style="symbols">
  <t>If successful, the response will be <spanx style="verb">204 No Content</spanx>.</t>
</list></t>

</section>
</section>
</section>
<section anchor="nipc-operation-apis"><name>NIPC Operation APIs</name>

<t>The NIPC operation APIs perform protocol‑neutral interactions on SDF affordances, properties, events, and actions. This allows applications to read and update device properties, invoke actions, and consume events.</t>

<t>NIPC defines three API collections aligned with the SDF Affordances defined in <xref section="1.2" sectionFormat="of" target="RFC9880"/>:</t>

<t><list style="symbols">
  <t>Properties: read and write device properties.</t>
  <t>Events: enable and disable device event reporting.</t>
  <t>Actions: invoke device actions.</t>
</list></t>

<t>Additionally, NIPC defines one more API collection that allows applications to install triggers on events. Triggers will trigger an action if the event is executed. Trigger collection:</t>

<t><list style="symbols">
  <t>Triggers: Install a trigger on an event (invokes an action)</t>
</list></t>

<t>To invoke NIPC operations APIs on a device, one or more SDF models MUST be registered for that device. The SDF model MAY have a top‑level sdfThing (with multiple sdfObjects) or a top‑level sdfObject. Operations depend on affordances (sdfProperty, sdfEvent, sdfAction) defined in the registered SDF model and on a device ID (see <xref target="I-D.ietf-scim-device-model"/>). Affordances are referenced by their SDF global name (absolute URI with fragment) as described in <xref section="4" sectionFormat="of" target="RFC9880"/>.</t>

<t>The NIPC Gateway must match the SDF global name against the registered SDF model to resolve the protocol mapping (protocolmap) the gateway will execute. When carried in a URI, the SDF global name MUST be percent‑encoded per <xref section="2.1" sectionFormat="of" target="RFC3986"/>.</t>

<section anchor="nipc-property-apis"><name>NIPC Property APIs</name>

<t>These APIs allow applications to read and update device properties. If the underlying protocol requires a connection, the gateway establishes it implicitly for the operation; when an explicit connection is already active, operations reuse it without modification.</t>

<t>Requests and responses support content negotiation via Content-Type and Accept.
When using "application/nipc+json", payloads must follow the examples above. Binary property values must be base64‑encoded with padding per <xref section="5" sectionFormat="of" target="RFC4648"/> in the "value" field. For other media types, payload semantics must follow the selected media type.</t>

<section anchor="update-one-or-multiple-values"><name>Update one or multiple values</name>

<t>Method: <spanx style="verb">PUT /devices/{id}/properties{?propertyName}</spanx></t>

<t>Description: Write values to one or more properties on a device</t>

<t>Parameters:</t>

<t><list style="symbols">
  <t>id: the ID of the device</t>
</list></t>

<t>Query Parameters:</t>

<t><list style="symbols">
  <t>propertyName: Identifies a single property to update. If present, the request body MAY use any media type appropriate to the property payload.</t>
</list></t>

<t>-or-</t>

<t><list style="symbols">
  <t>If absent, the request body MUST be application/nipc+json and contain an array of update items, each with a property and a value.</t>
</list></t>

<t>Request Body:</t>

<t><list style="symbols">
  <t>If the query parameter propertyName is provided, the request body MAY use any media type appropriate to the property payload. The value is encoded as per the content type of the payload.</t>
</list></t>

<t>-or-</t>

<t><list style="symbols">
  <t>If the query parameter propertyName is NOT provided, the request body must be an array of properties to update, each containing a property and a value. The value attribute contains the raw binary data, which must be encoded in base64 with padding as per <xref section="5" sectionFormat="of" target="RFC4648"/>.</t>
</list></t>

<figure><sourcecode type="cddl" markers="true" name="property_value_array.cddl"><![CDATA[
PropertyValueArray = [* PropertyValue]

; Minimal PropertyValue shape (matches allOf of Property + Value)
PropertyValue = {
  property: text,        ; SDF global name of the property
  value: b64text         ; base64-encoded bytes (RFC 4648 Section 5)
}

; Helper type for base64-with-padding encoded text
b64text = text
]]></sourcecode></figure>

<t>Example body for updating multiple properties:</t>

<figure title="Example updating multiple properties" anchor="exupmprop"><sourcecode type="json" markers="true"><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

[
  {
    "property": "https://example.com/heartrate#/sdfObject/thermostat\
                                           /sdfProperty/temperature",
    "value": "dGVzdA=="
  },
  {
    "property": "https://example.com/heartrate#/sdfObject/thermostat\
                                              /sdfProperty/humidity",
    "value": "eGVzdB=="
  }
]
]]></sourcecode></figure>

<t>Response:</t>

<t><list style="symbols">
  <t>If the Accept header is set to <spanx style="verb">application/nipc+json</spanx>, the response must be an array with a status field set to 200 for each property that was updated, or a problem type object for each property that failed to update. The "properties" array must be an array of properties that were updated, each containing a property and a value.</t>
</list></t>

<t>-or-</t>

<t><list style="symbols">
  <t>If the Accept header is set to any other media type and the propertyName query parameter is provided, the response must be 204 No Content with no body.</t>
</list></t>

<figure><sourcecode type="cddl" markers="true" name="property_value_response_array.cddl"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

PropertyValueResponseArray = [* PropertyValueResponseArrayItem]

PropertyValueResponseArrayItem = ( SuccessResponse // \
                                                    FailureResponse )

; Minimal success shape (may be extended)
SuccessResponse = {
  status: uint
}
]]></sourcecode></figure>

<t>Example of a response:</t>

<figure title="Example update multiple properties response" anchor="exupmresp"><sourcecode type="json" markers="true"><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

[
  {
    "status": 200
  },
  {
    "type": "https://www.iana.org/assignments/nipc-problem-types#\
                                                   invalid-property",
    "status": 400,
    "title": "Invalid Property",
    "detail": "Property https://example.com/heartrate#/sdfObject/\
thermostat/sdfProperty/temperature does not exist or is not writable"
  }
]
]]></sourcecode></figure>

</section>
<section anchor="read-one-or-multiple-values"><name>Read one or multiple values</name>

<t>Method: <spanx style="verb">GET /devices/{id}/properties{?propertyName*}</spanx></t>

<t>Description: Read values from one or more properties on a device</t>

<t>Parameters:</t>

<t><list style="symbols">
  <t>id: the ID of the device</t>
</list></t>

<t>Query Parameters:</t>

<t><list style="symbols">
  <t>propertyName: The property to read. This can be a single property or multiple properties. If multiple properties are provided, the request body MUST contain an application/nipc+json payload with an array of properties to read.</t>
</list></t>

<t>Response:</t>

<t><list style="symbols">
  <t>If the Accept header is set to <spanx style="verb">application/nipc+json</spanx>, the response must be an array of properties, each containing a property and a value. The value must be the raw binary data read from the property, encoded in base64 with padding as per <xref section="5" sectionFormat="of" target="RFC4648"/>. The array must contain objects with 2 attributes:
    - property: The property that was read.
    - value: The bytes that were read in base64 encoding</t>
</list></t>

<t>-or-</t>

<t><list style="symbols">
  <t>If the Accept header is set to any other media type and a single propertyName query parameter is provided, the request body MAY use any media type appropriate to the property payload. The value is encoded as per the content type of the payload.</t>
</list></t>

<figure><sourcecode type="cddl" markers="true" name="property_value_read_response_array.cddl"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

PropertyValueReadResponseArray = [* \
                                  PropertyValueReadResponseArrayItem]

PropertyValueReadResponseArrayItem = ( PropertyValue // \
                                                    FailureResponse )
]]></sourcecode></figure>

<t>Example of a response:</t>

<figure title="Example read multiple properties response" anchor="exreadmresp"><sourcecode type="json" markers="true"><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

[
  {
    "property": "https://example.com/heartrate#/sdfObject/thermostat\
                                           /sdfProperty/temperature",
    "value": "dGVzdA=="
  },
  {
    "property": "https://example.com/heartrate#/sdfObject/thermostat\
                                              /sdfProperty/humidity",
    "value": "eGVzdB=="
  }
]
]]></sourcecode></figure>

</section>
</section>
<section anchor="nipc-event-apis"><name>NIPC Event APIs</name>

<t>Event APIs enable or disable reporting of device events. For certain protocols, a connection may be required. If the underlying protocol requires a connection, the gateway establishes it implicitly for the operation. If an explicitly created connection is already active, it is reused without modification.</t>

<t>Events are referenced by the SDF global name of an sdfEvent. The {id} path segment identifies a device or a group of devices. A group event MAY be enabled only if the underlying protocol supports group activation (e.g., BLE advertisement or connection status events).</t>

<t>Events are delivered to registered data-apps over a publish/subscribe interface, as defined in <xref target="pubsub"/>.
If the data application registered for this event is an MQTT broker or client, the event SDF global name may be used to construct the MQTT topic for the event. The topic is constructed using the data application ID, the default namespace for the event, and the event itself.
For example, if the data application ID is "0927ce7c-b258-4bfa-a345-bcc9f74385b4"
and the event is "https://example.com/thermometer#/sdfThing/thermometer/sdfEvent/isPresent", the topic will be:</t>

<figure><artwork><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

data-app/<dataAppId>/<namespace>/<json_pointer_to_sdf_event>

data-app/0927ce7c-b258-4bfa-a345-bcc9f74385b4/thermometer/sdfThing/\
                                       thermometer/sdfEvent/isPresent
]]></artwork></figure>

<t>A data application may subscribe to this topic using the topic or it may use MQTT wildcards to subscribe to <spanx style="verb">data-app/+/temperature/#</spanx> to receive all events for the <spanx style="verb">temperature</spanx> namespace.</t>

<t>If a customTopic was supplied in the data‑app registration (mqttBroker case), that topic MUST be used instead of the constructed default.</t>

<section anchor="enable-event-reporting"><name>Enable event reporting</name>

<t>Method: <spanx style="verb">POST /devices/{id}/events{?eventName}</spanx></t>

<t>Description: Enables an event on a device</t>

<t>Parameters:</t>

<t><list style="symbols">
  <t>id: the ID of the device</t>
</list></t>

<t>Query Parameters:</t>

<t><list style="symbols">
  <t>eventName: the event to enable. The eventName must be a URL encoded string that is the absolute URI that is the global name of an <spanx style="verb">sdfEvent</spanx>.</t>
</list></t>

<t>Response:</t>

<t><list style="symbols">
  <t>Returns HTTP status code 201 Created with a Location header pointing to the created event instance.</t>
</list></t>

<t>Example of a successful response:</t>

<figure><artwork><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

HTTP/1.1 201 Created
Location: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/events?\
                      instanceId=02ee282c-8915-4b2e-bbd2-88966773134a
]]></artwork></figure>

<t>The Location header must contain the URI for the created event instance, which may be used to check status or disable the event.</t>

</section>
<section anchor="disable-event-reporting"><name>Disable event reporting</name>

<t>Method: <spanx style="verb">DELETE /devices/{id}/events{?instanceId}</spanx></t>

<t>Description: Disables an event on a device</t>

<t>Parameters:</t>

<t><list style="symbols">
  <t>id: the ID of the device or group of devices</t>
</list></t>

<t>Query Parameters:</t>

<t><list style="symbols">
  <t>instanceId: the instance ID of the event to disable (obtained from the Location header when the event was enabled)</t>
</list></t>

<t>Response:</t>

<t><list style="symbols">
  <t>Returns HTTP status code 204 No Content on successful disable.</t>
</list></t>

<figure><artwork><![CDATA[
HTTP/1.1 204 No Content
]]></artwork></figure>

</section>
<section anchor="get-status-of-one-or-more-events"><name>Get status of one or more events</name>

<t>Method: <spanx style="verb">GET /devices/{id}/events{?instanceId*}</spanx></t>

<t>Description: Get the status of one or more events on a specific device</t>

<t>Parameters:</t>

<t><list style="symbols">
  <t>id: the ID of the device or group of devices</t>
</list></t>

<t>Query Parameters:</t>

<t><list style="symbols">
  <t>instanceId: a comma separated list of event instance IDs to filter by (optional)</t>
</list></t>

<t>Response:
The response must be an array of events, each containing an instanceID and an event.
 - instanceId: must be the unique instance ID for each enabled event.
 - event: must be the event URI for each enabled event.</t>

<figure><sourcecode type="cddl" markers="true" name="event_status_array.cddl"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

EventStatusResponseArray = [* EventStatusResponseArrayItem]

EventStatusResponseArrayItem = ( EventInstanceSuccess // \
                                                    FailureResponse )

; Success item = { event, instanceId }
EventInstanceSuccess = {
  event: text,        ; SDF global name of the event (absolute URI \
                                                       with fragment)
  instanceId: text    ; UUID (as text)
}
]]></sourcecode></figure>

<t>Example of a response:</t>

<figure title="Example get multiple events status response" anchor="exgetmresp"><sourcecode type="json" markers="true"><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

[
  {
    "instanceId": "02ee282c-8915-4b2e-bbd2-88966773134a",
    "event": "https://example.com/heartrate#/sdfObject/healthsensor/\
                                               sdfEvent/fallDetected"
  }
]
]]></sourcecode></figure>

</section>
<section anchor="enable-event-reporting-on-a-group-of-devices"><name>Enable event reporting on a group of devices</name>

<t>Method: <spanx style="verb">POST /groups/{id}/events</spanx></t>

<t>Description: Enables an event on a group of devices</t>

<t>Parameters:</t>

<t><list style="symbols">
  <t>id: the ID of the group of devices</t>
</list></t>

<t>Query Parameters:</t>

<t><list style="symbols">
  <t>eventName: the event to enable. The eventName is a URL encoded string that is the absolute URI that is the global
name of an <spanx style="verb">sdfEvent</spanx>.</t>
</list></t>

<t>Response:</t>

<t><list style="symbols">
  <t>The response must return HTTP status code 201 Created with a Location header pointing to the created event instance. The Location header must contain the URI for the created event instance, which can be used to check status or disable the event.</t>
</list></t>

<t>Example of a successful response:</t>

<figure><artwork><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

HTTP/1.1 201 Created
Location: /groups/0dc729d7-f6c3-491d-9b9d-e7176d2be243/events?\
                      instanceId=f1b9f26b-21ce-4deb-9d57-289ba7e17cce
]]></artwork></figure>

</section>
<section anchor="disable-event-reporting-on-a-group-of-devices"><name>Disable event reporting on a group of devices</name>

<t>Method: <spanx style="verb">DELETE /groups/{id}/events{?instanceId}</spanx></t>

<t>Description: Disables an event on a group of devices</t>

<t>Parameters:</t>

<t><list style="symbols">
  <t>id: the ID of the group of devices</t>
</list></t>

<t>Query Parameters:</t>

<t><list style="symbols">
  <t>instanceId: the instance ID of the event to disable (obtained from the Location header when the event was enabled)</t>
</list></t>

<t>Response:</t>

<t>MUST return 200 OK with an array of per‑device event status entries. For each device where the event was successfully disabled, the entry MUST include deviceId and event (SDF global name). For each device where disabling failed, the entry MUST be a Problem Details error object for that device.</t>

<figure><sourcecode type="cddl" markers="true" name="group_event_status_response_array.cddl"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

GroupEventStatusResponseArray = [* GroupEventStatusResponse]

GroupEventSuccessResponse = { event: text, deviceId: text }

; Each item is either an event+deviceId success or a \
                                                 GroupFailureResponse
GroupEventStatusResponse = (GroupEventSuccessResponse // \
                                                GroupFailureResponse)

GroupFailureResponse = {
  FailureResponse,
  ? deviceId: text
}
]]></sourcecode></figure>

<t>Example of a response:</t>

<figure><sourcecode type="json"><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

[
  {
    "event": "https://example.com/heartrate#/sdfObject/healthsensor/\
                                              sdfEvent/fallDetected",
    "deviceId": "1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30"
  },
  {
    "event": "https://example.com/heartrate#/sdfObject/healthsensor/\
                                              sdfEvent/fallDetected",
    "deviceId": "d62c7fb2-a216-4811-a388-053b17fdbedc"
  },
  {
    "event": "https://example.com/heartrate#/sdfObject/healthsensor/\
                                              sdfEvent/fallDetected",
    "deviceId": "01b52a23-b98c-454c-ba9e-086a43bdfd79"
  },
  {
    "type": "https://www.iana.org/assignments/nipc-problem-types#\
                                                  event-not-enabled",
    "status": 400,
    "title": "Event Not Enabled",
    "deviceId": "9171ec16-e3c1-4ccf-ad23-b92a1a3f069d",
    "detail": "Failed to disable the event for device 9171ec16-e3c1-\
                                              4ccf-ad23-b92a1a3f069d"
  }
]
]]></sourcecode></figure>

</section>
<section anchor="get-event-status-on-a-group-of-devices"><name>Get event status on a group of devices</name>

<t>Method: <spanx style="verb">GET /groups/{id}/events{?instanceId}</spanx></t>

<t>Description: Get the status of one or more events for a group of devices</t>

<t>Parameters:</t>

<t><list style="symbols">
  <t>id: the ID of the group of devices</t>
</list></t>

<t>Query Parameters:</t>

<t><list style="symbols">
  <t>instanceId: the instance ID of the event (obtained from the Location header when the event was enabled).</t>
</list></t>

<t>Response:</t>

<t>MUST return 200 OK with an array of per‑device event status entries. For each device where the event was successfully enabled, the entry MUST include deviceId and event (SDF global name). For each device where enabling failed, the entry MUST be a Problem Details error object for that device.</t>

<figure><sourcecode type="cddl" markers="true" name="group_event_status_response_array.cddl"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

GroupEventStatusResponseArray = [* GroupEventStatusResponse]

GroupEventSuccessResponse = { event: text, deviceId: text }

; Each item is either an event+deviceId success or a \
                                                 GroupFailureResponse
GroupEventStatusResponse = (GroupEventSuccessResponse // \
                                                GroupFailureResponse)

GroupFailureResponse = {
  FailureResponse,
  ? deviceId: text
}
]]></sourcecode></figure>

<t>Example of a response:</t>

<figure title="Example get multiple group events status response" anchor="exgetmgevntsresp"><sourcecode type="json" markers="true"><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

[
  {
    "event": "https://example.com/heartrate#/sdfObject/healthsensor/\
                                              sdfEvent/fallDetected",
    "deviceId": "1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30"
  },
  {
    "event": "https://example.com/heartrate#/sdfObject/healthsensor/\
                                              sdfEvent/fallDetected",
    "deviceId": "d62c7fb2-a216-4811-a388-053b17fdbedc"
  },
  {
    "event": "https://example.com/heartrate#/sdfObject/healthsensor/\
                                              sdfEvent/fallDetected",
    "deviceId": "01b52a23-b98c-454c-ba9e-086a43bdfd79"
  },
  {
    "type": "https://www.iana.org/assignments/nipc-problem-types#\
                                                  event-not-enabled",
    "status": 400,
    "title": "Event Not Enabled",
    "deviceId": "9171ec16-e3c1-4ccf-ad23-b92a1a3f069d",
    "detail": "Failed to enable the event for device 9171ec16-e3c1-\
                                              4ccf-ad23-b92a1a3f069d"
  }
]
]]></sourcecode></figure>

</section>
</section>
<section anchor="nipc-action-apis"><name>NIPC Action APIs</name>

<t>NIPC Action APIs invoke device actions. If the underlying protocol requires a connection, the gateway establishes it implicitly for the operation. If an explicitly established connection is already active, the operation MUST reuse it without modification.</t>

<section anchor="perform-an-action"><name>Perform an action</name>

<t>Method: <spanx style="verb">POST /devices/{id}/actions{?actionName}</spanx></t>

<t>Description: Perform an action on a specific device</t>

<t>Parameters:</t>

<t><list style="symbols">
  <t>id: the ID of the device</t>
</list></t>

<t>Query Parameters:</t>

<t><list style="symbols">
  <t>actionName: the action to perform</t>
</list></t>

<t>Request Body:</t>

<t>The request body is optional and may contain a value. The media type of the value can be defined by the underlying protocol, for example it could be octet-stream for binary data.</t>

<t>Response:</t>

<t>Actions are performed asynchronously. A successful request returns HTTP status code 202 Accepted with a Location header pointing to the action instance for status checking, and a Retry-After header indicating the number of seconds the client should wait before polling. The Location header contains the URI for the action instance, which can be used to check the action status.</t>

<t>Example of a successful response:</t>

<figure><artwork><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

HTTP/1.1 202 Accepted
Location: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/actions?\
                      instanceId=02ee282c-8915-4b2e-bbd2-88966773134a
Retry-After: 5
]]></artwork></figure>

</section>
<section anchor="check-action-status"><name>Check action status</name>

<t>Method: <spanx style="verb">GET /devices/{id}/actions{?instanceId}</spanx></t>

<t>Description: Check the status of an action on a specific device</t>

<t>Parameters:</t>

<t><list style="symbols">
  <t>id: the ID of the device</t>
</list></t>

<t>Query Parameters:</t>

<t><list style="symbols">
  <t>instanceId: the instance ID of the action (obtained from the Location header)</t>
</list></t>

<t>Response:
MUST return 200 OK with an action status, which may be "IN_PROGRESS" or "COMPLETED".</t>

<figure><sourcecode type="cddl" markers="true" name="action_response.cddl"><![CDATA[
ActionResponse = {
  status: ActionStatus
}

ActionStatus = "IN_PROGRESS" / "COMPLETED"
]]></sourcecode></figure>

<t>Example of a response:</t>

<figure title="Example action status response" anchor="exactionstatusresp"><sourcecode type="json" markers="true"><![CDATA[
{
  "status": "COMPLETED"
}
]]></sourcecode></figure>

</section>
</section>
<section anchor="nipc-trigger-apis"><name>NIPC Trigger APIs</name>

<t>Triggers APIs do not actually execute an operation on a device or group of devices, but install a trigger that registers an operation. When triggered the registered operation gets executed.</t>

<t>Triggers can be installed for devices or groups of devices, represented by their id as a path parameter.</t>

<t>The trigger must always be triggered by an event. the global name of the event must be passed as a path parameter.</t>

<t>The triggered operation must always be an action. Since an action can be executed against both a device and a group, the trigger API also supports actions on both devices and groups of devices. The action is defined by its full NIPC URI to be executed, for example:</t>

<figure><artwork><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

/devices/3171ec43-42a5-4415-ab4b-afd0dfbe9615/actions?actionName=\
       https://example.com/AlarmSystem#/sdfObject/bell/sdfAction/ring
]]></artwork></figure>

<t>If a NIPC Gateway supports multiple protocols, then a trigger can be defined on a devices that supports one protocol and triggers an action on a device that supports a different protocol. As an example, an event on a BLE device can trigger an action on a Zigbee device.</t>

<section anchor="create-a-trigger-on-a-device"><name>Create a trigger on a device</name>

<t>Method: <spanx style="verb">POST /devices/{id}/triggers{?eventName}</spanx></t>

<t>Description: Creates a trigger on an affordance of a device. A trigger will trigger an action on another device or a group of devices. If a trigger for the same <spanx style="verb">eventName</spanx> is already enabled on the device, the gateway MUST return an error with the <spanx style="verb">trigger-already-enabled</spanx> problem type.</t>

<t>Parameters:</t>

<t><list style="symbols">
  <t>id: the ID of the device</t>
</list></t>

<t>Query Parameters:</t>

<t><list style="symbols">
  <t>eventName: the eventName of the event that is associated with the trigger. This must be a URL encoded string that is the absolute URI that is the global name of an <spanx style="verb">sdfEvent</spanx>.</t>
</list></t>

<t>Request Body:</t>

<t><list style="symbols">
  <t>The request body must be of type 'application/nipc+json', and contain an action object. The action object contains a NIPC URI to be executed, including the device or group id and actionname percent-encoded query parameter.</t>
</list></t>

<figure><sourcecode type="cddl" markers="true" name="action.cddl"><![CDATA[
Action = {
  action: text  ; NIPC action operation to execute
}
]]></sourcecode></figure>

<t>Example body for trigger creation:</t>

<figure title="Example trigger creation" anchor="excreatetrigger"><sourcecode type="json" markers="true"><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

{
  "action": "/devices/3171ec43-42a5-4415-ab4b-afd0dfbe9615/actions?\
actionName=https%3A%2F%2Fexample.com%2FAlarmSystem%23%2FsdfObject%\
                                           2Fbell%2FsdfAction%2Fring"
}
]]></sourcecode></figure>

<t>Response:</t>

<t><list style="symbols">
  <t>Returns HTTP status code 201 Created with a Location header pointing to the created trigger instance.</t>
</list></t>

<t>Example of a successful response:</t>

<figure><artwork><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

HTTP/1.1 201 Created
Location: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/triggers?\
                      instanceId=02ee282c-8915-4b2e-bbd2-88966773134a
]]></artwork></figure>

<t>The Location header must contain the URI for the created trigger instance, which may be used to check status or disable the trigger.</t>

</section>
<section anchor="delete-a-trigger-on-a-device"><name>Delete a trigger on a device</name>

<t>Method: <spanx style="verb">DELETE /devices/{id}/triggers{?instanceId}</spanx></t>

<t>Description: Deletes an installed trigger</t>

<t>Parameters:</t>

<t><list style="symbols">
  <t>id: the ID of the device</t>
</list></t>

<t>Query Parameters:</t>

<t><list style="symbols">
  <t>instanceId: the instance ID of the trigger to disable (obtained from the Location header when the trigger was installed)</t>
</list></t>

<t>Response:</t>

<t><list style="symbols">
  <t>Returns HTTP status code 204 No Content on successful delete.</t>
</list></t>

<figure><artwork><![CDATA[
HTTP/1.1 204 No Content
]]></artwork></figure>

</section>
<section anchor="get-installed-triggers-for-a-device"><name>Get installed triggers for a device</name>

<t>Method: <spanx style="verb">GET /devices/{id}/triggers{?instanceId}</spanx></t>

<t>Description: Get the installed triggers for a devices, or a specific trigger when specifying an instanceId.</t>

<t>Parameters:</t>

<t><list style="symbols">
  <t>id: the ID of the device</t>
</list></t>

<t>Query Parameters:</t>

<t><list style="symbols">
  <t>instanceId: an InstanceID, or comma separated list of event instance IDs to filter by (optional)</t>
  <t>If no query parameter is supplied, then all triggers for the device must be retrieved</t>
</list></t>

<t>Response:</t>

<t>The response must be an array of triggers, each containing an instanceId, the sdfName of an event and an action.</t>

<t><list style="symbols">
  <t>instanceId: must be the instance ID for each installed trigger, as returned by the NIPC GW when the trigger was created.</t>
  <t>eventName: must be the sdfName of the event that is associated with the trigger.</t>
  <t>action: must be the NIPC URI of the action to be executed when the trigger is activated.</t>
</list></t>

<figure><sourcecode type="cddl" markers="true" name="trigger_status_array.cddl"><![CDATA[
; Trigger status response array and item shape

TriggerStatusResponseArray = [* TriggerResponse]

TriggerResponse = {
  eventName: text,      ; SDF event name
  action: text,      ; NIPC action operation to execute
  instanceId: text     ; UUID (as text)
}
]]></sourcecode></figure>

<t>Example of a response:</t>

<figure title="Example get multiple triggers response" anchor="exgetmtriggers"><sourcecode type="json" markers="true"><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

[
  {
    "instanceId": "02ee282c-8915-4b2e-bbd2-88966773134a",
    "sdfName": "https://example.com/heartrate#/sdfObject/\
                                                       healthsensor",
    "action": "/devices/3171ec43-42a5-4415-ab4b-afd0dfbe9615/actions\
?actionName=https%3A%2F%2Fexample.com%2FAlarmSystem%23%2FsdfObject%\
                                           2Fbell%2FsdfAction%2Fring"
  }
]
]]></sourcecode></figure>

</section>
<section anchor="create-a-trigger-on-a-group-of-devices"><name>Create a trigger on a group of devices</name>

<t>Method: <spanx style="verb">POST /groups/{id}/triggers{?eventName}</spanx></t>

<t>Description: Creates a trigger on an affordance of a group of devices. A trigger will trigger an action on another device or a group of devices. If a trigger for the same <spanx style="verb">eventName</spanx> is already enabled on the group, the gateway MUST return an error with the <spanx style="verb">trigger-already-enabled</spanx> problem type.</t>

<t>Parameters:</t>

<t><list style="symbols">
  <t>id: the ID of the group of devices</t>
</list></t>

<t>Query Parameters:</t>

<t><list style="symbols">
  <t>eventName: the eventName of the affordance that is associated with the trigger. This must be an event. The eventName must be a URL encoded string that is the absolute URI that is the global name of an <spanx style="verb">sdfEvent</spanx>.</t>
</list></t>

<t>Request Body:</t>

<t><list style="symbols">
  <t>The request body must be of type 'application/nipc+json', and contain an action object. The action object contains a NIPC URI to be executed, including the device or group id and actionname percent-encoded query parameter.</t>
</list></t>

<figure><sourcecode type="cddl" markers="true" name="action.cddl"><![CDATA[
Action = {
  action: text  ; NIPC action operation to execute
}
]]></sourcecode></figure>

<t>Example body for trigger creation:</t>

<figure title="Example trigger creation" anchor="excreategrouptrigger"><sourcecode type="json" markers="true"><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

{
  "action": "/groups/3171ec43-42a5-4415-ab4b-afd0dfbe9615/actions?\
actionName=https%3A%2F%2Fexample.com%2FAlarmSystem%23%2FsdfObject%\
                                           2Fbell%2FsdfAction%2Fring"
}
]]></sourcecode></figure>

<t>Response:</t>

<t><list style="symbols">
  <t>Returns HTTP status code 201 Created with a Location header pointing to the created trigger instance.</t>
</list></t>

<t>Example of a successful response:</t>

<figure><artwork><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

HTTP/1.1 201 Created
Location: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/triggers?\
                      instanceId=02ee282c-8915-4b2e-bbd2-88966773134a
]]></artwork></figure>

<t>The Location header must contain the URI for the created trigger instance, which may be used to check status or disable the trigger.</t>

</section>
<section anchor="delete-a-trigger-on-a-group-of-devices"><name>Delete a trigger on a group of devices</name>

<t>Method: <spanx style="verb">DELETE /groups/{id}/triggers{?instanceId}</spanx></t>

<t>Description: Deletes an installed trigger</t>

<t>Parameters:</t>

<t><list style="symbols">
  <t>id: the ID of the group of devices</t>
</list></t>

<t>Query Parameters:</t>

<t><list style="symbols">
  <t>instanceId: the instance ID of the trigger to disable (obtained from the Location header when the trigger was installed)</t>
</list></t>

<t>Response:</t>

<t><list style="symbols">
  <t>Returns HTTP status code 204 No Content on successful delete.</t>
</list></t>

<figure><artwork><![CDATA[
HTTP/1.1 204 No Content
]]></artwork></figure>

</section>
<section anchor="get-installed-triggers-for-a-group-of-devices"><name>Get installed triggers for a group of devices</name>

<t>Method: <spanx style="verb">GET /groups/{id}/triggers{?instanceId}</spanx></t>

<t>Description: Get the installed triggers for a group of devices, or a specific trigger when specifying an instanceId.</t>

<t>Parameters:</t>

<t><list style="symbols">
  <t>id: the ID of the group of devices</t>
</list></t>

<t>Query Parameters:</t>

<t><list style="symbols">
  <t>instanceId: an InstanceID, or comma separated list of event instance IDs to filter by (optional)</t>
  <t>If no query parameter is supplied, then all triggers for the group of devices must be retrieved</t>
</list></t>

<t>Response:</t>

<t>The response must be an array of triggers, each containing an instanceId, the sdfName of an affordance and an action.
 - deviceId: must be the device ID for each installed trigger.
 - eventName: must be the sdfName of the affordance (event or action) that is associated with the trigger.
 - action: must be the NIPC URI of the action to be executed when the trigger is activated.</t>

<figure><sourcecode type="cddl" markers="true" name="group_trigger_status_array.cddl"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

; Group Trigger status response array and item shape

GroupTriggerStatusResponseArray = [* GroupTriggerResponse]

GroupTriggerResponse = (GroupTriggerSuccessResponse // \
                                         GroupTriggerFailureResponse)

GroupTriggerSuccessResponse = {
  eventName: text,      ; SDF event name
  action: text,      ; NIPC action operation to execute
  deviceId: text     ; UUID (as text)
}

GroupTriggerFailureResponse = {
  FailureResponse,
  ? deviceId: text
}
]]></sourcecode></figure>

<t>Example of a response:</t>

<figure title="Example get multiple group triggers response" anchor="exgetmgrouptriggers"><sourcecode type="json" markers="true"><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

[
  {
    "deviceId": "02ee282c-8915-4b2e-bbd2-88966773134a",
    "eventName": "https://example.com/heartrate#/sdfObject/\
                                         healthsensor/sdfEvent/rate",
    "action": "/devices/3171ec43-42a5-4415-ab4b-afd0dfbe9615/actions\
?actionName=https%3A%2F%2Fexample.com%2FAlarmSystem%23%2FsdfObject%\
                                           2Fbell%2FsdfAction%2Fring"
  }
]
]]></sourcecode></figure>

</section>
</section>
<section anchor="nipc-connection-management-apis"><name>NIPC explicit connection management APIs</name>

<t>Some protocols do not require explicit connection setup; for those protocols, the APIs in this section do not apply. For protocols that do require a connection (e.g., BLE), an NIPC gateway performs implicit connection management for individual operations (establish on demand; release on completion), so clients ordinarily need not manage connections. Clients MAY choose to explicitly establish and retain a connection to perform a sequence of operations that depends on intermediate results. This section specifies APIs for explicit connection lifecycle control. Examples use BLE.</t>

<section anchor="protocol-information-obj"><name>Protocol Information Object</name>
<t>The protocol information object is used to define protocol specific parameters for connections. The protocol information object is protocol specific and defined in the protocol extensions. An example of where a protocol info object would be used is to return protocol specific connection parameters when making connections, for example a BLE service map. An example of a BLE protocol information object is shown below.</t>

<t>This specification defines both the BLE and the Zigbee protocol information objects for connections and broadcast messages.</t>

<figure><sourcecode type="cddl" markers="true" name="protocolinfo.cddl"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

; Top-level wrappers
protocol-info-service-map = (
  ? protocolInformation: ble-service-map / zigbee-service-map
)

protocol-info-broadcast = (
  ? protocolInformation: ble-broadcast / zigbee-broadcast
)

; BLE protocol information
ble-service-map = {
  ble: {
    ? services: [* ble-service],
    ? cached: bool,
    ? cacheExpiryDuration: int,
    ? autoUpdate: bool,
    ? bonding: bonding-type,
  }
}

bonding-type = "default" / "none" / "justworks" / "passkey" / "oob"

ble-service = {
  serviceID: uuid,
  ? characteristics: [* ble-characteristic],
}

ble-characteristic = {
  characteristicID: uuid,
  ? flags: [* ble-flag],
  ? descriptors: [* ble-descriptor],
}

ble-flag = "read" / "write" / "notify" / "indicate" / "write-no-\
                                                            response"

ble-descriptor = {
  descriptorID: uuid,
}

ble-broadcast = {
  ble: {
    ? connectable: bool,
  },
}

; Zigbee protocol information
zigbee-service-map = {
  zigbee: {
    ? endpoints: [* zigbee-endpoint],
  },
}

zigbee-endpoint = {
  endpointID: uint,
  ? clusters: [* zigbee-cluster],
}

zigbee-cluster = {
  clusterID: uint,
  ? properties: [* zigbee-property],
}

zigbee-property = {
  attributeID: uint,
  propertyType: uint,
}

zigbee-broadcast = {
  zigbee: {
  },
}

; Basic types
uuid = tstr .regexp "(?i)^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-\
                                                 f]{4}-[0-9a-f]{12}$"
]]></sourcecode></figure>

</section>
<section anchor="connect-to-a-device"><name>Connect to a device</name>

<t>Method: <spanx style="verb">POST /devices/{id}/connections</spanx></t>

<t>Description: Connect to a device</t>

<t>Parameters:</t>

<t><list style="symbols">
  <t>id: the ID of the device</t>
</list></t>

<t>Request Body:</t>

<t><list style="symbols">
  <t>Connection retry parameters</t>
  <t>A protocol info object representing the BLE service map to be discovered. In the case of BLE, if no protocol info object is included, service discovery is performed to discover all supported properties when connecting to a device. Optionally, service discovery may be limited to properties defined in the "ble" protocol extension. The services to be discovered can be added in an array. Property discovery can be buffered across connections, so the API also supports caching parameters.</t>
</list></t>

<figure><sourcecode type="cddl" markers="true" name="connection.cddl"><![CDATA[
ConnectionRequest = {
  ? retries: uint,
  ? protocol-info-service-map
}

ConnectionResponse = {
  id: text,  ; Device ID
  ? protocol-info-service-map
}
]]></sourcecode></figure>

<t>Example body of a connection without specific discovery of properties:</t>

<figure title="Example connection" anchor="exconn"><sourcecode type="json" markers="true"><![CDATA[{
  "retries": 3
}
]]></sourcecode></figure>

<t>where-</t>

<t><list style="symbols">
  <t>"retries" defines the number of retries in case the operation does not
succeed</t>
</list></t>

<t>In case the application would like to discover specific properties of a device, an additional protocol information object can be provided that defines what properties should be discovered.</t>

<t>Example body of a BLE connection with specific discovery of properties:</t>

<figure title="Example connection with explicit discovery of connections" anchor="exconnprp"><sourcecode type="json" markers="true"><![CDATA[{
  "retries": 3,
  "protocolInformation": {
    "ble": {
      "services": [
        {
          "serviceID": "00001809-0000-1000-8000-00805f9b34fb"
        }
      ],
      "cached": false,
      "cacheExpiryDuration": 3600,
      "autoUpdate": true,
      "bonding": "default"
    }
  }
}
]]></sourcecode></figure>

<t>where in the BLE protocol object:</t>

<t><list style="symbols">
  <t>"services" is an array of services defined by their serviceIDs.</t>
  <t>"cached" refers to whether the services need to be discovered for this connection.
If cached is true, the services will be discovered for this connection only if it is not present in the cache.
If cached is false, the services will be discovered for this connection.
The services will be cached once it is discovered.</t>
  <t>"cacheExpiryDuration" defines how long (in seconds) the cache should be maintained
before purging.</t>
  <t>some devices support notifications on changes in services,
"autoUpdate" allows the network to update services based on
notification (on by default)</t>
  <t>"bonding" allows you to override the bonding method configured in the device object. Possible values are default, none, justworks, passkey, oob. Default behavior is to use the bonding method defined in the device object.</t>
</list></t>

<t>Response:</t>

<t>Success responses includes an optional protocol information object with an array of discovered properties, as defined in the BLE protocol info object in section <xref target="protocol-information-obj"/>.
This is an array of supported services, which in turn contains an array of characteristics, which in turn contains an array of descriptors, as shown in <xref target="BLEservices"/>.</t>

<figure title="BLE Services" anchor="BLEservices"><artwork><![CDATA[
    services
     - serviceID
        |
        |> characteristics
            - characteristicID
            - flags
               |
               |> Descriptors
                   - descriptorID
]]></artwork></figure>

<t>Example of a response:</t>

<figure title="Example connection response" anchor="exconnresp"><sourcecode type="json" markers="true"><![CDATA[
{
  "id": "1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30",
  "protocolInformation": {
    "ble": {
      "services": [
        {
          "serviceID": "00001809-0000-1000-8000-00805f9b34fb",
          "characteristics": [
            {
              "characteristicID":
                  "00002a1c-0000-1000-8000-00805f9b34fb",
              "flags": [
                "read",
                "write"
              ],
              "descriptors": [
                {
                  "descriptorID":
                      "00002902-0000-1000-8000-00805f9b34fb"
                }
              ]
            }
          ]
        }
      ]
    }
  }
}
]]></sourcecode></figure>

<t>where-</t>

<t><list style="symbols">
  <t>"id" is the ID of the device</t>
  <t>"protocolInformation" contains an Array of BLE services as shown in
   <xref target="BLEservices"/></t>
</list></t>

<t>A failure will generate a standard failed response. Please refer to <xref target="failure"/>
definition of failed response.</t>

</section>
<section anchor="update-a-connection"><name>Update a connection</name>

<t>Method: <spanx style="verb">PUT /devices/{id}/connections</spanx></t>

<t>Description: Update a connection, for BLE this will update the cached ServiceMap for a device. Full service discovery will be performed, unless specific services are described in the API body.</t>

<t>Parameters:</t>

<t><list style="symbols">
  <t>id: the ID of the device</t>
</list></t>

<t>Request Body:</t>

<t><list style="symbols">
  <t>A protocol information object. In the case of BLE, if no protocol information is included, service discovery is performed to discover all supported properties when connecting to a device. Optionally, service discovery may be limited to properties defined in the "ble" protocol extension. The services to be discovered can be added in an array. Property discovery can be buffered across connections, so the API also supports caching parameters.</t>
</list></t>

<t>Example body of an update connection:</t>

<figure title="Example service discovery response" anchor="exupconn"><sourcecode type="json" markers="true"><![CDATA[
{
  "protocolInformation": {
    "ble": {
      "services": [
        {
          "serviceID": "00001809-0000-1000-8000-00805f9b34fb"
        }
      ],
      "cached": false,
      "cacheExpiryDuration": 3600,
      "autoUpdate": true
    }
  }
}
]]></sourcecode></figure>

<t>where in the BLE protocol object:</t>

<t><list style="symbols">
  <t>"services" is an array of services defined by their serviceIDs</t>
  <t>"cached" refers to whether the services need to be cached for
subsequent connects, in order not to perform service discovery on
each request</t>
  <t>"cacheExpiryDuration" defines how long the cache should be maintained
before purging</t>
  <t>some devices support notifications on changes in services,
"autoUpdate" allows the network to update services based on
notification (on by default)</t>
</list></t>

<t>Response:</t>

<t>Success responses include a protocol information object with an array of
discovered properties, as defined in the specific protocol.
For example, for BLE, this is an array of supported services, which in turn
contains an array of characteristics, which in turn contains an array of
descriptors, as shown in <xref target="BLEservices"/>.</t>

<t>Example of a response:</t>

<figure title="Example connection response" anchor="exupconnresp"><sourcecode type="json" markers="true"><![CDATA[
{
  "id": "1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30",
  "protocolInformation": {
    "ble": {
      "services": [
        {
          "serviceID": "00001809-0000-1000-8000-00805f9b34fb",
          "characteristics": [
            {
              "characteristicID":
                "00002a1c-0000-1000-8000-00805f9b34fb",
              "flags": [
                "read",
                "write"
              ],
              "descriptors": [
                {
                  "descriptorID":
                    "00002902-0000-1000-8000-00805f9b34fb"
                }
              ]
            }
          ]
        }
      ]
    }
  }
}
]]></sourcecode></figure>

<t>where-</t>

<t><list style="symbols">
  <t>"id" is the ID of the device</t>
  <t>"protocolInformation" contains an Array of BLE services as shown in
   <xref target="BLEservices"/> and described in <xref target="protocol-information-obj"/>.</t>
</list></t>

<t>A failure will generate a standard failed response. Please refer to <xref target="failure"/>
definition of failed response.</t>

</section>
<section anchor="disconnect-from-a-device"><name>Disconnect from a device</name>

<t>Method: <spanx style="verb">DELETE /devices/{id}/connections</spanx></t>

<t>Description: Disconnect from a device</t>

<t>Parameters:</t>

<t><list style="symbols">
  <t>id: the ID of the device</t>
</list></t>

<t>Response:</t>

<t>Returns HTTP status code 204 No Content on successful disconnect.</t>

<t>A failure will generate a standard failed response. Please refer to <xref target="failure"/>
definition of failed response.</t>

</section>
<section anchor="get-connection-status"><name>Get connection status</name>

<t>Method: <spanx style="verb">GET /devices/{id}/connections</spanx></t>

<t>Description: Get connection status for a device. Success when device(s)
is/are connected, includes service map for the device if available.
Failure when a device is not connected.</t>

<t>Parameters:</t>

<t><list style="symbols">
  <t>id: the ID of the device</t>
</list></t>

<t>Response:</t>

<t>Example of a response:</t>

<figure title="Example connection status response" anchor="exconnstatresp"><sourcecode type="json" markers="true"><![CDATA[
{
  "id": "1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30",
  "protocolInformation": {
    "ble": {
      "services": [
        {
          "serviceID": "00001809-0000-1000-8000-00805f9b34fb",
          "characteristics": [
            {
              "characteristicID":
                "00002a1c-0000-1000-8000-00805f9b34fb",
              "flags": [
                "read",
                "write"
              ],
              "descriptors": [
                {
                  "descriptorID":
                    "00002902-0000-1000-8000-00805f9b34fb"
                }
              ]
            }
          ]
        }
      ]
    }
  }
}
]]></sourcecode></figure>

<t>where-</t>

<t><list style="symbols">
  <t>"id" is the ID of the device</t>
  <t>"protocolInformation" contains an Array of BLE services as shown in <xref target="BLEservices"/></t>
</list></t>

<t>A failure will generate a standard failed response. Please refer to <xref target="failure"/>
definition of failed response.</t>

</section>
</section>
</section>
<section anchor="nipc-extensibility"><name>NIPC Extensibility</name>

<t>NIPC is designed to be extensible in two complementary ways:</t>

<t><list style="symbols">
  <t>Protocol mappings: NIPC relies on SDF protocol mappings to relate protocol‑neutral affordances to protocol‑specific operations. Adding a new mapping enables support for additional device protocols (or versions) without the need to change the NIPC API itself. This allows deployments to evolve as device ecosystems change, while preserving application portability and gateway interoperability. Protocol mapping is an extension to SDF and described in <xref target="I-D.ietf-asdf-sdf-protocol-mapping"/>.</t>
  <t>API extensions: Extensions compose multiple NIPC operations into a single request or introduce specialized flows optimized for common scenarios (e.g., bulk property updates, conditional reads, firmware operations). Extensions MUST use the “/extensions” path element and SHOULD focus on efficiency, latency reduction, and operational simplicity (fewer round trips, reduced state management). To ensure interoperability and consistent security review, extensions MUST be registered with IANA as defined in <xref target="iana-api-ext"/>.</t>
</list></t>

<section anchor="protocol-mappings"><name>Protocol mappings</name>

<t>NIPC relies on SDF protocol mappings <xref target="I-D.ietf-asdf-sdf-protocol-mapping"/> to relate protocol‑neutral affordances to protocol‑specific operations. In <xref target="I-D.ietf-asdf-sdf-protocol-mapping"/> BLE and Zigbee are used as examples, however the mapping mechanism is extensible; so support for additional protocols (or versions) can be added without changing the NIPC schema or API.</t>

</section>
<section anchor="apiextensions"><name>API extensions</name>

<t>The extension APIs allow for extensibility of the APIs.
Extension APIs may leverage the basic NIPC defined APIs and combine them in compound statements in order to streamline application operation against devices, make operations more expedient and convenient in one API call. An example of this is the bulk API extension.
They may also introduce new functionality that is specific to a use case or protocol, such as the BLE transmit API.</t>

<t>Extensions must be defined under the /extensions path element. The extension name is defined as a path parameter after the /extensions path element. Extensions may define their own request and response payloads, as well as their own query parameters.
Extensions must be IANA registered as defined in <xref target="iana-api-ext"/>.</t>

<t>Extensions MAY implement long‑running operations (e.g., firmware updates, bulk actions). For such operations, the server SHOULD respond with 202 Accepted and a Location header referencing a status URI. Clients MAY poll the status URI (GET) to obtain progress. While the operation is in progress, the status endpoint SHOULD return 200 OK with status information; upon completion, the server MAY redirect with 303 See Other to the final result resource, or return 200 OK with the completed result from the status endpoint. This pattern minimizes client state, supports retry, and provides a uniform mechanism for tracking asynchronous execution.</t>

<t>In the appendix <xref target="NIPCextensions"/>, we have defined a few example extensions.</t>

</section>
</section>
<section anchor="errorhandling"><name>NIPC Error Handling</name>

<t>Error types in NIPC APIs must use URI-based error type identifiers as defined in <xref target="iana-problem-details"/>. The error types can be generic or specific to the API category. The error types are organized into the following categories:</t>

<t><list style="symbols">
  <t>Generic: Broadly applicable errors, including authorization, invalid identifiers, and generic failures.</t>
  <t>Property APIs: Errors related to property APIs (read/write).</t>
  <t>Event APIs: Errors related to event APIs (enable/disable).</t>
  <t>Protocol specific: Errors related to protocol-specific operations.</t>
  <t>Extension APIs: Errors related to extension APIs.</t>
</list></t>

<t>NIPC error types are defined in the table below:</t>

<texttable title="Error Codes" anchor="errorcodes">
      <ttcol align='left'>Error Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Category</ttcol>
      <c>invalid-id</c>
      <c>Invalid device ID or gateway doesn't recognize the ID</c>
      <c>Generic</c>
      <c>invalid-sdf-url</c>
      <c>Invalid SDF URL or SDF affordance not found</c>
      <c>Generic</c>
      <c>extension-operation-not-executed</c>
      <c>Operation was not executed since the previous operation failed</c>
      <c>Generic</c>
      <c>sdf-model-already-registered</c>
      <c>SDF model already registered</c>
      <c>Generic</c>
      <c>sdf-model-in-use</c>
      <c>SDF model in use</c>
      <c>Generic</c>
      <c>unsupported-uri-scheme</c>
      <c>Unsupported URI scheme</c>
      <c>Generic</c>
      <c>property-not-readable</c>
      <c>Property not readable</c>
      <c>Property APIs</c>
      <c>property-not-writable</c>
      <c>Property not writable</c>
      <c>Property APIs</c>
      <c>property-read-failed</c>
      <c>Property read failed</c>
      <c>Property APIs</c>
      <c>property-write-failed</c>
      <c>Property write failed</c>
      <c>Property APIs</c>
      <c>event-already-enabled</c>
      <c>Event already enabled</c>
      <c>Event APIs</c>
      <c>event-not-enabled</c>
      <c>Event not enabled</c>
      <c>Event APIs</c>
      <c>event-not-registered</c>
      <c>Event not registered for any data application</c>
      <c>Event APIs</c>
      <c>trigger-already-enabled</c>
      <c>Trigger already enabled for this event</c>
      <c>Trigger APIs</c>
      <c>protocolmap-ble-already-connected</c>
      <c>Device already connected</c>
      <c>Protocol specific</c>
      <c>protocolmap-ble-no-connection</c>
      <c>No connection found for device</c>
      <c>Protocol specific</c>
      <c>protocolmap-ble-connection-timeout</c>
      <c>BLE connection timeout</c>
      <c>Protocol specific</c>
      <c>protocolmap-ble-bonding-failed</c>
      <c>BLE bonding failed</c>
      <c>Protocol specific</c>
      <c>protocolmap-ble-connection-failed</c>
      <c>BLE connection failed</c>
      <c>Protocol specific</c>
      <c>protocolmap-ble-service-discovery-failed</c>
      <c>BLE service discovery failed</c>
      <c>Protocol specific</c>
      <c>protocolmap-ble-invalid-service-or-characteristic</c>
      <c>Invalid BLE service or characteristic ID</c>
      <c>Protocol specific</c>
      <c>protocolmap-zigbee-connection-timeout</c>
      <c>Zigbee connection timeout</c>
      <c>Protocol specific</c>
      <c>protocolmap-zigbee-invalid-endpoint-or-cluster</c>
      <c>Invalid Zigbee endpoint or cluster ID</c>
      <c>Protocol specific</c>
      <c>extension-transmit-invalid-data</c>
      <c>Invalid transmit data</c>
      <c>Transmit APIs</c>
      <c>extension-firmware-rollback</c>
      <c>Firmware rollback</c>
      <c>Extension APIs</c>
      <c>extension-firmware-update-failed</c>
      <c>Firmware update failed</c>
      <c>Extension APIs</c>
</texttable>

<t>The appropriate HTTP status code is returned in the response.</t>

</section>
<section anchor="pubsub"><name>Publish/Subscribe Interface</name>

<t>Events are delivered via a publish/subscribe interface. Event types include: (1) streaming data (enabled/disabled via the NIPC Events API), (2) broadcasts (e.g., advertisements), and (3) connection status (device link up/down). Event payloads are encoded in CBOR <xref target="RFC8949"/> and MAY be transported over MQTT, webhook, or websocket. CBOR is used because non‑IP device payloads are typically binary; it encodes such data efficiently and is more compact than JSON, reducing bandwidth.</t>

<section anchor="cddl-data-subscription"><name>CDDL Definition</name>

<t>The event streaming format is defined here in CDDL <xref target="RFC8610"/>.
A DataSubscription is a CBOR map containing the raw payload (bytes) and a timestamp (epoch seconds). It MAY include deviceID (the SCIM device identifier) when the payload is associated with a known device. Optional members (e.g., apMacAddress, rssi) MAY be present but can reveal deployment topology and SHOULD be omitted unless required. A choice group within DataSubscription indicates the event type (e.g., advertisement, subscription notification, connection status). An event publication MAY carry one or more DataSubscription entries in an array. Such an array is represented as DataBatch.</t>

<t>The subscription type choice uses a CDDL socket ($$subscription-extension) to allow extensibility. New subscription types registered with IANA (see <xref target="iana-data-subscription-types"/>) can be added using the CDDL plug syntax (//=) without modifying the base schema.</t>

<figure><sourcecode type="cddl" markers="true" name="data_subscription.cddl"><![CDATA[
start = DataBatch

DataBatch = [* DataSubscription]

DataSubscription = {
  ? data: bytes,
  timestamp: float, ; epoch in seconds
  ? deviceID: text,
  ? apMacAddress: text,
  subscription
}

; Subscription type - IANA registered types
subscription = (
  bleSubscription: BleSubscription //
  bleAdvertisement: BleAdvertisement //
  bleConnectionStatus: BleConnectionStatus //
  zigbeeSubscription: ZigbeeSubscription //
  $$subscription-extension
)

BleSubscription = {
  serviceID: text,
  characteristicID: text
}

BleAdvertisement = {
  macAddress: text,
  ? rssi: nint,
}

BleConnectionStatus = {
  macAddress: text,
  connected: bool,
  ? reason: int
}

ZigbeeSubscription = {
  endpointID: int,
  clusterID: int,
  attributeID: int,
  attributeType: int
}
]]></sourcecode></figure>

</section>
<section anchor="cbor-examples"><name>CBOR Examples</name>

<t>This section contains a few examples of the DataSubscription struct in CBOR diagnostic notation.</t>

<figure title="Onboarded BLE Device Advertisement"><artwork><![CDATA[
[
  {
    "data": h'02011A020A0C16FF4C001007721F41B0392078',
    "deviceID": "1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30",
    "timestamp": 1727484393,
    "bleAdvertisement": {
        "macAddress": "C1:5C:00:00:00:01",
        "rssi": -25
    }
  }
]
]]></artwork></figure>

<figure title="Non-Onboarded BLE Device Advertisement"><artwork><![CDATA[
[
  {
    "data": h'02011A020A0C16FF4C001007721F41B0392078',
    "timestamp": 1727484393,
    "bleAdvertisement": {
        "macAddress": "C1:5C:00:00:00:01",
        "rssi": -25
    }
  }
]
]]></artwork></figure>

<figure title="BLE GATT Notification"><artwork><![CDATA[
[
  {
    "data": h'434630374346303739453036',
    "deviceID": "1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30",
    "timestamp": 1727484393,
    "bleSubscription": {
        "serviceID": "a4e649f4-4be5-11e5-885d-feff819cdc9f",
        "characteristicID": "c4c1f6e2-4be5-11e5-885d-feff819cdc9f"
    }
  }
]
]]></artwork></figure>

<figure title="BLE Connection status event"><artwork><![CDATA[
[
  {
    "deviceID": "1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30",
    "timestamp": 1727484393,
    "bleConnectionStatus": {
        "macAddress": "C1:5C:00:00:00:01",
        "connected": true
    }
  }
]
]]></artwork></figure>

<figure title="Zigbee Attribute Notification"><artwork><![CDATA[
[
  {
    "data": h'434630374346303739453036',
    "deviceID": "1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30",
    "timestamp": 1727484393,
    "zigbeeSubscription": {
        "endpointID": 1,
        "clusterID": 6,
        "attributeID": 12,
        "attributeType": 1
    }
  }
]
]]></artwork></figure>

</section>
</section>
<section anchor="examples"><name>Examples</name>

<t>This section contains a few examples on how applications can leverage NIPC operations to communicate with BLE and Zigbee devices.</t>

<section anchor="property-readwrite"><name>Property Read/Write</name>

<t>In this example, we will connect to a device and read and write from a property.</t>

<t>The sequence of operations for this are:</t>

<t><list style="symbols">
  <t>Declare a device instance using the SCIM Interface (out of scope of this
memo)</t>
  <t>Register an SDF model for the device  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[============== NOTE: '\' line wrapping per RFC 8792 ==============

POST /registrations/models
Content-Type: application/sdf+json
Accept: application/nipc+json
Host: localhost

{ ... }

HTTP/1.1 201 Created
content-type: application/nipc+json

[
  {
    "sdfName": "https://example.com/thermometer#/sdfThing/\
                                                      thermometer"
  }
]
]]></artwork></figure>
  <vspace blankLines='1'/>
Request Body: JSON object with the SDF model, from <xref target="thermometer-sdf"/></t>
  <t>Read a property from the BLE device  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[============== NOTE: '\' line wrapping per RFC 8792 ==============

GET /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/properties?\
propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%\
              2FsdfThing%2Fthermometer%2FsdfProperty%2Fdevice_name
Accept: application/nipc+json
Host: localhost

HTTP/1.1 200 OK
content-type: application/nipc+json

[
  {
    "property": "https://example.com/thermometer#/sdfThing/\
                             thermometer/sdfProperty/device_name",
    "value": "dGVzdA=="
  }
]
]]></artwork></figure>
  </t>
  <t>Write to a property on the BLE device  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[============== NOTE: '\' line wrapping per RFC 8792 ==============

PUT /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/properties
Content-Type: application/nipc+json
Host: localhost

[
  {
    "property": "https://example.com/thermometer#/sdfThing/\
                             thermometer/sdfProperty/device_name",
    "value": "dGVzdA=="
  }
]

HTTP/1.1 200 OK
content-type: application/nipc+json

[
  {
    "status": 200
  }
]
]]></artwork></figure>
  </t>
</list></t>

</section>
<section anchor="enabling-an-event-on-a-device"><name>Enabling an Event on a Device</name>

<t>In this example, we will declare a device instance, and setup an advertisement
subscription event for that device.</t>

<t>The sequence of operations for this are:</t>

<t><list style="symbols">
  <t>Declaring a device instance and endpoint app using the SCIM Interface (out of scope of this
   memo)</t>
  <t>Register an SDF model for the device  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[============== NOTE: '\' line wrapping per RFC 8792 ==============

POST /registrations/models
Content-Type: application/sdf+json
Accept: application/nipc+json
Host: localhost

{ ... }

HTTP/1.1 201 Created
content-type: application/nipc+json

[
  {
    "sdfName": "https://example.com/thermometer#/sdfThing/\
                                                      thermometer"
  }
]
]]></artwork></figure>
  <vspace blankLines='1'/>
Request Body: JSON object with the SDF model, from <xref target="thermometer-sdf"/></t>
  <t>Register the data app with the event  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[============== NOTE: '\' line wrapping per RFC 8792 ==============

POST /registrations/data-apps?dataAppId=0927ce7c-b258-4bfa-a345-\
                                                      bcc9f74385b4
Content-Type: application/nipc+json
Accept: application/nipc+json
Host: localhost

{
  "events": [
    {
      "event": "https://example.com/thermometer#/sdfThing/\
                                   thermometer/sdfEvent/isPresent"
    }
  ],
  "mqttClient": true
}

HTTP/1.1 201 Created
content-type: application/nipc+json

{
  "events": [
    {
      "event": "https://example.com/thermometer#/sdfThing/\
                                   thermometer/sdfEvent/isPresent"
    }
  ],
  "mqttClient": true
}
]]></artwork></figure>
  </t>
  <t>Enable the advertisement event  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[============== NOTE: '\' line wrapping per RFC 8792 ==============

POST /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/events?\
eventName=https%3A%2F%2Fexample.com%2Fthermometer%23%2FsdfThing%\
                              2Fthermometer%2FsdfEvent%2FisPresent
Host: localhost
Content-Length: 0

HTTP/1.1 201 Created
Location: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/events?\
                   instanceId=02ee282c-8915-4b2e-bbd2-88966773134a
]]></artwork></figure>
  </t>
  <t>Check the status of the event  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[============== NOTE: '\' line wrapping per RFC 8792 ==============

GET /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/events?\
                   instanceId=02ee282c-8915-4b2e-bbd2-88966773134a
Host: localhost

HTTP/1.1 200 OK
content-type: application/nipc+json

[
  {
    "instanceId": "02ee282c-8915-4b2e-bbd2-88966773134a",
    "event": "https://example.com/thermometer#/sdfThing/\
                                   thermometer/sdfEvent/isPresent"
  }
]
]]></artwork></figure>
  </t>
</list></t>

</section>
<section anchor="enabling-an-event-on-a-group-of-devices"><name>Enabling an Event on a Group of Devices</name>

<t>In this example, we will enable an advertisement subscription event
for a group of devices.</t>

<t>The sequence of operations for this are:</t>

<t><list style="symbols">
  <t>Provision a device and endpoint app using the SCIM Interface (out of scope of this
   memo)</t>
  <t>Register an SDF model for the devices  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[============== NOTE: '\' line wrapping per RFC 8792 ==============

POST /registrations/models
Content-Type: application/sdf+json
Accept: application/nipc+json
Host: localhost

{ ... }

HTTP/1.1 201 Created
content-type: application/nipc+json

[
  {
    "sdfName": "https://example.com/thermometer#/sdfThing/\
                                                      thermometer"
  }
]
]]></artwork></figure>
  <vspace blankLines='1'/>
Request Body: JSON object with the SDF model, from <xref target="thermometer-sdf"/></t>
  <t>Register the data app with the event  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[============== NOTE: '\' line wrapping per RFC 8792 ==============

POST /registrations/data-apps?dataAppId=0927ce7c-b258-4bfa-a345-\
                                                      bcc9f74385b4
Content-Type: application/nipc+json
Accept: application/nipc+json
Host: localhost

{
  "events": [
    {
      "event": "https://example.com/thermometer#/sdfThing/\
                                   thermometer/sdfEvent/isPresent"
    }
  ],
  "mqttClient": true
}

HTTP/1.1 201 Created
content-type: application/nipc+json

{
  "events": [
    {
      "event": "https://example.com/thermometer#/sdfThing/\
                                   thermometer/sdfEvent/isPresent"
    }
  ],
  "mqttClient": true
}
]]></artwork></figure>
  </t>
  <t>Enable the advertisement event on a group of devices  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[============== NOTE: '\' line wrapping per RFC 8792 ==============

POST /groups/0dc729d7-f6c3-491d-9b9d-e7176d2be243/events?\
eventName=https%3A%2F%2Fexample.com%2Fthermometer%23%2FsdfThing%\
                              2Fthermometer%2FsdfEvent%2FisPresent
Host: localhost
Content-Length: 0

HTTP/1.1 201 Created
Location: /groups/0dc729d7-f6c3-491d-9b9d-e7176d2be243/events?\
                   instanceId=f1b9f26b-21ce-4deb-9d57-289ba7e17cce
]]></artwork></figure>
  </t>
  <t>Check the status of the event  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[============== NOTE: '\' line wrapping per RFC 8792 ==============

GET /groups/0dc729d7-f6c3-491d-9b9d-e7176d2be243/events?\
                   instanceId=f1b9f26b-21ce-4deb-9d57-289ba7e17cce
Host: localhost

HTTP/1.1 200 OK
content-type: application/nipc+json

[
  {
    "event": "https://example.com/heartrate#/sdfObject/\
                              healthsensor/sdfEvent/fallDetected",
    "deviceId": "1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30"
  },
  {
    "event": "https://example.com/heartrate#/sdfObject/\
                              healthsensor/sdfEvent/fallDetected",
    "deviceId": "d62c7fb2-a216-4811-a388-053b17fdbedc"
  },
  {
    "event": "https://example.com/heartrate#/sdfObject/\
                              healthsensor/sdfEvent/fallDetected",
    "deviceId": "01b52a23-b98c-454c-ba9e-086a43bdfd79"
  },
  {
    "type": "https://www.iana.org/assignments/nipc-problem-types#\
                                               event-not-enabled",
    "status": 400,
    "title": "Event Not Enabled",
    "deviceId": "9171ec16-e3c1-4ccf-ad23-b92a1a3f069d",
    "detail": "Failed to enable the event for device 9171ec16-\
                                      e3c1-4ccf-ad23-b92a1a3f069d"
  }
]
]]></artwork></figure>
  </t>
</list></t>

</section>
</section>
<section removeInRFC="true" anchor="implementation-status"><name>Implementation Status</name>

<t>This section records the status of known implementations of the
protocol defined by this specification at the time of posting of
this Internet-Draft, and is based on a proposal described in
<xref target="RFC7942"/>.  The description of implementations in this section is
intended to assist the IETF in its decision processes in
progressing drafts to RFCs.  Please note that the listing of any
individual implementation here does not imply endorsement by the
IETF.  Furthermore, no effort has been spent to verify the
information presented here that was supplied by IETF contributors.
This is not intended as, and must not be construed to be, a
catalog of available implementations or their features.  Readers
are advised to note that other implementations may exist.</t>

<t>According to <xref target="RFC7942"/>, "this will allow reviewers and working
groups to assign due consideration to documents that have the
benefit of running code, which may serve as evidence of valuable
experimentation and feedback that have made the implemented
protocols more mature.  It is up to the individual working groups
to use this information as they see fit".</t>

<section anchor="tiedie-iot"><name>TieDie IoT</name>

<t>Organization: Cisco Systems, North Carolina State University</t>

<t>Description: Open-source implementation of the NIPC APIs and gateway functionality for BLE. Client libraries and sample application functions for Python and Java are also provided.</t>

<t>Level of maturity: Open-source prototype</t>

<t>Coverage: All NIPC APIs for BLE protocol mapping</t>

<t>Version compatibility: All versions up to draft-19</t>

<t>Licensing: Apache License, Version 2.0</t>

<t>URL: <eref target="https://github.com/iot-onboarding/tiedie"></eref></t>

</section>
<section anchor="cisco-sensor-connect-for-iot-services-catalyst"><name>Cisco Sensor Connect for IoT Services (Catalyst)</name>

<t>Organization: Cisco Systems</t>

<t>Description: Commercial solution that delivers advanced BLE capabilities over Cisco Wireless infrastructure.</t>

<t>Level of maturity: Production</t>

<t>Coverage: All NIPC APIs for BLE protocol mapping</t>

<t>Version compatibility: draft-00</t>

<t>Licensing: Proprietary</t>

<t>URL: <eref target="https://developer.cisco.com/docs/spaces-connect-for-iot-services/"></eref></t>

</section>
<section anchor="cisco-sensor-connect-for-iot-services-meraki"><name>Cisco Sensor Connect for IoT Services (Meraki)</name>

<t>Organization: Cisco Systems</t>

<t>Description: Commercial solution that delivers advanced BLE capabilities over Cisco Wireless infrastructure.</t>

<t>Level of maturity: Beta</t>

<t>Coverage: All NIPC APIs for BLE protocol mapping</t>

<t>Version compatibility: draft-19</t>

<t>Licensing: Proprietary</t>

</section>
<section anchor="nipc-prototype"><name>NIPC Prototype</name>

<t>Organization: Ericsson Research</t>

<t>Description: Prototype implementation in C of the NIPC API.</t>

<t>Level of maturity: Research prototype</t>

<t>Coverage: Registration and NIPC operations</t>

<t>Version compatibility: Draft-04</t>

<t>Licensing: Proprietary</t>

<t>Contact: Lorenzo Corneo <eref target="mailto:lorenzo.corneo@ericsson.com">lorenzo.corneo@ericsson.com</eref></t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<section anchor="payload-encryption-considerations"><name>Payload Encryption Considerations</name>

<t>Responses to NIPC operations requests may contain sensitive or confidential information.  Therefore, application and device implementations should consider payload encryption.
NIPC does not provide any payload encryption mechanism. If payload encryption is required, it MUST be provided by the underlying device protocol (e.g., BLE security modes) or by the transport-layer security mechanism (e.g., TLS).</t>

</section>
<section anchor="tls-support-considerations"><name>TLS Support Considerations</name>

<t>NIPC MUST run on top of a transport-layer security mechanism such as TLS. When leveraging TLS, the NIPC gateway MUST support TLS 1.2 <xref target="RFC5246"/> and TLS 1.3 <xref target="RFC8446"/> and MAY support additional transport-layer mechanisms.  When using TLS, the client MUST perform a TLS/SSL server identity check, per <xref target="RFC6125"/>.  Implementation security considerations for TLS can be found in <xref target="RFC7525"/>.</t>

</section>
<section anchor="http-considerations"><name>HTTP Considerations</name>

<t>NIPC runs on top of HTTP and is thus subject to the security considerations of HTTP <xref section="9" sectionFormat="of" target="RFC7230"/>.</t>

</section>
<section anchor="authorization-considerations"><name>Authorization Considerations</name>

<section anchor="api-authorization-considerations"><name>API authorization Considerations</name>

<t>To enable NIPC gateway functions, the network administrator MUST authorize applications (e.g., via exchange of tokens or public keys). Authorization MAY be role‑based. The following baseline roles are RECOMMENDED:</t>

<t><list style="symbols">
  <t>Provisioning: permitted to create and manage device and endpoint‑app identities via SCIM (typically co‑located with the gateway).</t>
  <t>Control: permitted to invoke NIPC property, action, and event APIs.</t>
  <t>Data: permitted to receive streamed event data.
Deployments MAY further refine authorization at per‑API or per‑affordance granularity.</t>
</list></t>

</section>
<section anchor="authorization-tokenbearer-tokencookie-considerations"><name>Authorization Token/Bearer Token/Cookie Considerations</name>

<t>When using authorization tokens such as those issued by OAuth 2.0 <xref target="RFC6749"/>, implementers MUST take into account threats and countermeasures as documented in <xref section="8" sectionFormat="of" target="RFC7521"/>.</t>

<t>Since the possession of a bearer token, Authorization token, or cookie MAY authorize the holder to perform NIPC Operations on devices, tokens and cookies MUST contain sufficient entropy to prevent random guessing attack; for example, see <xref section="5.2" sectionFormat="of" target="RFC6750"/> and <xref section="5.1.4.2.2" sectionFormat="of" target="RFC6819"/>.</t>

<t>As with all NIPC communications, bearer tokens and HTTP cookies MUST be exchanged using transport-layer security mechanism such as TLS.</t>

<t>Bearer tokens MUST have a limited lifetime that can be determined directly or indirectly (e.g., by checking with a validation service) by the application.  By expiring tokens, applications are forced to obtain a new token (which usually involves re-authentication) for continued authorized access.  For example, in OAuth 2.0, an application MAY use OAuth token refresh to obtain a new bearer token after authenticating to an authorization server.  See <xref section="6" sectionFormat="of" target="RFC6749"/>. As with bearer tokens, an HTTP cookie SHOULD last no longer than the lifetime of a browser session.  An expiry time should be set that limits session cookie lifetime as per <xref section="5.2.1" sectionFormat="of" target="RFC6265"/>.</t>

<t>Implementations supporting OAuth bearer tokens need to factor in security considerations of this authorization method <xref target="RFC7521"/>.
Implementers also need to consider authentication choices coupled with OAuth bearer tokens.  For example, when using OAuth bearer tokens with client authentication via client credentials <xref section="4.4" sectionFormat="of" target="RFC6749"/>, implementers need to consider the security considerations of client authentication via client credentials as described in <xref section="3.2" sectionFormat="of" target="RFC6819"/>.</t>

</section>
</section>
<section anchor="other-security-considerations"><name>Other Security Considerations</name>

<t><list style="symbols">
  <t>Preventing automated attacks: It is recommended to limit the number of requests that any particular application MAY make in a period of time.</t>
  <t>Logging and monitoring: It is recommended to log and monitor API usage to detect potential abuse or attacks.</t>
  <t>Input validation: It is recommended to validate all inputs to prevent injection attacks.</t>
  <t>Error handling: It is recommended to handle errors gracefully without exposing sensitive information.</t>
  <t>Least privilege: It is recommended to follow the principle of least privilege when granting access to resources.</t>
  <t>Storage and handling of sensitive data: Credentials MUST NOT be stored in clear-text, but MUST be stored using an encrypted protection mechanism (e.g., hashing).</t>
</list></t>

</section>
</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>This section provides guidance to the Internet Assigned Numbers Authority (IANA) regarding registration of values related to NIPC, in accordance with <xref target="RFC8126"/>.</t>

<section anchor="iana-media-types"><name>Media Type Registration</name>

<t>This document registers the "application/nipc+json" media type  for messages of the NIPC APIs defined in this document carrying parameters encoded in JSON.</t>

<t>Type name: application</t>

<t>Subtype name: nipc+json</t>

<t>Required parameters: none</t>

<t>Optional parameters: none</t>

<t>Encoding considerations: Encoding considerations are identical to those specified for the "application/json" media type.</t>

<t>Security considerations: See the <xref target="security-considerations"/> section of this document.</t>

<t>Interoperability considerations: none</t>

<t>Published specification: This document, the NIPC API specification.</t>

<t>Applications that use this media type: Applications implementing NIPC APIs for IoT device management.</t>

<t>Fragment identifier considerations: none</t>

<t>Additional information:</t>

<t><list style="symbols">
  <t>Deprecated alias names for this type: none</t>
  <t>Magic number(s): none</t>
  <t>File extension(s): none</t>
  <t>Macintosh file type code(s): none</t>
</list></t>

<t>Person &amp; email address to contact for further information:</t>

<t>Intended usage: LIMITED USE</t>

<t>Restrictions on usage: To be used for NIPC APIs as defined in this document.</t>

<t>Author:</t>

<t>Change controller: IETF</t>

</section>
<section anchor="iana-api-ext"><name>API extensions</name>

<t>IANA is requested to create a new registry called "NIPC API extensions".</t>

<t>The registration policy for this registry is Specification Required <xref target="RFC8126"/>.</t>

<t>The registry must contain following attributes:</t>

<t><list style="symbols">
  <t>Extension URI</t>
  <t>Extension name</t>
  <t>Description</t>
  <t>Openapi model describing the extension. This model must be reviewed by an expert.</t>
</list></t>

<t>Following API extensions are described in this document:</t>

<texttable>
      <ttcol align='left'>Extension URI</ttcol>
      <ttcol align='left'>Extension name</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Model reference</ttcol>
      <c>/extensions/{id}/bulk</c>
      <c>Bulk API</c>
      <c>Call multiple NIPC's in a single request</c>
      <c><xref target="NIPCextensions"/></c>
      <c>/extensions/{id}/properties/file</c>
      <c>File write API</c>
      <c>Write a file with multiple property ops</c>
      <c><xref target="NIPCextensions"/></c>
      <c>/extensions/{id}/properties/blob</c>
      <c>Binary write API</c>
      <c>Write a binary blob with multiple property ops</c>
      <c><xref target="NIPCextensions"/></c>
      <c>/extensions/{id}/properties/read/conditional</c>
      <c>Read conditional API</c>
      <c>Read a property until a condition is fulfilled</c>
      <c><xref target="NIPCextensions"/></c>
      <c>/extensions/{id}/events/conditional</c>
      <c>Event conditional API</c>
      <c>Enable an event until a condition is fulfilled</c>
      <c><xref target="NIPCextensions"/></c>
      <c>/extensions/{id}/transmit</c>
      <c>Transmit API</c>
      <c>Transmits a payload to a device</c>
      <c><xref target="NIPCextensions"/></c>
</texttable>

</section>
<section anchor="iana-well-known"><name>Well-known URIs</name>

<t>IANA is requested to register the following well-known URI in the "Well-Known URIs" registry as defined by <xref target="RFC8615"/>:</t>

<texttable>
      <ttcol align='left'>URI Suffix</ttcol>
      <ttcol align='left'>Change Controller</ttcol>
      <ttcol align='left'>Specification Document</ttcol>
      <c>nipc</c>
      <c>IETF</c>
      <c>This document, <xref target="paths-general"></xref></c>
</texttable>

<t>The well-known URI for NIPC is:</t>

<figure><artwork><![CDATA[
/.well-known/nipc
]]></artwork></figure>

</section>
<section anchor="iana-data-subscription-types"><name>Data Subscription Types</name>

<t>IANA is requested to create a new registry called "NIPC Data Subscription Types".</t>

<t>This registry tracks the subscription types used in the NIPC publish/subscribe
interface for streaming event data from devices. Each subscription type defines
a specific data format for a particular protocol or use case.</t>

<t>The registration policy for this registry is Specification Required <xref target="RFC8126"/>.</t>

<t>The registry must contain the following attributes:</t>

<t><list style="symbols">
  <t>Type Name: The CDDL key name used in the subscription choice</t>
  <t>Description: A brief description of the subscription type</t>
  <t>CDDL Definition: Reference to the CDDL structure defining the subscription data</t>
  <t>Reference: Document defining the subscription type</t>
</list></t>

<t>IANA is requested to register the following initial entries:</t>

<texttable>
      <ttcol align='left'>Type Name</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>CDDL Definition</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>bleSubscription</c>
      <c>BLE GATT notification/indication</c>
      <c>BleSubscription</c>
      <c>This document</c>
      <c>bleAdvertisement</c>
      <c>BLE advertisement data</c>
      <c>BleAdvertisement</c>
      <c>This document</c>
      <c>bleConnectionStatus</c>
      <c>BLE device connection status changes</c>
      <c>BleConnectionStatus</c>
      <c>This document</c>
      <c>zigbeeSubscription</c>
      <c>Zigbee attribute report subscription</c>
      <c>ZigbeeSubscription</c>
      <c>This document</c>
</texttable>

<t>The CDDL definitions for these subscription types are provided in <xref target="cddl-data-subscription"/>.</t>

</section>
<section anchor="iana-protocol-info-types"><name>NIPC Protocols</name>

<t>IANA is requested to create a new registry called "NIPC Protocols".</t>

<t>This registry tracks the protocols used in the <spanx style="verb">protocolInformation</spanx> object
for NIPC connection management and service discovery operations. Each protocol
type defines a specific schema for protocol-specific information, as defined
in <xref target="protocol-information-obj"/>.</t>

<t>The registration policy for this registry is Specification Required <xref target="RFC8126"/>.</t>

<t>The registry must contain the following attributes:</t>

<t><list style="symbols">
  <t>Protocol Name: The key name used in the <spanx style="verb">protocolInformation</spanx> object</t>
  <t>Description: A brief description of the protocol type</t>
  <t>Reference: Document defining the protocol type</t>
</list></t>

<t>IANA is requested to register the following initial entries:</t>

<texttable>
      <ttcol align='left'>Protocol Name</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>ble</c>
      <c>Bluetooth Low Energy</c>
      <c>This document</c>
      <c>zigbee</c>
      <c>Zigbee</c>
      <c>This document</c>
</texttable>

</section>
<section anchor="iana-problem-details"><name>Problem Details for NIPC APIs</name>

<t>IANA is requested to create a new registry, the "NIPC Problem Type" registry,
with following URL: <eref target="https://www.iana.org/assignments/nipc-problem-types"></eref>.</t>

<t>The registration policy for this registry is Specification Required <xref target="RFC8126"/>.</t>

<t>Registrations MUST use the prefix <eref target="&quot;https://www.iana.org/assignments/nipc-problem-types#&quot;"></eref> for the type URI.</t>

<t>The registration requests MUST use the template defined in <xref section="4.2" sectionFormat="of" target="RFC9457"/>.</t>

<t>IANA is requested to register the following URIs in the "NIPC Problem Type"
registry:</t>

<texttable>
      <ttcol align='left'>Problem Type URI</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>https://www.iana.org/assignments/nipc-problem-types#invalid-id</c>
      <c>Invalid device ID or gateway doesn't recognize the ID</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#invalid-sdf-url</c>
      <c>Invalid SDF URL or SDF affordance not found</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#extension-operation-not-executed</c>
      <c>Operation was not executed since the previous operation failed</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#sdf-model-already-registered</c>
      <c>SDF model already registered</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#sdf-model-in-use</c>
      <c>SDF model in use</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#unsupported-uri-scheme</c>
      <c>Unsupported URI scheme</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#property-not-readable</c>
      <c>Property not readable</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#property-read-failed</c>
      <c>Property read failed</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#property-not-writable</c>
      <c>Property not writable</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#property-write-failed</c>
      <c>Property write failed</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#event-already-enabled</c>
      <c>Event already enabled</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#event-not-enabled</c>
      <c>Event not enabled</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#event-not-registered</c>
      <c>Event not registered for any data application</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#trigger-already-enabled</c>
      <c>Trigger already enabled for this event</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#protocolmap-ble-already-connected</c>
      <c>Device already connected</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#protocolmap-ble-no-connection</c>
      <c>No connection found for device</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#protocolmap-ble-connection-timeout</c>
      <c>BLE connection timeout</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#protocolmap-ble-bonding-failed</c>
      <c>BLE bonding failed</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#protocolmap-ble-connection-failed</c>
      <c>BLE connection failed</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#protocolmap-ble-service-discovery-failed</c>
      <c>BLE service discovery failed</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#protocolmap-ble-invalid-service-or-characteristic</c>
      <c>Invalid BLE service or characteristic ID</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#protocolmap-zigbee-connection-timeout</c>
      <c>Zigbee connection timeout</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#protocolmap-zigbee-invalid-endpoint-or-cluster</c>
      <c>Invalid Zigbee endpoint or cluster ID</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#extension-transmit-invalid-data</c>
      <c>Invalid transmit data</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#extension-firmware-rollback</c>
      <c>Firmware rollback</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#extension-firmware-update-failed</c>
      <c>Firmware update failed</c>
      <c>This document</c>
</texttable>

<t>Each Problem Type URI is intended for use as the "type" member in Problem Details responses as described.</t>

</section>
</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">



<reference anchor="RFC8610">
  <front>
    <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
    <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
    <author fullname="C. Vigano" initials="C." surname="Vigano"/>
    <author fullname="C. Bormann" initials="C." surname="Bormann"/>
    <date month="June" year="2019"/>
    <abstract>
      <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8610"/>
  <seriesInfo name="DOI" value="10.17487/RFC8610"/>
</reference>
<reference anchor="RFC9880">
  <front>
    <title>Semantic Definition Format (SDF) for Data and Interactions of Things</title>
    <author fullname="M. Koster" initials="M." role="editor" surname="Koster"/>
    <author fullname="C. Bormann" initials="C." role="editor" surname="Bormann"/>
    <author fullname="A. Keränen" initials="A." surname="Keränen"/>
    <date month="January" year="2026"/>
    <abstract>
      <t>The Semantic Definition Format (SDF) is a format for domain experts to use in the creation and maintenance of data and interaction models that describe Things, i.e., physical objects that are available for interaction over a network. An SDF specification describes definitions of SDF Objects/SDF Things and their associated interactions (Events, Actions, and 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="RFC" value="9880"/>
  <seriesInfo name="DOI" value="10.17487/RFC9880"/>
</reference>

<reference anchor="I-D.ietf-scim-device-model">
   <front>
      <title>Device Schema Extensions to the SCIM model</title>
      <author fullname="Muhammad Shahzad" initials="M." surname="Shahzad">
         <organization>North Carolina State University</organization>
      </author>
      <author fullname="Hassan Iqbal" initials="H." surname="Iqbal">
         <organization>North Carolina State University</organization>
      </author>
      <author fullname="Eliot Lear" initials="E." surname="Lear">
         <organization>Cisco Systems</organization>
      </author>
      <date day="3" month="September" year="2025"/>
      <abstract>
	 <t>   The initial core schema for SCIM (System for Cross-domain Identity
   Management) was designed for provisioning users.  This memo specifies
   schema extensions that enables provisioning of devices, using various
   underlying bootstrapping systems, such as Wi-fi Easy Connect, FIDO
   device onboarding vouchers, BLE passcodes, and MAC authenticated
   bypass.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-scim-device-model-18"/>
   
</reference>

<reference anchor="I-D.ietf-asdf-sdf-protocol-mapping">
   <front>
      <title>SDF Protocol Mapping</title>
      <author fullname="Rohit Mohan" initials="R." surname="Mohan">
         <organization>Cisco Systems</organization>
      </author>
      <author fullname="Bart Brinckman" initials="B." surname="Brinckman">
         <organization>Cisco Systems</organization>
      </author>
      <author fullname="Lorenzo Corneo" initials="L." surname="Corneo">
         <organization>Ericsson</organization>
      </author>
      <date day="21" month="April" year="2026"/>
      <abstract>
	 <t>   This document defines protocol mapping extensions for the Semantic
   Definition Format (SDF) to enable mapping of protocol-agnostic SDF
   affordances to protocol-specific operations.  The protocol mapping
   mechanism allows SDF models to specify how properties, actions, and
   events should be accessed using specific non-IP and IP protocols such
   as Bluetooth Low Energy, Zigbee or HTTP and CoAP.  This document also
   describes a method to extend SCIM with an SDF model mapping.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-asdf-sdf-protocol-mapping-07"/>
   
</reference>
<reference anchor="RFC7644">
  <front>
    <title>System for Cross-domain Identity Management: Protocol</title>
    <author fullname="P. Hunt" initials="P." role="editor" surname="Hunt"/>
    <author fullname="K. Grizzle" initials="K." surname="Grizzle"/>
    <author fullname="M. Ansari" initials="M." surname="Ansari"/>
    <author fullname="E. Wahlstroem" initials="E." surname="Wahlstroem"/>
    <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
    <date month="September" year="2015"/>
    <abstract>
      <t>The System for Cross-domain Identity Management (SCIM) specification is an HTTP-based protocol that makes managing identities in multi-domain scenarios easier to support via a standardized service. Examples include, but are not limited to, enterprise-to-cloud service providers and inter-cloud scenarios. The specification suite seeks to build upon experience with existing schemas and deployments, placing specific emphasis on simplicity of development and integration, while applying existing authentication, authorization, and privacy models. SCIM's intent is to reduce the cost and complexity of user management operations by providing a common user schema, an extension model, and a service protocol defined by this document.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7644"/>
  <seriesInfo name="DOI" value="10.17487/RFC7644"/>
</reference>
<reference anchor="RFC8259">
  <front>
    <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
    <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
    <date month="December" year="2017"/>
    <abstract>
      <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
      <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="90"/>
  <seriesInfo name="RFC" value="8259"/>
  <seriesInfo name="DOI" value="10.17487/RFC8259"/>
</reference>
<reference anchor="RFC8949">
  <front>
    <title>Concise Binary Object Representation (CBOR)</title>
    <author fullname="C. Bormann" initials="C." surname="Bormann"/>
    <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
    <date month="December" year="2020"/>
    <abstract>
      <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
      <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049. It does not create a new version of the format.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="94"/>
  <seriesInfo name="RFC" value="8949"/>
  <seriesInfo name="DOI" value="10.17487/RFC8949"/>
</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="RFC7643">
  <front>
    <title>System for Cross-domain Identity Management: Core Schema</title>
    <author fullname="P. Hunt" initials="P." role="editor" surname="Hunt"/>
    <author fullname="K. Grizzle" initials="K." surname="Grizzle"/>
    <author fullname="E. Wahlstroem" initials="E." surname="Wahlstroem"/>
    <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
    <date month="September" year="2015"/>
    <abstract>
      <t>The System for Cross-domain Identity Management (SCIM) specifications are designed to make identity management in cloud-based applications and services easier. The specification suite builds upon experience with existing schemas and deployments, placing specific emphasis on simplicity of development and integration, while applying existing authentication, authorization, and privacy models. Its intent is to reduce the cost and complexity of user management operations by providing a common user schema and extension model as well as binding documents to provide patterns for exchanging this schema using HTTP.</t>
      <t>This document provides a platform-neutral schema and extension model for representing users and groups and other resource types in JSON format. This schema is intended for exchange and use with cloud service providers.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7643"/>
  <seriesInfo name="DOI" value="10.17487/RFC7643"/>
</reference>
<reference anchor="RFC9110">
  <front>
    <title>HTTP Semantics</title>
    <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
    <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
    <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
    <date month="June" year="2022"/>
    <abstract>
      <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
      <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="97"/>
  <seriesInfo name="RFC" value="9110"/>
  <seriesInfo name="DOI" value="10.17487/RFC9110"/>
</reference>
<reference anchor="RFC9457">
  <front>
    <title>Problem Details for HTTP APIs</title>
    <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
    <author fullname="E. Wilde" initials="E." surname="Wilde"/>
    <author fullname="S. Dalal" initials="S." surname="Dalal"/>
    <date month="July" year="2023"/>
    <abstract>
      <t>This document defines a "problem detail" to carry machine-readable details of errors in HTTP response content to avoid the need to define new error response formats for HTTP APIs.</t>
      <t>This document obsoletes RFC 7807.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9457"/>
  <seriesInfo name="DOI" value="10.17487/RFC9457"/>
</reference>
<reference anchor="RFC4648">
  <front>
    <title>The Base16, Base32, and Base64 Data Encodings</title>
    <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
    <date month="October" year="2006"/>
    <abstract>
      <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="4648"/>
  <seriesInfo name="DOI" value="10.17487/RFC4648"/>
</reference>
<reference anchor="RFC3986">
  <front>
    <title>Uniform Resource Identifier (URI): Generic Syntax</title>
    <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
    <author fullname="R. Fielding" initials="R." surname="Fielding"/>
    <author fullname="L. Masinter" initials="L." surname="Masinter"/>
    <date month="January" year="2005"/>
    <abstract>
      <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="66"/>
  <seriesInfo name="RFC" value="3986"/>
  <seriesInfo name="DOI" value="10.17487/RFC3986"/>
</reference>
<reference anchor="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="RFC9562">
  <front>
    <title>Universally Unique IDentifiers (UUIDs)</title>
    <author fullname="K. Davis" initials="K." surname="Davis"/>
    <author fullname="B. Peabody" initials="B." surname="Peabody"/>
    <author fullname="P. Leach" initials="P." surname="Leach"/>
    <date month="May" year="2024"/>
    <abstract>
      <t>This specification defines UUIDs (Universally Unique IDentifiers) --
also known as GUIDs (Globally Unique IDentifiers) -- and a Uniform
Resource Name namespace for UUIDs. A UUID is 128 bits long and is
intended to guarantee uniqueness across space and time. UUIDs were
originally used in the Apollo Network Computing System (NCS), later
in the Open Software Foundation's (OSF's) Distributed Computing
Environment (DCE), and then in Microsoft Windows platforms.</t>
      <t>This specification is derived from the OSF DCE specification with the
kind permission of the OSF (now known as "The Open Group"). Information from earlier versions of the OSF DCE specification have
been incorporated into this document. This document obsoletes RFC
4122.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9562"/>
  <seriesInfo name="DOI" value="10.17487/RFC9562"/>
</reference>
<reference anchor="RFC7468">
  <front>
    <title>Textual Encodings of PKIX, PKCS, and CMS Structures</title>
    <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
    <author fullname="S. Leonard" initials="S." surname="Leonard"/>
    <date month="April" year="2015"/>
    <abstract>
      <t>This document describes and discusses the textual encodings of the Public-Key Infrastructure X.509 (PKIX), Public-Key Cryptography Standards (PKCS), and Cryptographic Message Syntax (CMS). The textual encodings are well-known, are implemented by several applications and libraries, and are widely deployed. This document articulates the de facto rules by which existing implementations operate and defines them so that future implementations can interoperate.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7468"/>
  <seriesInfo name="DOI" value="10.17487/RFC7468"/>
</reference>
<reference anchor="RFC5246">
  <front>
    <title>The Transport Layer Security (TLS) Protocol Version 1.2</title>
    <author fullname="T. Dierks" initials="T." surname="Dierks"/>
    <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
    <date month="August" year="2008"/>
    <abstract>
      <t>This document specifies Version 1.2 of the Transport Layer Security (TLS) protocol. The TLS protocol provides communications security over the Internet. The protocol allows client/server applications to communicate in a way that is designed to prevent eavesdropping, tampering, or message forgery. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="5246"/>
  <seriesInfo name="DOI" value="10.17487/RFC5246"/>
</reference>
<reference anchor="RFC8446">
  <front>
    <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
    <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
    <date month="August" year="2018"/>
    <abstract>
      <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
      <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8446"/>
  <seriesInfo name="DOI" value="10.17487/RFC8446"/>
</reference>
<reference anchor="RFC6125">
  <front>
    <title>Representation and Verification of Domain-Based Application Service Identity within Internet Public Key Infrastructure Using X.509 (PKIX) Certificates in the Context of Transport Layer Security (TLS)</title>
    <author fullname="P. Saint-Andre" initials="P." surname="Saint-Andre"/>
    <author fullname="J. Hodges" initials="J." surname="Hodges"/>
    <date month="March" year="2011"/>
    <abstract>
      <t>Many application technologies enable secure communication between two entities by means of Internet Public Key Infrastructure Using X.509 (PKIX) certificates in the context of Transport Layer Security (TLS). This document specifies procedures for representing and verifying the identity of application services in such interactions. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6125"/>
  <seriesInfo name="DOI" value="10.17487/RFC6125"/>
</reference>
<reference anchor="RFC7525">
  <front>
    <title>Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)</title>
    <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
    <author fullname="R. Holz" initials="R." surname="Holz"/>
    <author fullname="P. Saint-Andre" initials="P." surname="Saint-Andre"/>
    <date month="May" year="2015"/>
    <abstract>
      <t>Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS) are widely used to protect data exchanged over application protocols such as HTTP, SMTP, IMAP, POP, SIP, and XMPP. Over the last few years, several serious attacks on TLS have emerged, including attacks on its most commonly used cipher suites and their modes of operation. This document provides recommendations for improving the security of deployed services that use TLS and DTLS. The recommendations are applicable to the majority of use cases.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7525"/>
  <seriesInfo name="DOI" value="10.17487/RFC7525"/>
</reference>
<reference anchor="RFC7230">
  <front>
    <title>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</title>
    <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
    <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
    <date month="June" year="2014"/>
    <abstract>
      <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document provides an overview of HTTP architecture and its associated terminology, defines the "http" and "https" Uniform Resource Identifier (URI) schemes, defines the HTTP/1.1 message syntax and parsing requirements, and describes related security concerns for implementations.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7230"/>
  <seriesInfo name="DOI" value="10.17487/RFC7230"/>
</reference>
<reference anchor="RFC6749">
  <front>
    <title>The OAuth 2.0 Authorization Framework</title>
    <author fullname="D. Hardt" initials="D." role="editor" surname="Hardt"/>
    <date month="October" year="2012"/>
    <abstract>
      <t>The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6749"/>
  <seriesInfo name="DOI" value="10.17487/RFC6749"/>
</reference>
<reference anchor="RFC7521">
  <front>
    <title>Assertion Framework for OAuth 2.0 Client Authentication and Authorization Grants</title>
    <author fullname="B. Campbell" initials="B." surname="Campbell"/>
    <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
    <author fullname="M. Jones" initials="M." surname="Jones"/>
    <author fullname="Y. Goland" initials="Y." surname="Goland"/>
    <date month="May" year="2015"/>
    <abstract>
      <t>This specification provides a framework for the use of assertions with OAuth 2.0 in the form of a new client authentication mechanism and a new authorization grant type. Mechanisms are specified for transporting assertions during interactions with a token endpoint; general processing rules are also specified.</t>
      <t>The intent of this specification is to provide a common framework for OAuth 2.0 to interwork with other identity systems using assertions and to provide alternative client authentication mechanisms.</t>
      <t>Note that this specification only defines abstract message flows and processing rules. In order to be implementable, companion specifications are necessary to provide the corresponding concrete instantiations.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7521"/>
  <seriesInfo name="DOI" value="10.17487/RFC7521"/>
</reference>
<reference anchor="RFC6750">
  <front>
    <title>The OAuth 2.0 Authorization Framework: Bearer Token Usage</title>
    <author fullname="M. Jones" initials="M." surname="Jones"/>
    <author fullname="D. Hardt" initials="D." surname="Hardt"/>
    <date month="October" year="2012"/>
    <abstract>
      <t>This specification describes how to use bearer tokens in HTTP requests to access OAuth 2.0 protected resources. Any party in possession of a bearer token (a "bearer") can use it to get access to the associated resources (without demonstrating possession of a cryptographic key). To prevent misuse, bearer tokens need to be protected from disclosure in storage and in transport. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6750"/>
  <seriesInfo name="DOI" value="10.17487/RFC6750"/>
</reference>
<reference anchor="RFC6819">
  <front>
    <title>OAuth 2.0 Threat Model and Security Considerations</title>
    <author fullname="T. Lodderstedt" initials="T." role="editor" surname="Lodderstedt"/>
    <author fullname="M. McGloin" initials="M." surname="McGloin"/>
    <author fullname="P. Hunt" initials="P." surname="Hunt"/>
    <date month="January" year="2013"/>
    <abstract>
      <t>This document gives additional security considerations for OAuth, beyond those in the OAuth 2.0 specification, based on a comprehensive threat model for the OAuth 2.0 protocol. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6819"/>
  <seriesInfo name="DOI" value="10.17487/RFC6819"/>
</reference>
<reference anchor="RFC6265">
  <front>
    <title>HTTP State Management Mechanism</title>
    <author fullname="A. Barth" initials="A." surname="Barth"/>
    <date month="April" year="2011"/>
    <abstract>
      <t>This document defines the HTTP Cookie and Set-Cookie header fields. These header fields can be used by HTTP servers to store state (called cookies) at HTTP user agents, letting the servers maintain a stateful session over the mostly stateless HTTP protocol. Although cookies have many historical infelicities that degrade their security and privacy, the Cookie and Set-Cookie header fields are widely used on the Internet. This document obsoletes RFC 2965. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6265"/>
  <seriesInfo name="DOI" value="10.17487/RFC6265"/>
</reference>
<reference anchor="RFC8126">
  <front>
    <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
    <author fullname="M. Cotton" initials="M." surname="Cotton"/>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <author fullname="T. Narten" initials="T." surname="Narten"/>
    <date month="June" year="2017"/>
    <abstract>
      <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
      <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
      <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="26"/>
  <seriesInfo name="RFC" value="8126"/>
  <seriesInfo name="DOI" value="10.17487/RFC8126"/>
</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>



    </references>

    <references title='Informative References' anchor="sec-informative-references">

<reference anchor="BLE53" >
  <front>
    <title>Bluetooth Core Specification, Version 5.3</title>
    <author >
      <organization>Bluetooth SIG</organization>
    </author>
    <date year="2021"/>
  </front>
</reference>
<reference anchor="Zigbee22" >
  <front>
    <title>Zigbee Specification, Version 22 1.0</title>
    <author >
      <organization>Connectivity Standards Alliance</organization>
    </author>
    <date year="2017"/>
  </front>
</reference>
<reference anchor="Gatt-REST-API" target="https://www.bluetooth.com/bluetooth-resources/gatt-rest-api/">
  <front>
    <title>A RESTful API used to access data in devices using the functionality defined in the Bluetooth GATT profile</title>
    <author >
      <organization>Bluetooth SIG</organization>
    </author>
    <date year="2017"/>
  </front>
</reference>


<reference anchor="RFC7252">
  <front>
    <title>The Constrained Application Protocol (CoAP)</title>
    <author fullname="Z. Shelby" initials="Z." surname="Shelby"/>
    <author fullname="K. Hartke" initials="K." surname="Hartke"/>
    <author fullname="C. Bormann" initials="C." surname="Bormann"/>
    <date month="June" year="2014"/>
    <abstract>
      <t>The Constrained Application Protocol (CoAP) is a specialized web transfer protocol for use with constrained nodes and constrained (e.g., low-power, lossy) networks. The nodes often have 8-bit microcontrollers with small amounts of ROM and RAM, while constrained networks such as IPv6 over Low-Power Wireless Personal Area Networks (6LoWPANs) often have high packet error rates and a typical throughput of 10s of kbit/s. The protocol is designed for machine- to-machine (M2M) applications such as smart energy and building automation.</t>
      <t>CoAP provides a request/response interaction model between application endpoints, supports built-in discovery of services and resources, and includes key concepts of the Web such as URIs and Internet media types. CoAP is designed to easily interface with HTTP for integration with the Web while meeting specialized requirements such as multicast support, very low overhead, and simplicity for constrained environments.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7252"/>
  <seriesInfo name="DOI" value="10.17487/RFC7252"/>
</reference>
<reference anchor="RFC7942">
  <front>
    <title>Improving Awareness of Running Code: The Implementation Status Section</title>
    <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
    <author fullname="A. Farrel" initials="A." surname="Farrel"/>
    <date month="July" year="2016"/>
    <abstract>
      <t>This document describes a simple process that allows authors of Internet-Drafts to record the status of known implementations by including an Implementation Status section. This will allow reviewers and working groups to assign due consideration to documents that have the benefit of running code, which may serve as evidence of valuable experimentation and feedback that have made the implemented protocols more mature.</t>
      <t>This process is not mandatory. Authors of Internet-Drafts are encouraged to consider using the process for their documents, and working groups are invited to think about applying the process to all of their protocol specifications. This document obsoletes RFC 6982, advancing it to a Best Current Practice.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="205"/>
  <seriesInfo name="RFC" value="7942"/>
  <seriesInfo name="DOI" value="10.17487/RFC7942"/>
</reference>



    </references>

</references>


<?line 2920?>

<section anchor="openapi-definition"><name>OpenAPI definition</name>

<t>The following non-normative model is provided for convenience of the implementer.</t>

<figure anchor="openAPI"><artwork markers="true" name="NIPC.yaml"><![CDATA[
<CODE BEGINS> file "openapi.yml"
=============== NOTE: '\' line wrapping per RFC 8792 ================

# yaml-language-server: $schema=https://json-schema.org/draft/2020-\
                                                            12/schema
openapi: 3.0.3
info:
  title: Non IP Device Control (NIPC) API
  description: |-
    This API specifies RESTful application layer interface for
    gateways providing operations against non-IP devices. The
    described interface is extensible. The examples includes
    leverage Bluetooth Low Energy and Zigbee as they are commonly
    deployed.
  termsOfService: http://swagger.io/terms/
  contact:
    email: bbrinckm@cisco.com
  license:
    name: TBD
    url: TBD
  version: 0.19.0
externalDocs:
  description: NIPC IETF draft
  url: https://datatracker.ietf.org/doc/draft-ietf-asdf-nipc/
servers:
  - url: "{gw_host}/nipc/draft-19"
    variables:
      gw_host:
        default: localhost
        description: Gateway Host
tags:
  - name: NIPC property APIs
    description: |-
      APIs that allow apps to get and update device properties.
      If the underlying protocol requires connection management, it
      will be performed as part of the API call.
  - name: NIPC event APIs
    description: |-
      APIs that allow apps to enable or disable event reporting on
      devices. If the underlying protocol requires connection
      management, it will be performed as part of the API call.
  - name: NIPC action APIs
    description: |-
      APIs that perform actions on devices or groups.
  - name: NIPC trigger APIs
    description: |-
      APIs that install triggers on actions and events for devices 
      or groups. A trigger always triggers an action. 
  - name: NIPC management APIs
    description: |-
      APIs that manage device connections.
  - name: NIPC registration APIs
    description: |-
      APIs that register sdf models or data applications

paths:
### NIPC Property APIs
  /devices/{id}/properties:
    put:
      tags:
        - NIPC property APIs
      summary: Update a value of one or more properties on a device
      description: |-
        Write a value to a property or multiple properties to a
        device. If underlying protocol requires a connection to be
        set up, this API call will perform the necessary connection
        management. If a connection is already active for this
        device, the existing connection will be leveraged without
        modifying it.
      operationId: UpdateProperties
      parameters:
      - name: id
        in: path
        description: The ID of the device. Group ID is not allowed.
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: propertyName
        in: query
        description: |-
          The SDF property name that needs to be written to.
        required: false
        allowReserved: true
        schema:
          type: string
          example: "https://example.com/heartrate#/sdfObject/\
                                  thermostat/sdfProperty/temperature"
      requestBody:
        description: |-
          The value to be written to the property or properties.
          If multiple properties are specified, the request body
          should be application/nipc+json.
        content:
          application/nipc+json:
            schema:
              $ref: '#/components/schemas/PropertyValueArray'
          "*/*":
            schema:
              description: |-
                Any other content type, such as 
                application/octet-stream, application/json that will 
                be written to the device.
        required: true
      responses:
        '204':
          description: |-
            Success, no content, used for a single property write
        '200':
          description: Success, used for multiple property writes
          content:
            application/nipc+json:
              schema:
                allOf: 
                  - $ref: '#/components/schemas/\
                                          PropertyValueResponseArray'
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/FailureResponse'

    get:
      tags:
        - NIPC property APIs
      summary: |-
        Read a value from one or multiple properties on a device
      description: |-
        Read a value to a property or multiple properties from a
        device. If underlying protocol requires a connection to be
        set up, this API call will perform the necessary connection
        management. If a connection is already active for this
        device, the existing connection will be leveraged without
        modifying it. 
      operationId: GetProperties
      parameters:
      - name: id
        in: path
        description: The ID of the device. Group ID is not allowed.
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: propertyName
        in: query
        description: Properties to be read
        required: true
        allowReserved: true
        schema:
          type: array
          items:
            type: string
            example: "https://example.com/heartrate#/sdfObject/\
                                  thermostat/sdfProperty/temperature"
      responses:
        '200':
          description: Success
          content:
            application/nipc+json:
              schema:
                allOf: 
                  - $ref: '#/components/schemas/Id'
                  - $ref: '#/components/schemas/\
                                      PropertyValueReadResponseArray'
            "*/*":
              schema:
                type: string
                description: |-
                  Any other content type, such as
                  application/octet-stream, application/json that 
                  will be read from the device.
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
 
 ### NIPC Event APIs
  /devices/{id}/events:
    post:
      tags:
        - NIPC event APIs
      summary: Enable an event on a specific device
      description: |-
        Enable an event on a specific device or for a group of
        devices. If the underlying protocol requires a connection to
        be set up, this API call will perform the necessary
        connection management. If a connection is already active for
        this device, the existing connection will be leveraged
        without modifying it.
      operationId: EnableEvent
      parameters:
      - name: id
        in: path
        description: The ID of the device.
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: eventName
        in: query
        description: event that needs to be enabled
        required: true
        allowReserved: true
        schema:
          type: string
          example: "https://example.com/heartrate#/sdfObject/\
                                  healthsensor/sdfEvent/fallDetected"
      responses:
        '201':
          description: Success
          headers:
            Location:
              description: Location of the created event
              schema:
                type: string
                format: uri
                example: "/devices/{id}/events?instanceId={\
                                                         instanceId}"
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/FailureResponse'

    delete:
      tags:
        - NIPC event APIs
      summary: Disable an event on a specific device
      description: |-
        Disable an event on a specific device or a group of devices.
        If the underlying protocol requires a connection to be set
        up, this API call will perform the necessary connection
        management. If a connection is already active for this
        device, the existing connection will be leveraged without
        modifying it.
      operationId: DisableEvent
      parameters:
      - name: id
        in: path
        description: The ID of the device.
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: instanceId
        in: query
        description: instance id of the event that needs to be \
                                                             disabled
        required: true
        schema:
          type: string
          format: uuid
          example: 02ee282c-8915-4b2e-bbd2-88966773134a
      responses:
        '204':
          description: Success, no content
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
               
    get:
      tags:
        - NIPC event APIs
      summary: Get status of events on a device
      description: |-
        Get status of an event or multiple events on a specific \
                                                               device
      operationId: GetEvents
      parameters:
      - name: id
        in: path
        description: The ID of the device.
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: instanceId
        in: query
        description: |-
          Instance ID of the events that need to be filtered
        required: false
        schema:
          type: array
          items:
            type: string
            format: uuid
            example: 02ee282c-8915-4b2e-bbd2-88966773134a
      responses:
        '200':
          description: Success
          content:
            application/nipc+json:
              schema:
                $ref: '#/components/schemas/EventStatusResponseArray'
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/FailureResponse'

  /groups/{id}/events:
    post:
      tags:
        - NIPC event APIs
      summary: Enable an event on a group of devices
      description: |-
        Enable an event on a group of devices.
        If the underlying protocol requires a connection to be set
        up, this API call will perform the necessary connection
        management. If a connection is already active for this
        device, the existing connection will be leveraged without
        modifying it.
      operationId: EnableGroupEvent
      parameters:
      - name: id
        in: path
        description: |-
          group id for which the event needs to be enabled
        required: true
        schema:
          type: string
          format: uuid
          example: 0dc729d7-f6c3-491d-9b9d-e7176d2be243
      - name: eventName
        in: query
        description: event that needs to be enabled
        required: true
        allowReserved: true
        schema:
          type: string
          example: "https://example.com/heartrate#/sdfObject/\
                                  healthsensor/sdfEvent/fallDetected"
      responses:
        '201':
          description: Success, event enabled
          headers:
            Location:
              description: Location of the created event
              schema:
                type: string
                format: uri
                example: "/groups/{id}/events?instanceId={instanceId\
                                                                   }"
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
    delete:
      tags:
        - NIPC event APIs
      summary: Disable an event on a group of devices
      description: |-
        Disable an event on a group of devices. If the underlying
        protocol requires a connection to be set up, this API call
        will perform the necessary connection management.
        If a connection is already active for this device, the
        existing connection will be leveraged without modifying it.
      operationId: DisableGroupEvent
      parameters:
      - name: id
        in: path
        description: |-
          group id for which the event needs to be disabled
        required: true
        schema:
          type: string
          format: uuid
          example: 0dc729d7-f6c3-491d-9b9d-e7176d2be243
      - name: instanceId
        in: query
        description: instance id of the event that needs to be \
                                                             disabled
        required: true
        schema:
          type: string
          format: uuid
          example: f1b9f26b-21ce-4deb-9d57-289ba7e17cce
      responses:
        '200':
          description: Success, event disabled
          content:
            application/nipc+json:
              schema:
                $ref: '#/components/schemas/\
                                       GroupEventStatusResponseArray'
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
    get:
      tags:
        - NIPC event APIs
      summary: Get status of events on a group of devices
      description: |-
        Get status of an event or multiple events on a group of \
                                                             devices.
      operationId: GetGroupEvents
      parameters:
      - name: id
        in: path
        description: group id of the SCIM group
        required: true
        schema:
          type: string
          format: uuid
          example: 0dc729d7-f6c3-491d-9b9d-e7176d2be243
      - name: instanceId
        in: query
        description: |-
          Instance IDs of the events that need to be filtered
        required: false
        schema:
          type: string
          format: uuid
          example: f1b9f26b-21ce-4deb-9d57-289ba7e17cce
      responses:
        '200':
          description: Success, events retrieved
          content:
            application/nipc+json:
              schema:
                $ref: '#/components/schemas/\
                                       GroupEventStatusResponseArray'
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/FailureResponse'

### NIPC action APIs
  /devices/{id}/actions:
    post:
      tags:
        - NIPC action APIs
      summary: Perform an action on a device
      description: |-
        Perform an action on a device.
        If the underlying protocol requires a connection to be set
        up, this API call will perform the necessary connection
        management. If a connection is already active for this
        device, the existing connection will be leveraged without
        modifying it.
      operationId: ActionProperty
      parameters:
      - name: id
        in: path
        description: The ID of the device. Group ID is not allowed.
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: actionName
        in: query
        description: action that needs to be performed
        required: true
        allowReserved: true
        schema:
          type: string
          example: "https://example.com/heartrate#/sdfObject/\
                                        healthsensor/sdfAction/start"
      requestBody:
        content:
          application/octet-stream:
            schema:
              type: string
              format: binary
        required: false
      responses:
        '202':
          description: Accepted, action is being performed
          headers:
            Location:
              description: Location of the action
              schema:
                type: string
                format: uri
                example: "/devices/{id}/actions?instanceId={\
                                                         instanceId}"
            Retry-After:
              description: |-
                Number of seconds to wait before polling the status \
                                                       endpoint again
              schema:
                type: integer
                example: 5
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
    get:
      tags:
        - NIPC action APIs
      summary: Get status of an action on a device
      description: |-
        Get status of an action on a specific device or a group of
        devices. Success is action is active, failure if action not
        active.
      operationId: GetAction
      parameters:
      - name: id
        in: path
        description: The ID of the device. Group ID is not allowed.
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: instanceId
        in: query
        description: |-
          instance id of the action that needs to be checked
        required: true
        schema:
          type: string
          format: uuid
          example: 02ee282c-8915-4b2e-bbd2-88966773134a
      responses:
        '200':
          description: Success, action is active
          content:
            application/nipc+json:
              schema:
                $ref: '#/components/schemas/ActionResponse'
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/FailureResponse'

  /groups/{id}/actions:
    post:
      tags:
        - NIPC action APIs
      summary: Perform an action on a group
      description: |-
        Perform an action on a group of decvices
        If the underlying protocol requires a connection to be set
        up, this API call will perform the necessary connection
        management. If a connection is already active for this
        device, the existing connection will be leveraged without
        modifying it.
      operationId: ActionGroupProperty
      parameters:
      - name: id
        in: path
        description: The ID of the group. 
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: actionName
        in: query
        description: action that needs to be performed
        required: true
        allowReserved: true
        schema:
          type: string
          example: "https://example.com/heartrate#/sdfObject/\
                                        healthsensor/sdfAction/start"
      requestBody:
        content:
          application/octet-stream:
            schema:
              type: string
              format: binary
        required: false
      responses:
        '202':
          description: Accepted, action is being performed
          headers:
            Location:
              description: Location of the action
              schema:
                type: string
                format: uri
                example: "/groups/{id}/actions?instanceId={\
                                                         instanceId}"
            Retry-After:
              description: |-
                Number of seconds to wait before polling the status \
                                                       endpoint again
              schema:
                type: integer
                example: 5
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
    get:
      tags:
        - NIPC action APIs
      summary: Get status of an action on a group
      description: |-
        Get status of an action on a specific group of
        devices. Success is action is active, failure if action not
        active.
      operationId: GetGroupAction
      parameters:
      - name: id
        in: path
        description: The ID of the device. Group ID is not allowed.
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: instanceId
        in: query
        description: |-
          instance id of the action that needs to be checked
        required: true
        schema:
          type: string
          format: uuid
          example: 02ee282c-8915-4b2e-bbd2-88966773134a
      responses:
        '200':
          description: Success, action is active
          content:
            application/nipc+json:
              schema:
                $ref: '#/components/schemas/\
                                      GroupActionStatusResponseArray'
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/FailureResponse'

### NIPC Trigger APIs
  /devices/{id}/triggers:
    post:
      tags:
        - NIPC trigger APIs
      summary: create a trigger on an affordance of a device
      description: |-
        Creates a trigger on an affordance of a device. A trigger 
        will trigger an action on another device or a group of \
                                                              devices
      operationId: CreateDeviceTrigger
      parameters:
      - name: id
        in: path
        description: The ID of the device.
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: sdfName
        in: query
        description: |-
          sdf affordance that will trigger this action, this can be 
          either an event or an action
        required: true
        allowReserved: true
        schema:
          type: string
          example: "https://example.com/heartrate#/sdfObject/\
                                  healthsensor/sdfEvent/fallDetected"
      requestBody:
        description: |-
          The NIPC API call to be called when the trigger is 
          executed.
        content:
          application/nipc+json:
            schema:
              $ref: '#/components/schemas/Action'
        required: true
      responses:
        '201':
          description: Success
          headers:
            Location:
              description: Location of the created trigger
              schema:
                type: string
                format: uri
                example: "/devices/{id}/triggers?instanceId={\
                                                         instanceId}"
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/FailureResponse'

    get:
      tags:
        - NIPC trigger APIs
      summary: Get information about a trigger or all triggers
      description: |-
        Get information about a trigger for a device or all triggers 
        if none specified
      operationId: GetDeviceTrigger
      parameters:
      - name: id
        in: path
        description: The ID of the device. 
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: instanceId
        in: query
        description: |-
          instance id of the trigger that needs to be checked
        required: false
        schema:
          type: string
          format: uuid
          example: 02ee282c-8915-4b2e-bbd2-88966773134a
      responses:
        '200':
          description: Success, action is active
          content:
            application/nipc+json:
              schema:
                $ref: '#/components/schemas/\
                                          TriggerStatusResponseArray'
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/FailureResponse'

    delete:
      tags:
        - NIPC trigger APIs
      summary: Delete a trigger or all triggers for a device
      description: |-
        Delete a trigger for a device or all triggers 
        if none specified
      operationId: DeleteDeviceTrigger
      parameters:
      - name: id
        in: path
        description: The ID of the device. 
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: instanceId
        in: query
        description: |-
          instance id of the trigger that needs to be checked
        required: false
        schema:
          type: string
          format: uuid
          example: 02ee282c-8915-4b2e-bbd2-88966773134a
      responses:
        '204':
          description: Success, no content
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/FailureResponse'

  /groups/{id}/triggers:
    post:
      tags:
        - NIPC trigger APIs
      summary: create a trigger on an affordance of a group
      description: |-
        Creates a trigger on an affordance of a group of devices. A \
                                                             trigger 
        will trigger an action on a device or a group of devices
      operationId: CreateGroupTrigger
      parameters:
      - name: id
        in: path
        description: The ID of the group
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: sdfName
        in: query
        description: |-
          sdf affordance that will trigger this action, this can be 
          either an event or an action
        required: true
        allowReserved: true
        schema:
          type: string
          example: "https://example.com/heartrate#/sdfObject/\
                                  healthsensor/sdfEvent/fallDetected"
      requestBody:
        description: |-
          The NIPC API call to be called when the trigger is 
          executed, as well as the device or group it is to be \
                                                    executed against.
        content:
          application/nipc+json:
            schema:
              $ref: '#/components/schemas/Action'
        required: true
      responses:
        '201':
          description: Success
          headers:
            Location:
              description: Location of the created trigger
              schema:
                type: string
                format: uri
                example: "/groups/{id}/triggers?instanceId={\
                                                         instanceId}"
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
    get:
      tags:
        - NIPC trigger APIs
      summary: Get information about a trigger or all triggers
      description: |-
        Get information about a trigger or all triggers 
        if none specified
      operationId: GetGroupTrigger
      parameters:
      - name: id
        in: path
        description: The ID of the group
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: instanceId
        in: query
        description: |-
          instance id of the trigger that needs to be checked
        required: false
        schema:
          type: string
          format: uuid
          example: 02ee282c-8915-4b2e-bbd2-88966773134a
      responses:
        '200':
          description: Success, action is active
          content:
            application/nipc+json:
              schema:
                $ref: '#/components/schemas/\
                                     GroupTriggerStatusResponseArray'
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/FailureResponse'

    delete:
      tags:
        - NIPC trigger APIs
      summary: Delete a trigger or all triggers for a grou of devices
      description: |-
        Delete a trigger for a group of devices or all triggers 
        for a group of devices if none specified
      operationId: DeleteGroupTrigger
      parameters:
      - name: id
        in: path
        description: The ID of the group of devices. 
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: instanceId
        in: query
        description: |-
          instance id of the trigger that needs to be checked
        required: false
        schema:
          type: string
          format: uuid
          example: 02ee282c-8915-4b2e-bbd2-88966773134a
      responses:
        '200':
          description: Success, trigger deleted
          content:
            application/nipc+json:
              schema:
                $ref: '#/components/schemas/\
                                     GroupTriggerStatusResponseArray'
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/FailureResponse'

### NIPC management APIs               
  /devices/{id}/connections:
    post:
      tags:
        - NIPC management APIs
      summary: Connect a device
      description: |-
        Connect a device. 3 retries by default, optionally retry
        policy can be defined in the API body. If the protocol
        requires service discovery, full service discovery will be
        performed, unless specific services are described in the API
        body.
      operationId: ActionCreateConnection
      parameters:
        - name: id
          in: path
          description: The ID of the device. Group ID is not allowed.
          required: true
          schema:
            type: string
            format: uuid
            example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      requestBody:
        content:
          application/nipc+json:
            schema:
              anyOf:
                - $ref: '#/components/schemas/Connection'
                - $ref: './protocolinfo/ProtocolInfo.yaml#/\
                          components/schemas/ProtocolInfo-ServiceMap'
            example:
              retries: 3
              protocolInformation:
                ble:
                  services:
                    - serviceID: "00001809-0000-1000-8000-\
                                                        00805f9b34fb"
                  cached: true
                  cacheExpiryDuration: 3600
        required: false
      responses:
        '200':
          description: Success
          content:
            application/nipc+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/Id'
                  - $ref: './protocolinfo/ProtocolInfo.yaml#/\
                          components/schemas/ProtocolInfo-ServiceMap'
              example:
                id: "1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30"
                protocolInformation:
                  ble:
                    services:
                      - serviceID: "00001809-0000-1000-8000-\
                                                        00805f9b34fb"
                        characteristics:
                          - characteristicID: "00002a19-0000-1000-\
                                                   8000-00805f9b34fb"
                            flags: ["read", "notify"]
                            descriptors:
                              - descriptorID: "00002902-0000-1000-\
                                                   8000-00805f9b34fb"
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
  
    put:
      tags:
        - NIPC management APIs
      summary: Update cached ServiceMap for a device.
      description: |-
        Update cached ServiceMap for a device. Full service discovery
        will be performed, unless specific services are described in
        the API body.
      operationId: ActionUpdateServiceMap
      parameters:
        - name: id
          in: path
          description: The ID of the device. Group ID is not allowed.
          required: true
          schema:
            type: string
            format: uuid
            example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      requestBody:
        content:
          application/nipc+json:
            schema:
              $ref: './protocolinfo/ProtocolInfo.yaml#/components/\
                                     schemas/ProtocolInfo-ServiceMap'
            example:
              retries: 3
              protocolInformation:
                ble:
                  services:
                    - serviceID: "00001809-0000-1000-8000-\
                                                        00805f9b34fb"
                  cached: true
                  cacheExpiryDuration: 3600
        required: false
      responses:
        '200':
          description: Success
          content:
            application/nipc+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/Id'
                  - $ref: './protocolinfo/ProtocolInfo.yaml#/\
                          components/schemas/ProtocolInfo-ServiceMap'
              example:
                id: "1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30"
                protocolInformation:
                  ble:
                    services:
                      - serviceID: "00001809-0000-1000-8000-\
                                                        00805f9b34fb"
                        characteristics:
                          - characteristicID: "00002a19-0000-1000-\
                                                   8000-00805f9b34fb"
                            flags: ["read", "notify"]
                            descriptors:
                              - descriptorID: "00002902-0000-1000-\
                                                   8000-00805f9b34fb"
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
  
    delete:
      tags:
        - NIPC management APIs
      summary: Disconnect a device 
      description: |-
        Disconnect a device.
      operationId: ActionDeleteConnection
      parameters:
        - name: id
          in: path
          description: The ID of the device. Group ID is not allowed.
          required: true
          schema:
            type: string
            format: uuid
            example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      responses:
        '200':
          description: Success
          content:
            application/nipc+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/Id'
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/FailureResponse'
                  
    get:
      tags:
        - NIPC management APIs
      summary: Get connection state for a device
      description: |-
        Get connection status for a device. Success when device(s)
        is/are connected, includes service map for the device if
        available. Failure when a device is not connected
      operationId: ActionGetConnection
      parameters:
        - name: id
          in: path
          description: The ID of the device. Group ID is not allowed.
          required: true
          schema:
            type: string
            format: uuid
            example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      responses:
        '200':
          description: Success
          content:
            application/nipc+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/Id'
                  - $ref: './protocolinfo/ProtocolInfo.yaml#/\
                          components/schemas/ProtocolInfo-ServiceMap'
              example:
                id: "1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30"
                protocolInformation:
                  ble:
                    services:
                      - serviceID: "00001809-0000-1000-8000-\
                                                        00805f9b34fb"
                        characteristics:
                          - characteristicID: "00002a19-0000-1000-\
                                                   8000-00805f9b34fb"
                            flags: ["read", "notify"]
                            descriptors:
                              - descriptorID: "00002902-0000-1000-\
                                              8000-00805f9b34fb"     
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/FailureResponse'


### Registrations
  /registrations/models:
    post:
      tags:
        - NIPC registration APIs
      summary: Register an sdfObject
      description: |-
        Register an sdfObject, including Properties, Events and
        actions
      operationId: registerSdfObject
      requestBody:
        content:
          application/sdf+json:
            schema:
              $ref: '#/components/schemas/SdfModel'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/nipc+json:
              schema:
                type: array
                items:
                  allOf:
                    - $ref: '#/components/schemas/SdfReference'
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/FailureResponse'

    get:
      tags:
        - NIPC registration APIs
      summary: Get all registered SDF model names
      description: |-
        Get all registered SDF model names.
      operationId: getSdfRefs
      parameters:
        - name: sdfName
          in: query
          description: |-
            sdfName can be a reference to an sdfThing or sdfObject
          required: false
          allowReserved: true
          schema:
            type: string
            example: "https://example.com/heartrate#/sdfObject/\
                                                        healthsensor"
      responses:
        '200':
          description: Success
          content:
            application/sdf+json:
              schema:
                $ref: '#/components/schemas/SdfModel'
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/FailureResponse'
    put:
      tags:
        - NIPC registration APIs
      summary: Update an SDF model
      description: |-
        Update an SDF model, including Properties, Events and
        actions
      operationId: updateSdf
      parameters:
        - name: sdfName
          in: query
          description: |-
            sdfName can be a reference to an sdfThing or sdfObject
          required: true
          allowReserved: true
          schema:
            type: string
            example: "https://example.com/heartrate#/sdfObject/\
                                                        healthsensor"
      requestBody:
        content:
          application/sdf+json:
            schema:
              $ref: '#/components/schemas/SdfModel'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/nipc+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/SdfReference'
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/FailureResponse'
 
    delete:
      tags:
        - NIPC registration APIs
      summary: Delete an sdfObject
      description: |-
        Delete an sdfObject, including Properties, Events and
        actions
      operationId: deleteSdfObject
      parameters:
        - name: sdfName
          in: query
          description: sdfObject name
          required: true
          schema:
            type: string
            example: "https://example.com/heartrate#/sdfObject/\
                                                        healthsensor"
      responses:
        '200':
          description: Success
          content:
            application/nipc+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/SdfReference'
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/FailureResponse'

  /registrations/data-apps:
    post:
      tags:
        - NIPC registration APIs
      summary: Register a dataApp
      description: |-
        Register a dataApp that is able to receive device data. 
      operationId: registerDataApp
      parameters:
        - name: dataAppId
          in: query
          description: id of the data app that will be registered
          required: true
          schema:
            type: string
            format: uuid
            example: 0927ce7c-b258-4bfa-a345-bcc9f74385b4
      requestBody:
        content:
          application/nipc+json:
            schema:
              $ref: '#/components/schemas/DataApp'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/nipc+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/DataApp'
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/FailureResponse'

    put:
      tags:
        - NIPC registration APIs
      summary: Update registration of a dataApp
      description: |-
        Update registration of a dataApp that is able to receive \
                                                        device data. 
      operationId: UpdateDataApp
      parameters:
        - name: dataAppId
          in: query
          description: id of the data app that will be updated
          required: true
          schema:
            type: string
            format: uuid
            example: 0927ce7c-b258-4bfa-a345-bcc9f74385b4
      requestBody:
        content:
          application/nipc+json:
            schema:
              $ref: '#/components/schemas/DataApp'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/nipc+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/DataApp'
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/FailureResponse'
                  
    delete:
      tags:
        - NIPC registration APIs
      summary: Delete registration of a dataApp
      description: |-
        Delete registration of a dataApp that is able to receive
        device data. 
      operationId: DeleteDataApp
      parameters:
        - name: dataAppId
          in: query
          description: id of the data app that will be updated
          required: true
          schema:
            type: string
            format: uuid
            example: 0927ce7c-b258-4bfa-a345-bcc9f74385b4
      responses:
        '200':
          description: Success
          content:
            application/nipc+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/DataApp'
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/FailureResponse'
  
    get:
      tags:
        - NIPC registration APIs
      summary: Get registration of a dataApp
      description: |-
        Get registrationdetails of a dataApp that is able to receive
        device data. 
      operationId: GetDataApp
      parameters:
        - name: dataAppId
          in: query
          description: id of the data app that will be updated
          required: true
          schema:
            type: string
            format: uuid
            example: 0927ce7c-b258-4bfa-a345-bcc9f74385b4
      responses:
        '200':
          description: Success
          content:
            application/nipc+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/DataApp'
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/FailureResponse'

components:
  schemas:
# Base objects
## A SCIM id, can be a device or a group
    Id:
      required:
        - id
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: |-
            A SCIM-generated UUID, can be a device or group
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30

## A property
    Property:
      required:
        - property
      type: object
      properties:
        property:
          type: string
          example: "https://example.com/heartrate#/sdfObject/\
                                  thermostat/sdfProperty/temperature"

## A value
    Value:
      required:
        - value
      type: object
      properties:
        value:
          type: string
          format: byte
          example: dGVzdA==

## A value of an property of an Device
    PropertyValue:
      allOf:
        - $ref: '#/components/schemas/Property'
        - $ref: '#/components/schemas/Value'

## An array of Property values
    PropertyValueArray:
      type: array
      items:
        $ref: '#/components/schemas/PropertyValue'

## Event
    Event:
      required:
        - event
      type: object
      properties:
        event:
          type: string
          description: |-
            percent-encoded JSON pointer to the SDF event object
          example: https://example.com/heartrate#/sdfObject/\
                                   healthsensor/sdfEvent/fallDetected

    InstanceId:
      type: object
      properties:
        instanceId:
          type: string
          format: uuid
          description: |-
            A SCIM-generated UUID for the event instance
          example: 02ee282c-8915-4b2e-bbd2-88966773134a

## An Action
    Action:
      type: object
      properties:
        action:
          type: string
          description: |-
            NIPC action operation to execute
          example: /devices/3171ec43-42a5-4415-ab4b-afd0dfbe9615/\
actions?actionName=https%3A%2F%2Fexample.com%2FAlarmSystem%23%\
                                2FsdfObject%2Fbell%2FsdfAction%2Fring
            
## A Connection
    Connection:
      type: object
      properties:
        retries:
          type: integer
          format: int32
          example: 3
          
 ## DataApp
    DataApp:
      oneOf:
        - $ref: '#/components/schemas/DataAppMqttClient'
        - $ref: '#/components/schemas/DataAppMqttBroker'
        - $ref: '#/components/schemas/DataAppWebhook'
        - $ref: '#/components/schemas/DataAppWebsocket'
      type: object
      properties:
        events:
          type: array
          items:
            $ref: '#/components/schemas/Event'


    DataAppMqttClient:
      type: object
      properties: 
        mqttClient:
          type: boolean

    DataAppMqttBroker:
      type: object
      properties: 
        mqttBroker:
          type: object
          required:
            - URI
            - username
            - password
          properties: 
            URI: 
              type: string
              example: mqtt.broker.com:8883
            username:
              type: string
              example: user1
            password: 
              type: string
              example: password1
            brokerCACert:
              description: PEM encoded CA certificate
              type: string
            customTopic:
              type: string
              description: custom MQTT topic to publish to
              example: custom/topic
      
    DataAppWebhook:
      type: object
      properties: 
        webhook:
          type: object
          properties: 
            URI: 
              type: string
              example: webhook.com:443
            headers:
              type: object
              additionalProperties:
                type: string
              example:
                x-api-key: fjelk-3dl33f-2wdsd
            serverCACert: 
              type: string 
          
    DataAppWebsocket:
      type: object
      properties: 
        websocket:
          type: object
          properties: 
            URI: 
              type: string
              example: websocket.com:443
            headers:
              type: object
              additionalProperties:
                type: string
              example:
                x-api-key: fjelk-3dl33f-2wdsd
            serverCACert: 
              type: string 

 ## sdfObject registration definition
    SdfReference:
      type: object
      description: SDF URL referring to the sdfobject
      properties: 
        sdfName:
          type: string
          example: "https://example.com/heartrate#/sdfObject/\
                                                        healthsensor"
    
    SdfModel:
      allOf:
        - type: object
          description: Sample SDF model
          properties:
            namespace:
              type: object
              additionalProperties:
                type: string
              example:
                heartrate: https://example.com/heartrate
            defaultNamespace:
              type: string
              example: heartrate
        - oneOf:
          - $ref: '#/components/schemas/SdfThing'
          - $ref: '#/components/schemas/SdfObject'

    SdfThing:
      type: object
      description: Sample SDF thing
      properties:
        sdfThing:
          additionalProperties:
            anyOf:
                - $ref: '#/components/schemas/SdfProperty'
                - $ref: '#/components/schemas/SdfEvent'
                - $ref: '#/components/schemas/SdfAction'
                - $ref: '#/components/schemas/SdfObject'
          example:
            multipleSensor:
              sdfEvent:
                isPresent:
                  sdfProtocolMap:
                    ble:
                      type: advertisement
              sdfObject:
                healthsensor:
                  sdfProperty:
                    heartrate:
                      sdfProtocolMap:
                        ble:
                          serviceID: 00001809-0000-1000-8000-\
                                                         00805f9b34fb
                          characteristicID: 00002a1c-0000-1000-8000-\
                                                         00805f9b34fb
                  sdfEvent:
                    fallDetected:
                        sdfProtocolMap:
                          ble:
                            serviceID: 00001809-0000-1000-8000-\
                                                         00805f9b34fb
                            characteristicID: 00002a1c-0000-1000-\
                                                    8000-00805f9b34fb
                  sdfAction:
                    start:
                      sdfProtocolMap:
                        ble:
                          serviceID: 00001809-0000-1000-8000-\
                                                         00805f9b34fb
                          characteristicID: 00002a1c-0000-1000-8000-\
                                                         00805f9b34fb

    SdfObject:
      type: object
      description: Sample SDF object
      properties:
        sdfObject:
          additionalProperties:
            anyOf:
              - $ref: '#/components/schemas/SdfProperty'
              - $ref: '#/components/schemas/SdfEvent'
              - $ref: '#/components/schemas/SdfAction'
          example:
            healthsensor:
              sdfProperty:
                heartrate:
                  sdfProtocolMap:
                    ble:
                      serviceID: 00001809-0000-1000-8000-00805f9b34fb
                      characteristicID: 00002a1c-0000-1000-8000-\
                                                         00805f9b34fb
              sdfEvent:
                fallDetected:
                  sdfProtocolMap:
                    ble:
                      type: advertisements
              sdfAction:
                start:
                  sdfProtocolMap:
                    ble:
                      serviceID: 00001809-0000-1000-8000-00805f9b34fb
                      characteristicID: 00002a1c-0000-1000-8000-\
                                                         00805f9b34fb

    SdfProperty:
      type: object
      description: Sample SDF property
      properties:
        sdfProperty:
          additionalProperties: 
            allOf:
              - $ref: './protocolmaps/ProtocolMap.yaml#/components/\
                                                 schemas/ProtocolMap'
          example:
            heartrate:
              sdfProtocolMap:
                ble:
                  serviceID: 00001809-0000-1000-8000-00805f9b34fb
                  characteristicID: 00002a1c-0000-1000-8000-\
                                                         00805f9b34fb
          
    SdfEvent:
      type: object
      description: Sample SDF event
      properties:
        sdfEvent:
          additionalProperties: #example, this will be the \
                                                     registered event
            allOf:
              - $ref: './protocolmaps/ProtocolMap.yaml#/components/\
                                                 schemas/ProtocolMap'
          example:
            fallDetected:
                sdfProtocolMap:
                  ble:
                    type: gatt
                    serviceID: 00001809-0000-1000-8000-00805f9b34fb
                    characteristicID: 00002a1c-0000-1000-8000-\
                                                         00805f9b34fb
    
    SdfAction:
      type: object
      description: Sample SDF action
      properties:
        sdfAction:
          additionalProperties: 
            allOf:
              - $ref: './protocolmaps/ProtocolMap.yaml#/components/\
                                                 schemas/ProtocolMap'
          example:
            start:
              sdfProtocolMap:
                ble:
                  serviceID: 00001809-0000-1000-8000-00805f9b34fb
                  characteristicID: 00002a1c-0000-1000-8000-\
                                                         00805f9b34fb

# responses

    SuccessResponse:
      type: object
      properties:
        status:
          type: integer
          format: int32
          example: 200
          description: HTTP status code

## Error 500 application Failure response
    FailureResponse:
      type: object
      properties:
        type:
          type: string
          description: URI to the error type
          enum:
            - https://www.iana.org/assignments/nipc-problem-types#\
                                                           invalid-id
            - https://www.iana.org/assignments/nipc-problem-types#\
                                                      invalid-sdf-url
            - https://www.iana.org/assignments/nipc-problem-types#\
                                     extension-operation-not-executed
            - https://www.iana.org/assignments/nipc-problem-types#\
                                         sdf-model-already-registered
            - https://www.iana.org/assignments/nipc-problem-types#\
                                                     sdf-model-in-use
            - https://www.iana.org/assignments/nipc-problem-types#\
                                                property-not-readable
            - https://www.iana.org/assignments/nipc-problem-types#\
                                                 property-read-failed
            - https://www.iana.org/assignments/nipc-problem-types#\
                                                property-not-writable
            - https://www.iana.org/assignments/nipc-problem-types#\
                                                property-write-failed
            - https://www.iana.org/assignments/nipc-problem-types#\
                                                event-already-enabled
            - https://www.iana.org/assignments/nipc-problem-types#\
                                                    event-not-enabled
            - https://www.iana.org/assignments/nipc-problem-types#\
                                                 event-not-registered
            - https://www.iana.org/assignments/nipc-problem-types#\
                                              trigger-already-enabled
            - https://www.iana.org/assignments/nipc-problem-types#\
                                    protocolmap-ble-already-connected
            - https://www.iana.org/assignments/nipc-problem-types#\
                                        protocolmap-ble-no-connection
            - https://www.iana.org/assignments/nipc-problem-types#\
                                   protocolmap-ble-connection-timeout
            - https://www.iana.org/assignments/nipc-problem-types#\
                                       protocolmap-ble-bonding-failed
            - https://www.iana.org/assignments/nipc-problem-types#\
                                    protocolmap-ble-connection-failed
            - https://www.iana.org/assignments/nipc-problem-types#\
                             protocolmap-ble-service-discovery-failed
            - https://www.iana.org/assignments/nipc-problem-types#\
                    protocolmap-ble-invalid-service-or-characteristic
            - https://www.iana.org/assignments/nipc-problem-types#\
                                protocolmap-zigbee-connection-timeout
            - https://www.iana.org/assignments/nipc-problem-types#\
                       protocolmap-zigbee-invalid-endpoint-or-cluster
            - https://www.iana.org/assignments/nipc-problem-types#\
                                      extension-transmit-invalid-data
            - https://www.iana.org/assignments/nipc-problem-types#\
                                          extension-firmware-rollback
            - https://www.iana.org/assignments/nipc-problem-types#\
                                     extension-firmware-update-failed
            - about:blank
        status:
          type: integer
          format: int32
          example: 400
          description: HTTP status code
        title:
          type: string
          example: Invalid Device ID
          description: Human-readable error title
        detail:
          type: string
          example: |-
            Device ID 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30 does not
            exist or is not a device
          description: Human-readable error message  

## Property operations responses
    
    PropertyValueResponseArrayItem:
      oneOf:
        - $ref: '#/components/schemas/SuccessResponse'
        - $ref: '#/components/schemas/FailureResponse'
    
    PropertyValueResponseArray:
      type: array
      items:
          $ref: '#/components/schemas/PropertyValueResponseArrayItem'

    PropertyValueReadResponseArrayItem:
      oneOf:
        - $ref: '#/components/schemas/PropertyValue'
        - $ref: '#/components/schemas/FailureResponse'
    
    PropertyValueReadResponseArray:
      type: array
      items:
        allOf:
          - $ref: '#/components/schemas/\
                                  PropertyValueReadResponseArrayItem'

## Event operations responses
    EventStatusResponseArrayItem:
      oneOf:
        - allOf:
          - $ref: '#/components/schemas/Event'
          - $ref: '#/components/schemas/InstanceId'
        - $ref: '#/components/schemas/FailureResponse'

    EventStatusResponseArray:
      type: array
      items:
          $ref: '#/components/schemas/EventStatusResponseArrayItem'

    GroupEventStatusResponse:
      type: object
      oneOf:
        - allOf:
          - $ref: '#/components/schemas/Event'
          - type: object
            properties:
              deviceId:
                type: string
                format: uuid
                example: 0dc729d7-f6c3-491d-9b9d-e7176d2be243
        - $ref: '#/components/schemas/FailureResponse'

    GroupEventStatusResponseArray:
      type: array
      items:
          $ref: '#/components/schemas/GroupEventStatusResponse'
    
    ActionResponse:
      required:
        - action
      type: object
      properties:
        status:
          type: string
          example: COMPLETED
          description: |-
            Status of the action, can be IN_PROGRESS or COMPLETED
    
    GroupActiontStatusResponse:
      type: object
      oneOf:
        - allOf:
          - $ref: '#/components/schemas/ActionResponse'
          - type: object
            properties:
              deviceId:
                type: string
                format: uuid
                example: 0dc729d7-f6c3-491d-9b9d-e7176d2be243
        - $ref: '#/components/schemas/FailureResponse'

    GroupActionStatusResponseArray:
      type: array
      items:
          $ref: '#/components/schemas/GroupActiontStatusResponse'
    
    TriggerResponse:
      type: object
      allOf:
        - $ref: '#/components/schemas/InstanceId'
        - $ref: '#/components/schemas/SdfReference'
        - $ref: '#/components/schemas/Action'

    TriggerStatusResponseArray:
      type: array
      items:
          $ref: '#/components/schemas/TriggerResponse'  

    GroupTriggerResponse:
      type: object
      allOf:
        - type: object
          properties:
            deviceId:
              type: string
              format: uuid
              example: 0dc729d7-f6c3-491d-9b9d-e7176d2be243
        - $ref: '#/components/schemas/SdfReference'
        - $ref: '#/components/schemas/Action'

    GroupTriggerStatusResponseArray:
      type: array
      items:
          $ref: '#/components/schemas/GroupTriggerResponse'  
<CODE ENDS>
]]></artwork></figure>

</section>
<section anchor="protocol-mapping"><name>Protocol Mapping</name>

<t>The OpenAPI model for SDF protocol mapping is provided in <xref section="B" sectionFormat="of" target="I-D.ietf-asdf-sdf-protocol-mapping"/>.</t>

</section>
<section anchor="protocol-information"><name>Protocol Information</name>

<figure><sourcecode type="yaml" markers="true" name="ProtocolInfo.yaml"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

openapi: 3.0.3
info:
  title: SDF Protocol Information
  description: |-
    SDF Protocol Information. When adding a
    new protocol information schema please add a reference to the \
                                                        protocol info
    for all the schemas in this file.
  version: 0.10.0
externalDocs:
  description: SDF Protocol Mapping IETF draft
  url: https://datatracker.ietf.org/doc/draft-ietf-asdf-sdf-protocol\
                                                            -mapping/

paths: {}

components:
  schemas:
# Protocol Information
## Protocol Info for Service Discovery result
    ProtocolInfo-ServiceMap:
      type: object
      properties:
        protocolInformation:
          oneOf:
            - $ref: './ProtocolInfo-BLE.yaml#/components/schemas/\
                                         ProtocolInfo-BLE-ServiceMap'
            - $ref: './ProtocolInfo-Zigbee.yaml#/components/schemas/\
                                      ProtocolInfo-Zigbee-ServiceMap'

## Protocol Info for Broadcasts
    ProtocolInfo-Broadcast:
      type: object
      properties:
        protocolInformation:
          oneOf:  
            - $ref: './ProtocolInfo-BLE.yaml#/components/schemas/\
                                          ProtocolInfo-BLE-Broadcast'
            - $ref: './ProtocolInfo-Zigbee.yaml#/components/schemas/\
                                       ProtocolInfo-Zigbee-Broadcast'
]]></sourcecode></figure>

<section anchor="protocol-information-for-ble"><name>Protocol Information for BLE</name>

<figure><sourcecode type="yaml" markers="true" name="ProtocolInfo-BLE.yaml"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

openapi: 3.0.3
info:
  title: SDF Protocol Information for BLE
  description: |-
    SDF Protocol Information for BLE devices.
  version: 0.10.0
externalDocs:
  description: SDF Protocol Mapping IETF draft
  url: https://datatracker.ietf.org/doc/draft-ietf-asdf-sdf-protocol\
                                                            -mapping/

paths: {}

components:
  schemas:
# BLE Protocol Info
## A Service is a device with optional service IDs
    ProtocolInfo-BLE-ServiceMap:
      type: object
      properties:
        ble:
          type: object
          properties:
            services:
              type: array
              items:
                type: object
                allOf:
                  - $ref: '#/components/schemas/ProtocolInfo-BLE-\
                                                             Service'
            cached:
              description: |-
                If we can cache information, then device doesn't need
                to be rediscovered before every connected.
              type: boolean
              default: false
            cacheExpiryDuration:
              description: cache expiry period in seconds, when \
                                                        device allows
              type: integer
              example: 3600 # default 1 hour
            autoUpdate:
              description: |-
                autoupdate services if device supports it (default)
              type: boolean
              example: true
            bonding: #optional, by default defined in SCIM object 
              type: string
              example: default
              enum:
                - default 
                - none
                - justworks
                - passkey
                - oob

    ProtocolInfo-BLE-Service:
      required:
        - serviceID
      type: object
      properties:
        serviceID:
          type: string
          format: uuid
          example: 00001809-0000-1000-8000-00805f9b34fb
        characteristics:
          type: array
          items:
            $ref: '#/components/schemas/ProtocolInfo-BLE-\
                                                      Characteristic'

    ProtocolInfo-BLE-Characteristic:
      type: object
      properties:
        characteristicID:
          type: string
          format: uuid
          example: 00002a1c-0000-1000-8000-00805f9b34fb
        flags:
          type: array
          example:
          - read
          - write
          items:
            type: string
            enum:
              - read
              - write
              - notify
              - indicate
              - write-no-response
        descriptors:
          type: array
          items:
            $ref: '#/components/schemas/ProtocolInfo-BLE-Descriptor'

    ProtocolInfo-BLE-Descriptor:
      type: object
      properties:
        descriptorID:
          type: string
          format: uuid
          example: 00002902-0000-1000-8000-00805f9b34fb

##  Protocol Info for BLE Broadcast
    ProtocolInfo-BLE-Broadcast:
      required:
        - ble
      type: object
      properties:
        ble:
          type: object
          properties:
            connectable:
              type: boolean
]]></sourcecode></figure>

</section>
<section anchor="protocol-information-for-zigbee"><name>Protocol Information for Zigbee</name>

<figure><sourcecode type="yaml" markers="true" name="ProtocolInfo-Zigbee.yaml"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

openapi: 3.0.3
info:
  title: SDF Protocol Information for Zigbee
  description: |-
    SDF Protocol Information for Zigbee devices.
  version: 0.10.0
externalDocs:
  description: SDF Protocol Mapping IETF draft
  url: https://datatracker.ietf.org/doc/draft-ietf-asdf-sdf-protocol\
                                                            -mapping/

paths: {}

components:
  schemas:
# Zigbee Protocol Information
##  Protocol Information for Zigbee Service Map
    ProtocolInfo-Zigbee-ServiceMap:
      required:
        - zigbee
      type: object
      properties:
        zigbee:
          type: object
          properties:
            endpoints:
              type: array
              items:
                $ref: '#/components/schemas/ProtocolInfo-Zigbee-\
                                                            Endpoint'

    ProtocolInfo-Zigbee-Endpoint:
      required:
        - endpointID
      type: object
      properties:
        endpointID:
          type: integer
          format: int32
          example: 10
        clusters:
          type: array
          items:
            $ref: '#/components/schemas/ProtocolInfo-Zigbee-Cluster'

    ProtocolInfo-Zigbee-Cluster:
      type: object
      properties:
        clusterID:
          type: integer
          format: int32
          example: 0
        properties:
          type: array
          items:
            $ref: '#/components/schemas/ProtocolInfo-Zigbee-Property'

    ProtocolInfo-Zigbee-Property:
      type: object
      properties:
        attributeID:
          type: integer
          format: int32
          example: 1
        propertyType:
          type: integer
          format: int32
          example: 32
          
## Protocol Information for Zigbee broadcast
    ProtocolInfo-Zigbee-Broadcast:
      required:
        - zigbee
      type: object
      properties:
        zigbee:
          type: object
]]></sourcecode></figure>

</section>
</section>
<section anchor="NIPCextensions"><name>NIPC API extensions</name>

<t>The following OpenAPI models define a few example extensions to the NIPC API.</t>

<section anchor="nipc-api-write-binary-blob-extension"><name>NIPC API write binary blob extension</name>

<figure><sourcecode type="yaml" markers="true" name="Extension-Blob.yaml"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

# yaml-language-server: $schema=https://json-schema.org/draft/2020-\
                                                            12/schema
openapi: 3.0.3
info:
  title: Non IP Device Control (NIPC) API write binary blob extension
  description: |-
    Non IP Device Control (NIPC) API write binary blob extension
  termsOfService: http://swagger.io/terms/
  contact:
    email: bbrinckm@cisco.com
  license:
    name: TBD
    url: TBD
  version: 0.19.0
externalDocs:
  description: NIPC IETF draft
  url: https://datatracker.ietf.org/doc/draft-ietf-asdf-nipc/
servers:
  - url: "{gw_host}/nipc/draft-19"
    variables:
      gw_host:
        default: localhost
        description: Gateway Host
tags:
  - name:  NIPC API extensions
    description: |-
      APIs that simplify application interaction by implementing
      one or more basic APIs into a single API call.

paths:
### Extensions
  /extensions/{id}/properties/blob:
    put:
      tags:
        - NIPC API extensions
      summary: Write a binary blob to a property on a device
      description: |-
        Write a binary blob to a property on a device. Will chunk up
        the binary blob and perform multiple writes. If the 
        underlying protocol requires a connection to be set up, 
        this API call will perform the necessary connection 
        management. If a connection is already active for this 
        device, the existing connection will be leveraged without 
        modifying it. ID cannot be a group-id.
      operationId: writeBlob
      parameters:
      - name: id
        in: path
        description: The ID of the device. Group ID is not allowed.
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: propertyName
        in: query
        description: |-
          The SDF property name that needs to be written to.
        required: true
        schema:
          type: string
          example: "https://example.com/heartrate#/sdfObject/\
                                     thermostat/sdfProperty/firmware"
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Extension-Blob'
        required: true
      responses:
        '204':
          description: Success, no content
        'default':
          description: Error response
          content:
            application/json:
              schema:
                $ref: '../NIPC.yaml#/components/schemas/\
                                                    FailureResponse' 

components:
  schemas:
# Extensions
## A binary blob Extension
    Extension-Blob:
      required:
        - blob
      type: object
      properties:
        blob:
          type: string
          format: byte
        chunksize:
          type: integer
]]></sourcecode></figure>

</section>
<section anchor="nipc-api-bulk-operations-extension"><name>NIPC API bulk operations extension</name>

<figure><sourcecode type="yaml" markers="true" name="Extension-Bulk.yaml"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

# yaml-language-server: $schema=https://json-schema.org/draft/2020-\
                                                            12/schema
openapi: 3.0.3
info:
  title: Non IP Device Control (NIPC) API bulk extension
  description: |-
    Non IP Device Control (NIPC) API bulk extension
  termsOfService: http://swagger.io/terms/
  contact:
    email: bbrinckm@cisco.com
  license:
    name: TBD
    url: TBD
  version: 0.19.0
externalDocs:
  description: NIPC IETF draft
  url: https://datatracker.ietf.org/doc/draft-ietf-asdf-nipc/
servers:
  - url: "{gw_host}/nipc/draft-19"
    variables:
      gw_host:
        default: localhost
        description: Gateway Host
tags:
  - name: NIPC API extensions
    description: |-
      APIs that simplify application interaction by implementing
      one or more basic APIs into a single API call.

paths:
  ### Extensions
  /extensions/{id}/bulk:
    post:
      tags:
        - NIPC API extensions
      summary: Compound operations on a device
      description: Compound operations on a device
      operationId: Bulk
      parameters:
        - name: id
          in: path
          description: The ID of the device. Group ID is not allowed.
          required: true
          schema:
            type: string
            format: uuid
            example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/Extension-Bulk"
            examples:
              bulkRequest:
                $ref: "#/components/examples/bulkRequest"
              firmwareUpgradeRequest:
                $ref: "#/components/examples/firmwareUpgradeRequest"
        required: true
      responses:
        "202":
          description: Accepted
          headers:
            Location:
              schema:
                type: string
                example: /extensions/1d3b2c36-8a65-45a6-87c1-\
bcdbe0a32e30/bulk/status?instanceId=02ee282c-8915-4b2e-bbd2-\
                                                         88966773134a
              description: URL to get the bulk status response
        "401":
          description: Unauthorized
        "405":
          description: Invalid request
        "500":
          description: Server-side failure
          content:
            application/json:
              schema:
                $ref: "../NIPC.yaml#/components/schemas/\
                                                     FailureResponse"
      callbacks:
        bulkEvent:
          "{$request.body#/callback.url}":
            post:
              description: Callback for bulk response
              operationId: bulkCallback
              requestBody:
                content:
                  application/json:
                    schema:
                      allOf:
                        - $ref: "../NIPC.yaml#/components/schemas/Id"
                        - $ref: "#/components/schemas/Extension-\
                                                        BulkResponse"
              responses:
                "200":
                  description: OK
                "400":
                  description: Bad request
                "401":
                  description: Unauthorized
                "405":
                  description: Invalid request
                "500":
                  description: Server-side failure
    get:
      tags:
        - NIPC API extensions
      summary: Get Bulk response
      description: Get Bulk response
      operationId: getBulkResponse
      parameters:
        - name: id
          in: path
          description: The ID of the device. Group ID is not allowed.
          required: true
          schema:
            type: string
            format: uuid
            example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
        - name: instanceId
          in: query
          description: Instance ID of the bulk operation
          required: true
          schema:
            type: string
            format: uuid
            example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      responses:
        "200":
          description: OK
          headers:
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "../NIPC.yaml#/components/schemas/Id"
                  - $ref: "#/components/schemas/Extension-\
                                                        BulkResponse"
              examples:
                bulkResponse:
                  $ref: "#/components/examples/bulkResponse"
                firmwareUpgradeResponse:
                  $ref: "#/components/examples/\
                                             firmwareUpgradeResponse"
                errorBulkResponse:
                  $ref: "#/components/examples/errorBulkResponse"

  /extensions/{id}/bulk/status:
    get:
      tags:
        - NIPC API extensions
      summary: Get Bulk status
      description: Get Bulk status
      operationId: getBulkStatus
      parameters:
        - name: id
          in: path
          description: The ID of the device. Group ID is not allowed.
          required: true
          schema:
            type: string
            format: uuid
            example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
        - name: instanceId
          in: query
          description: Instance ID of the bulk operation
          required: true
          schema:
            type: string
            format: uuid
            example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      responses:
        "200":
          description: OK
          headers:
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "./Extension-Async.yaml#/components/\
                                    schemas/Extension-StatusResponse"
        "303":
          description: See Other
          headers:
            Location:
              schema:
                type: string
                example: /extensions/1d3b2c36-8a65-45a6-87c1-\
    bcdbe0a32e30/bulk?instanceId=02ee282c-8915-4b2e-bbd2-88966773134a
              description: URL to get the bulk response
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "./Extension-Async.yaml#/components/\
                                    schemas/Extension-StatusResponse"
              examples:
                successExample:
                  summary: Success
                  value:
                    status: COMPLETED

components:
  schemas:
    # Extensions
    ## Bulk schema Extension
    Extension-Bulk:
      allOf:
        - $ref: "./Extension-Async.yaml#/components/schemas/\
                                                  Extension-Callback"
        - type: object
          properties:
            operations:
              type: array
              items:
                $ref: "#/components/schemas/Extension-BulkOperation"
            trigger:
              type: string
              description: |-
                When to trigger the operations. If not specified, \
                            the operations are triggered immediately.
              default: immediate
              enum:
                - immediate
                - advertisement

    ## Extension that defines an operation in a bulk API
    Extension-BulkOperation:
      required:
        - method
        - path
      allOf:
        - type: object
          properties:
            method:
              type: string
              enum:
                - POST
                - PUT
                - GET
            path:
              type: string
              enum:
                - /devices/{id}/properties?propertyName={\
                                                        propertyName}
                - /devices/{id}/actions/?actionName={actionName}
                - /extensions/{id}/properties/read/conditional?\
                                          propertyName={propertyName}
                - /extensions/{id}/events/conditional?eventName={\
                                                           eventName}
                - /extensions/{id}/properties/file?propertyName={\
                                                        propertyName}
              example: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30\
/properties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%\
                 2FsdfThing%2Fthermometer%2FsdfProperty%2Ftemperature
            data:
              type: object
              oneOf:
                - $ref: "../NIPC.yaml#/components/schemas/Value"
                - $ref: "./Extension-ReadConditional.yaml#/\
                        components/schemas/Extension-ConditionalRead"

    ## Multiple returns for a bulk operation
    Extension-BulkResponse:
      type: object
      properties:
        operations:
          type: array
          items:
            $ref: "#/components/schemas/Extension-OperationResponse"

    ## Return for an operation
    Extension-OperationResponse:
      allOf:
        - type: object
          properties:
            method:
              type: string
              enum:
                - POST
                - PUT
                - GET
            path:
              type: string
              enum:
                - /devices/{id}/properties?propertyName={\
                                                        propertyName}
                - /devices/{id}/actions/?actionName={actionName}
                - /extensions/{id}/properties/read/conditional?\
                                          propertyName={propertyName}
                - /extensions/{id}/events/conditional?eventName={\
                                                           eventName}
              example: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30\
/properties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%\
                 2FsdfThing%2Fthermometer%2FsdfProperty%2Ftemperature
            response:
              anyOf:
                - $ref: "../NIPC.yaml#/components/schemas/Value"
                - $ref: "../NIPC.yaml#/components/schemas/\
                                                     SuccessResponse"
                - $ref: "../NIPC.yaml#/components/schemas/\
                                                     FailureResponse"

  examples:
    bulkRequest:
      summary: Bulk request example
      value:
        operations:
          - method: GET
            path: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/\
properties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%\
                 2FsdfThing%2Fthermometer%2FsdfProperty%2Ftemperature
          - method: PUT
            path: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/\
properties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%\
                 2FsdfThing%2Fthermometer%2FsdfProperty%2Ftemperature
            data:
              value: dGVzdA==
          - method: POST
            path: /extensions/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/\
properties/read/conditional?propertyName=https%3A%2F%2Fexample.com%\
2Fthermometer%23%2FsdfThing%2Fthermometer%2FsdfProperty%2Ftemperature
            data:
              value: dGVzdA==
              maxRepeat: 5
              retryTime: 1
    bulkResponse:
      summary: Bulk response example
      value:
        operations:
          - method: GET
            path: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/\
properties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%\
                 2FsdfThing%2Fthermometer%2FsdfProperty%2Ftemperature
            response:
              value: dGVzdA==
          - method: PUT
            path: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/\
properties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%\
                 2FsdfThing%2Fthermometer%2FsdfProperty%2Ftemperature
            response:
              status: 200
          - method: POST
            path: /extensions/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/\
properties/read/conditional?propertyName=https%3A%2F%2Fexample.com%\
2Fthermometer%23%2FsdfThing%2Fthermometer%2FsdfProperty%2Ftemperature
            response:
              value: dGVzdA==
    errorBulkResponse:
      summary: Error Bulk response example
      value:
        operations:
          - method: GET
            path: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/\
properties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%\
                 2FsdfThing%2Fthermometer%2FsdfProperty%2Ftemperature
            response:
              type: https://www.iana.org/assignments/nipc-problem-\
                                          types#property-not-readable
              status: 400
              title: Property not readable
              detail: Property https://example.com/thermometer#/\
         sdfThing/thermometer/sdfProperty/temperature is not readable
          - method: PUT
            path: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/\
properties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%\
                 2FsdfThing%2Fthermometer%2FsdfProperty%2Ftemperature
            response:
              type: https://www.iana.org/assignments/nipc-problem-\
                               types#extension-operation-not-executed
              status: 400
              title: Operation not executed
              detail: Operation was not executed since the previous \
                                                     operation failed
          - method: POST
            path: /extensions/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/\
properties/read/conditional?propertyName=https%3A%2F%2Fexample.com%\
2Fthermometer%23%2FsdfThing%2Fthermometer%2FsdfProperty%2Ftemperature
            response:
              type: https://www.iana.org/assignments/nipc-problem-\
                               types#extension-operation-not-executed
              status: 400
              title: Operation not executed
              detail: Operation was not executed since the previous \
                                                     operation failed
    firmwareUpgradeRequest:
      summary: Firmware upgrade request example
      value:
        operations:
          - method: PUT
            path: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/\
properties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%\
                    2FsdfThing%2Fthermometer%2FsdfProperty%2FstartOTA
            data:
              value: dGVzdA==
          - method: POST
            path: /extensions/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/\
events/conditional?eventName=https%3A%2F%2Fexample.com%2Fthermometer\
                 %23%2FsdfThing%2Fthermometer%2FsdfEvent%2FotaStarted
            data:
              value: MQ==
              timeout: 5
          - method: PUT
            path: /extensions/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/\
properties/file?propertyName=https%3A%2F%2Fexample.com%2Fthermometer\
                %23%2FsdfThing%2Fthermometer%2FsdfProperty%2Ffirmware
            data:
              fileURL: https://example.com/firmware.bin
              chunkSize: 20
              sha256Checksum: \
     abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890
          - method: PUT
            path: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/\
properties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%\
                   2FsdfThing%2Fthermometer%2FsdfProperty%2FfinishOTA
            data:
              value: dGVzdA==
          - method: POST
            path: /extensions/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/\
properties/read/conditional?propertyName=https%3A%2F%2Fexample.com%\
2Fthermometer%23%2FsdfThing%2Fthermometer%2FsdfProperty%\
                                                       2FupdateStatus
            data:
              value: MQ==
              maxRepeat: 5
              retryTime: 1
          - method: PUT
            path: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/\
properties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%\
                 2FsdfThing%2Fthermometer%2FsdfProperty%2FactivateOTA
            data:
              value: dGVzdA==
    firmwareUpgradeResponse:
      summary: Firmware upgrade response example
      value:
        operations:
          - method: PUT
            path: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/\
properties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%\
                    2FsdfThing%2Fthermometer%2FsdfProperty%2FstartOTA
            response:
              status: 200
          - method: POST
            path: /extensions/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/\
events/conditional?eventName=https%3A%2F%2Fexample.com%2Fthermometer\
                 %23%2FsdfThing%2Fthermometer%2FsdfEvent%2FotaStarted
            response:
              value: MQ==
          - method: PUT
            path: /extensions/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/\
properties/file?propertyName=https%3A%2F%2Fexample.com%2Fthermometer\
                %23%2FsdfThing%2Fthermometer%2FsdfProperty%2Ffirmware
            response:
              status: 204
          - method: PUT
            path: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/\
properties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%\
                   2FsdfThing%2Fthermometer%2FsdfProperty%2FfinishOTA
            response:
              status: 200
          - method: POST
            path: /extensions/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/\
properties/read/conditional?propertyName=https%3A%2F%2Fexample.com%\
2Fthermometer%23%2FsdfThing%2Fthermometer%2FsdfProperty%\
                                                       2FupdateStatus
            response:
              value: MQ==
          - method: PUT
            path: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/\
properties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%\
                 2FsdfThing%2Fthermometer%2FsdfProperty%2FactivateOTA
            data:
              status: 200
]]></sourcecode></figure>

</section>
<section anchor="nipc-api-write-file-extension"><name>NIPC API write file extension</name>

<figure><sourcecode type="yaml" markers="true" name="Extension-File.yaml"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

# yaml-language-server: $schema=https://json-schema.org/draft/2020-\
                                                            12/schema
openapi: 3.0.3
info:
  title: Non IP Device Control (NIPC) API write file extension
  description: |-
    Non IP Device Control (NIPC) API write file extension
  termsOfService: http://swagger.io/terms/
  contact:
    email: bbrinckm@cisco.com
  license:
    name: TBD
    url: TBD
  version: 0.19.0
externalDocs:
  description: NIPC IETF draft
  url: https://datatracker.ietf.org/doc/draft-ietf-asdf-nipc/
servers:
  - url: "{gw_host}/nipc/draft-19"
    variables:
      gw_host:
        default: localhost
        description: Gateway Host
tags:
  - name:  NIPC API extensions
    description: |-
      APIs that simplify application interaction by implementing
      one or more basic APIs into a single API call.

paths:
### Extensions
  /extensions/{id}/properties/file:
    put:
      tags:
        - NIPC API extensions
      summary: Write a file to a property on a device
      description: |-
        Write a file to a property on a device. Will chunk up the 
        file and perform multiple writes. If the underlying protocol
        requires a connection to be set up, this API call will 
        perform the necessary connection management. If a connection
        is already active for this device, the existing connection 
        will be leveraged without modifying it. ID cannot be a
        group-id.
      operationId: writeFile
      parameters:
      - name: id
        in: path
        description: The ID of the device. Group ID is not allowed.
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: propertyName
        in: query
        description: |-
          The SDF property name that needs to be written to.
        required: true
        schema:
          type: string
          example: "https://example.com/heartrate#/sdfObject/\
                                     thermostat/sdfProperty/firmware"
      requestBody:
        content:
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/Extension-File'
                - $ref: './Extension-Async.yaml#/components/schemas/\
                                                  Extension-Callback'
        required: true
      responses:
        '202':
          description: Accepted
          headers:
            Location:
              schema:
                type: string
                example: /extensions/1d3b2c36-8a65-45a6-87c1-\
bcdbe0a32e30/properties/file/status?propertyName=https%3A%2F%\
2Fexample.com%2Fheartrate%23%2FsdfObject%2Fthermostat%2FsdfProperty%\
           2Ffirmware&instanceId=02ee282c-8915-4b2e-bbd2-88966773134a
              description: |-
                URL to get the file write status
            Retry-After:
              schema:
                type: integer
              description: |-
                Time in seconds to wait before retrying
        'default':
          description: Error response
          content:
            application/json:
              schema:
                $ref: '../NIPC.yaml#/components/schemas/\
                                                     FailureResponse'
      callbacks:
        callbackEvent:
          "{$request.body#/callback.url}":
            post:
              requestBody:
                content:
                  application/json:
                    schema:
                      anyOf:
                        - allOf:
                          - $ref: '../NIPC.yaml#/components/schemas/\
                                                                  Id'
                          - $ref: '../NIPC.yaml#/components/schemas/\
                                                       PropertyValue'
                        - $ref: '../NIPC.yaml#/components/schemas/\
                                                     FailureResponse'
                    examples:
                      successExample:
                        summary: Success
                        value:
                          id: 02ee282c-8915-4b2e-bbd2-88966773134a
                          property: https://example.com/heartrate#/\
                            sdfObject/thermostat/sdfProperty/firmware
                      failedResponse:
                        summary: Failed
                        value:
                          id: 02ee282c-8915-4b2e-bbd2-88966773134a
                          status: 400
                          type: https://www.iana.org/assignments/\
                                        nipc-problem-types#invalid-id
                          title: Invalid ID
                          detail: "Invalid request"
                          property: https://example.com/heartrate#/\
                            sdfObject/thermostat/sdfProperty/firmware
              responses:
                '200':
                  description: Success
    get:
      tags:
        - NIPC API extensions
      summary: Get the status of a file write operation
      description: |-
        Get the status of a file write operation. This will return
        the status of the file write operation, including any errors
        that may have occurred.
      operationId: getFileWriteStatus
      parameters:
      - name: id
        in: path
        description: The ID of the device. Group ID is not allowed.
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: propertyName
        in: query
        description: |-
          The SDF property name that needs to be written to.
        required: true
        schema:
          type: string
          example: "https://example.com/heartrate#/sdfObject/\
                                     thermostat/sdfProperty/firmware"
      - name: instanceId
        in: query
        description: |-
          The Instance ID for the file write operation.
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      responses:
        '204':
          description: Success, no content
        default:
          description: Error response
          content:
            application/json:
              schema:
                $ref: '../NIPC.yaml#/components/schemas/\
                                                     FailureResponse'
  /extensions/{id}/properties/file/status:
    get:
      tags:
        - NIPC API extensions
      summary: Get the status of a file write operation
      description: |-
        Get the status of a file write operation. This will return
        the status of the file write operation, including any errors
        that may have occurred.
      operationId: getFileWriteStatus
      parameters:
      - name: id
        in: path
        description: The ID of the device. Group ID is not allowed.
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: propertyName
        in: query
        description: |-
          The SDF property name that needs to be written to.
        required: true
        schema:
          type: string
          example: "https://example.com/heartrate#/sdfObject/\
                                     thermostat/sdfProperty/firmware"
      - name: instanceId
        in: query
        description: |-
          The Instance ID for the file write operation.
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      responses:
        '200':
          description: Success, returns the status of the file \
                                                     write operation.
          content:
            application/json:
              schema:
                $ref: './Extension-Async.yaml#/components/schemas/\
                                            Extension-StatusResponse'
        '303':
          description: See Other
          headers:
            Location:
              schema:
                type: string
                example: /extensions/1d3b2c36-8a65-45a6-87c1-\
bcdbe0a32e30/properties/file?propertyName=https%3A%2F%2Fexample.com%\
2Fheartrate%23%2FsdfObject%2Fthermostat%2FsdfProperty%2Ffirmware&\
                      instanceId=02ee282c-8915-4b2e-bbd2-88966773134a
              description: URL to get the file write response
          content:
            application/json:
              schema:
                $ref: './Extension-Async.yaml#/components/schemas/\
                                            Extension-StatusResponse'
              examples:
                successExample:
                  summary: Completed
                  value:
                    id: 02ee282c-8915-4b2e-bbd2-88966773134a
                    status: COMPLETED

components:
  schemas:
# Extensions
## A File Extension
    Extension-File:
      required:
        - fileURL
      type: object
      properties:
        fileURL:
          type: string
          example: "https://domain.com/firmware.dat"
          description: |-
            URL to the firmware file. 
            The HTTP method is assumed to be a GET.
        chunkSize:
          type: integer
        sha256Checksum:
          type: string
          description: firmware checksum
        headers:
          type: object
          additionalProperties:
            type: string
          example:
            x-api-key: fjelk-3dl33f-2wdsd
]]></sourcecode></figure>

</section>
<section anchor="nipc-api-conditional-read-extension"><name>NIPC API conditional read extension</name>

<figure><sourcecode type="yaml" markers="true" name="Extension-ReadConditional.yaml"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

# yaml-language-server: $schema=https://json-schema.org/draft/2020-\
                                                            12/schema
openapi: 3.0.3
info:
  title: Non IP Device Control (NIPC) API read conditional extension
  description: |-
    Non IP Device Control (NIPC) API read conditional extension
  termsOfService: http://swagger.io/terms/
  contact:
    email: bbrinckm@cisco.com
  license:
    name: TBD
    url: TBD
  version: 0.19.0
externalDocs:
  description: NIPC IETF draft
  url: https://datatracker.ietf.org/doc/draft-ietf-asdf-nipc/
servers:
  - url: "{gw_host}/nipc/draft-19"
    variables:
      gw_host:
        default: localhost
        description: Gateway Host
tags:
  - name:  NIPC API extensions
    description: |-
      APIs that simplify application interaction by implementing
      one or more basic APIs into a single API call.

paths:
### Extensions
  /extensions/{id}/properties/read/conditional:
    post:
      tags:
        - NIPC API extensions
      summary: Conditional read of a property
      description: Conditional read of a property
      operationId: conditionalRead
      parameters:
      - name: id
        in: path
        description: The ID of the device. Group ID is not allowed.
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: propertyName
        in: query
        description: |-
          The SDF property name that needs to be read conditionally.
        required: true
        allowReserved: true
        schema:
          type: string
          example: "#/sdfObject/thermostat/sdfProperty/temperature"
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Extension-ConditionalRead'
        required: true
      responses:
        '202':
          description: Accepted
          headers:
            Location:
              schema:
                type: string
                example: /extensions/1d3b2c36-8a65-45a6-87c1-\
bcdbe0a32e30/properties/read/conditional/status?propertyName=https%\
3A%2F%2Fexample.com%2Fheartrate%23%2FsdfObject%2Fthermostat%\
2FsdfProperty%2Ftemperature&instanceId=02ee282c-8915-4b2e-bbd2-\
                                                         88966773134a
              description: |-
                URL to get the conditional read status
            Retry-After:
              schema:
                type: integer
              description: |-
                Time in seconds to wait before retrying
        'default':
          description: Error response
          content:
            application/json:
              schema:
                $ref: '../NIPC.yaml#/components/schemas/\
                                                     FailureResponse'
      callbacks:
        callbackEvent:
          "{$request.body#/callback.url}":
            post:
              requestBody:
                content:
                  application/json:
                    schema:
                      anyOf:
                        - allOf:
                          - $ref: '../NIPC.yaml#/components/schemas/\
                                                                  Id'
                          - $ref: '../NIPC.yaml#/components/schemas/\
                                                       PropertyValue'
                        - $ref: '../NIPC.yaml#/components/schemas/\
                                                     FailureResponse'
                    examples:
                      successExample:
                        summary: Success
                        value:
                          id: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
                          property: https://example.com/heartrate#/\
                         sdfObject/thermostat/sdfProperty/temperature
                          value: dGVzdA==
                      failedResponse:
                        summary: Failed
                        value:
                          id: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
                          status: 400
                          type: https://www.iana.org/assignments/\
                                        nipc-problem-types#invalid-id
                          title: Invalid ID
                          detail: "Invalid request"
                          property: https://example.com/heartrate#/\
                         sdfObject/thermostat/sdfProperty/temperature
                          value: dGVzdA==
                          
              responses:
                '200':
                  description: Success
    get:
      tags:
        - NIPC API extensions
      summary: Get Conditional read response of a property
      description: Conditional read response of a property
      operationId: getConditionalRead
      parameters:
      - name: id
        in: path
        description: The ID of the device. Group ID is not allowed.
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: propertyName
        in: query
        description: |-
          The SDF property name that needs to be read conditionally.
        required: true
        allowReserved: true
        schema:
          type: string
          example: "#/sdfObject/thermostat/sdfProperty/temperature"
      - name: instanceId
        in: query
        description: |-
          Instance ID of the conditional read operation
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      responses:
        '200':
          description: Success
          headers:
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '../NIPC.yaml#/components/schemas/Value'
            application/octet-stream:
              schema:
                type: string
                format: binary
              description: Binary data of the property value
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                allOf:
                  - $ref: '../NIPC.yaml#/components/schemas/\
                                                     FailureResponse'
  /extensions/{id}/properties/read/conditional/status:
    get:
      tags:
        - NIPC API extensions
      summary: Get Conditional read status of a property
      description: Conditional read status of a property
      operationId: getConditionalReadStatus
      parameters:
      - name: id
        in: path
        description: The ID of the device. Group ID is not allowed.
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: propertyName
        in: query
        description: |-
          The SDF property name that needs to be read conditionally.
        required: true
        allowReserved: true
        schema:
          type: string
          example: "#/sdfObject/thermostat/sdfProperty/temperature"
      - name: instanceId
        in: query
        description: Instance ID of the conditional read operation
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      responses:
        '200':
          description: OK
          headers:
          content:
            application/json:
              schema:
                $ref: './Extension-Async.yaml#/components/schemas/\
                                            Extension-StatusResponse'
        '303':
          description: See Other
          headers:
            Location:
              schema:
                type: string
                example: /extensions/1d3b2c36-8a65-45a6-87c1-\
bcdbe0a32e30/properties/read/conditional?propertyName=https%3A%2F%\
2Fexample.com%2Fheartrate%23%2FsdfObject%2Fthermostat%2FsdfProperty%\
        2Ftemperature&instanceId=02ee282c-8915-4b2e-bbd2-88966773134a
              description: URL to get the conditional read response
          content:
            application/json:
              schema:
                $ref: './Extension-Async.yaml#/components/schemas/\
                                            Extension-StatusResponse'
              examples:
                successExample:
                  summary: Completed
                  value:
                    id: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
                    status: COMPLETED

components:
  schemas:
# Extensions
    Extension-ConditionalRead:
      allOf:
        - $ref: '../NIPC.yaml#/components/schemas/Value'
        - $ref: './Extension-Async.yaml#/components/schemas/\
                                                  Extension-Callback'
        - type: object
          properties:
            maxRepeat:
              description: |-
                maximum time the conditional read should repeat
                (default 5, max 10)
              type: integer
              example: 5
            retryTime:
              description: |-
                time between reads in seconds (default 1, max 10)
              type: integer
              example: 1
]]></sourcecode></figure>

</section>
<section anchor="nipc-api-conditional-event-extension"><name>NIPC API conditional event extension</name>

<figure><sourcecode type="yaml" markers="true" name="Extension-EventConditional.yaml"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

# yaml-language-server: $schema=https://json-schema.org/draft/2020-\
                                                            12/schema
openapi: 3.0.3
info:
  title: Non IP Device Control (NIPC) API event conditional extension
  description: |-
    Non IP Device Control (NIPC) API event conditional extension
  termsOfService: http://swagger.io/terms/
  contact:
    email: bbrinckm@cisco.com
  license:
    name: TBD
    url: TBD
  version: 0.19.0
externalDocs:
  description: NIPC IETF draft
  url: https://datatracker.ietf.org/doc/draft-ietf-asdf-nipc/
servers:
  - url: "{gw_host}/nipc/draft-19"
    variables:
      gw_host:
        default: localhost
        description: Gateway Host
tags:
  - name:  NIPC API extensions
    description: |-
      APIs that simplify application interaction by implementing
      one or more basic APIs into a single API call.

paths:
### Extensions
  /extensions/{id}/events/conditional:
    post:
      tags:
        - NIPC API extensions
      summary: Enable an event until a condition is met
      description: Enable an event until a condition is met
      operationId: conditionalEvent
      parameters:
      - name: id
        in: path
        description: The ID of the device. Group ID is not allowed.
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: eventName
        in: query
        description: |-
          The SDF event name that needs to be enabled.
        required: true
        allowReserved: true
        schema:
          type: string
          example: "#/sdfObject/thermostat/sdfEvent/temperature"
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Extension-ConditionalEvent'
        required: true
      responses:
        '202':
          description: Accepted
          headers:
            Location:
              schema:
                type: string
                example: /extensions/1d3b2c36-8a65-45a6-87c1-\
bcdbe0a32e30/events/conditional/status?eventName=https%3A%2F%\
2Fexample.com%2Fheartrate%23%2FsdfObject%2Fthermostat%2FsdfEvent%\
        2Ftemperature&instanceId=02ee282c-8915-4b2e-bbd2-88966773134a
              description: |-
                URL to get the conditional event status
            Retry-After:
              schema:
                type: integer
              description: |-
                Time in seconds to wait before retrying
        'default':
          description: Error response
          content:
            application/json:
              schema:
                $ref: '../NIPC.yaml#/components/schemas/\
                                                     FailureResponse'
      callbacks:
        callbackEvent:
          "{$request.body#/callback.url}":
            post:
              requestBody:
                content:
                  application/json:
                    schema:
                      anyOf:
                        - allOf:
                          - $ref: '../NIPC.yaml#/components/schemas/\
                                                                  Id'
                          - $ref: '../NIPC.yaml#/components/schemas/\
                                                       PropertyValue'
                        - $ref: '../NIPC.yaml#/components/schemas/\
                                                     FailureResponse'
                    examples:
                      successExample:
                        summary: Success
                        value:
                          id: 02ee282c-8915-4b2e-bbd2-88966773134a
                          event: https://example.com/heartrate#/\
                            sdfObject/thermostat/sdfEvent/temperature
                          value: dGVzdA==
                      failedResponse:
                        summary: Failed
                        value:
                          id: 02ee282c-8915-4b2e-bbd2-88966773134a
                          status: 400
                          type: https://www.iana.org/assignments/\
                                        nipc-problem-types#invalid-id
                          title: Invalid ID
                          detail: "Invalid request"
                          event: https://example.com/heartrate#/\
                            sdfObject/thermostat/sdfEvent/temperature
                          value: dGVzdA==
                          
              responses:
                '200':
                  description: Success
    get:
      tags:
        - NIPC API extensions
      summary: Get Conditional event response
      description: Conditional event response
      operationId: getConditionalEvent
      parameters:
      - name: id
        in: path
        description: The ID of the device. Group ID is not allowed.
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: eventName
        in: query
        description: |-
          The name of the SDF event that is enabled.
        required: true
        allowReserved: true
        schema:
          type: string
          example: "#/sdfObject/thermostat/sdfEvent/temperature"
      - name: instanceId
        in: query
        description: |-
          Instance ID of the conditional event operation
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      responses:
        '200':
          description: Success
          headers:
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '../NIPC.yaml#/components/schemas/Value'
            application/octet-stream:
              schema:
                type: string
                format: binary
              description: Binary data of the event value
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                allOf:
                  - $ref: '../NIPC.yaml#/components/schemas/\
                                                     FailureResponse'
  /extensions/{id}/events/conditional/status:
    get:
      tags:
        - NIPC API extensions
      summary: Get Conditional event status
      description: Conditional event status
      operationId: getConditionalEventStatus
      parameters:
      - name: id
        in: path
        description: The ID of the device. Group ID is not allowed.
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      - name: eventName
        in: query
        description: |-
          The name of the SDF event that is enabled.
        required: true
        allowReserved: true
        schema:
          type: string
          example: "#/sdfObject/thermostat/sdfEvent/temperature"
      - name: instanceId
        in: query
        description: Instance ID of the conditional event operation
        required: true
        schema:
          type: string
          format: uuid
          example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      responses:
        '200':
          description: OK
          headers:
          content:
            application/json:
              schema:
                $ref: './Extension-Async.yaml#/components/schemas/\
                                            Extension-StatusResponse'
        '303':
          description: See Other
          headers:
            Location:
              schema:
                type: string
                example: /extensions/1d3b2c36-8a65-45a6-87c1-\
bcdbe0a32e30/events/conditional?eventName=https%3A%2F%2Fexample.com%\
2Fheartrate%23%2FsdfObject%2Fthermostat%2FsdfEvent%2Ftemperature&\
                      instanceId=02ee282c-8915-4b2e-bbd2-88966773134a
              description: URL to get the conditional event response
          content:
            application/json:
              schema:
                $ref: './Extension-Async.yaml#/components/schemas/\
                                            Extension-StatusResponse'
              examples:
                successExample:
                  summary: Completed
                  value:
                    id: 02ee282c-8915-4b2e-bbd2-88966773134a
                    status: COMPLETED

components:
  schemas:
# Extensions
    Extension-ConditionalEvent:
      allOf:
        - $ref: './Extension-Async.yaml#/components/schemas/\
                                                  Extension-Callback'
        - $ref: '../NIPC.yaml#/components/schemas/Value'
        - type: object
          properties:
            timeout:
              description: |-
                Time in seconds to keep the event enabled.
                If the event condition is not met within this time,
                the event will be disabled and marked as failed.
              type: integer
              example: 5
]]></sourcecode></figure>

</section>
<section anchor="nipc-api-property-extensions"><name>NIPC API property extensions</name>

<figure><sourcecode type="yaml" markers="true" name="Extension-Transmit.yaml"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

# yaml-language-server: $schema=https://json-schema.org/draft/2020-\
                                                            12/schema
openapi: 3.0.3
info:
  title: Non IP Device Control (NIPC) API properties extension
  description: |-
    Non IP Device Control (NIPC) API properties extension
  termsOfService: http://swagger.io/terms/
  contact:
    email: bbrinckm@cisco.com
  license:
    name: TBD
    url: TBD
  version: 0.19.0
externalDocs:
  description: NIPC IETF draft
  url: https://datatracker.ietf.org/doc/draft-ietf-asdf-nipc/
servers:
  - url: "{gw_host}/nipc/draft-19"
    variables:
      gw_host:
        default: localhost
        description: Gateway Host
tags:
  - name:  NIPC API extensions
    description: |-
      APIs that simplify application interaction by implementing
      one or more basic APIs into a single API call.

paths:
### Extensions
  /extensions/{id}/transmit:
    post:
      tags:
        - NIPC API extensions
      summary: Transmit to a device
      description: |-
        Transmit a payload to a device. The transmission is \
                   performed on the AP where the device was last seen
      operationId: ActionTransmit
      parameters:
        - name: id
          in: path
          description: The ID of the device. Group ID is not allowed.
          required: true
          schema:
            type: string
            format: uuid
            example: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Transmit'
        required: true
      responses:
        '200':
          description: Success
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '../NIPC.yaml#/components/schemas/\
                                                     FailureResponse'

components:
  schemas:
    Transmit:
      allOf:
        - $ref: '../protocolinfo/ProtocolInfo.yaml#/components/\
                                      schemas/ProtocolInfo-Broadcast'
      required:
        - cycle
      type: object
      properties:
        cycle:
          type: string
          example: single
          enum:
            - single
            - repeat
        # transmit time in ms
        transmitTime:
          type: integer
          example: 3000
        # interval between transmits in ms
        transmitInterval:
          type: integer
          example: 500
        payload:
          type: string
          format: byte
          example: AgEaAgoMFv9MABAHch9BsDkgeA==
]]></sourcecode></figure>

</section>
</section>
<section anchor="nipc-api-cddl-definition"><name>NIPC API CDDL Definition</name>

<t>The following is a combined reference of all NIPC API CDDL definitions used in this document.</t>

<figure><sourcecode type="cddl" markers="true" name="combined.cddl"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

; This file is auto-generated from individual NIPC API CDDL files

; ============================================
; From: cddl/api/action_response.cddl
; ============================================
ActionResponse = {
  status: ActionStatus
}

ActionStatus = "IN_PROGRESS" / "COMPLETED"
; ============================================
; From: cddl/api/action.cddl
; ============================================
Action = {
  action: text  ; NIPC action operation to execute
}

; ============================================
; From: cddl/api/data_app.cddl
; ============================================
DataApp = {
  events: [* EventRef],
  ( DataAppMqttClient //
    DataAppMqttBroker //
    DataAppWebhook //
    DataAppWebsocket )
}

EventRef = {
  event: text    ; SDF global name (absolute URI with fragment)
}

DataAppMqttClient = {
  mqttClient: bool
}

DataAppMqttBroker = {
  mqttBroker: {
    URI: text,
    username: text,
    password: text,
    ? brokerCACert: text,   ; PEM-encoded CA certificate
    ? customTopic: text     ; optional custom MQTT topic
  }
}

DataAppWebhook = {
  webhook: {
    URI: text,
    ? headers: { * text => text },  ; key/value headers
    ? serverCACert: text
  }
}

DataAppWebsocket = {
  websocket: {
    URI: text,
    ? headers: { * text => text },  ; key/value headers
    ? serverCACert: text
  }
}
; ============================================
; From: cddl/api/event_status_array.cddl
; ============================================
EventStatusResponseArray = [* EventStatusResponseArrayItem]

EventStatusResponseArrayItem = ( EventInstanceSuccess // \
                                                    FailureResponse )

; Success item = { event, instanceId }
EventInstanceSuccess = {
  event: text,        ; SDF global name of the event (absolute URI \
                                                       with fragment)
  instanceId: text    ; UUID (as text)
}

; ============================================
; From: cddl/api/failure_response.cddl
; ============================================
FailureResponse = {
  type: FailureTypeURI,
  status: uint,
  title: text,
  detail: text
}

; Enumerated problem type URIs registered for NIPC
FailureTypeURI = (
  "https://www.iana.org/assignments/nipc-problem-types#invalid-id" /
  "https://www.iana.org/assignments/nipc-problem-types#invalid-sdf-\
                                                               url" /
  "https://www.iana.org/assignments/nipc-problem-types#extension-\
                                            operation-not-executed" /
  "https://www.iana.org/assignments/nipc-problem-types#sdf-model-\
                                                already-registered" /
  "https://www.iana.org/assignments/nipc-problem-types#sdf-model-in-\
                                                               use" /
  "https://www.iana.org/assignments/nipc-problem-types#unsupported-\
                                                        uri-scheme" /
  "https://www.iana.org/assignments/nipc-problem-types#property-not-\
                                                          readable" /
  "https://www.iana.org/assignments/nipc-problem-types#property-read\
                                                           -failed" /
  "https://www.iana.org/assignments/nipc-problem-types#property-not-\
                                                          writable" /
  "https://www.iana.org/assignments/nipc-problem-types#property-\
                                                      write-failed" /
  "https://www.iana.org/assignments/nipc-problem-types#event-already\
                                                          -enabled" /
  "https://www.iana.org/assignments/nipc-problem-types#event-not-\
                                                           enabled" /
  "https://www.iana.org/assignments/nipc-problem-types#event-not-\
                                                        registered" /
  "https://www.iana.org/assignments/nipc-problem-types#trigger-\
                                                   already-enabled" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-\
                                             ble-already-connected" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-\
                                                 ble-no-connection" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-\
                                            ble-connection-timeout" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-\
                                                ble-bonding-failed" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-\
                                             ble-connection-failed" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-\
                                      ble-service-discovery-failed" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-\
                             ble-invalid-service-or-characteristic" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-\
                                         zigbee-connection-timeout" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-\
                                zigbee-invalid-endpoint-or-cluster" /
  "https://www.iana.org/assignments/nipc-problem-types#extension-\
                                             transmit-invalid-data" /
  "https://www.iana.org/assignments/nipc-problem-types#extension-\
                                                 firmware-rollback" /
  "https://www.iana.org/assignments/nipc-problem-types#extension-\
                                            firmware-update-failed" /
  "about:blank"
)
; ============================================
; From: cddl/api/group_event_status_response_array.cddl
; ============================================
GroupEventStatusResponseArray = [* GroupEventStatusResponse]

GroupEventSuccessResponse = { event: text, deviceId: text }

; Each item is either an event+deviceId success or a \
                                                 GroupFailureResponse
GroupEventStatusResponse = (GroupEventSuccessResponse // \
                                                GroupFailureResponse)

GroupFailureResponse = {
  FailureResponse,
  ? deviceId: text
}

; ============================================
; From: cddl/api/group_trigger_status_array.cddl
; ============================================
; Group Trigger status response array and item shape

GroupTriggerStatusResponseArray = [* GroupTriggerResponse]

GroupTriggerResponse = (GroupTriggerSuccessResponse // \
                                         GroupTriggerFailureResponse)

GroupTriggerSuccessResponse = {
  eventName: text,      ; SDF event name
  action: text,      ; NIPC action operation to execute
  deviceId: text     ; UUID (as text)
}

GroupTriggerFailureResponse = {
  FailureResponse,
  ? deviceId: text
}

; ============================================
; From: cddl/api/trigger_status_array.cddl
; ============================================
; Trigger status response array and item shape

TriggerStatusResponseArray = [* TriggerResponse]

TriggerResponse = {
  eventName: text,      ; SDF event name
  action: text,      ; NIPC action operation to execute
  instanceId: text     ; UUID (as text)
}

; ============================================
; From: cddl/api/property_value_array.cddl
; ============================================
PropertyValueArray = [* PropertyValue]

; Minimal PropertyValue shape (matches allOf of Property + Value)
PropertyValue = {
  property: text,        ; SDF global name of the property
  value: b64text         ; base64-encoded bytes (RFC 4648 Section 5)
}

; Helper type for base64-with-padding encoded text
b64text = text
; ============================================
; From: cddl/api/property_value_read_response_array.cddl
; ============================================
PropertyValueReadResponseArray = [* \
                                  PropertyValueReadResponseArrayItem]

PropertyValueReadResponseArrayItem = ( PropertyValue // \
                                                    FailureResponse )

; ============================================
; From: cddl/api/property_value_response_array.cddl
; ============================================
PropertyValueResponseArray = [* PropertyValueResponseArrayItem]

PropertyValueResponseArrayItem = ( SuccessResponse // \
                                                    FailureResponse )

; Minimal success shape (may be extended)
SuccessResponse = {
  status: uint
}

; ============================================
; From: cddl/api/sdf_reference.cddl
; ============================================
SdfGlobalName = text    ; absolute URI with fragment referencing an \
                                                sdfThing or sdfObject

SdfReference = {
  sdfName: SdfGlobalName
}

SdfReferenceArray = [* SdfReference]
; ============================================
; From: cddl/api/connection.cddl
; ============================================
ConnectionRequest = {
  ? retries: uint,
  ? protocol-info-service-map
}

ConnectionResponse = {
  id: text,  ; Device ID
  ? protocol-info-service-map
}

; ============================================
; From: cddl/api/protocolinfo.cddl
; ============================================
; Top-level wrappers
protocol-info-service-map = (
  ? protocolInformation: ble-service-map / zigbee-service-map
)

protocol-info-broadcast = (
  ? protocolInformation: ble-broadcast / zigbee-broadcast
)

; BLE protocol information
ble-service-map = {
  ble: {
    ? services: [* ble-service],
    ? cached: bool,
    ? cacheExpiryDuration: int,
    ? autoUpdate: bool,
    ? bonding: bonding-type,
  }
}

bonding-type = "default" / "none" / "justworks" / "passkey" / "oob"

ble-service = {
  serviceID: uuid,
  ? characteristics: [* ble-characteristic],
}

ble-characteristic = {
  characteristicID: uuid,
  ? flags: [* ble-flag],
  ? descriptors: [* ble-descriptor],
}

ble-flag = "read" / "write" / "notify" / "indicate" / "write-no-\
                                                            response"

ble-descriptor = {
  descriptorID: uuid,
}

ble-broadcast = {
  ble: {
    ? connectable: bool,
  },
}

; Zigbee protocol information
zigbee-service-map = {
  zigbee: {
    ? endpoints: [* zigbee-endpoint],
  },
}

zigbee-endpoint = {
  endpointID: uint,
  ? clusters: [* zigbee-cluster],
}

zigbee-cluster = {
  clusterID: uint,
  ? properties: [* zigbee-property],
}

zigbee-property = {
  attributeID: uint,
  propertyType: uint,
}

zigbee-broadcast = {
  zigbee: {
  },
}

; Basic types
uuid = tstr .regexp "(?i)^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-\
                                                 f]{4}-[0-9a-f]{12}$"

]]></sourcecode></figure>

</section>
<section anchor="thermometer-sdf"><name>Example SDF model with protocol mappings for BLE</name>

<figure title="Example SDF model with protocol mappings for BLE"><sourcecode type="json" markers="true" name="thermometer.sdf.json"><![CDATA[
{
  "namespace": {
    "thermometer": "https://example.com/thermometer"
  },
  "defaultNamespace": "thermometer",
  "sdfThing": {
    "thermometer": {
      "sdfObject": {
        "health_thermometer": {
          "description": "Health Thermometer",
          "sdfProperty": {
            "temperature_type": {
              "description": "Temperature Type",
              "observable": false,
              "writable": false,
              "readable": true,
              "sdfProtocolMap": {
                "ble": {
                  "serviceID": "1809",
                  "characteristicID": "2A1D"
                }
              }
            },
            "measurement_interval": {
              "description": "Measurement Interval",
              "observable": false,
              "writable": false,
              "readable": true,
              "sdfProtocolMap": {
                "ble": {
                  "serviceID": "1809",
                  "characteristicID": "2A21"
                }
              }
            }
          },
          "sdfEvent": {
            "temperature_measurement": {
              "description": "Temperature Measurement",
              "sdfProtocolMap": {
                "ble": {
                  "type": "gatt",
                  "serviceID": "1809",
                  "characteristicID": "2A1C"
                }
              }
            },
            "intermediate_temperature": {
              "description": "Intermediate Temperature",
              "sdfProtocolMap": {
                "ble": {
                  "type": "gatt",
                  "serviceID": "1809",
                  "characteristicID": "2A1E"
                }
              }
            }
          }
        }
      },
      "description": "Generic Access, Device Information",
      "sdfProperty": {
        "device_name": {
          "description": "Device Name",
          "observable": false,
          "writable": true,
          "readable": true,
          "sdfProtocolMap": {
            "ble": {
              "serviceID": "1800",
              "characteristicID": "2A00"
            }
          }
        },
        "appearance": {
          "description": "Appearance",
          "observable": false,
          "writable": false,
          "readable": true,
          "sdfProtocolMap": {
            "ble": {
              "serviceID": "1800",
              "characteristicID": "2A01"
            }
          }
        },
        "manufacturer_name_string": {
          "description": "Manufacturer Name String",
          "observable": false,
          "writable": false,
          "readable": true,
          "sdfProtocolMap": {
            "ble": {
              "serviceID": "180A",
              "characteristicID": "2A29"
            }
          }
        },
        "model_number_string": {
          "description": "Model Number String",
          "observable": false,
          "writable": false,
          "readable": true,
          "sdfProtocolMap": {
            "ble": {
              "serviceID": "180A",
              "characteristicID": "2A24"
            }
          }
        },
        "hardware_revision_string": {
          "description": "Hardware Revision String",
          "observable": false,
          "writable": false,
          "readable": true,
          "sdfProtocolMap": {
            "ble": {
              "serviceID": "180A",
              "characteristicID": "2A27"
            }
          }
        },
        "firmware_revision_string": {
          "description": "Firmware Revision String",
          "observable": false,
          "writable": false,
          "readable": true,
          "sdfProtocolMap": {
            "ble": {
              "serviceID": "180A",
              "characteristicID": "2A26"
            }
          }
        },
        "system_id": {
          "description": "System ID",
          "observable": false,
          "writable": false,
          "readable": true,
          "sdfProtocolMap": {
            "ble": {
              "serviceID": "180A",
              "characteristicID": "2A23"
            }
          }
        }
      },
      "sdfEvent": {
        "isPresent": {
          "description": "BLE advertisements",
          "sdfProtocolMap": {
            "ble": {
              "type": "advertisements"
            }
          }
        },
        "isConnected": {
          "description": "BLE connection events",
          "sdfProtocolMap": {
            "ble": {
              "type": "connection_events"
            }
          }
        }
      }
    }
  }
}
]]></sourcecode></figure>

</section>
<section anchor="acknowledgements"><name>Acknowledgements</name>

<t>This document relies on SDF models described in <xref target="RFC9880"/>, as such, we are grateful to the authors of this
document for putting their time and effort into defining SDF in depth, allowing us to make use of it. The authors would also like to thank the ASDF working group for their excellent feedback and steering of the document.</t>

</section>


  </back>

<!-- ##markdown-source:
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
VdKIz2dOBA+CdZYl5+ecXlkLl4pOiVO2N5tszSIyZQSKT+Pg+7HhyqXn2958
RvkPMUg4CiXz0GxtMwDjO4C/cSTY3KBT/xxi7jzGp546sp4nyi1conNZmms0
DKtzeQkt3GQMCBXhafHICIUFnk5LepjMgGeE4kKQtXMNkNByRdRISK5z6pPH
MYt4RDAg6XA2vvcV136AKebIyFopcRc5CaZoWVI2qAoCrwhlcVMvPs0CBC+4
p3iD+2QbRtFrVmLtE0wpRYblOUoeq5tk+8n2LirGL52wdGUOKITIMrfnGWMM
yXKRTOqM8SLlGtwEawYP+VQUAcJyWSsKaYwQQNfVCG2nptSKIFXDFXQyu7lY
pX1TAfd6jBwBXUZNcarylsAfsHFAT3FCeO9sbAga4gwreihcwJGLaR6s4qxr
uLjOxnbwKtWt4Ct3ST524CNaVHeQ8DGgPzmAlprlqo6kX4WZzaJYc5KFYPGU
w1qYpQ2T84uiNx32OIOV105VVvpiwnDcuq6/s9ERIlJCCIMXqejfF7CjgByV
gnoqZCg1/tuNAzmOkxRU6+LCcR5jtBTAJxUtFJusYB+/+unkzevv3hydnjaD
g9cvT14cnR0drrX1EAW9NEq0dokkbRDR4473wwx9gArJhBJKAHZfQylrQHWC
WaBJ+wXdf7P6vSZ7xzy80TgqxWaqKKAECZEFwk1LImH2LvKDuIk2FMQySDLo
kMUWuBFhzlUKJnxEYNAjc4E+NlPqlm4GBxknFy+4ozyA3dBDKzF19GkuHljr
H7bRMMztdHrvhKTmBAar7BuRs8/okkO1EZzKQwIxn0N1EDPdgKQsdBASWLBL
vDEm24hNejLohJEQO5gTJ6tMEKiHIjvcAFshApGK6OoxYuuTyl8reyuOF3Jm
h4agmh4MXBRD73QxaLt2di2kY7P8PAINjRqQUGbZ2NIh5UEyk16lWTHG3fIc
jJadDiPDjlZ5UrB2jNjggYAWeAOt/VbDwvR6eg0tQaEaAUR/wWpvMKE3gsmc
ooHMVLBOOhUs9RUz9zg0OoRzbOJhXBr/1zw2CkPduSHCpjA5IOsfKH2w4oqr
4ZZNlwciH+Y6aDWRdLOvGYM3Ri8amKPipaPSTnpLAaKDXc2fBgM1WPHVZBwB
24ymJkCmpG0zqy2btQAWBv8QysRPAMKEsscRKQe1yZZUQtN3t4D1nNrSNCbe
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
kMGVm6egqQAFVagxCC6pSM7RkjQoMxj68YxyTfHISvol6SF76r8dOgWmdRTQ
hvhGUUOl/dtFDHqXsRDKau0teup/U39661wisUnXtaWyWkZCzdOhdU3z4lZ5
9LxStctWrmIurLW09s1zM2qI0eucIzY/yYC2Wt9X5SnHo/3WgPvWNUBsAoIj
o30bqLZqt+1QLbOZ/tQyYqk59acJ131VYVqmymuep/3ERiQ4LENSQj9xQG+l
G3cQ1FbuVDBwFWiefFWbwfmVqe1nUkv7TklLj4tVy97PZGDs/zVJDiWBmURO
sUJapZTtMuVDSrmINWqRqEM8hoZZPWWIFF4jNNBpwbDd3e8nYmZmsRDD1vCM
csm9sgbEQ6AG9DDs/O+39v++8xz+z2Hq8Mlh63/f2YIvDGuHv5G581eMR/gb
CbOiiZX8MRwNY/QZXyUrL32Z8h2fIh5d4fnVI9KVp985Jh23+aHi0stYuUNk
ujK6UjXY+bKuNkDdSrt5sT+2761VbuXN+/P9BexCQ+93C/QxwjfM7QIeKiad
cLNsSHoFjXojWtm1qoW/0JbpJewtE+VSHseY+wZViDv+9rocwh09gLD34tTH
gYYSY9Yd5TXeO26d0/LHaV06vSZSqSrsFn7V0yqyUqV3hjwXpo88qrk1Il6H
nR8TL3eq0ohTVA1eqwTLi9CroM6Ndq+Nk6/sP+Vxmk7b4g9l2+GH+hMjfKtd
0tHcqR3Il9PUGsZN7A9oFBrfMeSrN1Vwk1wzZ2O/QsFT43Io+StkqxDNdIFL
JXuMTT/zLll+d66QS9+4wfCvbIMPvknlcHjGEio1Jf3JPHWrElUf4v6AMe6C
2F83yv3eDWplnC9a7VvsKs6wqXkXceahxWPu683lpaLtH9Jurkuu/1IsaMdF
9dkN6PtkHLgM2sH3Hexp4130Exc+t739m7X9X87aFn7x5XDdRYxtAvo3i/sz
W9z/xaztJRNuPovZ/YCRsv9zDPBlgqEfxhKvXl5+KpP8TknkX6JxXl7Ir2im
O6pUyVbHzkcm1tU1bm0Pktlm+hLWtgPBqtydZdot5osywh8o1PspRyIvadHT
O7eZ9e5D5fDwqoG/6o15rxBrd6QZIdYz5vlMfoZS2PsML0Njzjo+X0z4Azot
vMDjZRPz7+W0sAHR+NR/IxeGq07P92Mwl1/am8HkXNd+ZxSOw3MunufWXbRP
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
xF4lU1RZSAaGdPlBMxJDEsN3s/NET+/LOAI+QPVKPb/SzSOqLjHCn6WihCxK
9U5TJ4GvEFdqgwJWAhqB6yuQEB/BRofnNn3dOvO8yqruRFThw++f6VbQwRAw
DBjEKTArxYtPwAZ/vcL+5IQrvBHHijNsl3qsNxqm7Er1pyOcmG9x3B3vBjN+
IC2I7bE+uhRSsRHkytSUySthsIw8VOPrOXyXlAwc4OZmlrPtoyFFlaWKXCrZ
XOqjUB6fFy4VnbCYqXvb2w08qmh6m+o/ioq1qx8SHze3S3ateFnhPGZkHyLX
9/2iS1usYNskAqZ5DlyDSMfW35mxqn3r7XEYHhjjmFsDnJdtZGDMWNEVSMGJ
PmVQeZhW8DI8xwoLdHxX8zX7w/PELWrt/fQy7KPFB2rngMqWU1EZIGvnoRMg
Pdi2fwjiUZgM0TmVCafss6+W4FEz2V/CsV7TkrjqBi+OXx6fHR0G358ekV+1
yJK+MdPkmTNqf0MVpHBg515t9gHFfSV2BXMesN+kz+6DYZx16TK5vnWDV8Qe
4EVGmhivru/2IG1cWN81dTWA31cModlxVyR42GOTkxTo6drunRkI/j71ghcM
VyjxSmfIa77vVrvVenhMjndOBGSrr33/5tj7TDmZLbf+M3zCm0JAhsQWixKm
IcteV2Oqv4UPabcAubgmlwP1u0HPDJ4DA1oJ9zV9qZ0N5UrWLvTBLf8+lBZn
vl6qxDW+8JIWpr0BaKAly1zPLHS95CgzXsCifU7DCG6nRx0TZi/qmTbZ8L8+
QEXPaxz0FRepKncL0heq1fSDWnBsQuk6cZbSvMSSOMXeAvVBsl1DZkakLxjY
bPbrxNaJvQs4vWHaq2CHas+VALLgcGm6gN6cA9WdwKFi9W6/pA+cCe5+hRB9
qCSIT0GuDLnbPD+JrASUakAeF/NeFBoO3/SAcI8Vqf4lcD5oMHCoeaQPBo2p
n1klYrdkZs3X3GGFb7Dcug6VcWpBQfnwQzwctjgADViOERBX5utZMiJzw/gt
O77yxjPt4mmafzLTrFi2HnpNvEUAPNl8/PEjcUQc5BSdlO/x7LKgOzCCDmui
e5LkUPVXd/U+K6tjMItwKdw61GQNTilgq7xfvl725x9XH2Fzm7zFrfaGa4h2
FGslPBm5n3C7iSBYb9tHSLen7ULfvl9F7YxK1sm2zSpMd3c5P2NCFviuUKc2
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

-->

</rfc>

