Skip to main content
The Neurofit Vitals SDK is designed to be straightforward to integrate, but you may have questions about how it works, what platforms it supports, and what to expect from scan results. The answers below cover the most common topics raised by developers during evaluation and active development.
No. Every step of the measurement pipeline runs entirely on the user’s device. No camera frames, raw PPG signals, or computed results are transmitted to Neurofit or any third-party server. Your users’ biometric data belongs to you and never leaves the device.
No. The scan pipeline requires the physical rear-facing camera and the device flash to illuminate the fingertip. Simulators do not expose real camera hardware, so the scan cannot run. Always test on a physical iOS or Android device connected to your development machine.
When the SDK cannot produce a result that meets its internal quality threshold, it sets the qualityTier field to .withheld (Swift) or QualityTier.WITHHELD (Kotlin). In this state, the heart rate, HRV, and respiration rate metric fields are not populated. Your app should detect this tier and present the user with a clear retry prompt explaining that the scan did not capture a clean signal.
The most common causes are:
  • Incomplete coverage — the finger is not fully covering both the camera lens and the flash
  • Excessive movement — motion artefacts corrupt the PPG signal
  • Incorrect pressure — pressing too hard blanches the capillaries; too little pressure lets in ambient light
  • Dry skin — very dry fingertip skin reduces optical contact quality
  • Ambient light interference — bright external light overwhelming the flash signal
The SDK provides real-time on-screen guidance during the 60-second scan to help the user self-correct each of these conditions before the session ends.
  • iOS: 15.0 or later
  • Android: API level 24 (Android 7.0 Nougat) or later
Devices running older OS versions will not be able to load the SDK. You should gate the scan feature in your UI accordingly and communicate the requirement to users on unsupported devices.
The Neurofit Vitals SDK adds under 1 MB to your app’s download size. The binary is optimised for size and ships only the signal-processing logic needed for on-device measurement — no bundled model weights or large asset catalogs.
Yes, on both platforms:
  • iOS: A VitalsScanView is provided for SwiftUI alongside the UIKit VitalsScanViewController. Both surfaces expose the same delegate/callback API.
  • Android: The SDK ships a VitalsScanComposable wrapper for Jetpack Compose in addition to the traditional VitalsScanActivity and Fragment API.
Choose whichever surface matches your existing UI architecture — the underlying scan engine is identical.
No. The Neurofit Vitals SDK is intended to help wellness app developers measure biometric signals for general wellbeing and self-monitoring purposes. It is not designed, cleared, or intended for the diagnosis, treatment, cure, or prevention of any medical condition. Do not position SDK-derived measurements as clinical or diagnostic outputs in your app’s marketing or UI copy.
Reach out to the Neurofit team directly to discuss renewal timelines or to explore upgrading from a Binary license to a Source license. You can book a conversation at the link below — no long forms required.Schedule a licensing call →
Respiration rate is confidence-gated: if the respiratory component of the PPG signal was not strong enough during the session to produce a reliable value, the SDK returns nil (Swift) or null (Kotlin) rather than surfacing a potentially inaccurate number. This is expected behaviour and does not indicate a failed scan — the heart rate and HRV results are unaffected. Treat a nil/null breathing rate as “not measured this session” and omit it from your UI rather than showing a placeholder.
Yes. The SDK works on any iOS or Android device that meets the OS version requirement and has a functional rear camera with flash, including iPads and Android tablets. The scan UI scales to larger screen sizes automatically.
No. Only one scan session should be active at any given time. If your app flow could trigger a second scan before the first has finished, ensure you explicitly complete or cancel the active session before initialising a new one. Running overlapping sessions produces undefined behaviour.