Control
AI analysis of a video interview without notice, explanation, and consent
Before AI analyzes an applicant's video interview, the employer must notify the applicant, explain how the AI works and what it evaluates, and obtain the applicant's consent.
Informational data, not legal advice. Summaries are TwinEthos's own words and rules have not been reviewed by a lawyer: check the official text before relying on any of it. A guard addresses an item; adding it is not a statement that your code meets any law.
Reach
Law in force in Illinois (US-IL), Maryland (US-MD).
The guard to add
Record the applicant's notice, explanation, and consent (or signed waiver) before any AI or facial analysis runs on an interview video, and skip analysis for non-consenting applicants.
A consent gate between the stored interview video and every analysis call (transcription plus LLM scoring, DeepFace.analyze, face_recognition.face_encodings, a vendor face or emotion API). Before the interview the applicant is told that AI will analyze the recording, how it works, and what general characteristics it evaluates; their consent or signed waiver is stored with a timestamp and the version of the explanation shown. The analysis worker reads that record and refuses to run without it; applicants who do not consent are routed to a non-AI, human-reviewed path instead of being scored.
Where it goes: 1 application source code, 2 data models, 9 AI output handling, 14 user-facing text.
What reviewers look for: a consent or waiver check (if not applicant.ai_video_consent, require_consent('ai_video'), a stored consent_recorded_at or signed waiver row) read in the worker or handler that calls the model or extracts a face template, not only a checkbox in the upload UI; the pre-interview notice and explanation copy in the interview flow; no scoring path for applicants without consent.
Example (FastAPI + OpenAI SDK (Whisper)), before:
@app.post('/interviews/{app_id}/video')
async def upload(app_id: str, file: UploadFile):
path = store_video(app_id, file)
transcript = client.audio.transcriptions.create(model='whisper-1', file=open(path, 'rb'))
return score_interview(app_id, transcript.text)After:
@app.post('/interviews/{app_id}/video')
async def upload(app_id: str, file: UploadFile):
applicant = db.applicants.get(app_id)
path = store_video(app_id, file)
if not applicant.ai_video_consent or applicant.consent_recorded_at is None:
human_review_queue.add(app_id, path) # no AI evaluation without consent
return {'status': 'received'}
transcript = client.audio.transcriptions.create(model='whisper-1', file=open(path, 'rb'))
return score_interview(app_id, transcript.text)Engineering guidance, not legal advice. Each provision below may add its own details (a cadence, a deadline, a required notice element): open it for those.
Every rule this guard addresses
Binding law — in force (2)
- Illinois (US-IL)
- Maryland (US-MD)
- Facial recognition in job interviews requires a signed applicant waiver (Maryland) Md. Code, Labor & Employment 3-717