Skip to content

Methods

Reference for all public methods on the CircadifySDK instance.

Runs the full measurement pipeline: camera access, face detection, frame capture, upload, and server-side inference. Returns a promise that resolves with the vital signs result.

const result = await sdk.measureVitals({
container: document.getElementById('scan-container'),
demographics: { age: 35, sex: 'M', fitzpatrick: 3 },
signal: abortController.signal,
ui: {
showFaceGuide: true,
showThermalGlow: true,
accentColor: '#00D4FF',
},
});

Parameters (MeasurementOptions):

NameTypeRequiredDescription
containerHTMLElementNoDOM element for the built-in scan UI. Omit for headless mode.
demographicsDemographicsNoUser demographics to improve accuracy.
signalAbortSignalNoCancel the measurement mid-scan via AbortController.
uiScanningUIOptionsNoCustomize the built-in scan UI appearance.

Demographics:

interface Demographics {
age?: number;
sex?: 'M' | 'F';
fitzpatrick?: 1 | 2 | 3 | 4 | 5 | 6;
}

UI Options:

OptionTypeDefaultDescription
showFaceGuidebooleantrueShow face oval overlay
showThermalGlowbooleantrueShow thermal glow animation during scan
showQualityIndicatorsbooleantrueShow quality status banner
accentColorstring'#00D4FF'Accent color for UI elements
borderRadiusstring'16px'Border radius for the video container

Returns: Promise<VitalSignsResult>

interface VitalSignsResult {
heartRate: number; // BPM (always present)
hrv?: number; // Heart rate variability (ms)
respiratoryRate?: number; // Breaths per minute
spo2?: number; // Blood oxygen saturation (%)
systolicBp?: number; // Systolic blood pressure (mmHg)
diastolicBp?: number; // Diastolic blood pressure (mmHg)
confidence: number; // 0-1 measurement reliability
sessionId: string; // Unique session identifier
timestamp: number; // Unix timestamp (ms)
}

Errors thrown:

Error CodeWhen
MISSING_API_KEYNo API key was provided
CAMERA_PERMISSION_DENIEDUser denied camera access
CAMERA_NOT_AVAILABLENo camera found on the device
CAMERA_IN_USECamera is already in use by another application
FACE_NOT_DETECTEDNo face found in the camera feed
FACE_DETECTION_TIMEOUTNo face detected within 30 seconds
QUALITY_TOO_LOWCapture quality was too poor to produce results
WASM_LOAD_FAILEDVision engine modules failed to load
BROWSER_NOT_SUPPORTEDBrowser lacks required APIs (WebAssembly, MediaDevices)
QUOTA_EXCEEDEDMonthly scan limit reached
RATE_LIMITEDHourly request limit exceeded
CANCELLEDThe AbortController signal was triggered
NETWORK_ERRORNetwork request failed (retryable)
UPLOAD_FAILEDUpload to cloud storage failed (retryable)
TIMEOUTPolling for results timed out (retryable)

Omit container to run without any UI. Use the onProgress and onQualityWarning callbacks to drive your own interface:

const sdk = new CircadifySDK({
apiKey: 'ck_test_your_key_here',
onProgress: (p) => updateProgressBar(p.phase, p.percent),
onQualityWarning: (w) => showWarning(w.message),
});
const result = await sdk.measureVitals();

Checks whether the device has a camera and camera permissions are available. Does not prompt the user for permission.

const hasCamera = await sdk.checkCameraAccess();
if (!hasCamera) {
showMessage('Camera not available on this device.');
}

Returns: Promise<boolean>

Returns information about the device’s camera support.

const capabilities = sdk.getDeviceCapabilities();
console.log(capabilities.hasCamera); // true
console.log(capabilities.hasFrontCamera); // true
console.log(capabilities.isSecureContext); // true (HTTPS)

Returns: DeviceCapabilities

interface DeviceCapabilities {
hasCamera: boolean;
hasFrontCamera: boolean;
isSecureContext: boolean;
mediaDevicesSupported: boolean;
maxResolution?: { width: number; height: number };
}

Cancels a measurement that is currently in progress. Equivalent to aborting the AbortController signal.

sdk.cancel();

The measureVitals() promise will reject with a CircadifyError with code CANCELLED.

Releases all resources: stops active camera streams, unloads WASM modules, and removes any UI elements.

sdk.destroy();

Call destroy() when the SDK is no longer needed — for example, on component unmount.

useEffect(() => {
const sdk = new CircadifySDK({ apiKey: 'ck_test_your_key_here' });
// ...use sdk
return () => sdk.destroy();
}, []);