Straddle’s identity verification engine uses machine learning models trained on millions of data points to assess risk in real-time. When you create a customer, multiple scoring models analyze different aspects of the provided information—from synthetic identity patterns to email reputation—delivering a comprehensive risk assessment within milliseconds.

What This Guide Covers

  • Decision outcomes: How Straddle determines customer status (verified, review, rejected)
  • Risk scores: Understanding fraud and synthetic identity scoring ranges
  • Correlation scores: How PII elements are validated against each other
  • Breakdown structure: Accessing detailed scores for each verification module
  • Implementation patterns: Using scores to optimize approval rates

Understanding the Review Response

When you call GET /v1/customers/{id}/review, the response contains detailed scoring breakdowns organized by verification module:
{
  "identity_details": {
    "breakdown": {
      "fraud": {
        "decision": "accept",
        "risk_score": 0.125,
        "codes": ["I520", "I601"]
      },
      "synthetic": {
        "decision": "accept", 
        "risk_score": 0.089,
        "codes": ["I1004"]
      },
      "email": {
        "decision": "accept",
        "correlation_score": 0.75,
        "correlation": "match",
        "codes": ["I556"]
      },
      "phone": {
        "decision": "accept",
        "correlation_score": 0.82,
        "correlation": "match",
        "codes": ["I618"]
      },
      "address": {
        "decision": "accept",
        "correlation_score": 0.91,
        "correlation": "match",
        "codes": ["I708"]
      }
    }
  }
}

Breakdown Modules

Each module evaluates a specific aspect of identity:
ModulePurposeKey Metrics
fraudOverall fraud risk assessmentrisk_score
syntheticSynthetic identity detectionrisk_score
emailEmail reputation and correlationcorrelation_score, correlation
phonePhone verification and correlationcorrelation_score, correlation
addressAddress validation and correlationcorrelation_score, correlation
business_identificationBusiness-specific verification (business customers only)Various

Decision Values

Each module returns a decision field with one of these values:
DecisionMeaningImpact on Customer Status
acceptModule passed verificationContributes to verified status
reviewManual review recommendedMay trigger review status
rejectModule failed verificationMay trigger rejected status
The overall customer status is determined by combining all module decisions. A single reject or multiple review decisions typically result in a non-verified status.

Risk Scores

Risk scores predict the likelihood of fraud, with higher scores indicating greater risk:

Score Interpretation

Risk scores range from 0 to 1, with higher scores indicating greater risk. Your platform should define thresholds based on your risk tolerance.

Fraud Risk Score

The fraud.risk_score evaluates overall identity fraud probability based on:
  • Consistency of provided PII
  • Velocity patterns (multiple applications)
  • Known fraud indicators
  • Behavioral anomalies

Synthetic Identity Risk Score

The synthetic.risk_score specifically detects fabricated identities:
  • Randomized SSN patterns
  • Inconsistent credit history
  • Unusual PII combinations
  • Missing digital footprint

Accessing Risk Scores

// Get detailed review information
const review = await straddle.customers.review(customerId);

// Access risk scores from breakdown
const fraudScore = review.identity_details.breakdown.fraud.risk_score;
const syntheticScore = review.identity_details.breakdown.synthetic.risk_score;

if (fraudScore > 0.7 || syntheticScore > 0.9) {
  // High risk - implement additional verification
  console.log('Customer requires enhanced due diligence');
}

Correlation Scores

Correlation scores measure how well PII elements match authoritative data sources:

Correlation Categories

The correlation field categorizes the strength of correlation:
CategoryMeaning
high_confidenceStrong correlation - PII elements verified together
likely_matchGood correlation - most elements match
potential_matchPartial correlation - some elements match
low_confidenceWeak or no correlation - elements don’t match records

Module-Specific Correlations

  • Email Correlation: Verifies email ownership and age
  • Phone Correlation: Confirms phone number association
  • Address Correlation: Validates current residence

Using Correlation Scores

const review = await straddle.customers.review(customerId);
const { email, phone, address } = review.identity_details.breakdown;

// Check correlation strength
if (email.correlation === 'low_confidence') {
  console.log('Email cannot be verified - request alternative email');
}

if (phone.correlation_score < 0.5) {
  console.log('Weak phone correlation - verify phone ownership');
}

// All correlations strong
if (email.correlation === 'high_confidence' && 
    phone.correlation === 'high_confidence' && 
    address.correlation === 'high_confidence') {
  console.log('All PII elements strongly correlated');
}

KYC Validation

The kyc object in the review response provides field-level validation:
{
  "identity_details": {
    "kyc": {
      "decision": "accept",
      "codes": ["I998"],
      "validations": {
        "first_name": true,
        "last_name": true,
        "address": true,
        "city": true,
        "state": true,
        "zip": true,
        "phone": true,
        "email": true,
        "dob": true,
        "ssn": false  // SSN doesn't match records
      }
    }
  }
}

Field Validation Results

  • true: Field matches authoritative data sources
  • false: Field doesn’t match or cannot be verified
  • Field may be omitted if not provided

Using KYC Results

const review = await straddle.customers.review(customerId);
const kyc = review.identity_details.kyc;

// Check overall KYC decision
if (kyc.decision !== 'accept') {
  console.log('KYC verification failed');
}

// Count failed validations
const failedFields = Object.entries(kyc.validations)
  .filter(([field, valid]) => valid === false)
  .map(([field]) => field);

if (failedFields.length > 0) {
  console.log(`Failed KYC fields: ${failedFields.join(', ')}`);
  // Request correction of specific fields
}

Implementation Best Practices

Set Risk Thresholds

  • Define auto-approve thresholds (e.g., fraud score < 0.3)
  • Set manual review ranges (e.g., 0.3-0.7)
  • Configure auto-reject limits (e.g., > 0.9)
  • Adjust based on your risk tolerance

Monitor Patterns

  • Track average risk scores over time
  • Identify common reason codes
  • Analyze correlation patterns
  • Optimize data collection

Handle Edge Cases

  • Implement fallbacks for unknown correlations
  • Collect additional data when needed
  • Provide clear user feedback
  • Document decision rationale

Test Thoroughly

  • Use sandbox to test score ranges
  • Simulate different risk scenarios
  • Verify decision logic
  • Monitor false positive rates

Next Steps