Skip to content

Data Model

The OpenET data model defines standardized objects for representing eye-tracking data across devices, APIs, and storage formats. These schemas are designed to be compatible with existing research standards such as Eye-tracking-BIDS, while also supporting real-time streaming APIs and device interoperability. Please use Gdocs/itHub PRs, issues, or discussions to contribute or suggest changes.


Geom

Geom layer defines reusable geometric primitives, which serve as reusable blocks for all spatial representations

Coordinate

JSON Schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Coordinate",
  "description": "Cartesian coordinate represented as [x, y] or [x, y, z] in the coordinate system specified in the corresponding metadata for the signal.",
  "type": "array",
  "prefixItems": [
    {
      "type": "number",
      "description": "X coordinate representing the horizontal position."
    },
    {
      "type": "number",
      "description": "Y coordinate representing the vertical position."
    },
    {
      "type": "number",
      "description": "Z coordinate representing depth or distance along the third axis (optional)."
    }
  ],
  "minItems": 2,
  "maxItems": 3
}

Vector

JSON Schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Vector",
  "description": "Vector represented as [x, y] or [x, y, z] components describing direction or displacement in the coordinate system specified in the corresponding metadata.",
  "type": "array",
  "prefixItems": [
    {
      "type": "number",
      "description": "X component of the vector."
    },
    {
      "type": "number",
      "description": "Y component of the vector."
    },
    {
      "type": "number",
      "description": "Z component of the vector (optional)."
    }
  ],
  "minItems": 2,
  "maxItems": 3
}

Angle

JSON Schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Angle",
  "description": "Angular direction represented as [yaw, pitch] or [yaw, pitch, roll] in degrees. If the eye tracker uses [azimuth, elevation] instead of [yaw, pitch], replace yaw with azimuth and pitch with elevation, maintaining the same order.",
  "type": "array",
  "prefixItems": [
    {
      "type": "number",
      "description": "Yaw angle representing horizontal rotation."
    },
    {
      "type": "number",
      "description": "Pitch angle representing vertical rotation."
    },
    {
      "type": "number",
      "description": "Roll angle representing torsional rotation (optional)."
    }
  ],
  "minItems": 2,
  "maxItems": 3
}

Metadata

The metadata layer adds essential context, describing acquisition setups (hardware, session) and data organization (columns, signals).

Column

JSON Schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Column",
  "type": "object",
  "required": ["Name", "Description", "Units"],
  "properties": {
    "Name": {
      "type": "string",
      "description": "Name of the column field",
      "example": "x_coordinate"
    },
    "LongName": {
      "type": "string",
      "description": "Long (unabbreviated) name of the column.",
      "example": "Gaze position (x)"
    },
    "Description": {
      "type": "string",
      "description": "Free-form natural language description. The description of the column.",
      "example": "Gaze position x-coordinate of the recorded eye, in the coordinate units specified in this metadata."
    },
    "Units": {
      "type": "string",
      "description": "Measurement units for the associated variable. SI units in CMIXF formatting are recommended. Use 'NA' for normalised or dimensionless values.",
      "examples": ["pixel", "visual-angle", "NA"]
    },
    "Origin": {
      "type": "string",
      "description": "Reference point from which the values in this column are measured or defined.",
      "examples": ["System startup", "recording start", "coordinate origin", 0]
    },
    "Format": {
      "type": "string",
      "description": "Permitted formats for values in the described column.",
      "examples": ["string", "number", "integer", "boolean", "datetime", "uri"]
    },
    "Levels": {
      "type": "array",
      "description": "For categorical variables: An object of possible values (keys) and their descriptions (values)."
    },
    "Delimiter": {
      "type": "string",
      "description": "If rows in a column may be interpreted as a lists of values, the character that separates one value from the next."
    },
    "Maximum": {
      "type": "number",
      "description": "Maximum value a column entry is permitted to have."
    },
    "Minimum": {
      "type": "number",
      "description": "Minimum value a column entry is permitted to have."
    },
    "extensions": {
      "type": "object",
      "additionalProperties": true
    }
  }
}

Hardware

JSON Schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Hardware",
  "type": "object",
  "required": ["Manufacturer", "ManufacturersModelName"],
  "properties": {
    "Manufacturer": {
      "type": "string",
      "examples": ["EyeLink", "Apple"]
    },
    "ManufacturersModelName": {
      "type": "string",
      "examples": ["EYELINK II CL v4.56 Aug 18 2010", "Macbook Pro M2"]
    },
    "FirmwareVersions":{
      "type": "string",
      "description": "[NEW] Current firmware version installed on the device hardware (the built-in software running inside the device). This is separate from external software versions running on the host computer or mobile device, such as experiment software or companion applications. Software versions are part of the session object.",
      "examples": ["MacOS 26 Tahoe Safari 26", "Windows 11", "Android 16"]
    },
    "SupportedModes": {
      "type": "array",
      "description": "Eye-tracking modes supported by the hardware, indicating whether gaze data is derived from one eye, both eyes independently, or a combined cyclopean estimate.",
      "items": {
        "type": "string",
        "enum": ["monocular", "binocular", "cyclopean"]
      },
      "example": ["binocular", "cyclopean"]
    },
    "SupportedSamplingRates": {
      "type": "array",
      "description": "[NEW] Data sampling frequencies supported by the hardware. Sampling frequencies may differ for different data signals, in which case a separate entry should be provided for each data type (gaze, video, motion, etc.).",
      "example": [{ "dataType": "gaze",
                    "unit": "Hz",
                    "rates": [60, 200, 500]},
                  { "dataType": "Video",
                    "unit": "fps",
                    "rates": [30, 60]},
                  { "dataType": "imu",
                    "unit": "Hz",
                    "rates": [100, 200, 400]}]},
    "SupportedCoordinateSystems": {
      "type": "array",
      "description": "[NEW] possible coordinate systems for the spatial data produced by hardware. Elements can also contain the dataType corresponding to each coordinate system",
      "example": ["screen", "world", "head", "eye"]
    },
    "SupportedCalibrationTypes": {
      "type": "string",
      "description": "[NEW] brief description of the supported calibration methods for the hardware."
    },
    "extensions": {
      "type": "object",
      "additionalProperties": true
    }
  }
}

Session

JSON Schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Session",
  "type": "object",
  "required": ["DeviceSerialNumber", "SessionStatus"],
  "properties": {
    "DeviceSerialNumber": {
      "type": "string",
      "description": "Unique identifier for the eye tracking device."
    },    
    "SessionStatus": {
      "type": "string",
      "enum": ["recording", "completed", "canceled"],
      "description": "Current status of the recording session."
    },
    "SoftwareVersions": {
      "type": "string",
      "description": "Version of the external software(s) used to operate or communicate with the device.",
      "examples": ["SREB1.10.1630 WIN32 LID:F2AE011 Mod:2017.04.21 15:19 CEST", "WebGazer"]
    },
    "StartTime": {
      "type": "integer",
      "description": "Start time in seconds in relation to the start of acquisition of the first data sample in the session (negative values are allowed). This data MAY be specified with sub-second precision using the syntax s[.000000], where s reflects whole seconds, and .000000 reflects optional fractional seconds.",
      "example": -2532
    },
    "EndTime": {
      "type": "integer",
      "description": "End time in seconds, only if SessionStatus == 'completed' or 'canceled'. This property follows the same conventions as StartTime",
      "example": 2532
    },
    "Duration": {
      "type": "integer",
      "description": "Duration of the session that can also be calculated with EndTime-StartTime. For SessionStatus == 'recording' this will be the ongoing duration i.e. current time - StartTime",
      "example": 2532
    },
    "PhysioType": {
      "const": "eyetrack",
      "description": "Const property for upstream compatiblity with BIDS"
    },
    "RecordedEye":{
      "type": "string",
      "enum": ["left", "right", "both", "cyclopean"],
      "description": "Indicates the eye being tracked. Left = left eye ONLY, right = right eye ONLY, both = left and right SEPARATELY, and cyclopean = combining (e.g., averaging) both eyes. The value should be consistent with the SupportedModes in hardware object."
    },
    "EyeTrackerDistance":{
      "type": "number",
      "description": "Distance (in centimeters) between the eye-tracker and the participant eye(s). A value of 0 can be assigned for head-worn eye-trackers."
    },
    "EyeTrackingMethod": {
      "type": "string",
      "description": "Method used to track gaze or pupil position: 'DL' for deep-learning based methods, 'REG' for regression based methods, 'P–CR' for video based eye-tracking using pupil and corneal reflection; 'DPI' for Dual-Purkinje Imaging system, 'SSC' for scleral search coils; 'EOG' for electro-oculogram; 'Limbus' for trackers estimating limbus borders between the iris and sclera, 'OAE' for Otoacoustic emmisions; or other."
    },
    "PupilFitMethod": {
      "type": "string",
      "description": "The method employed for fitting the pupil, for example 'centre-of-mass' or 'ellipse'. If 'centre-of-mass' or 'ellipse' method is used, it is RECOMMENDED to use these exact labels."
    },
    "InterEyeDistance": {
      "type": "number",
      "description": "[NEW] Some eye-trackers use the inter-eye distance of the user as a parameter in their prediction algorithm. Whether this is supplied by the user, or assumed as a default by the eye-tracker, it should be supplied in the meta data for an experimenter."
    }, 
    "Signals": {
      "type": "array",
      "description": "List of metadata objects for each data signal provided by the eye-tracker.",
      "items": {"$ref": "./metadata.signals.json"}
    },
    "extensions": {
      "type": "object",
      "additionalProperties": true
    }
  }
}

Signals

JSON Schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Signal",
  "type": "object",
  "required": ["Name", "SamplingFrequency", "SampleCoordinateSystem", "Columns"],
  "properties": {
    "Name": {
      "type": "string",
      "enum": ["gaze", "pupil", "blink", "eyeball"]
    },
    "SamplingFrequency": {
      "type": "number",
      "minimum": 0,
      "example": 1000
    },
    "SampleCoordinateSystem": {
      "type": "string",
      "description": "Coordinate system of the data signal. Generally gaze signals are set to use 'gaze-on-screen' coordinate system, but you may use 'eye-in-head' or 'gaze-in-world'. If none of the three default options properly describe the coordinate system, the 'custom' keyword MUST be employed and the coordinate system MUST be described using additional metadata entries.",
      "enum": [ "gaze-on-screen", "eye-in-head", "gaze-in-world",  "1D", "custom"]
    },
    "CalibrationType": {
      "type": "string",
      "description": "Type of calibration procedure most recently executed for the device. Calibration procedures may differ depending on the data signal being calibrated (e.g., a 9-point calibration for gaze estimation or a pupillary lightType of calibration procedure most recently executed for the device. Calibration procedures may differ depending on the data signal being calibrated (e.g., a 9-point calibration for gaze estimation or a pupillary light)."
    },
    "CalibrationCount": {
      "type": "number",
      "description": "The number of calibrations corresponding to the session recorded.",
      "minimum": 0
    },
    "CalibrationUnit": {
        "type": "string",
        "description": "Unit of the metric calculated in calibration trials. For e.g., pixel/mm/cm for gaze accuracy"
    },
    "AverageCalibrationError": {
      "type": "string",
      "description": "Average calibration error observed in the calibration counts."
    },
    "MaximumCalibrationError": {
      "type": "number",
      "description": "Maximal calibration error observed in the calibration counts."
    },
    "Columns": {
      "type": "array",
      "description": "List of column metadata objects describing each column in the data stream.",
      "items": {"$ref": "./metadata.column.json"}
    },
    "extensions": {
      "type": "object",
      "additionalProperties": true
    }
  }
}

Raw

The raw layer represents raw signals from eye-tracking hardware such as eyelid state, eyeball position, gaze vectors, and pupil measurements.

Gaze

JSON Schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "GazeSample",
  "type": "object",
  "required": ["timestamp"],
  "properties": {
    "timestamp": {
      "type": "number",
      "description": "A continuously increasing identifier of the sampling time registered by the device. The timestamp values MUST adhere to the gaze-signal metadata provided for this session."
    },
    "gaze_coordinate": {
      "$ref": "./geom.coordinate.json",
      "description": "[NEW] Gaze position coordinates in (x,y) or (x,y,z) format. This property is a replacement of eye-tracking-BIDS' x_coordinate and y_coordinate, since the earlier system does not factor z_coordinates which are often returned by eye-tracking systems that compute the intersection of gaze vector with a 3D environment and the availability of monocular gaze data from eye trackers like tobii."
    },
    "gaze_coordinate_left": {
      "$ref": "./geom.coordinate.json",
      "description": "[NEW] Gaze position coordinates for the left eye ONLY, in (x,y) or (x,y,z) format. "
    },
    "gaze_coordinate_right": {
      "$ref": "./geom.coordinate.json",
      "description": "[NEW] Gaze position coordinates for the right eye ONLY, in (x,y) or (x,y,z) format."
    },
    "gaze_vector": {
      "$ref": "./geom.vector.json",
      "description": "[NEW] Gaze direction represented as a vector in the coordinate system defined in the gaze-signal metadata. Origin for the vector can be defined in eyeBall signal"
    },
    "gaze_vector_left": {
      "$ref": "./geom.vector.json",
      "description": "[NEW] Gaze direction vector for the left eye ONLY. A line-of-sight vector for the left eye can be generated if eye ball center is also provided for the left eye in eyeBall signal."
    },
    "gaze_vector_right": {
      "$ref": "./geom.vector.json",
      "description": "[NEW] Gaze direction vector for the right eye ONLY. A line-of-sight vector for the right eye can be generated if eye ball center is also provided for the right eye in eyeBall signal."
    },
    "gaze_angle": {
      "$ref": "./geom.angle.json",
      "description": "[NEW] Gaze direction expressed as angular rotations relative to the coordinate system defined in the gaze-signal metadata."
    },
    "gaze_angle_left": {
      "$ref": "./geom.angle.json",
      "description": "[NEW] Gaze angular rotation for the left eye ONLY."
    },
    "gaze_angle_right": {
      "$ref": "./geom.angle.json",
      "description": "[NEW] Gaze angular rotation for the right eye ONLY."
    },
    "confidence": {
      "type": "array",
      "description": "[NEW] confidence measure for the gaze predictions ranging from a 0 (0%) to 1 (100%)",
      "minimum": 0,
      "maximum": 1
    },
    "extensions": {
      "type": "object",
      "additionalProperties": true
    }
  }
}

eyeBall

JSON Schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "EyeBallSample",
  "type": "object",
  "required": ["timestamp"],
  "properties": {
    "timestamp": {
      "type": "number",
      "description": "A continuously increasing identifier of the sampling time registered by the device."
    },
    "center_coordinate_left": {
      "$ref": "./geom.coordinate.json",
      "description": "[NEW] 3D coordinate representing the position of the left eye center in the coordinate system and unit specified in the corresponding metadata."
    },
    "center_coordinate_right": {
      "$ref": "./geom.coordinate.json",
      "description": "[NEW] 3D coordinate representing the position of the right eye center in the coordinate system and unit specified in the corresponding metadata."
    },
    "optical_axis_left":{
      "$ref": "./geom.vector.json",
      "description": "[NEW] 3D vector representing the optical or pupillary axis formed by joining the eye ball center to pupil center of the left eye."
    },
    "optical_axis_right":{
      "$ref": "./geom.vector.json",
      "description": "[NEW] 3D vector representing the optical or pupillary axis formed by joining the eye ball center to pupil center of the right eye."
    },
    "corneal_reflections": {
        "type": "array",
        "description": "List of detected corneal reflection (glint) coordinates for purkinjee based eyey-trackers."
    },
    "confidence": {
      "type": "array",
      "description": "[NEW] confidence measure for the eye ball predictions ranging from a 0 (0%) to 1 (100%)",
      "minimum": 0,
      "maximum": 1
    },
    "extensions": {
      "type": "object",
      "additionalProperties": true
    }
  }
}

eyeLid

JSON Schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "EyeLidSample",
  "type": "object",
  "required": ["timestamp"],
  "properties": {
    "timestamp": {
      "type": "number",
      "description": "A continuously increasing identifier of the sampling time registered by the device. The timestamp values MUST adhere to the gaze-signal metadata provided for this session."
    },
    "eye_openness_left": {
      "type": "number",
      "description": "A continuous measure of estimated openness of the left eye in units specified in the corresponding signal metadata."
    },
    "eye_openness_right": {
      "type": "number",
      "description": "A continuous measure of estimated openness of the right eye in units specified in the corresponding signal metadata."
    },
    "eye_openness": {
      "type": "number",
      "description": "A continuous measure of averaged estimated openness of eyes in units specified in the corresponding signal metadata."
    },
    "blink_state_left": {
      "type": "boolean",
      "description": "Whether or not the current sample is classified as a blink sample for the left eye."
    },
    "blink_state_right": {
      "type": "boolean",
      "description": "Whether or not the current sample is classified as a blink sample for the right eye."
    },
    "blink_state": {
      "type": "boolean",
      "description": "Whether or not the current sample is classified as a blink sample, i.e. it falls in between a blink duration."
    },
    "confidence": {
      "type": "number",
      "minimum": 0,
      "maximum": 1,
      "description": "Confidence score representing the reliability of the detected eye lid state, where 0 indicates lowest confidence and 1 indicates highest confidence."
    },
    "extensions": {
      "type": "object",
      "additionalProperties": true
    }
  }
}

Pupil

JSON Schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "PupilSample",
  "type": "object",
  "required": ["timestamp"],
  "properties": {
    "timestamp": {
      "type": "number",
      "description": "A continuously increasing identifier of the sampling time registered by the device. The timestamp values MUST adhere to the pupil-signals metadata provided for this session."
    },
    "pupil_diameter_left": {
      "type": "number",
      "description": "Pupil diameter in units specified in the corresponding session's pupil-signals metadata"
    },
    "pupil_diameter_right": {
      "type": "number",
      "description": "Pupil diameter in units specified in the corresponding session's pupil-signals metadata"
    },
    "pupil_diameter": {
      "type": "number",
      "description": "Cyclopean pupil diameter in units specified in the corresponding session's pupil-signals metadata"
    },
    "pupil_area_left": {
      "type": "number",
      "description": "Pupil area in units specified in the corresponding session's pupil-signals metadata"
    },
    "pupil_area_right": {
      "type": "number",
      "description": "Pupil area in units specified in the corresponding session's pupil-signals metadata"
    },
    "pupil_area": {
      "type": "number",
      "description": "Cyclopean pupil area in units specified in the corresponding session's pupil-signals metadata"
    },
    "pupil_center_left": {
      "$ref": "./geom.coordinate.json",
      "description": "Pupil center for the left eye in 2D or 3D coordinates"
    },
    "pupil_center_right": {
      "$ref": "./geom.coordinate.json",
      "description": "Pupil center for the right eye in 2D or 3D coordinates"
    },
    "confidence": {
      "type": "number",
      "minimum": 0,
      "maximum": 1
    },
    "extensions": {
      "type": "object",
      "additionalProperties": true
    }
  }
}

Event

The event layer captures derived measures of fixations, saccades, blinks, etc., independent of device-specific detection methods.

JSON Schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Blink",
  "type": "object",
  "required": ["start_time", "end_time"],
  "properties": {
    "start_time": {
      "type": "number",
      "description": "Timestamp marking the beginning of the blink event, expressed in the time units defined in the corresponding blink-signal metadata."
    },
    "end_time": {
      "type": "number",
      "description": "Timestamp marking the end of the blink event, expressed in the time units defined in the corresponding blink-signal metadata."
    },
    "duration": {
      "type": "number",
      "description": "Total duration of the blink event, measured as the difference between end_time and start_time."
    },
    "eye_openness_left": {
      "type": "number",
      "description": "Estimated openness of the left eye during the blink event, expressed in the units or scale defined in the corresponding blink-signal metadata."
    },
    "eye_openness_right": {
      "type": "number",
      "description": "Estimated openness of the right eye during the blink event, expressed in the units or scale defined in the corresponding blink-signal metadata."
    },
    "confidence": {
      "type": "number",
      "minimum": 0,
      "maximum": 1,
      "description": "Confidence score representing the reliability of the detected blink event, where 0 indicates lowest confidence and 1 indicates highest confidence."
    },
    "extensions": {
      "type": "object",
      "additionalProperties": true
    }
  }
}

Fixation

JSON Schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://openet-initiative.github.io/schemas/fixation.schema.json",
  "title": "Fixation",
  "description": "",
  "type": "object",
  "required": ["start_time", "end_time"],
  "properties": {
    "start_time": {
      "type": "number"
    },
    "end_time": {
      "type": "number"
    },
    "duration": {
      "type": "number",
      "description": "Duration in milliseconds"
    },
    "centroid_x": {
      "type": "number"
    },
    "centroid_y": {
      "type": "number"
    },
    "dispersion": {
      "type": "number"
    },
    "confidence": {
      "type": "number"
    },
    "extensions": {
      "type": "object",
      "additionalProperties": true
    }
  }
}

Saccade

JSON Schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Saccade",
  "type": "object",
  "required": ["start_time", "end_time"],
  "properties": {
    "start_time": {
      "type": "number"
    },
    "end_time": {
      "type": "number"
    },
    "amplitude": {
      "type": "number"
    },
    "peak_velocity": {
      "type": "number"
    },
    "direction": {
      "type": "number",
      "description": "Angle in degrees"
    },
    "extensions": {
      "type": "object",
      "additionalProperties": true
    }
  }
}

External event marker

JSON Schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://openet-initiative.github.io/schemas/event.marker.json",
  "title": "External event marker",
  "description": "A client- or stimulus-authored event pushed into an active session's timeline, distinct from device-derived events.",
  "type": "object",
  "required": ["sessionId", "timestamp"],
  "properties": {
    "id": {
      "type": "string",
      "description": "Unique identifier for this marker event"
    },
    "sessionId": {
      "type": "string",
      "description": "Identifier of the session this marker belongs to"
    },
    "timestamp": {
      "type": "string",
      "format": "date-time",
      "description": "ISO 8601 timestamp at which the marker occurred"
    },
    "label": {
      "type": "string",
      "description": "Short identifier for the marker type, e.g. 'stimulus_onset', 'user_response', 'trial_start'"
    },
    "value": {
      "description": "Optional descriptive payload associated with the marker (e.g. stimulus ID, response code)",
      "type": ["string", "number", "boolean", "object", "null"]
    },
    "source_clock": {
      "type": "string",
      "description": "Origin of the marker timestamp, e.g. 'experimenter', 'stimulus-software', 'external-trigger'"
    },
    "extensions": {
      "type": "object",
      "additionalProperties": true
    }
  }
}

Metrics

Higher-order metrics computed from raw signals and events are defined in this layer.

Gaze Velocity

JSON Schema
{
  "$id": "https://openet-initiative.github.io/schemas/metrics.velocity.json",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Gaze Velocity",
  "description": "A higher-order metric quantifying the rate of change of gaze position over a session or time window, computed from raw gaze signals.",
  "type": "object",
  "properties": {
    "sessionId": {
      "type": "string",
      "description": "Identifier of the session this metric was computed for"
    },
    "startTime": {
      "type": "string",
      "format": "date-time",
      "description": "ISO 8601 timestamp marking the start of the window used to compute this metric"
    },
    "endTime": {
      "type": "string",
      "format": "date-time",
      "description": "ISO 8601 timestamp marking the end of the window used to compute this metric"
    },
    "meanVelocity": {
      "type": "number",
      "description": "Mean gaze velocity over the window, in degrees per second"
    },
    "peakVelocity": {
      "type": "number",
      "description": "Peak instantaneous gaze velocity observed in the window, in degrees per second"
    },
    "unit": {
      "type": "string",
      "description": "Unit of measurement for velocity values",
      "default": "deg/s"
    },
    "extensions": {
      "type": "object",
      "additionalProperties": true
    }
  },
  "required": ["sessionId", "startTime", "endTime", "meanVelocity"],
  "additionalProperties": false
}

Gaze Entropy

JSON Schema
{
  "$id": "https://openet-initiative.github.io/schemas/metrics.entropy.json",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Gaze Entropy",
  "description": "A higher-order metric quantifying the spatial randomness/dispersion of gaze positions over a session or time window, computed from raw gaze signals.",
  "type": "object",
  "properties": {
    "sessionId": {
      "type": "string",
      "description": "Identifier of the session this metric was computed for"
    },
    "startTime": {
      "type": "string",
      "format": "date-time",
      "description": "ISO 8601 timestamp marking the start of the window used to compute this metric"
    },
    "endTime": {
      "type": "string",
      "format": "date-time",
      "description": "ISO 8601 timestamp marking the end of the window used to compute this metric"
    },
    "value": {
      "type": "number",
      "description": "Computed gaze entropy value, in bits (Shannon entropy over spatial gaze distribution)"
    },
    "method": {
      "type": "string",
      "description": "Name of the entropy estimation method used, e.g. 'grid-based', 'kernel-density'",
      "default": "grid-based"
    },
    "gridSize": {
      "type": "number",
      "description": "Spatial bin size used for grid-based entropy estimation, if applicable"
    },
    "extensions": {
      "type": "object",
      "additionalProperties": true
    }
  },
  "required": ["sessionId","startTime", "endTime", "value"]
}

Misc.

Misc. layer handles logistical and operational context such as authentication and network-related information.