Proctor watches the webcam, the candidate's eyes and the exam page together. It flags phones, extra people, a different person, reading off-screen notes and tab switching within seconds, and hands your reviewers a clear report.
No sign-up. The demo takes about five minutes and runs on the production backend.
Camera frames, eye tracking and page events each catch different kinds of cheating. Comparing them also catches a tampered exam page.
Frames sent at unpredictable moments, checked by object, face and identity models.
Face and iris tracking in the browser, 15 times a second, calibrated to each candidate's screen.
Reading has a rhythm: steady steps along a line, then a quick sweep back. Proctor tells reading notes under the screen apart from re-reading the question.
What happens on the exam page itself, timed by the server so it can't be faked.
The candidate's browser does the fast tracking. The server makes every decision, because the browser is in the candidate's hands.
The candidate's face is enrolled, then they click nine dots so the server learns where "on screen" is for their webcam and seat.
Eye-tracking numbers stream in 5-second batches. Camera frames go up at random moments every 2–4 seconds, and straight away when something changes.
A finding becomes an alert only once it has lasted long enough to be real. Alerts add up to a risk score, and reviewers get a timeline of what happened and when.
Every camera check is scored against public datasets with known answers, and the eye-tracking checks against 2,520 simulated sessions.
| Check | Caught | Alerts that were right | False alarms |
|---|---|---|---|
| Phone | 83.0% | 88.0% | 1.7% |
| Extra screen | 92.7% | 96.5% | 1.1% |
| Several people | 90.2% | 90.7% | 4.4% |
| Different person | 96.1% | 98.4% | 1.7% |
| Camera blocked | 100% | 100% | 0% |
| Looking away to read notes | 100% | — | 0% |
Camera checks: COCO and LFW test images. Eye tracking: synthetic sessions across webcam noise levels and frame rates; normal behaviour (reading the question, thinking, looking around) raised no alerts.
One script, one WebSocket. The SDK handles the camera, tracking, reconnects and message sizes, and your page just listens for alerts.
import { startProctoring } from "https://SDK-HOST/sdk/proctor.js"; const proctor = await startProctoring({ url: "wss://YOUR-API/prod", token: sessionToken, sessionId: "exam-42", }); proctor.on("alert", (alert) => { // { code: "PHONE_VISIBLE", severity: "high", message, ... } showWarning(alert); }); await proctor.enroll(); // remember the candidate's face await proctor.calibrate(); // nine dots, about 15 seconds
Alerts point a human reviewer to the right moments. Nothing here fails a candidate on its own.
Frames are analysed and discarded. Only a numeric face template and the alert log are kept, and they expire after 24 hours.
All timing uses the server's clock, and the browser's eye-tracking numbers are checked against the frames, so a modified page shows up.
Take a five-question sample exam. Pick up your phone, look at your notes, switch tabs, and watch the alerts arrive.
Start the live demo