Fingerprint enrollment lifecycle
Enrolling a finger takes two captures, not one. The first capture records the finger as an unverified print; a second, matching capture promotes it to verified. A subject is only enrolled once enough of their fingers are verified.
A finger’s states
(none) --enroll()--> unverified --verifyEnrollment() matches--> verified
^ |
| | verify keeps failing → attempts exhausted
+----------------------+ (backend resets the finger)- unverified —
session.enroll(enrollee, position)captured the finger and stored a template, but nothing has confirmed it. The position appears infetchEnrolled().nonVerified. An unverified finger does not count toward the subject being enrolled. - verified —
session.verifyEnrollment(enrollee, position)captured the same finger again and it matched. The position moves fromnonVerifiedtoverified, and that finger is complete.
verifyEnrollment returns a VerificationResult: check positionVerified (did this position verify), verified / nonVerified (the subject’s current lists), enrollmentStatus, and requiresReenroll.
Subject status: partial vs full
enrollmentStatus describes the whole subject:
"partially_enrolled"— some target fingers are still missing or unverified."fully_enrolled"— enough fingers are verified. How many is required is configured by the backend, not the SDK — letenrollmentStatustell you when you’re done rather than counting fingers yourself.
Only verified fingers advance the status. Ten enroll captures with no verifyEnrollment leaves the subject partially_enrolled.
fetchEnrolled is the source of truth
session.fetchEnrolled(enrollee) returns { verified, nonVerified, total, enrollmentStatus, notes }. It is a direct lookup against the Slade ID service — no hardware, no capture — so call it freely to check progress and branch on it. Track enrollment with fetchEnrolled, never with your own counters.
Reset and re-enroll
verifyEnrollment resolving positionVerified = false is a normal, expected outcome (smudge, wrong finger, poor placement): the finger stays unverified — prompt the user to retry the verify capture.
The backend allows a limited number of failed verify attempts per finger (backend-configured). VerificationResult.attemptsRemaining reports the budget when the server sends it, and requiresReenroll flips to true once the finger is reset — its record is deleted and it disappears from both verified and nonVerified. To recover, enroll the finger again, then verifyEnrollment.
Putting it together
For each target finger:
enroll()— first capture, stores an unverified print.verifyEnrollment()— second capture; retry whilepositionVerifiedisfalse.fetchEnrolled()— if the finger vanished from both lists (orrequiresReenroll), start it over at step 1.- Repeat until
enrollmentStatus == "fully_enrolled".
See Enroll a fingerprint for the worked loop.