<?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-18" 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="24"/>

    
    
    <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 registration policy for this registry is Specification Required <xref target="RFC8126"/>.</t>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<texttable>
      <ttcol align='left'>Problem Type URI</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>https://www.iana.org/assignments/nipc-problem-types#invalid-id</c>
      <c>Invalid device ID or gateway doesn't recognize the ID</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#invalid-sdf-url</c>
      <c>Invalid SDF URL or SDF affordance not found</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#extension-operation-not-executed</c>
      <c>Operation was not executed since the previous operation failed</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#sdf-model-already-registered</c>
      <c>SDF model already registered</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#sdf-model-in-use</c>
      <c>SDF model in use</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#unsupported-uri-scheme</c>
      <c>Unsupported URI scheme</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#property-not-readable</c>
      <c>Property not readable</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#property-read-failed</c>
      <c>Property read failed</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#property-not-writable</c>
      <c>Property not writable</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#property-write-failed</c>
      <c>Property write failed</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#event-already-enabled</c>
      <c>Event already enabled</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#event-not-enabled</c>
      <c>Event not enabled</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#event-not-registered</c>
      <c>Event not registered for any data application</c>
      <c>This document</c>
      <c>https://www.iana.org/assignments/nipc-problem-types#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 3010?>

<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:
                  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:
                        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:
                  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 event
      properties:
        sdfEvent:
          additionalProperties: #example, this will be the registere\
\d event
            allOf:
              - $ref: './protocolmaps/ProtocolMap.yaml#/components/s\
\chemas/ProtocolMap'
          example:
            fallDetected:
                sdfProtocolMap:
                  ble:
                    type: gatt
                    serviceID: 00001809-0000-1000-8000-00805f9b34fb
                    characteristicID: 00002a1c-0000-1000-8000-00805f\
\9b34fb
    
    SdfAction:
      type: object
      description: Sample SDF action
      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",
              "sdfProtocolMap": {
                "ble": {
                  "type": "gatt",
                  "serviceID": "1809",
                  "characteristicID": "2A1C"
                }
              }
            },
            "intermediate_temperature": {
              "description": "Intermediate Temperature",
              "sdfProtocolMap": {
                "ble": {
                  "type": "gatt",
                  "serviceID": "1809",
                  "characteristicID": "2A1E"
                }
              }
            }
          }
        }
      },
      "description": "Generic Access, Device Information",
      "sdfProperty": {
        "device_name": {
          "description": "Device Name",
          "observable": false,
          "writable": true,
          "readable": true,
          "sdfProtocolMap": {
            "ble": {
              "serviceID": "1800",
              "characteristicID": "2A00"
            }
          }
        },
        "appearance": {
          "description": "Appearance",
          "observable": false,
          "writable": false,
          "readable": true,
          "sdfProtocolMap": {
            "ble": {
              "serviceID": "1800",
              "characteristicID": "2A01"
            }
          }
        },
        "manufacturer_name_string": {
          "description": "Manufacturer Name String",
          "observable": false,
          "writable": false,
          "readable": true,
          "sdfProtocolMap": {
            "ble": {
              "serviceID": "180A",
              "characteristicID": "2A29"
            }
          }
        },
        "model_number_string": {
          "description": "Model Number String",
          "observable": false,
          "writable": false,
          "readable": true,
          "sdfProtocolMap": {
            "ble": {
              "serviceID": "180A",
              "characteristicID": "2A24"
            }
          }
        },
        "hardware_revision_string": {
          "description": "Hardware Revision String",
          "observable": false,
          "writable": false,
          "readable": true,
          "sdfProtocolMap": {
            "ble": {
              "serviceID": "180A",
              "characteristicID": "2A27"
            }
          }
        },
        "firmware_revision_string": {
          "description": "Firmware Revision String",
          "observable": false,
          "writable": false,
          "readable": true,
          "sdfProtocolMap": {
            "ble": {
              "serviceID": "180A",
              "characteristicID": "2A26"
            }
          }
        },
        "system_id": {
          "description": "System ID",
          "observable": false,
          "writable": false,
          "readable": true,
          "sdfProtocolMap": {
            "ble": {
              "serviceID": "180A",
              "characteristicID": "2A23"
            }
          }
        }
      },
      "sdfEvent": {
        "isPresent": {
          "description": "BLE advertisements",
          "sdfProtocolMap": {
            "ble": {
              "type": "advertisements"
            }
          }
        },
        "isConnected": {
          "description": "BLE connection events",
          "sdfProtocolMap": {
            "ble": {
              "type": "connection_events"
            }
          }
        }
      }
    }
  }
}
]]></sourcecode></figure>

</section>
<section anchor="acknowledgements"><name>Acknowledgements</name>

<t>This document relies on SDF models described in <xref target="RFC9880"/>, as such, we are grateful to the authors of this
document for putting their time and effort into defining SDF in depth, allowing us to make use of it. The authors would also like to thank the ASDF working group for their excellent feedback and steering of the document.</t>

</section>


  </back>

<!-- ##markdown-source:
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
1SQp1kS3hrgSTnc4BnAYZ7AfGpTYCo8mrBAUH09JF3cQrmKPJ/tHL40/htEH
rNnEiTpcTZrGKHw3QoVm2ck9HCYY2W0hc/wy6u3FMWvf8qJI1xRuNAAUSx+i
FgVko4TMmGprBLl8nA2ysyvXIoXJuwEnTkg1PGBXVkpGFmOi9d55hqvhfG04
Udj76jYD69CjXO4Tc4ikD6q7TY3QPXjP0bZRvV5rrG7ny4S4QRhKyikW5eSa
TMSUQLMyM/hMg+Gtj/4J6c7VUZWQmq3BCLIm9vI0mvTOpeCiN19al+zKtCDt
HsEiX8dw9R/+wW3eNJieNKxsO/HsJq3wVXJZHaKot7StFkBWRZdWuURccfzD
h5JFaFooxNNEx4PpWVhcwVX4OVxdX//GGrKpjvSVNkblntiMvDxUcC45Zogw
uxQE5ifn1iyfwg/cwjsYzTCBi+iEdPvQfcXcvA7adSMAlichX0EbGhw4eSgP
JK0EPXOvhn3u7hDnljmpnGezYiHgzDOFP2XMVgXkxP2+Ez71H4Tr69xqzwV6
auY9Me1szowTqSj7tPqQWzMP5g//H5Vn3HYWHGLarPKUK8midO+qWZ4k62dQ
WQ73Maw5gG8JS3XCkaYBqlvf7M+NmGczM2FikqiQxFvYY80mVBMnSQoTJ/+R
PPFSGJWfcQojHueWGUgQxn90T8MkIkEKidRJswpqsjlBgU4NBEenX6iptXKp
gHBOOcKZeo3T6GyUkWwBWFbLw+Ma3ISn0MlKJzz/aqO9sbm5B/+7t7G/+ejZ
s+39jY3NjY2dnfbms+3Npxtbu+2NncdfSZZSvX9L+QDCd+aCw4ebO+2d7cfb
W7tbDeMF6AGV4xIIby1wUOnizc7D/c7Ghv7fpuMnt4IAB42a7YeO1xjlLEVO
WLjf16NuFuWIIVEuE+WCP/6H+9quz2jZrwAb3G3p21vbj7Y2tnb0v1u72w/h
v48+Nmy4sO7vkecNGm0nj7Z3+9vN7W7ysLm5Cf/z+PHDuNkHhvbx5m4v7u32
3V2rce1c6W33NvuPkvbcPuZsMm7r873T0/CVw97U7elH2qoyfr01SBnsW42u
q1vzfkU8Itbts4OmKiX1d8jSDfza3Q+lHvD8kfPcoSH4RbvuFZISfDlnD0Vx
sqefVODnwdK0YkSBeI4ylk2sxh2n7H43IUfO4XRELD3zniUvJ1s+iR27WGP+
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
Se+YjtcmzdXOOKANqWVLa8n1sW+j87EfhLPBNwNJuyqrVLVAtLSsatEe6FQj
9dq+Mfnzb3HXGN1iU4Ryr2akVTIkTlBAYG2HkBhB+wa9d/NLWunkXamiIuoo
tOQrv6Gyfw6WJzF1UfCxa7sZnbG1u7llx+i3oT8F828Myk4gN3lhb8Kv9rKN
k7Z6sblpb3VCxJKXRAFYrVSfXKxa26qu1nJyRZmAt79ldRJQnEkN1rr5E0PC
egfYB3TCGq6D3L1tqSMbxdlNpfJ21pgY9WRJDfo/fhT2ji/yltp7Rs6Wi/Fy
eM/HPoNhi9qjH6/0Ih0FOr8yQCnBYNsOv0qhwzNwIf4BbrTZMs1CWbgv/zfb
cLdMw/d+dhdJELaKIRi3rwTiRTEI23YWUPRtbYRi295F5TTzNSSsh/nesBNU
tdPykrJNYBzviQhUXmkUIoNCJKFASCwNFbnFP/kVOwkhqmG73NM3KyU5kk3Z
/gZ1pFbZVhgNPStHrcJL6S5qO1lealNcueqqXkKUPyW0VzP7NiiwM/ZihGOa
pUvTebyfZ0oZCC3HZmxuyBe3a2KoFGQuO1VeMTHTE/mFhpU2rHTlWKnE9/aS
62HXxlSBSUivqjeDU+bR2tncyTOQQvcLHpo8KON20Vbtoo9A7pwIFLQb5GRC
z40ObRV/JGaerTfOP5l6wlJrKkuk9Bu2kxx8W/OFonuUCQd6a9l6niN8pNb8
DOURm6IVrHSPG7stCWLFMNLUearjaMY40jJK0xfeqUoLE3rP3zyQ4lJ/hhtP
5O45BnFRyGQvpTMmUQUoQZNR2I16URhgrEDbkd8BBIS8Od5RGgzCIPInYf9a
v4gmjgbEOzqhW+4h2d4nCVyUAj2c7AQ26bkAjWJLsJZ1WuU2Qlc44RugBhlI
UqxB3lkjaDEXcSA9kLSVeXNkUNgVFtuGv69fTk5Nj7+Znn48VJ/ihGoYg6ga
rMUV/SJHOry7kb4Bmd0WAqLnOsmGXFz4Jv3bCCAnyAnjZTbwwiJLwU5H13ZM
4ysHnNarVWCSRxQc/AlsajLLUDFrQxZ5bcc6vGwB5zLaWduxLlZeEWca0EF0
fCzi3HZIwWZSJU3/9YMU74G/hQOy8VSfL3APf5IRyTl3gQ3pFShOy1q+JPdd
1pgzSiRMkbefrrAOFIV9ls9LDbB9SzCvTzzobBwCFoDDkuQdJmXeZGlXTuhu
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

-->

</rfc>

