| Status | Description | Credit Reporting Impact |
|---|---|---|
| Pending | Application submitted, not yet originated | Not reported |
| Originated | Loan created but not activated | Not reported |
| Active | Loan is active, accruing interest | Reported based on DPD |
| Frozen | Temporarily suspended (forbearance, SCRA) | Reported with Special Comment |
| Accelerated | Full balance due immediately | Reported as delinquent |
| ChargedOff | Written off as a loss | Reported as 64, 97, DA, or DF |
| PaidOff | Fully repaid | Reported as 13 |
| Canceled | Closed before activation | Not reported |
The snapshot system uses specific status codes:
| Snapshot Status | Peach Status | Description |
|---|---|---|
LOAN_STATUS_PENDING | Pending | Pre-activation |
LOAN_STATUS_ORIGINATED | Originated | Created but not active |
LOAN_STATUS_ACTIVE | Active | Normal active state |
LOAN_STATUS_FROZEN | Frozen | Temporarily suspended |
LOAN_STATUS_ACCELERATED | Accelerated | Full balance due |
LOAN_STATUS_CHARGED_OFF | ChargedOff | Written off |
LOAN_STATUS_PAID_OFF | PaidOff | Fully paid |
LOAN_STATUS_CANCELED | Canceled | Closed pre-activation |
LOAN_STATUS_DECLINED | N/A | Application declined |
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.
These codes are assigned by the system based on loan status and delinquency:
| Code | Description | When Applied |
|---|---|---|
11 | Current | Account is current (0-29 days past due) |
13 | Paid or Closed | Loan status is PaidOff |
64 | Paid in Full - Charge-off | Loan charged off (bankruptcy/term) with zero balance |
71 | Past Due 30-59 Days | 30-59 days delinquent |
78 | Past Due 60-89 Days | 60-89 days delinquent |
80 | Past Due 90-119 Days | 90-119 days delinquent |
82 | Past Due 120-149 Days | 120-149 days delinquent |
83 | Past Due 150-179 Days | 150-179 days delinquent |
84 | Past Due 180+ Days | 180+ days delinquent |
93 | Assigned to Collections | Loan assigned to debt collection agency |
97 | Charged Off | Loan charged off (bankruptcy/term) with balance remaining |
DA | Delete Account (Non-Fraud) | Reporting deleted, or charged off for legal reasons |
DF | Delete Account (Fraud) | Loan charged off due to fraud |
These codes can be set via the accountStatusCode parameter when calling the credit reporting delete endpoints:
| Code | Description | Requirements |
|---|---|---|
13 | Paid or Closed | Account paid in full or closed with zero balance |
61 | Paid in Full - Voluntary Surrender | Requires: loan paid off, Current Balance = 0, Amount Past Due = 0 |
62 | Paid in Full - Collection Account | Requires: loan paid off, Current Balance = 0, Amount Past Due = 0 |
63 | Paid in Full - Repossession | Requires: loan paid off, Current Balance = 0, Amount Past Due = 0 |
93 | Assigned to Collections | Account sent to internal or external collections |
95 | Voluntary Surrender | Consumer voluntarily surrendered; balance may remain |
96 | Merchandise Repossessed | Collateral repossessed; balance may remain |
97 | Charged Off | Unpaid balance reported as loss |
DA | Delete Account (Non-Fraud) | Remove entire account (reasons other than fraud) |
DF | Delete 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"
}
}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"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):
| Code | Description | Notes |
|---|---|---|
05 | Account Transferred | Obsolete as of April 2022 per CRRG |
65 | Paid in Full - Foreclosure Started | Not applicable to current product types |
88 | Claim Filed for Insured Portion | Government-insured loan specific |
89 | Deed Received in Lieu of Foreclosure | Mortgage-specific |
94 | Foreclosure Completed | Mortgage-specific |
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 settlementOfDebtNoLossandbankruptcyare 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, ordeceasedindicate 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."settlementOfDebtNoLossis 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-FraudMonth 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)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 DPDWhen 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 codesPeach supports the following charge-off reasons:
| Reason | Metro 2 Status | Description |
|---|---|---|
term | 64 or 97 | Standard charge-off (contractual delinquency) |
bankruptcy | 64 or 97 | Borrower filed bankruptcy |
fraudulent | DF | Account is fraudulent |
legal | DA | Legal reasons (litigation, errors) |