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
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
string
required
Biometric session status:
pending, in_progress, approved, rejected, abandoned, cancelled, expired.string | null
Present when
status is rejected (e.g. FACE_MATCH_SCORE_LOW, CROSS_ENTITY, CAPTURE_DECLINED).string | null
Human-readable detail for
rejectionCode when available.string
Always
face_match for new sessions (hosted liveness + KYC portrait comparison).string | null
Hosted capture URL while the session is active (
pending / in_progress).string
Opaque ID of the session in the hosted capture environment (support/correlation only; use
id as your primary Gu1 session key).object
Provider capture payload after completion (liveness, face match scores, media keys). Fetch images via
GET /api/kyc/biometric/sessions/:id/media?key=.object
Snapshot of the person entity (
id, externalId, name, type) when available.Example: Session Created
Example: In Progress
Example: Approved
Example: Rejected
Common rejectionCode values
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.