Develop

Eye Tracking for Interactions

Updated: Sep 8, 2026

Overview

The eye tracking interaction API reports where the user is looking as a single combined gaze pose. OVRPlugin exposes this pose along with a validity flag and a timestamp, so your app can drive gaze-based selection, targeting, and pointing from one direction vector.
This API is distinct from the social eye tracking API. The social API drives per-eye avatar transforms and reports a separate pose for each eye. The interaction API reports one combined gaze pose for the whole head. Use the interaction API when you want a direction to interact with, and the social API when you want per-eye data for avatars. For the social side, see Eye Tracking for Movement SDK for Unity.

Before you begin

Set up a project that supports eye tracking by following the Eye Tracking Overview. That guide configures the OVRCameraRig, the OVRManager target devices and Quest features, eye tracking support and permissions, and the Project Setup Tool. Both eye tracking APIs share that setup.

Policies and disclaimers

Your use of the Eye Tracking API must at all times be consistent with the Oculus SDK License Agreement and the Developer Data Use Policy and all applicable Oculus and Meta policies, terms and conditions. Applicable privacy and data protection laws may cover your use of Movement, and all applicable privacy and data protection laws.
In particular, you must post and abide by a publicly available and easily accessible privacy policy that clearly explains your collection, use, retention, and processing of data through the Eye Tracking API. You must ensure that a user is provided with clear and comprehensive information about, and consents to, your access to and use of abstracted gaze data prior to collection, including as required by applicable privacy and data protection laws.
Please note that we reserve the right to monitor your use of the Eye Tracking API to enforce compliance with our policies.
When a user enables eye tracking for your app, your app is granted access to real time abstracted gaze data, which is user data under the Developer Data Use Policy. You are expressly forbidden from using this data for Data Use Prohibited Practices in accordance with the Developer Data Use Policy. The eye tracking feature is powered by our Eye Tracking API technology.

Availability

The eye tracking interaction members of OVRPlugin are public in the Meta XR Core SDK for Unity starting with the v207 release. Earlier SDK versions keep these members internal, so target v207 or newer to call them.

Check support and permission

Gate every read behind two static properties on OVRPlugin:
MemberDescription
eyeGazeInteractionsSupported
Returns true when the device and runtime support eye gaze interaction.
eyeGazeInteractionsEnabled
Returns true when eye gaze interaction is enabled, which reflects the user’s eye tracking permission.
Read both before you request a pose. eyeGazeInteractionsSupported reflects the hardware and runtime. eyeGazeInteractionsEnabled reflects the user’s permission grant. A device that supports eye tracking still returns no pose until the user grants permission.

Read the eye gaze interaction state

Call GetEyeGazeInteractionState to populate an EyeGazeInteractionState struct for the current frame:
public static bool GetEyeGazeInteractionState(
    Step stepId, int frameIndex, ref EyeGazeInteractionState eyeGazeInteractionState)
The method returns true when it retrieves a state and false otherwise. Pass -1 for frameIndex to query the current frame. The populated EyeGazeInteractionState exposes these public members:
MemberKindTypeDescription
Pose
Field
Posef
The eye gaze interaction pose, as a position and orientation.
IsValid
Read-only property
bool
Returns true when the gaze pose is valid. Check this before you use Pose.
Time
Field
double
The timestamp associated with the state.
IsValid is computed from an internal flag, so you read it but do not assign it. Pose and Time are fields.
A true return from GetEyeGazeInteractionState means the call succeeded, not that the pose is usable. Read IsValid and act on Pose only when it is true.

Tracking step and OpenXR

GetEyeGazeInteractionState takes a Step that names which tracking step to query. Under OpenXR, Step.Physics is deprecated. When the runtime is OpenXR and you pass Step.Physics, OVRPlugin logs a warning and reads Step.Render instead. Pass Step.Render to avoid the warning.

Example

The following snippet checks support and permission, then reads the gaze pose once per frame:
void Update()
{
    if (!OVRPlugin.eyeGazeInteractionsSupported || !OVRPlugin.eyeGazeInteractionsEnabled)
    {
        return;
    }

    var state = new OVRPlugin.EyeGazeInteractionState();
    if (OVRPlugin.GetEyeGazeInteractionState(OVRPlugin.Step.Render, -1, ref state) && state.IsValid)
    {
        OVRPlugin.Posef gazePose = state.Pose;
        double timestamp = state.Time;
        // Drive gaze-based interaction from gazePose and timestamp.
    }
}

Learn more