Skip to main content

Balances File

All Balances

ValidationDescription
All Balances with a non-terminal status must be reported dailyAll Balances that exist in a non-terminal status on T-1 must be reported in the Balance file submitted on day T. The Subledger Balance object created via the API and the Balance record in the file represent the same underlying object — meaning this validation applies to any Subledger Balance objects. Subledger Balance objects created on T-1 must be included in day T’s Balance file. A newly created Subledger Balance with a zero-dollar balance must still appear in the next day’s file.
New Balances can only be created either via API or files, but not bothFor programs that use the Subledger Balance API to create Balances, only the API can be used to create new Balances. Lead validates that no new, unrecognized balances appear in a Balance file. For programs that use the Balance file to create Balances, only the file can be used to create new Balances. For these use cases, unrecognized balances can appear in a Balance file, and we treat these as new Balance objects to be created in Lead’s system.
Balance file account_id must match the API recordBecause they represent the same underlying object, Lead validates that the account_id associated with a given Balance in a Balance file matches the account_id that was used to create the Balance via the Subledger Balance API.

Deposit Balance

See Balance Reconciliation and Examples for specific examples.
ValidationDescription
balance on t = balance on t-1 + daily_activity on tdaily_activity on t = sum(transactions.amount) where transactions.type not in (interest_accrued,dispute_won)
rewards_balance on t = rewards_balance on t-1 + daily_rewards_activity on tdaily_rewards_activity on t = sum(transactions.rewards_amount) where transactions.type in (rewards_earned, rewards_spent, rewards_redeemed,debit, refund,credit)
interest_accrued_balance on t = interest_accrued_balance on t-1 + daily_interest_activity on tdaily_interest_activity on t = transactions.amount where transactions.type=interest_accrued - transactions.amount where transactions.type= interest_paid
dispute_balance on t = dispute_balance on t-1 + daily_dispute_activity on tdaily_dispute_activity on t = sum (amount) where transactions.type in (dispute_provisional, dispute_won, dispute_lost)
charge_off_balance on t = charge_off_balance on t-1 + daily_charge_off_activity on tdaily_charge_off_activity on t = sum (transactions.amount) where transactions.typein (charge_off, charge_off_recovery)

Credit Balance

See Balance Reconciliation and Examples for specific examples.
ValidationDescription
balance on t = balance on t-1 + daily_activity on tdaily_activity on t = sum(transactions.amount) where transactions.type not in (charge_off_recovery,dispute_won)
any balance across balance, dispute_balance, past_due_balance, charge_off_balance will have the following validations:*balance = *principal + *interest + *fees
outstanding_principal on t = outstanding_principalon t-1 + daily_principal_activity on tdaily_principal_activity on t = sum (transactions.principal_amount) where transactions.type not in (fee,interest_accrued,charge_off_recovery,dispute_won)
outstanding_fees on t = outstanding_feeson t-1 + daily_fees_activity on tdaily_fees_activity on t = sum(transactions.fee_amount) where transactions.type not in (disbursement,interest_accrued,charge_off_recovery,dispute_won)
outstanding_interest on t = outstanding_interest on t-1 + daily_interest_activity on tdaily_interest_activity on t = sum(transactions.interest_amount) where transactions.type not in (disbursement,fee,charge_off_recovery,dispute_won)
rewards_balance on t = rewards_balance on t-1 + daily_rewards_activity on tdaily_rewards_activity on t = sum(transactions.rewards_amount) where transactions.type in (rewards_earned, rewards_spent, rewards_redeemed,disbursement, refund,client_credit)
dispute_balance on t = dispute_balance on t-1 + daily_dispute_activity on tdaily_dispute_activity on t = -transactions.amount where transactions.type = dispute_provisional+ transactions.amount where transactions.type = dispute_won - transactions.amount where transactions.type = dispute_lost (the same logic applies for dispute_principal, dispute_fees ,dispute_interest)
charge_off_balance on t = charge_off_balance on t-1 + daily_charge_off_activity on tdaily_charge_off_activity on t = - transactions.amount where transactions.type = charge_off + transactions.amount where transactions.type = charge_off_recovery (the same logic applies for charge_off_principal , charge_off_fees ,charge_off_interest)
past_due_balance <= balancepast_due_principal <= outstanding_principal;
past_due_fees <= outstanding_fees ;
past_due_interest <= outstanding_interest

If a credit balance is both past due and charged off, the amount should only be included in charge_off_balance and not in past_due_balance.
Balances with processing Funding objects cannot be closedLead validates that any Balance being reported as closed in a Balance file does not have associated Funding objects in a processing status. This ensures that Funding objects that eventually post can be reported as disbursement transactions, which would not be possible if the Balance has a closed status.

Transactions File

ValidationDescription
All transaction IDs must be uniqueAll transaction IDs in this file are unique and have never been seen in a Transactions file before. This validation is how Lead ensures that no duplicate transactions are accidentally reported.
All posted Fundings from T-1 must be reportedLead validates that any Funding objects that transitioned to a posted status during T-1 (as measured by your program’s definition of a 24-hour period) are reported in the Transaction file.
Reported Funding objects must be in a posted statusLead validates that any Funding object reported in a Transaction file (represented as a Transaction record with type = disbursement) is in a posted status. This prevents a case where a pending Funding object is reported prematurely.
balance_id on the Transaction and Funding object must matchLead validates that any disbursement transaction reported with a funding_id has a balance_id that matches the subledger_balance_id on the Funding object.
Funding effective_at must match the posted timestampLead validates that all Funding objects reported have an effective_at date that matches when the Funding object transitioned to a posted status. For example, if a Funding object transitioned to a posted status anytime during the 2025-12-31 24-hour period, the reported effective_at date must be set to 2025-12-31.
No duplicate funding_id valuesLead validates that any funding_id reported in a Transaction file has not previously been reported and successfully processed. This prevents a case where a duplicate receivable is created for a single Funding request.