📘 Public beta · Endpoints are stable; OpenAPI specs and SDKs ship monthly. See changelog →
Products
Identity Platform
Errors

Identity Platform · Errors

Identity Platform-specific error codes you'll see, on top of the suite-wide list in Errors.

Verification-specific

HTTPError stringMeaning
400flash challenge expiredTTL elapsed before capture submit. Request a fresh challenge.
400flash challenge nonce mismatchBundle's flashChallengeNonce doesn't match an issued challenge for this customer.
400flash challenge already consumedSingle-use — you've already submitted a capture for this challenge.
400bundle signature invalidHMAC over the canonical bundle JSON doesn't verify with the provided hmacKey.
400frames empty or too largeAt least 1 frame required; max 12 MB base64 per frame.
409replay detectedBundle signature + timestamp seen before. Idempotency-deduped to original response.
422liveness verdict failedBundle persisted, but antiSpoof.fused !== "live". Customer can retry.
422tamper verdict failedKTP capture passed liveness but failed tamper checks (e.g. NIK checksum).

Match-specific

HTTPError stringMeaning
400captureBundleId or liveImage requiredProvide exactly one source for the probe face.
400at most one reference may be providedDon't pass both faceEnrollmentId and referenceImage.
404capture bundle not found or expiredBundle ID is wrong, belongs to another customer, or has been retention-swept.
422no active enrollments for customerMatch against pool requested but customer has no active reference. Enroll first.
422bundle liveness verdict not passedYou're trying to match a bundle whose liveness check failed. Capture again.

KYC tier

HTTPError stringMeaning
403org capability disabled: dukcapilPOST /nik/dukcapil requires per-org capability. Contact support.
409cannot upgrade more than one tier above eligibleE.g. eligible is basic, you tried to upgrade straight to premium. Get the
intermediate verifications first or upgrade in two steps with reasons each.
400reason too shortAnalyst tier override requires at least 20-char reason.

Auth

HTTPError stringMeaning
401missing scope: verifications:viewAPI key issued without this scope. Issue a new key with the right scopes.
401webauthn challenge expiredPasskey enrollment/auth challenges have 5-minute TTL.
429rate limit exceeded: ktp.capture20/min per key. Back off — see Rate limits.

Troubleshooting

"All my captures are landing in requires_review." Check antiSpoof.voters[] and tamper.voters[] in the response. Often the culprit is flash_reflectance (camera flash off, or front-light too bright) or hologram_check (KTP is a scan/photocopy, not original).

"Face match similarity is always low." Look at perReference[]. If all sources are ktp_extract and the KTP photo was glare-damaged, the enrollment quality is poor. Resolve by re-running KTP capture in better lighting, or by ingesting a Dukcapil verdict (which gives you a clean photo).

"replay detected but I'm not replaying." Two clients submitted captures with the same bundle signature within the dedup window. Usually means a client retried after a network error without regenerating its signature. SDK clients handle this for you; raw API clients must generate a fresh signature for each retry.