<?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;">

<!ENTITY RFC7644 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7644.xml">
<!ENTITY I-D.ietf-scim-device-model SYSTEM "https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-scim-device-model.xml">
<!ENTITY RFC9880 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9880.xml">
<!ENTITY RFC8259 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8259.xml">
<!ENTITY RFC8949 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8949.xml">
<!ENTITY RFC2119 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC8174 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC7643 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7643.xml">
<!ENTITY I-D.ietf-asdf-sdf-protocol-mapping SYSTEM "https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-asdf-sdf-protocol-mapping.xml">
<!ENTITY RFC9110 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9110.xml">
<!ENTITY RFC9457 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9457.xml">
<!ENTITY RFC4648 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4648.xml">
<!ENTITY RFC3986 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3986.xml">
<!ENTITY RFC6570 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6570.xml">
<!ENTITY RFC9562 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9562.xml">
<!ENTITY RFC7468 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7468.xml">
<!ENTITY RFC8610 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8610.xml">
<!ENTITY RFC5246 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5246.xml">
<!ENTITY RFC8446 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8446.xml">
<!ENTITY RFC6125 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6125.xml">
<!ENTITY RFC7525 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7525.xml">
<!ENTITY RFC7230 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7230.xml">
<!ENTITY RFC6749 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6749.xml">
<!ENTITY RFC7521 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7521.xml">
<!ENTITY RFC6750 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6750.xml">
<!ENTITY RFC6819 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6819.xml">
<!ENTITY RFC6265 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6265.xml">
<!ENTITY RFC8126 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8126.xml">
<!ENTITY RFC8615 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8615.xml">
<!ENTITY RFC7252 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7252.xml">
<!ENTITY RFC7942 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7942.xml">
]>


<rfc ipr="trust200902" docName="draft-ietf-asdf-nipc-17" 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="February" day="18"/>

    
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 66?>

<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 70?>

<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="144" width="688" viewBox="0 0 688 144" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
<path d="M 8,48 L 8,96" fill="none" stroke="black"/>
<path d="M 120,48 L 120,96" fill="none" stroke="black"/>
<path d="M 240,48 L 240,96" fill="none" stroke="black"/>
<path d="M 320,48 L 320,96" fill="none" stroke="black"/>
<path d="M 440,48 L 440,96" fill="none" stroke="black"/>
<path d="M 512,48 L 512,96" fill="none" stroke="black"/>
<path d="M 8,48 L 120,48" fill="none" stroke="black"/>
<path d="M 240,48 L 320,48" fill="none" stroke="black"/>
<path d="M 440,48 L 512,48" fill="none" stroke="black"/>
<path d="M 128,64 L 232,64" fill="none" stroke="black"/>
<path d="M 328,64 L 432,64" fill="none" stroke="black"/>
<path d="M 8,96 L 120,96" fill="none" stroke="black"/>
<path d="M 240,96 L 320,96" fill="none" stroke="black"/>
<path d="M 440,96 L 512,96" fill="none" stroke="black"/>
<polygon class="arrowhead" points="440,64 428,58.4 428,69.6" fill="black" transform="rotate(0,432,64)"/>
<polygon class="arrowhead" points="336,64 324,58.4 324,69.6" fill="black" transform="rotate(180,328,64)"/>
<polygon class="arrowhead" points="240,64 228,58.4 228,69.6" fill="black" transform="rotate(0,232,64)"/>
<polygon class="arrowhead" points="136,64 124,58.4 124,69.6" fill="black" transform="rotate(180,128,64)"/>
<g class="text">
<text x="64" y="68">Application</text>
<text x="280" y="68">Gateway</text>
<text x="476" y="68">Device</text>
<text x="176" y="84">Application</text>
<text x="380" y="84">Device</text>
<text x="176" y="100">network</text>
<text x="384" y="100">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="432" viewBox="0 0 432 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<br />
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",
    "/extensions/{id}/properties/write"
  ]
}
]]></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.</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-u\
rl" /
  "https://www.iana.org/assignments/nipc-problem-types#extension-ope\
ration-not-executed" /
  "https://www.iana.org/assignments/nipc-problem-types#sdf-model-alr\
eady-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-writ\
e-failed" /
  "https://www.iana.org/assignments/nipc-problem-types#event-already\
-enabled" /
  "https://www.iana.org/assignments/nipc-problem-types#event-not-ena\
bled" /
  "https://www.iana.org/assignments/nipc-problem-types#event-not-reg\
istered" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-b\
le-already-connected" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-b\
le-no-connection" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-b\
le-connection-timeout" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-b\
le-bonding-failed" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-b\
le-connection-failed" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-b\
le-service-discovery-failed" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-b\
le-invalid-service-or-characteristic" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-z\
igbee-connection-timeout" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-z\
igbee-invalid-endpoint-or-cluster" /
  "https://www.iana.org/assignments/nipc-problem-types#extension-tra\
nsmit-invalid-data" /
  "https://www.iana.org/assignments/nipc-problem-types#extension-fir\
mware-rollback" /
  "https://www.iana.org/assignments/nipc-problem-types#extension-fir\
mware-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#inval\
\id-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.</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.</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>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>
</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>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>
</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/healthsenso\
r/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/healthsenso\
r/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 identical to the request body for the register data application API <xref target="register-data-app"/>.</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 // FailureRespons\
e )

; 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#inv\
alid-property",
    "status": 400,
    "title": "Invalid Property",
    "detail": "Property https://example.com/heartrate#/sdfObject/the\
rmostat/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 = [* PropertyValueReadResponseArrayIt\
em]

PropertyValueReadResponseArrayItem = ( PropertyValue // FailureRespo\
nse )
]]></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?insta\
nceId=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 // FailureResp\
onse )

; Success item = { event, instanceId }
EventInstanceSuccess = {
  event: text,        ; SDF global name of the event (absolute URI w\
ith 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?instan\
ceId=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 GroupFailureRes\
ponse
GroupEventStatusResponse = (GroupEventSuccessResponse // GroupFailur\
eResponse)

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#eve\
nt-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 GroupFailureRes\
ponse
GroupEventStatusResponse = (GroupEventSuccessResponse // GroupFailur\
eResponse)

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#eve\
nt-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>
<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. 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?inst\
anceId=02ee282c-8915-4b2e-bbd2-88966773134a
]]></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: "/devices/3171ec43-42a5-4415-ab4b-afd0dfbe9615/actions?actionName=https://example.com/AlarmSystem#/sdfObject/bell/sdfAction/ring"</t>

<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{?sdfName}</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.</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>sdfName: the sdfName of the affordance that is associated with the trigger. This must be an event. The sdfName 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?a\
ctionName=https%3A%2F%2Fexample.com%2FAlarmSystem%23%2FsdfObject%2Fb\
ell%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?ins\
tanceId=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>sdfName: 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 = {
  SdfReference,
  ? 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/healthsenso\
r",
    "action": "/devices/3171ec43-42a5-4415-ab4b-afd0dfbe9615/actions\
?actionName=https%3A%2F%2Fexample.com%2FAlarmSystem%23%2FsdfObject%2\
Fbell%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{?sdfName}</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.</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>sdfName: the sdfName of the affordance that is associated with the trigger. This must be an event. The sdfName 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?ac\
tionName=https%3A%2F%2Fexample.com%2FAlarmSystem%23%2FsdfObject%2Fbe\
ll%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?ins\
tanceId=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.
 - sdfName: 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 // GroupTriggerF\
ailureResponse)

GroupTriggerSuccessResponse = {
  SdfReference,
  ? 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",
    "sdfName": "https://example.com/heartrate#/sdfObject/healthsenso\
r",
    "action": "/devices/3171ec43-42a5-4415-ab4b-afd0dfbe9615/actions\
?actionName=https%3A%2F%2Fexample.com%2FAlarmSystem%23%2FsdfObject%2\
Fbell%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"

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,  ; UUID of the connection
  ? 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 200 OK with device ID on successful disconnect.</t>

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

<figure title="Example disconnect response" anchor="exdisconnresp"><sourcecode type="json" markers="true"><![CDATA[
{
  "id": "1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30"
}
]]></sourcecode></figure>

<t>where "id" is the ID of the device.</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>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>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 200 OK
content-type: application/nipc+json

[
  {
    "sdfName": "https://example.com/thermometer#/sdfThing/thermom\
eter"
  }
]
]]></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?prop\
ertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%2FsdfThing%2F\
thermometer%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/thermo\
meter/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/thermo\
meter/sdfProperty/device_name",
    "value": "dGVzdA=="
  }
]

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

[
  {
    "property": "https://example.com/thermometer#/sdfThing/thermo\
meter/sdfProperty/device_name",
    "value": "dGVzdA=="
  }
]
]]></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 200 OK
content-type: application/nipc+json

[
  {
    "sdfName": "https://example.com/thermometer#/sdfThing/thermom\
eter"
  }
]
]]></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": [
    "https://example.com/thermometer#/sdfThing/thermometer/sdfEve\
nt/isPresent"
  ],
  "mqttClient": true
}

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

{
  "events": [
    "https://example.com/thermometer#/sdfThing/thermometer/sdfEve\
nt/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?eventNa\
me=https%3A%2F%2Fexample.com%2Fthermometer%23%2FsdfThing%2Fthermo\
meter%2FsdfEvent%2FisPresent
Host: localhost
Content-Length: 0

HTTP/1.1 201 Created
Location: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/events?in\
stanceId=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?instance\
Id=02ee282c-8915-4b2e-bbd2-88966773134a
Host: localhost

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

{
  "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 200 OK
content-type: application/nipc+json

[
  {
    "sdfName": "https://example.com/thermometer#/sdfThing/thermom\
eter"
  }
]
]]></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": [
    "https://example.com/thermometer#/sdfThing/thermometer/sdfEve\
nt/isPresent"
  ],
  "mqttClient": true
}

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

{
  "events": [
    "https://example.com/thermometer#/sdfThing/thermometer/sdfEve\
nt/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?eventNa\
me=https%3A%2F%2Fexample.com%2Fthermometer%23%2FsdfThing%2Fthermo\
meter%2FsdfEvent%2FisPresent
Host: localhost
Content-Length: 0

HTTP/1.1 201 Created
Location: /groups/0dc729d7-f6c3-491d-9b9d-e7176d2be243/events?in\
stanceId=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?instance\
Id=f1b9f26b-21ce-4deb-9d57-289ba7e17cce
Host: localhost

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

[
  {
    "event": "https://example.com/heartrate#/sdfObject/healthsen\
sor/sdfEvent/fallDetected",
    "deviceId": "1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30"
  },
  {
    "event": "https://example.com/heartrate#/sdfObject/healthsen\
sor/sdfEvent/fallDetected",
    "deviceId": "d62c7fb2-a216-4811-a388-053b17fdbedc"
  },
  {
    "event": "https://example.com/heartrate#/sdfObject/healthsen\
sor/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-e\
3c1-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-17</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-17</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 Section 3.2 of <xref 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 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 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 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>Registrations MUST use the prefix <eref target="&quot;https://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#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">

&RFC7644;
&I-D.ietf-scim-device-model;
&RFC9880;
&RFC8259;
&RFC8949;
&RFC2119;
&RFC8174;
&RFC7643;
&I-D.ietf-asdf-sdf-protocol-mapping;
&RFC9110;
&RFC9457;
&RFC4648;
&RFC3986;
&RFC6570;
&RFC9562;
&RFC7468;
&RFC8610;
&RFC5246;
&RFC8446;
&RFC6125;
&RFC7525;
&RFC7230;
&RFC6749;
&RFC7521;
&RFC6750;
&RFC6819;
&RFC6265;
&RFC8126;
&RFC8615;


    </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>
&RFC7252;
&RFC7942;


    </references>

</references>


<?line 3002?>

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

<t>The following non-normative model is provided for convenience of the implementor.</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-1\
\2/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.17.0
externalDocs:
  description: NIPC IETF draft
  url: https://datatracker.ietf.org/doc/draft-ietf-asdf-nipc/
servers:
  - url: "{gw_host}/nipc/draft-17"
    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/thermos\
\tat/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/PropertyValueRespons\
\eArray'
        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/therm\
\ostat/sdfProperty/temperature"
      responses:
        '200':
          description: Success
          content:
            application/nipc+json:
              schema:
                allOf: 
                  - $ref: '#/components/schemas/Id'
                  - $ref: '#/components/schemas/PropertyValueReadRes\
\ponseArray'
            "*/*":
              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/healths\
\ensor/sdfEvent/fallDetected"
      responses:
        '201':
          description: Success
          headers:
            Location:
              description: Location of the created event
              schema:
                type: string
                format: uri
                example: "/devices/{id}/events?instanceId={instanceI\
\d}"
        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 disab\
\led
        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 devi\
\ce
      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/healths\
\ensor/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 disab\
\led
        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/GroupEventStatusResponse\
\Array'
        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 devi\
\ces.
      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/GroupEventStatusResponse\
\Array'
        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/healths\
\ensor/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={instance\
\Id}"
        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/healths\
\ensor/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={instanceI\
\d}"
        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/GroupActionStatusRespons\
\eArray'
        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 devic\
\es
      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/healths\
\ensor/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={instanc\
\eId}"
        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/TriggerStatusResponseArr\
\ay'
        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/healths\
\ensor/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 execu\
\ted 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={instance\
\Id}"
        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/GroupTriggerStatusRespon\
\seArray'
        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/GroupTriggerStatusRespon\
\seArray'
        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#/component\
\s/schemas/ProtocolInfo-ServiceMap'
            example:
              retries: 3
              protocolInformation:
                ble:
                  services:
                    - serviceID: "00001809-0000-1000-8000-00805f9b34\
\fb"
                  cached: true
                  cacheExpiryDuration: 3600
        required: false
      responses:
        '200':
          description: Success
          content:
            application/nipc+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/Id'
                  - $ref: './protocolinfo/ProtocolInfo.yaml#/compone\
\nts/schemas/ProtocolInfo-ServiceMap'
              example:
                id: "1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30"
                protocolInformation:
                  ble:
                    services:
                      - serviceID: "00001809-0000-1000-8000-00805f9b\
\34fb"
                        characteristics:
                          - characteristicID: "00002a19-0000-1000-80\
\00-00805f9b34fb"
                            flags: ["read", "notify"]
                            descriptors:
                              - descriptorID: "00002902-0000-1000-80\
\00-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/sc\
\hemas/ProtocolInfo-ServiceMap'
            example:
              retries: 3
              protocolInformation:
                ble:
                  services:
                    - serviceID: "00001809-0000-1000-8000-00805f9b34\
\fb"
                  cached: true
                  cacheExpiryDuration: 3600
        required: false
      responses:
        '200':
          description: Success
          content:
            application/nipc+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/Id'
                  - $ref: './protocolinfo/ProtocolInfo.yaml#/compone\
\nts/schemas/ProtocolInfo-ServiceMap'
              example:
                id: "1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30"
                protocolInformation:
                  ble:
                    services:
                      - serviceID: "00001809-0000-1000-8000-00805f9b\
\34fb"
                        characteristics:
                          - characteristicID: "00002a19-0000-1000-80\
\00-00805f9b34fb"
                            flags: ["read", "notify"]
                            descriptors:
                              - descriptorID: "00002902-0000-1000-80\
\00-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#/compone\
\nts/schemas/ProtocolInfo-ServiceMap'
              example:
                id: "1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30"
                protocolInformation:
                  ble:
                    services:
                      - serviceID: "00001809-0000-1000-8000-00805f9b\
\34fb"
                        characteristics:
                          - characteristicID: "00002a19-0000-1000-80\
\00-00805f9b34fb"
                            flags: ["read", "notify"]
                            descriptors:
                              - descriptorID: "00002902-0000-1000-80\
\00-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/healt\
\hsensor"
      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/healt\
\hsensor"
      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/healt\
\hsensor"
      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 dev\
\ice 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/thermos\
\tat/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/healthse\
\nsor/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/act\
\ions?actionName=https%3A%2F%2Fexample.com%2FAlarmSystem%23%2FsdfObj\
\ect%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/healths\
\ensor"
    
    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:
                  sdfOutputData:
                    sdfProtocolMap:
                      ble:
                        type: advertisement
              sdfObject:
                healthsensor:
                  sdfProperty:
                    heartrate:
                      sdfProtocolMap:
                        ble:
                          serviceID: 00001809-0000-1000-8000-00805f9\
\b34fb
                          characteristicID: 00002a1c-0000-1000-8000-\
\00805f9b34fb
                  sdfEvent:
                    fallDetected:
                      sdfOutputData:
                        sdfProtocolMap:
                          ble:
                            serviceID: 00001809-0000-1000-8000-00805\
\f9b34fb
                            characteristicID: 00002a1c-0000-1000-800\
\0-00805f9b34fb
                  sdfAction:
                    start:
                      sdfProtocolMap:
                        ble:
                          serviceID: 00001809-0000-1000-8000-00805f9\
\b34fb
                          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-0080\
\5f9b34fb
              sdfEvent:
                fallDetected:
                  sdfOutputData:
                    sdfProtocolMap:
                      ble:
                        type: advertisements
              sdfAction:
                start:
                  sdfProtocolMap:
                    ble:
                      serviceID: 00001809-0000-1000-8000-00805f9b34fb
                      characteristicID: 00002a1c-0000-1000-8000-0080\
\5f9b34fb

    SdfProperty:
      type: object
      description: Sample SDF property
      properties:
        sdfProperty:
          additionalProperties: 
            allOf:
              - $ref: './protocolmaps/ProtocolMap.yaml#/components/s\
\chemas/ProtocolMap'
          example:
            heartrate:
              sdfProtocolMap:
                ble:
                  serviceID: 00001809-0000-1000-8000-00805f9b34fb
                  characteristicID: 00002a1c-0000-1000-8000-00805f9b\
\34fb
          
    SdfEvent:
      type: object
      description: Sample SDF property
      properties:
        sdfEvent:
          additionalProperties: #example, this will be the registere\
\d event
            type: object
            properties:
              sdfOutputData:
                allOf:
                  - $ref: './protocolmaps/ProtocolMap.yaml#/componen\
\ts/schemas/ProtocolMap'
          example:
            fallDetected:
              sdfOutputData:
                sdfProtocolMap:
                  ble:
                    serviceID: 00001809-0000-1000-8000-00805f9b34fb
                    characteristicID: 00002a1c-0000-1000-8000-00805f\
\9b34fb
    
    SdfAction:
      type: object
      description: Sample SDF property
      properties:
        sdfAction:
          additionalProperties: 
            allOf:
              - $ref: './protocolmaps/ProtocolMap.yaml#/components/s\
\chemas/ProtocolMap'
          example:
            start:
              sdfProtocolMap:
                ble:
                  serviceID: 00001809-0000-1000-8000-00805f9b34fb
                  characteristicID: 00002a1c-0000-1000-8000-00805f9b\
\34fb

# 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#in\
\valid-id
            - https://www.iana.org/assignments/nipc-problem-types#in\
\valid-sdf-url
            - https://www.iana.org/assignments/nipc-problem-types#ex\
\tension-operation-not-executed
            - https://www.iana.org/assignments/nipc-problem-types#sd\
\f-model-already-registered
            - https://www.iana.org/assignments/nipc-problem-types#sd\
\f-model-in-use
            - https://www.iana.org/assignments/nipc-problem-types#pr\
\operty-not-readable
            - https://www.iana.org/assignments/nipc-problem-types#pr\
\operty-read-failed
            - https://www.iana.org/assignments/nipc-problem-types#pr\
\operty-not-writable
            - https://www.iana.org/assignments/nipc-problem-types#pr\
\operty-write-failed
            - https://www.iana.org/assignments/nipc-problem-types#ev\
\ent-already-enabled
            - https://www.iana.org/assignments/nipc-problem-types#ev\
\ent-not-enabled
            - https://www.iana.org/assignments/nipc-problem-types#ev\
\ent-not-registered
            - https://www.iana.org/assignments/nipc-problem-types#pr\
\otocolmap-ble-already-connected
            - https://www.iana.org/assignments/nipc-problem-types#pr\
\otocolmap-ble-no-connection
            - https://www.iana.org/assignments/nipc-problem-types#pr\
\otocolmap-ble-connection-timeout
            - https://www.iana.org/assignments/nipc-problem-types#pr\
\otocolmap-ble-bonding-failed
            - https://www.iana.org/assignments/nipc-problem-types#pr\
\otocolmap-ble-connection-failed
            - https://www.iana.org/assignments/nipc-problem-types#pr\
\otocolmap-ble-service-discovery-failed
            - https://www.iana.org/assignments/nipc-problem-types#pr\
\otocolmap-ble-invalid-service-or-characteristic
            - https://www.iana.org/assignments/nipc-problem-types#pr\
\otocolmap-zigbee-connection-timeout
            - https://www.iana.org/assignments/nipc-problem-types#pr\
\otocolmap-zigbee-invalid-endpoint-or-cluster
            - https://www.iana.org/assignments/nipc-problem-types#ex\
\tension-transmit-invalid-data
            - https://www.iana.org/assignments/nipc-problem-types#ex\
\tension-firmware-rollback
            - https://www.iana.org/assignments/nipc-problem-types#ex\
\tension-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/PropertyValueReadResponseArr\
\ayItem'

## 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 pr\
otocol 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/Pro\
tocolInfo-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/Pro\
tocolInfo-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-Ser\
vice'
            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 devi\
ce 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-Characteris\
tic'

    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
        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-Endp\
oint'

    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-1\
2/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.17.0
externalDocs:
  description: NIPC IETF draft
  url: https://datatracker.ietf.org/doc/draft-ietf-asdf-nipc/
servers:
  - url: "{gw_host}/nipc/draft-17"
    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/thermos\
tat/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/FailureRespo\
nse' 

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-1\
2/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.17.0
externalDocs:
  description: NIPC IETF draft
  url: https://datatracker.ietf.org/doc/draft-ietf-asdf-nipc/
servers:
  - url: "{gw_host}/nipc/draft-17"
    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-bcdbe0a\
32e30/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/FailureRespo\
nse"
      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-Bulk\
Response"
              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-BulkRespon\
se"
              examples:
                bulkResponse:
                  $ref: "#/components/examples/bulkResponse"
                firmwareUpgradeResponse:
                  $ref: "#/components/examples/firmwareUpgradeRespon\
se"
                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/schema\
s/Extension-StatusResponse"
        "303":
          description: See Other
          headers:
            Location:
              schema:
                type: string
                example: /extensions/1d3b2c36-8a65-45a6-87c1-bcdbe0a\
32e30/bulk?instanceId=02ee282c-8915-4b2e-bbd2-88966773134a
              description: URL to get the bulk response
          content:
            application/json:
              schema:
                allOf:
                  - $ref: "./Extension-Async.yaml#/components/schema\
s/Extension-StatusResponse"
              examples:
                successExample:
                  summary: Success
                  value:
                    status: COMPLETED

components:
  schemas:
    # Extensions
    ## Bulk schema Extension
    Extension-Bulk:
      allOf:
        - $ref: "./Extension-Async.yaml#/components/schemas/Extensio\
n-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, th\
e 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={propertyNam\
e}
                - /devices/{id}/actions/?actionName={actionName}
                - /extensions/{id}/properties/read/conditional?prope\
rtyName={propertyName}
                - /extensions/{id}/events/conditional?eventName={eve\
ntName}
                - /extensions/{id}/properties/file?propertyName={pro\
pertyName}
              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#/component\
s/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={propertyNam\
e}
                - /devices/{id}/actions/?actionName={actionName}
                - /extensions/{id}/properties/read/conditional?prope\
rtyName={propertyName}
                - /extensions/{id}/events/conditional?eventName={eve\
ntName}
              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/SuccessRes\
ponse"
                - $ref: "../NIPC.yaml#/components/schemas/FailureRes\
ponse"

  examples:
    bulkRequest:
      summary: Bulk request example
      value:
        operations:
          - method: GET
            path: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/prop\
erties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%2Fsdf\
Thing%2Fthermometer%2FsdfProperty%2Ftemperature
          - method: PUT
            path: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/prop\
erties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%2Fsdf\
Thing%2Fthermometer%2FsdfProperty%2Ftemperature
            data:
              value: dGVzdA==
          - method: POST
            path: /extensions/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/p\
roperties/read/conditional?propertyName=https%3A%2F%2Fexample.com%2F\
thermometer%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/prop\
erties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%2Fsdf\
Thing%2Fthermometer%2FsdfProperty%2Ftemperature
            response:
              value: dGVzdA==
          - method: PUT
            path: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/prop\
erties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%2Fsdf\
Thing%2Fthermometer%2FsdfProperty%2Ftemperature
            response:
              status: 200
          - method: POST
            path: /extensions/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/p\
roperties/read/conditional?propertyName=https%3A%2F%2Fexample.com%2F\
thermometer%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/prop\
erties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%2Fsdf\
Thing%2Fthermometer%2FsdfProperty%2Ftemperature
            response:
              type: https://www.iana.org/assignments/nipc-problem-ty\
pes#property-not-readable
              status: 400
              title: Property not readable
              detail: Property https://example.com/thermometer#/sdfT\
hing/thermometer/sdfProperty/temperature is not readable
          - method: PUT
            path: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/prop\
erties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%2Fsdf\
Thing%2Fthermometer%2FsdfProperty%2Ftemperature
            response:
              type: https://www.iana.org/assignments/nipc-problem-ty\
pes#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/p\
roperties/read/conditional?propertyName=https%3A%2F%2Fexample.com%2F\
thermometer%23%2FsdfThing%2Fthermometer%2FsdfProperty%2Ftemperature
            response:
              type: https://www.iana.org/assignments/nipc-problem-ty\
pes#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/prop\
erties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%2Fsdf\
Thing%2Fthermometer%2FsdfProperty%2FstartOTA
            data:
              value: dGVzdA==
          - method: POST
            path: /extensions/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/e\
vents/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/p\
roperties/file?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%\
23%2FsdfThing%2Fthermometer%2FsdfProperty%2Ffirmware
            data:
              fileURL: https://example.com/firmware.bin
              chunkSize: 20
              sha256Checksum: abcdef1234567890abcdef1234567890abcdef\
1234567890abcdef1234567890
          - method: PUT
            path: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/prop\
erties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%2Fsdf\
Thing%2Fthermometer%2FsdfProperty%2FfinishOTA
            data:
              value: dGVzdA==
          - method: POST
            path: /extensions/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/p\
roperties/read/conditional?propertyName=https%3A%2F%2Fexample.com%2F\
thermometer%23%2FsdfThing%2Fthermometer%2FsdfProperty%2FupdateStatus
            data:
              value: MQ==
              maxRepeat: 5
              retryTime: 1
          - method: PUT
            path: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/prop\
erties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%2Fsdf\
Thing%2Fthermometer%2FsdfProperty%2FactivateOTA
            data:
              value: dGVzdA==
    firmwareUpgradeResponse:
      summary: Firmware upgrade response example
      value:
        operations:
          - method: PUT
            path: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/prop\
erties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%2Fsdf\
Thing%2Fthermometer%2FsdfProperty%2FstartOTA
            response:
              status: 200
          - method: POST
            path: /extensions/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/e\
vents/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/p\
roperties/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/prop\
erties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%2Fsdf\
Thing%2Fthermometer%2FsdfProperty%2FfinishOTA
            response:
              status: 200
          - method: POST
            path: /extensions/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/p\
roperties/read/conditional?propertyName=https%3A%2F%2Fexample.com%2F\
thermometer%23%2FsdfThing%2Fthermometer%2FsdfProperty%2FupdateStatus
            response:
              value: MQ==
          - method: PUT
            path: /devices/1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30/prop\
erties?propertyName=https%3A%2F%2Fexample.com%2Fthermometer%23%2Fsdf\
Thing%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-1\
\2/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.17.0
externalDocs:
  description: NIPC IETF draft
  url: https://datatracker.ietf.org/doc/draft-ietf-asdf-nipc/
servers:
  - url: "{gw_host}/nipc/draft-17"
    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/thermos\
\tat/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-bcdbe0a\
\32e30/properties/file/status?propertyName=https%3A%2F%2Fexample.com\
\%2Fheartrate%23%2FsdfObject%2Fthermostat%2FsdfProperty%2Ffirmware&i\
\nstanceId=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/FailureRespo\
\nse'
      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/Fa\
\ilureResponse'
                    examples:
                      successExample:
                        summary: Success
                        value:
                          id: 02ee282c-8915-4b2e-bbd2-88966773134a
                          property: https://example.com/heartrate#/s\
\dfObject/thermostat/sdfProperty/firmware
                      failedResponse:
                        summary: Failed
                        value:
                          id: 02ee282c-8915-4b2e-bbd2-88966773134a
                          status: 400
                          type: https://www.iana.org/assignments/nip\
\c-problem-types#invalid-id
                          title: Invalid ID
                          detail: "Invalid request"
                          property: https://example.com/heartrate#/s\
\dfObject/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/thermos\
\tat/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/FailureRespo\
\nse'
  /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/thermos\
\tat/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/Ex\
\tension-StatusResponse'
        '303':
          description: See Other
          headers:
            Location:
              schema:
                type: string
                example: /extensions/1d3b2c36-8a65-45a6-87c1-bcdbe0a\
\32e30/properties/file?propertyName=https%3A%2F%2Fexample.com%2Fhear\
\trate%23%2FsdfObject%2Fthermostat%2FsdfProperty%2Ffirmware&instance\
\Id=02ee282c-8915-4b2e-bbd2-88966773134a
              description: URL to get the file write response
          content:
            application/json:
              schema:
                $ref: './Extension-Async.yaml#/components/schemas/Ex\
\tension-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-1\
2/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.17.0
externalDocs:
  description: NIPC IETF draft
  url: https://datatracker.ietf.org/doc/draft-ietf-asdf-nipc/
servers:
  - url: "{gw_host}/nipc/draft-17"
    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-bcdbe0a\
32e30/properties/read/conditional/status?propertyName=https%3A%2F%2F\
example.com%2Fheartrate%23%2FsdfObject%2Fthermostat%2FsdfProperty%2F\
temperature&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/FailureRespo\
nse'
      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/Fa\
ilureResponse'
                    examples:
                      successExample:
                        summary: Success
                        value:
                          id: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
                          property: https://example.com/heartrate#/s\
dfObject/thermostat/sdfProperty/temperature
                          value: dGVzdA==
                      failedResponse:
                        summary: Failed
                        value:
                          id: 1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30
                          status: 400
                          type: https://www.iana.org/assignments/nip\
c-problem-types#invalid-id
                          title: Invalid ID
                          detail: "Invalid request"
                          property: https://example.com/heartrate#/s\
dfObject/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/FailureR\
esponse'
  /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/Ex\
tension-StatusResponse'
        '303':
          description: See Other
          headers:
            Location:
              schema:
                type: string
                example: /extensions/1d3b2c36-8a65-45a6-87c1-bcdbe0a\
32e30/properties/read/conditional?propertyName=https%3A%2F%2Fexample\
.com%2Fheartrate%23%2FsdfObject%2Fthermostat%2FsdfProperty%2Ftempera\
ture&instanceId=02ee282c-8915-4b2e-bbd2-88966773134a
              description: URL to get the conditional read response
          content:
            application/json:
              schema:
                $ref: './Extension-Async.yaml#/components/schemas/Ex\
tension-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/Extensio\
n-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-1\
2/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.17.0
externalDocs:
  description: NIPC IETF draft
  url: https://datatracker.ietf.org/doc/draft-ietf-asdf-nipc/
servers:
  - url: "{gw_host}/nipc/draft-17"
    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-bcdbe0a\
32e30/events/conditional/status?eventName=https%3A%2F%2Fexample.com%\
2Fheartrate%23%2FsdfObject%2Fthermostat%2FsdfEvent%2Ftemperature&ins\
tanceId=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/FailureRespo\
nse'
      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/Fa\
ilureResponse'
                    examples:
                      successExample:
                        summary: Success
                        value:
                          id: 02ee282c-8915-4b2e-bbd2-88966773134a
                          event: https://example.com/heartrate#/sdfO\
bject/thermostat/sdfEvent/temperature
                          value: dGVzdA==
                      failedResponse:
                        summary: Failed
                        value:
                          id: 02ee282c-8915-4b2e-bbd2-88966773134a
                          status: 400
                          type: https://www.iana.org/assignments/nip\
c-problem-types#invalid-id
                          title: Invalid ID
                          detail: "Invalid request"
                          event: https://example.com/heartrate#/sdfO\
bject/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/FailureR\
esponse'
  /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/Ex\
tension-StatusResponse'
        '303':
          description: See Other
          headers:
            Location:
              schema:
                type: string
                example: /extensions/1d3b2c36-8a65-45a6-87c1-bcdbe0a\
32e30/events/conditional?eventName=https%3A%2F%2Fexample.com%2Fheart\
rate%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/Ex\
tension-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/Extensio\
n-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-Property.yaml"><![CDATA[
=============== NOTE: '\' line wrapping per RFC 8792 ================

# yaml-language-server: $schema=https://json-schema.org/draft/2020-1\
2/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.17.0
externalDocs:
  description: NIPC IETF draft
  url: https://datatracker.ietf.org/doc/draft-ietf-asdf-nipc/
servers:
  - url: "{gw_host}/nipc/draft-17"
    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 performe\
d 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/FailureRespo\
nse'
   
  /extensions/{id}/properties/write:
    post:
      tags:
        - NIPC API extensions
      summary: Write a value to an property using protocol mapping
      description: |-
        Write a value to an unregistered property, embedding property
        protocol mapping in the API, this does not require
        property registration. You cannot write to a group id.
      operationId: ActionPropWrite
      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:
              allOf:
                - $ref: '../NIPC.yaml#/components/schemas/Value' 
                - $ref: '../protocolmaps/ProtocolMap.yaml#/component\
s/schemas/ProtocolMap-Property'
        required: true
      responses:
        '204':
          description: Success, no content
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '../NIPC.yaml#/components/schemas/FailureRespo\
nse'
                
  /extensions/{id}/properties/read:
    post:
      tags:
        - NIPC API extensions
      summary: Read a value to an property using protocol mapping
      description: |-
        Read a value from an unregistered property, embedding 
        property protocol mapping in the API, this does not require
        property registration. You cannot read from a group id.
      operationId: ActionPropRead
      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: '../protocolmaps/ProtocolMap.yaml#/components/sc\
hemas/ProtocolMap-Property'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                allOf: 
                  - $ref: '../NIPC.yaml#/components/schemas/Value'
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                $ref: '../NIPC.yaml#/components/schemas/FailureRespo\
nse'

components:
  schemas:
    Transmit:
      allOf:
        - $ref: '../protocolinfo/ProtocolInfo.yaml#/components/schem\
as/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 // FailureResp\
onse )

; Success item = { event, instanceId }
EventInstanceSuccess = {
  event: text,        ; SDF global name of the event (absolute URI w\
ith 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-u\
rl" /
  "https://www.iana.org/assignments/nipc-problem-types#extension-ope\
ration-not-executed" /
  "https://www.iana.org/assignments/nipc-problem-types#sdf-model-alr\
eady-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-writ\
e-failed" /
  "https://www.iana.org/assignments/nipc-problem-types#event-already\
-enabled" /
  "https://www.iana.org/assignments/nipc-problem-types#event-not-ena\
bled" /
  "https://www.iana.org/assignments/nipc-problem-types#event-not-reg\
istered" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-b\
le-already-connected" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-b\
le-no-connection" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-b\
le-connection-timeout" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-b\
le-bonding-failed" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-b\
le-connection-failed" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-b\
le-service-discovery-failed" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-b\
le-invalid-service-or-characteristic" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-z\
igbee-connection-timeout" /
  "https://www.iana.org/assignments/nipc-problem-types#protocolmap-z\
igbee-invalid-endpoint-or-cluster" /
  "https://www.iana.org/assignments/nipc-problem-types#extension-tra\
nsmit-invalid-data" /
  "https://www.iana.org/assignments/nipc-problem-types#extension-fir\
mware-rollback" /
  "https://www.iana.org/assignments/nipc-problem-types#extension-fir\
mware-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 GroupFailureRes\
ponse
GroupEventStatusResponse = (GroupEventSuccessResponse // GroupFailur\
eResponse)

GroupFailureResponse = {
  FailureResponse,
  ? deviceId: text
}

; ============================================
; From: cddl/api/group_trigger_status_array.cddl
; ============================================
; Group Trigger status response array and item shape

GroupTriggerStatusResponseArray = [* GroupTriggerResponse]

GroupTriggerResponse = (GroupTriggerSuccessResponse // GroupTriggerF\
ailureResponse)

GroupTriggerSuccessResponse = {
  SdfReference,
  ? 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 = {
  SdfReference,
  ? 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 = [* PropertyValueReadResponseArrayIt\
em]

PropertyValueReadResponseArrayItem = ( PropertyValue // FailureRespo\
nse )

; ============================================
; From: cddl/api/property_value_response_array.cddl
; ============================================
PropertyValueResponseArray = [* PropertyValueResponseArrayItem]

PropertyValueResponseArrayItem = ( SuccessResponse // FailureRespons\
e )

; 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,  ; UUID of the connection
  ? 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"

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",
              "sdfOutputData": {
                "sdfProtocolMap": {
                  "ble": {
                    "type": "gatt",
                    "serviceID": "1809",
                    "characteristicID": "2A1C"
                  }
                }
              }
            },
            "intermediate_temperature": {
              "description": "Intermediate Temperature",
              "sdfOutputData": {
                "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",
          "sdfOutputData": {
            "sdfProtocolMap": {
              "ble": {
                "type": "advertisements"
              }
            }
          }
        },
        "isConnected": {
          "description": "BLE connection events",
          "sdfOutputData": {
            "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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
iyT/cZL9iGwQQdcffppZ40E8LTjfD7r8svel+nFhggmesExNvFkN4Yn9Fdbg
uLAex80AocjBWy8AuWZaALBczMbkZXdr2Hgn6yDBVlgGPwc7MlYzGQRcNMZZ
NthXUbJ26YfCOYhjveEUV9ZgF4nnkAR18ImpW2wKJWieKFusnEdSJ08ZV4yE
xqu4UaV3NGVxy8QMAuRDaPhJBm70R7uV2dRxaG5O87TJ01pRSGZPz4Jqqck5
VnMtSCPJJYJ+3/bK6V6a7CinzgcIadbj88o9W3YktZlYDAjUnlErPESpTfxS
iRsUD3SNLXqXXDXJCR3QRGpikKUYiSyW+3JxQf3l98duuNEbnPuVyutsP3os
MQmj5HJAufSdhl+9HX3l3Cu5VmWCXXOxJKvSnKtlqPL9XC4dEDfptET3X6go
bHhYlqHpYvlygiK8gklR5apaXmLpyyqflq7rZfHlsi5/WWUvP8F19U7pV7+w
3uj3c2Ud1c0Bk2vRiCgD+Od/4oC8N0mf0mqshtLupWHswvV1Wovzgtmz0gvN
rFZ5KutaQ32LDuZOo+Pof5YJ7cb+qrPljl2+FLnSUltZgG2rDOc1zZ0vvfhb
hy4baJ45fJ159m2ZVcM3tKzjw5czuDX50GPHdDvgQ5MSWdgfK/fBhx+dVenu
85IM+1O7nm/tNbwO/4mH++YP/N+PDRwWIHudIVtaynclaEb/88o05LjNRJRg
/FpTuaW2DinAj0DLZinqbOKFxZzLllSJks6Pb6VJZ3StaUzo+W01gW+DGdGy
K9T9R5NQyd4ZGAp3qV6DiM1YXMurikQuIGI7mqstnLnDqtmq1fRVxMC/5/Ng
vLSit2cFrg+Oi69azqCdzcePtzRxlKIrbIi/9bmiLHxufss7B//ga/5znRDN
inOvakCBz2AeKMga5oKCb/8AhsYmtS/l9FcmjeOWsI66sEx+bhTfNlWjFJln
oVpIjWPMVFU4dXvDqXwCDc5pacW2svWMLTE5c2aWVict2vV1VelVNVDd/YAc
54l5h1PjQrHQ4bAfRXWJwnPexpq41HHZzfJTBy60OXc8KteTYt7e1vtTLLS9
xqliFuz/Klt7D3B4160u5/2wWS1L0cteTaOaBFNOjqv6WllufSWmSxI13pMY
YJK2Z1SnM/Vz2FFfs724fUqVEq8UNgbvY21jqb8lOZ9syd88kTLGJltpwVHs
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
u6/Obwi6zv8A8EBItdzgAwA=

-->

</rfc>

