BlinkExam SDK Documentation

Overview

The BlinkExam SDK is a JavaScript module for integrating online proctoring into web applications. It supports camera and microphone checks, face detection, screen sharing, and photo/ID capture to monitor test-takers and prevent cheating. The SDK calculates a Trust Score and generates violation reports. It offers three proctoring modes: live, recorded, and combo, with recording options image or vScreen This documentation guides developers on integrating the SDK using CDN-loaded scripts, compatible with vanilla JavaScript or frameworks like AngularJS.

Prerequisites

Installation and Setup

Integrate the BlinkExam SDK by loading its main script and utility scripts from a CDN. Scripts must be loaded sequentially to resolve dependencies.

Script Loading

Load the SDK and utilities on DOMContentLoaded.


window.apiConfig = { js_path: 'https://cdn.lavender-porcupine-221748.hostingersite.com' };
document.addEventListener('DOMContentLoaded', async () => {
  // Load main SDK
  await loadScript('https://dqxf2of07o2qg.cloudfront.net/v2/blinkexam.min.js');

  // Load utility scripts
  const scriptUrls = [
    `${window.apiConfig.js_path}/util/v2/variable.js`,
    `${window.apiConfig.js_path}/util/v2/config.js`,
    `${window.apiConfig.js_path}/util/v2/fileworker.js`,
    `${window.apiConfig.js_path}/util/v2/mediaHandler.js`,
    `${window.apiConfig.js_path}/util/v2/eventRecordingUtil.js`,
    `${window.apiConfig.js_path}/util/v2/proctoringEvents.js`
  ];
  await loadScriptsInOrder(scriptUrls);

  // Load WebRTC and meeting scripts
  await loadScriptsInOrder([
    `${window.apiConfig.js_path}/util/v2/meetingv2.js`,
    `${window.apiConfig.js_path}/util/v2/mzRTC.js`
  ]);

  console.log('BlinkExam SDK initialized');
});

// Utility functions
async function loadScriptsInOrder(urls) {
  for (const url of urls) {
    await loadScript(url);
  }
}

function loadScript(url) {
  return new Promise((resolve, reject) => {
    const script = document.createElement('script');
    script.src = url;
    script.async = true;
    script.onload = resolve;
    script.onerror = reject;
    document.head.appendChild(script);
  });
}
    

Set window.apiConfig.js_path to your CDN base URL (e.g.), https://cdn.lavender-porcupine-221748.hostingersite.com. Register at https://lavender-porcupine-221748.hostingersite.com/register to obtain your serviceAccessKey.

Accessing Functions

After loading the SDK scripts, functions are available globally under the BlinkExam namespace (e.g.), BlinkExam.preCheckCameraAndMic. If no namespace is used, functions are attached to window.

Configuration

Initialize the SDK with a configuration object passed to setConfig. The serviceAccessKey is mandatory for authentication.

Setting Configuration


const config = { /* ... */ };
BlinkExam.setConfig(config);
    

Configuration Properties

PropertyTypeRequiredDescription
serviceAccessKeyStringYesUnique key from BlinkExam registration.
clientIdStringYesClient identifier.
testIdStringYesTest identifier.
candidateIdStringYesCandidate identifier.
proctorModeStringYesMode: recorded, live, or combo.
roomInfo.roomIdStringYesSession ID (e.g., ${serviceAccessKey}${testId}${batchId}).
attemptNumberStringYesAttempt number for the session.
captureCandidateBooleanYesEnable candidate photo capture.
captureIdentityBooleanYesEnable ID capture.
faceAuthBooleanYesEnable face authentication.
roomInspectionBooleanYesEnable room inspection.
inspectionTypeStringYesInspection mode: recorded or live.
recordingCategoryStringYesRecording type: image or vScreen.
containerIdStringYesID of the HTML container for proctoring UI.
fileNamePrefixStringYesFile prefix (e.g., ${testId}_${candidateId}_${attemptNumber}).
positionObjectYesUI positions (e.g., { verification: 'center', id: 'center', liveCam: 'top-right' }).
preUploadPathStringYesTemporary file storage path.

Example Configuration


const config = {
  serviceAccessKey: 'your-secret-key',
  clientId: '1',
  testId: '596',
  candidateId: '323',
  proctorMode: 'combo',
  roomInfo: {
    roomId: 'your-secret-key5962' // ${serviceAccessKey}${testId}${batchId}
  },
  attemptNumber: '1',
  captureCandidate: true,
  captureIdentity: true,
  faceAuth: true,
  roomInspection: true,
  inspectionType: 'recorded',
  recordingCategory: 'vScreen',
  containerId: 'proctoringContainer',
  fileNamePrefix: '596_323_1',
  position: {
    verification: 'center',
    id: 'center',
    liveCam: 'top-right'
  },
  preUploadPath: 'testResources'
};
BlinkExam.setConfig(config);
    

Key Functions

Camera and Microphone Handling

BlinkExam.preCheckCameraAndMic(localVideoId, canvasId)

Checks camera and microphone availability.

BlinkExam.checkMicLevel(stream, colorPids)

Monitors microphone input and updates visual indicators.

Face Detection

BlinkExam.calculateFaceCount(video, canvas, callback)

Detects faces using TensorFlow.js.

BlinkExam.stopFaceDetection()

Stops face detection.

Screen Detection

BlinkExam.multipleScreensAttached()

Checks for multiple screens.

Photo and ID Capture

BlinkExam.capturePhotoAndIdCanva(videoId, canvasId)

Captures a snapshot for photo/ID verification.

BlinkExam.captureAndSubmitPhoto(id, errorHandler, submissionCallback, config)

Captures and submits a photo or ID.

Proctoring Modes

BlinkExam.recordedImg()

Recorded proctoring with image capture.

BlinkExam.recordedVScreen()

Recorded proctoring with video.

BlinkExam.liveVScreen()

Live proctoring with screen sharing.

lavender-porcupine-221748.hostingersite.comboVScreen()

Combined live and recorded proctoring.

Usage Examples

Example 1: Recorded Proctoring Session


window.apiConfig = { js_path: 'https://cdn.lavender-porcupine-221748.hostingersite.com' };
document.addEventListener('DOMContentLoaded', async () => {
  await loadScript('https://dqxf2of07o2qg.cloudfront.net/v2/blinkexam.min.js');
  await loadScriptsInOrder([
    `${window.apiConfig.js_path}/util/v2/variable.js`,
    `${window.apiConfig.js_path}/util/v2/config.js`,
    `${window.apiConfig.js_path}/util/v2/fileworker.js`,
    `${window.apiConfig.js_path}/util/v2/mediaHandler.js`,
    `${window.apiConfig.js_path}/util/v2/eventRecordingUtil.js`,
    `${window.apiConfig.js_path}/util/v2/proctoringEvents.js`,
    `${window.apiConfig.js_path}/util/v2/meetingv2.js`,
    `${window.apiConfig.js_path}/util/v2/mzRTC.js`
  ]);

  BlinkExam.setConfig(config);
  if (config.recordingCategory === 'image' && window.proctorPluginVersion === 'v2') {
    BlinkExam.recordedImg();
  }
});
    

Example 2: Photo Capture


async function capturePhoto() {
  try {
    await BlinkExam.captureAndSubmitPhoto(
      'photo',
      error => { throw new Error(`Photo capture failed: ${error}`); },
      () => console.log('Photo submitted'),
      config
    );
  } catch (error) {
    console.error(error);
  }
}
    

Example 3: Face Detection with Camera


async function startProctoring() {
  try {
    const stream = await BlinkExam.preCheckCameraAndMic('localVideo', 'canvas_output');
    if (typeof TFfaceModel !== 'undefined') {
      BlinkExam.calculateFaceCount(
        document.getElementById('localVideo'),
        document.getElementById('canvas_output'),
        count => console.log(`Detected ${count} faces`)
      );
    }
  } catch (error) {
    console.error('Proctoring setup failed:', error);
  }
}
    

Example 4: AngularJS Integration


angular.module('proctorApp', []).controller('ProctorCtrl', function($scope) {
  const config = { /* ... */ };
  BlinkExam.setConfig(config);
  $scope.proctorMode = config.proctorMode;
  async function init() {
    try {
      $scope.stream = await BlinkExam.preCheckCameraAndMic('localVideo', 'canvas_output');
    } catch (error) {
      console.error('Camera error:', error);
    }
  }
  init();
});
    

Dependencies

Error Handling

Use try-catch blocks and error callbacks to handle issues like permission denials or script failures.

Example:


async function captureAndSubmit() {
  try {
    await BlinkExam.captureAndSubmitPhoto(
      'id',
      error => { throw new Error(`ID capture failed: ${error}`); },
      () => console.log('ID submitted'),
      config
    );
  } catch (error) {
    console.error(error);
    alert('Failed to capture ID. Please try again.');
  }
}
    

Troubleshooting

IssueCauseSolution
preCheckCameraAndMic failsMissing permissionsPrompt user to allow camera/mic; ensure HTTPS.
TFfaceModel undefinedTensorFlow.js not loadedLoad <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs">.
Script loading failsIncorrect js_pathVerify window.apiConfig.js_path.
WebRTC errorsBrowser incompatibilityUse Chrome/Firefox; ensure HTTPS.
Photo submission failsInvalid endpointCheck config.preUploadPath and server logs.

Versioning

The SDK supports version v2 (window.proctorPluginVersion).


if (window.proctorPluginVersion === 'v2') {
  BlinkExam.recordedImg();
} else {
  console.warn('Unsupported SDK version');
}
    

Pricing

For more information about API integration and pricing, contact us:
📞 Sales Enquiry: +91 95828 74969
📧 Support: support@lavender-porcupine-221748.hostingersite.com

To get started, request a demo.