Overview
Embedded biometric sessions are managed end-to-end by Gu1. When the user completes capture in the hosted UI, Gu1 persists the session, applies your organization policies (face-match score thresholds, cross-entity checks, billing), and emits webhooks with the session result. Your integration should treatpayload.status as the biometric outcome β the same field returned by GET /api/kyc/biometric/sessions/:id.
Gu1 exposes two delivery paths:
- Organization webhooks β configure in Webhook configuration and subscribe to
biometric.session_*events (all status transitions). - Per-request
webhookUrlβ optional HTTPS URL passed inPOST /api/kyc/biometric/sessions; Gu1 POSTs on terminal capture outcomes (approved,rejected,abandoned,expired). Manualcancelvia API triggers organization webhooks only.
Event types
| Event | When |
|---|---|
biometric.session_created | Session created (status: pending) |
biometric.session_in_progress | User started capture in the hosted UI |
biometric.session_approved | Biometric session approved by Gu1 |
biometric.session_rejected | Biometric session rejected by Gu1 |
biometric.session_abandoned | User left the hosted flow without finishing |
biometric.session_cancelled | Session cancelled in Gu1 (pending / in_progress only) |
biometric.session_expired | Session expired |
Payload envelope
Same outer structure as KYC events:payload is the biometric session as stored in Gu1 (same shape as the REST API), plus an entity snapshot when available.
Payload fields
Biometric session status:
pending, in_progress, approved, rejected, abandoned, cancelled, expired.Present when
status is rejected (e.g. FACE_MATCH_SCORE_LOW, CROSS_ENTITY, CAPTURE_DECLINED).Human-readable detail for
rejectionCode when available.Always
face_match for new sessions (hosted liveness + KYC portrait comparison).Hosted capture URL while the session is active (
pending / in_progress).Opaque ID of the session in the hosted capture environment (support/correlation only; use
id as your primary Gu1 session key).Provider capture payload after completion (liveness, face match scores, media keys). Fetch images via
GET /api/kyc/biometric/sessions/:id/media?key=.Snapshot of the person entity (
id, externalId, name, type) when available.Example: session created
Example: in progress
Example: approved
Example: rejected
Common rejectionCode values
| Code | Meaning |
|---|---|
FACE_MATCH_SCORE_LOW | Face match score below organization threshold (face_match mode) |
CROSS_ENTITY | Capture matches a different entity in your organization |
CAPTURE_DECLINED | Capture declined in the hosted flow |
Per-request webhookUrl
When you pass webhookUrl at session creation:
- Body uses the same
eventnames andpayloadshape as organization webhooks. - Requests are signed with HMAC-SHA256 in
X-Webhook-Signaturewhen your KYC webhook secret is configured. - Headers also include
X-Webhook-Event,X-Webhook-ID, andX-Webhook-Timestamp.
Manual cancel (
POST /api/kyc/biometric/sessions/:id/cancel) emits biometric.session_cancelled on organization webhooks only; it does not POST to per-request webhookUrl.