What Browser-Based Proctoring Can and Cannot Detect

A browser tab can detect tab switches, clipboard actions, fullscreen exits, device changes, and, from the camera, no face, multiple faces, and identity mismatches. It cannot see a phone on the desk, a virtual machine, a remote-desktop session, or, reliably, a second monitor. That split is a property of the web platform, not a gap in any one vendor: a tab has access to its camera, its microphone, and its own window, and nothing below the browser. This page maps each signal to the exact mechanism, and explains why the extension and desktop tiers exist.

Schedule a Demo

What can a browser tab actually see?

Everything a browser tab observes reaches you as an event, live, through one callback. There is no hidden channel: what the SDK can report is exactly what a web page is permitted to know about its own camera, microphone, focus, and window. The event names below are the whole surface, so if a concern is not on this list, a plain tab cannot see it.

import { ProctorLink } from '@proctorlink/sdk';

// jwt and sessionId come from your backend's POST /v1/sessions response.
const session = ProctorLink.createSession({ jwt: sessionJwt, sessionId });

// Every signal a browser tab can legitimately observe arrives here, live.
session.onEvent((event) => {
  switch (event.type) {
    case 'tab.hidden':        // candidate switched away from the exam tab
    case 'clipboard.paste':   // content pasted into the exam
    case 'clipboard.copy':    // exam content copied out
    case 'fullscreen.exited': // left fullscreen
    case 'device.changed':    // a camera or microphone was swapped
      review(event);
  }
});

await session.start();

The signals that arrive here are tab focus (tab.hidden, tab.visible), fullscreen state (fullscreen.entered, fullscreen.exited), clipboard actions (clipboard.copy, clipboard.cut, clipboard.paste), window changes (window.resized), the right-click menu (context.menu), device swaps (device.changed), and the page unloading (page.unload). None of these describe the room. They describe the tab. If you are new to the field, start with What is online proctoring? for the concepts before the mechanics.

What does the camera add, on the server side?

The other half of detection is not a browser event at all. Periodic keyframes, one per minute by default, upload for server-side face analysis, and the findings appear in the report rather than in the live event stream. This is where presence, absence, multiple faces, and identity are decided.

// Your backend, once status is "validated". What the tab could NOT see
// is answered here instead: server-side face and activity analysis.
GET /v1/sessions/6a7b18df70e4f8ecf2597b6f

{
  "face_analysis": {
    "frames_checked": 42,
    "no_face_frames": 3,
    "multi_face_frames": 1,
    "impersonation_frames": 0,
    "min_match_score": 71.4
  },
  "activity": {
    "by_type": { "tab.hidden": 2, "clipboard.paste": 1 }
  }
}

So the camera answers questions the tab events cannot: no_face_frames counts frames where nobody was visible, multi_face_frames counts frames with more than one person, and impersonation_frames with min_match_score measure how well each frame matched the reference photo. Audio analysis adds voice activity and speaker count. All of it is probabilistic, so the report states what was measured, frames where no face was detected, never that the candidate left the room. For how those verdicts are formed, see What is AI proctoring?.

Can it detect phones, a second monitor, or a VM?

This is the question buyers ask most, so here it is signal by signal. The short version: anything that lives inside the tab or in front of the camera is detectable, and anything that lives in the room, in another application, or below the browser is not, at least not from a browser tab alone.

ConcernDetectable in a browser tab?Mechanism
Candidate leaves the exam tab or windowYestab.hidden and tab.visible events
Copy or paste of exam contentYesclipboard.copy, clipboard.cut, clipboard.paste events
Leaving fullscreenYesfullscreen.exited event
A camera or microphone swapped mid-examYesdevice.changed event
No face, or more than one face, on cameraYes, server-side and deferredno_face_frames and multi_face_frames in the report
Someone other than the enrolled candidateYes, against a reference photoidentity_match and impersonation_frames
A phone or second device beside the candidateNo, not from the tabOnly via a keyframe a reviewer reads, or the desktop tier
A second monitorChrome only, permission-gatedDisplay enumeration, a desktop agent capability
A virtual machine or remote-desktop sessionNoDesktop agent: process inspection (Tier 3)
Screen-recording softwareNoDesktop agent: screen-recording detection (Tier 3)
A virtual camera such as OBSAs a signal, not proofDevice heuristics on the video input

A phone on the desk is the clearest example. A web page has no access to the room, so it cannot see the phone directly. It can only surface it indirectly: the candidate glancing down may show in a keyframe a reviewer then reads, and switching to a phone-mirroring app fires tab.hidden. A second monitor is detectable only in Chrome and only with the candidate’s permission, and a virtual machine or remote-desktop session is invisible to any tab because it lives below the browser.

Why does detection widen with each tier?

The limits above are not something to apologise for; they are the reason the deployment model is tiered. Each tier adds privileged software that can see one layer deeper, so you match the tier to your risk rather than reaching for the deepest one by default.

TierCandidate installWhat it can observe
Tier 1: Browser SDKNoneCamera, microphone, focus and blur, fullscreen state, clipboard, device changes
Tier 2: Browser extensionExtensionAdds tab enumeration, per-application focus, and download blocking
Tier 3: Desktop agentDesktop appProcess inspection, display enumeration, screen-recording detection, and full lockdown

Tier 1 is the browser SDK covered on this page: no install, the events and face analysis above. The browser extension adds tab enumeration, per-application focus, and download blocking. The desktop agent adds process inspection, display enumeration, screen-recording detection, and full lockdown, which is what makes a second monitor or a virtual machine detectable. If you are choosing between these routes and the Moodle plugin or an LTI launch, the decision guide is Proctoring SDK vs API vs LMS plugin, and the integration itself is walked through in How to add proctoring to a web application.

Which signals actually change the score?

Detecting a signal and penalising it are different things, and conflating them is how proctoring earns a reputation for false accusations. Browser events are recorded as context for a reviewer; face analysis is what drives the verdict. Only a pooled set of browser events deducts points at all, capped at a combined twenty: tab.hidden, fullscreen.exited, the clipboard actions, and camera.denied.

Everything else, including tab.visible, fullscreen.entered, window.resized, context.menu, device.changed, and page.unload, is captured and returned but does not change the score, because each fires often for innocent reasons: a rotated phone, a Bluetooth headset connecting, a normal exam submission. That restraint is deliberate. Ordinary behaviour should not manufacture an accusation, so a single tab switch does not flag a candidate. The heaviest penalties sit with the face findings, identity mismatch and multiple faces, which is why the camera, not the clipboard, is the real detector.

Common mistakes when reasoning about detection

  • Expecting a browser tab to catch a phone or a second device. A web page can only see its camera, microphone, and window. Fix: rely on camera framing plus reviewer judgement for physical objects, and move to the desktop agent tier if device-level detection is a hard requirement.
  • Assuming multi-monitor detection works everywhere. Display enumeration is Chrome-only and permission-gated in a browser, and full display enumeration is a desktop-tier capability. Fix: do not promise second-monitor detection on a plain browser SDK; scope it to the tier that supports it.
  • Treating a no-face stretch as proof the candidate left. Face analysis is probabilistic. The report says frames where no face was detected, not that the room was empty. Fix: use no_face_frames as a signal that lowers the score and points a reviewer at a moment, then confirm with the evidence images.
  • Scoring every browser event. Most events fire for innocent reasons, so penalising all of them produces false positives. Fix: let the pooled, capped browser penalty and the server-side face analysis do the scoring, and read the rest as reviewer context.
  • Reading a virtual-camera heuristic as a conviction. A synthetic input device is a signal, not proof, because legitimate software creates virtual devices too. Fix: surface it for review and describe what was measured rather than asserting the feed was faked.

What about mobile browsers?

The platform imposes one more limit worth stating plainly. iOS Safari has no screen-capture API, and it suspends the camera when the tab is backgrounded, so a candidate who switches apps on an iPhone stops sending frames rather than being recorded doing so. A client that goes silent is itself a signal, though: a session that stops reporting scores worse than one reporting violations, because the continuous heartbeat monitoring notices the gap. Plan mobile exams around that behaviour rather than assuming a phone browser observes as much as a desktop one.

What customers say on G2

Institutions evaluating proctoring tools often look for independent feedback outside vendor case studies. ProctorLink is listed on G2, where Moodle administrators and training teams share verified product reviews.

Read ProctorLink reviews on G2 →

Frequently Asked Questions

Not from the tab. A browser tab cannot see a phone lying on the desk, because a web page has no access to the room, only to the camera stream, the microphone, and its own window. A phone can still surface two indirect ways: the candidate looking off-screen or holding something up may show in a keyframe that a reviewer then reads, and leaving the exam tab to use a phone-mirroring app fires a tab.hidden event. Neither is proof of a phone, so both are context for review rather than an automatic verdict. Detecting a phone as a device on the network or in the room needs the desktop agent tier, not a browser tab.

Sources & references

Deployment statistics and product behaviour described in this guide link to the sources below.

Next steps

Match the tier to your risk, then see the signals in a real report before you commit. The browser SDK covers the events and face analysis on this page with no candidate install.

More Proctoring Guides

See Exactly What Gets Detected

The browser SDK reports tab switches, clipboard actions, and face findings with no candidate install. Deeper detection moves up the tiers. Pilot it on a real exam and read the report before you decide.