- A hosted enrollment session: the applicant completes a journey you published, on Baselayer’s page. Your server never touches their personal data.
- A direct verification: you send an identity you collected yourself, server to server.
individual_ref and, when a business is involved, business_ref.
Side by side
Which route to poll
- Hosted: wait for
OnboardingSession.completed, then readGET /onboarding/sessions/{session_id}/results. Before the session completes, the results route answers409. The webhook is a summary; the results are the source of truth. - Direct: poll
GET /identities/verifications/{verification_id}untilstateis terminal, or subscribe toVerification.completedandVerification.failed. Their payload is the verification exactly as that route returns it.
verification_id never works on a session route, and a session_id never works on a verification route.
States
A direct verification’sstate is one of PENDING, EXECUTING, WAITING, COMPLETED, FAILED or EXPIRED. A verification stopped internally reports FAILED.
The hosted session schema still lists CANCELLED for compatibility, but a session stopped internally reads FAILED on GET /onboarding/sessions/{session_id} and in its webhooks too. You can treat both resources’ terminal states the same way.
Re-verifying
To re-verify an individual you verified directly, callPOST /identities/individuals/{individual_ref}/reverify with no body and a fresh Idempotency-Key. It answers 202 with a new direct verification; the individual_ref never changes. A retry with the same key returns the same verification; a key already used for a different request answers 422. A new key while a verification is still running answers 409.
POST /identities/verifications only starts new verifications. It does not take an individual_ref.