Sekyro AIDocs

Errors and reason codes

Camera errors, check reasons, SDK-side reasons and API error codes.

Camera / engine errors (onError, cap.on('error'))

kindCauseWhat to show
permissionUser denied the camera, or Permissions-Policy blocks itHow to allow the camera; a retry button
notfoundNo camera on the deviceSuggest a phone
inuseAnother app holds the cameraClose it, retry
insecurePage is not HTTPS / secure contextFix the deployment
unsupportedNo getUserMediaSuggest another browser
genericEngine failure (models could not load — often CSP or missing assets — recorder failure, clip too large, constraints)Retry; check §7–§8 in development

Check reasons (result.reason, steps[].reason, webhook reason)

CheckReasonRetryableBilledMeaning
population_registrynni_not_foundnoyesNNI absent from the registry
nni_invalidnoyesMalformed / unusable NNI
registry_unavailableyesnoRegistry outage, no answer (the SDK retries once after 5 s)
result_from_cache—yesPass served from the registry cache (informational)
nni_recheckyesnoFace match failed against the portrait of a typed NNI: the number is asked again once (likely typo)
nationality_not_allowed · underage · age_unverifiablenoyesProfile eligibility rule on the registry record
name_mismatch · birth_date_mismatch · nationality_mismatchnoyesYour subject data disagrees with the registry record
livenessno_faceyesyesNo face found in the clip
media_unreadableyesnoClip could not be decoded
clip_too_shortyesnoClip shorter than required
liveness_inconclusiveyesyesMid-band score in automatic decision mode → capture again
device_integrity_failedyesnoDevice attestation failed or missing (enforce, native apps)
spoof_detectednoyesPresentation attack signal
review_bandnoyesMid-band score → human review
uncalibrated_capture_channelnoyesNon-mobile capture on a legacy review path → human review
face_matchno_face_sourceyesyesNo face in the keyframe (re-capture can fix it)
no_face_referencenoyesNo face in the registry portrait (reference-side; a re-take cannot fix it)
low_quality_referencenoyesReference portrait too poor
below_thresholdnoyesDefinitive non-match
match_inconclusiveyesyesMid-band match in automatic decision mode → capture again
probe_not_from_livenessyesyesThe face image isn't the person in the liveness clip. Only face matching is retried (keep your face in the frame, then try again); liveness is not reopened, and the new keyframe is checked against the clip that already passed
review_bandnoyesMid-band score → human review
subject_revokednonoReturning-user session only: the subject was revoked or deleted after the session was created. Never reaches the model. Create a full verification session
doc_ocrside_missing · unreadableyesnoA side is missing or could not be read → photograph it again
nationality_unreadableyesnoThe MRZ nationality could not be read (never replaced by the issuing state) → clearer photo
document_authenticityyesyesAuthenticity warning in automatic decision mode → capture again
document_type_not_acceptedyesyesThe profile does not accept this document type → present another
age_unverifiableyesyesminAge set but the birth date could not be read → clearer photo
mrz_checksum_failed · expired_documentnoyesMRZ check digits fail / document expired
authenticity_review · registry_mismatchnoyesAuthenticity concern / civil fields differ from the registry → human review
document_nni_mismatchnoyesThe document's NNI differs from the NNI bound at session create
nationality_not_allowed · underagenoyesProfile eligibility rule
name_mismatch · birth_date_mismatch · nationality_mismatch · document_number_mismatchnoyesYour subject data disagrees with the document
phone_otpotp_mismatch · otp_expired · otp_send_failedyesnoWrong code / code expired / send failed → re-enter or resend
otp_channel_unavailableyesnoThe chosen channel is not offered for this number → pick another
otp_destination_not_allowed · otp_destination_unknownyesnoThe number's country is not allowed / not identifiable → enter another number
otp_rate_limitedyesnoResend cooldown → wait, then retry
email_otpotp_mismatch · otp_expired · otp_send_failed · otp_rate_limitedyesnoAs for phone_otp
email_invalid · email_disposableyesnoMalformed or refused address / disposable domain blocked → enter another
portrait_icaoicao_pose · icao_eyes · icao_mouth · icao_occlusion · icao_lighting · icao_background · icao_resolutionyesyesThe first failing ICAO criterion → capture the portrait again
portrait_not_from_livenessyesyesThe portrait isn't the person in the liveness clip
media_unreadableyesnoNo usable image / face
eid_autheid_identifier_invalidyesnoThe national number was refused → enter it again
eid_code_invalid · eid_code_expiredyesnoWrong or expired code → type it again, or ask for a new code
eid_resend_too_soonyesnoWait until resendAvailableAt
eid_resend_limityesnoNo more codes (3 resends) → type the last code received, or use the camera path
eid_unavailableyesnoThe provider is down → try again, or use the camera path
eid_not_enrollednonoThe number has no account in the provider's app → use the camera path when offered
eid_lockednonoToo many wrong codes → use the camera path when offered
nationality_not_allowed · underage · age_unverifiable · name_mismatch · birth_date_mismatch · nationality_mismatchnonoThe eID verified the person, then a profile rule or your subject data rejected the session
nfc_chipchip_read_failed · chip_access_denied · chip_parse_failedyesnoNative SDKs only: read again
chip_not_present · nfc_unavailable · chip_document_mismatch · chip_integrity_failed · registry_mismatch · document_nni_mismatchnonoNative SDKs only: final
platform_unsupportednonoSkip reason of a preferred chip step on the web

Only a passed (reason-less) OTP check is billed; a chip read bills when it passes or goes to review.

Retryable reasons park the check at input_required while attempts remain (4 per check by default; a flow can override) and surface as status: 'retry' with autoRetry on. Non-retryable reasons settle the check.

Step input errors (InvalidInputError, OtpInputError, §4.5)

fieldkindCause
phoneformatNot an E.164 number (+222…)
codeformatNot a 6-digit code
nniformatNot 10 digits
nnicheck_digit10 digits, wrong check digit (isValidNni() checks it ahead of time)
identifierformat / check_digiteid step: the national number (the NNI in Mauritania), same checks as nni
emailformatNot an email address (OtpInputError)
channelrequired / unavailableSeveral channels offered and none chosen, or a channel the step does not offer (OtpInputError)

Nothing was submitted or billed; ask for the same field again.

Result screens (result step display, §4.5)

displayWhenWhat to show
approvedCompleted, approvedSuccess (your server confirms)
reviewParked for human review, or completed with outcome review"We are reviewing your verification"
rejectedFailed without a policy reason"Your identity could not be verified"
expiredThe session expiredOffer a new session
policy_stopA profile rule stopped the session (failureReason: location_not_allowed, nationality_not_allowed, underage, document_type_not_accepted, …)The rule, without blaming the user
cooldowndevice_cooldown; retryAfter says when"Try again after …"
attempts_exhaustedA check used all its attemptsOffer a new session later
platform_unsupportedThe profile needs a step the web cannot run (mandatory chip reading); result.status is unavailable"This verification needs a phone app."

SDK-side reasons (status: 'unavailable')

no_recorder · attestation · network · registry_unavailable · nni_unbound · (none) on session expiry — see §5. Session failureReason platform_unsupported (a mandatory chip step on the web) also reports unavailable (§4.5).

API error codes you may meet

CodeHTTPWhere
nni_locked409A browser submitted an NNI different from the bound one
contact_locked409The phone/email choice can no longer change (a contact step passed), or the session has no choice
identity_confirm_required409A live-photo submit before the person confirmed the identity summary
identity_confirm_locked409No identity summary is pending, or a retake is no longer possible
consent_required4xxA submit before consent (the SDK records consent first; you only see this when composing calls yourself)
attestation_invalid4xxTurnstile token rejected
session_not_active4xxSession expired or terminal
rate_limit_exceeded429§7
idempotency_key_collision, idempotency_in_progress409§3

@sekyro/web exports HostedApiError { status, code, retryAfterSeconds? } and KNOWN_CODES / isKnownCode(); @sekyro/node throws SekyroApiError { status, code, requestId, retryable }. Quote requestId when contacting support.

On this page