{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://somatologics.com/docs/sdk/gnx_hsp_measurement_packet_schema_v1.json",
  "title": "GNX HSP Real Measurement Packet v1",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "partner_id",
    "device_id",
    "session_id",
    "actual_age",
    "input_source",
    "measurement_mode",
    "packet_id",
    "packet_created_at_ns",
    "alignment",
    "platform",
    "timestamps",
    "sensor",
    "license"
  ],
  "properties": {
    "partner_id": {
      "type": "string",
      "minLength": 3
    },
    "device_id": {
      "type": "string",
      "minLength": 3
    },
    "session_id": {
      "type": "string",
      "minLength": 3,
      "description": "Pseudonymous session identifier. No public identity."
    },
    "actual_age": {
      "type": "integer",
      "minimum": 10,
      "maximum": 100
    },
    "input_source": {
      "type": "string",
      "enum": ["device_sensor", "partner_api", "uploaded_sensor_packet"]
    },
    "measurement_mode": {
      "type": "string",
      "enum": ["device_measurement", "partner_measurement", "uploaded_measurement"]
    },
    "packet_id": {
      "type": "string",
      "minLength": 6
    },
    "packet_created_at_ns": {
      "type": "integer",
      "minimum": 1
    },
    "alignment": {
      "type": "object",
      "additionalProperties": false,
      "required": ["score", "axis_deviation_deg"],
      "properties": {
        "score": {
          "type": "number",
          "minimum": 0,
          "maximum": 100
        },
        "axis_deviation_deg": {
          "type": "number",
          "minimum": -45,
          "maximum": 45
        }
      }
    },
    "platform": {
      "type": "object",
      "additionalProperties": false,
      "required": ["unlock_status", "drop_mm"],
      "properties": {
        "unlock_status": {
          "type": "string",
          "enum": ["LOCKED", "UNLOCKED"]
        },
        "drop_mm": {
          "type": "number",
          "minimum": 0,
          "maximum": 30
        },
        "shock_absorption_mode": {
          "type": "string",
          "default": "KNEE_PROTECTIVE"
        }
      }
    },
    "timestamps": {
      "type": "object",
      "additionalProperties": false,
      "required": ["drop_time_ns", "response_time_ns"],
      "properties": {
        "drop_time_ns": {
          "type": "integer",
          "minimum": 1
        },
        "response_time_ns": {
          "type": "integer",
          "minimum": 1
        }
      },
      "description": "Server additionally enforces response_time_ns > drop_time_ns and Delta T range."
    },
    "sensor": {
      "type": "object",
      "additionalProperties": false,
      "required": ["piezo_peak_mv", "rms_mv", "jitter_ms"],
      "properties": {
        "piezo_peak_mv": {
          "type": "number",
          "minimum": 0
        },
        "rms_mv": {
          "type": "number",
          "minimum": 0
        },
        "jitter_ms": {
          "type": "number",
          "minimum": 0
        }
      }
    },
    "license": {
      "type": "object",
      "additionalProperties": false,
      "required": ["modules"],
      "properties": {
        "modules": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "string",
            "enum": ["DELTA_T", "NRA_BASIC", "ACTIVITY_INDEX", "AUDIT_SEAL", "LIFESTYLE_GUIDE"]
          }
        }
      }
    },
    "packet_quality": {
      "type": "object",
      "additionalProperties": true
    }
  }
}
