Detect face swaps, reenactment, and AI-generated video in selfies and live verification sessions

Deepfake Detection


Deepfake detection answers one question: is the face in this image or video real footage of a real person, or was it generated or manipulated?

It is the front line of video-KYC fraud defence. Face-swap tooling is now consumer-grade — an attacker can join a verification call wearing someone else's face in real time, or submit a pre-rendered selfie video of a person who never sat for one.

What it catches

AttackDescription
Face swapThe attacker's face is replaced with the victim's, frame by frame, in live or recorded video.
Reenactment / puppetingA single photo of the victim is animated to blink, nod, and speak.
Fully synthetic facesA person who does not exist, generated end-to-end.
Replay of generated mediaA deepfaked clip played back to the camera or injected into the video stream.

How it runs

Deepfake analysis runs automatically on:

  • Selfie images submitted during onboarding (paired with Liveness).
  • Video sessions — every video-KYC recording is sampled across its full duration, not just a single frame, so a swap that flickers in for part of the call is still caught.

The check returns an aggregate verdict plus temporal markers: timestamped points in the video where manipulation signals spiked, so a reviewer can scrub straight to the suspicious moment.

{
  "check": "deepfake",
  "verdict": "fail",
  "confidence": 0.94,
  "markers": [
    { "t": 41.2, "signal": "face_boundary_inconsistency" },
    { "t": 63.8, "signal": "texture_anomaly" }
  ]
}

Gating with Goal Rules

Thresholds are yours to set per agent. A typical policy:

{
  "id": "no_deepfake",
  "severity": "hard_stop",
  "check": "deepfake_confidence_below",
  "params": {
    "threshold": 0.2,
    "on_fail_message": "Verification could not be completed."
  },
  "on_deny": {
    "message": "Deepfake signals above ceiling.",
    "max_retries": 0,
    "remediate_type": ""
  }
}

When a deepfake verdict trips a hard_stop rule, it lands in the case's hard-stop list alongside the other failed checks — here a flagged session where the deepfake, synthetic-face, and liveness verdicts all fired, together with cross-document mismatches the same fraudulent session produced:

Hard stops panel from a flagged case — cross-document matches on name and date of birth failing across PAN, Aadhaar, session log and video, liveness screening flagging deepfake, synthetic face and liveness, and a missing consent statementHard stops panel from a flagged case — cross-document matches on name and date of birth failing across PAN, Aadhaar, session log and video, liveness screening flagging deepfake, synthetic face and liveness, and a missing consent statement

📝

Never expose why a session failed a deepfake check to the end user — a specific error message is a training signal for the attacker. Keep on_deny messages generic; the detailed verdict stays in the case record for your reviewers.

Works best combined

Deepfake detection is strongest alongside its sibling checks — an attacker who beats one rarely beats all four: