# Device and System Capabilities

<figure><img src="https://2727122207-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxnN2A67918om1UthYWsF%2Fuploads%2FPJ7xa5XwlEZ0NWP5Qbpe%2Fblog-cover_new-capabilities.png?alt=media&#x26;token=456a8166-bfbc-4bcb-8d92-d102b39d1df9" alt="In the Seam API, capability flags inform your application about what features and behaviors each device supports."><figcaption></figcaption></figure>

Each device that you connect to Seam has a specific set of capabilities. These capabilities define the Seam API actions that you can use. For example, some devices support [remote unlock actions](https://docs.seam.co/latest/~/revisions/DFdrUdS2jQOnbJTNDT5a/capability-guides/smart-locks/lock-and-unlock), while others support [programming access codes](https://docs.seam.co/latest/~/revisions/DFdrUdS2jQOnbJTNDT5a/capability-guides/smart-locks/access-codes). Some devices support both of these capabilities. When developing your application, it is imperative to be able to identify the capabilities of each device.

For example, if a device supports programming online access codes, your app can present the [`CreateAccessCodeForm` Seam Component](https://docs.seam.co/latest/~/revisions/DFdrUdS2jQOnbJTNDT5a/ui-components/overview/react-components/create-access-code-form) to your user. On the other hand, if a connected device does not support the remote unlock action, you'll likely want to disable or not display the unlock functionality for your app user.

## Capability Flags

Capability flags inform your application about what features and behaviors each device supports. That is, you can use capability flags to match devices to the requirements for operations within your app. These flags also compare the capabilities of a specific device instance with those of the device model in general.

<figure><img src="https://2727122207-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxnN2A67918om1UthYWsF%2Fuploads%2FBOjmsKyho43NZqREZ1hU%2Fcapability-flags-explained-online-access-code.png?alt=media&#x26;token=cf17c312-6cac-439d-bdee-e1a09275710e" alt="Capability flags help you to understand which actions a device can perform." width="563"><figcaption><p>Capability flags help you to understand which actions a device can perform.</p></figcaption></figure>

All capability flags share the following behavior:

* If `true`, the device has this capability, and this capability is functional on this device instance.
* If `true`, the device has this capability, and this capability is functional on this device instance.
* If `false`, the device has this capability, but the capability is not currently functional.

  See the device [errors](https://docs.seam.co/latest/~/revisions/DFdrUdS2jQOnbJTNDT5a/api/devices#device-error-types) and [warnings](https://docs.seam.co/latest/~/revisions/DFdrUdS2jQOnbJTNDT5a/api/devices#device-warning-types) for more details about the cause of this issue. You can also examine the [properties](https://docs.seam.co/latest/~/revisions/DFdrUdS2jQOnbJTNDT5a/api/devices#device-properties) of the device and [events](https://docs.seam.co/latest/~/revisions/DFdrUdS2jQOnbJTNDT5a/api/events#event-types) related to the device to learn more about the cause of this issue.
* If not present, the device does not have this capability.

Reasons why a capability flag might be `false` could include that the device is currently offline or that a required hardware accessory is not connected to the device.

<figure><img src="https://2727122207-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxnN2A67918om1UthYWsF%2Fuploads%2F74ISqbHvVapkUrDZCcoE%2Fcapability-flags-explained-remote-unlock.png?alt=media&#x26;token=1644eba5-7d24-473a-85ab-23e214a6dd66" alt="Capability flags help you to understand why a device cannot currently perform an action." width="563"><figcaption><p>Capability flags help you to understand why a device cannot currently perform an action.</p></figcaption></figure>

Seam recommends adding capability checks before performing specific actions in your app. For example, before performing a [remote unlock](https://docs.seam.co/latest/~/revisions/DFdrUdS2jQOnbJTNDT5a/smart-locks/lock-and-unlock#unlocking-a-door) operation, you can check to make sure that the target device supports remote unlocking. For details and code samples, see the corresponding [capability guides](https://github.com/seamapi/docs/blob/main/docs/capability-guides/broken-reference/README.md).

{% hint style="info" %}
In addition to viewing the capabilities for a specific device, you can also view the capabilities for a provider using [List Device Providers](https://docs.seam.co/latest/~/revisions/DFdrUdS2jQOnbJTNDT5a/api/devices/list_device_providers). If at least one supported device from a provider has a specific capability, the corresponding capability flag is `true`.
{% endhint %}

<table><thead><tr><th width="204">Property</th><th width="128.33333333333331">Type</th><th>Description</th></tr></thead><tbody><tr><td><code>device.can_remotely_unlock</code></td><td>Boolean<br><em>Optional</em></td><td>Indicates whether the device can perform a <a href="smart-locks/lock-and-unlock">remote unlock operation</a>.</td></tr><tr><td><code>device.can_remotely_lock</code></td><td>Boolean<br><em>Optional</em></td><td>Indicates whether the device can perform a <a href="smart-locks/lock-and-unlock">remote lock operation</a>.</td></tr><tr><td><code>device.can_program_online_access_codes</code></td><td>Boolean<br><em>Optional</em></td><td>Indicates whether the device can <a href="smart-locks/access-codes">program online access codes</a>.<br>If <code>true</code>, it is currently possible to create new online access codes for the device, and Seam programs the device the next time it's online.</td></tr><tr><td><code>device.can_program_offline_access_codes</code></td><td>Boolean<br><em>Optional</em></td><td>Indicates whether the device can <a href="smart-locks/access-codes/offline-access-codes">program offline access codes</a>.<br>When this flag is <code>true</code>, Seam can generate an offline code for this device, regardless of the current online status of the device.</td></tr><tr><td><code>device.can_hvac_heat</code></td><td>Boolean<br><em>Optional</em></td><td>Indicates whether the thermostat device (in conjunction with the associated HVAC system) supports <a href="thermostats/understanding-thermostat-concepts/hvac-mode">heat mode</a>.<br>When this flag is <code>true</code>, you can <a href="../thermostats/configure-current-climate-settings#set-a-thermostat-to-heat-mode">set the thermostat to heat mode</a>.</td></tr><tr><td><code>device.can_hvac_cool</code></td><td>Boolean<br><em>Optional</em></td><td>Indicates whether the thermostat device (in conjunction with the associated HVAC system) supports <a href="thermostats/understanding-thermostat-concepts/hvac-mode">cool mode</a>.<br>When this flag is <code>true</code>, you can <a href="../thermostats/configure-current-climate-settings#set-a-thermostat-to-cool-mode">set the thermostat to cool mode</a>.</td></tr><tr><td><code>device.can_hvac_heat_cool</code></td><td>Boolean<br><em>Optional</em></td><td>Indicates whether the thermostat device (in conjunction with the associated HVAC system) supports <a href="thermostats/understanding-thermostat-concepts/hvac-mode">heat-cool (auto) mode</a>.<br>When this flag is <code>true</code>, you can <a href="../thermostats/configure-current-climate-settings#set-a-thermostat-to-heat-cool-mode">set the thermostat to heat-cool mode</a>.</td></tr><tr><td><code>device.can_turn_off_hvac</code></td><td>Boolean<br><em>Optional</em></td><td>Indicates whether the thermostat device (in conjunction with the associated HVAC system) supports <a href="thermostats/understanding-thermostat-concepts/hvac-mode">off mode</a>.<br>When this flag is <code>true</code>, you can <a href="../thermostats/configure-current-climate-settings#turn-off-heating-and-cooling">set the thermostat to "off" mode</a>, which turns off both the heating and cooling systems for the space.</td></tr></tbody></table>

{% hint style="info" %}
Seam is actively developing additional capability flags to provide you with even more robust capability checking abilities for your app. If you would like us to add a specific capability flag, contact <support@seam.co>.
{% endhint %}

***

## Next Steps

To learn about the actions that you can perform using the Seam API, see the Seam capability guides. These guides provide helpful tutorials and code samples, categorized by capability types.

* [Smart locks](https://docs.seam.co/latest/~/revisions/DFdrUdS2jQOnbJTNDT5a/capability-guides/smart-locks), including [locking/unlocking](https://docs.seam.co/latest/~/revisions/DFdrUdS2jQOnbJTNDT5a/capability-guides/smart-locks/lock-and-unlock) and [managing access codes](https://docs.seam.co/latest/~/revisions/DFdrUdS2jQOnbJTNDT5a/capability-guides/smart-locks/access-codes)
* [Access control systems](https://docs.seam.co/latest/~/revisions/DFdrUdS2jQOnbJTNDT5a/capability-guides/access-systems)
* [Thermostats](https://docs.seam.co/latest/~/revisions/DFdrUdS2jQOnbJTNDT5a/capability-guides/thermostats)
* [Noise sensors](https://docs.seam.co/latest/~/revisions/DFdrUdS2jQOnbJTNDT5a/capability-guides/noise-sensors)
* [Mobile access](https://docs.seam.co/latest/~/revisions/DFdrUdS2jQOnbJTNDT5a/capability-guides/mobile-access)
* [Seam Bridge](https://docs.seam.co/latest/~/revisions/DFdrUdS2jQOnbJTNDT5a/capability-guides/seam-bridge)
