Decisions and retries
Each verification returns one decision, with a reason and retry guidance.
| Decision | Meaning | Retry |
|---|---|---|
| approved | All checks passed under the validated policy. Never returned in restricted pilot mode. | No |
| manual_review | A person has to decide. This alone does not mean the face matched. Read reason. | See retry_allowed |
| rejected_identity | The face clearly does not match the enrolled identity. | Yes |
| rejected_spoof | A presentation attack was flagged. Only under the validated policy. | No |
| retry_quality | The capture was unusable. See guidance. | Yes |
| expired_session | The session timed out. Start a new one. | Yes |
| not_enrolled | The identity is suspended or has no template. | No |
| invalid_capture | The frames could not be used. | Yes |
| system_unavailable | Warka could not decide. The session stays usable. | Yes |
Reading manual_review
In the pilot, only manual_review with reason restricted_mode means a clear match with every check passed, and a person still has to accept it. Treat every other reason as unconfirmed, even when identity.match is true.
| Reason | Meaning | Retry |
|---|---|---|
| restricted_mode | Clear match and every check passed. The only reason that means this. | No |
| identity_borderline | The score is too close to the threshold to call. | No |
| pad_inconclusive | The attack check could not decide. Another capture may settle it. | Yes |
| pad_unavailable | The attack check did not run. | No |
| pad_flagged | The attack check flagged this capture. | No |
| replay_suspected | Frames repeat each other or an earlier capture. | No |
| no_motion_between_frames | Several frames, but nothing moved. | No |
| challenge_not_performed | The requested movement wasn't seen. | No |
| identity_changed_between_frames | The frames don't show the same person. | No |
Handling them
- Retries need a fresh capture session, and each one counts as an attempt.
- Limit retries in your app, then route the person to your exception process.
- Check retry_allowed first. When it's true, ask for a new capture before sending anything to a person.
- manual_review belongs in a human queue on your side. Warka has no approve or reject control and no review API yet, so your app records the outcome.
- Reviewers need a console login to see the captured frames, and each view is audit-logged.
- Never treat a rejection as proof of dishonesty. Give people a way to appeal.