Scan results

What a scan produces, field by field, with units. You get this as a ScanResult on the device (from startScan), and — if results delivery is on — as the same fields in JSON at your backend.

Measurements

FieldUnitNotes
bodyFatPercent%Always present
bmikg/m²Optional
leanMuscleMassKgkgOptional
boneMineralContentKgkgOptional
durationsecondsCapture time; optional

Girths

FieldUnit
neckCmcm
waistCmcm (natural waist)
lowerWaistCmcm (belly / lower waist)
hipCmcm

Advanced indicators

FieldUnitNotes
waistHipRatioratio
waistHeightRatioratio
centralAdiposityIndexindex
fatMassIndexkg/m²
skeletalMuscleIndexkg/m²Optional
musclePreservationIndex%Optional; needs prior scans

The whole shape

Optional fields may be absent (null in JSON, nil in Swift). The point cloud stays on the device — it is never in the delivered payload.

A scan result
{
  "scanId": "scan_a7a4cc15-...",
  "occurredAt": "2026-09-16T15:01:03Z",
  "modelVersion": "2026.09.2",
  "subject": { "gender": "female", "ageYears": 37, "heightCm": 165.1, "weightKg": 58.97 },
  "measurements": {
    "bodyFatPercent": 28.9,
    "bmi": 21.6,
    "leanMuscleMassKg": 39.2,
    "boneMineralContentKg": 2.61,
    "girths": { "neckCm": 34.2, "waistCm": 80.9, "lowerWaistCm": 81.4, "hipCm": 94.2 },
    "advanced": {
      "waistHipRatio": 0.86, "waistHeightRatio": 0.49,
      "centralAdiposityIndex": 0.3, "fatMassIndex": 6.3,
      "skeletalMuscleIndex": 14.4, "musclePreservationIndex": null
    },
    "duration": 48.2
  }
}

To receive this at your backend, see Results delivery.