Skip to Content
Hardware IntegrationOverview

Introduction

Developer-focused documentation for integrating OneKey hardware in Web and Native apps. This guide covers SDK installation, initialization, device discovery, UI prompts, and your first signing call.

Choose Your Transport

USB integrations should use @onekeyfe/hd-common-connect-sdk; use @onekeyfe/hd-web-sdk only when the host mandates an iframe/plugin setup.

Connection Methods

MethodDescriptionSupported devices
USB / WebUSBWired USB; Web via WebUSB, native via low-level pluginAll OneKey devices
Bluetooth BLE (native)Native apps over BLE (not Web Bluetooth); requires OS Bluetooth & permissionOneKey Pro, Touch, Classic 1s / Classic 1s Pure; Mini does not support BLE
Air-Gap (QR)Offline QR signingOneKey Pro only

Platform Guide

Platform (Stack)TransportSDK PackageGuide
Web (Browser)WebUSB@onekeyfe/hd-common-connect-sdk WebUSB Connection Guide
React NativeBLE@onekeyfe/hd-ble-sdk React Native BLE
Android (Native)BLE@onekeyfe/hd-common-connect-sdk Android BLE
iOS (Native)BLE@onekeyfe/hd-common-connect-sdk iOS BLE
FlutterBLE@onekeyfe/hd-common-connect-sdk Flutter BLE

Low-level protocol and custom channels: Low-Level Transport Plugin & Protocol

Install SDK

Pick one entry by runtime:

# Web / desktop WebUSB (recommended) npm i @onekeyfe/hd-common-connect-sdk # React Native BLE npm i @onekeyfe/hd-ble-sdk # Native host with low-level plugin (Android/iOS/Flutter bridge) npm i @onekeyfe/hd-common-connect-sdk # Plugin iframe host only (plugin-only) npm i @onekeyfe/hd-web-sdk

Transport details:

Initialize the SDK

Use the initialization method that matches your runtime—avoid mixing SDK entries.

Web / Desktop WebUSB

Use @onekeyfe/hd-common-connect-sdk:

import HardwareSDK from '@onekeyfe/hd-common-connect-sdk'; await HardwareSDK.init({ env: 'webusb', debug: process.env.NODE_ENV !== 'production', fetchConfig: true, });

React Native BLE

Use @onekeyfe/hd-ble-sdk:

import HardwareSDK from '@onekeyfe/hd-ble-sdk'; await HardwareSDK.init({ debug: __DEV__, });

Native Bridge / Low-level

Use @onekeyfe/hd-common-connect-sdk:

import HardwareSDK from '@onekeyfe/hd-common-connect-sdk'; await HardwareSDK.init({ env: 'lowlevel', debug: process.env.NODE_ENV !== 'production', fetchConfig: true, });
EnvironmentUse Case
webusbBrowser WebUSB (no iframe)
lowlevelNative apps bridging JS via low-level adapter
react-nativeCustom RN bridge or Electron BLE
emulatorBuilt-in emulator transport

Plugin Iframe Host

Use @onekeyfe/hd-web-sdk (plugin-only):

import { HardwareSDK } from '@onekeyfe/hd-web-sdk'; await HardwareSDK.init({ debug: process.env.NODE_ENV !== 'production', connectSrc: 'https://jssdk.onekey.so/1.1.19/', // iframe host });

Bind Events

Set up event listeners for device connection and UI prompts:

import { UI_EVENT, UI_REQUEST, DEVICE } from '@onekeyfe/hd-core'; HardwareSDK.on(UI_EVENT, async (message) => { switch (message.type) { case UI_REQUEST.REQUEST_PIN: // Handle PIN entry (see below) break; case UI_REQUEST.REQUEST_PASSPHRASE: // Handle passphrase entry (see below) break; } }); HardwareSDK.on(DEVICE.CONNECT, (payload) => console.log('Connected:', payload)); HardwareSDK.on(DEVICE.DISCONNECT, (payload) => console.log('Disconnected:', payload));

Discover Devices

WebUSB Authorization (Browser)

import { ONEKEY_WEBUSB_FILTER } from '@onekeyfe/hd-shared'; // Trigger browser's device chooser await navigator.usb.requestDevice({ filters: ONEKEY_WEBUSB_FILTER });

Search Devices

const result = await HardwareSDK.searchDevices(); if (!result.success) throw new Error(result.payload.error); const devices = result.payload; // [{ connectId, deviceId?, name, deviceType, ... }]

Get Device Features

Resolve device_id from connectId (required for BLE connections):

const features = await HardwareSDK.getFeatures(connectId); if (!features.success) throw new Error(features.payload.error); const deviceId = features.payload.device_id;

Important: connectId is stable for the same device (reset does not change it); device_id changes after reset/recovery and must be refreshed via getFeatures.

Handle PIN Entry

When a protected call is made and the device is locked, handle REQUEST_PIN:

import { UI_RESPONSE } from '@onekeyfe/hd-core'; // Option 1: Enter on device (recommended) await HardwareSDK.uiResponse({ type: UI_RESPONSE.RECEIVE_PIN, payload: '@@ONEKEY_INPUT_PIN_IN_DEVICE' }); // Option 2: Software blind PIN (not supported on Pro/Touch) await HardwareSDK.uiResponse({ type: UI_RESPONSE.RECEIVE_PIN, payload: userInputPin // e.g., '1234' });

Note: OneKey Pro and Touch devices only support on-device PIN entry.

Handle Passphrase

For hidden wallet access, handle REQUEST_PASSPHRASE:

// Option 1: Enter on device (most secure) await HardwareSDK.uiResponse({ type: UI_RESPONSE.RECEIVE_PASSPHRASE, payload: { passphraseOnDevice: true, value: '' } }); // Option 2: Software input with optional session cache await HardwareSDK.uiResponse({ type: UI_RESPONSE.RECEIVE_PASSPHRASE, payload: { value: userPassphrase, passphraseOnDevice: false, save: true } });

To force standard wallet (skip passphrase), add useEmptyPassphrase: true to any method call.

First Signing Call

Example: Sign an EVM message (EIP-191 personal_sign):

const message = 'Hello OneKey'; const messageHex = Buffer.from(message).toString('hex'); const res = await HardwareSDK.evmSignMessage(connectId, deviceId, { path: "m/44'/60'/0'", messageHex, chainId: 1, }); if (!res.success) throw new Error(res.payload.error); console.log('Address:', res.payload.address); console.log('Signature:', res.payload.signature);

Device and Transport Compatibility

Support status for Bluetooth, USB, and Air-Gap connections

DeviceBluetoothUSBAir-Gap
OneKey Classic 1s
OneKey Classic 1s
OneKey Classic 1s
SupportedSupportedN/A
OneKey Classic 1s Pure
OneKey Classic 1s Pure
Battery-free edition
SupportedSupportedN/A
OneKey Mini
OneKey Mini
Compact USB-only wallet
N/ASupportedN/A
OneKey Touch
OneKey Touch
Full touchscreen experience
SupportedSupportedN/A
OneKey Pro
OneKey Pro
Premium with fingerprint security
SupportedSupportedSupported

Air-Gap Mode: OneKey Pro supports air-gapped signing via QR codes — no USB or Bluetooth connection required, providing the highest level of security. See Air-Gap Integration for details.

Core Packages

PackagePurposeNPMVersion
@onekeyfe/hd-common-connect-sdkUnified SDK surface for Web/Native; recommended entry for transportsnpm npm
@onekeyfe/hd-ble-sdkPure React Native BLE stack (recommended for RN projects)npm npm
@onekeyfe/hd-transport-react-nativeReact Native transport side-effects/bridgenpm npm
@onekeyfe/hd-transport-web-deviceWeb transport for device access in web contextsnpm npm
@onekeyfe/hd-transport-emulatorEmulator transport (develop and test without a physical device)npm npm
@onekeyfe/hd-transport-httpHTTP bridge transportnpm npm
@onekeyfe/hd-transport-lowlevelLow-level host adapter contract (for native integrations)npm npm
@onekeyfe/hd-coreCore events, constants, message wiringnpm npm
@onekeyfe/hd-sharedShared utilities and typesnpm npm
@onekeyfe/hd-web-sdkWeb SDK wrapper (not recommended; prefer hd-common-connect-sdk)npm npm

API References

Concepts and Advanced Topics

Support

For users: This documentation is primarily for developers. If you encounter issues while using our products, please consult our Help Center or submit a support ticket.


Try It Out

Last updated on