Helix.ID
Sign In

Status codes · 3 min

v0.2.1 · Updated 17 Sep 2026View as Markdown

Status codes

The seven verdicts a callback can carry, and what each one means for your user.

Verdicts

status_codeNumericstatusDescription
voice_verified200verifiedVoice matched the enrolled profile successfully.
voice_enrolled201verifiedFirst-time user — voice profile created during this session.
voice_mismatch401failedVoice biometrics did not match the enrolled profile.
synthetic_voice_detected403failedAudio was flagged as AI-generated, replayed, or otherwise spoofed.
challenge_mismatch422failedSpoken digits did not match the displayed challenge.
age_requirement_not_met451failedPredicted speaker age is below the space's minimum. Age-gated spaces only — see note below.
age_inconclusive452failedThe age model could not commit to an answer. Age-gated spaces only — see note below.

Age-gated codes

Both age codes only ever appear for spaces with age prediction enabled. Spaces without age prediction never load the model and never see either.

age_requirement_not_met is a positive answer: the predicted age bucket is below your configured minimum. A model error also returns this code, because we fail closed when the check cannot run.

age_inconclusive is the absence of an answer — the audio was silent or the model's confidence too low to commit. It is handed back to you unresolved, on purpose. Whether an inconclusive voice should be blocked, allowed, or routed to another age-verification method is a compliance decision that belongs to you, not to us, so we do not fold it into age_requirement_not_met. Note that 452 is a Helix convention, not an IANA-registered HTTP code.

String and numeric forms

Your callback always receives the string form — result.statusCode is what you branch on. The numeric column is the equivalent code used elsewhere in the Helix API; both mappings are exported as STATUS_CODE_NUMBERS and STATUS_CODE_STRINGS.