Get started
Quickstart
From an unopened box to a live capture stream in five steps and about five minutes.
Install the SDK
The SDK ships typed clients for Node 20+, Bun, and edge runtimes. A Python client with the same surface is published as
vexoringon PyPI.npm i @vexoring/sdkCreate an app
Open the developer dashboard and create an app. You get a client id and an app secret. Put the client id in your environment as
VEXO_CLIENT_ID. The secret stays server side, it never ships to a browser or a phone.Every capture, grant, and webhook you create is owned by this app. One app per product is the right shape.
Pair a ring
Set the ring on its charger. The charger LED cycles a six-digit pairing code. Pass it to the SDK and the ring binds to your app.
pair.tsimport { Vexo } from "@vexoring/sdk"; const vexo = new Vexo({ clientId: process.env.VEXO_CLIENT_ID }); // The six-digit code is on the charger LED right now. const device = await vexo.devices.pair({ code: "824-115" }); console.log(device.id); // "dev_7hq2m4" console.log(device.firmware); // "3.2.0"Request consent
Nothing flows yet. Data moves only after the wearer grants the scopes you ask for, so ask now and ask small.
consent.tsconst grant = await vexo.oauth.authorize({ scopes: ["captures:read", "biometrics:hrv"], }); // Resolves once the wearer approves on their phone. console.log(grant.token); // "vx_user_9f2k…" console.log(grant.scopes); // ["captures:read", "biometrics:hrv"]Stream your first capture
With an active grant, open the stream. Each event is a typed capture object carrying the signals your scopes cover.
stream.tsconst stream = vexo.captures.stream({ wearer: "wr_31d8" }); for await (const capture of stream) { console.log(capture.id, capture.signals); // "cap_01j8xq4v" { hr: 58, hrv: 61, temp: 36.4 } }That is the whole loop. The wearer moves, the ring samples, your handler runs.
Where next
Read Authentication to understand tokens, scopes, and revocation. Move to the Captures API for the full read-and-fan-out surface. Wire Webhooks when you want signed delivery instead of an open socket.
