Skip to main content

The Verification Flow

Step-by-Step Sequence

1

Create Entity with PII

Create an Entity with at minimum a name and phone number. If you’re using the API-driven flow (not Opal), providing more PII (DOB, SSN, address) significantly improves match rates. Opal collects PII directly from the user during its flow, so upfront PII is less critical when using Opal. See Maximizing Success.
2

Check available verification methods

Inspect entity.verification.phone.methods and entity.verification.identity.methods to see which verification methods are available for this Entity.
3

Create phone verification session

Choose a phone verification method (SMS, SNA, or BYO SMS) and create a verification session.
4

Complete phone verification

Complete the phone verification using the method-specific flow (submit SMS code, process SNA URLs, or report BYO result).
5

Create identity verification session

Once phone is verified, create an identity verification session (KBA or BYO KYC). This will fail with MISSING_PHONE_VERIFICATION if phone verification is not complete, or MISSING_IDENTITY_MATCH if Method couldn’t match the Entity’s PII.
6

Complete identity verification

Complete the identity verification using the method-specific flow (submit KBA answers or report BYO KYC result).
7

Entity is verified

Entity is now matched + verified. Proceed to Connect, Payments, or other products.

State Diagram

Each verification session goes through its own lifecycle:

Webhooks

Subscribe to verification session events to track progress:
  • entity_verification_session.create — Fired when a new verification session is created.
  • entity_verification_session.update — Fired when a session’s status changes (e.g., pendingverified, pendingfailed).
These events allow you to build reactive flows — for example, unlocking the next step of your onboarding when phone verification completes.

Code Walkthroughs

SMS + KBA (most common API-driven path)

SNA + KBA (best UX path)

BYO SMS + BYO KYC (existing infrastructure path)