> For the complete documentation index, see [llms.txt](https://docs.anthriq.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.anthriq.com/bxi-studio/developer/overview/concepts/device-support.md).

# Device support

The SDK is device-agnostic. It discovers features from the connected device rather than carrying a list per product, so what an operation does is decided by what the device declares.

The SDK addresses two device types. Which one you have decides which features exist at all.

| Device type        | Covers                                | Transport                    |
| ------------------ | ------------------------------------- | ---------------------------- |
| `anthriq-instinct` | Instinct headsets and xSys amplifiers | WebSocket, default port 9250 |
| `ni-usb-daq`       | xBud                                  | In-process bridge stub       |

> **Note:** Instinct and xSys share the device type `anthriq-instinct`, so the type alone does not tell them apart. The difference is `motors`: Instinct positions its electrodes, xSys has them wired by hand and declares no `motors` feature. Branch on the capabilities response rather than on a product name.

> **Note:** xBud is addressed by the device type `ni-usb-daq`, which names the acquisition path rather than the product. Pass `ni-usb-daq` wherever a device type is required; xBud is the product it refers to.

## Compare declared features

Each device ships a manifest that the bridge serves through `system.get_capabilities`. This is the authoritative list.

{% tabs %}
{% tab title="Anthriq Instinct" %}
Motorised headset. See [Anthriq Instinct](/bxi-studio/developer/overview/devices/instinct.md).

| Feature      | Operations                                                             |
| ------------ | ---------------------------------------------------------------------- |
| `system`     | `get_capabilities`, `get_state`                                        |
| `registers`  | `read`, `write`                                                        |
| `motors`     | `read`, `move`, `stop`, `brake`, `calibrate`                           |
| `eeg`        | `add_stream`, `start_stream`, `stop_stream`, `remove_stream`, `stream` |
| `impedance`  | `add_stream`, `start_stream`, `stop_stream`, `remove_stream`, `stream` |
| `firmware`   | `get_partitions`, `boot_partition`, `start_update`, `update_progress`  |
| `auth`       | `get_status`, `sign_in`, `sign_out`                                    |
| {% endtab %} |                                                                        |

{% tab title="xSys" %}
Amplifier with externally wired electrodes. Same device type as Instinct, minus `motors`. See [xSys](/bxi-studio/developer/overview/devices/xsys.md).

| Feature      | Operations                                                             |
| ------------ | ---------------------------------------------------------------------- |
| `system`     | `get_capabilities`, `get_state`                                        |
| `registers`  | `read`, `write`                                                        |
| `eeg`        | `add_stream`, `start_stream`, `stop_stream`, `remove_stream`, `stream` |
| `impedance`  | `add_stream`, `start_stream`, `stop_stream`, `remove_stream`, `stream` |
| `firmware`   | `get_partitions`, `boot_partition`, `start_update`, `update_progress`  |
| `auth`       | `get_status`, `sign_in`, `sign_out`                                    |
| {% endtab %} |                                                                        |

{% tab title="xBud" %}
Addressed by the device type `ni-usb-daq`. See [xBud](/bxi-studio/developer/overview/devices/xbud.md).

| Feature        | Operations                                                                                  |
| -------------- | ------------------------------------------------------------------------------------------- |
| `system`       | `get_capabilities`, `get_state`, `scan_devices`                                             |
| `analog_input` | `configure`, `query`, `read_single`, `read_finite`, `start_stream`, `stop_stream`, `stream` |
| {% endtab %}   |                                                                                             |
| {% endtabs %}  |                                                                                             |

`system` is the only feature both device types share, and even there xBud adds `scan_devices` for enumerating attached hardware. Everything else is exclusive to one or the other.

## Address registers two ways

On `anthriq-instinct`, the eight register types are reachable either through the `registers` feature with a `type` field, or with the register type as the feature name. Both reach the same handler.

| Register type | Controls                                            |
| ------------- | --------------------------------------------------- |
| `synap`       | Per-channel configuration and gain                  |
| `nerv`        | ADC configuration and oversampling                  |
| `motor`       | Motor configuration                                 |
| `cms_drl`     | Common mode sense and driven right leg              |
| `features`    | Acquisition start and stop, automatic control flags |
| `definition`  | System-wide definition and lockdown                 |
| `routing`     | Signal routing                                      |
| `bucket`      | Data bucket configuration                           |

See [Configure channels](/bxi-studio/developer/overview/features/channels.md).

## Check support at runtime

Write against the capabilities document rather than against this table, so code keeps working when a device gains a feature.

{% tabs %}
{% tab title="Node.js" %}

```typescript
const capabilities = client.getCachedCapabilities();

if (capabilities.features.impedance) {
  await measureImpedance();
}

const canScan = capabilities.features.system?.operations.includes("scan_devices");
```

{% endtab %}

{% tab title="Python" %}

```python
capabilities = client.get_cached_capabilities()

if "impedance" in capabilities.features:
    await measure_impedance()

system = capabilities.features.get("system")
can_scan = bool(system and "scan_devices" in system.operations)
```

{% endtab %}
{% endtabs %}

The SDK already performs this check on every call. An operation the device does not declare returns a failed response naming what is available, and never reaches the device.

## Read device-declared values

Some behaviour is parameterised by values the device supplies in feature metadata, not by SDK constants. Contact quality thresholds are the clearest case: `impedance` metadata carries `contact_quality_good_max_ohms` and `contact_quality_moderate_max_ohms`, and the SDK classifies against those.

A device that omits them yields no verdict rather than a default one. See [Impedance measurement](/bxi-studio/developer/overview/concepts/impedance.md).

## Next steps

* [How the SDK talks to a device](/bxi-studio/developer/overview/concepts/architecture.md)
* [Read device information](/bxi-studio/developer/overview/get-started/device-info.md)
* [Acquire analog input](/bxi-studio/developer/overview/devices/xbud.md)
