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.

Name your quarter Read the register

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.

  1. Stage 1, apply

    artifactApplication

    Reg B’s own trigger, 12 CFR 1002.2(f). Clocks start, duties attach.

    Register rows for apply
    capabilityroutegateanswers
    Application state and stageGET /v1/applications/{id}noneUNRATIFIED
    Application intakePOST /v1/applicationssigner-R · take the ApplicationBLOCKED
    Timer ladder, every rung with a named partyGET /v1/applications/{id}/clocksnoneUNRATIFIED
  2. Stage 2, disclose

    artifactDisclosure

    TRID: the Loan Estimate in three business days, the Closing Disclosure three before consummation.

    Register rows for disclose
    capabilityroutegateanswers
    Disclosure rendering, delivery evidence attachedPOST /v1/applications/{id}/disclosuresnoneUNRATIFIED
    Redisclosure on a changed circumstancePOST /v1/applications/{id}/disclosures/reissuenoneUNRATIFIED
  3. Stage 3, decide

    artifactDecision

    The Lender’s typed determination. A declination is a Decision.

    Register rows for decide
    capabilityroutegateanswers
    Advisory proposal, no commit powerPOST /v1/applications/{id}/proposalsnoneUNRATIFIED
    DecisionPOST /v1/applications/{id}/decisionsigner-R · decideBLOCKED
    Decision artifact intake, adverse-action notice insidePUT /v1/applications/{id}/decisionnoneUNRATIFIED
  4. 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
    capabilityroutegateanswers
    Consummation recordPOST /v1/applications/{id}/consummationnoneUNRATIFIED
    Rescission windowGET /v1/applications/{id}/rescissionnoneUNRATIFIED
    Notarial act, including remote online notarizationPOST /v1/signingssigner-L · notary commissionBLOCKED
  5. Stage 5, fund

    artifactAdvance

    Money moves, with a settlement reference on the event.

    Register rows for fund
    capabilityroutegateanswers
    Extension of creditPOST /v1/facilitiessigner-R · extend creditBLOCKED
    Advance against a Mandate, inside the Lender’s ceilingPOST /v1/facilities/{id}/advancesaccess · sponsor-bank railUNRATIFIED
  6. Stage 6, perfect

    artifactPerfection

    The filing office’s own acceptance. Not our claim, not the Lender’s.

    Register rows for perfect
    capabilityroutegateanswers
    Perfection filingPOST /v1/collateral/{id}/perfectionaccess · county e-recordingUNRATIFIED
    Filing status, as the recording office answersGET /v1/collateral/{id}/perfectionnoneUNRATIFIED
    Release filingPOST /v1/collateral/{id}/releaseaccess · county e-recordingUNRATIFIED
  7. Terminal outcomes

    Five terminal outcomes, the HMDA action-taken list: funded, offered-not-accepted, declined, withdrawn, closed-incomplete.

  8. 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/intents/{id}/route is the cure every LENDER_RESERVED refusal names: the marketplace of licensed Lenders this door will operate.

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.

For example Q1 2027.