Skip to main content

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 treat payload.status as the biometric outcome β€” the same field returned by GET /api/kyc/biometric/sessions/:id. Gu1 exposes two delivery paths:
  1. Organization webhooks β€” configure in Webhook configuration and subscribe to biometric.session_* events (all status transitions).
  2. Per-request webhookUrl β€” optional HTTPS URL passed in POST /api/kyc/biometric/sessions; Gu1 POSTs on terminal capture outcomes (approved, rejected, abandoned, expired). Manual cancel via API triggers organization webhooks only.

Event Types

Payload Envelope

Same outer structure as KYC events:
The inner 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 event names and payload shape as organization webhooks.
  • Requests are signed with HMAC-SHA256 in X-Webhook-Signature when your KYC webhook secret is configured.
  • Headers also include X-Webhook-Event, X-Webhook-ID, and X-Webhook-Timestamp.
Verify signatures the same way as outbound webhooks.
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.