From verified module to rated pool in one API call.
Pool eligible modules. Get a weighted KeyScore. Get an AAA → NR rating. Get a senior / mezzanine / equity tranche breakdown (70 / 20 / 10) ready for securitization. Then book gain-on-sale and servicing revenue.
The eligibility rule
KeyScore ≥65 on the source module = eligible to enter a pool. Below that, the module stays in the registry but gets routed elsewhere (rehab, supplemental QA, scrap).
The rating function
keystone_pool_rating() is a Postgres function that
takes the weighted KeyScore across the pool's eligible modules
and emits a letter rating:
- AAA — weighted KeyScore ≥90
- AA — 85–89
- A — 80–84
- BBB — 72–79
- NR (not rated) — <72
A pool of 2 × KeyScore-92 modules = AAA, $85,968 collateral, securitization-ready.
The pool-summary API
POST /functions/v1/pool-summary returns:
- rating — AAA / AA / A / BBB / NR
- eligible_collateral — total dollar value
- weighted_keyscore — the weighted-by-value KeyScore
- securitization_ready — boolean
- tranches — senior 70% / mezz 20% / equity 10%
Revenue flow
Capital Rail revenue is gain-on-sale + servicing: 1.5% gain-on-sale + 0.35% servicing on pools rated BBB or better (KeyScore ≥72). Below that, fee-for-rating only.
Who pays for it
GSEs (Fannie, Freddie), LIHTC syndicators (Boston Capital, RBC, Raymond James AH, Enterprise CHP), debt funds, community development financial institutions, and private credit funds — anyone underwriting a pool of modular collateral and needing a defensible rating.
The pool is rated by the same KeyScore the lender already trusts. No spreadsheet, no manual underwriting, no inconsistency between deals.
See a live pool rated in 90 seconds.
The sample workspace ships with two pools — McKinney and LAUSD Classrooms — pre-loaded with rated tranches. You can see the API contract end-to-end.