Skip to main content
Illinois (BIPA), Texas (CUBI) and Colorado require a notice and an explicit release before a business collects face geometry, from a selfie or from the photo on an ID. Didit can show a consent step before the first face capture to the people those laws cover, and keeps the answer on the session as evidence. This page explains when the step appears, which apps can show it, and how the answer reaches your decision and webhooks.
Didit shows the step and records the answer. You decide whether your user journey meets the biometric laws that apply to your business. This page is not legal advice: review your implementation with your counsel.

When the step appears

A session shows the consent step when both of these are true:
  1. The workflow captures a face. A Liveness, Face Match or Age Estimation step, the front-camera selfie the ID Verification step takes (unless you turned it off), or full-session video recording.
  2. The application’s consent mode asks for it. In Auto mode, one of the triggers below applies. In Always mode, every session that captures a face asks.
The step appears before the first face capture. When only the ID document shows a covered state, it appears right after the ID capture and before the selfie, and no face geometry is computed from the ID capture images until the person agrees. Didit checks the requirement when the person opens the flow and again at each step until it applies. Once a session requires consent, it keeps requiring it. Choose the mode in the console, under the application’s Settings > Data and privacy > Biometric consent. Each change is recorded in the audit log.

What triggers the step in Auto mode

Didit checks these rules in order and records the first one that applies in biometric_consent.trigger: VPNs, proxies and hosting networks do not ask on their own. Didit locates the person’s IP like any other: one in Illinois, Texas or Colorado shows the step, one anywhere else does not. The step is asked only on clear evidence of a covered state (the IP, the state that issued the ID, or a state you declared), or when the person is placed in the US without a state (ip_unknown). A person in a covered state behind a VPN that exits elsewhere, with an ID no covered state issued, is not asked; use Always mode, or send user_state, if you need to cover that case. Two more values describe how a session’s consent was settled rather than why it was asked:

Tell Didit what you already know

Create Session takes two optional fields for this:

Which apps show the step

The step needs an app that can display it. Didit decides this on every request the app makes:

Native SDKs below 4.10.0

Native SDKs released before 4.10.0 do not know the consent step, so Didit never asks them for it. The verification runs exactly as it did before: the selfie and the other face captures are accepted and processed, and the session reaches its decision as usual. Didit never records consent that was not given. When the session required consent and an older SDK captured a face, the decision shows:
Upgrade to native SDK 4.10.0 or later if you verify people in Illinois, Texas or Colorado in a native app. Until you do, those sessions finish without explicit consent, and collecting it before the selfie is your responsibility.
If the person continues the same session in the hosted flow (on another device, or in a WebView the app opens for some liveness types), the hosted flow shows the step and captures no face there until they answer. Consent given there keeps reason: "BIOMETRIC_CONSENT_UNSUPPORTED_SDK", because faces were already captured without it.

What the person sees

The step tells the person what is collected, why, who has it and how long it is kept, and links to the Biometric data policy. It has one button: Agree and continue, which stays disabled until the person ticks the agreement box. Didit keeps the answer as evidence: when it was given, the version and hash of the text shown, the language, the workflow step, and the IP, location and user agent of the request. Once the person agrees, the answer is final.

When the person does not agree

The step has no decline button. A person who does not want to agree leaves the flow: no face is captured, and the session ends as Abandoned like any other session the person does not finish (see Verification statuses). Offer them another way to verify. The decision keeps a declined status and the BIOMETRIC_CONSENT_DECLINED reason as API values. No Didit screen offers a decline today, so the hosted flow and the native SDKs do not record one. A session that records a decline:
  • Ends as Declined, and the status.updated webhook fires as for any other decline.
  • Shows biometric_consent.status as declined, reason and decline_reason as BIOMETRIC_CONSENT_DECLINED, and declined_at with the time.
  • Captures no face after the decline. Every face image and face template the session already holds is deleted: selfies, the ID capture’s front-camera selfie, the face crop of the document portrait, liveness and full-session videos. face_data_deleted_at records when. The decision no longer returns them, and the deletion is irreversible.
  • Keeps the document images and the data read from them: the decline does not affect them.

In the decision and webhooks

Every User Verification decision carries a biometric_consent object, in Retrieve Session and in the decision of session webhooks. It is null when the session was never evaluated, for example a workflow without a face capture. A session where the person agreed in the hosted flow:
The example is shortened. Every field, with its type, is in Data models.