{
  "openapi": "3.1.0",
  "info": {
    "title": "apis.loans",
    "version": "0.1.0",
    "summary": "Origination is Lender-Reserved. The types are not.",
    "description": "apis.loans is not a lender. It extends no credit, takes no Application, negotiates no terms, and decides nothing. The Lender decides. When a row here becomes live, this page will say LIVE before anything else does.\n\nStatus: ROADMAP. Nothing at this door is live. Nothing at this door is priced. Every origination capability from apply through perfect is published as a versioned type today, with its route, its gate, and a documented refusal. The typed refusal is the deliverable. Two refusals, and a typed field says which. BLOCKED carries a tier: LENDER_RESERVED never opens, LICENSED is an act a credentialed human performs and becomes a priced row when its own blockers clear. UNRATIFIED is a date. Every operation publishes the schema of the body it accepts and the schema of the body it answers with, both in #/components/schemas, and every route validates against the one it publishes. A second group of operations, tagged compute, is performed rather than refused: arithmetic and lookups over this document's own canon, which no statute reserves and no counsel has to ratify. Those are keyless and free, they answer 200, and they carry charge: null and price: null like everything else here. This door posts no rate card and serves no x402 endpoint, because nothing here meters, and no operation in this document carries a price.",
    "contact": {
      "email": "keys@apis.finance"
    }
  },
  "servers": [
    {
      "url": "https://apis.loans"
    }
  ],
  "tags": [
    {
      "name": "apply",
      "description": "Application"
    },
    {
      "name": "disclose",
      "description": "Disclosure"
    },
    {
      "name": "decide",
      "description": "Decision"
    },
    {
      "name": "consummate",
      "description": "Consummation"
    },
    {
      "name": "fund",
      "description": "Advance"
    },
    {
      "name": "perfect",
      "description": "Perfection"
    },
    {
      "name": "compute",
      "description": "Performed. Arithmetic and lookups, keyless and free, answering 200."
    }
  ],
  "x-property-status": "ROADMAP",
  "x-origination-status": "ROADMAP",
  "x-compute-status": "PERFORMED",
  "x-terminal-outcomes": [
    "funded",
    "offered-not-accepted",
    "declined",
    "withdrawn",
    "closed-incomplete"
  ],
  "x-lender-reserved-acts": [
    "extend credit",
    "take the Application",
    "negotiate terms",
    "decide"
  ],
  "x-licensed-acts": [
    "notarial",
    "appraisal",
    "MLO",
    "escrow-holder",
    "debt-collection"
  ],
  "components": {
    "schemas": {
      "Money": {
        "type": "string",
        "pattern": "^-?[0-9]{1,12}(\\.[0-9]{1,2})?$",
        "description": "A decimal amount as a string, at most two fractional digits. A string and not a number, because a binary float is the wrong carrier for a principal balance.",
        "examples": [
          "25000.00"
        ]
      },
      "Currency": {
        "type": "string",
        "enum": [
          "USD"
        ],
        "description": "ISO 4217. USD is the only unit this door types today."
      },
      "IsoDate": {
        "type": "string",
        "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$",
        "description": "A calendar date, YYYY-MM-DD. Every clock this door types runs in days.",
        "examples": [
          "2026-08-02"
        ]
      },
      "Rate": {
        "type": "number",
        "minimum": 0,
        "maximum": 1,
        "description": "An annual rate as a decimal fraction, so 7.25% is 0.0725. A fraction and not a percent, because the two are confused exactly once per integration.",
        "examples": [
          0.0725
        ]
      },
      "DayCount": {
        "type": "string",
        "enum": [
          "ACTUAL_365",
          "ACTUAL_360",
          "THIRTY_360"
        ],
        "description": "The day-count convention the per-diem is computed on. No default is assumed; the caller states it."
      },
      "Party": {
        "type": "object",
        "description": "A named party. Lender, Borrower and Obligor-Guarantor are named on every artifact on this door, and an unnamed counterparty is not accepted.",
        "properties": {
          "role": {
            "type": "string",
            "enum": [
              "Lender",
              "Borrower",
              "Obligor-Guarantor"
            ]
          },
          "legal_name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          }
        },
        "required": [
          "role",
          "legal_name"
        ],
        "additionalProperties": false
      },
      "UsState": {
        "type": "string",
        "pattern": "^[A-Z]{2}$",
        "description": "A two-letter US state or territory code.",
        "examples": [
          "TX"
        ]
      },
      "ApplicationCreateRequest": {
        "type": "object",
        "description": "The Application this door will never take for its own account. It is typed in full so a caller's bindings are complete on the day the hand-off route resolves to a named Lender, and it is validated on every call so the shape is checked rather than merely published. POST /v1/applications answers BLOCKED whatever this body contains: taking an Application is reserved, and a well-formed body does not clear a reserved act.",
        "properties": {
          "product": {
            "type": "string",
            "enum": [
              "auto_refinance",
              "auto_purchase",
              "equipment",
              "working_capital",
              "floorplan"
            ],
            "description": "The credit product applied for. Naming it selects nothing and offers nothing."
          },
          "amount_requested": {
            "$ref": "#/components/schemas/Money"
          },
          "currency": {
            "$ref": "#/components/schemas/Currency"
          },
          "state": {
            "$ref": "#/components/schemas/UsState"
          },
          "borrower": {
            "$ref": "#/components/schemas/Party"
          },
          "obligor_guarantor": {
            "$ref": "#/components/schemas/Party"
          },
          "submitted_at": {
            "$ref": "#/components/schemas/IsoDate"
          },
          "idempotency_key": {
            "type": "string",
            "minLength": 8,
            "maxLength": 128
          }
        },
        "required": [
          "product",
          "amount_requested",
          "currency",
          "state",
          "borrower"
        ],
        "additionalProperties": false
      },
      "DisclosureRenderRequest": {
        "type": "object",
        "description": "A Disclosure to render, with the delivery channel the evidence will attach to.",
        "properties": {
          "form": {
            "type": "string",
            "enum": [
              "loan_estimate",
              "closing_disclosure",
              "adverse_action",
              "itemization"
            ]
          },
          "state": {
            "$ref": "#/components/schemas/UsState"
          },
          "delivery": {
            "type": "string",
            "enum": [
              "email",
              "postal",
              "esign_portal"
            ]
          },
          "delivered_at": {
            "$ref": "#/components/schemas/IsoDate"
          }
        },
        "required": [
          "form",
          "state",
          "delivery"
        ],
        "additionalProperties": false
      },
      "DisclosureReissueRequest": {
        "type": "object",
        "description": "A redisclosure, and the changed circumstance that triggers it.",
        "properties": {
          "prior_disclosure_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          },
          "changed_circumstance": {
            "type": "string",
            "enum": [
              "rate_lock",
              "borrower_requested_change",
              "settlement_service_change",
              "eligibility_change",
              "information_inaccurate"
            ]
          },
          "occurred_at": {
            "$ref": "#/components/schemas/IsoDate"
          }
        },
        "required": [
          "prior_disclosure_id",
          "changed_circumstance",
          "occurred_at"
        ],
        "additionalProperties": false
      },
      "ProposalCreateRequest": {
        "type": "object",
        "description": "An Advisory Proposal. It carries no commit power whoever made it, and `advisory` is a const rather than a boolean the caller can flip, because a field that can be set to false is a field that can be read as a Decision.",
        "properties": {
          "advisory": {
            "const": true,
            "description": "Always true. A Proposal is never a Decision."
          },
          "proposed_by": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "structure": {
            "type": "object",
            "properties": {
              "principal": {
                "$ref": "#/components/schemas/Money"
              },
              "term_months": {
                "type": "integer",
                "minimum": 1,
                "maximum": 480
              }
            },
            "required": [
              "principal",
              "term_months"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "advisory",
          "proposed_by",
          "structure"
        ],
        "additionalProperties": false
      },
      "DecisionRequestRequest": {
        "type": "object",
        "description": "A request that a Lender decide. POST answers BLOCKED whatever this contains: this platform never authors, simulates, or infers a Decision.",
        "properties": {
          "requested_by": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "requested_at": {
            "$ref": "#/components/schemas/IsoDate"
          }
        },
        "required": [
          "requested_by"
        ],
        "additionalProperties": false
      },
      "DecisionRecordRequest": {
        "type": "object",
        "description": "A Lender's own Decision artifact, recorded here. The reasons are the Lender's; this door authors none. A Declination IS a Decision, so `outcome: \"declined\"` requires the adverse-action reason set the Lender supplied, and the schema enforces the pairing rather than trusting it.",
        "properties": {
          "decided_by": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "description": "The licensed Lender that decided. Never this platform."
          },
          "decided_at": {
            "$ref": "#/components/schemas/IsoDate"
          },
          "outcome": {
            "type": "string",
            "enum": [
              "approved",
              "counteroffered",
              "declined",
              "withdrawn",
              "closed_incomplete"
            ]
          },
          "adverse_action_reasons": {
            "type": "array",
            "description": "The Lender's own reason set, required when the outcome is a Declination. This door never authors one.",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            }
          }
        },
        "required": [
          "decided_by",
          "decided_at",
          "outcome"
        ],
        "additionalProperties": false
      },
      "ConsummationRecordRequest": {
        "type": "object",
        "description": "The moment the Borrower became contractually obligated, 12 CFR 1026.2(a)(13), fixed by state law and only recorded here.",
        "properties": {
          "state": {
            "$ref": "#/components/schemas/UsState"
          },
          "consummated_at": {
            "$ref": "#/components/schemas/IsoDate"
          },
          "evidence": {
            "type": "string",
            "enum": [
              "wet_signature",
              "esign",
              "notarial_certificate"
            ]
          }
        },
        "required": [
          "state",
          "consummated_at",
          "evidence"
        ],
        "additionalProperties": false
      },
      "SigningCreateRequest": {
        "type": "object",
        "description": "A notarial act, including remote online notarization. Answers BLOCKED: software may never perform one, and a commissioned notary may, under a named sponsoring entity's license with the individual named on the artifact.",
        "properties": {
          "act": {
            "type": "string",
            "enum": [
              "acknowledgment",
              "jurat",
              "ron"
            ]
          },
          "state": {
            "$ref": "#/components/schemas/UsState"
          },
          "principal": {
            "$ref": "#/components/schemas/Party"
          },
          "document_hash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$",
            "description": "SHA-256 of the instrument, lowercase hex."
          }
        },
        "required": [
          "act",
          "state",
          "principal",
          "document_hash"
        ],
        "additionalProperties": false
      },
      "FacilityCreateRequest": {
        "type": "object",
        "description": "An extension of credit. Answers BLOCKED permanently: the Lender extends it, not software and not a pool.",
        "properties": {
          "lender": {
            "$ref": "#/components/schemas/Party"
          },
          "borrower": {
            "$ref": "#/components/schemas/Party"
          },
          "ceiling": {
            "$ref": "#/components/schemas/Money"
          },
          "currency": {
            "$ref": "#/components/schemas/Currency"
          },
          "type": {
            "type": "string",
            "enum": [
              "REVOLVING",
              "TERM",
              "FLOORPLAN"
            ]
          }
        },
        "required": [
          "lender",
          "borrower",
          "ceiling",
          "currency",
          "type"
        ],
        "additionalProperties": false
      },
      "AdvanceCreateRequest": {
        "type": "object",
        "description": "A draw inside a ceiling the Lender already committed. It draws against the Mandate registry at apis.finance.",
        "properties": {
          "amount": {
            "$ref": "#/components/schemas/Money"
          },
          "currency": {
            "$ref": "#/components/schemas/Currency"
          },
          "mandate_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          },
          "purpose": {
            "type": "string",
            "maxLength": 400
          }
        },
        "required": [
          "amount",
          "currency",
          "mandate_id"
        ],
        "additionalProperties": false
      },
      "PerfectionCreateRequest": {
        "type": "object",
        "description": "A UCC-1 filing. `debtor_location` and not the Collateral's situs, because UCC 9-301 fixes perfection on the debtor's location and that is the rule integrators most often implement backwards. The schema names it so the mistake is caught at the type and not at the recording office.",
        "properties": {
          "debtor": {
            "$ref": "#/components/schemas/Party"
          },
          "debtor_location": {
            "$ref": "#/components/schemas/UsState"
          },
          "secured_party": {
            "$ref": "#/components/schemas/Party"
          },
          "collateral_description": {
            "type": "string",
            "minLength": 1,
            "maxLength": 2000
          },
          "instrument": {
            "type": "string",
            "enum": [
              "UCC-1",
              "UCC-3"
            ]
          }
        },
        "required": [
          "debtor",
          "debtor_location",
          "secured_party",
          "collateral_description",
          "instrument"
        ],
        "additionalProperties": false
      },
      "ReleaseCreateRequest": {
        "type": "object",
        "description": "A release of a filing of record.",
        "properties": {
          "file_number": {
            "type": "string",
            "minLength": 1,
            "maxLength": 64
          },
          "filing_office": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120
          },
          "debtor_location": {
            "$ref": "#/components/schemas/UsState"
          }
        },
        "required": [
          "file_number",
          "filing_office",
          "debtor_location"
        ],
        "additionalProperties": false
      },
      "IntentRouteRequest": {
        "type": "object",
        "description": "The hand-off that carries an intent to a licensed Lender, who takes the Application.",
        "properties": {
          "product": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80
          },
          "state": {
            "$ref": "#/components/schemas/UsState"
          },
          "amount_requested": {
            "$ref": "#/components/schemas/Money"
          }
        },
        "required": [
          "product",
          "state"
        ],
        "additionalProperties": false
      },
      "AmortizationRequest": {
        "type": "object",
        "description": "Arithmetic on numbers the caller supplies. This door quotes no rate, offers no term, and recommends no product: it divides the principal the caller names by the rate the caller names. Naming a rate here is the caller stating an input, never this platform stating an offer.",
        "properties": {
          "principal": {
            "$ref": "#/components/schemas/Money"
          },
          "annual_rate": {
            "$ref": "#/components/schemas/Rate"
          },
          "term_months": {
            "type": "integer",
            "minimum": 1,
            "maximum": 480
          },
          "day_count": {
            "$ref": "#/components/schemas/DayCount"
          },
          "first_payment_date": {
            "$ref": "#/components/schemas/IsoDate"
          },
          "extra_principal_per_period": {
            "$ref": "#/components/schemas/Money"
          },
          "max_rows": {
            "type": "integer",
            "minimum": 1,
            "maximum": 480,
            "description": "Cap on returned schedule rows. The totals are always computed over the whole term regardless."
          }
        },
        "required": [
          "principal",
          "annual_rate",
          "term_months"
        ],
        "additionalProperties": false
      },
      "PerDiemRequest": {
        "type": "object",
        "description": "Daily interest accrual on a balance the caller supplies, on the convention the caller names.",
        "properties": {
          "balance": {
            "$ref": "#/components/schemas/Money"
          },
          "annual_rate": {
            "$ref": "#/components/schemas/Rate"
          },
          "day_count": {
            "$ref": "#/components/schemas/DayCount"
          },
          "days": {
            "type": "integer",
            "minimum": 0,
            "maximum": 36500
          }
        },
        "required": [
          "balance",
          "annual_rate",
          "day_count"
        ],
        "additionalProperties": false
      },
      "PayoffProjectionRequest": {
        "type": "object",
        "description": "A projection, and never a Payoff quote. A Payoff quote is an attested figure a servicer stands behind with a good-through date; this is arithmetic on inputs the caller supplies, attested by nobody, and the response says so in its own body.",
        "properties": {
          "balance": {
            "$ref": "#/components/schemas/Money"
          },
          "annual_rate": {
            "$ref": "#/components/schemas/Rate"
          },
          "day_count": {
            "$ref": "#/components/schemas/DayCount"
          },
          "as_of": {
            "$ref": "#/components/schemas/IsoDate"
          },
          "payoff_date": {
            "$ref": "#/components/schemas/IsoDate"
          },
          "fees": {
            "$ref": "#/components/schemas/Money"
          }
        },
        "required": [
          "balance",
          "annual_rate",
          "day_count",
          "as_of",
          "payoff_date"
        ],
        "additionalProperties": false
      },
      "BusinessDaysRequest": {
        "type": "object",
        "description": "Calendar arithmetic. The caller supplies the rule; this door applies no TRID timing table, because the TRID timing rows on this register are UNRATIFIED and a calculator that assumed them would contradict the refusal two rows up. Federal holidays are computed, not looked up.",
        "properties": {
          "start": {
            "$ref": "#/components/schemas/IsoDate"
          },
          "days": {
            "type": "integer",
            "minimum": 0,
            "maximum": 366
          },
          "direction": {
            "type": "string",
            "enum": [
              "forward",
              "backward"
            ]
          },
          "convention": {
            "type": "string",
            "enum": [
              "federal_business_days",
              "specific_business_days",
              "calendar_days"
            ],
            "description": "federal_business_days excludes weekends and US federal holidays. specific_business_days is the Reg Z sense: every day but Sunday and federal holidays."
          },
          "count_start_day": {
            "type": "boolean"
          }
        },
        "required": [
          "start",
          "days",
          "convention"
        ],
        "additionalProperties": false
      },
      "ExplainRefusalRequest": {
        "type": "object",
        "description": "A route in the published register. The response is that route's own refusal, and why it carries it.",
        "properties": {
          "route": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "description": "Either \"POST /v1/applications\" or a concrete path such as \"/v1/applications\".",
            "examples": [
              "POST /v1/applications"
            ]
          }
        },
        "required": [
          "route"
        ],
        "additionalProperties": false
      },
      "BlockedRefusal": {
        "type": "object",
        "description": "The documented BLOCKED. The act is reserved, and `blocked.tier` says which kind: LENDER_RESERVED never opens, LICENSED is an act a credentialed human performs. `blocked.cure` names where the act is performed and by whom.",
        "properties": {
          "object": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "const": "BLOCKED"
          },
          "route": {
            "type": "string"
          },
          "blocked": {
            "type": "object",
            "properties": {
              "act": {
                "type": "string"
              },
              "reason": {
                "type": "string",
                "enum": [
                  "RESERVED_ACT",
                  "UNNAMED_ENTITY"
                ]
              },
              "tier": {
                "type": "string",
                "enum": [
                  "LENDER_RESERVED",
                  "LICENSED"
                ]
              },
              "permanent": {
                "type": "boolean",
                "description": "True exactly when the tier is LENDER_RESERVED."
              },
              "detail": {
                "type": "string"
              },
              "statutes": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "reserved_to_party": {
                "type": "string"
              },
              "cure": {
                "type": "object",
                "properties": {
                  "route": {
                    "type": "string",
                    "enum": [
                      "LENDER_MARKETPLACE",
                      "CREDENTIALED_HUMAN"
                    ]
                  },
                  "endpoint": {
                    "type": "string"
                  },
                  "needs_human": {
                    "type": "boolean"
                  },
                  "human_route": {
                    "type": "string"
                  },
                  "description": {
                    "type": "string"
                  },
                  "platform_compensation": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "compensation_note": {
                    "type": "string"
                  }
                },
                "required": [
                  "route",
                  "needs_human",
                  "description"
                ]
              }
            },
            "required": [
              "act",
              "reason",
              "tier",
              "permanent",
              "detail",
              "reserved_to_party",
              "cure"
            ]
          },
          "charge": {
            "type": "null",
            "description": "Always null. A refusal is not a product."
          },
          "note": {
            "type": "string"
          },
          "request_validation": {
            "$ref": "#/components/schemas/RequestValidation"
          }
        },
        "required": [
          "object",
          "status",
          "route",
          "blocked",
          "charge",
          "note"
        ]
      },
      "UnratifiedRefusal": {
        "type": "object",
        "description": "The documented UNRATIFIED. Software may legally perform the act; the per-state rules for it are not signed off. `unratified.missing` names the artifact and, where one governs, the rule.",
        "properties": {
          "object": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "const": "UNRATIFIED"
          },
          "route": {
            "type": "string"
          },
          "unratified": {
            "type": "object",
            "properties": {
              "act": {
                "type": "string"
              },
              "reason": {
                "type": "string",
                "const": "UNRATIFIED_RULE"
              },
              "tier": {
                "type": "string",
                "const": "OPEN_SURFACE"
              },
              "permanent": {
                "type": "boolean",
                "const": false
              },
              "detail": {
                "type": "string"
              },
              "missing": {
                "type": "object",
                "properties": {
                  "artifact": {
                    "type": "string"
                  },
                  "governing_rule": {
                    "type": "string"
                  },
                  "requires_access": {
                    "type": "string"
                  },
                  "note": {
                    "type": "string"
                  }
                },
                "required": [
                  "artifact"
                ]
              },
              "ratification_forum": {
                "type": "string",
                "const": "Counsel"
              },
              "would_clear": {
                "type": "string"
              }
            },
            "required": [
              "act",
              "reason",
              "tier",
              "permanent",
              "detail",
              "missing",
              "ratification_forum",
              "would_clear"
            ]
          },
          "charge": {
            "type": "null"
          },
          "note": {
            "type": "string"
          },
          "request_validation": {
            "$ref": "#/components/schemas/RequestValidation"
          }
        },
        "required": [
          "object",
          "status",
          "route",
          "unratified",
          "charge",
          "note"
        ]
      },
      "RequestValidation": {
        "type": "object",
        "description": "Present only when a body was sent and did not match the schema this operation publishes. On a reserved or unratified row it is additive and the refusal is unchanged, because a well-formed body does not clear a reserved act and a malformed one is not why the row refuses. On a performed row an invalid body is the whole answer and the route returns this alone.",
        "properties": {
          "valid": {
            "type": "boolean",
            "const": false
          },
          "schema": {
            "type": "string",
            "description": "The URL of the schema in this document the body was checked against."
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "path": {
                  "type": "string"
                },
                "code": {
                  "type": "string",
                  "enum": [
                    "type",
                    "required",
                    "enum",
                    "const",
                    "pattern",
                    "minLength",
                    "maxLength",
                    "minimum",
                    "maximum",
                    "additionalProperties",
                    "json"
                  ]
                },
                "message": {
                  "type": "string"
                },
                "expected": {},
                "got": {}
              },
              "required": [
                "path",
                "code",
                "message"
              ]
            }
          }
        },
        "required": [
          "valid",
          "schema",
          "errors"
        ]
      },
      "RequestInvalid": {
        "type": "object",
        "description": "A performed row whose body did not validate. The cure needs no Lender, no licence and no date: correct the body and call again.",
        "properties": {
          "object": {
            "type": "string",
            "const": "request.invalid"
          },
          "status": {
            "type": "string",
            "const": "INVALID_REQUEST"
          },
          "route": {
            "type": "string"
          },
          "invalid": {
            "type": "object",
            "properties": {
              "reason": {
                "type": "string",
                "const": "SCHEMA_MISMATCH"
              },
              "detail": {
                "type": "string"
              },
              "cure": {
                "type": "object",
                "properties": {
                  "route": {
                    "type": "string",
                    "const": "FIX_REQUEST"
                  },
                  "needs_human": {
                    "type": "boolean",
                    "const": false
                  },
                  "schema": {
                    "type": "string"
                  },
                  "description": {
                    "type": "string"
                  },
                  "errors": {
                    "type": "array",
                    "items": {
                      "type": "object"
                    }
                  }
                },
                "required": [
                  "route",
                  "needs_human",
                  "schema",
                  "description",
                  "errors"
                ]
              }
            },
            "required": [
              "reason",
              "detail",
              "cure"
            ]
          },
          "charge": {
            "type": "null"
          },
          "note": {
            "type": "string"
          }
        },
        "required": [
          "object",
          "status",
          "route",
          "invalid",
          "charge",
          "note"
        ]
      },
      "OpenPosture": {
        "type": "object",
        "description": "The block every performed row carries. It is a field and not a footnote, because the caller of a route may never have read the page.",
        "properties": {
          "performed": {
            "type": "boolean",
            "const": true
          },
          "keyless": {
            "type": "boolean",
            "const": true
          },
          "charge": {
            "type": "null"
          },
          "price": {
            "type": "null"
          },
          "is_offer": {
            "type": "boolean",
            "const": false
          },
          "is_quote": {
            "type": "boolean",
            "const": false
          },
          "is_decision": {
            "type": "boolean",
            "const": false
          },
          "lender": {
            "type": "null"
          },
          "note": {
            "type": "string"
          }
        },
        "required": [
          "performed",
          "keyless",
          "charge",
          "price",
          "is_offer",
          "is_quote",
          "is_decision",
          "lender",
          "note"
        ]
      },
      "AmortizationSchedule": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "amortization.schedule"
          },
          "status": {
            "type": "string",
            "const": "PERFORMED"
          },
          "route": {
            "type": "string"
          },
          "inputs": {
            "type": "object"
          },
          "scheduled_payment": {
            "$ref": "#/components/schemas/Money"
          },
          "final_payment": {
            "$ref": "#/components/schemas/Money",
            "description": "The last period absorbs the rounding remainder, which is what a note means when it says the final payment may differ."
          },
          "periods_to_payoff": {
            "type": "integer"
          },
          "totals": {
            "type": "object",
            "properties": {
              "principal_paid": {
                "$ref": "#/components/schemas/Money"
              },
              "interest_paid": {
                "$ref": "#/components/schemas/Money"
              },
              "total_paid": {
                "$ref": "#/components/schemas/Money"
              }
            },
            "required": [
              "principal_paid",
              "interest_paid",
              "total_paid"
            ]
          },
          "schedule": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "period": {
                  "type": "integer"
                },
                "payment": {
                  "$ref": "#/components/schemas/Money"
                },
                "interest": {
                  "$ref": "#/components/schemas/Money"
                },
                "principal": {
                  "$ref": "#/components/schemas/Money"
                },
                "balance": {
                  "$ref": "#/components/schemas/Money"
                }
              },
              "required": [
                "period",
                "payment",
                "interest",
                "principal",
                "balance"
              ]
            }
          },
          "schedule_truncated": {
            "type": "boolean"
          },
          "schedule_rows_returned": {
            "type": "integer"
          },
          "negative_amortization": {
            "type": "boolean",
            "description": "Present and true when the scheduled payment does not cover one period of interest, in which case no schedule is returned."
          }
        },
        "required": [
          "object",
          "status",
          "route"
        ]
      },
      "PerDiemResult": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "interest.per_diem"
          },
          "status": {
            "type": "string",
            "const": "PERFORMED"
          },
          "route": {
            "type": "string"
          },
          "inputs": {
            "type": "object"
          },
          "day_count_basis": {
            "type": "integer",
            "enum": [
              360,
              365
            ]
          },
          "per_diem": {
            "$ref": "#/components/schemas/Money"
          },
          "per_diem_unrounded": {
            "type": "number"
          },
          "accrued": {
            "$ref": "#/components/schemas/Money"
          }
        },
        "required": [
          "object",
          "status",
          "route",
          "day_count_basis",
          "per_diem",
          "accrued"
        ]
      },
      "PayoffProjection": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "payoff.projection"
          },
          "status": {
            "type": "string",
            "const": "PERFORMED"
          },
          "route": {
            "type": "string"
          },
          "is_attested_payoff_quote": {
            "type": "boolean",
            "const": false,
            "description": "Always false. This door attests nothing and stands behind nothing."
          },
          "attested_by": {
            "type": "null"
          },
          "good_through": {
            "type": "null"
          },
          "inputs": {
            "type": "object"
          },
          "days_accrued": {
            "type": "integer"
          },
          "per_diem": {
            "$ref": "#/components/schemas/Money"
          },
          "interest_to_payoff_date": {
            "$ref": "#/components/schemas/Money"
          },
          "projected_payoff": {
            "$ref": "#/components/schemas/Money"
          }
        },
        "required": [
          "object",
          "status",
          "route",
          "is_attested_payoff_quote",
          "attested_by",
          "good_through"
        ]
      },
      "BusinessDaysResult": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "calendar.business_days"
          },
          "status": {
            "type": "string",
            "const": "PERFORMED"
          },
          "route": {
            "type": "string"
          },
          "inputs": {
            "type": "object"
          },
          "result": {
            "$ref": "#/components/schemas/IsoDate"
          },
          "skipped_days": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/IsoDate"
            }
          },
          "holiday_source": {
            "type": "string"
          }
        },
        "required": [
          "object",
          "status",
          "route",
          "result",
          "skipped_days"
        ]
      },
      "RegisterDocument": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "register"
          },
          "status": {
            "type": "string",
            "const": "PERFORMED"
          },
          "property": {
            "type": "string",
            "const": "apis.loans"
          },
          "origination": {
            "type": "array",
            "description": "The sixteen origination rows the page renders, each refusing.",
            "items": {
              "$ref": "#/components/schemas/RegisterRow"
            }
          },
          "open": {
            "type": "array",
            "description": "The rows this door performs, keyless and free.",
            "items": {
              "$ref": "#/components/schemas/RegisterRow"
            }
          },
          "cure_route": {
            "type": "object"
          }
        },
        "required": [
          "object",
          "status",
          "property",
          "origination",
          "open"
        ]
      },
      "RegisterRow": {
        "type": "object",
        "properties": {
          "capability": {
            "type": "string"
          },
          "verb": {
            "type": "string",
            "enum": [
              "apply",
              "disclose",
              "decide",
              "consummate",
              "fund",
              "perfect",
              "compute"
            ]
          },
          "route": {
            "type": "string"
          },
          "operation_id": {
            "type": "string"
          },
          "gate": {
            "type": "string"
          },
          "answers": {
            "type": "string",
            "enum": [
              "BLOCKED",
              "UNRATIFIED",
              "PERFORMED"
            ]
          },
          "tier": {
            "type": "string",
            "enum": [
              "LENDER_RESERVED",
              "LICENSED",
              "OPEN_SURFACE"
            ]
          },
          "request_schema": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "ROADMAP",
              "LIVE"
            ]
          }
        },
        "required": [
          "capability",
          "verb",
          "route",
          "operation_id",
          "gate",
          "answers",
          "tier",
          "status"
        ]
      },
      "LifecycleDocument": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "lifecycle"
          },
          "status": {
            "type": "string",
            "const": "PERFORMED"
          },
          "verbs": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "verb": {
                  "type": "string"
                },
                "artifact": {
                  "type": "string"
                },
                "rule": {
                  "type": "string"
                }
              },
              "required": [
                "verb",
                "artifact",
                "rule"
              ]
            }
          },
          "terminal_outcomes": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "parties": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "lender_reserved_acts": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "licensed_acts": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "object",
          "status",
          "verbs",
          "terminal_outcomes"
        ]
      },
      "RefusalExplanation": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "refusal.explanation"
          },
          "status": {
            "type": "string",
            "const": "PERFORMED"
          },
          "route": {
            "type": "string"
          },
          "found": {
            "type": "boolean"
          },
          "matched": {
            "type": [
              "object",
              "null"
            ]
          },
          "body": {
            "type": [
              "object",
              "null"
            ],
            "description": "The exact body that route answers with, so a caller can read the refusal without provoking it."
          },
          "candidates": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Present when the route was not found."
          }
        },
        "required": [
          "object",
          "status",
          "found"
        ]
      },
      "ApplicationRecord": {
        "type": "object",
        "description": "NOT SERVED TODAY. The Application record `getApplication` returns the day its Stage and Terminal Outcome tables ratify.",
        "properties": {
          "object": {
            "type": "string",
            "const": "application"
          },
          "served": {
            "type": "boolean",
            "const": false
          },
          "id": {
            "type": "string"
          },
          "stage": {
            "type": [
              "string",
              "null"
            ],
            "description": "Null until the Stage table ratifies. Minting a value here would be the defect this door exists to refuse."
          },
          "terminal_outcome": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "funded",
              "offered-not-accepted",
              "declined",
              "withdrawn",
              "closed-incomplete",
              null
            ],
            "description": "The HMDA action-taken enumeration. The lifecycle and the reporting obligation are the same list."
          },
          "decision": {
            "type": "object",
            "properties": {
              "decided_by": {
                "type": "string",
                "const": "Lender"
              },
              "adverse_action_notice": {
                "type": "string"
              }
            }
          },
          "charge": {
            "type": "null"
          },
          "note": {
            "type": "string"
          }
        },
        "required": [
          "object",
          "served",
          "id",
          "stage",
          "terminal_outcome"
        ]
      }
    }
  },
  "paths": {
    "/v1/applications/{id}": {
      "get": {
        "operationId": "getApplication",
        "summary": "Application state and Stage, with the Terminal Outcome set",
        "description": "ROADMAP. Not yet callable. Application state and Stage, with the Terminal Outcome set. Gate: none. This operation answers with a documented UNRATIFIED.",
        "tags": [
          "apply"
        ],
        "x-status": "roadmap",
        "x-gate": "none",
        "x-gate-kind": "none",
        "x-lifecycle-verb": "apply",
        "responses": {
          "200": {
            "description": "NOT SERVED TODAY. The Application record this operation returns the day its Stage and Terminal Outcome tables ratify. It is published now so bindings generate against it; until those tables ratify this route answers the documented UNRATIFIED refusal above, and the call site does not move between the two.",
            "x-served": false,
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApplicationRecord"
                },
                "example": {
                  "object": "application",
                  "served": false,
                  "id": "app_01J9SPECIMENAPP0",
                  "stage": null,
                  "terminal_outcome": "declined",
                  "decision": {
                    "decided_by": "Lender",
                    "adverse_action_notice": "inside the Decision artifact, because a Declination is a Decision"
                  },
                  "charge": null,
                  "note": "A shape, not a response. Stage is null because the Stage table is the artifact that is missing. This route answers the documented UNRATIFIED refusal until that table and the Terminal Outcome set ratify, and returns this record on the day they do."
                }
              }
            }
          },
          "422": {
            "description": "UNRATIFIED. The act is open surface whose governing rule rows are not ratified yet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnratifiedRefusal"
                },
                "example": {
                  "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."
                }
              }
            }
          }
        },
        "x-ratification-forum": "Counsel",
        "x-would-clear": "A ratified Stage table and Terminal Outcome set. When it ratifies, this same call returns an Application record.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/v1/applications": {
      "post": {
        "operationId": "createApplication",
        "summary": "Application intake",
        "description": "ROADMAP. Not yet callable. Application intake. Gate: signer-R · lenderReserved: take the Application. This operation answers with a documented BLOCKED.",
        "tags": [
          "apply"
        ],
        "x-status": "roadmap",
        "x-gate": "signer-R · lenderReserved: take the Application",
        "x-gate-kind": "signer-R",
        "x-lifecycle-verb": "apply",
        "responses": {
          "422": {
            "description": "BLOCKED. The act is reserved, and the tier field says which kind.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BlockedRefusal"
                },
                "example": {
                  "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."
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "description": "Validated against the schema below. The body is checked and reported on, and it does not change the refusal: a well-formed body does not clear a reserved act, and a malformed one is not why an unratified row refuses.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApplicationCreateRequest"
              }
            }
          }
        },
        "x-reserved-tier": "LENDER_RESERVED",
        "x-reserved-to": "Lender"
      }
    },
    "/v1/applications/{id}/clocks": {
      "get": {
        "operationId": "getClocks",
        "summary": "Timer Ladder state, every rung with a named responsible party",
        "description": "ROADMAP. Not yet callable. Timer Ladder state, every rung with a named responsible party. Gate: none. This operation answers with a documented UNRATIFIED.",
        "tags": [
          "apply"
        ],
        "x-status": "roadmap",
        "x-gate": "none",
        "x-gate-kind": "none",
        "x-lifecycle-verb": "apply",
        "responses": {
          "422": {
            "description": "UNRATIFIED. The act is open surface whose governing rule rows are not ratified yet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnratifiedRefusal"
                },
                "example": {
                  "object": "application.clocks",
                  "status": "UNRATIFIED",
                  "route": "GET /v1/applications/{id}/clocks",
                  "unratified": {
                    "act": "READ_TIMER_LADDER",
                    "reason": "UNRATIFIED_RULE",
                    "tier": "OPEN_SURFACE",
                    "permanent": false,
                    "detail": "Timer Ladder state is open surface. Software may perform it. The per-rung duty table that names the responsible party is not ratified yet.",
                    "missing": {
                      "artifact": "Timer Ladder rung table",
                      "governing_rule": "12 CFR 1002.9(a)(1): Regulation B's thirty-day notification clock, the rung the rest of the ladder is anchored to",
                      "note": "Every rung names the party the duty attaches to, so a rung with no named party is not publishable."
                    },
                    "ratification_forum": "Counsel",
                    "would_clear": "A ratified Timer Ladder table with a named responsible party on every rung. When it ratifies, this same call returns the ladder."
                  },
                  "charge": null,
                  "note": "Nothing was performed. Nothing was metered."
                }
              }
            }
          }
        },
        "x-ratification-forum": "Counsel",
        "x-would-clear": "A ratified Timer Ladder table with a named responsible party on every rung. When it ratifies, this same call returns the ladder.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/v1/applications/{id}/disclosures": {
      "post": {
        "operationId": "renderDisclosure",
        "summary": "Disclosure rendering, with delivery evidence on the artifact",
        "description": "ROADMAP. Not yet callable. Disclosure rendering, with delivery evidence on the artifact. Gate: none. This operation answers with a documented UNRATIFIED.",
        "tags": [
          "disclose"
        ],
        "x-status": "roadmap",
        "x-gate": "none",
        "x-gate-kind": "none",
        "x-lifecycle-verb": "disclose",
        "responses": {
          "422": {
            "description": "UNRATIFIED. The act is open surface whose governing rule rows are not ratified yet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnratifiedRefusal"
                },
                "example": {
                  "object": "disclosure",
                  "status": "UNRATIFIED",
                  "route": "POST /v1/applications/{id}/disclosures",
                  "unratified": {
                    "act": "DISCLOSE",
                    "reason": "UNRATIFIED_RULE",
                    "tier": "OPEN_SURFACE",
                    "permanent": false,
                    "detail": "Rendering a Disclosure is open surface. Software may perform it. The per-product TRID form and timing rows are not ratified yet.",
                    "missing": {
                      "artifact": "TRID form and timing rows",
                      "governing_rule": "TRID: the Loan Estimate within three business days, the Closing Disclosure received three business days before consummation"
                    },
                    "ratification_forum": "Counsel",
                    "would_clear": "A ratified per-product Disclosure form and timing table. When it ratifies, this same call returns a Disclosure with its delivery evidence."
                  },
                  "charge": null,
                  "note": "Nothing was performed. Nothing was metered."
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "description": "Validated against the schema below. The body is checked and reported on, and it does not change the refusal: a well-formed body does not clear a reserved act, and a malformed one is not why an unratified row refuses.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DisclosureRenderRequest"
              }
            }
          }
        },
        "x-ratification-forum": "Counsel",
        "x-would-clear": "A ratified per-product Disclosure form and timing table. When it ratifies, this same call returns a Disclosure with its delivery evidence.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/v1/applications/{id}/disclosures/reissue": {
      "post": {
        "operationId": "reissueDisclosure",
        "summary": "Redisclosure on a changed circumstance",
        "description": "ROADMAP. Not yet callable. Redisclosure on a changed circumstance. Gate: none. This operation answers with a documented UNRATIFIED.",
        "tags": [
          "disclose"
        ],
        "x-status": "roadmap",
        "x-gate": "none",
        "x-gate-kind": "none",
        "x-lifecycle-verb": "disclose",
        "responses": {
          "422": {
            "description": "UNRATIFIED. The act is open surface whose governing rule rows are not ratified yet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnratifiedRefusal"
                },
                "example": {
                  "object": "disclosure.reissue",
                  "status": "UNRATIFIED",
                  "route": "POST /v1/applications/{id}/disclosures/reissue",
                  "unratified": {
                    "act": "REDISCLOSE",
                    "reason": "UNRATIFIED_RULE",
                    "tier": "OPEN_SURFACE",
                    "permanent": false,
                    "detail": "Redisclosure is open surface. Software may perform it. The changed-circumstance table that triggers it is not ratified yet.",
                    "missing": {
                      "artifact": "Changed-circumstance table",
                      "governing_rule": "12 CFR 1026.19(e)(3)(iv): the changed circumstances that permit a revised estimate and reset a tolerance"
                    },
                    "ratification_forum": "Counsel",
                    "would_clear": "A ratified changed-circumstance table. When it ratifies, this same call returns a reissued Disclosure."
                  },
                  "charge": null,
                  "note": "Nothing was performed. Nothing was metered."
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "description": "Validated against the schema below. The body is checked and reported on, and it does not change the refusal: a well-formed body does not clear a reserved act, and a malformed one is not why an unratified row refuses.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DisclosureReissueRequest"
              }
            }
          }
        },
        "x-ratification-forum": "Counsel",
        "x-would-clear": "A ratified changed-circumstance table. When it ratifies, this same call returns a reissued Disclosure.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/v1/applications/{id}/proposals": {
      "post": {
        "operationId": "createProposal",
        "summary": "Advisory Proposal, with no commit power, whoever made it",
        "description": "ROADMAP. Not yet callable. Advisory Proposal, with no commit power, whoever made it. Gate: none. This operation answers with a documented UNRATIFIED.",
        "tags": [
          "decide"
        ],
        "x-status": "roadmap",
        "x-gate": "none",
        "x-gate-kind": "none",
        "x-lifecycle-verb": "decide",
        "responses": {
          "422": {
            "description": "UNRATIFIED. The act is open surface whose governing rule rows are not ratified yet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnratifiedRefusal"
                },
                "example": {
                  "object": "proposal",
                  "status": "UNRATIFIED",
                  "route": "POST /v1/applications/{id}/proposals",
                  "unratified": {
                    "act": "PROPOSE",
                    "reason": "UNRATIFIED_RULE",
                    "tier": "OPEN_SURFACE",
                    "permanent": false,
                    "detail": "An Advisory Proposal is open surface and carries no commit power, whoever made it. The Proposal record shape is not ratified yet.",
                    "missing": {
                      "artifact": "Advisory Proposal record shape",
                      "governing_rule": "12 CFR 1002.2(f): the definition of an Application, which is the line a Proposal is shaped to stay on the far side of",
                      "note": "A Proposal is never a Decision and never states an approval on this platform's behalf."
                    },
                    "ratification_forum": "Counsel",
                    "would_clear": "A ratified Advisory Proposal record shape. When it ratifies, this same call returns a Proposal."
                  },
                  "charge": null,
                  "note": "Nothing was performed. Nothing was metered."
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "description": "Validated against the schema below. The body is checked and reported on, and it does not change the refusal: a well-formed body does not clear a reserved act, and a malformed one is not why an unratified row refuses.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProposalCreateRequest"
              }
            }
          }
        },
        "x-ratification-forum": "Counsel",
        "x-would-clear": "A ratified Advisory Proposal record shape. When it ratifies, this same call returns a Proposal.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/v1/applications/{id}/decision": {
      "post": {
        "operationId": "requestDecision",
        "summary": "Decision",
        "description": "ROADMAP. Not yet callable. Decision. Gate: signer-R · lenderReserved: decide. This operation answers with a documented BLOCKED.",
        "tags": [
          "decide"
        ],
        "x-status": "roadmap",
        "x-gate": "signer-R · lenderReserved: decide",
        "x-gate-kind": "signer-R",
        "x-lifecycle-verb": "decide",
        "responses": {
          "422": {
            "description": "BLOCKED. The act is reserved, and the tier field says which kind.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BlockedRefusal"
                },
                "example": {
                  "object": "decision.request",
                  "status": "BLOCKED",
                  "route": "POST /v1/applications/{id}/decision",
                  "blocked": {
                    "act": "DECIDE",
                    "reason": "RESERVED_ACT",
                    "tier": "LENDER_RESERVED",
                    "permanent": true,
                    "detail": "Deciding is an act reserved to a licensed Lender. The platform never authors, simulates, or infers a Decision, and no response from this platform states an approval on its own behalf.",
                    "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": "Nothing was performed. Nothing was metered."
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "description": "Validated against the schema below. The body is checked and reported on, and it does not change the refusal: a well-formed body does not clear a reserved act, and a malformed one is not why an unratified row refuses.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DecisionRequestRequest"
              }
            }
          }
        },
        "x-reserved-tier": "LENDER_RESERVED",
        "x-reserved-to": "Lender",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "put": {
        "operationId": "putDecision",
        "summary": "Decision artifact intake, adverse-action notice inside it",
        "description": "ROADMAP. Not yet callable. Decision artifact intake, adverse-action notice inside it. Gate: none. This operation answers with a documented UNRATIFIED.",
        "tags": [
          "decide"
        ],
        "x-status": "roadmap",
        "x-gate": "none",
        "x-gate-kind": "none",
        "x-lifecycle-verb": "decide",
        "responses": {
          "422": {
            "description": "UNRATIFIED. The act is open surface whose governing rule rows are not ratified yet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnratifiedRefusal"
                },
                "example": {
                  "object": "decision",
                  "status": "UNRATIFIED",
                  "route": "PUT /v1/applications/{id}/decision",
                  "unratified": {
                    "act": "RECORD_DECISION",
                    "reason": "UNRATIFIED_RULE",
                    "tier": "OPEN_SURFACE",
                    "permanent": false,
                    "detail": "Recording a Lender's Decision artifact is open surface. Software may perform it. The Decision artifact schema, which carries the adverse-action notice inside it, is not ratified yet.",
                    "missing": {
                      "artifact": "Decision artifact schema",
                      "governing_rule": "12 CFR 1002.9: adverse-action notification, which is why the notice ships inside the Decision artifact rather than beside it",
                      "note": "A Declination IS a Decision, and the adverse-action notice ships inside the artifact."
                    },
                    "ratification_forum": "Counsel",
                    "would_clear": "A ratified Decision artifact schema. When it ratifies, this same call records the Lender's Decision."
                  },
                  "charge": null,
                  "note": "Nothing was performed. Nothing was metered."
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "description": "Validated against the schema below. The body is checked and reported on, and it does not change the refusal: a well-formed body does not clear a reserved act, and a malformed one is not why an unratified row refuses.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DecisionRecordRequest"
              }
            }
          }
        },
        "x-ratification-forum": "Counsel",
        "x-would-clear": "A ratified Decision artifact schema. When it ratifies, this same call records the Lender's Decision.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/v1/applications/{id}/consummation": {
      "post": {
        "operationId": "recordConsummation",
        "summary": "Consummation record",
        "description": "ROADMAP. Not yet callable. Consummation record. Gate: none. This operation answers with a documented UNRATIFIED.",
        "tags": [
          "consummate"
        ],
        "x-status": "roadmap",
        "x-gate": "none",
        "x-gate-kind": "none",
        "x-lifecycle-verb": "consummate",
        "responses": {
          "422": {
            "description": "UNRATIFIED. The act is open surface whose governing rule rows are not ratified yet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnratifiedRefusal"
                },
                "example": {
                  "object": "consummation",
                  "status": "UNRATIFIED",
                  "route": "POST /v1/applications/{id}/consummation",
                  "unratified": {
                    "act": "CONSUMMATE",
                    "reason": "UNRATIFIED_RULE",
                    "tier": "OPEN_SURFACE",
                    "permanent": false,
                    "detail": "Recording Consummation is open surface. Software may perform it. The per-state rows that fix the moment are not ratified yet.",
                    "missing": {
                      "artifact": "Per-state consummation rows",
                      "governing_rule": "12 CFR 1026.2(a)(13): the moment the Borrower becomes contractually obligated, fixed by state law and only recorded here"
                    },
                    "ratification_forum": "Counsel",
                    "would_clear": "A ratified per-state consummation table. When it ratifies, this same call returns a Consummation record."
                  },
                  "charge": null,
                  "note": "Nothing was performed. Nothing was metered."
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "description": "Validated against the schema below. The body is checked and reported on, and it does not change the refusal: a well-formed body does not clear a reserved act, and a malformed one is not why an unratified row refuses.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ConsummationRecordRequest"
              }
            }
          }
        },
        "x-ratification-forum": "Counsel",
        "x-would-clear": "A ratified per-state consummation table. When it ratifies, this same call returns a Consummation record.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/v1/applications/{id}/rescission": {
      "get": {
        "operationId": "getRescission",
        "summary": "Rescission window, the one clock that forbids a stage",
        "description": "ROADMAP. Not yet callable. Rescission window, the one clock that forbids a stage. Gate: none. This operation answers with a documented UNRATIFIED.",
        "tags": [
          "consummate"
        ],
        "x-status": "roadmap",
        "x-gate": "none",
        "x-gate-kind": "none",
        "x-lifecycle-verb": "consummate",
        "responses": {
          "422": {
            "description": "UNRATIFIED. The act is open surface whose governing rule rows are not ratified yet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnratifiedRefusal"
                },
                "example": {
                  "object": "rescission",
                  "status": "UNRATIFIED",
                  "route": "GET /v1/applications/{id}/rescission",
                  "unratified": {
                    "act": "READ_RESCISSION",
                    "reason": "UNRATIFIED_RULE",
                    "tier": "OPEN_SURFACE",
                    "permanent": false,
                    "detail": "The rescission window is open surface. Software may perform it. The per-product rescission rows are not ratified yet.",
                    "missing": {
                      "artifact": "Per-product rescission rows",
                      "governing_rule": "12 CFR 1026.23: the right of rescission, which forbids disbursement until the window closes",
                      "note": "This is the one clock that forbids a stage rather than timing one."
                    },
                    "ratification_forum": "Counsel",
                    "would_clear": "A ratified per-product rescission table. When it ratifies, this same call returns the window."
                  },
                  "charge": null,
                  "note": "Nothing was performed. Nothing was metered."
                }
              }
            }
          }
        },
        "x-ratification-forum": "Counsel",
        "x-would-clear": "A ratified per-product rescission table. When it ratifies, this same call returns the window.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/v1/signings": {
      "post": {
        "operationId": "createSigning",
        "summary": "Notarial act, including remote online notarization",
        "description": "ROADMAP. Not yet callable. Notarial act, including remote online notarization. Gate: signer-L · requiresSigner: notary-commission. This operation answers with a documented BLOCKED.",
        "tags": [
          "consummate"
        ],
        "x-status": "roadmap",
        "x-gate": "signer-L · requiresSigner: notary-commission",
        "x-gate-kind": "signer-L",
        "x-lifecycle-verb": "consummate",
        "responses": {
          "422": {
            "description": "BLOCKED. The act is reserved, and the tier field says which kind.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BlockedRefusal"
                },
                "example": {
                  "object": "signing",
                  "status": "BLOCKED",
                  "route": "POST /v1/signings",
                  "blocked": {
                    "act": "NOTARIZE",
                    "reason": "RESERVED_ACT",
                    "tier": "LICENSED",
                    "permanent": false,
                    "detail": "A notarial act is a licensed act. Software may never perform one and a commissioned notary may, under a named sponsoring entity's license, with the individual named on the artifact. This row is LICENSED tier, not LENDER_RESERVED, so it becomes a priced row when its own blockers clear.",
                    "statutes": [
                      "applicable state notarial and remote online notarization law"
                    ],
                    "reserved_to_party": "commissioned notary",
                    "cure": {
                      "route": "CREDENTIALED_HUMAN",
                      "needs_human": true,
                      "human_route": "gigs.loans",
                      "description": "The act is performed by a credentialed human under a named sponsoring entity, with the individual named on the artifact.",
                      "platform_compensation": null,
                      "compensation_note": "gigs.loans is the destination of this documented cure and it is not open yet."
                    }
                  },
                  "charge": null,
                  "note": "Nothing was performed. Nothing was metered."
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "description": "Validated against the schema below. The body is checked and reported on, and it does not change the refusal: a well-formed body does not clear a reserved act, and a malformed one is not why an unratified row refuses.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SigningCreateRequest"
              }
            }
          }
        },
        "x-reserved-tier": "LICENSED",
        "x-reserved-to": "commissioned notary"
      }
    },
    "/v1/facilities": {
      "post": {
        "operationId": "createFacility",
        "summary": "Extension of credit",
        "description": "ROADMAP. Not yet callable. Extension of credit. Gate: signer-R · lenderReserved: extend credit. This operation answers with a documented BLOCKED.",
        "tags": [
          "fund"
        ],
        "x-status": "roadmap",
        "x-gate": "signer-R · lenderReserved: extend credit",
        "x-gate-kind": "signer-R",
        "x-lifecycle-verb": "fund",
        "responses": {
          "422": {
            "description": "BLOCKED. The act is reserved, and the tier field says which kind.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BlockedRefusal"
                },
                "example": {
                  "object": "facility",
                  "status": "BLOCKED",
                  "route": "POST /v1/facilities",
                  "blocked": {
                    "act": "EXTEND_CREDIT",
                    "reason": "RESERVED_ACT",
                    "tier": "LENDER_RESERVED",
                    "permanent": true,
                    "detail": "Extending credit is an act reserved to a licensed Lender. Not software, and not a pool, 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": "Nothing was performed. Nothing was metered."
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "description": "Validated against the schema below. The body is checked and reported on, and it does not change the refusal: a well-formed body does not clear a reserved act, and a malformed one is not why an unratified row refuses.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FacilityCreateRequest"
              }
            }
          }
        },
        "x-reserved-tier": "LENDER_RESERVED",
        "x-reserved-to": "Lender"
      }
    },
    "/v1/facilities/{id}/advances": {
      "post": {
        "operationId": "createAdvance",
        "summary": "Advance against a Mandate, inside a ceiling the Lender committed",
        "description": "ROADMAP. Not yet callable. Advance against a Mandate, inside a ceiling the Lender committed. Gate: access · requiresAccess: sponsor-bank rail. This operation answers with a documented UNRATIFIED.",
        "tags": [
          "fund"
        ],
        "x-status": "roadmap",
        "x-gate": "access · requiresAccess: sponsor-bank rail",
        "x-gate-kind": "access",
        "x-lifecycle-verb": "fund",
        "responses": {
          "422": {
            "description": "UNRATIFIED. The act is open surface whose governing rule rows are not ratified yet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnratifiedRefusal"
                },
                "example": {
                  "object": "advance",
                  "status": "UNRATIFIED",
                  "route": "POST /v1/facilities/{id}/advances",
                  "unratified": {
                    "act": "ADVANCE",
                    "reason": "UNRATIFIED_RULE",
                    "tier": "OPEN_SURFACE",
                    "permanent": false,
                    "detail": "Drawing an Advance inside a ceiling the Lender committed is open surface. Software may perform it. It draws against the Mandate registry and x402 metering at apis.finance, and its own rows are not ratified yet.",
                    "missing": {
                      "artifact": "Advance draw rows",
                      "governing_rule": "The Mandate ceiling the Lender committed, which is a contractual rule and not a statutory one: an Advance may not exceed available, and available is derived on read and never stored",
                      "requires_access": "sponsor-bank rail"
                    },
                    "ratification_forum": "Counsel",
                    "would_clear": "A ratified Advance draw table and a held sponsor-bank rail. When it ratifies, this same call returns an Advance with a settlement_ref on the event."
                  },
                  "charge": null,
                  "note": "Nothing was performed. Nothing was metered."
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "description": "Validated against the schema below. The body is checked and reported on, and it does not change the refusal: a well-formed body does not clear a reserved act, and a malformed one is not why an unratified row refuses.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdvanceCreateRequest"
              }
            }
          }
        },
        "x-ratification-forum": "Counsel",
        "x-would-clear": "A ratified Advance draw table and a held sponsor-bank rail. When it ratifies, this same call returns an Advance with a settlement_ref on the event.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/v1/collateral/{id}/perfection": {
      "post": {
        "operationId": "perfectCollateral",
        "summary": "Perfection filing",
        "description": "ROADMAP. Not yet callable. Perfection filing. Gate: access · requiresAccess: county e-recording. This operation answers with a documented UNRATIFIED.",
        "tags": [
          "perfect"
        ],
        "x-status": "roadmap",
        "x-gate": "access · requiresAccess: county e-recording",
        "x-gate-kind": "access",
        "x-lifecycle-verb": "perfect",
        "responses": {
          "422": {
            "description": "UNRATIFIED. The act is open surface whose governing rule rows are not ratified yet.",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/UnratifiedRefusal"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "secured_party_of_record": {
                          "type": "string",
                          "const": "the Lender, never this platform"
                        }
                      },
                      "required": [
                        "secured_party_of_record"
                      ]
                    }
                  ]
                },
                "example": {
                  "object": "collateral.perfection",
                  "status": "UNRATIFIED",
                  "route": "POST /v1/collateral/{id}/perfection",
                  "unratified": {
                    "act": "PERFECT",
                    "reason": "UNRATIFIED_RULE",
                    "tier": "OPEN_SURFACE",
                    "permanent": false,
                    "detail": "Filing a UCC-1 is open surface. Software may perform it. This act and state pair does not ship until its Jurisdiction Rule row is ratified.",
                    "missing": {
                      "artifact": "Jurisdiction Rule row",
                      "governing_rule": "UCC 9-301: perfection follows the debtor's location, not the Collateral's",
                      "note": "The debtor-location rule is the one integrators most often implement backwards, so this refusal returns the governing rule alongside it.",
                      "requires_access": "county e-recording"
                    },
                    "ratification_forum": "Counsel",
                    "would_clear": "A ratified per-act, per-state Jurisdiction Rule table covering this pair. When it ratifies, this same call returns a filing record."
                  },
                  "secured_party_of_record": "the Lender, never this platform",
                  "charge": null,
                  "note": "Nothing was filed. Nothing was metered."
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "description": "Validated against the schema below. The body is checked and reported on, and it does not change the refusal: a well-formed body does not clear a reserved act, and a malformed one is not why an unratified row refuses.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PerfectionCreateRequest"
              }
            }
          }
        },
        "x-ratification-forum": "Counsel",
        "x-would-clear": "A ratified per-act, per-state Jurisdiction Rule table covering this pair. When it ratifies, this same call returns a filing record.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      },
      "get": {
        "operationId": "getPerfection",
        "summary": "Filing status, as the recording office answers it",
        "description": "ROADMAP. Not yet callable. Filing status, as the recording office answers it. Gate: none. This operation answers with a documented UNRATIFIED.",
        "tags": [
          "perfect"
        ],
        "x-status": "roadmap",
        "x-gate": "none",
        "x-gate-kind": "none",
        "x-lifecycle-verb": "perfect",
        "responses": {
          "422": {
            "description": "UNRATIFIED. The act is open surface whose governing rule rows are not ratified yet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnratifiedRefusal"
                },
                "example": {
                  "object": "collateral.perfection.status",
                  "status": "UNRATIFIED",
                  "route": "GET /v1/collateral/{id}/perfection",
                  "unratified": {
                    "act": "READ_FILING_STATUS",
                    "reason": "UNRATIFIED_RULE",
                    "tier": "OPEN_SURFACE",
                    "permanent": false,
                    "detail": "Reading a filing status is open surface. Software may perform it. The recording-office response mapping is not ratified yet.",
                    "missing": {
                      "artifact": "Recording-office response mapping",
                      "governing_rule": "UCC 9-520: the grounds on which a filing office may refuse a record, which is why the office's answer is the fact and not this platform's claim",
                      "note": "The filing office's own acceptance is the fact. Not our claim, and not the Lender's."
                    },
                    "ratification_forum": "Counsel",
                    "would_clear": "A ratified recording-office response mapping. When it ratifies, this same call returns the office's answer."
                  },
                  "charge": null,
                  "note": "Nothing was performed. Nothing was metered."
                }
              }
            }
          }
        },
        "x-ratification-forum": "Counsel",
        "x-would-clear": "A ratified recording-office response mapping. When it ratifies, this same call returns the office's answer.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/v1/collateral/{id}/release": {
      "post": {
        "operationId": "releaseCollateral",
        "summary": "Release filing",
        "description": "ROADMAP. Not yet callable. Release filing. Gate: access · requiresAccess: county e-recording. This operation answers with a documented UNRATIFIED.",
        "tags": [
          "perfect"
        ],
        "x-status": "roadmap",
        "x-gate": "access · requiresAccess: county e-recording",
        "x-gate-kind": "access",
        "x-lifecycle-verb": "perfect",
        "responses": {
          "422": {
            "description": "UNRATIFIED. The act is open surface whose governing rule rows are not ratified yet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnratifiedRefusal"
                },
                "example": {
                  "object": "collateral.release",
                  "status": "UNRATIFIED",
                  "route": "POST /v1/collateral/{id}/release",
                  "unratified": {
                    "act": "RELEASE",
                    "reason": "UNRATIFIED_RULE",
                    "tier": "OPEN_SURFACE",
                    "permanent": false,
                    "detail": "Filing a release is open surface. Software may perform it. This act and state pair does not ship until its Jurisdiction Rule row is ratified.",
                    "missing": {
                      "artifact": "Jurisdiction Rule row",
                      "governing_rule": "UCC 9-513: the termination statement, filed where UCC 9-301 put the original, which is the debtor's location and not the Collateral's",
                      "requires_access": "county e-recording"
                    },
                    "ratification_forum": "Counsel",
                    "would_clear": "A ratified per-act, per-state Jurisdiction Rule table covering this pair. When it ratifies, this same call returns a release record."
                  },
                  "charge": null,
                  "note": "Nothing was performed. Nothing was metered."
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "description": "Validated against the schema below. The body is checked and reported on, and it does not change the refusal: a well-formed body does not clear a reserved act, and a malformed one is not why an unratified row refuses.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReleaseCreateRequest"
              }
            }
          }
        },
        "x-ratification-forum": "Counsel",
        "x-would-clear": "A ratified per-act, per-state Jurisdiction Rule table covering this pair. When it ratifies, this same call returns a release record.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ]
      }
    },
    "/v1/math/amortization": {
      "post": {
        "operationId": "computeAmortization",
        "summary": "Amortization schedule, level payment, with per-period interest and principal",
        "description": "PERFORMED. Callable now, keyless and free. Amortization schedule, level payment, with per-period interest and principal. Gate: none. Arithmetic on inputs the caller supplies. No act here is reserved and no rule row is missing, so this route computes and answers 200. It quotes no rate and offers no term.",
        "tags": [
          "compute"
        ],
        "x-status": "performed",
        "x-gate": "none",
        "x-gate-kind": "none",
        "x-lifecycle-verb": "compute",
        "responses": {
          "200": {
            "description": "Amortization schedule, level payment, with per-period interest and principal. Computed on the inputs supplied, keyless and free. The body carries charge: null and price: null, and states in its own fields that it is not an offer, not a quote and not a Decision.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AmortizationSchedule"
                }
              }
            }
          },
          "422": {
            "description": "INVALID_REQUEST. The body did not match the schema this operation publishes. The cure names every field that failed and needs no Lender, no licence and no date.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RequestInvalid"
                }
              }
            }
          }
        },
        "x-keyless": true,
        "x-free": true,
        "requestBody": {
          "required": true,
          "description": "Validated against the schema below, and the operation is performed on it.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AmortizationRequest"
              }
            }
          }
        }
      }
    },
    "/v1/math/per-diem": {
      "post": {
        "operationId": "computePerDiem",
        "summary": "Per-diem interest on a balance, on the day-count convention the caller names",
        "description": "PERFORMED. Callable now, keyless and free. Per-diem interest on a balance, on the day-count convention the caller names. Gate: none. Arithmetic on inputs the caller supplies. The convention is stated by the caller and never assumed, because the three in use differ by more than a rounding.",
        "tags": [
          "compute"
        ],
        "x-status": "performed",
        "x-gate": "none",
        "x-gate-kind": "none",
        "x-lifecycle-verb": "compute",
        "responses": {
          "200": {
            "description": "Per-diem interest on a balance, on the day-count convention the caller names. Computed on the inputs supplied, keyless and free. The body carries charge: null and price: null, and states in its own fields that it is not an offer, not a quote and not a Decision.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PerDiemResult"
                }
              }
            }
          },
          "422": {
            "description": "INVALID_REQUEST. The body did not match the schema this operation publishes. The cure names every field that failed and needs no Lender, no licence and no date.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RequestInvalid"
                }
              }
            }
          }
        },
        "x-keyless": true,
        "x-free": true,
        "requestBody": {
          "required": true,
          "description": "Validated against the schema below, and the operation is performed on it.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PerDiemRequest"
              }
            }
          }
        }
      }
    },
    "/v1/math/payoff-projection": {
      "post": {
        "operationId": "projectPayoff",
        "summary": "Projected balance to close at a date, which is arithmetic and not an attested Payoff quote",
        "description": "PERFORMED. Callable now, keyless and free. Projected balance to close at a date, which is arithmetic and not an attested Payoff quote. Gate: none. A projection and never a Payoff quote. A Payoff quote is an attested figure a servicer stands behind with a good-through date, and this door attests nothing: the response carries is_attested_payoff_quote false and attested_by null in its own body.",
        "tags": [
          "compute"
        ],
        "x-status": "performed",
        "x-gate": "none",
        "x-gate-kind": "none",
        "x-lifecycle-verb": "compute",
        "responses": {
          "200": {
            "description": "Projected balance to close at a date, which is arithmetic and not an attested Payoff quote. Computed on the inputs supplied, keyless and free. The body carries charge: null and price: null, and states in its own fields that it is not an offer, not a quote and not a Decision.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayoffProjection"
                }
              }
            }
          },
          "422": {
            "description": "INVALID_REQUEST. The body did not match the schema this operation publishes. The cure names every field that failed and needs no Lender, no licence and no date.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RequestInvalid"
                }
              }
            }
          }
        },
        "x-keyless": true,
        "x-free": true,
        "requestBody": {
          "required": true,
          "description": "Validated against the schema below, and the operation is performed on it.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PayoffProjectionRequest"
              }
            }
          }
        }
      }
    },
    "/v1/calendars/business-days": {
      "post": {
        "operationId": "computeBusinessDays",
        "summary": "Business-day arithmetic, federal holidays computed rather than tabled",
        "description": "PERFORMED. Callable now, keyless and free. Business-day arithmetic, federal holidays computed rather than tabled. Gate: none. Calendar arithmetic on an interval the caller states. No TRID timing table is applied here: the disclose rows above answer UNRATIFIED because those timing rows are not signed off, and this route does not assume what that refusal names as missing.",
        "tags": [
          "compute"
        ],
        "x-status": "performed",
        "x-gate": "none",
        "x-gate-kind": "none",
        "x-lifecycle-verb": "compute",
        "responses": {
          "200": {
            "description": "Business-day arithmetic, federal holidays computed rather than tabled. Computed on the inputs supplied, keyless and free. The body carries charge: null and price: null, and states in its own fields that it is not an offer, not a quote and not a Decision.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BusinessDaysResult"
                }
              }
            }
          },
          "422": {
            "description": "INVALID_REQUEST. The body did not match the schema this operation publishes. The cure names every field that failed and needs no Lender, no licence and no date.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RequestInvalid"
                }
              }
            }
          }
        },
        "x-keyless": true,
        "x-free": true,
        "requestBody": {
          "required": true,
          "description": "Validated against the schema below, and the operation is performed on it.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BusinessDaysRequest"
              }
            }
          }
        }
      }
    },
    "/v1/register": {
      "get": {
        "operationId": "readRegister",
        "summary": "The published register as typed rows, every route with its gate and what it answers",
        "description": "PERFORMED. Callable now, keyless and free. The published register as typed rows, every route with its gate and what it answers. Gate: none. The register this door publishes, read as data. It is the same array that drives this document, this route and the enumeration in llms.txt, so the three cannot drift.",
        "tags": [
          "compute"
        ],
        "x-status": "performed",
        "x-gate": "none",
        "x-gate-kind": "none",
        "x-lifecycle-verb": "compute",
        "responses": {
          "200": {
            "description": "The published register as typed rows, every route with its gate and what it answers. Computed on the inputs supplied, keyless and free. The body carries charge: null and price: null, and states in its own fields that it is not an offer, not a quote and not a Decision.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RegisterDocument"
                }
              }
            }
          }
        },
        "x-keyless": true,
        "x-free": true
      }
    },
    "/v1/lifecycle": {
      "get": {
        "operationId": "readLifecycle",
        "summary": "The six lifecycle verbs, their artifacts, the rule that fixes each, and the five Terminal Outcomes",
        "description": "PERFORMED. Callable now, keyless and free. The six lifecycle verbs, their artifacts, the rule that fixes each, and the five Terminal Outcomes. Gate: none. The verbs are the statute's own and the Terminal Outcomes are the HMDA action-taken enumeration, so this route restates a published list and mints nothing.",
        "tags": [
          "compute"
        ],
        "x-status": "performed",
        "x-gate": "none",
        "x-gate-kind": "none",
        "x-lifecycle-verb": "compute",
        "responses": {
          "200": {
            "description": "The six lifecycle verbs, their artifacts, the rule that fixes each, and the five Terminal Outcomes. Computed on the inputs supplied, keyless and free. The body carries charge: null and price: null, and states in its own fields that it is not an offer, not a quote and not a Decision.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LifecycleDocument"
                }
              }
            }
          }
        },
        "x-keyless": true,
        "x-free": true
      }
    },
    "/v1/refusals/explain": {
      "post": {
        "operationId": "explainRefusal",
        "summary": "Given a route in the register, the refusal it carries and why it carries it",
        "description": "PERFORMED. Callable now, keyless and free. Given a route in the register, the refusal it carries and why it carries it. Gate: none. A lookup over this door's own register. The MCP tool of the same name told a reader to call the route itself; this is that answer as one call, so an agent can ask the question without provoking the refusal.",
        "tags": [
          "compute"
        ],
        "x-status": "performed",
        "x-gate": "none",
        "x-gate-kind": "none",
        "x-lifecycle-verb": "compute",
        "responses": {
          "200": {
            "description": "Given a route in the register, the refusal it carries and why it carries it. Computed on the inputs supplied, keyless and free. The body carries charge: null and price: null, and states in its own fields that it is not an offer, not a quote and not a Decision.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RefusalExplanation"
                }
              }
            }
          },
          "422": {
            "description": "INVALID_REQUEST. The body did not match the schema this operation publishes. The cure names every field that failed and needs no Lender, no licence and no date.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RequestInvalid"
                }
              }
            }
          }
        },
        "x-keyless": true,
        "x-free": true,
        "requestBody": {
          "required": true,
          "description": "Validated against the schema below, and the operation is performed on it.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ExplainRefusalRequest"
              }
            }
          }
        }
      }
    },
    "/v1/intents/{id}/route": {
      "post": {
        "operationId": "routeIntent",
        "summary": "The documented cure route for every LENDER_RESERVED refusal",
        "description": "ROADMAP. Not yet callable. The cure route named by every LENDER_RESERVED refusal at this door. This operation answers with a documented BLOCKED.",
        "tags": [
          "apply"
        ],
        "x-status": "roadmap",
        "x-gate": "signer-R · lenderReserved: take the Application",
        "x-gate-kind": "signer-R",
        "x-reserved-tier": "LENDER_RESERVED",
        "x-reserved-to": "Lender",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Validated against the schema below. The body is checked and reported on, and it does not change the refusal: this route resolves to no party until a Lender is named to the marketplace.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/IntentRouteRequest"
              }
            }
          }
        },
        "responses": {
          "422": {
            "description": "BLOCKED. No Lender is named and no Program Agreement is executed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BlockedRefusal"
                },
                "example": {
                  "object": "intent.route",
                  "status": "BLOCKED",
                  "route": "POST /v1/intents/{id}/route",
                  "blocked": {
                    "act": "ROUTE_TO_LENDER",
                    "reason": "UNNAMED_ENTITY",
                    "tier": "LENDER_RESERVED",
                    "permanent": false,
                    "detail": "This is the documented cure route for every LENDER_RESERVED refusal at this door. It is documented and it is not open: no Lender is named and no Program Agreement is executed, so the route resolves to no party today. It is published now so the call site does not move on the day it does.",
                    "reserved_to_party": "Lender",
                    "cure": {
                      "route": "LENDER_MARKETPLACE",
                      "needs_human": true,
                      "human_route": "marketplace",
                      "description": "When a Lender is named, this route resolves to that Lender. The Lender takes the Application, runs its own clocks, and issues the Decision.",
                      "platform_compensation": null,
                      "compensation_note": "The platform is compensated nothing for this route on a transaction that the referral prohibition at 12 U.S.C. 2607 reaches."
                    }
                  },
                  "charge": null,
                  "note": "Nothing was routed. Nothing was metered."
                }
              }
            }
          }
        }
      }
    }
  }
}