Adding Liveness Detection to Your Identity Verification Flow
Tutorial: add passive and active liveness detection to your identity verification system using a REST API — prevent spoofing in KYC and onboarding.
Why Add Liveness Detection?
Without liveness detection, your face verification system can be fooled by a printed photo or a screen displaying someone else's face. Liveness detection closes this vulnerability.
Option 1: Passive Liveness (Simplest)
Passive liveness requires no user interaction — just analyze the image:
import requestsresponse = requests.post(
"https://faceapi.arsa.technology/api/v1/face_liveness",
headers={"x-key-secret": "YOUR_API_KEY"},
files={"face_image": open("selfie.jpg", "rb")}
)
result = response.json()
is_real = result["faces"][0]["is_real_face"]
confidence = result["faces"][0]["liveness_confidence"]
if not is_real:
print("Spoofing detected! Rejecting verification.")
Learn more about how passive liveness works.
Option 2: Active Liveness (Higher Security)
Active liveness asks the user to perform head movements on video:
Step 1: Request a challenge
challenge = requests.post(
"https://faceapi.arsa.technology/api/v1/face_liveness_active/request?difficulty=medium",
headers={"x-key-secret": "YOUR_API_KEY"}
).json()
instructions = challenge["instructions"] # ["up", "left"]
job_uuid = challenge["job_uuid"]
print(f"Ask user to look: {', '.join(instructions)}")
Step 2: Record video and submit
result = requests.post(
f"https://faceapi.arsa.technology/api/v1/face_liveness_active/submit?job_uuid={job_uuid}",
headers={"x-key-secret": "YOUR_API_KEY"},
files={"video": open("recording.mp4", "rb")}
).json()
if result["passed"]:
print("Liveness confirmed!")
Combining Liveness with Face Verification
The recommended flow for KYC onboarding:
1. Check liveness on the selfie
liveness = check_passive_liveness("selfie.jpg")
if not liveness["is_real"]:
reject("Liveness check failed")
2. Compare selfie to ID photo
verification = verify_faces("selfie.jpg", "id_photo.jpg")
if not verification["match_result"]:
reject("Face mismatch")
3. Approved!
approve_user()
Which Liveness Level to Use?
| Risk Level | Approach |
|-----------|----------|
| Low (newsletter signup) | No liveness needed |
| Medium (account creation) | Passive liveness |
| High (KYC, banking) | Passive + ID verification |
| Very high (regulated finance) | Active liveness + ID verification |
Read active vs passive liveness detection for a detailed comparison.
Start building with 100 free API calls, or read the docs.