> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pylon.mortgage/llms.txt
> Use this file to discover all available pages before exploring further.

# Fixed loan structures

> Get a fixed loan structure (e.g. 90% LTV) by using `MIN_DOWN_PAYMENT` with a `maxLTV` constraint.

To get a **fixed loan structure**—for example 80% LTV (20% down) or 90% LTV (10% down)—use `MIN_DOWN_PAYMENT` as the optimization objective and set `maxLTV` in your pricing constraints to the LTV you want. The result will have that exact LTV and the matching down payment.

You can do this with either **[most optimal structure](/guides/getting-started/pricing-optimizations/most-optimal-structure)** (single best structure) or **[full rate sheet optimizations](/guides/getting-started/pricing-optimizations/full-rate-sheet)** (full rate stack). Same objective and constraint in both cases.

## How to request it

**Most optimal structure:** Call `calculateOptimalStructure` with `objectiveIntent: "MIN_DOWN_PAYMENT"` and `pricingConstraints.maxLtv` set to your target (e.g. `0.90` for 90% LTV). Poll for the job, then read the result.

**Full rate sheet:** Call `productPricing` with `objectiveIntent: "MIN_DOWN_PAYMENT"` and ensure the loan has a `maxLTV` constraint (e.g. via [borrower preferences](/guides/getting-started/pricing-optimizations/overview#borrower-preferences-and-pricing-constraints) or your API’s equivalent). You get the full rate stack with that fixed LTV applied. See [Full rate sheet optimizations](/guides/getting-started/pricing-optimizations/full-rate-sheet) for the query and response shape.

**Example (most optimal structure):**

```json theme={null}
{
  "input": {
    "loanId": "app_5ap9raB5XUhQZLLkpg31Ve",
    "objectiveIntent": "MIN_DOWN_PAYMENT",
    "pricingConstraints": {
      "maxLtv": 0.90
    }
  }
}
```

With `maxLtv: 0.90`, the returned structure will be 90% LTV and 10% down. Other common values: `0.80` (80% LTV, 20% down), `0.95` (95% LTV, 5% down), `0.97` (97% LTV, 3% down).

**Where `maxLTV` comes from:** In some flows you pass `maxLtv` in the request (e.g. `pricingConstraints.maxLtv` in the most-optimal-structure mutation). In others it is not in the request—it’s already set on the loan (e.g. [borrower preferences](/guides/getting-started/pricing-optimizations/overview#borrower-preferences-and-pricing-constraints)) and the pricing call uses that. Check the API for the flow you’re using.

## Why the structure is fixed

The optimizer minimizes the down payment (`MIN_DOWN_PAYMENT`) and is not allowed to exceed your `maxLTV`. So it lowers the down payment and increases the loan amount until LTV equals `maxLTV`, then stops. The solution is always at that boundary:

* **LTV = `maxLTV`**
* **Down payment = Purchase price × (1 − `maxLTV`)**

So you get a single, predictable LTV and down payment (e.g. 90% / 10%) instead of a fractional result.

If the solver cannot find a feasible structure at the requested `maxLTV` (for example because of program limits, [DTI](/entity-models/key-concepts/dti), [reserves](/entity-models/key-concepts/reserves), or other guidelines), it returns the **closest possible LTV** that achieves a solve—so you may get a lower LTV (higher down payment) than you asked for, but you still get a valid structure.
