Seven routes live, keyless
Origination is Lender-Reserved. The types are not.
Every capability from application to lien perfection, published as a versioned type with a typed refusal until its rule ratifies. Build against it now. Your call sites don’t move when a row goes live.
POST /v1/math/amortization HTTP/1.1
host: apis.loans
content-type: application/json
{ "principal": "250000.00", "annual_rate": 0.0625, "term_months": 360, "max_rows": 3 }
HTTP/1.1 200
{
"object": "amortization.schedule",
"status": "PERFORMED",
"route": "POST /v1/math/amortization",
"inputs": {
"principal": "250000.00",
"annual_rate": 0.0625,
"periodic_rate": 0.005208333333333333,
"term_months": 360,
"extra_principal_per_period": null
},
"scheduled_payment": "1539.29",
"final_payment": "1542.60",
"periods_to_payoff": 360,
"totals": {
"principal_paid": "250000.00",
"interest_paid": "304147.71",
"total_paid": "554147.71"
},
"schedule": [
{
"period": 1,
"payment": "1539.29",
"interest": "1302.08",
"principal": "237.21",
"balance": "249762.79"
},
{
"period": 2,
"payment": "1539.29",
"interest": "1300.85",
"principal": "238.44",
"balance": "249524.35"
},
{
"period": 3,
"payment": "1539.29",
"interest": "1299.61",
"principal": "239.68",
"balance": "249284.67"
}
],
"schedule_truncated": true,
"schedule_rows_returned": 3,
"performed": true,
"keyless": true,
"charge": null,
"price": null,
"is_offer": false,
"is_quote": false,
"is_decision": false,
"lender": null,
"note": "Arithmetic on inputs the caller supplied. This platform quotes no rate, offers no term, recommends no product, and decides nothing. It is not a lender."
}
357 more rows
Seven routes answer today.
Arithmetic on numbers you supply. Keyless, free, never an offer or a decision.
- POST /v1/math/amortization
Level-payment schedule, per-period interest and principal.
- POST /v1/math/per-diem
Daily interest on a balance, on the day count you name.
- POST /v1/math/payoff-projection
Projected balance to a date. Arithmetic, not a quote.
- POST /v1/calendars/business-days
Business-day arithmetic, federal holidays computed.
- GET /v1/register
Every route with its gate and what it answers.
- GET /v1/lifecycle
Six verbs, their artifacts, the rules that fix them.
- POST /v1/refusals/explain
The refusal a route carries, and why.
Six verbs. Sixteen routes.
Each route has a gate and the refusal it returns today. No price column: a price posts when a row is live.
-
Stage 1, apply
artifactApplication
Reg B’s own trigger, 12 CFR 1002.2(f). Clocks start, duties attach.
Register rows for apply capability route gate answers Application state and stage GET / v1/ applications/ {id} none UNRATIFIED Application intake POST / v1/ applications signer-R · take the Application BLOCKED Timer ladder, every rung with a named party GET / v1/ applications/ {id}/ clocks none UNRATIFIED -
Stage 2, disclose
artifactDisclosure
TRID: the Loan Estimate in three business days, the Closing Disclosure three before consummation.
Register rows for disclose capability route gate answers Disclosure rendering, delivery evidence attached POST / v1/ applications/ {id}/ disclosures none UNRATIFIED Redisclosure on a changed circumstance POST / v1/ applications/ {id}/ disclosures/ reissue none UNRATIFIED -
Stage 3, decide
artifactDecision
The Lender’s typed determination. A declination is a Decision.
Register rows for decide capability route gate answers Advisory proposal, no commit power POST / v1/ applications/ {id}/ proposals none UNRATIFIED Decision POST / v1/ applications/ {id}/ decision signer-R · decide BLOCKED Decision artifact intake, adverse-action notice inside PUT / v1/ applications/ {id}/ decision none UNRATIFIED -
Stage 4, consummate
artifactConsummation
The moment the Borrower is bound, 12 CFR 1026.2(a)(13). Recorded here, fixed by state law.
Register rows for consummate capability route gate answers Consummation record POST / v1/ applications/ {id}/ consummation none UNRATIFIED Rescission window GET / v1/ applications/ {id}/ rescission none UNRATIFIED Notarial act, including remote online notarization POST / v1/ signings signer-L · notary commission BLOCKED -
Stage 5, fund
artifactAdvance
Money moves, with a settlement reference on the event.
Register rows for fund capability route gate answers Extension of credit POST / v1/ facilities signer-R · extend credit BLOCKED Advance against a Mandate, inside the Lender’s ceiling POST / v1/ facilities/ {id}/ advances access · sponsor-bank rail UNRATIFIED -
Stage 6, perfect
artifactPerfection
The filing office’s own acceptance. Not our claim, not the Lender’s.
Register rows for perfect capability route gate answers Perfection filing POST / v1/ collateral/ {id}/ perfection access · county e-recording UNRATIFIED Filing status, as the recording office answers GET / v1/ collateral/ {id}/ perfection none UNRATIFIED Release filing POST / v1/ collateral/ {id}/ release access · county e-recording UNRATIFIED -
Terminal outcomes
Five terminal outcomes, the HMDA action-taken list: funded, offered-not-accepted, declined, withdrawn, closed-incomplete.
-
Gates
- none
- Keyless or key-only.
- access
- A rail the caller or platform must hold live.
- signer-L
- A licensed act a credentialed human performs under a named sponsor.
- signer-R
- No credential passes it.
POST /
v1/ is the cure every LENDER_RESERVED refusal names: the marketplace of licensed Lenders this door will operate.intents/ {id}/ route
Two refusals. One status code.
Both answer 422. A typed field says which future you’re in.
BLOCKED
The act is reserved, and tier says which kind. LENDER_RESERVED is the four acts a licensed Lender performs alone. It never opens. LICENSED is a notarial, appraisal, MLO, escrow or debt-collection act a credentialed human performs under a named sponsor, priced when its blockers clear. The body names the act, the statutes, the party, and a typed cure.
POST /v1/applications HTTP/1.1
HTTP/1.1 422
{
"object": "application.create",
"status": "BLOCKED",
"route": "POST /v1/applications",
"blocked": {
"act": "TAKE_APPLICATION",
"reason": "RESERVED_ACT",
"tier": "LENDER_RESERVED",
"permanent": true,
"detail": "Taking an Application is an act reserved to a licensed Lender. This platform takes no Application for its own account, and no credential, sponsorship, configuration, or tenant setting clears it.",
"statutes": [
"15 U.S.C. 1691 et seq. (ECOA / Regulation B)",
"12 CFR 1002.2(f) (the Application is Regulation B's own trigger)",
"applicable state lending license law"
],
"reserved_to_party": "Lender",
"cure": {
"route": "LENDER_MARKETPLACE",
"endpoint": "POST /v1/intents/{id}/route",
"needs_human": true,
"human_route": "marketplace",
"description": "Route to a licensed Lender. The Lender takes the Application, runs its own clocks, and issues the Decision. You receive the Decision artifact, with the adverse-action notice inside it if the Decision is a Declination."
}
},
"charge": null,
"note": "No Application exists. Nothing was metered."
}
UNRATIFIED
Software may perform the act. Counsel hasn’t signed off the rules for that act and state pair. The body names what’s missing, the governing rule, who ratifies it, and what clears it. When it clears, the same call returns a record.
GET /v1/applications/{id} HTTP/1.1
HTTP/1.1 422
{
"object": "application",
"status": "UNRATIFIED",
"route": "GET /v1/applications/{id}",
"unratified": {
"act": "READ_APPLICATION_STATE",
"reason": "UNRATIFIED_RULE",
"tier": "OPEN_SURFACE",
"permanent": false,
"detail": "Application state and Stage is open surface. Software may perform it. The Stage and Terminal Outcome tables it reads from are not ratified yet.",
"missing": {
"artifact": "Stage and Terminal Outcome tables",
"governing_rule": "12 CFR 1003.4(a)(8): the HMDA action-taken enumeration, which is the same list as this lifecycle's Terminal Outcomes",
"note": "The Terminal Outcomes are the HMDA action-taken enumeration and the lifecycle may not disagree with the reporting obligation."
},
"ratification_forum": "Counsel",
"would_clear": "A ratified Stage table and Terminal Outcome set. When it ratifies, this same call returns an Application record."
},
"charge": null,
"note": "Nothing was performed. Nothing was metered."
}
Read the tier, not the word. Architect around LENDER_RESERVED once. Hold UNRATIFIED at the refusal and ship the rest.
Four acts never open.
Extend credit.
The Lender extends it.
Take the application.
The Lender takes it; the platform types the state and runs the clocks.
Negotiate terms.
The Lender negotiates them; nothing here quotes a rate or offers a term.
Decide.
The Lender decides; no response here states an approval.
Everything else about a loan is open surface, typed here and refusing until its own rule ratifies.
One key. A family of doors.
One key across the family. apis.loans stands at its own address: not an alias, never a redirect.
-
apis.finance
The hub: catalog, key, rate card.
-
apis.credit
Business credit, KYB, UCC lien search.
-
apis.loans
The origination door. You are here.
-
apis.mortgage
Payoff, lien and eNote data. Waitlist open.
Tell us what you would originate.
The quarter you name sets what we build first.
Recorded.
We build in the order the quarters come in.