Process Prefill Verification Results
Route users based on ACCEPT, REJECT, and REVIEW decisions from Prefill + KYC Direct API evaluations returned by RiskOS™.
How to interpret the response
After creating an evaluation, use the response to determine how your application should route the user and continue the verification flow.
Your integration should not rely on a single field. Always evaluate decision + status + sub_status + tags together when determining next steps.
decision→ High-level outcome (ACCEPT,REJECT,REVIEW)status→ Whether the evaluation is complete (CLOSED,ON_HOLD)sub_status→ The current verification state (for example,Awaiting Customer OTPorMore information needed)tags→ Why the decision was made and what action is required next
For the full response schema, see the Evaluation API Reference.
Evaluation flow (how decisions are made)
This workflow evaluates users in stages:
-
Digital Intelligence (device risk)
Detects high-risk device and network signals. -
Phone Risk and One-Time Passcode (OTP) step-up
If the phone requires verification, RiskOS™ pauses the evaluation and sends an OTP. -
Prefill
After the user approves the OTP, RiskOS™ attempts to retrieve prefill data. -
Additional identity data
If more information is required, your application must collect the user's full identity data and continue the evaluation. -
Final screening
RiskOS™ completes Verify, fraud, synthetic identity, and watchlist checks before returning a terminal decision.
If no blocking risks are found, the evaluation completes. Otherwise, it may:
- Reject immediately, or
- Pause for OTP or additional identity data
Decision outcomes
| Decision | Status | Meaning | Action |
|---|---|---|---|
ACCEPT | CLOSED | The evaluation completed successfully. | Continue onboarding. |
REJECT | CLOSED | The user failed a critical risk or verification check. | Stop or route to fallback. |
REVIEW | ON_HOLD | Additional verification or identity data is required. | Continue the verification flow (OTP or identity collection). |
Outcome handling
REVIEW — One-Time Passcode required
REVIEW — One-Time Passcode requiredNote:
See Handle Additional Verification for full implementation details for OTP, identity data collection, and DocV flows.
The evaluation is paused while the user completes OTP verification.
Key signals:
decision: "REVIEW"status: "ON_HOLD"sub_status: "Awaiting Customer OTP"tagscontainsOTP Triggered
{
"decision": "REVIEW",
"status": "ON_HOLD",
"sub_status": "Awaiting Customer OTP",
"tags": [
"OTP Triggered"
]
}What to do:
- Prompt the user to enter the OTP.
- Submit the code using
PATCH /api/evaluation/{eval_id}. - Continue the evaluation after OTP is verified.
REVIEW — Additional identity data required
REVIEW — Additional identity data requiredAfter OTP verification, the evaluation may still require additional identity data.
Key signals:
decision: "REVIEW"status: "ON_HOLD"sub_status: "More information needed"tagscontainsAdditional PII Requested
What to do:
- If
Prefill Successful, display prefilled data to the user - If
Prefill Unsuccessful, collect identity data manually - Submit data using
PATCH /api/evaluation/{eval_id}
ACCEPT
ACCEPTThe evaluation completed successfully and the user passed the workflow checks.
{
"decision": "ACCEPT",
"status": "CLOSED",
"sub_status": "Accept",
"tags": [
"OTP Triggered",
"OTP Approved",
"Prefill Successful",
"Approved to Display the Prefill Data"
]
}What to do:
- Continue onboarding.
- Grant access or create the account.
REJECT
REJECTThe user failed a critical risk or verification check.
Common reject patterns in this workflow include:
- High-risk or unsupported phone signals
- Failed Verify checks
- SSN mismatch
- Watchlist hit
Example: phone risk reject
{
"decision": "REJECT",
"status": "CLOSED",
"sub_status": "Reject",
"tags": [
"Phone - High Risk",
"Phone is Landline"
]
}Example: Verify reject
{
"decision": "REJECT",
"status": "CLOSED",
"sub_status": "Reject",
"tags": [
"OTP Triggered",
"OTP Approved",
"Prefill Unsuccessful",
"Additional PII Requested",
"SSN Does Not Match - Reject",
"Verify Reject"
]
}Example: watchlist reject
{
"decision": "REJECT",
"status": "CLOSED",
"sub_status": "Reject",
"tags": [
"Phone - High Risk",
"OTP Triggered",
"OTP Approved",
"Prefill Unsuccessful",
"Additional PII Requested",
"Watchlist Review"
]
}What to do:
- Stop onboarding.
- Route to a fallback, manual review, or decline flow.
Common routing signals
Use the response fields together to decide the next step.
| Signals | Meaning | What to do |
|---|---|---|
REVIEW + ON_HOLD + Awaiting Customer OTP + OTP Triggered | The user must complete OTP verification. | Prompt for OTP and patch the evaluation. |
REVIEW + ON_HOLD + More information needed + Additional PII Requested + Prefill Successful | Prefill data is available, but more identity data is still required. | Display approved prefill data and collect remaining fields. |
REVIEW + ON_HOLD + More information needed + Additional PII Requested + Prefill Unsuccessful | Prefill was not available. | Show a blank or partial form and collect identity data manually. |
ACCEPT + CLOSED | Final accept. | Continue onboarding. |
REJECT + CLOSED | Final reject. | Stop or route to fallback. |
Route the user
Use decision as the primary routing field, then use status, sub_status, and tags to refine the user experience.
if (data.decision === "REVIEW" && data.status === "ON_HOLD") {
if (data.sub_status === "Awaiting Customer OTP" && data.tags?.includes("OTP Triggered")) {
router.push("/enter-otp");
}
if (
data.sub_status === "More information needed" &&
data.tags?.includes("Additional PII Requested")
) {
if (data.tags?.includes("Prefill Successful")) {
router.push("/prefill-review");
} else {
router.push("/complete-identity");
}
}
}Error handling
If the API returns an HTTP error (4xx or 5xx), your application should handle it before processing any evaluation logic.
| Status code | Meaning | What to do |
|---|---|---|
400 | Bad request — missing or invalid fields | Check request body against required fields. |
401 | Unauthorized — invalid or missing API key | Verify your Authorization header. |
404 | Not found — invalid eval_id or endpoint | Confirm the eval_id and endpoint URL. |
429 | Rate limited | Back off and retry after the Retry-After header value. |
500 | Internal server error | Retry with exponential backoff (max three attempts). |
For the full error schema and all error codes, see the Errors Reference.
Persist evaluation state
Store these fields so your application can resume and route the evaluation correctly:
ideval_iddecisionstatussub_statustagsworkflow(optional)
Key takeaways
- Use
decision+status+sub_status+tagstogether. REVIEWmeans the evaluation is paused, not complete.OTP Triggeredmeans your application should collect and submit an OTP.Additional PII Requestedmeans your application must collect more identity data.Prefill Successfuldoes not necessarily mean final acceptance.ACCEPTandREJECTare terminal outcomes in this workflow.
Updated 11 days ago
