from typing import Literal
from pydantic import BaseModel, Field
BureauName = Literal[
"equifax",
"experian",
"transunion",
"innovis",
"lexisnexis",
"other",
]
AccountType = Literal["revolving", "installment", "mortgage", "charge", "other"]
CollateralType = Literal[
"unsecured",
"real_estate",
"vehicle",
"cash_deposit",
"education",
"misc_asset",
]
AccountStatus = Literal[
"current",
"delinquent",
"charged_off",
"collection",
"bankruptcy",
"foreclosure",
"repossession",
"settled",
"closed",
"unknown",
]
class CRAddress(BaseModel):
address_line_1: str | None = None
city: str | None = None
state: str | None = None
zip_code: str | None = None
country: str | None = None
is_primary: bool | None = None
class CREntity(BaseModel):
full_name: str | None = None
address: list[CRAddress] | None = None
date_of_birth: str | None = None
has_fraud_alert: bool | None = None
has_security_freeze: bool | None = None
class CreditInquiry(BaseModel):
creditor_name: str | None = None
inquiry_date: str | None = None
class CreditBureau(BaseModel):
name: BureauName
display_name: str | None = None
inquiries: list[CreditInquiry] | None = None
class CreditAccount(BaseModel):
account_name: str | None = None
account_number: str | None = None
is_open: bool | None = None
is_authorized_user: bool | None = None
is_self_reported: bool | None = None
account_type_normalized: AccountType | None = None
account_status_normalized: AccountStatus | None = None
collateral_type: CollateralType | None = None
date_opened: str | None = None
date_closed: str | None = None
recent_balance: float | None = None
credit_limit: float | None = None
date_of_most_recent_report: str | None = None
worst_delinquency_days: int | None = None
payment_status: str | None = None
monthly_payment: float | None = None
high_credit_balance: float | None = None
class CreditScore(BaseModel):
score: int | None = None
# fico_8 | fico_9 | fico_other | vantage_3 | vantage_4 | other | unknown
score_model: str | None = None
score_model_raw: str | None = None # model name exactly as printed
score_model_display: str | None = None # "FICO 8", "VantageScore 3.0", ...
date_of_score: str | None = None
class PublicRecord(BaseModel):
record_type: str | None = None # bankruptcy | judgment | lien | other
description: str | None = None # as printed: "Chapter 7 Bankruptcy"
status: str | None = None # as printed: "Discharged", "Dismissed", "Satisfied"
date_filed: str | None = None
date_resolved: str | None = None # discharged, dismissed, satisfied or released
amount: float | None = None
class BureauReport(BaseModel):
credit_bureau: CreditBureau
underwritten_accounts: list[CreditAccount] = Field(default_factory=list)
scores: list[CreditScore] = Field(default_factory=list) # every score printed
fico_score: CreditScore | None = None # headline score picked from scores
public_records: list[PublicRecord] = Field(default_factory=list)
class CRMeta(BaseModel):
primary_entity: CREntity | None = None
credit_report_body: list[BureauReport] | None = None