Skip to content
Last updated

Account Status Codes

Understanding Loan Statuses

Status Descriptions

StatusDescriptionCredit Reporting Impact
PendingApplication submitted, not yet originatedNot reported
OriginatedLoan created but not activatedNot reported
ActiveLoan is active, accruing interestReported based on DPD
FrozenTemporarily suspended (forbearance, SCRA)Reported with Special Comment
AcceleratedFull balance due immediatelyReported as delinquent
ChargedOffWritten off as a lossReported as 64, 97, DA, or DF
PaidOffFully repaidReported as 13
CanceledClosed before activationNot reported

Snapshot Loan Status Values

The snapshot system uses specific status codes:

Snapshot StatusPeach StatusDescription
LOAN_STATUS_PENDINGPendingPre-activation
LOAN_STATUS_ORIGINATEDOriginatedCreated but not active
LOAN_STATUS_ACTIVEActiveNormal active state
LOAN_STATUS_FROZENFrozenTemporarily suspended
LOAN_STATUS_ACCELERATEDAcceleratedFull balance due
LOAN_STATUS_CHARGED_OFFChargedOffWritten off
LOAN_STATUS_PAID_OFFPaidOffFully paid
LOAN_STATUS_CANCELEDCanceledClosed pre-activation
LOAN_STATUS_DECLINEDN/AApplication declined

Account Status Codes

The following codes can appear in Metro 2 files generated by Peach. Codes are either automatically determined by the system based on loan state, or set via API when stopping/deleting credit reporting.

Automatically Determined Codes

These codes are assigned by the system based on loan status and delinquency:

CodeDescriptionWhen Applied
11CurrentAccount is current (0-29 days past due)
13Paid or ClosedLoan status is PaidOff
64Paid in Full - Charge-offLoan charged off (bankruptcy/term) with zero balance
71Past Due 30-59 Days30-59 days delinquent
78Past Due 60-89 Days60-89 days delinquent
80Past Due 90-119 Days90-119 days delinquent
82Past Due 120-149 Days120-149 days delinquent
83Past Due 150-179 Days150-179 days delinquent
84Past Due 180+ Days180+ days delinquent
93Assigned to CollectionsLoan assigned to debt collection agency
97Charged OffLoan charged off (bankruptcy/term) with balance remaining
DADelete Account (Non-Fraud)Reporting deleted, or charged off for legal reasons
DFDelete Account (Fraud)Loan charged off due to fraud

API-Settable Codes (Lender Override)

These codes can be set via the accountStatusCode parameter when calling the credit reporting delete endpoints:

CodeDescriptionRequirements
13Paid or ClosedAccount paid in full or closed with zero balance
61Paid in Full - Voluntary SurrenderRequires: loan paid off, Current Balance = 0, Amount Past Due = 0
62Paid in Full - Collection AccountRequires: loan paid off, Current Balance = 0, Amount Past Due = 0
63Paid in Full - RepossessionRequires: loan paid off, Current Balance = 0, Amount Past Due = 0
93Assigned to CollectionsAccount sent to internal or external collections
95Voluntary SurrenderConsumer voluntarily surrendered; balance may remain
96Merchandise RepossessedCollateral repossessed; balance may remain
97Charged OffUnpaid balance reported as loss
DADelete Account (Non-Fraud)Remove entire account (reasons other than fraud)
DFDelete Account (Fraud)Remove entire account due to confirmed fraud

API Example:

POST /people/{personId}/loans/{loanId}/credit-reporting/{creditAgencyId}/delete
{
  "deletedReason": "other",
  "metro2": {
    "accountStatusCode": "97"
  }
}

Account Status Determination Algorithm

FUNCTION determine_account_status(loan, snapshot, reporting_status):
  
  # Priority 1: Lender-supplied status (API override)
  IF reporting_status.metro2_account_status IS NOT NULL:
    RETURN reporting_status.metro2_account_status
  
  # Priority 2: Deleted reporting status
  IF reporting_status.reporting_status = 'Deleted':
    RETURN 'DA'  # Delete Account Non-Fraud
  
  # Priority 3: Active/Frozen/Accelerated loan status
  IF snapshot.loan_status IN ('Active', 'Frozen', 'Accelerated'):
    
    # Closed with zero balance → Paid or Closed
    IF snapshot.loan.is_closed = True AND snapshot.outstanding_balance_total_amount = 0:
      RETURN '13'  # Paid or Closed
    
    IF snapshot.overdue_number_days < 30:
      RETURN '11'  # Current
    
    # Check if assigned to collection agency
    IF loan.serviced_by = 'DebtCollectionAgency'
       AND loan.collection_agency_status IN ('Assigned', 'PendingAssignment')
       AND loan.collection_agency_assigned_on_date <= date_of_account_info:
      RETURN '93'  # Assigned to Collections
    
    # Delinquency buckets
    IF snapshot.overdue_number_days < 60: RETURN '71'   # 30-59 days
    IF snapshot.overdue_number_days < 90: RETURN '78'   # 60-89 days
    IF snapshot.overdue_number_days < 120: RETURN '80'  # 90-119 days
    IF snapshot.overdue_number_days < 150: RETURN '82'  # 120-149 days
    IF snapshot.overdue_number_days < 180: RETURN '83'  # 150-179 days
    RETURN '84'  # 180+ days
  
  # Priority 4: Paid Off loan status OR closed with zero balance
  IF snapshot.loan_status = 'PaidOff':
    RETURN '13'  # Paid or Closed
  
  # Priority 5: Charged Off loan status
  IF snapshot.loan_status = 'ChargedOff':
    
    IF charged_off_reason = 'fraudulent':
      RETURN 'DF'  # Delete - Confirmed Fraud
    
    IF charged_off_reason = 'legal':
      RETURN 'DA'  # Delete - Non-Fraud
    
    IF charged_off_reason IN ('bankruptcy', 'term'):
      # Check for service credit transaction types that indicate a loss.
      # These indicate a loss even if balance is zero.
      # Note: settlementOfDebtNoLoss is intentionally NOT in this list —
      # it is the variant of settlement credit that does NOT force a 97 status.
      loss_service_credits = find_service_credits(
        types = ['settlementOfDebt', 'fraud', 'badDebt', 'deceased'],
        status = 'Succeeded'
      )
      
      IF snapshot.outstanding_balance_total_amount = 0 AND count(loss_service_credits) = 0:
        RETURN '64'  # Paid in Full - Charge-off (no loss)
      ELSE:
        RETURN '97'  # Charged Off (with balance or loss occurred)
  
  RAISE ERROR "Could not determine account status"

Codes Not Currently Supported

The following Metro 2 Account Status codes exist in the CRRG specification but are not currently supported by Peach (cannot be set via API or auto-determined):

CodeDescriptionNotes
05Account TransferredObsolete as of April 2022 per CRRG
65Paid in Full - Foreclosure StartedNot applicable to current product types
88Claim Filed for Insured PortionGovernment-insured loan specific
89Deed Received in Lieu of ForeclosureMortgage-specific
94Foreclosure CompletedMortgage-specific

Status 64 vs. Status 97 Decision Logic

This is a critical distinction for charge-off reporting:

Status 64 (Paid in Full - Charge-off):

  • Loan was charged off due to term or bankruptcy reason
  • Balance is now ZERO
  • No loss-indicating service credit transaction types (settlementOfDebt, fraud, badDebt, deceased) were used to bring the balance to zero
  • settlementOfDebtNoLoss and bankruptcy are NOT counted as loss credits, so a balance zeroed via those types can still report 64
  • Account is terminal (stops reporting after final report)

Status 97 (Charged Off):

  • Loan was charged off due to term or bankruptcy reason
  • Balance is GREATER than zero, OR
  • Balance is zero BUT loss-indicating service credit transaction types (settlementOfDebt, fraud, badDebt, deceased) were used
  • Account continues reporting (or reports final 97 if zero balance with loss)

Service Credit Transaction Types Indicating Loss: Only service credits of type settlementOfDebt, fraud, badDebt, or deceased indicate the lender took a loss. Even with a zero balance, these accounts report status 97 instead of 64 because the account was not "paid in full." settlementOfDebtNoLoss is explicitly NOT in this list — it is the variant for settlement scenarios where the lender does not want a loss recorded, allowing a 64 outcome.

Decision Logic:

IF charged_off_reason IN ('bankruptcy', 'term'):
  # Check for service credit transaction types that indicate a loss.
  # settlementOfDebtNoLoss is intentionally NOT in this list — that is the
  # variant of settlement credit that does NOT force a 97 status.
  loss_service_credits = find_service_credits(
    types = ['settlementOfDebt', 'fraud', 'badDebt', 'deceased'],
    status = 'Succeeded'
  )
  
  IF outstanding_balance_total_amount = 0 AND count(loss_service_credits) = 0:
    RETURN Status 64  # Paid in Full - Charge-off (no loss)
  ELSE:
    RETURN Status 97  # Charged Off (balance remaining or loss occurred)

IF charged_off_reason = 'fraudulent':
  RETURN Status DF  # Delete - Confirmed Fraud

IF charged_off_reason = 'legal':
  RETURN Status DA  # Delete - Non-Fraud

Delinquency Scenarios

Delinquency Timeline Example

Month 1: Payment Due $100, Paid $0
  DPD: 30+ on due date + 30 days
  Status: 71 (30-59 days past due)

Month 2: Payment Due $100, Paid $0 (cumulative missed: $200)
  DPD: 60+
  Status: 78 (60-89 days past due)

Month 3: Payment Due $100, Paid $0 (cumulative missed: $300)
  DPD: 90+
  Status: 80 (90-119 days past due)

Month 4: Payment Due $100, Paid $0 (cumulative missed: $400)
  DPD: 120+
  Status: 82 (120-149 days past due)

Month 5: Payment Due $100, Paid $0 (cumulative missed: $500)
  DPD: 150+
  Status: 83 (150-179 days past due)

Month 6: Payment Due $100, Paid $0 (cumulative missed: $600)
  DPD: 180+
  Status: 84 (180+ days past due)

Partial Payment Scenarios

Scenario: Monthly payment is $500, borrower pays $300.

IF paid_amount >= scheduled_payment:
  Status remains current (11) or advances toward current
ELSE:
  Shortfall accumulates toward overdue balance
  Status determined by total DPD

Re-aging (Cure)

When a delinquent borrower becomes current:

Month 1: Status 78 (60-89 DPD)
Month 2: Borrower pays all past-due amounts
  DPD resets to 0
  Status: 11 (Current)
  Payment History: Previous months retain delinquency codes

Charge-Off Reasons

Peach supports the following charge-off reasons:

ReasonMetro 2 StatusDescription
term64 or 97Standard charge-off (contractual delinquency)
bankruptcy64 or 97Borrower filed bankruptcy
fraudulentDFAccount is fraudulent
legalDALegal reasons (litigation, errors)