<?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 4.0.5) -->


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

]>


<rfc ipr="trust200902" docName="draft-ietf-asdf-nipc-20" 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="June" day="29"/>

    
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 70?>

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



    </abstract>

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


  </front>

  <middle>


<?line 74?>

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

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

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

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

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

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

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

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

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

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

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

<t><list style="symbols">
  <t>The gateway has access to a device object, that contains its identity, in the form of a unique UUID and any credentials &amp; trust material required to communicate with the device. Provisioning this device object is out of scope of this document. It may be performed via SCIM <xref target="RFC7644"/> with <xref target="RFC9944"/>.</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="RFC9944"/>). This device object is identified by the device ID referenced in NIPC API paths.</t>
  <t>The NIPC gateway has access to an interaction model (device class information): An SDF model <xref target="RFC9880"/> is registered, providing protocol‑neutral affordances and mappings to protocol‑specific operations.</t>
</list></t>

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

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

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

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

<t>In order for the NIPC gateway to perform operations on a device, it must have access to the device's instance information. This includes the device’s identity and any credentials or trust material required to communicate with the device. The device object MUST include a unique identity (UUID) and sufficient information to bootstrap trust and establish connectivity, as NIPC operations assume connectivity can be established without separate API calls. While provisioning devices instance information can be performed in various ways, it is RECOMMENDED to use SCIM <xref target="RFC7644"/> with the device schema <xref target="RFC9944"/>, 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="RFC9944"/> and <xref target="I-D.ietf-asdf-sdf-protocol-mapping"/> for details.</t>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<t>Event types include:</t>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<t>paths:</t>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<t>For example:</t>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<t>Request Body:</t>

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

<t>Response:</t>

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

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

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

SdfReference = {
  sdfName: SdfGlobalName
}

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

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

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

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

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

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

<t>Response:</t>

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

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

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

SdfReference = {
  sdfName: SdfGlobalName
}

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

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

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

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

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

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

<t>Query Parameters:</t>

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

<t>Response:</t>

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

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

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

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

<t>Query Parameters:</t>

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

<t>Response:</t>

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

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

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

SdfReference = {
  sdfName: SdfGlobalName
}

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

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

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

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

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

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

<t>Query Parameters:</t>

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

<t>Request Body:</t>

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

<t>Response:</t>

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

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

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

SdfReference = {
  sdfName: SdfGlobalName
}

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

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

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

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

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

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

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

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

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

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

<t>Query Parameters:</t>

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

<t>Request Body:</t>

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

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

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

DataAppMqttClient = {
  mqttClient: bool
}

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

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

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

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

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

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

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

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

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

<t>Response:</t>

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

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

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

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

<t>Query Parameters:</t>

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

<t>Request Body:</t>

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

<t>Response:</t>

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

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

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

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

<t>Query Parameters:</t>

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

<t>Response:</t>

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

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

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

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

<t>Query Parameters:</t>

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

<t>Response:</t>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<t>Parameters:</t>

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

<t>Query Parameters:</t>

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

<t>-or-</t>

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

<t>Request Body:</t>

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

<t>-or-</t>

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

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

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

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

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

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

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

<t>Response:</t>

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

<t>-or-</t>

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

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

PropertyValueResponseArray = [* PropertyValueResponseArrayItem]

PropertyValueResponseArrayItem = ( SuccessResponse // \
                                                    FailureResponse )

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

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

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

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

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

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

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

<t>Parameters:</t>

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

<t>Query Parameters:</t>

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

<t>Response:</t>

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

<t>-or-</t>

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

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

PropertyValueReadResponseArray = [* \
                                  PropertyValueReadResponseArrayItem]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<t>Parameters:</t>

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

<t>Query Parameters:</t>

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

<t>Response:</t>

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

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

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

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

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

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

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

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

<t>Parameters:</t>

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

<t>Query Parameters:</t>

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

<t>Response:</t>

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

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

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

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

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

<t>Parameters:</t>

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

<t>Query Parameters:</t>

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

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

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

EventStatusResponseArray = [* EventStatusResponseArrayItem]

EventStatusResponseArrayItem = ( EventInstanceSuccess // \
                                                    FailureResponse )

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

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

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

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

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

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

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

<t>Parameters:</t>

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

<t>Query Parameters:</t>

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

<t>Response:</t>

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

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

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

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

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

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

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

<t>Parameters:</t>

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

<t>Query Parameters:</t>

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

<t>Response:</t>

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

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

GroupEventStatusResponseArray = [* GroupEventStatusResponse]

GroupEventSuccessResponse = { event: text, deviceId: text }

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

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

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

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

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

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

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

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

<t>Parameters:</t>

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

<t>Query Parameters:</t>

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

<t>Response:</t>

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

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

GroupEventStatusResponseArray = [* GroupEventStatusResponse]

GroupEventSuccessResponse = { event: text, deviceId: text }

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

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

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

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

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

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

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

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

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

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

<t>Parameters:</t>

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

<t>Query Parameters:</t>

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

<t>Request Body:</t>

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

<t>Response:</t>

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

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

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

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

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

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

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

<t>Parameters:</t>

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

<t>Query Parameters:</t>

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

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

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

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

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

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

</section>
<section anchor="perform-an-action-on-a-group-of-devices"><name>Perform an action on a group of devices</name>

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

<t>Description: Perform an action on a group of devices</t>

<t>Parameters:</t>

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

<t>Query Parameters:</t>

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

<t>Request Body:</t>

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

<t>Response:</t>

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

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

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

HTTP/1.1 202 Accepted
Location: /groups/0dc729d7-f6c3-491d-9b9d-e7176d2be243/actions?\
                      instanceId=02ee282c-8915-4b2e-bbd2-88966773134a
Retry-After: 5
]]></artwork></figure>

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

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

<t>Description: Check the status of an action on a group of devices. Returns a per-device status array.</t>

<t>Parameters:</t>

<t><list style="symbols">
  <t>id: the ID of the group</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:</t>

<t>MUST return 200 OK with an array of per-device action statuses. Each entry contains the action status and a deviceId. Entries for failed devices contain a problem detail with the deviceId.</t>

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

; Group Action status response array and item shape

GroupActionStatusResponseArray = [* GroupActionStatusResponse]

GroupActionStatusResponse = (GroupActionSuccessResponse // \
                                          GroupActionFailureResponse)

GroupActionSuccessResponse = {
  status: ActionStatus,
  deviceId: text     ; UUID (as text)
}

ActionStatus = "IN_PROGRESS" / "COMPLETED"

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

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

<figure title="Example group action status response" anchor="exgroupactionstatusresp"><sourcecode type="json" markers="true"><![CDATA[[
  {
    "status": "COMPLETED",
    "deviceId": "1d3b2c36-8a65-45a6-87c1-bcdbe0a32e30"
  },
  {
    "status": "IN_PROGRESS",
    "deviceId": "d62c7fb2-a216-4811-a388-053b17fdbedc"
  }
]
]]></sourcecode></figure>

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

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

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

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

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

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

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

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

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

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

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

<t>Parameters:</t>

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

<t>Query Parameters:</t>

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

<t>Request Body:</t>

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

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

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

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

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

<t>Response:</t>

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

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

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

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

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

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

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

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

<t>Parameters:</t>

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

<t>Query Parameters:</t>

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

<t>Response:</t>

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

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

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

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

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

<t>Parameters:</t>

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

<t>Query Parameters:</t>

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

<t>Response:</t>

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

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

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

TriggerStatusResponseArray = [* TriggerResponse]

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

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

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

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

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

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

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

<t>Parameters:</t>

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

<t>Query Parameters:</t>

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

<t>Request Body:</t>

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

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

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

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

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

<t>Response:</t>

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

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

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

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

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

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

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

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

<t>Parameters:</t>

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

<t>Query Parameters:</t>

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

<t>Response:</t>

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

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

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

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

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

<t>Parameters:</t>

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

<t>Query Parameters:</t>

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

<t>Response:</t>

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

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

; Group Trigger status response array and item shape

GroupTriggerStatusResponseArray = [* GroupTriggerResponse]

GroupTriggerResponse = (GroupTriggerSuccessResponse // \
                                         GroupTriggerFailureResponse)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ble-descriptor = {
  descriptorID: uuid,
}

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

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

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

zigbee-cluster = {
  clusterID: uint,
  ? attributes: [* zigbee-attribute],
}

zigbee-attribute = {
  attributeID: uint,
  attributeType: uint,
}

zigbee-broadcast = {
  zigbee: {
  },
}

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

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

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

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

<t>Parameters:</t>

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

<t>Request Body:</t>

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

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

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

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

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

<t>where-</t>

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

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

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

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

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

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

<t>Response:</t>

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

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

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

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

<t>where-</t>

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

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

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

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

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

<t>Parameters:</t>

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

<t>Request Body:</t>

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

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

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

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

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

<t>Response:</t>

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

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

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

<t>where-</t>

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

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

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

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

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

<t>Parameters:</t>

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

<t>Response:</t>

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

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

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

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

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

<t>Parameters:</t>

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

<t>Response:</t>

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

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

<t>where-</t>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

DataBatch = [* DataSubscription]

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

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

BleSubscription = {
  serviceID: text,
  characteristicID: text
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

{ ... }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

{ ... }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

{ ... }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<t>Version compatibility: All versions up to draft-20</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-20</t>

<t>Licensing: Proprietary</t>

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

<t>Organization: Ericsson Research</t>

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

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

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

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

<t>Licensing: Proprietary</t>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<t>Type name: application</t>

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

<t>Required parameters: none</t>

<t>Optional parameters: none</t>

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

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

<t>Interoperability considerations: none</t>

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

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

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

<t>Additional information:</t>

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

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

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

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

<t>Author:</t>

<t>Change controller: IETF</t>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

</section>
</section>


  </middle>

  <back>


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

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



<reference anchor="RFC8610">
  <front>
    <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
    <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
    <author fullname="C. Vigano" initials="C." surname="Vigano"/>
    <author fullname="C. Bormann" initials="C." surname="Bormann"/>
    <date month="June" year="2019"/>
    <abstract>
      <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8610"/>
  <seriesInfo name="DOI" value="10.17487/RFC8610"/>
</reference>
<reference anchor="RFC9880">
  <front>
    <title>Semantic Definition Format (SDF) for Data and Interactions of Things</title>
    <author fullname="M. Koster" initials="M." role="editor" surname="Koster"/>
    <author fullname="C. Bormann" initials="C." role="editor" surname="Bormann"/>
    <author fullname="A. Keränen" initials="A." surname="Keränen"/>
    <date month="January" year="2026"/>
    <abstract>
      <t>The Semantic Definition Format (SDF) is a format for domain experts to use in the creation and maintenance of data and interaction models that describe Things, i.e., physical objects that are available for interaction over a network. An SDF specification describes definitions of SDF Objects/SDF Things and their associated interactions (Events, Actions, and Properties), as well as the Data types for the information exchanged in those interactions. Tools convert this format to database formats and other serializations as needed.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9880"/>
  <seriesInfo name="DOI" value="10.17487/RFC9880"/>
</reference>
<reference anchor="RFC9944">
  <front>
    <title>Device Schema Extensions to the System for Cross-Domain Identity Management (SCIM) Model</title>
    <author fullname="M. Shahzad" initials="M." surname="Shahzad"/>
    <author fullname="H. Iqbal" initials="H." surname="Iqbal"/>
    <author fullname="E. Lear" initials="E." surname="Lear"/>
    <date month="May" year="2026"/>
    <abstract>
      <t>The initial core schema for the System for Cross-domain Identity Management (SCIM) was designed for provisioning users. This memo specifies schema extensions that enable provisioning of devices using various underlying bootstrapping systems such as Wi-Fi Easy Connect, FIDO device onboarding vouchers, Bluetooth Low Energy (BLE) passcodes, and MAC Authenticated Bypass (MAB).</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9944"/>
  <seriesInfo name="DOI" value="10.17487/RFC9944"/>
</reference>

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

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



    </references>

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

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


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



    </references>

</references>


<?line 3009?>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


### Registrations
  /registrations/models:
    post:
      tags:
        - NIPC registration APIs
      summary: Register an sdfObject
      description: |-
        Register an sdfObject, including Properties, Events and
        actions
      operationId: registerSdfObject
      requestBody:
        content:
          application/sdf+json:
            schema:
              $ref: '#/components/schemas/SdfModel'
        required: true
      responses:
        '201':
          description: Created
          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 registered SDF models
      description: |-
        Without sdfName, returns a list of all registered SDF model
        references. With sdfName, returns the full SDF model for that
        name.
      operationId: getSdfRefs
      parameters:
        - name: sdfName
          in: query
          description: |-
            sdfName can be a reference to an sdfThing or sdfObject.
            If omitted, all registered model references are returned.
          required: false
          allowReserved: true
          schema:
            type: string
            example: "https://example.com/heartrate#/sdfObject/\
                                                        healthsensor"
      responses:
        '200':
          description: |-
            Without sdfName, returns a list of SDF model references.
            With sdfName, returns the full SDF model.
          content:
            application/sdf+json:
              schema:
                oneOf:
                  - type: array
                    items:
                      $ref: '#/components/schemas/SdfReference'
                  - $ref: '#/components/schemas/SdfModel'
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/FailureResponse'
    put:
      tags:
        - NIPC registration APIs
      summary: Update an SDF model
      description: |-
        Update an SDF model, including Properties, Events and
        actions
      operationId: updateSdf
      parameters:
        - name: sdfName
          in: query
          description: |-
            sdfName can be a reference to an sdfThing or sdfObject
          required: true
          allowReserved: true
          schema:
            type: string
            example: "https://example.com/heartrate#/sdfObject/\
                                                        healthsensor"
      requestBody:
        content:
          application/sdf+json:
            schema:
              $ref: '#/components/schemas/SdfModel'
        required: true
      responses:
        '200':
          description: Success
          content:
            application/nipc+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/SdfReference'
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/FailureResponse'
 
    delete:
      tags:
        - NIPC registration APIs
      summary: Delete an sdfObject
      description: |-
        Delete an sdfObject, including Properties, Events and
        actions
      operationId: deleteSdfObject
      parameters:
        - name: sdfName
          in: query
          description: sdfObject name
          required: true
          schema:
            type: string
            example: "https://example.com/heartrate#/sdfObject/\
                                                        healthsensor"
      responses:
        '200':
          description: Success
          content:
            application/nipc+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/SdfReference'
        default:
          description: Error response
          content:
            application/problem+json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/FailureResponse'

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

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

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

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

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

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

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

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

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

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


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

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

 ## sdfObject registration definition
    SdfReference:
      type: object
      description: SDF URL referring to the sdfobject
      properties: 
        sdfName:
          type: string
          example: "https://example.com/heartrate#/sdfObject/\
                                                        healthsensor"

 ## Event name reference for triggers
    EventNameReference:
      type: object
      description: SDF global name of the event associated with a \
                                                              trigger
      properties:
        eventName:
          type: string
          example: "https://example.com/heartrate#/sdfObject/\
                                  healthsensor/sdfEvent/fallDetected"
    
    SdfModel:
      allOf:
        - type: object
          description: Sample SDF model
          properties:
            namespace:
              type: object
              additionalProperties:
                type: string
              example:
                heartrate: https://example.com/heartrate
            defaultNamespace:
              type: string
              example: heartrate
        - oneOf:
          - $ref: '#/components/schemas/SdfThing'
          - $ref: '#/components/schemas/SdfObject'

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

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

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

# responses

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

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

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

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

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

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

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

    GroupEventStatusResponseArray:
      type: array
      items:
          $ref: '#/components/schemas/GroupEventStatusResponse'
    
    ActionResponse:
      required:
        - status
      type: object
      properties:
        status:
          type: string
          enum:
            - IN_PROGRESS
            - COMPLETED
          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/EventNameReference'
        - $ref: '#/components/schemas/Action'
        - $ref: '#/components/schemas/InstanceId'

    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/EventNameReference'
        - $ref: '#/components/schemas/Action'

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

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

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

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

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

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

paths: {}

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

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

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

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

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

paths: {}

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

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

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

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

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

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

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

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

paths: {}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

; ============================================
; From: cddl/api/action_response.cddl
; ============================================
ActionResponse = {
  status: ActionStatus
}

ActionStatus = "IN_PROGRESS" / "COMPLETED"
; ============================================
; From: cddl/api/action.cddl
; ============================================
Action = {
  action: text  ; NIPC action operation to execute
}

; ============================================
; From: cddl/api/data_app.cddl
; ============================================
DataApp = {
  events: [* EventRef],
  ( DataAppMqttClient //
    DataAppMqttBroker //
    DataAppWebhook //
    DataAppWebsocket )
}

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

DataAppMqttClient = {
  mqttClient: bool
}

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

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

DataAppWebsocket = {
  websocket: {
    URI: text,
    ? headers: { * text => text },  ; key/value headers
    ? serverCACert: text
  }
}
; ============================================
; From: cddl/api/event_status_array.cddl
; ============================================
EventStatusResponseArray = [* EventStatusResponseArrayItem]

EventStatusResponseArrayItem = ( EventInstanceSuccess // \
                                                    FailureResponse )

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

; ============================================
; From: cddl/api/failure_response.cddl
; ============================================
FailureResponse = {
  type: FailureTypeURI,
  status: uint,
  title: text,
  detail: text
}

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

GroupEventSuccessResponse = { event: text, deviceId: text }

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

GroupFailureResponse = {
  FailureResponse,
  ? deviceId: text
}

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

GroupTriggerStatusResponseArray = [* GroupTriggerResponse]

GroupTriggerResponse = (GroupTriggerSuccessResponse // \
                                         GroupTriggerFailureResponse)

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

GroupTriggerFailureResponse = {
  FailureResponse,
  ? deviceId: text
}

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

TriggerStatusResponseArray = [* TriggerResponse]

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

; ============================================
; From: cddl/api/property_value_array.cddl
; ============================================
PropertyValueArray = [* PropertyValue]

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

; Helper type for base64-with-padding encoded text
b64text = text
; ============================================
; From: cddl/api/property_value_read_response_array.cddl
; ============================================
PropertyValueReadResponseArray = [* \
                                  PropertyValueReadResponseArrayItem]

PropertyValueReadResponseArrayItem = ( PropertyValue // \
                                                    FailureResponse )

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

PropertyValueResponseArrayItem = ( SuccessResponse // \
                                                    FailureResponse )

; Minimal success shape (may be extended)
SuccessResponse = {
  status: uint
}

; ============================================
; From: cddl/api/sdf_reference.cddl
; ============================================
SdfGlobalName = text    ; absolute URI with fragment referencing an \
                                                sdfThing or sdfObject

SdfReference = {
  sdfName: SdfGlobalName
}

SdfReferenceArray = [* SdfReference]
; ============================================
; From: cddl/api/connection.cddl
; ============================================
ConnectionRequest = {
  ? retries: uint,
  ? protocol-info-service-map
}

ConnectionResponse = {
  id: text,  ; Device ID
  ? protocol-info-service-map
}

; ============================================
; From: cddl/api/protocolinfo.cddl
; ============================================
; Top-level wrappers
protocol-info-service-map = (
  ? protocolInformation: ble-service-map / zigbee-service-map
)

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

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

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

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

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

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

ble-descriptor = {
  descriptorID: uuid,
}

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

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

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

zigbee-cluster = {
  clusterID: uint,
  ? attributes: [* zigbee-attribute],
}

zigbee-attribute = {
  attributeID: uint,
  attributeType: 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 numbered="false" 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 like to thank Ari Keränen, Carsten Bormann, Eliot Lear, Michael Richardson, and Sriram Sekar for their reviews and contributions that helped improve this document.</t>

</section>


  </back>

<!-- ##markdown-source:
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
711JfOdPSw3Bnw72sR0ZD8NVhU3r1oP9oI8p70Meq7qeYFULm6zpoH3gGuno
FDlIN3hypdkeTdUigbFo8waKr6dmBcPgjVL4+h8MAX67/geTKgh/o37xM0mL
KPu5SH9GzYeo69s3M9sESaQVF5rD9BROFdBIYCxtxAALaJJ5YQTPwF9hDY8L
6nncDBIKHb71DJhrqr1ey+3OTC8Qt8uZt7MOE2yXqc9hjszUTPEal4txzCPH
1Uu1SH1RdAXJATO64coaIJG0DCmMCq+Y7vSmD4/WJxzEQ9JLC5lJExJkXrk/
NRGczaq4I5DL92dGg2TaxsDmOwePOiGgikxOIci7jtlULfMjD0kVK0xRsidO
cWnKcp06LyCh2YyBK3drOenBlgAzFFC7R+3gCL3qmvCA+p8kS2ka7NvoqkX5
UsAlYlMqQ/pZyWJ5LJcV1J99f+6mm2jINcepG9v2ziNJnxtHlwm1b3Ee/Orf
xl85x0pOVVle15wrqeY352QZoXw/Z0vLBwZcUc2fQGxlo8HyFQedK98wUHaX
syCqnFSrSSx9VuXV0mm9zL+c1eXPquDyI5xWb5c++Xn1Zr+fE+v4dg5ZWIsL
RNW/P/89p46/joZU+2k1kOeeG7UuWF+ntTg/sHJW+kELela+lXWtoYNFJ3PB
6DoOomWKkOB4VWh5YFcrRZ209KwswD6r6uY1wc6HXrJ2AlcJNN85Wp357ruy
ooa/0LJeHT2foavJi54ypuiAF00lflF+rNUHL35wVqXY5yUZ5ad2Pd/ZY3gd
/D1P9823/N8PTZwWKHudKVuelPdK1Ix5TBUwZLsNICovPhUot3TPoQT4GUTZ
LM+cLRFU453j42Rq4F1rlSz6/tY+u/pyDCs0+AdTg8+SOkyEiyt7+tzQNvb6
4Stsb2VV5x+3nrKDzvXwzUSSeqNqvXMVO+4zRClzhBWl2xUgXJwVf2o7U3Y3
Hz3a0sqCyijwQfxbv1dmgd+bv+U35+Tjz/xxnY74ikPRN+wmo3Hebsp65u6m
fwsBaoXtaFJq6KKqEmef9oFBieLi1dLyL4hq/BLzrokW8qSYu6IqpbmjfRwf
ymlpvUjXcxFiKqwZ/3UFavRjXV9X3U7VS6L72h6KZ5i3NzVRDQvtDYc2VJco
et9tbvSW2i6LLD8McCHk3HGr3OCGebitD3FYCL0mzmEW6X8S1C5Gh2/8fhtv
2iZO2hZ3sqWISyUqvC50NVUEnUKG9d0N3Y54LFakEkFfKj2QnTqjlajpeMYB
+1rSyx1T+krJcDw2VmjBtvHSMVEK+9ne6lkkHeJNiemcS5V4t0Gwkn2nzlft
/c0md1fnq2TeEtvWrRuUOrZVwCdn2ZGYA0v0WQpatpaEIEAeVbT6Rb+l9pBi
AK98KMbZR4KY/LO7umK4lilEYyrPO718iOSqnXhiJmZpvZSbWoK2C58FgliG
aQcI6zuWiW2jmXRsWwGt8vKd7nprVH1KsFKuZMjXjLYhYnNWfHtNP4jalr/2
ZharJXDpO7QR4IiUAgFWWRvQjj02onyNKyiWXnopndSdAnSDiArhI/gOXa46
xcmagapY9BfTyJpLui5XhW8s+KGM7BTjkzoWpetJLATllr/LvIJ0sxqGzq9o
Oac5rZfkYBiUV2JnFBZ9e2bdSbVW5cxVE48BuC4i/+5UO4avOnlga96NHJG6
ELL0+tOyelTZnu4N62BSyqpWMfP7EXY4wcNpGGAbIXudcRtubsmsK/sb+Oh9
9nONC7dpq4pycwhv7rgj6SLzOu9oZSfYRbblWc+c0ZNS3Xd96TilzSZxwnld
md1ekyu1TS1XmraNCdEiX6G7cUcATC+9ABp5Ut+nUutC36FXpR7sFRpyJRjG
UQLMFQs6VrolG4BtWbUK5HkkFaq96jmOOaFMU5kZL6VsUgjLKNeGv/5OUVAb
gfZjqUeuy6CdTpwOr2o0yvpUXFWk5Ml6/csFCCSOVijNa9p3Yr1RQgIdGXFK
NqsqrLarRkfo/E6NNb2qA8wcVQUPGOeMKbTdQW27VVGEtNoS9f2ipoy8hYDk
Eapk6GbVjmoKCFeKoi2oib5jqBCaUhlDD43cQI/DIe4XPSR32SsV52VPLb6h
x5xGlP2v4nbxZWCvmjlL0QPsItkhVEMwgmwn72MGyp0FmjtY30mfhZfaRYkj
ViQmRiBx+kMxV/F5iXFqz2x967iuVdT8M8LjhOV53/+E9ZSeY8FPkHLeL0F+
HsIurJKMjkg+vRzidEaEfR3Qg2v+TOLCVPxYf25Q76vWbZbn4VVCYDfo7Wwb
ly6/Wrq+712hIbeKIZW4/MAgZY3LRP0xSoiwkJhQmMnriNGWYlTHIk+ozsix
l7d1iepKfqZ1/Mxt+8ruUWMsE4UhJKNq0+JKNol61XSKpRx6xY1VcdW5xsII
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
+zfwUlpGYSSVNr7xEqkDXKmAbONXATJ40dpGs6RqLsn0nECrD9cKipa0Giet
7PsPXNa+o82cGWnXjP26yuzRKcEhETHE00/n+ytm2mV6zwpix4CZ/B2OY/fR
P6OpdwaoUeg+AzMnf9fsOlpQVbbqcmmoFivUj5EqY6sUO2SbMRdbAOCX0w+v
jNoNG2W9F6q5evG94DO4F4yMEJWjXXnbz54fXAX9a7TtXzEu4yE0BYOt7Z3d
Z89fvNzbLPv3Pdz4JdZrHCZXq7fxlyrVK3vlt9+RJNVSMGkuSg0co4wnSFuE
FabMwnSJk7YgTFalzJyY6yytoAk7fJXXoMwyGNWC5TuHVlUtyPEOKRv9J9IA
8klm9x7uo5pSdvn76MFJ2YY34ErQ2VxkpkhjtfLozIbXxjw6JF0jMKE2hU7x
jJkKvmqlytTGatPprE46nXuST6dUjkwgOIKmZnJkYgKumxwzexAlK6ac3RJ3
LZIP05AGkw9SJB2mIQsm7z/JS4eZkQWTD5KRDTMvCSYfw54NMysJJu+enwzz
XTi035dvk2G2yTClZwWSYVqu0eUUouaqE9D7Y3vvhd8Cq5Sxc9uec/PeJXtS
RBnL+2RV5cH0kZV5TtDcDCJEzRV3GDLLDErN5//V4B1Tw8025dopFnVEbUx0
q+oUXI7u/mCqX67LXiRzxcA82MC5KVQ2BDhvvHDKqjFiB6i49j9H+lct/ysd
xZB8ir1qPgHVUlNEmaO92ePm5ZASeeuclkh6jn2duy8UFsZicJS7HZa5Q2Ih
XPmxX/wmT/71b9Yu9xI4eTKugpMnRPKvAucVHyY6zKecgvqTjdlUOcrReiyj
kGCJrOwu9Dv8VEQN3JGfRaDOHp0iPgWjaYoTrhR3Q8JqQpK4zA3tCOFuHpbk
jJfLMj0sZKarpESzJ65bOiVl5K5DSuDmYxMxmNK342b1s/6AykKTXkYDZuQT
9UXNJmNTNooOs47MJ2QsYuuX3KvkQ8jdFTWKD7CGVJn+cAZlhEGEkajgRBgE
mWEj79a58pBZHvX7szgOzFYywhvYDNizkZOuqDWXW3NZegqayxkZnsqiUEz3
RLxN5v2xksTUaHkK5jD+2ayTPF9xw6ngWqHQCoVWKLRCYcFCYbOAUGAJOSzM
oSLLteJsTpJjXg5pW2641FHweGdzJwPN9yGRYJanuUysTRUXs+BVtq3M/DIa
Ctt7USrO8giVPI0kMYRSMcNAv3ADT4YDppbrpXgORL3EGGgh1rSH78J0tqZk
cPQ2AFMAiyUgYlcIqohQPxp54Vi+bOB7kgsm65iC0jihbxpBDOCsO1IzEHm/
nZ9/pnFm+Bw+QSsc+FRf8ODGbsq408sN2pzUoxTlrkM+DqTpcKD7dADe0MA4
LYmRPJ/FCn62pEjKWQ2p7XfXm4TudYAof/CvYHjt7vjDnZ2Bu33jJ36tEDWg
PWOImhDtiO/AtoFqRQLVMKZE1NUOV8scsQ1aa4PW5hm0psY90wC2upXhFM6C
PQlMyzM5IQr1kAz/vpwGsLX6l2f1qwxMTOBrQQtGH9IfYaM34BkQjX+LVS9c
VF+dSsFKLss2BMnOmDLCkf7omO8WFLMVwaq05jQoEoa0gKp3+RFMmjLXxjHd
n5MCPIU2jgk/bRyT+rRxTLXjmEqV+dGfJqJPyigoGaBkZ1Bkz1IinmoiuY14
kp57R3PwaGJmpcKmNCOTJzsob59mdlVPqA9aW7W1VevZqg0dQhuK0GmWgxot
slL0UvUQOtsEXmx5sXwNzaDqidBE/WkwdRGaA08rZ1DJZmcL1AvHXqzWq5Jr
KeMW+E49IyC+47CcEIhwXmFfVFr/bcGLspjIMIvfo6koMU2QibFepSRgRscc
+dfGabVScNFS8OcTfAutv7r80JMHHCNVPDdR01dyS/vCKwZJaVuxDZVaTKhU
ZZ9NxVApGTeKXsDAtBSGLa02r0IugfJ11Xjqy6z9YzhuQR3D0WyEs+1ajoSu
otkQ9hYMr/V/QhV259kajOVsbT5V2mQdBnFWJ+frTLN1lpwNnkUvmN4EwRhD
n4hHSRzWrVqwbtUKrDJVNcyKscIpGtsgqyJBVgRVjUZZZQ/Zhlm1YVaNh1np
aVobia46GsMiQNFPQtMzNJkhSXxFvgMWLzKpTVZ8yb62iCt8It0a8LoBz9Pw
1rLeydqYTfcAr2A+FhZmr2NaWPnwKgzlTx9fpXMkFlZlzh9dy54kyaIXYEyW
i44im6sNj2rDo/DThkfVe9rwKPrc4/ComrmKMEedU2YeTbvIGGWFY6PabFC2
p0ps1P0iOHg0AbOygVFEPVKUCOtJsLF1xvFvazjOzXDE5iLFRGpEYvsR4eH+
mI2LiXQi2HlYJ75tqBN55hfqRKimjXMyPUXinKz+h3mENxkM/Rw5JrXNk2Jt
FFMry+Yny35C8dUGLN3rgKWKRQlLJnViFQhFV/LikzrpW7ENWHqYuZ1k3Kg6
QG7E0jIDjypHTZWMWGLlvbP2T7Hzj+sgmAh6tibn2XMsauPS0TWoSEgPw7WZ
0Ni4xBPAt6bzQT4Aq+zkhwn+Hq55hcOA0D8T6i9UgSgYC1UnvghTWF6AEQ/0
FvTiNrDIGgWU0nD9iCLLWG0oURtK1HgoEVqKcTIKp40EEJ3TwUhdwELlBHkX
D1mwt8PI88XO69hoozAmCeXFxi1P6/kh1gplAK8AG84N0vECwep1bhDbHXoJ
WoYgYLaNZI7v40VgQFltcKMVbrDDm7HErdaXWauzKuIWG6yqFbacIBy2NpVC
bkr4OFfL+7ZoF5tNhYXG5xLLyIyqZ1U7QZpufKZ/HKM/9BkUhZzNVBzNfRsj
xtFHG/uxQJ1qLtT+bZ8XwiyYCRV3KePLIZxY/GU8U9zLrt4IXirB848Y15uS
iHWkc46EPPb0NzUA3qY8cvh2NoWD3kdE8CDDiAfEs4ETywePaYdSH30mfJMy
+RIeo97tNDCNun955O1fRifvvu2d7L/d/61/tfc2Oby+DODAtI56zOg7VYtT
2XdwePgBaW5Qdx67xzrA0gcRcGxcp5WUox31kBIMB84DJH/A1wZ3WZEtIA/j
82ESZ5ag9syuQNrQDNedJQp33/cbU7h/JQUWcO5oAHY2jdzLYAwSEAEwiKMR
gsIPv4X+zFPhhU4JDKEOm/Wg5u/QqK/wLDaQgr1B9JwLxjnX8fRKDkrENGNX
zmvnRyc1xMmP1IuOlk/8GzXtHn+8+Hz66f3p0dlZ19lwutxw7zY0txpTolMh
4yCBhnQtx/mVLARVELm+AopS8D3oz9D+uKu/LqCYXyAqqgT9Ieq8P5lQ8InH
7pXzz7862NY8DQZfwVB+4tB2J/89nR4MQzCSNzbw5hZ+QMwc7VTlh9+D3lUU
XetvkwiZElPnKaCAfUwEgyER0Age/8th1EOkjQ8Cnnio+xDhz/lyeoxNe7QF
vEvYe3g8HVoy8Ii/QOwpioZKWzqBtC158Qr/DSGkxwQo4jtAWz8mumT6buIl
yU0U++K7N04PD3Owf4DEFP0FT+vz0YmL2AziZb5zsO/0QYoNQNsIaMf+LJlG
o/NoEvZTdKCO0YS6GkkD5+Tv5+eIqlAz1PFOmBXDPpnSDfnLMp833J3s/HD+
Sj73+t/J/96twWevg9sN7I1jLWk/YuuJ89PBoMvNASF/Lw6UursM0+QFYVUX
Xhx7t5X2m3BQyLjgPgyGEMM2neHX42kw+tqxdoaf0QBPSH92UEQVY7TzKtbT
UJRLtFXRbNmoIfnmD7JZ1wTXOkK3EQ5tb6+xD+kbXDpdl3d7Zb+RwibE0wCR
13z5giy6J8jehFdPm2DQA4LHepJTXQyCTaKC0d/O0R8IQ2uCSJ0h7W4t9Yax
HcZC7PD+wDM8QuouVSaomYPHBownSB+6DBOkP4KmgWwnEGod+ZtAfWjcbm6o
YWYAIZLqdQcBB1TtIOZZPKwBCnezlASE6wfuOJq6VEGogxPAxQgJl2EFjHhD
uGJ766ZL3wggYVmkGB4kd2vAMhsns8kkihFqa4Ayi0Pi1q4DCvPU4/WugxZY
KvCdNgELjFVriVxyPLIKeIEiO03hpSocuNBPfZxgSejSXVkHJy49Q6sNS93F
cVYDkEYY3DQO4SinGhiM1dbHB/PajbxJWVDQKIy63H40Hgf9erKnBigMnHHE
IEEycSmgABQpCC491l4aVgCcHpz+ji8bYbJ1aEVAy1JAARgScqDq+nAuiqy+
24WCAhBwrZNCEsVu/8qDE8EgRlwl7C9+gf4ML3vBUsmWQsBwE4z9SYTMEIyc
4Qx47RKUa+4I53CB22wZgMDDqo25cUSidJYACIdhNkGoUFQUrwfxO72hN77u
dp7WtoAv4aT0QnKhMGO4hi8Fn79mO1RsTb52xN7EQSGa1rKbghz4cjcBMZi9
/hVxgkD8cQhRiTyJxt9YBxYCByEAXhXPBQZSMf2t8wYj3D6rSm4g0/efUtyZ
PRLKW/A2vFEQ2IRPhVAU1bvqu+V+pYf552RAlsqU5/TGI+MwMLzkyZU3CSga
aJdsEqSNVPJTXvMFZGPWWkJxJMsSWr4jeOo+pg5uMuqvSj4S5dCDt8o9+XDU
bUX66e63jHksluYapLZydJZHYjp16YS1kBU1eVTn4lJlZvkFPgOosRRSrgAB
pdL7rwDwSTgOR95Q/oWskPNk5E37V0FCQirAe81aOX9zcMOn8pfogqQlHYr5
w4WsyvSmce/5Lkc06drzkuD5Lj9XglP4xHkCR8u7z3dfOmdEK3Se0XX4LRjC
0TN29oJzl3YHZ7k7gYqm40uHjYU3Evvia/JnwysJFmgTuoGEbcjLZ9g2RXhp
9jj0XCa/ET6dkSmg2WOZhhehafxruLf/bsapCZ+NaDhWjLL9zlQ4vtNvcdIt
0LrRnnjaMQtP8QCmCYaX+IMLHpZSaUXO/MF7zFFAANDdC5P/1bEfpvNIGOAC
SLstj14E9/kV9Eashd/i6QAwpzzIhmLMHxDRJAEKuBMbCyQkvv5aG8GpwVwJ
uwe8+ymJr6SzeoPTNkFsGj+Le+Mwe9qF8DruPEDWNcxWHEkiqdDnYuJXFoSO
E2nkDNgAc+CxgFXVnWjiDpGGMSTxTnBcbwWZHiWmk4JAQYgowxqJ6PeBxhvM
3SBOGu1fefgeCzPMHzxtyofmrzqYMbz9cMS7O2Hav6PCRpatBwevP4TwBPQz
CbER2n9lcQ99ZFZCRCxEp0jvjr5Pwvj2cBZTWCkxwe8QDPYFG/FyP+orfMX+
gR0Gayw0Q3wJ0VU0bhZHVo2jcYD/8a9ZMr2J4usE/wXRLdfBLf53FPW6HXHK
bBuTv44PSbgyIXjZKZbOXn6PkHBHhpTf05Hll/IHBkMIemfDwl9fmRVAQn+j
OP05fZd+EboAFkD/wPPD5zYUGdNwQCYNIXYQnpO2AC91vRNNJmwpNlPg6LTT
F+mUKdAiWWukRhmah18ysrhbIxzhvzBlm8lY31B0ePJD+gXm2SOYpd3Yy6/p
55RfmDFC/8Sz4qyRegilIem7r+Jg9B0jDfKXPJQ3RYy3h+SaNBh/Kw3H37I4
Pva3OCR/eY6jLsjrdAx1NUR0Mby/xVdAsOOuA0sJcjiZxs56HFwG3ydO98mb
8On/+eemu+e5g68/Xt65/N+7pn9X8T3KQ21t3/2l26kQd8uiZbFIING29KYn
tl7weT/RJjiVjUisa4INDWCjPx6R27z4kgbEbtyRyFmIsO8A3rrwrWTi9YMu
o7uu0AW97JpyPolNCPYdzuA+CiNKY+FGTF+xfe4HRXiXKzPCS/DgBt5wenVh
7oRbCJcRAILfcAe4YSIBwpsLZRiUkQC29M7zBRCV1kL/3nnaxQE67qoXIbtR
D7Y+Pjd/5Qy8YaLdlezyg3VbAx6RQO52aL+TWWGqOPEmBrBRG9Jd/wG6MyED
M9p6ubmnzQI3UyUGtN7e3zrUM4nddbL+vpNH744CL0H4Aw35gkXiF0D9SdrN
YfH4Px/6t7dKo1/4607dHNjXnb0zhOUquUGEFdMXqiYS6X7tXiKxYsZfPSo/
qEvlmLJHgR8ihedCTGWSj8NjoasjIPTeIfGoFq121H9xFKsIew9XOeByKPYl
rHHzLlXLONhWidAlHu8LEJk5QocOD6JQljbZzEdkPCpfyeI5eatsWWFt7TZ1
+jGv2+Zmt8iqpKN1wSpFI437eajbTxtWxJz+40qhbqss6kbeeDZAA6H9HWPi
uyBXwnIQeSJ0w5TonJFu9wmt+0XRur1XGq2gQF+MZ6MePnIqglGscn/EPR42
MnfLIhMN40Oww0WMOB8ESxTD6G+0m3NKuz1stL4oi1YWQ1ISre9ot58Erc/L
ojW5TZC+dRH6OXg8w+0c9KGHibidQojTdCujVdANk89xkOg2gIpU8Et4/je4
i5dgzT8xGeSlscA0VWXokpQRJgc8ODd/GumZBr3Z2ehM0tEv6OhlVqvD/gvO
aOp9wreU4EZ3OTdSt4zbSvDMrCMErIOrqetg99V+/3oc3QwD/5IsDgKJiN/A
f93FWwXcXOfiTW8nDoaQ7gdYGIM2oS7bHrkZ/uMHdmzdrUHqqGTWv1pzbiDQ
I3Au4b7VYDaEGAo43fdm06soTshhf5h0+EdgnpPZFNLKQMMwJqkFIEwkGKAf
pySfDLmXjtoAKOjLfjCZoq957JL7DKfUGnnXAdyhgc+E03V8EZ59+QaXAxyG
qAWGyRtfO/tx6PxnEP///zcOxmvOgRcjnjN23oJdMkYvjoZhNHU+IJ14zTkJ
0UZGy3UK/xv7CLNrGMizOIy9kXMWXHsxngyZBAiN4CbBTSD5Bnau4lv1OOPO
FUQm+JBUJ46+BeoN+/8BPSTcH9kUBAA=

-->

</rfc>

