Asset bulk funding with Modern Treasury.
C#/.NET API caller library — later ported to Python/Django — that drives Ledger Transactions, Payment Orders, and Expected Payments for Home Equity Agreement asset funding batches.
| # | Asset ID | City | Amount | Funding Date | Status |
|---|---|---|---|---|---|
| 01 | 714937485928108394 ◂ | Phoenix, AZ | $285,000 | 02/22/2026 | funded |
| 02 | 293847561029384756 | Denver, CO | $127,500 | 02/22/2026 | funded |
| 03 | 847291038475629104 | Austin, TX | $392,000 | 02/22/2026 | funded |
| 04 | 194837265047382910 | Nashville, TN | $73,200 | 02/22/2026 | funded |
| 05 | 563920184756291038 | Charlotte, NC | $218,000 | 02/22/2026 | funded |
| 06 | 729104856392018475 | Portland, OR | $155,600 | — | pending |
| 07 | 384756291048372910 | Seattle, WA | $427,000 | 02/22/2026 | funded |
| 08 | 102938475629104837 | Minneapolis, MN | $88,400 | 02/22/2026 | funded |
| 09 | 475629104857392018 | Tampa, FL | $312,000 | 02/22/2026 | funded |
| 10 | 618473920184756293 | Columbus, OH | $50,000 | 02/22/2026 | funded |
| 11 | 937485629104857391 | Atlanta, GA | $196,500 | — | pending |
| 12 | 284756391048273920 | San Antonio, TX | $344,000 | 02/22/2026 | funded |
| 13 | 103948576291048372 | Las Vegas, NV | $261,800 | 02/22/2026 | funded |
| 14 | 849201738465920173 | Baltimore, MD | $109,000 | 02/22/2026 | funded |
| 15 | 376291048574839201 | Indianapolis, IN | $67,500 | 02/22/2026 | funded |
| 16 | 502918374659201847 | Sacramento, CA | $183,000 | 02/22/2026 | funded |
| 17 | 738465920173849201 | Raleigh, NC | $405,000 | 02/22/2026 | funded |
| 18 | 291048372948576391 | Richmond, VA | $234,500 | — | pending |
| 19 | 648392018475629104 | Kansas City, MO | $92,800 | 02/22/2026 | funded |
| 20 | 185739204756391048 | Salt Lake City, UT | $168,200 | 02/22/2026 | funded |
| 17 funded assets total | $3,604,400 | ||||
The following sections trace this single asset through account creation, ledger recording, bulk payment order, and fee reconciliation via Expected Payments.
# Django · Step 1 — create 3 MT LedgerAccounts under asset 714937485928108394
def create_asset_funding_accounts(client, asset_id: str, ledger_id: str) -> dict:
line_items = [
("investment_payment", "debit", "Investment Payment"),
("origination_fees", "credit", "Origination Fees"),
("appraisal_concessions", "credit", "Appraisal / Concessions"),
]
accounts = {}
for key, normal, label in line_items:
acct = client.ledger_accounts.create(
name=f"{asset_id} · {label}",
currency="USD",
ledger_id=ledger_id,
normal_balance=normal,
metadata={
"asset_id": asset_id,
"funding_date": "2026-02-22",
"line_item": key,
"batch_id": "BATCH-20260222",
},
)
accounts[key] = acct.id
return accounts
# Returns:
# {
# "investment_payment": "8834927610294857",
# "origination_fees": "3948271059274816",
# "appraisal_concessions": "5610294857384920",
# }{
"description": "Bulk Funding · BATCH-20260222 · 17 assets",
"effective_date": "2026-02-22",
"status": "pending",
"metadata": {
"batch_id": "BATCH-20260222",
"asset_count": "17",
"total_cents": "360440000"
},
"ledger_entries": [
{
"ledger_account_id": "HEA_PORTFOLIO_ACCOUNT_ID",
"amount": 360440000,
"direction": "debit"
},
{
"ledger_account_id": "CASH_FUNDING_ACCOUNT_ID",
"amount": 360440000,
"direction": "credit"
}
]
}{
"amount": 360440000,
"direction": "credit",
"type": "wire",
"originating_account_id": "CASH_FUNDING_ACCOUNT_ID",
"receiving_account": {
"name": "XYZ Title Co.",
"routing_number": "021000021",
"account_number": "4829103847652910",
"account_type": "checking"
},
"metadata": {
"batch_id": "BATCH-20260222",
"asset_count": "17",
"memo": "HEA Bulk Funding 02/22/2026"
}
}This wire covers investment principal only. Origination and appraisal fees are tracked separately as Expected Payments and reconciled when received.
| Line Item | Gross | Adj. | Net |
|---|---|---|---|
| Investment Payment | $285,000 | — | $285,000 |
| Origination Fee | $2,850 | — | $2,850 |
| Appraisal Fee | $3,500 | −$2,000 | $1,500 |
| Concession (coupon) | — | −$2,000 | −$2,000 |
The $2,000 concession is applied against the appraisal fee — effectively a coupon reducing what the fund owes. Both fees return as Expected Payments. Only the investment payment is wired outbound via Payment Order.
# Expected Payment 1 — origination fee
ep_orig = client.expected_payments.create(
internal_account_id=FEE_COLLECTION_ACCOUNT_ID,
direction="credit",
amount_lower_bound=285000, # $2,850 in cents
amount_upper_bound=285000,
description="Origination Fee · 714937485928108394",
metadata={
"asset_id": "714937485928108394",
"fee_type": "origination",
"gross_cents": "285000",
},
)
# Expected Payment 2 — appraisal fee net of $2,000 concession
ep_appr = client.expected_payments.create(
internal_account_id=FEE_COLLECTION_ACCOUNT_ID,
direction="credit",
amount_lower_bound=150000, # $1,500 net ($3,500 − $2,000 concession)
amount_upper_bound=150000,
description="Appraisal Fee (net concession) · 714937485928108394",
metadata={
"asset_id": "714937485928108394",
"fee_type": "appraisal",
"gross_cents": "350000",
"concession_cents": "200000",
"net_cents": "150000",
},
)MT auto-matches incoming transactions to these Expected Payments by exact amount. On match, a webhook fires to Django which posts the closing Ledger Transaction entries — no manual reconciliation.