{
  "openapi": "3.0.3",
  "info": {
    "title": "Monthly Payment API",
    "version": "2026-10-13",
    "description": "Build your own \"estimated monthly payment\" widget. One call returns loan payments (Upgrade and Thrive Financial) and SmartPay rent-to-own payments for a structure, using exactly the same rules as the brand's live financing estimator. JSON in, JSON out, no API key.\n\n**Quick start**\n1. On page load: `GET /v1/{brand}/options` — build the two dropdowns (credit score, property ownership) from `questions.*.options`.\n2. With the customer's answers plus the delivery ZIP and total price: `POST /v1/{brand}/estimate` (or the GET form with a query string).\n3. Show what comes back. Rates, eligibility, terms, payments, APRs, Apply links and disclosure text are all pre-computed — never recompute or retype them.\n\n**Always in sync — fails closed.** The API mirrors the brand's live estimator (for Stoltzfus: https://shedlender.com/estimator.html). Rates, limits, eligibility rules, Apply links and disclosures are read live from that page. If the estimator's calculation logic changes, the API switches itself off and returns **HTTP 503 `estimates_unavailable`** until the change is confirmed. Handle it by hiding the payment section or showing a short \"unavailable\" note. `GET /v1/{brand}/health` shows the current state.\n\n**Display rules (please follow)**\n- Always show a loan payment together with its APR and term (`monthlyPaymentDisplay` + `aprDisplay` + `label`). Never a payment by itself.\n- Keep the `*` on APRs and the `†` (`footnote`) on interest-only Thrive terms, and put the matching disclosures on the page.\n- Never show an APR or interest rate for rent-to-own — it is a lease, not a loan.\n- Do not name the lender on the payment choices (`loans.terms`). Show lender names only at the Apply step (`loans.terms[].offers[].lenderName`).\n- Point every Apply button at `applyLink` (it counts the click anonymously, then redirects to the lender) and open it in a new tab when `applyOpensNewTab` is true. Show the matching `applyHint` next to the button.\n- Show every block in `disclosures.forThisWidget`, in order (use `html` to keep bold text and superscripts). They are copied word-for-word from the estimator and update automatically.\n- Show `loans.notice` and any `overMaxText` (per lender in `loans.byLender`, and `rentToOwn.overMaxText`) beside the payments they describe. When `loans.available` is false show `loans.message`; when `rentToOwn.available` is false show `rentToOwn.reasonText`.\n- Never call these products \"unsecured\". Do not call the API for custom-quote structures with no set price.\n\n**Error simulator.** Add `simulate=<value>` (query string or JSON body) to /estimate to get a canned outcome for testing: `unavailable` (503), `invalid` (400), `origin_blocked` (403), `rto_unavailable` (200 with rent-to-own unavailable), `slow` (200 after ~4 s). Simulated responses carry an `X-Simulated` header and the body echoes `simulated`; they are not counted in usage statistics. Never send `simulate` in production.\n\n**Errors.** Every error body is `{\"ok\": false, \"error\": \"<code>\", ...}`: `invalid_input` (400, with customer-ready `fields` messages), `invalid_json` (400), `origin_not_allowed` (403), `brand_not_enabled` (404, with `liveBrands`), `not_found` (404 for an unknown route, with `routes`), `unknown_product` (404 from /apply), `method_not_allowed` (405, e.g. POST /options), `estimates_unavailable` (503), `server_error` (500).\n\n**CORS.** Browser calls are allowed from `https://*.mysheds.com`, `http://localhost:*` and the API's own site. Calls from a server (no `Origin` header) are always allowed. Any other browser origin gets 403 `origin_not_allowed` without CORS headers. Ask Tim Brazil (Lending Manager) to add a domain.\n\n**Forward compatibility.** New fields may be added to any response object; ignore fields you do not use. (The published schemas therefore do not set `additionalProperties: false`; validation against live responses was run with it forced on.)\n\n**Apply links count clicks.** Never request `/v1/{brand}/apply/...` from scripts, tests or monitors — each request is recorded as a customer click.",
    "contact": {
      "name": "Tim Brazil, Lending Manager",
      "url": "https://payment-estimate-api.pages.dev/"
    }
  },
  "externalDocs": {
    "description": "Guide and live test page",
    "url": "https://payment-estimate-api.pages.dev/"
  },
  "servers": [
    {
      "url": "https://payment-estimate-api.pages.dev",
      "description": "Production"
    }
  ],
  "tags": [
    {
      "name": "Estimates",
      "description": "Form options and payment estimates — what your widget calls."
    },
    {
      "name": "Apply",
      "description": "Click-counting redirects to lender applications. Link to them; never request them from code."
    },
    {
      "name": "Discovery",
      "description": "Which brands are live."
    },
    {
      "name": "Diagnostics",
      "description": "Health and the mirrored rules."
    }
  ],
  "paths": {
    "/v1/brands": {
      "get": {
        "tags": [
          "Discovery"
        ],
        "operationId": "listBrands",
        "summary": "List live brands",
        "description": "Brands whose estimator is live in this API.",
        "responses": {
          "200": {
            "description": "Live brands.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BrandsResponse"
                },
                "examples": {
                  "live": {
                    "$ref": "#/components/examples/Brands"
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            }
          },
          "403": {
            "$ref": "#/components/responses/OriginNotAllowed"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/v1/{brand}/options": {
      "parameters": [
        {
          "$ref": "#/components/parameters/Brand"
        }
      ],
      "get": {
        "tags": [
          "Estimates"
        ],
        "operationId": "getOptions",
        "summary": "Questions, lender limits and disclosures",
        "description": "Call once on page load. Build your two dropdowns from `questions.creditScore.options` and `questions.ownProperty.options`, and send the chosen `value` back to /estimate.",
        "responses": {
          "200": {
            "description": "Form options.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OptionsResponse"
                },
                "examples": {
                  "stoltzfus": {
                    "$ref": "#/components/examples/Options"
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            }
          },
          "403": {
            "$ref": "#/components/responses/OriginNotAllowed"
          },
          "404": {
            "$ref": "#/components/responses/BrandNotEnabled"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/v1/{brand}/estimate": {
      "parameters": [
        {
          "$ref": "#/components/parameters/Brand"
        }
      ],
      "get": {
        "tags": [
          "Estimates"
        ],
        "operationId": "getEstimate",
        "summary": "Estimate payments (query string)",
        "description": "Loan payments (Upgrade, Thrive Financial) and rent-to-own payments (SmartPay) for one structure. Only call once the ZIP has 5 digits, price > 0 and both questions are answered; debounce about 0.4 s and ignore out-of-order responses. Switching terms needs no new call — every term is in the response. Rent-to-own quotes are limited to 120 per visitor every 10 minutes. The GET form is handy for testing in a browser tab; it returns exactly the same body as POST.",
        "parameters": [
          {
            "$ref": "#/components/parameters/Zip"
          },
          {
            "$ref": "#/components/parameters/Price"
          },
          {
            "$ref": "#/components/parameters/CreditScore"
          },
          {
            "$ref": "#/components/parameters/OwnProperty"
          },
          {
            "$ref": "#/components/parameters/Simulate"
          }
        ],
        "responses": {
          "200": {
            "description": "Payments calculated. With `simulate=rto_unavailable` or `simulate=slow` the body also carries `simulated`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EstimateResponse"
                },
                "examples": {
                  "loansAndRentToOwn": {
                    "$ref": "#/components/examples/EstBase"
                  },
                  "noLoans": {
                    "$ref": "#/components/examples/Est500"
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              },
              "X-Simulated": {
                "$ref": "#/components/headers/X-Simulated"
              }
            }
          },
          "400": {
            "description": "Invalid input (or `simulate=invalid`).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorInvalidInput"
                },
                "examples": {
                  "badZipAndPrice": {
                    "$ref": "#/components/examples/BadInput"
                  },
                  "zip00000": {
                    "$ref": "#/components/examples/EstZip00000"
                  },
                  "simulated": {
                    "$ref": "#/components/examples/SimInvalid"
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              },
              "X-Simulated": {
                "$ref": "#/components/headers/X-Simulated"
              }
            }
          },
          "403": {
            "$ref": "#/components/responses/OriginNotAllowed"
          },
          "404": {
            "$ref": "#/components/responses/BrandNotEnabled"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/EstimatesUnavailable"
          }
        }
      },
      "post": {
        "tags": [
          "Estimates"
        ],
        "operationId": "postEstimate",
        "summary": "Estimate payments (JSON body)",
        "description": "Loan payments (Upgrade, Thrive Financial) and rent-to-own payments (SmartPay) for one structure. Only call once the ZIP has 5 digits, price > 0 and both questions are answered; debounce about 0.4 s and ignore out-of-order responses. Switching terms needs no new call — every term is in the response. Rent-to-own quotes are limited to 120 per visitor every 10 minutes.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EstimateRequest"
              },
              "examples": {
                "basic": {
                  "value": {
                    "zip": "19310",
                    "price": 16820,
                    "creditScore": "720",
                    "ownProperty": "own"
                  }
                },
                "simulateRentToOwnDown": {
                  "value": {
                    "zip": "19310",
                    "price": 16820,
                    "creditScore": "720",
                    "ownProperty": "own",
                    "simulate": "rto_unavailable"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Payments calculated. With `simulate=rto_unavailable` or `simulate=slow` the body also carries `simulated`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EstimateResponse"
                },
                "examples": {
                  "loansAndRentToOwn": {
                    "$ref": "#/components/examples/EstBase"
                  },
                  "noLoans": {
                    "$ref": "#/components/examples/Est500"
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              },
              "X-Simulated": {
                "$ref": "#/components/headers/X-Simulated"
              }
            }
          },
          "400": {
            "description": "Invalid input, or the body is not valid JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/ErrorInvalidInput"
                    },
                    {
                      "$ref": "#/components/schemas/ErrorInvalidJson"
                    }
                  ]
                },
                "examples": {
                  "missingFields": {
                    "$ref": "#/components/examples/PostMissing"
                  },
                  "invalidJson": {
                    "$ref": "#/components/examples/PostBadjson"
                  },
                  "simulated": {
                    "$ref": "#/components/examples/PostSimInvalid"
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              },
              "X-Simulated": {
                "$ref": "#/components/headers/X-Simulated"
              }
            }
          },
          "403": {
            "$ref": "#/components/responses/OriginNotAllowed"
          },
          "404": {
            "$ref": "#/components/responses/BrandNotEnabled"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          },
          "503": {
            "$ref": "#/components/responses/EstimatesUnavailable"
          }
        }
      },
      "options": {
        "tags": [
          "Estimates"
        ],
        "operationId": "preflightEstimate",
        "summary": "CORS preflight",
        "description": "Sent automatically by browsers before a JSON POST. Allowed origins get 204 with CORS headers; others get 403.",
        "responses": {
          "204": {
            "description": "Origin allowed.",
            "headers": {
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              },
              "Access-Control-Allow-Methods": {
                "schema": {
                  "type": "string",
                  "example": "GET, POST, OPTIONS"
                }
              },
              "Access-Control-Allow-Headers": {
                "schema": {
                  "type": "string",
                  "example": "Content-Type"
                }
              },
              "Access-Control-Max-Age": {
                "schema": {
                  "type": "integer",
                  "example": 86400
                }
              },
              "Vary": {
                "$ref": "#/components/headers/Vary"
              }
            }
          },
          "403": {
            "description": "Origin not allowed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorOriginNotAllowed"
                },
                "examples": {
                  "evil": {
                    "$ref": "#/components/examples/PreflightEvil"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/v1/{brand}/health": {
      "parameters": [
        {
          "$ref": "#/components/parameters/Brand"
        }
      ],
      "get": {
        "tags": [
          "Diagnostics"
        ],
        "operationId": "getHealth",
        "summary": "Is the API serving estimates?",
        "description": "200 with `ok: true` while estimates are served; 503 when the API has switched itself off because the estimator changed.",
        "responses": {
          "200": {
            "description": "Healthy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HealthResponse"
                },
                "examples": {
                  "healthy": {
                    "$ref": "#/components/examples/Health"
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            }
          },
          "403": {
            "$ref": "#/components/responses/OriginNotAllowed"
          },
          "404": {
            "$ref": "#/components/responses/BrandNotEnabled"
          },
          "503": {
            "description": "Switched off (same shape, `ok: false`; not observed live).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HealthResponse"
                }
              }
            }
          }
        }
      }
    },
    "/v1/{brand}/rules": {
      "parameters": [
        {
          "$ref": "#/components/parameters/Brand"
        }
      ],
      "get": {
        "tags": [
          "Diagnostics"
        ],
        "operationId": "getRules",
        "summary": "Snapshot of the mirrored estimator rules",
        "description": "For diagnostics: the normalized rules the API read from the estimator. Do not build pricing from this — use /estimate.",
        "responses": {
          "200": {
            "description": "Rules in use.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RulesResponse"
                },
                "examples": {
                  "current": {
                    "$ref": "#/components/examples/Rules"
                  }
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "$ref": "#/components/headers/Cache-Control"
              },
              "Access-Control-Allow-Origin": {
                "$ref": "#/components/headers/Access-Control-Allow-Origin"
              }
            }
          },
          "403": {
            "$ref": "#/components/responses/OriginNotAllowed"
          },
          "404": {
            "$ref": "#/components/responses/BrandNotEnabled"
          },
          "503": {
            "description": "Switched off (same shape, `ok: false`; not observed live).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RulesResponse"
                }
              }
            }
          }
        }
      }
    },
    "/v1/{brand}/apply/{product}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/Brand"
        }
      ],
      "get": {
        "tags": [
          "Apply"
        ],
        "operationId": "apply",
        "summary": "Apply redirect (counts a click)",
        "description": "**Do not call this from code, tests or monitors — every request counts one Apply click in production statistics.** Use it only as the `href` of a real Apply button (take the URL from `applyLink` in the estimate). It counts the click anonymously, then answers 302 with a `Location` header pointing to the lender's application.",
        "parameters": [
          {
            "name": "product",
            "in": "path",
            "required": true,
            "description": "Which application to open.",
            "schema": {
              "type": "string",
              "enum": [
                "upgrade",
                "thrive",
                "rto"
              ]
            }
          },
          {
            "name": "term",
            "in": "query",
            "required": false,
            "description": "Term in months the customer chose (added automatically in `loans.terms[].offers[].applyLink`).",
            "schema": {
              "type": "integer",
              "example": 60
            }
          }
        ],
        "responses": {
          "302": {
            "description": "Redirect to the lender's application.",
            "headers": {
              "Location": {
                "description": "Lender application URL.",
                "schema": {
                  "type": "string",
                  "format": "uri"
                }
              }
            }
          },
          "404": {
            "description": "Unknown product, or brand not live.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/ErrorUnknownProduct"
                    },
                    {
                      "$ref": "#/components/schemas/ErrorBrandNotEnabled"
                    }
                  ]
                },
                "examples": {
                  "unknownProduct": {
                    "summary": "Documented shape (not requested live — it would count a click)",
                    "value": {
                      "ok": false,
                      "error": "unknown_product",
                      "products": [
                        "upgrade",
                        "thrive",
                        "rto"
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "ApplyHint": {
        "type": "object",
        "description": "The small print the estimator shows under this lender's Apply button. Show it next to your Apply button.",
        "required": [
          "text",
          "html"
        ],
        "properties": {
          "text": {
            "type": "string",
            "description": "Plain-text small print (footnote markers printed as ¹ etc.).",
            "example": "Soft credit check to see your offers — checking offers does not affect your credit score.¹"
          },
          "html": {
            "type": "string",
            "description": "Same text as HTML. Sanitized server-side: only `<strong>`, `<b>`, `<em>`, `<sup>` tags and HTML entities, so it is safe to insert as HTML.",
            "example": "Soft credit check to see your offers — checking offers does not affect your credit score.<sup>1</sup>"
          }
        }
      },
      "RulesFrom": {
        "type": "object",
        "description": "Where and when the API read the rules it used for this response.",
        "required": [
          "estimator",
          "estimatorVersion",
          "readAt",
          "source"
        ],
        "properties": {
          "estimator": {
            "type": "string",
            "description": "The published estimator page the rules were read from.",
            "format": "uri",
            "example": "https://shedlender.com/estimator.html"
          },
          "estimatorVersion": {
            "type": "string",
            "description": "Short hash of the estimator version the rules came from. Changes whenever the estimator page changes.",
            "example": "e29cbbafc3fb90f1"
          },
          "readAt": {
            "type": "string",
            "description": "When the rules were read from the estimator (UTC, ISO 8601).",
            "format": "date-time",
            "example": "2026-10-13T14:50:13.708Z"
          },
          "source": {
            "type": "string",
            "description": "How the rules were obtained for this response, e.g. `live` (just read from the estimator page) or `cache` (a recent read is being reused).",
            "example": "cache"
          }
        }
      },
      "DisclosureParagraph": {
        "type": "object",
        "description": "One paragraph of disclosure text.",
        "required": [
          "text",
          "html"
        ],
        "properties": {
          "text": {
            "type": "string",
            "description": "Plain-text paragraph, word-for-word from the estimator page."
          },
          "html": {
            "type": "string",
            "description": "Same paragraph as sanitized HTML (only `<strong>`, `<b>`, `<em>`, `<sup>` and entities). Prefer this to keep the bold text and superscript markers."
          }
        }
      },
      "DisclosureCatalogParagraph": {
        "type": "object",
        "description": "One paragraph of disclosure text in the full catalog, tagged with the products it relates to.",
        "required": [
          "text",
          "html",
          "products"
        ],
        "properties": {
          "text": {
            "type": "string",
            "description": "Plain-text paragraph, word-for-word from the estimator page."
          },
          "html": {
            "type": "string",
            "description": "Same paragraph as sanitized HTML (only `<strong>`, `<b>`, `<em>`, `<sup>` and entities)."
          },
          "products": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Product keys this paragraph is about (e.g. `upgrade`, `thrive`, `rto`, `figure`, `pure`). Empty = applies to everything.",
            "example": [
              "rto"
            ]
          }
        }
      },
      "DisclosureParagraphBlock": {
        "type": "object",
        "description": "Free-standing paragraph(s) — render as plain paragraphs.",
        "required": [
          "type",
          "id",
          "title",
          "titleHtml",
          "paragraphs"
        ],
        "properties": {
          "type": {
            "type": "string",
            "description": "Block type.",
            "enum": [
              "paragraph"
            ]
          },
          "id": {
            "type": "string",
            "description": "Anchor id of the block on the estimator page (e.g. `disc-credit`), or null.",
            "example": "disc-credit",
            "nullable": true
          },
          "title": {
            "type": "string",
            "description": "Optional title (plain text), or null.",
            "nullable": true
          },
          "titleHtml": {
            "type": "string",
            "description": "Optional title as sanitized HTML, or null.",
            "nullable": true
          },
          "paragraphs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DisclosureParagraph"
            },
            "description": "Paragraphs to show, in order."
          }
        }
      },
      "DisclosureHeadingBlock": {
        "type": "object",
        "description": "A heading — render as a heading above the blocks that follow.",
        "required": [
          "type",
          "text"
        ],
        "properties": {
          "type": {
            "type": "string",
            "description": "Block type.",
            "enum": [
              "heading"
            ]
          },
          "text": {
            "type": "string",
            "description": "Heading text.",
            "example": "Important Disclosures"
          }
        }
      },
      "DisclosureSectionBlock": {
        "type": "object",
        "description": "A titled disclosure section — render the title, then its paragraphs.",
        "required": [
          "type",
          "id",
          "title",
          "titleHtml",
          "paragraphs"
        ],
        "properties": {
          "type": {
            "type": "string",
            "description": "Block type.",
            "enum": [
              "section"
            ]
          },
          "id": {
            "type": "string",
            "description": "Anchor id on the estimator page, e.g. `disc-payments`. Footnotes point here via `disclosureId`.",
            "example": "disc-payments"
          },
          "title": {
            "type": "string",
            "description": "Section title (plain text). May begin with a marker such as `*` or `²`.",
            "example": "* Payment & APR Estimates"
          },
          "titleHtml": {
            "type": "string",
            "description": "Section title as sanitized HTML (HTML-escaped, e.g. `&amp;`; may contain `<sup>`/`<strong>`).",
            "example": "* Payment &amp; APR Estimates"
          },
          "paragraphs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DisclosureParagraph"
            },
            "description": "Paragraphs to show under the title, in order."
          }
        }
      },
      "DisclosureBlock": {
        "description": "One block of `disclosures.forThisWidget`. Check `type` and render every block, in order.",
        "oneOf": [
          {
            "$ref": "#/components/schemas/DisclosureParagraphBlock"
          },
          {
            "$ref": "#/components/schemas/DisclosureHeadingBlock"
          },
          {
            "$ref": "#/components/schemas/DisclosureSectionBlock"
          }
        ],
        "discriminator": {
          "propertyName": "type",
          "mapping": {
            "paragraph": "#/components/schemas/DisclosureParagraphBlock",
            "heading": "#/components/schemas/DisclosureHeadingBlock",
            "section": "#/components/schemas/DisclosureSectionBlock"
          }
        }
      },
      "DisclosureCatalogParagraphBlock": {
        "type": "object",
        "description": "Free-standing paragraph(s) in the full catalog.",
        "required": [
          "type",
          "id",
          "products",
          "paragraphs"
        ],
        "properties": {
          "type": {
            "type": "string",
            "description": "Block type.",
            "enum": [
              "paragraph"
            ]
          },
          "id": {
            "type": "string",
            "description": "Anchor id on the estimator page, or null.",
            "nullable": true
          },
          "products": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Product keys this block relates to (empty = all)."
          },
          "paragraphs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DisclosureCatalogParagraph"
            },
            "description": "Paragraphs, in order."
          }
        }
      },
      "DisclosureCatalogSectionBlock": {
        "type": "object",
        "description": "A titled section in the full catalog.",
        "required": [
          "type",
          "id",
          "title",
          "titleHtml",
          "products",
          "paragraphs"
        ],
        "properties": {
          "type": {
            "type": "string",
            "description": "Block type.",
            "enum": [
              "section"
            ]
          },
          "id": {
            "type": "string",
            "description": "Anchor id on the estimator page.",
            "example": "disc-figure-funding"
          },
          "title": {
            "type": "string",
            "description": "Section title (plain text)."
          },
          "titleHtml": {
            "type": "string",
            "description": "Section title as sanitized HTML."
          },
          "products": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Product keys this section relates to (empty = all)."
          },
          "paragraphs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DisclosureCatalogParagraph"
            },
            "description": "Paragraphs, in order."
          }
        }
      },
      "DisclosureCatalogCompanyBlock": {
        "type": "object",
        "description": "Company / legal footer lines from the estimator page.",
        "required": [
          "type",
          "id",
          "products",
          "paragraphs"
        ],
        "properties": {
          "type": {
            "type": "string",
            "description": "Block type.",
            "enum": [
              "company"
            ]
          },
          "id": {
            "type": "string",
            "description": "Anchor id on the estimator page, or null.",
            "nullable": true
          },
          "products": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Product keys this block relates to (empty = all)."
          },
          "paragraphs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DisclosureCatalogParagraph"
            },
            "description": "Paragraphs, in order."
          }
        }
      },
      "DisclosureCatalogBlock": {
        "description": "One block of `disclosures.all` — the estimator's whole disclosure footer, including products this widget does not offer. For reference; show `forThisWidget` on your page.",
        "oneOf": [
          {
            "$ref": "#/components/schemas/DisclosureCatalogParagraphBlock"
          },
          {
            "$ref": "#/components/schemas/DisclosureHeadingBlock"
          },
          {
            "$ref": "#/components/schemas/DisclosureCatalogSectionBlock"
          },
          {
            "$ref": "#/components/schemas/DisclosureCatalogCompanyBlock"
          }
        ],
        "discriminator": {
          "propertyName": "type",
          "mapping": {
            "paragraph": "#/components/schemas/DisclosureCatalogParagraphBlock",
            "heading": "#/components/schemas/DisclosureHeadingBlock",
            "section": "#/components/schemas/DisclosureCatalogSectionBlock",
            "company": "#/components/schemas/DisclosureCatalogCompanyBlock"
          }
        }
      },
      "Footnote": {
        "type": "object",
        "description": "Maps a footnote marker used in payments / Apply hints to the disclosure that explains it.",
        "required": [
          "marker",
          "display",
          "disclosureId",
          "title",
          "appliesToThisWidget"
        ],
        "properties": {
          "marker": {
            "type": "string",
            "description": "Footnote marker as a plain character: `1`, `*`, `2`, `3`, `†` …",
            "example": "*"
          },
          "display": {
            "type": "string",
            "description": "How the marker is printed: `¹`, `*`, `²`, `³`, `†` …",
            "example": "*"
          },
          "disclosureId": {
            "type": "string",
            "description": "Id of the disclosure block that explains this marker.",
            "example": "disc-payments"
          },
          "title": {
            "type": "string",
            "description": "Title of that disclosure block, or null when it has none.",
            "example": "* Payment & APR Estimates",
            "nullable": true
          },
          "appliesToThisWidget": {
            "type": "boolean",
            "description": "True when the explaining block is part of `forThisWidget` (so it will be on your page)."
          },
          "note": {
            "type": "string",
            "description": "Extra explanation. Present only on the `†` (interest-only) marker, which has no block of its own — it is explained inside the `disc-payments` section and in each term's `paymentNote`."
          }
        }
      },
      "Disclosures": {
        "type": "object",
        "description": "Disclosure text for the page, read live from the estimator.",
        "required": [
          "source",
          "forThisWidget",
          "all",
          "footnotes",
          "notALender",
          "representativeExample",
          "rentToOwnStructures"
        ],
        "properties": {
          "source": {
            "type": "string",
            "description": "Where the disclosure text was copied from.",
            "example": "https://shedlender.com/estimator.html (footer, \"Important Disclosures\") — copied word-for-word, updates automatically"
          },
          "forThisWidget": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DisclosureBlock"
            },
            "description": "The disclosures your page must show, in this order. Copied word-for-word from the estimator and updated automatically — never edit or retype them."
          },
          "all": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DisclosureCatalogBlock"
            },
            "description": "The estimator's complete disclosure footer (reference only)."
          },
          "footnotes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Footnote"
            },
            "description": "Every footnote marker and which disclosure explains it."
          },
          "notALender": {
            "type": "string",
            "description": "The \"not a lender\" statement on its own, for tight layouts."
          },
          "representativeExample": {
            "type": "string",
            "description": "The representative-example sentence on its own."
          },
          "rentToOwnStructures": {
            "type": "string",
            "description": "Which structures do not qualify for rent-to-own."
          }
        }
      },
      "QuestionOption": {
        "type": "object",
        "description": "One dropdown choice.",
        "required": [
          "value",
          "label"
        ],
        "properties": {
          "value": {
            "type": "string",
            "description": "Send this value back to /estimate.",
            "example": "720"
          },
          "label": {
            "type": "string",
            "description": "Show this text in the dropdown.",
            "example": "720 – 799"
          }
        }
      },
      "Question": {
        "type": "object",
        "description": "One customer question, ready to render as a `<select>`.",
        "required": [
          "field",
          "label",
          "placeholder",
          "helpText",
          "options"
        ],
        "properties": {
          "field": {
            "type": "string",
            "description": "Name of the /estimate input this question fills.",
            "enum": [
              "creditScore",
              "ownProperty"
            ]
          },
          "label": {
            "type": "string",
            "description": "Question text.",
            "example": "What is your credit score?"
          },
          "placeholder": {
            "type": "string",
            "description": "Text for the empty first dropdown option.",
            "example": "— Select credit score —"
          },
          "helpText": {
            "type": "string",
            "description": "Help text to show under the question."
          },
          "options": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/QuestionOption"
            },
            "description": "Dropdown choices, in display order. Values are read live from the estimator — do not hard-code them."
          }
        }
      },
      "LenderProgram": {
        "type": "object",
        "description": "A lender program's limits, as read live from the estimator.",
        "required": [
          "lender",
          "product",
          "minCreditScore",
          "minAmount",
          "maxAmount",
          "requiresPropertyOwnership",
          "notOfferedInStates",
          "comingSoon",
          "applyUrl",
          "applyHint"
        ],
        "properties": {
          "lender": {
            "type": "string",
            "description": "Lender display name — show it only at the Apply step.",
            "example": "Upgrade"
          },
          "product": {
            "type": "string",
            "description": "Product name.",
            "example": "Consumer Financing"
          },
          "minCreditScore": {
            "type": "integer",
            "description": "Lowest credit-score value accepted (0 = no credit check).",
            "example": 680
          },
          "minAmount": {
            "type": "number",
            "description": "Smallest amount (USD) this program finances.",
            "example": 2000
          },
          "maxAmount": {
            "type": "number",
            "description": "Largest amount (USD) this program finances. Higher prices get payments for this amount plus an `overMaxText`.",
            "example": 100000
          },
          "requiresPropertyOwnership": {
            "type": "boolean",
            "description": "True when the customer (or their business) must own the property."
          },
          "notOfferedInStates": {
            "type": "array",
            "items": {
              "type": "string",
              "pattern": "^[A-Z]{2}$"
            },
            "description": "Two-letter states where the program is not offered.",
            "example": [
              "MN",
              "MS",
              "WA",
              "WI",
              "WY",
              "AK",
              "HI"
            ]
          },
          "comingSoon": {
            "type": "boolean",
            "description": "True when the program is announced but not yet open."
          },
          "applyUrl": {
            "type": "string",
            "description": "The lender's own application page. For reference — point buttons at the estimate's `applyLink` instead.",
            "format": "uri"
          },
          "applyHint": {
            "$ref": "#/components/schemas/ApplyHint"
          }
        }
      },
      "OptionsResponse": {
        "type": "object",
        "description": "Everything needed to build the form before the customer answers.",
        "required": [
          "ok",
          "apiVersion",
          "brand",
          "brandName",
          "rulesFrom",
          "questions",
          "inputs",
          "lenders",
          "disclosures",
          "displayRules"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "description": "Always `true` on a successful response.",
            "enum": [
              true
            ]
          },
          "apiVersion": {
            "type": "string",
            "description": "API version (a date).",
            "example": "2026-10-13"
          },
          "brand": {
            "type": "string",
            "description": "Brand slug.",
            "example": "stoltzfus"
          },
          "brandName": {
            "type": "string",
            "description": "Brand display name.",
            "example": "Stoltzfus Structures"
          },
          "rulesFrom": {
            "$ref": "#/components/schemas/RulesFrom"
          },
          "questions": {
            "type": "object",
            "description": "The two customer questions.",
            "required": [
              "creditScore",
              "ownProperty"
            ],
            "properties": {
              "creditScore": {
                "$ref": "#/components/schemas/Question"
              },
              "ownProperty": {
                "$ref": "#/components/schemas/Question"
              }
            }
          },
          "inputs": {
            "type": "object",
            "description": "Plain-English description of each /estimate input.",
            "required": [
              "zip",
              "price",
              "creditScore",
              "ownProperty"
            ],
            "properties": {
              "zip": {
                "type": "string",
                "example": "5-digit US ZIP where the structure will be delivered"
              },
              "price": {
                "type": "string",
                "example": "Total price in US dollars (number)"
              },
              "creditScore": {
                "type": "string",
                "example": "One of questions.creditScore.options[].value"
              },
              "ownProperty": {
                "type": "string",
                "example": "One of questions.ownProperty.options[].value"
              }
            }
          },
          "lenders": {
            "type": "object",
            "description": "Program limits per lender key: `upgrade` (Upgrade loan), `thrive` (Thrive Financial Building Loan), `rto` (SmartPay rent-to-own).",
            "required": [
              "upgrade",
              "thrive",
              "rto"
            ],
            "properties": {
              "upgrade": {
                "$ref": "#/components/schemas/LenderProgram"
              },
              "thrive": {
                "$ref": "#/components/schemas/LenderProgram"
              },
              "rto": {
                "$ref": "#/components/schemas/LenderProgram"
              }
            }
          },
          "disclosures": {
            "$ref": "#/components/schemas/Disclosures"
          },
          "displayRules": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The display rules, in plain English. Please follow them."
          }
        }
      },
      "InterestOnlyPayments": {
        "type": "object",
        "description": "Thrive Building Loan: what months 1–6 (interest-only) cost.",
        "required": [
          "halfReleased",
          "halfReleasedDisplay",
          "fullReleased",
          "fullReleasedDisplay"
        ],
        "properties": {
          "halfReleased": {
            "type": "number",
            "description": "Interest-only payment (USD) while half of the loan has been released.",
            "example": 56
          },
          "halfReleasedDisplay": {
            "type": "string",
            "description": "Formatted, e.g. `$56/mo`.",
            "example": "$56/mo"
          },
          "fullReleased": {
            "type": "number",
            "description": "Interest-only payment (USD) once the full loan has been released.",
            "example": 111.99
          },
          "fullReleasedDisplay": {
            "type": "string",
            "description": "Formatted, e.g. `$112/mo`.",
            "example": "$112/mo"
          }
        }
      },
      "LenderTerm": {
        "type": "object",
        "description": "One term from one lender. Fields marked \"Thrive rows only\" are present when `lender` is `thrive`.",
        "required": [
          "lender",
          "years",
          "months",
          "label",
          "amount",
          "apr",
          "aprDisplay",
          "monthlyPayment",
          "monthlyPaymentDisplay",
          "interestOnly",
          "footnote",
          "paymentNote"
        ],
        "properties": {
          "lender": {
            "type": "string",
            "description": "Loan lender key.",
            "enum": [
              "upgrade",
              "thrive"
            ]
          },
          "years": {
            "type": "integer",
            "description": "Term in years.",
            "example": 5
          },
          "months": {
            "type": "integer",
            "description": "Term in months.",
            "example": 60
          },
          "label": {
            "type": "string",
            "description": "Term label for your UI, e.g. `5-Year`, or `12-Year Offer` for a Thrive counter-offer term.",
            "example": "5-Year"
          },
          "amount": {
            "type": "number",
            "description": "Amount (USD) the payment is calculated on. Lower than the price when the price is over this lender's maximum.",
            "example": 16820
          },
          "apr": {
            "type": "number",
            "description": "APR as a percent number (7.99 = 7.99%).",
            "example": 7.99
          },
          "aprDisplay": {
            "type": "string",
            "description": "APR ready to show, including the `*` marker — keep it exactly as given.",
            "example": "7.99% APR*"
          },
          "monthlyPayment": {
            "type": "number",
            "description": "Monthly payment (USD, unrounded to the cent).",
            "example": 371.85
          },
          "monthlyPaymentDisplay": {
            "type": "string",
            "description": "Monthly payment ready to show. Always show it together with `aprDisplay` and the term.",
            "example": "$372"
          },
          "interestOnly": {
            "type": "boolean",
            "description": "True when the first months are interest-only (Thrive Building Loan)."
          },
          "footnote": {
            "type": "string",
            "description": "`†` on interest-only terms, otherwise an empty string. Keep it next to the payment.",
            "enum": [
              "",
              "†"
            ]
          },
          "paymentNote": {
            "type": "string",
            "description": "One-line explanation of the payment to show near it.",
            "example": "Fixed monthly principal & interest for the full term."
          },
          "estimatorLabel": {
            "type": "string",
            "description": "Thrive rows only: the label the estimator itself uses, e.g. `5-Year Term`, `12-Year Offer`.",
            "example": "5-Year Term"
          },
          "counterOffer": {
            "type": "boolean",
            "description": "Thrive rows only: true for a counter-offer term (offered to some credit tiers instead of the standard term)."
          },
          "interestOnlyMonths": {
            "type": "integer",
            "description": "Thrive rows only: number of interest-only months at the start.",
            "example": 6
          },
          "interestOnlyPayments": {
            "$ref": "#/components/schemas/InterestOnlyPayments"
          }
        }
      },
      "LoanOffer": {
        "type": "object",
        "description": "One lender's offer for a term, with its Apply link. Use these at the Apply step.",
        "required": [
          "lender",
          "years",
          "months",
          "label",
          "amount",
          "apr",
          "aprDisplay",
          "monthlyPayment",
          "monthlyPaymentDisplay",
          "interestOnly",
          "footnote",
          "paymentNote",
          "lenderName",
          "product",
          "applyUrl",
          "applyLink",
          "applyOpensNewTab",
          "applyHint"
        ],
        "properties": {
          "lender": {
            "type": "string",
            "description": "Loan lender key.",
            "enum": [
              "upgrade",
              "thrive"
            ]
          },
          "years": {
            "type": "integer",
            "description": "Term in years.",
            "example": 5
          },
          "months": {
            "type": "integer",
            "description": "Term in months.",
            "example": 60
          },
          "label": {
            "type": "string",
            "description": "Term label for your UI, e.g. `5-Year`, or `12-Year Offer` for a Thrive counter-offer term.",
            "example": "5-Year"
          },
          "amount": {
            "type": "number",
            "description": "Amount (USD) the payment is calculated on. Lower than the price when the price is over this lender's maximum.",
            "example": 16820
          },
          "apr": {
            "type": "number",
            "description": "APR as a percent number (7.99 = 7.99%).",
            "example": 7.99
          },
          "aprDisplay": {
            "type": "string",
            "description": "APR ready to show, including the `*` marker — keep it exactly as given.",
            "example": "7.99% APR*"
          },
          "monthlyPayment": {
            "type": "number",
            "description": "Monthly payment (USD, unrounded to the cent).",
            "example": 371.85
          },
          "monthlyPaymentDisplay": {
            "type": "string",
            "description": "Monthly payment ready to show. Always show it together with `aprDisplay` and the term.",
            "example": "$372"
          },
          "interestOnly": {
            "type": "boolean",
            "description": "True when the first months are interest-only (Thrive Building Loan)."
          },
          "footnote": {
            "type": "string",
            "description": "`†` on interest-only terms, otherwise an empty string. Keep it next to the payment.",
            "enum": [
              "",
              "†"
            ]
          },
          "paymentNote": {
            "type": "string",
            "description": "One-line explanation of the payment to show near it.",
            "example": "Fixed monthly principal & interest for the full term."
          },
          "estimatorLabel": {
            "type": "string",
            "description": "Thrive rows only: the label the estimator itself uses, e.g. `5-Year Term`, `12-Year Offer`.",
            "example": "5-Year Term"
          },
          "counterOffer": {
            "type": "boolean",
            "description": "Thrive rows only: true for a counter-offer term (offered to some credit tiers instead of the standard term)."
          },
          "interestOnlyMonths": {
            "type": "integer",
            "description": "Thrive rows only: number of interest-only months at the start.",
            "example": 6
          },
          "interestOnlyPayments": {
            "$ref": "#/components/schemas/InterestOnlyPayments"
          },
          "lenderName": {
            "type": "string",
            "description": "Lender display name — show it here, at the Apply step.",
            "example": "Upgrade"
          },
          "product": {
            "type": "string",
            "description": "Product name.",
            "example": "Consumer Financing"
          },
          "applyUrl": {
            "type": "string",
            "description": "The lender's own application page (reference only).",
            "format": "uri"
          },
          "applyLink": {
            "type": "string",
            "description": "Point the Apply button here. It counts the click anonymously, then redirects to the lender. Carries `?term=<months>`.",
            "format": "uri",
            "example": "https://payment-estimate-api.pages.dev/v1/stoltzfus/apply/upgrade?term=60"
          },
          "applyOpensNewTab": {
            "type": "boolean",
            "description": "Open `applyLink` in a new tab when true."
          },
          "applyHint": {
            "$ref": "#/components/schemas/ApplyHint"
          }
        }
      },
      "LoanTerm": {
        "type": "object",
        "description": "One payment choice per term (no lender name on this row). Fields marked \"Thrive rows only\" are present when `lender` is `thrive`.",
        "required": [
          "lender",
          "years",
          "months",
          "label",
          "amount",
          "apr",
          "aprDisplay",
          "monthlyPayment",
          "monthlyPaymentDisplay",
          "interestOnly",
          "footnote",
          "paymentNote",
          "bestLender",
          "offers"
        ],
        "properties": {
          "lender": {
            "type": "string",
            "description": "Loan lender key.",
            "enum": [
              "upgrade",
              "thrive"
            ]
          },
          "years": {
            "type": "integer",
            "description": "Term in years.",
            "example": 5
          },
          "months": {
            "type": "integer",
            "description": "Term in months.",
            "example": 60
          },
          "label": {
            "type": "string",
            "description": "Term label for your UI, e.g. `5-Year`, or `12-Year Offer` for a Thrive counter-offer term.",
            "example": "5-Year"
          },
          "amount": {
            "type": "number",
            "description": "Amount (USD) the payment is calculated on. Lower than the price when the price is over this lender's maximum.",
            "example": 16820
          },
          "apr": {
            "type": "number",
            "description": "APR as a percent number (7.99 = 7.99%).",
            "example": 7.99
          },
          "aprDisplay": {
            "type": "string",
            "description": "APR ready to show, including the `*` marker — keep it exactly as given.",
            "example": "7.99% APR*"
          },
          "monthlyPayment": {
            "type": "number",
            "description": "Monthly payment (USD, unrounded to the cent).",
            "example": 371.85
          },
          "monthlyPaymentDisplay": {
            "type": "string",
            "description": "Monthly payment ready to show. Always show it together with `aprDisplay` and the term.",
            "example": "$372"
          },
          "interestOnly": {
            "type": "boolean",
            "description": "True when the first months are interest-only (Thrive Building Loan)."
          },
          "footnote": {
            "type": "string",
            "description": "`†` on interest-only terms, otherwise an empty string. Keep it next to the payment.",
            "enum": [
              "",
              "†"
            ]
          },
          "paymentNote": {
            "type": "string",
            "description": "One-line explanation of the payment to show near it.",
            "example": "Fixed monthly principal & interest for the full term."
          },
          "estimatorLabel": {
            "type": "string",
            "description": "Thrive rows only: the label the estimator itself uses, e.g. `5-Year Term`, `12-Year Offer`.",
            "example": "5-Year Term"
          },
          "counterOffer": {
            "type": "boolean",
            "description": "Thrive rows only: true for a counter-offer term (offered to some credit tiers instead of the standard term)."
          },
          "interestOnlyMonths": {
            "type": "integer",
            "description": "Thrive rows only: number of interest-only months at the start.",
            "example": 6
          },
          "interestOnlyPayments": {
            "$ref": "#/components/schemas/InterestOnlyPayments"
          },
          "bestLender": {
            "type": "string",
            "description": "Key of the lender whose numbers this row shows (observed: the lowest APR for the term). Do not show the lender name on this row.",
            "enum": [
              "upgrade",
              "thrive"
            ]
          },
          "offers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LoanOffer"
            },
            "description": "Every lender offering this term (1 or more) — show these, with lender names, at the Apply step.",
            "minItems": 1
          }
        }
      },
      "LenderStatus": {
        "type": "object",
        "description": "Full detail for one loan lender.",
        "required": [
          "lender",
          "product",
          "eligible",
          "comingSoon",
          "reason",
          "reasonText",
          "applyUrl",
          "applyLink",
          "applyOpensNewTab",
          "applyHint",
          "terms",
          "overMax",
          "overMaxText"
        ],
        "properties": {
          "lender": {
            "type": "string",
            "description": "Lender display name.",
            "example": "Thrive Financial"
          },
          "product": {
            "type": "string",
            "description": "Product name.",
            "example": "Building Loan"
          },
          "eligible": {
            "type": "boolean",
            "description": "Whether this lender can offer these answers."
          },
          "comingSoon": {
            "type": "boolean",
            "description": "True when the program is announced but not yet open."
          },
          "reason": {
            "type": "string",
            "description": "Why not eligible, as a code — e.g. `credit_score`, `property_ownership`, `amount_below_minimum`, `state`. Null when eligible.",
            "example": "credit_score",
            "nullable": true
          },
          "reasonText": {
            "type": "string",
            "description": "Why not eligible, in customer-ready words. Null when eligible.",
            "example": "Requires a 680 credit score",
            "nullable": true
          },
          "applyUrl": {
            "type": "string",
            "description": "The lender's own application page (reference only).",
            "format": "uri"
          },
          "applyLink": {
            "type": "string",
            "description": "Apply link (counts the click anonymously, then redirects).",
            "format": "uri",
            "example": "https://payment-estimate-api.pages.dev/v1/stoltzfus/apply/thrive"
          },
          "applyOpensNewTab": {
            "type": "boolean",
            "description": "Open `applyLink` in a new tab when true."
          },
          "applyHint": {
            "$ref": "#/components/schemas/ApplyHint"
          },
          "terms": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LenderTerm"
            },
            "description": "This lender's own term rows, exactly as the estimator shows them. Empty when not eligible."
          },
          "overMax": {
            "type": "boolean",
            "description": "True when the price is over this lender's maximum (payments are for the maximum)."
          },
          "overMaxText": {
            "type": "string",
            "description": "Customer-ready note to show beside this lender's payments when `overMax` is true; otherwise null.",
            "example": "Over the $100,000 max — payments shown are for $100,000",
            "nullable": true
          }
        }
      },
      "Loans": {
        "type": "object",
        "description": "Loan payments (Upgrade and Thrive Financial).",
        "required": [
          "available",
          "defaultTermYears",
          "terms",
          "byLender",
          "message",
          "notice"
        ],
        "properties": {
          "available": {
            "type": "boolean",
            "description": "True when at least one loan term is offered."
          },
          "defaultTermYears": {
            "type": "integer",
            "description": "Term (years) to pre-select — the longest offered. Null when no loans.",
            "example": 20,
            "nullable": true
          },
          "terms": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LoanTerm"
            },
            "description": "ONE payment choice per term, shortest first. Use these for your payment choices. Empty when `available` is false."
          },
          "byLender": {
            "type": "object",
            "description": "Per-lender detail (eligibility, reasons, every term).",
            "required": [
              "upgrade",
              "thrive"
            ],
            "properties": {
              "upgrade": {
                "$ref": "#/components/schemas/LenderStatus"
              },
              "thrive": {
                "$ref": "#/components/schemas/LenderStatus"
              }
            }
          },
          "message": {
            "type": "string",
            "description": "Text to show instead of loan payments when `available` is false; null otherwise.",
            "example": "No loan options match these answers. Please call Stoltzfus Structures to talk through your options.",
            "nullable": true
          },
          "notice": {
            "type": "string",
            "description": "Note to show beside the loan payments (e.g. the price is over the maximum of the lender whose numbers are shown). Null when there is nothing to say.",
            "example": "Over the $200,000 max — payments shown are for $200,000",
            "nullable": true
          }
        }
      },
      "RentToOwnTerm": {
        "type": "object",
        "description": "One rent-to-own lease term (live SmartPay quote).",
        "required": [
          "months",
          "label",
          "monthlyPayment",
          "monthlyPaymentDisplay",
          "upfrontPayment",
          "upfrontPaymentDisplay",
          "securityDeposit",
          "customerReserveAccount",
          "deliveryFee",
          "taxIncluded"
        ],
        "properties": {
          "months": {
            "type": "integer",
            "description": "Lease term in months.",
            "example": 48
          },
          "label": {
            "type": "string",
            "description": "Term label.",
            "example": "48 months"
          },
          "monthlyPayment": {
            "type": "number",
            "description": "Monthly lease payment (USD), tax included.",
            "example": 742.88
          },
          "monthlyPaymentDisplay": {
            "type": "string",
            "description": "Monthly payment ready to show (to the cent). Never pair it with an APR or rate — it is a lease.",
            "example": "$742.88"
          },
          "upfrontPayment": {
            "type": "number",
            "description": "Amount due upfront (USD).",
            "example": 3364
          },
          "upfrontPaymentDisplay": {
            "type": "string",
            "description": "Upfront amount ready to show.",
            "example": "$3,364.00"
          },
          "securityDeposit": {
            "type": "number",
            "description": "Security-deposit part of the upfront amount (USD).",
            "example": 2621.12
          },
          "customerReserveAccount": {
            "type": "number",
            "description": "Customer reserve account amount (USD).",
            "example": 0
          },
          "deliveryFee": {
            "type": "number",
            "description": "Delivery fee (USD).",
            "example": 0
          },
          "taxIncluded": {
            "type": "boolean",
            "description": "True when sales tax (from the ZIP) is included in the payments."
          }
        }
      },
      "RentToOwn": {
        "type": "object",
        "description": "Rent-to-own (SmartPay). A lease, not a loan: never show an APR or interest rate for it.",
        "required": [
          "available",
          "eligible",
          "provider",
          "product",
          "creditCheck",
          "amount",
          "defaultTermMonths",
          "terms",
          "overMax",
          "overMaxText",
          "notes",
          "applyUrl",
          "applyLink",
          "applyOpensNewTab",
          "applyHint",
          "reason",
          "reasonText"
        ],
        "properties": {
          "available": {
            "type": "boolean",
            "description": "True when rent-to-own payments are shown (`terms` is filled)."
          },
          "eligible": {
            "type": "boolean",
            "description": "Whether these answers qualify for rent-to-own. Can be true while `available` is false (e.g. the live quote failed — the customer can still apply)."
          },
          "provider": {
            "type": "string",
            "description": "Provider name — show only at the Apply step.",
            "example": "SmartPay"
          },
          "product": {
            "type": "string",
            "description": "Product name.",
            "example": "Rent-to-Own"
          },
          "creditCheck": {
            "type": "boolean",
            "description": "False: rent-to-own uses no credit check."
          },
          "amount": {
            "type": "number",
            "description": "Amount (USD) the payments are for (capped at the rent-to-own maximum). Null when not eligible.",
            "example": 16820,
            "nullable": true
          },
          "defaultTermMonths": {
            "type": "integer",
            "description": "Term (months) to pre-select. Null when unavailable.",
            "example": 48,
            "nullable": true
          },
          "terms": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RentToOwnTerm"
            },
            "description": "Lease terms. Empty when `available` is false."
          },
          "overMax": {
            "type": "boolean",
            "description": "True when the price is over the rent-to-own maximum."
          },
          "overMaxText": {
            "type": "string",
            "description": "Customer-ready note to show beside the rent-to-own payments when `overMax` is true; otherwise null.",
            "example": "You entered $300,000. The most you can finance with rent-to-own is $25,000 — payments shown are for $25,000.",
            "nullable": true
          },
          "notes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Notes to show with rent-to-own."
          },
          "applyUrl": {
            "type": "string",
            "description": "SmartPay's own application page (reference only).",
            "format": "uri"
          },
          "applyLink": {
            "type": "string",
            "description": "Apply link (counts the click anonymously, then redirects).",
            "format": "uri",
            "example": "https://payment-estimate-api.pages.dev/v1/stoltzfus/apply/rto"
          },
          "applyOpensNewTab": {
            "type": "boolean",
            "description": "Open `applyLink` in a new tab when true."
          },
          "applyHint": {
            "$ref": "#/components/schemas/ApplyHint"
          },
          "reason": {
            "type": "string",
            "description": "Why unavailable, as a code — e.g. `state`, `zip_not_supported`, `amount_below_minimum`, `quote_unavailable`. Null when available.",
            "example": "state",
            "nullable": true
          },
          "reasonText": {
            "type": "string",
            "description": "Why unavailable, in customer-ready words. Null when available.",
            "example": "Not available in WI",
            "nullable": true
          },
          "quoteError": {
            "type": "string",
            "description": "Present only when the live rent-to-own quote failed (`reason` = `quote_unavailable`); short technical code, not for customers.",
            "example": "simulated"
          }
        }
      },
      "EstimateInput": {
        "type": "object",
        "description": "The inputs the estimate was calculated for.",
        "required": [
          "zip",
          "state",
          "price",
          "creditScore",
          "creditScoreLabel",
          "ownProperty",
          "ownPropertyLabel"
        ],
        "properties": {
          "zip": {
            "type": "string",
            "description": "ZIP as received (5 digits).",
            "example": "19310"
          },
          "state": {
            "type": "string",
            "description": "Two-letter state for the ZIP, or null when the ZIP is not in one of the 50 states or DC (e.g. Puerto Rico).",
            "example": "PA",
            "nullable": true
          },
          "price": {
            "type": "number",
            "description": "Price as received (USD).",
            "example": 16820
          },
          "creditScore": {
            "type": "string",
            "description": "Credit-score value as received.",
            "example": "720"
          },
          "creditScoreLabel": {
            "type": "string",
            "description": "Its label.",
            "example": "720 – 799"
          },
          "ownProperty": {
            "type": "string",
            "description": "Ownership value as received.",
            "example": "own"
          },
          "ownPropertyLabel": {
            "type": "string",
            "description": "Its label.",
            "example": "Yes, I own the property"
          }
        }
      },
      "EstimateResponse": {
        "type": "object",
        "description": "Loan and rent-to-own payments for one structure, with Apply links and disclosures.",
        "required": [
          "ok",
          "apiVersion",
          "brand",
          "rulesFrom",
          "input",
          "loans",
          "rentToOwn",
          "disclosures",
          "displayRules"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "description": "Always `true` on a successful response.",
            "enum": [
              true
            ]
          },
          "apiVersion": {
            "type": "string",
            "description": "API version (a date).",
            "example": "2026-10-13"
          },
          "brand": {
            "type": "string",
            "description": "Brand slug.",
            "example": "stoltzfus"
          },
          "rulesFrom": {
            "$ref": "#/components/schemas/RulesFrom"
          },
          "input": {
            "$ref": "#/components/schemas/EstimateInput"
          },
          "loans": {
            "$ref": "#/components/schemas/Loans"
          },
          "rentToOwn": {
            "$ref": "#/components/schemas/RentToOwn"
          },
          "disclosures": {
            "$ref": "#/components/schemas/Disclosures"
          },
          "displayRules": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The display rules, in plain English. Please follow them."
          },
          "simulated": {
            "type": "string",
            "description": "Echo of the `simulate` value, present only when one was sent (testing only).",
            "example": "rto_unavailable"
          }
        }
      },
      "Simulate": {
        "type": "string",
        "description": "Testing only — makes the API return a canned outcome so you can test your error handling. Simulated calls are not counted in usage statistics and carry an `X-Simulated` response header. Never send in production.\n\n| value | result |\n|---|---|\n| `unavailable` | 503 `estimates_unavailable` |\n| `invalid` | 400 `invalid_input` with sample `fields` |\n| `origin_blocked` | 403 `origin_not_allowed` |\n| `rto_unavailable` | 200 normal body with `rentToOwn.available=false`, `eligible=true`, `reason=quote_unavailable` |\n| `slow` | 200 normal body after about 4 seconds |",
        "enum": [
          "unavailable",
          "invalid",
          "origin_blocked",
          "rto_unavailable",
          "slow"
        ]
      },
      "EstimateRequest": {
        "type": "object",
        "description": "Estimate inputs.",
        "required": [
          "zip",
          "price",
          "creditScore",
          "ownProperty"
        ],
        "properties": {
          "zip": {
            "type": "string",
            "description": "Delivery ZIP, 5 digits as a string (keeps leading zeros). Sets sales tax and rent-to-own state availability. ZIPs starting 000–004 are rejected (400).",
            "pattern": "^[0-9]{5}$",
            "example": "19310"
          },
          "price": {
            "type": "number",
            "description": "Total price of the structure with options, in US dollars. Must be greater than 0.",
            "exclusiveMinimum": true,
            "minimum": 0,
            "example": 16820
          },
          "creditScore": {
            "type": "string",
            "description": "One of `questions.creditScore.options[].value` from /options (currently `840`, `820`, `800`, `720`, `680`, `640`, `600`, `550`, `500`). Read the list from /options rather than hard-coding it.",
            "example": "720"
          },
          "ownProperty": {
            "type": "string",
            "description": "One of `questions.ownProperty.options[].value` from /options (currently `own`, `biz`, `no`).",
            "example": "own"
          },
          "simulate": {
            "$ref": "#/components/schemas/Simulate"
          }
        }
      },
      "BrandsResponse": {
        "type": "object",
        "description": "Live brands.",
        "required": [
          "ok",
          "brands"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "description": "Always `true` on a successful response.",
            "enum": [
              true
            ]
          },
          "brands": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "brand",
                "name"
              ],
              "properties": {
                "brand": {
                  "type": "string",
                  "description": "Brand slug to use in URLs.",
                  "example": "stoltzfus"
                },
                "name": {
                  "type": "string",
                  "description": "Brand display name.",
                  "example": "Stoltzfus Structures"
                }
              }
            },
            "description": "Brands that are live."
          }
        }
      },
      "HealthResponse": {
        "type": "object",
        "description": "Health of the mirrored estimator rules.",
        "required": [
          "ok",
          "brand",
          "estimator",
          "rulesSource",
          "estimatorVersion",
          "parseError",
          "fingerprintMismatch",
          "snippetMissing",
          "fingerprintsNow",
          "disclosureParagraphsSynced",
          "smartpayLinkConfigured",
          "checkedAt"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "description": "True (HTTP 200) when estimates are being served; false (HTTP 503) when the API has switched itself off."
          },
          "brand": {
            "type": "string",
            "example": "stoltzfus"
          },
          "estimator": {
            "type": "string",
            "description": "The estimator page the rules are read from.",
            "format": "uri"
          },
          "rulesSource": {
            "type": "string",
            "description": "How the rules were obtained for this check, e.g. `live` or `cache`.",
            "example": "live"
          },
          "estimatorVersion": {
            "type": "string",
            "description": "Short hash of the estimator version.",
            "example": "e29cbbafc3fb90f1"
          },
          "parseError": {
            "type": "string",
            "description": "Why the estimator page could not be read, or null.",
            "nullable": true
          },
          "fingerprintMismatch": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Names of estimator calculation functions whose code changed since it was last confirmed. Non-empty = the API fails closed (503)."
          },
          "snippetMissing": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Names of expected estimator code snippets that could not be found."
          },
          "fingerprintsNow": {
            "type": "object",
            "description": "Current hash of each watched estimator calculation function (name → hash).",
            "additionalProperties": {
              "type": "string"
            },
            "example": {
              "pay": "48db92f5147c5380",
              "tier": "3eda939996b47628",
              "thriveTermsFor": "d3275ce5fc250fea",
              "eligible": "64bc74907c08f3de"
            }
          },
          "disclosureParagraphsSynced": {
            "type": "integer",
            "description": "How many disclosure paragraphs were read from the estimator.",
            "example": 16
          },
          "smartpayLinkConfigured": {
            "type": "boolean",
            "description": "True when the SmartPay apply link is configured."
          },
          "checkedAt": {
            "type": "string",
            "description": "When this check ran (UTC).",
            "format": "date-time"
          }
        }
      },
      "RulesLender": {
        "type": "object",
        "description": "A lender's limits as mirrored from the estimator.",
        "required": [
          "lender",
          "product",
          "minCreditScore",
          "minAmount",
          "maxAmount",
          "requiresPropertyOwnership",
          "notOfferedInStates",
          "comingSoon",
          "applyUrl",
          "applyHint"
        ],
        "properties": {
          "lender": {
            "type": "string",
            "example": "Upgrade"
          },
          "product": {
            "type": "string",
            "example": "Consumer Financing"
          },
          "minCreditScore": {
            "type": "integer",
            "example": 680
          },
          "minAmount": {
            "type": "number",
            "example": 2000
          },
          "maxAmount": {
            "type": "number",
            "example": 100000
          },
          "requiresPropertyOwnership": {
            "type": "boolean"
          },
          "notOfferedInStates": {
            "type": "array",
            "items": {
              "type": "string",
              "pattern": "^[A-Z]{2}$"
            }
          },
          "comingSoon": {
            "type": "boolean"
          },
          "applyUrl": {
            "type": "string",
            "format": "uri"
          },
          "applyHint": {
            "type": "string",
            "description": "Apply-button small print (plain text)."
          }
        }
      },
      "RulesDisclosure": {
        "description": "One mirrored disclosure: either a heading or a block of paragraphs.",
        "oneOf": [
          {
            "type": "object",
            "description": "A heading.",
            "required": [
              "heading"
            ],
            "properties": {
              "heading": {
                "type": "string",
                "example": "Important Disclosures"
              }
            }
          },
          {
            "type": "object",
            "description": "A block of paragraphs.",
            "required": [
              "id",
              "title",
              "text"
            ],
            "properties": {
              "id": {
                "type": "string",
                "example": "disc-credit",
                "nullable": true
              },
              "title": {
                "type": "string",
                "nullable": true
              },
              "text": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Paragraph texts."
              }
            }
          }
        ]
      },
      "RulesSnapshot": {
        "type": "object",
        "description": "Normalized snapshot of the rules mirrored from the estimator.",
        "required": [
          "lenders",
          "upgradeTerms",
          "thriveTerms",
          "thriveCounterOffer",
          "interestOnlyMonths",
          "creditScoreOptions",
          "ownPropertyOptions",
          "helpText",
          "rentToOwnStructureNote",
          "disclosures"
        ],
        "properties": {
          "lenders": {
            "type": "object",
            "required": [
              "upgrade",
              "thrive",
              "rto"
            ],
            "properties": {
              "upgrade": {
                "$ref": "#/components/schemas/RulesLender"
              },
              "thrive": {
                "$ref": "#/components/schemas/RulesLender"
              },
              "rto": {
                "$ref": "#/components/schemas/RulesLender"
              }
            }
          },
          "upgradeTerms": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "years",
                "months",
                "apr"
              ],
              "properties": {
                "years": {
                  "type": "integer"
                },
                "months": {
                  "type": "integer"
                },
                "apr": {
                  "type": "number"
                }
              }
            },
            "description": "Upgrade terms and APRs."
          },
          "thriveTerms": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "years",
                "months",
                "scoreTiers",
                "counterOfferBelow680"
              ],
              "properties": {
                "years": {
                  "type": "integer"
                },
                "months": {
                  "type": "integer"
                },
                "scoreTiers": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "minScore",
                      "apr"
                    ],
                    "properties": {
                      "minScore": {
                        "type": "integer"
                      },
                      "apr": {
                        "type": "number"
                      }
                    }
                  },
                  "description": "APR by minimum credit score, highest score first."
                },
                "counterOfferBelow680": {
                  "type": "boolean",
                  "description": "True when credit scores below 680 get a counter-offer term instead."
                }
              }
            },
            "description": "Thrive terms and APR tiers."
          },
          "thriveCounterOffer": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "minScore",
                "apr"
              ],
              "properties": {
                "minScore": {
                  "type": "integer"
                },
                "apr": {
                  "type": "number"
                }
              }
            },
            "description": "Thrive counter-offer APR tiers."
          },
          "interestOnlyMonths": {
            "type": "integer",
            "description": "Thrive interest-only months.",
            "example": 6
          },
          "creditScoreOptions": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "`value=label` pairs.",
            "example": [
              "840=840 – 850"
            ]
          },
          "ownPropertyOptions": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "`value=label` pairs.",
            "example": [
              "own=Yes, I own the property"
            ]
          },
          "helpText": {
            "type": "object",
            "required": [
              "creditScore",
              "ownProperty"
            ],
            "properties": {
              "creditScore": {
                "type": "string"
              },
              "ownProperty": {
                "type": "string"
              }
            }
          },
          "rentToOwnStructureNote": {
            "type": "string"
          },
          "disclosures": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RulesDisclosure"
            }
          }
        }
      },
      "RulesResponse": {
        "type": "object",
        "description": "Normalized snapshot of the mirrored estimator rules (for diagnostics).",
        "required": [
          "ok",
          "brand",
          "estimator",
          "estimatorVersion",
          "parseError",
          "fingerprintMismatch",
          "snippetMissing",
          "snapshot",
          "checkedAt"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "description": "True (HTTP 200) when the rules are in use; false (HTTP 503) when the API has switched itself off."
          },
          "brand": {
            "type": "string",
            "example": "stoltzfus"
          },
          "estimator": {
            "type": "string",
            "format": "uri"
          },
          "estimatorVersion": {
            "type": "string"
          },
          "parseError": {
            "type": "string",
            "nullable": true
          },
          "fingerprintMismatch": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "snippetMissing": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "snapshot": {
            "$ref": "#/components/schemas/RulesSnapshot"
          },
          "checkedAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "ErrorInvalidInput": {
        "type": "object",
        "description": "HTTP 400. One or more inputs are invalid. The messages in `fields` are written for customers — show each next to its input.",
        "required": [
          "ok",
          "error",
          "fields"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "description": "Always `false` on an error response.",
            "enum": [
              false
            ]
          },
          "error": {
            "type": "string",
            "description": "Error code.",
            "enum": [
              "invalid_input"
            ]
          },
          "fields": {
            "type": "object",
            "description": "Message per invalid input (only the invalid ones are present).",
            "properties": {
              "zip": {
                "type": "string",
                "example": "Enter a valid 5-digit US ZIP code"
              },
              "price": {
                "type": "string",
                "example": "Enter the total price as a number, e.g. 18500"
              },
              "creditScore": {
                "type": "string",
                "example": "Must be one of: 840, 820, 800, 720, 680, 640, 600, 550, 500"
              },
              "ownProperty": {
                "type": "string",
                "example": "Must be one of: own, biz, no"
              }
            },
            "minProperties": 1
          },
          "simulated": {
            "type": "string",
            "description": "Present only when the error was produced by `simulate`.",
            "example": "invalid"
          }
        }
      },
      "ErrorInvalidJson": {
        "type": "object",
        "description": "HTTP 400. The POST body is not valid JSON.",
        "required": [
          "ok",
          "error"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "description": "Always `false` on an error response.",
            "enum": [
              false
            ]
          },
          "error": {
            "type": "string",
            "description": "Error code.",
            "enum": [
              "invalid_json"
            ]
          }
        }
      },
      "ErrorOriginNotAllowed": {
        "type": "object",
        "description": "HTTP 403. The browser `Origin` is not on the allow-list (`https://*.mysheds.com`, `http://localhost:*`, the API's own site). No CORS header is sent, so in a browser this usually surfaces as a network/CORS error rather than a readable body.",
        "required": [
          "ok",
          "error",
          "message"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "description": "Always `false` on an error response.",
            "enum": [
              false
            ]
          },
          "error": {
            "type": "string",
            "description": "Error code.",
            "enum": [
              "origin_not_allowed"
            ]
          },
          "message": {
            "type": "string",
            "example": "This website is not allowed to call this API. Contact Tim Brazil to be added."
          },
          "simulated": {
            "type": "string",
            "description": "Present only when the error was produced by `simulate`.",
            "example": "invalid"
          }
        }
      },
      "ErrorBrandNotEnabled": {
        "type": "object",
        "description": "HTTP 404. The brand in the URL is not live yet.",
        "required": [
          "ok",
          "error",
          "liveBrands"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "description": "Always `false` on an error response.",
            "enum": [
              false
            ]
          },
          "error": {
            "type": "string",
            "description": "Error code.",
            "enum": [
              "brand_not_enabled"
            ]
          },
          "liveBrands": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Brands that are live.",
            "example": [
              "stoltzfus"
            ]
          }
        }
      },
      "ErrorNotFound": {
        "type": "object",
        "description": "HTTP 404. Unknown route under a live brand.",
        "required": [
          "ok",
          "error",
          "routes"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "description": "Always `false` on an error response.",
            "enum": [
              false
            ]
          },
          "error": {
            "type": "string",
            "description": "Error code.",
            "enum": [
              "not_found"
            ]
          },
          "routes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The routes that exist."
          }
        }
      },
      "ErrorUnknownProduct": {
        "type": "object",
        "description": "HTTP 404 from /apply/{product}. The product is not one of the known ones.",
        "required": [
          "ok",
          "error",
          "products"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "description": "Always `false` on an error response.",
            "enum": [
              false
            ]
          },
          "error": {
            "type": "string",
            "description": "Error code.",
            "enum": [
              "unknown_product"
            ]
          },
          "products": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Known products.",
            "example": [
              "upgrade",
              "thrive",
              "rto"
            ]
          }
        }
      },
      "ErrorMethodNotAllowed": {
        "type": "object",
        "description": "HTTP 405. The HTTP method is not supported on this route (e.g. POST /options, DELETE /estimate).",
        "required": [
          "ok",
          "error"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "description": "Always `false` on an error response.",
            "enum": [
              false
            ]
          },
          "error": {
            "type": "string",
            "description": "Error code.",
            "enum": [
              "method_not_allowed"
            ]
          }
        }
      },
      "ErrorEstimatesUnavailable": {
        "type": "object",
        "description": "HTTP 503. Estimates are switched off (the estimator's calculation logic changed and has not been confirmed yet, or rules could not be read). Hide the payment section or show a short neutral note.",
        "required": [
          "ok",
          "error",
          "message"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "description": "Always `false` on an error response.",
            "enum": [
              false
            ]
          },
          "error": {
            "type": "string",
            "description": "Error code.",
            "enum": [
              "estimates_unavailable"
            ]
          },
          "message": {
            "type": "string",
            "example": "Payment estimates are temporarily unavailable. Please try again later."
          },
          "simulated": {
            "type": "string",
            "description": "Present only when the error was produced by `simulate`.",
            "example": "invalid"
          }
        }
      },
      "ErrorServerError": {
        "type": "object",
        "description": "HTTP 500. Unexpected server error. Treat like 503.",
        "required": [
          "ok",
          "error"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "description": "Always `false` on an error response.",
            "enum": [
              false
            ]
          },
          "error": {
            "type": "string",
            "description": "Error code.",
            "enum": [
              "server_error"
            ]
          },
          "message": {
            "type": "string",
            "description": "Optional human-readable detail."
          }
        }
      },
      "ApiErrorCode": {
        "type": "string",
        "description": "Every error code the API returns.",
        "enum": [
          "invalid_input",
          "invalid_json",
          "origin_not_allowed",
          "brand_not_enabled",
          "not_found",
          "unknown_product",
          "method_not_allowed",
          "estimates_unavailable",
          "server_error"
        ]
      }
    },
    "parameters": {
      "Brand": {
        "name": "brand",
        "in": "path",
        "required": true,
        "description": "Brand slug. Only `stoltzfus` is live; other brands return 404 `brand_not_enabled`. See GET /v1/brands.",
        "schema": {
          "type": "string",
          "example": "stoltzfus"
        }
      },
      "Zip": {
        "name": "zip",
        "in": "query",
        "required": true,
        "description": "Delivery ZIP, 5 digits as a string (keeps leading zeros). Sets sales tax and rent-to-own state availability. ZIPs starting 000–004 are rejected (400).",
        "schema": {
          "type": "string",
          "pattern": "^[0-9]{5}$"
        },
        "example": "19310"
      },
      "Price": {
        "name": "price",
        "in": "query",
        "required": true,
        "description": "Total price of the structure with options, in US dollars. Must be greater than 0.",
        "schema": {
          "type": "number",
          "minimum": 0,
          "exclusiveMinimum": true
        },
        "example": 16820
      },
      "CreditScore": {
        "name": "creditScore",
        "in": "query",
        "required": true,
        "description": "One of `questions.creditScore.options[].value` from /options (currently `840`, `820`, `800`, `720`, `680`, `640`, `600`, `550`, `500`). Read the list from /options rather than hard-coding it.",
        "schema": {
          "type": "string"
        },
        "example": "720"
      },
      "OwnProperty": {
        "name": "ownProperty",
        "in": "query",
        "required": true,
        "description": "One of `questions.ownProperty.options[].value` from /options (currently `own`, `biz`, `no`).",
        "schema": {
          "type": "string"
        },
        "example": "own"
      },
      "Simulate": {
        "name": "simulate",
        "in": "query",
        "required": false,
        "description": "Testing only. See the `Simulate` schema for what each value returns.",
        "schema": {
          "$ref": "#/components/schemas/Simulate"
        }
      }
    },
    "responses": {
      "OriginNotAllowed": {
        "description": "Browser Origin not allowed (or `simulate=origin_blocked`).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorOriginNotAllowed"
            },
            "examples": {
              "real": {
                "$ref": "#/components/examples/EvilOrigin"
              },
              "simulated": {
                "$ref": "#/components/examples/SimOrigin"
              }
            }
          }
        },
        "headers": {
          "X-Simulated": {
            "$ref": "#/components/headers/X-Simulated"
          },
          "Vary": {
            "$ref": "#/components/headers/Vary"
          }
        }
      },
      "BrandNotEnabled": {
        "description": "Brand not live yet.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorBrandNotEnabled"
            },
            "examples": {
              "horizon": {
                "$ref": "#/components/examples/HorizonOptions"
              }
            }
          }
        }
      },
      "ServerError": {
        "description": "Unexpected server error (not observed live).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorServerError"
            }
          }
        }
      },
      "EstimatesUnavailable": {
        "description": "Estimates switched off (fails closed), or `simulate=unavailable`.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEstimatesUnavailable"
            },
            "examples": {
              "simulated": {
                "$ref": "#/components/examples/SimUnavail"
              }
            }
          }
        },
        "headers": {
          "Cache-Control": {
            "$ref": "#/components/headers/Cache-Control"
          },
          "Access-Control-Allow-Origin": {
            "$ref": "#/components/headers/Access-Control-Allow-Origin"
          },
          "X-Simulated": {
            "$ref": "#/components/headers/X-Simulated"
          }
        }
      }
    },
    "examples": {
      "EvilOrigin": {
        "value": {
          "ok": false,
          "error": "origin_not_allowed",
          "message": "This website is not allowed to call this API. Contact Tim Brazil to be added."
        },
        "summary": "Origin: https://evil.example"
      },
      "SimOrigin": {
        "value": {
          "ok": false,
          "error": "origin_not_allowed",
          "message": "This website is not allowed to call this API. Contact Tim Brazil to be added.",
          "simulated": "origin_blocked"
        },
        "summary": "simulate=origin_blocked"
      },
      "HorizonOptions": {
        "value": {
          "ok": false,
          "error": "brand_not_enabled",
          "liveBrands": [
            "stoltzfus"
          ]
        },
        "summary": "GET /v1/horizon/options"
      },
      "SimUnavail": {
        "value": {
          "ok": false,
          "error": "estimates_unavailable",
          "message": "Payment estimates are temporarily unavailable. Please try again later.",
          "simulated": "unavailable"
        },
        "summary": "simulate=unavailable"
      },
      "EstBase": {
        "value": {
          "ok": true,
          "apiVersion": "2026-10-13",
          "brand": "stoltzfus",
          "rulesFrom": {
            "estimator": "https://shedlender.com/estimator.html",
            "estimatorVersion": "e29cbbafc3fb90f1",
            "readAt": "2026-10-13T15:00:00.072Z",
            "source": "cache"
          },
          "input": {
            "zip": "19310",
            "state": "PA",
            "price": 16820,
            "creditScore": "720",
            "creditScoreLabel": "720 – 799",
            "ownProperty": "own",
            "ownPropertyLabel": "Yes, I own the property"
          },
          "loans": {
            "available": true,
            "defaultTermYears": 20,
            "terms": [
              {
                "lender": "thrive",
                "years": 5,
                "months": 60,
                "label": "5-Year",
                "estimatorLabel": "5-Year Term",
                "counterOffer": false,
                "amount": 16820,
                "apr": 7.99,
                "aprDisplay": "7.99% APR*",
                "monthlyPayment": 371.85,
                "monthlyPaymentDisplay": "$372",
                "interestOnly": true,
                "interestOnlyMonths": 6,
                "footnote": "†",
                "interestOnlyPayments": {
                  "halfReleased": 56,
                  "halfReleasedDisplay": "$56/mo",
                  "fullReleased": 111.99,
                  "fullReleasedDisplay": "$112/mo"
                },
                "paymentNote": "Months 1–6 are interest-only; the amount shown is your full monthly payment (principal + interest) beginning in month 7.",
                "bestLender": "thrive",
                "offers": [
                  {
                    "lender": "thrive",
                    "lenderName": "Thrive Financial",
                    "product": "Building Loan",
                    "applyUrl": "https://shedlender.com/thrive-prequal.html",
                    "applyLink": "https://payment-estimate-api.pages.dev/v1/stoltzfus/apply/thrive?term=60",
                    "applyOpensNewTab": false,
                    "applyHint": {
                      "text": "Soft credit check to see if you pre-qualify — does not impact your credit score.¹",
                      "html": "Soft credit check to see if you pre-qualify — does not impact your credit score.<sup>1</sup>"
                    },
                    "years": 5,
                    "months": 60,
                    "label": "5-Year",
                    "estimatorLabel": "5-Year Term",
                    "counterOffer": false,
                    "amount": 16820,
                    "apr": 7.99,
                    "aprDisplay": "7.99% APR*",
                    "monthlyPayment": 371.85,
                    "monthlyPaymentDisplay": "$372",
                    "interestOnly": true,
                    "interestOnlyMonths": 6,
                    "footnote": "†",
                    "interestOnlyPayments": {
                      "halfReleased": 56,
                      "halfReleasedDisplay": "$56/mo",
                      "fullReleased": 111.99,
                      "fullReleasedDisplay": "$112/mo"
                    },
                    "paymentNote": "Months 1–6 are interest-only; the amount shown is your full monthly payment (principal + interest) beginning in month 7."
                  },
                  {
                    "lender": "upgrade",
                    "lenderName": "Upgrade",
                    "product": "Consumer Financing",
                    "applyUrl": "https://upgrade.com/h/RkVh79xDIQ",
                    "applyLink": "https://payment-estimate-api.pages.dev/v1/stoltzfus/apply/upgrade?term=60",
                    "applyOpensNewTab": true,
                    "applyHint": {
                      "text": "Soft credit check to see your offers — checking offers does not affect your credit score.¹",
                      "html": "Soft credit check to see your offers — checking offers does not affect your credit score.<sup>1</sup>"
                    },
                    "years": 5,
                    "months": 60,
                    "label": "5-Year",
                    "amount": 16820,
                    "apr": 8.99,
                    "aprDisplay": "8.99% APR*",
                    "monthlyPayment": 349.07,
                    "monthlyPaymentDisplay": "$349",
                    "interestOnly": false,
                    "footnote": "",
                    "paymentNote": "Fixed monthly principal & interest for the full term."
                  }
                ]
              },
              {
                "lender": "thrive",
                "years": 10,
                "months": 120,
                "label": "10-Year",
                "estimatorLabel": "10-Year Term",
                "counterOffer": false,
                "amount": 16820,
                "apr": 9.99,
                "aprDisplay": "9.99% APR*",
                "monthlyPayment": 229.04,
                "monthlyPaymentDisplay": "$229",
                "interestOnly": true,
                "interestOnlyMonths": 6,
                "footnote": "†",
                "interestOnlyPayments": {
                  "halfReleased": 70.01,
                  "halfReleasedDisplay": "$70/mo",
                  "fullReleased": 140.03,
                  "fullReleasedDisplay": "$140/mo"
                },
                "paymentNote": "Months 1–6 are interest-only; the amount shown is your full monthly payment (principal + interest) beginning in month 7.",
                "bestLender": "thrive",
                "offers": [
                  {
                    "lender": "thrive",
                    "lenderName": "Thrive Financial",
                    "product": "Building Loan",
                    "applyUrl": "https://shedlender.com/thrive-prequal.html",
                    "applyLink": "https://payment-estimate-api.pages.dev/v1/stoltzfus/apply/thrive?term=120",
                    "applyOpensNewTab": false,
                    "applyHint": {
                      "text": "Soft credit check to see if you pre-qualify — does not impact your credit score.¹",
                      "html": "Soft credit check to see if you pre-qualify — does not impact your credit score.<sup>1</sup>"
                    },
                    "years": 10,
                    "months": 120,
                    "label": "10-Year",
                    "estimatorLabel": "10-Year Term",
                    "counterOffer": false,
                    "amount": 16820,
                    "apr": 9.99,
                    "aprDisplay": "9.99% APR*",
                    "monthlyPayment": 229.04,
                    "monthlyPaymentDisplay": "$229",
                    "interestOnly": true,
                    "interestOnlyMonths": 6,
                    "footnote": "†",
                    "interestOnlyPayments": {
                      "halfReleased": 70.01,
                      "halfReleasedDisplay": "$70/mo",
                      "fullReleased": 140.03,
                      "fullReleasedDisplay": "$140/mo"
                    },
                    "paymentNote": "Months 1–6 are interest-only; the amount shown is your full monthly payment (principal + interest) beginning in month 7."
                  },
                  {
                    "lender": "upgrade",
                    "lenderName": "Upgrade",
                    "product": "Consumer Financing",
                    "applyUrl": "https://upgrade.com/h/RkVh79xDIQ",
                    "applyLink": "https://payment-estimate-api.pages.dev/v1/stoltzfus/apply/upgrade?term=120",
                    "applyOpensNewTab": true,
                    "applyHint": {
                      "text": "Soft credit check to see your offers — checking offers does not affect your credit score.¹",
                      "html": "Soft credit check to see your offers — checking offers does not affect your credit score.<sup>1</sup>"
                    },
                    "years": 10,
                    "months": 120,
                    "label": "10-Year",
                    "amount": 16820,
                    "apr": 9.99,
                    "aprDisplay": "9.99% APR*",
                    "monthlyPayment": 222.18,
                    "monthlyPaymentDisplay": "$222",
                    "interestOnly": false,
                    "footnote": "",
                    "paymentNote": "Fixed monthly principal & interest for the full term."
                  }
                ]
              },
              {
                "lender": "thrive",
                "years": 15,
                "months": 180,
                "label": "15-Year",
                "estimatorLabel": "15-Year Term",
                "counterOffer": false,
                "amount": 16820,
                "apr": 9.99,
                "aprDisplay": "9.99% APR*",
                "monthlyPayment": 183.36,
                "monthlyPaymentDisplay": "$183",
                "interestOnly": true,
                "interestOnlyMonths": 6,
                "footnote": "†",
                "interestOnlyPayments": {
                  "halfReleased": 70.01,
                  "halfReleasedDisplay": "$70/mo",
                  "fullReleased": 140.03,
                  "fullReleasedDisplay": "$140/mo"
                },
                "paymentNote": "Months 1–6 are interest-only; the amount shown is your full monthly payment (principal + interest) beginning in month 7.",
                "bestLender": "thrive",
                "offers": [
                  {
                    "lender": "thrive",
                    "lenderName": "Thrive Financial",
                    "product": "Building Loan",
                    "applyUrl": "https://shedlender.com/thrive-prequal.html",
                    "applyLink": "https://payment-estimate-api.pages.dev/v1/stoltzfus/apply/thrive?term=180",
                    "applyOpensNewTab": false,
                    "applyHint": {
                      "text": "Soft credit check to see if you pre-qualify — does not impact your credit score.¹",
                      "html": "Soft credit check to see if you pre-qualify — does not impact your credit score.<sup>1</sup>"
                    },
                    "years": 15,
                    "months": 180,
                    "label": "15-Year",
                    "estimatorLabel": "15-Year Term",
                    "counterOffer": false,
                    "amount": 16820,
                    "apr": 9.99,
                    "aprDisplay": "9.99% APR*",
                    "monthlyPayment": 183.36,
                    "monthlyPaymentDisplay": "$183",
                    "interestOnly": true,
                    "interestOnlyMonths": 6,
                    "footnote": "†",
                    "interestOnlyPayments": {
                      "halfReleased": 70.01,
                      "halfReleasedDisplay": "$70/mo",
                      "fullReleased": 140.03,
                      "fullReleasedDisplay": "$140/mo"
                    },
                    "paymentNote": "Months 1–6 are interest-only; the amount shown is your full monthly payment (principal + interest) beginning in month 7."
                  },
                  {
                    "lender": "upgrade",
                    "lenderName": "Upgrade",
                    "product": "Consumer Financing",
                    "applyUrl": "https://upgrade.com/h/RkVh79xDIQ",
                    "applyLink": "https://payment-estimate-api.pages.dev/v1/stoltzfus/apply/upgrade?term=180",
                    "applyOpensNewTab": true,
                    "applyHint": {
                      "text": "Soft credit check to see your offers — checking offers does not affect your credit score.¹",
                      "html": "Soft credit check to see your offers — checking offers does not affect your credit score.<sup>1</sup>"
                    },
                    "years": 15,
                    "months": 180,
                    "label": "15-Year",
                    "amount": 16820,
                    "apr": 9.99,
                    "aprDisplay": "9.99% APR*",
                    "monthlyPayment": 180.65,
                    "monthlyPaymentDisplay": "$181",
                    "interestOnly": false,
                    "footnote": "",
                    "paymentNote": "Fixed monthly principal & interest for the full term."
                  }
                ]
              },
              {
                "lender": "thrive",
                "years": 20,
                "months": 240,
                "label": "20-Year",
                "estimatorLabel": "20-Year Term",
                "counterOffer": false,
                "amount": 16820,
                "apr": 9.99,
                "aprDisplay": "9.99% APR*",
                "monthlyPayment": 163.53,
                "monthlyPaymentDisplay": "$164",
                "interestOnly": true,
                "interestOnlyMonths": 6,
                "footnote": "†",
                "interestOnlyPayments": {
                  "halfReleased": 70.01,
                  "halfReleasedDisplay": "$70/mo",
                  "fullReleased": 140.03,
                  "fullReleasedDisplay": "$140/mo"
                },
                "paymentNote": "Months 1–6 are interest-only; the amount shown is your full monthly payment (principal + interest) beginning in month 7.",
                "bestLender": "thrive",
                "offers": [
                  {
                    "lender": "thrive",
                    "lenderName": "Thrive Financial",
                    "product": "Building Loan",
                    "applyUrl": "https://shedlender.com/thrive-prequal.html",
                    "applyLink": "https://payment-estimate-api.pages.dev/v1/stoltzfus/apply/thrive?term=240",
                    "applyOpensNewTab": false,
                    "applyHint": {
                      "text": "Soft credit check to see if you pre-qualify — does not impact your credit score.¹",
                      "html": "Soft credit check to see if you pre-qualify — does not impact your credit score.<sup>1</sup>"
                    },
                    "years": 20,
                    "months": 240,
                    "label": "20-Year",
                    "estimatorLabel": "20-Year Term",
                    "counterOffer": false,
                    "amount": 16820,
                    "apr": 9.99,
                    "aprDisplay": "9.99% APR*",
                    "monthlyPayment": 163.53,
                    "monthlyPaymentDisplay": "$164",
                    "interestOnly": true,
                    "interestOnlyMonths": 6,
                    "footnote": "†",
                    "interestOnlyPayments": {
                      "halfReleased": 70.01,
                      "halfReleasedDisplay": "$70/mo",
                      "fullReleased": 140.03,
                      "fullReleasedDisplay": "$140/mo"
                    },
                    "paymentNote": "Months 1–6 are interest-only; the amount shown is your full monthly payment (principal + interest) beginning in month 7."
                  }
                ]
              }
            ],
            "byLender": {
              "upgrade": {
                "lender": "Upgrade",
                "product": "Consumer Financing",
                "applyUrl": "https://upgrade.com/h/RkVh79xDIQ",
                "applyLink": "https://payment-estimate-api.pages.dev/v1/stoltzfus/apply/upgrade",
                "applyOpensNewTab": true,
                "applyHint": {
                  "text": "Soft credit check to see your offers — checking offers does not affect your credit score.¹",
                  "html": "Soft credit check to see your offers — checking offers does not affect your credit score.<sup>1</sup>"
                },
                "comingSoon": false,
                "eligible": true,
                "reason": null,
                "reasonText": null,
                "overMax": false,
                "overMaxText": null,
                "terms": [
                  {
                    "lender": "upgrade",
                    "years": 5,
                    "months": 60,
                    "label": "5-Year",
                    "amount": 16820,
                    "apr": 8.99,
                    "aprDisplay": "8.99% APR*",
                    "monthlyPayment": 349.07,
                    "monthlyPaymentDisplay": "$349",
                    "interestOnly": false,
                    "footnote": "",
                    "paymentNote": "Fixed monthly principal & interest for the full term."
                  },
                  {
                    "lender": "upgrade",
                    "years": 7,
                    "months": 84,
                    "label": "7-Year",
                    "amount": 16820,
                    "apr": 9.99,
                    "aprDisplay": "9.99% APR*",
                    "monthlyPayment": 279.15,
                    "monthlyPaymentDisplay": "$279",
                    "interestOnly": false,
                    "footnote": "",
                    "paymentNote": "Fixed monthly principal & interest for the full term."
                  },
                  {
                    "lender": "upgrade",
                    "years": 10,
                    "months": 120,
                    "label": "10-Year",
                    "amount": 16820,
                    "apr": 9.99,
                    "aprDisplay": "9.99% APR*",
                    "monthlyPayment": 222.18,
                    "monthlyPaymentDisplay": "$222",
                    "interestOnly": false,
                    "footnote": "",
                    "paymentNote": "Fixed monthly principal & interest for the full term."
                  },
                  {
                    "lender": "upgrade",
                    "years": 12,
                    "months": 144,
                    "label": "12-Year",
                    "amount": 16820,
                    "apr": 9.99,
                    "aprDisplay": "9.99% APR*",
                    "monthlyPayment": 200.92,
                    "monthlyPaymentDisplay": "$201",
                    "interestOnly": false,
                    "footnote": "",
                    "paymentNote": "Fixed monthly principal & interest for the full term."
                  },
                  {
                    "lender": "upgrade",
                    "years": 15,
                    "months": 180,
                    "label": "15-Year",
                    "amount": 16820,
                    "apr": 9.99,
                    "aprDisplay": "9.99% APR*",
                    "monthlyPayment": 180.65,
                    "monthlyPaymentDisplay": "$181",
                    "interestOnly": false,
                    "footnote": "",
                    "paymentNote": "Fixed monthly principal & interest for the full term."
                  }
                ]
              },
              "thrive": {
                "lender": "Thrive Financial",
                "product": "Building Loan",
                "applyUrl": "https://shedlender.com/thrive-prequal.html",
                "applyLink": "https://payment-estimate-api.pages.dev/v1/stoltzfus/apply/thrive",
                "applyOpensNewTab": false,
                "applyHint": {
                  "text": "Soft credit check to see if you pre-qualify — does not impact your credit score.¹",
                  "html": "Soft credit check to see if you pre-qualify — does not impact your credit score.<sup>1</sup>"
                },
                "comingSoon": false,
                "eligible": true,
                "reason": null,
                "reasonText": null,
                "overMax": false,
                "overMaxText": null,
                "terms": [
                  {
                    "lender": "thrive",
                    "years": 5,
                    "months": 60,
                    "label": "5-Year",
                    "estimatorLabel": "5-Year Term",
                    "counterOffer": false,
                    "amount": 16820,
                    "apr": 7.99,
                    "aprDisplay": "7.99% APR*",
                    "monthlyPayment": 371.85,
                    "monthlyPaymentDisplay": "$372",
                    "interestOnly": true,
                    "interestOnlyMonths": 6,
                    "footnote": "†",
                    "interestOnlyPayments": {
                      "halfReleased": 56,
                      "halfReleasedDisplay": "$56/mo",
                      "fullReleased": 111.99,
                      "fullReleasedDisplay": "$112/mo"
                    },
                    "paymentNote": "Months 1–6 are interest-only; the amount shown is your full monthly payment (principal + interest) beginning in month 7."
                  },
                  {
                    "lender": "thrive",
                    "years": 10,
                    "months": 120,
                    "label": "10-Year",
                    "estimatorLabel": "10-Year Term",
                    "counterOffer": false,
                    "amount": 16820,
                    "apr": 9.99,
                    "aprDisplay": "9.99% APR*",
                    "monthlyPayment": 229.04,
                    "monthlyPaymentDisplay": "$229",
                    "interestOnly": true,
                    "interestOnlyMonths": 6,
                    "footnote": "†",
                    "interestOnlyPayments": {
                      "halfReleased": 70.01,
                      "halfReleasedDisplay": "$70/mo",
                      "fullReleased": 140.03,
                      "fullReleasedDisplay": "$140/mo"
                    },
                    "paymentNote": "Months 1–6 are interest-only; the amount shown is your full monthly payment (principal + interest) beginning in month 7."
                  },
                  {
                    "lender": "thrive",
                    "years": 15,
                    "months": 180,
                    "label": "15-Year",
                    "estimatorLabel": "15-Year Term",
                    "counterOffer": false,
                    "amount": 16820,
                    "apr": 9.99,
                    "aprDisplay": "9.99% APR*",
                    "monthlyPayment": 183.36,
                    "monthlyPaymentDisplay": "$183",
                    "interestOnly": true,
                    "interestOnlyMonths": 6,
                    "footnote": "†",
                    "interestOnlyPayments": {
                      "halfReleased": 70.01,
                      "halfReleasedDisplay": "$70/mo",
                      "fullReleased": 140.03,
                      "fullReleasedDisplay": "$140/mo"
                    },
                    "paymentNote": "Months 1–6 are interest-only; the amount shown is your full monthly payment (principal + interest) beginning in month 7."
                  },
                  {
                    "lender": "thrive",
                    "years": 20,
                    "months": 240,
                    "label": "20-Year",
                    "estimatorLabel": "20-Year Term",
                    "counterOffer": false,
                    "amount": 16820,
                    "apr": 9.99,
                    "aprDisplay": "9.99% APR*",
                    "monthlyPayment": 163.53,
                    "monthlyPaymentDisplay": "$164",
                    "interestOnly": true,
                    "interestOnlyMonths": 6,
                    "footnote": "†",
                    "interestOnlyPayments": {
                      "halfReleased": 70.01,
                      "halfReleasedDisplay": "$70/mo",
                      "fullReleased": 140.03,
                      "fullReleasedDisplay": "$140/mo"
                    },
                    "paymentNote": "Months 1–6 are interest-only; the amount shown is your full monthly payment (principal + interest) beginning in month 7."
                  }
                ]
              }
            },
            "notice": null,
            "message": null
          },
          "rentToOwn": {
            "available": true,
            "eligible": true,
            "provider": "SmartPay",
            "product": "Rent-to-Own",
            "creditCheck": false,
            "applyUrl": "https://www.smartpayrentals.com/app/StoltzfusStructures",
            "applyHint": {
              "text": "Approval is not guaranteed. Rent-to-own is a rental-purchase agreement, not a loan — see Important Disclosures.",
              "html": "Approval is not guaranteed. Rent-to-own is a rental-purchase agreement, not a loan — see Important Disclosures."
            },
            "notes": [
              "Structures that are 2 stories or permanently anchored to a foundation or concrete footings do not qualify for rent-to-own."
            ],
            "reason": null,
            "reasonText": null,
            "overMax": false,
            "overMaxText": null,
            "amount": 16820,
            "defaultTermMonths": 48,
            "terms": [
              {
                "months": 24,
                "label": "24 months",
                "monthlyPayment": 1048.77,
                "monthlyPaymentDisplay": "$1,048.77",
                "upfrontPayment": 3364,
                "upfrontPaymentDisplay": "$3,364.00",
                "securityDeposit": 2315.23,
                "customerReserveAccount": 0,
                "deliveryFee": 0,
                "taxIncluded": true
              },
              {
                "months": 36,
                "label": "36 months",
                "monthlyPayment": 821.63,
                "monthlyPaymentDisplay": "$821.63",
                "upfrontPayment": 3364,
                "upfrontPaymentDisplay": "$3,364.00",
                "securityDeposit": 2542.37,
                "customerReserveAccount": 0,
                "deliveryFee": 0,
                "taxIncluded": true
              },
              {
                "months": 48,
                "label": "48 months",
                "monthlyPayment": 742.88,
                "monthlyPaymentDisplay": "$742.88",
                "upfrontPayment": 3364,
                "upfrontPaymentDisplay": "$3,364.00",
                "securityDeposit": 2621.12,
                "customerReserveAccount": 0,
                "deliveryFee": 0,
                "taxIncluded": true
              }
            ],
            "applyLink": "https://payment-estimate-api.pages.dev/v1/stoltzfus/apply/rto",
            "applyOpensNewTab": true
          },
          "disclosures": {
            "source": "https://shedlender.com/estimator.html (footer, \"Important Disclosures\") — copied word-for-word, updates automatically",
            "forThisWidget": [
              {
                "type": "paragraph",
                "id": null,
                "title": null,
                "titleHtml": null,
                "paragraphs": [
                  {
                    "text": "Stoltzfus Structures is not a lender, broker, or financial institution. Financing is provided through third-party lending partners. Subject to credit approval. Subject to lender approval. Rates and terms subject to change. Financing is not guaranteed. Loan funds can only be used for your project with Stoltzfus Structures. Program summaries on this page are simplified — your agreement with the lender controls. Nothing on this page is financial, legal, or tax advice.",
                    "html": "Stoltzfus Structures is not a lender, broker, or financial institution. Financing is provided through third-party lending partners. Subject to credit approval. Subject to lender approval. Rates and terms subject to change. Financing is not guaranteed. Loan funds can only be used for your project with Stoltzfus Structures. Program summaries on this page are simplified — your agreement with the lender controls. Nothing on this page is financial, legal, or tax advice."
                  }
                ]
              },
              {
                "type": "paragraph",
                "id": "disc-credit",
                "title": null,
                "titleHtml": null,
                "paragraphs": [
                  {
                    "text": "¹ Payments and APRs shown are estimates for illustration purposes only and are not an offer of credit; actual rates, terms, and payments are determined by the lender. The lender will provide you with your eligible loan offers. Promotional offers are subject to credit approval and may change or end at any time. A soft credit inquiry used to see offers does not affect your credit score; a hard inquiry occurs only after you accept a loan offer and proceed with the loan application. Our lending partners are Equal Opportunity Lenders. Rent-to-Own (SmartPay) uses no credit check.",
                    "html": "<sup><strong>1</strong></sup> Payments and APRs shown are estimates for illustration purposes only and are not an offer of credit; actual rates, terms, and payments are determined by the lender. The lender will provide you with your eligible loan offers. Promotional offers are subject to credit approval and may change or end at any time. A soft credit inquiry used to see offers does not affect your credit score; a hard inquiry occurs only after you accept a loan offer and proceed with the loan application. Our lending partners are Equal Opportunity Lenders. Rent-to-Own (SmartPay) uses no credit check."
                  }
                ]
              },
              {
                "type": "paragraph",
                "id": null,
                "title": null,
                "titleHtml": null,
                "paragraphs": [
                  {
                    "text": "Rent-to-own is a rental-purchase (lease) agreement offered by SmartPay — not a loan or credit product, so no interest rate or APR applies. Home equity products are secured by your home and are offered by Figure Lending LLC, NMLS #1717824.",
                    "html": "Rent-to-own is a rental-purchase (lease) agreement offered by SmartPay — not a loan or credit product, so no interest rate or APR applies. Home equity products are secured by your home and are offered by Figure Lending LLC, NMLS #1717824."
                  }
                ]
              },
              {
                "type": "paragraph",
                "id": null,
                "title": null,
                "titleHtml": null,
                "paragraphs": [
                  {
                    "text": "Representative example: a $25,000 loan at 8.99% APR for 5 years (60 months) would result in 60 monthly payments of $518.84.",
                    "html": "<strong>Representative example:</strong> a $25,000 loan at 8.99% APR for 5 years (60 months) would result in 60 monthly payments of $518.84."
                  }
                ]
              },
              {
                "type": "heading",
                "text": "Important Disclosures"
              },
              {
                "type": "section",
                "id": "disc-payments",
                "title": "* Payment & APR Estimates",
                "titleHtml": "* Payment &amp; APR Estimates",
                "paragraphs": [
                  {
                    "text": "APRs marked with an asterisk (*) include a 0.50% autopay discount, which requires enrollment in automatic payments (Consumer Financing and Building Loan only); your APR is higher without autopay. Your actual rate and payment depend on your credit profile, loan amount, term, state, and lender approval — the lowest rates require excellent credit.",
                    "html": "APRs marked with an asterisk (*) include a 0.50% autopay discount, which requires enrollment in automatic payments (Consumer Financing and Building Loan only); your APR is higher without autopay. Your actual rate and payment depend on your credit profile, loan amount, term, state, and lender approval — the lowest rates require excellent credit."
                  },
                  {
                    "text": "Building Loan (Thrive Financial): months 1–6 are interest-only — interest accrues on 50% of the loan after the first release of funds and on the full loan after delivery; principal & interest payments begin in month 7 and amortize over the remaining term (term minus 6 months).",
                    "html": "<strong>Building Loan (Thrive Financial):</strong> months 1–6 are interest-only — interest accrues on 50% of the loan after the first release of funds and on the full loan after delivery; principal &amp; interest payments begin in month 7 and amortize over the remaining term (term minus 6 months)."
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-rto",
                "title": "Rent-to-Own (SmartPay)",
                "titleHtml": "Rent-to-Own (SmartPay)",
                "paragraphs": [
                  {
                    "text": "You do not own the structure until you have made all scheduled payments or exercised an early purchase option. The total of scheduled payments is higher than the cash price of the structure. A deposit or initial payment is required, and additional fees may apply — your agreement discloses the cash price, total of payments, and all fees before you sign. Rent-to-own is regulated under state rental-purchase laws and is not available in all states.",
                    "html": "You do not own the structure until you have made all scheduled payments or exercised an early purchase option. The total of scheduled payments is <strong>higher than the cash price</strong> of the structure. A deposit or initial payment is required, and additional fees may apply — your agreement discloses the cash price, total of payments, and all fees before you sign. Rent-to-own is regulated under state rental-purchase laws and is not available in all states."
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-ecoa",
                "title": "Equal Credit Opportunity",
                "titleHtml": "Equal Credit Opportunity",
                "paragraphs": [
                  {
                    "text": "The federal Equal Credit Opportunity Act prohibits creditors from discriminating against credit applicants on the basis of race, color, religion, national origin, sex, marital status, or age (provided the applicant has the capacity to enter into a binding contract); because all or part of the applicant’s income derives from any public assistance program; or because the applicant has in good faith exercised any right under the Consumer Credit Protection Act. Each lender will identify the federal agency that administers its compliance with this law.",
                    "html": "The federal Equal Credit Opportunity Act prohibits creditors from discriminating against credit applicants on the basis of race, color, religion, national origin, sex, marital status, or age (provided the applicant has the capacity to enter into a binding contract); because all or part of the applicant’s income derives from any public assistance program; or because the applicant has in good faith exercised any right under the Consumer Credit Protection Act. Each lender will identify the federal agency that administers its compliance with this law."
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-state",
                "title": "State Availability",
                "titleHtml": "State Availability",
                "paragraphs": [
                  {
                    "text": "Not every program is available in every state. This page checks availability based on the state you select — for example, the 6-month no-interest program is not offered to residents of certain states, and rent-to-own is not offered in Alaska, Hawaii, Minnesota, Mississippi, Washington, Wisconsin, or Wyoming. Availability is determined by each lender and may change.",
                    "html": "Not every program is available in every state. This page checks availability based on the state you select — for example, the 6-month no-interest program is not offered to residents of certain states, and rent-to-own is not offered in Alaska, Hawaii, Minnesota, Mississippi, Washington, Wisconsin, or Wyoming. Availability is determined by each lender and may change."
                  }
                ]
              }
            ],
            "all": [
              {
                "type": "paragraph",
                "id": null,
                "products": [],
                "paragraphs": [
                  {
                    "text": "Stoltzfus Structures is not a lender, broker, or financial institution. Financing is provided through third-party lending partners. Subject to credit approval. Subject to lender approval. Rates and terms subject to change. Financing is not guaranteed. Loan funds can only be used for your project with Stoltzfus Structures. Program summaries on this page are simplified — your agreement with the lender controls. Nothing on this page is financial, legal, or tax advice.",
                    "html": "Stoltzfus Structures is not a lender, broker, or financial institution. Financing is provided through third-party lending partners. Subject to credit approval. Subject to lender approval. Rates and terms subject to change. Financing is not guaranteed. Loan funds can only be used for your project with Stoltzfus Structures. Program summaries on this page are simplified — your agreement with the lender controls. Nothing on this page is financial, legal, or tax advice.",
                    "products": []
                  }
                ]
              },
              {
                "type": "paragraph",
                "id": "disc-credit",
                "products": [
                  "rto"
                ],
                "paragraphs": [
                  {
                    "text": "¹ Payments and APRs shown are estimates for illustration purposes only and are not an offer of credit; actual rates, terms, and payments are determined by the lender. The lender will provide you with your eligible loan offers. Promotional offers are subject to credit approval and may change or end at any time. A soft credit inquiry used to see offers does not affect your credit score; a hard inquiry occurs only after you accept a loan offer and proceed with the loan application. Our lending partners are Equal Opportunity Lenders. Rent-to-Own (SmartPay) uses no credit check.",
                    "html": "<sup><strong>1</strong></sup> Payments and APRs shown are estimates for illustration purposes only and are not an offer of credit; actual rates, terms, and payments are determined by the lender. The lender will provide you with your eligible loan offers. Promotional offers are subject to credit approval and may change or end at any time. A soft credit inquiry used to see offers does not affect your credit score; a hard inquiry occurs only after you accept a loan offer and proceed with the loan application. Our lending partners are Equal Opportunity Lenders. Rent-to-Own (SmartPay) uses no credit check.",
                    "products": [
                      "rto"
                    ]
                  }
                ]
              },
              {
                "type": "paragraph",
                "id": null,
                "products": [
                  "rto",
                  "figure"
                ],
                "paragraphs": [
                  {
                    "text": "Rent-to-own is a rental-purchase (lease) agreement offered by SmartPay — not a loan or credit product, so no interest rate or APR applies. Home equity products are secured by your home and are offered by Figure Lending LLC, NMLS #1717824.",
                    "html": "Rent-to-own is a rental-purchase (lease) agreement offered by SmartPay — not a loan or credit product, so no interest rate or APR applies. Home equity products are secured by your home and are offered by Figure Lending LLC, NMLS #1717824.",
                    "products": [
                      "rto",
                      "figure"
                    ]
                  }
                ]
              },
              {
                "type": "paragraph",
                "id": null,
                "products": [],
                "paragraphs": [
                  {
                    "text": "Representative example: a $25,000 loan at 8.99% APR for 5 years (60 months) would result in 60 monthly payments of $518.84.",
                    "html": "<strong>Representative example:</strong> a $25,000 loan at 8.99% APR for 5 years (60 months) would result in 60 monthly payments of $518.84.",
                    "products": []
                  }
                ]
              },
              {
                "type": "heading",
                "text": "Important Disclosures"
              },
              {
                "type": "section",
                "id": "disc-payments",
                "title": "* Payment & APR Estimates",
                "titleHtml": "* Payment &amp; APR Estimates",
                "products": [],
                "paragraphs": [
                  {
                    "text": "APRs marked with an asterisk (*) include a 0.50% autopay discount, which requires enrollment in automatic payments (Consumer Financing and Building Loan only); your APR is higher without autopay. Your actual rate and payment depend on your credit profile, loan amount, term, state, and lender approval — the lowest rates require excellent credit.",
                    "html": "APRs marked with an asterisk (*) include a 0.50% autopay discount, which requires enrollment in automatic payments (Consumer Financing and Building Loan only); your APR is higher without autopay. Your actual rate and payment depend on your credit profile, loan amount, term, state, and lender approval — the lowest rates require excellent credit.",
                    "products": [
                      "upgrade",
                      "thrive"
                    ]
                  },
                  {
                    "text": "Building Loan (Thrive Financial): months 1–6 are interest-only — interest accrues on 50% of the loan after the first release of funds and on the full loan after delivery; principal & interest payments begin in month 7 and amortize over the remaining term (term minus 6 months).",
                    "html": "<strong>Building Loan (Thrive Financial):</strong> months 1–6 are interest-only — interest accrues on 50% of the loan after the first release of funds and on the full loan after delivery; principal &amp; interest payments begin in month 7 and amortize over the remaining term (term minus 6 months).",
                    "products": [
                      "thrive"
                    ]
                  },
                  {
                    "text": "6 Months No Interest (Pure Finance): no interest and no minimum payments for the first 6 months. Any balance remaining when the promotional period ends automatically converts to a 10-year loan at 10.99% APR fixed. Pay the balance in full within 6 months and you pay no interest.",
                    "html": "<strong>6 Months No Interest (Pure Finance):</strong> no interest and no minimum payments for the first 6 months. Any balance remaining when the promotional period ends automatically converts to a 10-year loan at 10.99% APR fixed. Pay the balance in full within 6 months and you pay no interest.",
                    "products": [
                      "pure"
                    ]
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-rto",
                "title": "Rent-to-Own (SmartPay)",
                "titleHtml": "Rent-to-Own (SmartPay)",
                "products": [
                  "rto"
                ],
                "paragraphs": [
                  {
                    "text": "You do not own the structure until you have made all scheduled payments or exercised an early purchase option. The total of scheduled payments is higher than the cash price of the structure. A deposit or initial payment is required, and additional fees may apply — your agreement discloses the cash price, total of payments, and all fees before you sign. Rent-to-own is regulated under state rental-purchase laws and is not available in all states.",
                    "html": "You do not own the structure until you have made all scheduled payments or exercised an early purchase option. The total of scheduled payments is <strong>higher than the cash price</strong> of the structure. A deposit or initial payment is required, and additional fees may apply — your agreement discloses the cash price, total of payments, and all fees before you sign. Rent-to-own is regulated under state rental-purchase laws and is not available in all states.",
                    "products": [
                      "rto"
                    ]
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-figure",
                "title": "Home Equity (Figure Lending)",
                "titleHtml": "Home Equity (Figure Lending)",
                "products": [
                  "figure"
                ],
                "paragraphs": [
                  {
                    "text": "You could lose your home if you do not make payments. Loan amounts, rates, and terms are set by Figure after you apply and are approved; rates vary and are not guaranteed. Not available in all states.",
                    "html": "<strong>You could lose your home if you do not make payments.</strong> Loan amounts, rates, and terms are set by Figure after you apply and are approved; rates vary and are not guaranteed. Not available in all states.",
                    "products": [
                      "figure"
                    ]
                  },
                  {
                    "text": "⌂ Equal Housing Opportunity",
                    "html": "⌂ Equal Housing Opportunity",
                    "products": [
                      "figure"
                    ]
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-figure-funding",
                "title": "² Figure Lending — Funding Timeline",
                "titleHtml": "<sup><strong>2</strong></sup> Figure Lending — Funding Timeline",
                "products": [
                  "figure"
                ],
                "paragraphs": [
                  {
                    "text": "As soon as five to ten business day funding timeline assumes closing the loan with our remote online notary, and where loan amounts are under $400,000 which would not require an appraisal. Funding timelines may be longer for loans secured by properties located in counties that do not permit recording of e-signatures or that otherwise require an in-person closing, or that require a waiting period prior to closing, or where loan amounts exceed $400,000.",
                    "html": "As soon as five to ten business day funding timeline assumes closing the loan with our remote online notary, and where loan amounts are under $400,000 which would not require an appraisal. Funding timelines may be longer for loans secured by properties located in counties that do not permit recording of e-signatures or that otherwise require an in-person closing, or that require a waiting period prior to closing, or where loan amounts exceed $400,000.",
                    "products": [
                      "figure"
                    ]
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-figure-amount",
                "title": "³ Figure Lending — Loan Amount",
                "titleHtml": "<sup><strong>3</strong></sup> Figure Lending — Loan Amount",
                "products": [
                  "figure"
                ],
                "paragraphs": [
                  {
                    "text": "Our loan amounts range from a minimum of $15,000 to a maximum of $750,000. For properties located in AK, the minimum loan amount is $25,001 and for properties located in TX, the minimum loan amount is $35,000. Your maximum loan amount may be lower than $750,000, and will ultimately depend on your home value, lien position, credit profile, verified income amount, and equity available at the time of application. We determine home value and resulting equity through independent data sources and automated valuation models or appraisal. Loan amounts above $400,000 are subject to appraisal.",
                    "html": "Our loan amounts range from a minimum of $15,000 to a maximum of $750,000. For properties located in AK, the minimum loan amount is $25,001 and for properties located in TX, the minimum loan amount is $35,000. Your maximum loan amount may be lower than $750,000, and will ultimately depend on your home value, lien position, credit profile, verified income amount, and equity available at the time of application. We determine home value and resulting equity through independent data sources and automated valuation models or appraisal. Loan amounts above $400,000 are subject to appraisal.",
                    "products": [
                      "figure"
                    ]
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-ecoa",
                "title": "Equal Credit Opportunity",
                "titleHtml": "Equal Credit Opportunity",
                "products": [],
                "paragraphs": [
                  {
                    "text": "The federal Equal Credit Opportunity Act prohibits creditors from discriminating against credit applicants on the basis of race, color, religion, national origin, sex, marital status, or age (provided the applicant has the capacity to enter into a binding contract); because all or part of the applicant’s income derives from any public assistance program; or because the applicant has in good faith exercised any right under the Consumer Credit Protection Act. Each lender will identify the federal agency that administers its compliance with this law.",
                    "html": "The federal Equal Credit Opportunity Act prohibits creditors from discriminating against credit applicants on the basis of race, color, religion, national origin, sex, marital status, or age (provided the applicant has the capacity to enter into a binding contract); because all or part of the applicant’s income derives from any public assistance program; or because the applicant has in good faith exercised any right under the Consumer Credit Protection Act. Each lender will identify the federal agency that administers its compliance with this law.",
                    "products": []
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-state",
                "title": "State Availability",
                "titleHtml": "State Availability",
                "products": [],
                "paragraphs": [
                  {
                    "text": "Not every program is available in every state. This page checks availability based on the state you select — for example, the 6-month no-interest program is not offered to residents of certain states, and rent-to-own is not offered in Alaska, Hawaii, Minnesota, Mississippi, Washington, Wisconsin, or Wyoming. Availability is determined by each lender and may change.",
                    "html": "Not every program is available in every state. This page checks availability based on the state you select — for example, the 6-month no-interest program is not offered to residents of certain states, and rent-to-own is not offered in Alaska, Hawaii, Minnesota, Mississippi, Washington, Wisconsin, or Wyoming. Availability is determined by each lender and may change.",
                    "products": [
                      "pure",
                      "rto"
                    ]
                  }
                ]
              },
              {
                "type": "company",
                "id": null,
                "products": [],
                "paragraphs": [
                  {
                    "text": "Stoltzfus Structures — 5075 Lower Valley Rd. (Rte. 372), Atglen, PA 19310 • 3898 W Lincoln Hwy, Parkesburg, PA 19365",
                    "html": "Stoltzfus Structures — 5075 Lower Valley Rd. (Rte. 372), Atglen, PA 19310 &nbsp;•&nbsp; 3898 W Lincoln Hwy, Parkesburg, PA 19365",
                    "products": []
                  }
                ]
              },
              {
                "type": "company",
                "id": null,
                "products": [],
                "paragraphs": [
                  {
                    "text": "© 2026 Stoltzfus Structures. All rights reserved.",
                    "html": "© 2026 Stoltzfus Structures. All rights reserved.",
                    "products": []
                  }
                ]
              }
            ],
            "footnotes": [
              {
                "marker": "1",
                "display": "¹",
                "disclosureId": "disc-credit",
                "title": null,
                "appliesToThisWidget": true
              },
              {
                "marker": "*",
                "display": "*",
                "disclosureId": "disc-payments",
                "title": "* Payment & APR Estimates",
                "appliesToThisWidget": true
              },
              {
                "marker": "2",
                "display": "²",
                "disclosureId": "disc-figure-funding",
                "title": "² Figure Lending — Funding Timeline",
                "appliesToThisWidget": false
              },
              {
                "marker": "3",
                "display": "³",
                "disclosureId": "disc-figure-amount",
                "title": "³ Figure Lending — Loan Amount",
                "appliesToThisWidget": false
              },
              {
                "marker": "†",
                "display": "†",
                "disclosureId": "disc-payments",
                "title": "* Payment & APR Estimates",
                "appliesToThisWidget": true,
                "note": "Interest-only (Thrive Building Loan) terms — explained in the Building Loan paragraph of this section and in each term's paymentNote."
              }
            ],
            "notALender": "Stoltzfus Structures is not a lender, broker, or financial institution. Financing is provided through third-party lending partners. Subject to credit approval. Subject to lender approval. Rates and terms subject to change. Financing is not guaranteed. Loan funds can only be used for your project with Stoltzfus Structures. Program summaries on this page are simplified — your agreement with the lender controls. Nothing on this page is financial, legal, or tax advice.",
            "representativeExample": "Representative example: a $25,000 loan at 8.99% APR for 5 years (60 months) would result in 60 monthly payments of $518.84.",
            "rentToOwnStructures": "Structures that are 2 stories or permanently anchored to a foundation or concrete footings do not qualify for rent-to-own."
          },
          "displayRules": [
            "Always show a loan payment together with its APR and term (federal advertising rule: never a payment amount by itself).",
            "Keep the * on APRs and the † on interest-only (Thrive) terms, and put the matching disclosures on the page.",
            "Do not name the lender on the payment choices; name lender(s) only at the Apply step (loans.terms[].offers).",
            "Never show an APR or interest rate for rent-to-own — it is a lease, not a loan.",
            "Never call any of these products \"unsecured\".",
            "When a result carries overMaxText, show it next to those payments.",
            "Show every block in disclosures.forThisWidget on the page, in order — they are copied word-for-word from the estimator page and update automatically when it changes. Do not edit or retype them.",
            "Show each lender's applyHint (the small print under the estimator's Apply buttons) next to its Apply button.",
            "Point Apply buttons at applyLink (it counts the click, then forwards to the lender) and open it in a new tab when applyOpensNewTab is true.",
            "Do not call the API for custom-quote structures with no set price — show \"request a quote\" instead."
          ]
        },
        "summary": "zip=19310 price=16820 creditScore=720 ownProperty=own"
      },
      "Est500": {
        "value": {
          "ok": true,
          "apiVersion": "2026-10-13",
          "brand": "stoltzfus",
          "rulesFrom": {
            "estimator": "https://shedlender.com/estimator.html",
            "estimatorVersion": "e29cbbafc3fb90f1",
            "readAt": "2026-10-13T14:50:13.708Z",
            "source": "cache"
          },
          "input": {
            "zip": "19310",
            "state": "PA",
            "price": 16820,
            "creditScore": "500",
            "creditScoreLabel": "Below 550",
            "ownProperty": "own",
            "ownPropertyLabel": "Yes, I own the property"
          },
          "loans": {
            "available": false,
            "defaultTermYears": null,
            "terms": [],
            "byLender": {
              "upgrade": {
                "lender": "Upgrade",
                "product": "Consumer Financing",
                "applyUrl": "https://upgrade.com/h/RkVh79xDIQ",
                "applyLink": "https://payment-estimate-api.pages.dev/v1/stoltzfus/apply/upgrade",
                "applyOpensNewTab": true,
                "applyHint": {
                  "text": "Soft credit check to see your offers — checking offers does not affect your credit score.¹",
                  "html": "Soft credit check to see your offers — checking offers does not affect your credit score.<sup>1</sup>"
                },
                "comingSoon": false,
                "eligible": false,
                "reason": "credit_score",
                "reasonText": "Requires a 680 credit score",
                "overMax": false,
                "overMaxText": null,
                "terms": []
              },
              "thrive": {
                "lender": "Thrive Financial",
                "product": "Building Loan",
                "applyUrl": "https://shedlender.com/thrive-prequal.html",
                "applyLink": "https://payment-estimate-api.pages.dev/v1/stoltzfus/apply/thrive",
                "applyOpensNewTab": false,
                "applyHint": {
                  "text": "Soft credit check to see if you pre-qualify — does not impact your credit score.¹",
                  "html": "Soft credit check to see if you pre-qualify — does not impact your credit score.<sup>1</sup>"
                },
                "comingSoon": false,
                "eligible": false,
                "reason": "credit_score",
                "reasonText": "Requires a 550 credit score",
                "overMax": false,
                "overMaxText": null,
                "terms": []
              }
            },
            "notice": null,
            "message": "No loan options match these answers. Please call Stoltzfus Structures to talk through your options."
          },
          "rentToOwn": {
            "available": true,
            "eligible": true,
            "provider": "SmartPay",
            "product": "Rent-to-Own",
            "creditCheck": false,
            "applyUrl": "https://www.smartpayrentals.com/app/StoltzfusStructures",
            "applyHint": {
              "text": "Approval is not guaranteed. Rent-to-own is a rental-purchase agreement, not a loan — see Important Disclosures.",
              "html": "Approval is not guaranteed. Rent-to-own is a rental-purchase agreement, not a loan — see Important Disclosures."
            },
            "notes": [
              "Structures that are 2 stories or permanently anchored to a foundation or concrete footings do not qualify for rent-to-own."
            ],
            "reason": null,
            "reasonText": null,
            "overMax": false,
            "overMaxText": null,
            "amount": 16820,
            "defaultTermMonths": 48,
            "terms": [
              {
                "months": 24,
                "label": "24 months",
                "monthlyPayment": 1048.77,
                "monthlyPaymentDisplay": "$1,048.77",
                "upfrontPayment": 3364,
                "upfrontPaymentDisplay": "$3,364.00",
                "securityDeposit": 2315.23,
                "customerReserveAccount": 0,
                "deliveryFee": 0,
                "taxIncluded": true
              },
              {
                "months": 36,
                "label": "36 months",
                "monthlyPayment": 821.63,
                "monthlyPaymentDisplay": "$821.63",
                "upfrontPayment": 3364,
                "upfrontPaymentDisplay": "$3,364.00",
                "securityDeposit": 2542.37,
                "customerReserveAccount": 0,
                "deliveryFee": 0,
                "taxIncluded": true
              },
              {
                "months": 48,
                "label": "48 months",
                "monthlyPayment": 742.88,
                "monthlyPaymentDisplay": "$742.88",
                "upfrontPayment": 3364,
                "upfrontPaymentDisplay": "$3,364.00",
                "securityDeposit": 2621.12,
                "customerReserveAccount": 0,
                "deliveryFee": 0,
                "taxIncluded": true
              }
            ],
            "applyLink": "https://payment-estimate-api.pages.dev/v1/stoltzfus/apply/rto",
            "applyOpensNewTab": true
          },
          "disclosures": {
            "source": "https://shedlender.com/estimator.html (footer, \"Important Disclosures\") — copied word-for-word, updates automatically",
            "forThisWidget": [
              {
                "type": "paragraph",
                "id": null,
                "title": null,
                "titleHtml": null,
                "paragraphs": [
                  {
                    "text": "Stoltzfus Structures is not a lender, broker, or financial institution. Financing is provided through third-party lending partners. Subject to credit approval. Subject to lender approval. Rates and terms subject to change. Financing is not guaranteed. Loan funds can only be used for your project with Stoltzfus Structures. Program summaries on this page are simplified — your agreement with the lender controls. Nothing on this page is financial, legal, or tax advice.",
                    "html": "Stoltzfus Structures is not a lender, broker, or financial institution. Financing is provided through third-party lending partners. Subject to credit approval. Subject to lender approval. Rates and terms subject to change. Financing is not guaranteed. Loan funds can only be used for your project with Stoltzfus Structures. Program summaries on this page are simplified — your agreement with the lender controls. Nothing on this page is financial, legal, or tax advice."
                  }
                ]
              },
              {
                "type": "paragraph",
                "id": "disc-credit",
                "title": null,
                "titleHtml": null,
                "paragraphs": [
                  {
                    "text": "¹ Payments and APRs shown are estimates for illustration purposes only and are not an offer of credit; actual rates, terms, and payments are determined by the lender. The lender will provide you with your eligible loan offers. Promotional offers are subject to credit approval and may change or end at any time. A soft credit inquiry used to see offers does not affect your credit score; a hard inquiry occurs only after you accept a loan offer and proceed with the loan application. Our lending partners are Equal Opportunity Lenders. Rent-to-Own (SmartPay) uses no credit check.",
                    "html": "<sup><strong>1</strong></sup> Payments and APRs shown are estimates for illustration purposes only and are not an offer of credit; actual rates, terms, and payments are determined by the lender. The lender will provide you with your eligible loan offers. Promotional offers are subject to credit approval and may change or end at any time. A soft credit inquiry used to see offers does not affect your credit score; a hard inquiry occurs only after you accept a loan offer and proceed with the loan application. Our lending partners are Equal Opportunity Lenders. Rent-to-Own (SmartPay) uses no credit check."
                  }
                ]
              },
              {
                "type": "paragraph",
                "id": null,
                "title": null,
                "titleHtml": null,
                "paragraphs": [
                  {
                    "text": "Rent-to-own is a rental-purchase (lease) agreement offered by SmartPay — not a loan or credit product, so no interest rate or APR applies. Home equity products are secured by your home and are offered by Figure Lending LLC, NMLS #1717824.",
                    "html": "Rent-to-own is a rental-purchase (lease) agreement offered by SmartPay — not a loan or credit product, so no interest rate or APR applies. Home equity products are secured by your home and are offered by Figure Lending LLC, NMLS #1717824."
                  }
                ]
              },
              {
                "type": "paragraph",
                "id": null,
                "title": null,
                "titleHtml": null,
                "paragraphs": [
                  {
                    "text": "Representative example: a $25,000 loan at 8.99% APR for 5 years (60 months) would result in 60 monthly payments of $518.84.",
                    "html": "<strong>Representative example:</strong> a $25,000 loan at 8.99% APR for 5 years (60 months) would result in 60 monthly payments of $518.84."
                  }
                ]
              },
              {
                "type": "heading",
                "text": "Important Disclosures"
              },
              {
                "type": "section",
                "id": "disc-payments",
                "title": "* Payment & APR Estimates",
                "titleHtml": "* Payment &amp; APR Estimates",
                "paragraphs": [
                  {
                    "text": "APRs marked with an asterisk (*) include a 0.50% autopay discount, which requires enrollment in automatic payments (Consumer Financing and Building Loan only); your APR is higher without autopay. Your actual rate and payment depend on your credit profile, loan amount, term, state, and lender approval — the lowest rates require excellent credit.",
                    "html": "APRs marked with an asterisk (*) include a 0.50% autopay discount, which requires enrollment in automatic payments (Consumer Financing and Building Loan only); your APR is higher without autopay. Your actual rate and payment depend on your credit profile, loan amount, term, state, and lender approval — the lowest rates require excellent credit."
                  },
                  {
                    "text": "Building Loan (Thrive Financial): months 1–6 are interest-only — interest accrues on 50% of the loan after the first release of funds and on the full loan after delivery; principal & interest payments begin in month 7 and amortize over the remaining term (term minus 6 months).",
                    "html": "<strong>Building Loan (Thrive Financial):</strong> months 1–6 are interest-only — interest accrues on 50% of the loan after the first release of funds and on the full loan after delivery; principal &amp; interest payments begin in month 7 and amortize over the remaining term (term minus 6 months)."
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-rto",
                "title": "Rent-to-Own (SmartPay)",
                "titleHtml": "Rent-to-Own (SmartPay)",
                "paragraphs": [
                  {
                    "text": "You do not own the structure until you have made all scheduled payments or exercised an early purchase option. The total of scheduled payments is higher than the cash price of the structure. A deposit or initial payment is required, and additional fees may apply — your agreement discloses the cash price, total of payments, and all fees before you sign. Rent-to-own is regulated under state rental-purchase laws and is not available in all states.",
                    "html": "You do not own the structure until you have made all scheduled payments or exercised an early purchase option. The total of scheduled payments is <strong>higher than the cash price</strong> of the structure. A deposit or initial payment is required, and additional fees may apply — your agreement discloses the cash price, total of payments, and all fees before you sign. Rent-to-own is regulated under state rental-purchase laws and is not available in all states."
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-ecoa",
                "title": "Equal Credit Opportunity",
                "titleHtml": "Equal Credit Opportunity",
                "paragraphs": [
                  {
                    "text": "The federal Equal Credit Opportunity Act prohibits creditors from discriminating against credit applicants on the basis of race, color, religion, national origin, sex, marital status, or age (provided the applicant has the capacity to enter into a binding contract); because all or part of the applicant’s income derives from any public assistance program; or because the applicant has in good faith exercised any right under the Consumer Credit Protection Act. Each lender will identify the federal agency that administers its compliance with this law.",
                    "html": "The federal Equal Credit Opportunity Act prohibits creditors from discriminating against credit applicants on the basis of race, color, religion, national origin, sex, marital status, or age (provided the applicant has the capacity to enter into a binding contract); because all or part of the applicant’s income derives from any public assistance program; or because the applicant has in good faith exercised any right under the Consumer Credit Protection Act. Each lender will identify the federal agency that administers its compliance with this law."
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-state",
                "title": "State Availability",
                "titleHtml": "State Availability",
                "paragraphs": [
                  {
                    "text": "Not every program is available in every state. This page checks availability based on the state you select — for example, the 6-month no-interest program is not offered to residents of certain states, and rent-to-own is not offered in Alaska, Hawaii, Minnesota, Mississippi, Washington, Wisconsin, or Wyoming. Availability is determined by each lender and may change.",
                    "html": "Not every program is available in every state. This page checks availability based on the state you select — for example, the 6-month no-interest program is not offered to residents of certain states, and rent-to-own is not offered in Alaska, Hawaii, Minnesota, Mississippi, Washington, Wisconsin, or Wyoming. Availability is determined by each lender and may change."
                  }
                ]
              }
            ],
            "all": [
              {
                "type": "paragraph",
                "id": null,
                "products": [],
                "paragraphs": [
                  {
                    "text": "Stoltzfus Structures is not a lender, broker, or financial institution. Financing is provided through third-party lending partners. Subject to credit approval. Subject to lender approval. Rates and terms subject to change. Financing is not guaranteed. Loan funds can only be used for your project with Stoltzfus Structures. Program summaries on this page are simplified — your agreement with the lender controls. Nothing on this page is financial, legal, or tax advice.",
                    "html": "Stoltzfus Structures is not a lender, broker, or financial institution. Financing is provided through third-party lending partners. Subject to credit approval. Subject to lender approval. Rates and terms subject to change. Financing is not guaranteed. Loan funds can only be used for your project with Stoltzfus Structures. Program summaries on this page are simplified — your agreement with the lender controls. Nothing on this page is financial, legal, or tax advice.",
                    "products": []
                  }
                ]
              },
              {
                "type": "paragraph",
                "id": "disc-credit",
                "products": [
                  "rto"
                ],
                "paragraphs": [
                  {
                    "text": "¹ Payments and APRs shown are estimates for illustration purposes only and are not an offer of credit; actual rates, terms, and payments are determined by the lender. The lender will provide you with your eligible loan offers. Promotional offers are subject to credit approval and may change or end at any time. A soft credit inquiry used to see offers does not affect your credit score; a hard inquiry occurs only after you accept a loan offer and proceed with the loan application. Our lending partners are Equal Opportunity Lenders. Rent-to-Own (SmartPay) uses no credit check.",
                    "html": "<sup><strong>1</strong></sup> Payments and APRs shown are estimates for illustration purposes only and are not an offer of credit; actual rates, terms, and payments are determined by the lender. The lender will provide you with your eligible loan offers. Promotional offers are subject to credit approval and may change or end at any time. A soft credit inquiry used to see offers does not affect your credit score; a hard inquiry occurs only after you accept a loan offer and proceed with the loan application. Our lending partners are Equal Opportunity Lenders. Rent-to-Own (SmartPay) uses no credit check.",
                    "products": [
                      "rto"
                    ]
                  }
                ]
              },
              {
                "type": "paragraph",
                "id": null,
                "products": [
                  "rto",
                  "figure"
                ],
                "paragraphs": [
                  {
                    "text": "Rent-to-own is a rental-purchase (lease) agreement offered by SmartPay — not a loan or credit product, so no interest rate or APR applies. Home equity products are secured by your home and are offered by Figure Lending LLC, NMLS #1717824.",
                    "html": "Rent-to-own is a rental-purchase (lease) agreement offered by SmartPay — not a loan or credit product, so no interest rate or APR applies. Home equity products are secured by your home and are offered by Figure Lending LLC, NMLS #1717824.",
                    "products": [
                      "rto",
                      "figure"
                    ]
                  }
                ]
              },
              {
                "type": "paragraph",
                "id": null,
                "products": [],
                "paragraphs": [
                  {
                    "text": "Representative example: a $25,000 loan at 8.99% APR for 5 years (60 months) would result in 60 monthly payments of $518.84.",
                    "html": "<strong>Representative example:</strong> a $25,000 loan at 8.99% APR for 5 years (60 months) would result in 60 monthly payments of $518.84.",
                    "products": []
                  }
                ]
              },
              {
                "type": "heading",
                "text": "Important Disclosures"
              },
              {
                "type": "section",
                "id": "disc-payments",
                "title": "* Payment & APR Estimates",
                "titleHtml": "* Payment &amp; APR Estimates",
                "products": [],
                "paragraphs": [
                  {
                    "text": "APRs marked with an asterisk (*) include a 0.50% autopay discount, which requires enrollment in automatic payments (Consumer Financing and Building Loan only); your APR is higher without autopay. Your actual rate and payment depend on your credit profile, loan amount, term, state, and lender approval — the lowest rates require excellent credit.",
                    "html": "APRs marked with an asterisk (*) include a 0.50% autopay discount, which requires enrollment in automatic payments (Consumer Financing and Building Loan only); your APR is higher without autopay. Your actual rate and payment depend on your credit profile, loan amount, term, state, and lender approval — the lowest rates require excellent credit.",
                    "products": [
                      "upgrade",
                      "thrive"
                    ]
                  },
                  {
                    "text": "Building Loan (Thrive Financial): months 1–6 are interest-only — interest accrues on 50% of the loan after the first release of funds and on the full loan after delivery; principal & interest payments begin in month 7 and amortize over the remaining term (term minus 6 months).",
                    "html": "<strong>Building Loan (Thrive Financial):</strong> months 1–6 are interest-only — interest accrues on 50% of the loan after the first release of funds and on the full loan after delivery; principal &amp; interest payments begin in month 7 and amortize over the remaining term (term minus 6 months).",
                    "products": [
                      "thrive"
                    ]
                  },
                  {
                    "text": "6 Months No Interest (Pure Finance): no interest and no minimum payments for the first 6 months. Any balance remaining when the promotional period ends automatically converts to a 10-year loan at 10.99% APR fixed. Pay the balance in full within 6 months and you pay no interest.",
                    "html": "<strong>6 Months No Interest (Pure Finance):</strong> no interest and no minimum payments for the first 6 months. Any balance remaining when the promotional period ends automatically converts to a 10-year loan at 10.99% APR fixed. Pay the balance in full within 6 months and you pay no interest.",
                    "products": [
                      "pure"
                    ]
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-rto",
                "title": "Rent-to-Own (SmartPay)",
                "titleHtml": "Rent-to-Own (SmartPay)",
                "products": [
                  "rto"
                ],
                "paragraphs": [
                  {
                    "text": "You do not own the structure until you have made all scheduled payments or exercised an early purchase option. The total of scheduled payments is higher than the cash price of the structure. A deposit or initial payment is required, and additional fees may apply — your agreement discloses the cash price, total of payments, and all fees before you sign. Rent-to-own is regulated under state rental-purchase laws and is not available in all states.",
                    "html": "You do not own the structure until you have made all scheduled payments or exercised an early purchase option. The total of scheduled payments is <strong>higher than the cash price</strong> of the structure. A deposit or initial payment is required, and additional fees may apply — your agreement discloses the cash price, total of payments, and all fees before you sign. Rent-to-own is regulated under state rental-purchase laws and is not available in all states.",
                    "products": [
                      "rto"
                    ]
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-figure",
                "title": "Home Equity (Figure Lending)",
                "titleHtml": "Home Equity (Figure Lending)",
                "products": [
                  "figure"
                ],
                "paragraphs": [
                  {
                    "text": "You could lose your home if you do not make payments. Loan amounts, rates, and terms are set by Figure after you apply and are approved; rates vary and are not guaranteed. Not available in all states.",
                    "html": "<strong>You could lose your home if you do not make payments.</strong> Loan amounts, rates, and terms are set by Figure after you apply and are approved; rates vary and are not guaranteed. Not available in all states.",
                    "products": [
                      "figure"
                    ]
                  },
                  {
                    "text": "⌂ Equal Housing Opportunity",
                    "html": "⌂ Equal Housing Opportunity",
                    "products": [
                      "figure"
                    ]
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-figure-funding",
                "title": "² Figure Lending — Funding Timeline",
                "titleHtml": "<sup><strong>2</strong></sup> Figure Lending — Funding Timeline",
                "products": [
                  "figure"
                ],
                "paragraphs": [
                  {
                    "text": "As soon as five to ten business day funding timeline assumes closing the loan with our remote online notary, and where loan amounts are under $400,000 which would not require an appraisal. Funding timelines may be longer for loans secured by properties located in counties that do not permit recording of e-signatures or that otherwise require an in-person closing, or that require a waiting period prior to closing, or where loan amounts exceed $400,000.",
                    "html": "As soon as five to ten business day funding timeline assumes closing the loan with our remote online notary, and where loan amounts are under $400,000 which would not require an appraisal. Funding timelines may be longer for loans secured by properties located in counties that do not permit recording of e-signatures or that otherwise require an in-person closing, or that require a waiting period prior to closing, or where loan amounts exceed $400,000.",
                    "products": [
                      "figure"
                    ]
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-figure-amount",
                "title": "³ Figure Lending — Loan Amount",
                "titleHtml": "<sup><strong>3</strong></sup> Figure Lending — Loan Amount",
                "products": [
                  "figure"
                ],
                "paragraphs": [
                  {
                    "text": "Our loan amounts range from a minimum of $15,000 to a maximum of $750,000. For properties located in AK, the minimum loan amount is $25,001 and for properties located in TX, the minimum loan amount is $35,000. Your maximum loan amount may be lower than $750,000, and will ultimately depend on your home value, lien position, credit profile, verified income amount, and equity available at the time of application. We determine home value and resulting equity through independent data sources and automated valuation models or appraisal. Loan amounts above $400,000 are subject to appraisal.",
                    "html": "Our loan amounts range from a minimum of $15,000 to a maximum of $750,000. For properties located in AK, the minimum loan amount is $25,001 and for properties located in TX, the minimum loan amount is $35,000. Your maximum loan amount may be lower than $750,000, and will ultimately depend on your home value, lien position, credit profile, verified income amount, and equity available at the time of application. We determine home value and resulting equity through independent data sources and automated valuation models or appraisal. Loan amounts above $400,000 are subject to appraisal.",
                    "products": [
                      "figure"
                    ]
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-ecoa",
                "title": "Equal Credit Opportunity",
                "titleHtml": "Equal Credit Opportunity",
                "products": [],
                "paragraphs": [
                  {
                    "text": "The federal Equal Credit Opportunity Act prohibits creditors from discriminating against credit applicants on the basis of race, color, religion, national origin, sex, marital status, or age (provided the applicant has the capacity to enter into a binding contract); because all or part of the applicant’s income derives from any public assistance program; or because the applicant has in good faith exercised any right under the Consumer Credit Protection Act. Each lender will identify the federal agency that administers its compliance with this law.",
                    "html": "The federal Equal Credit Opportunity Act prohibits creditors from discriminating against credit applicants on the basis of race, color, religion, national origin, sex, marital status, or age (provided the applicant has the capacity to enter into a binding contract); because all or part of the applicant’s income derives from any public assistance program; or because the applicant has in good faith exercised any right under the Consumer Credit Protection Act. Each lender will identify the federal agency that administers its compliance with this law.",
                    "products": []
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-state",
                "title": "State Availability",
                "titleHtml": "State Availability",
                "products": [],
                "paragraphs": [
                  {
                    "text": "Not every program is available in every state. This page checks availability based on the state you select — for example, the 6-month no-interest program is not offered to residents of certain states, and rent-to-own is not offered in Alaska, Hawaii, Minnesota, Mississippi, Washington, Wisconsin, or Wyoming. Availability is determined by each lender and may change.",
                    "html": "Not every program is available in every state. This page checks availability based on the state you select — for example, the 6-month no-interest program is not offered to residents of certain states, and rent-to-own is not offered in Alaska, Hawaii, Minnesota, Mississippi, Washington, Wisconsin, or Wyoming. Availability is determined by each lender and may change.",
                    "products": [
                      "pure",
                      "rto"
                    ]
                  }
                ]
              },
              {
                "type": "company",
                "id": null,
                "products": [],
                "paragraphs": [
                  {
                    "text": "Stoltzfus Structures — 5075 Lower Valley Rd. (Rte. 372), Atglen, PA 19310 • 3898 W Lincoln Hwy, Parkesburg, PA 19365",
                    "html": "Stoltzfus Structures — 5075 Lower Valley Rd. (Rte. 372), Atglen, PA 19310 &nbsp;•&nbsp; 3898 W Lincoln Hwy, Parkesburg, PA 19365",
                    "products": []
                  }
                ]
              },
              {
                "type": "company",
                "id": null,
                "products": [],
                "paragraphs": [
                  {
                    "text": "© 2026 Stoltzfus Structures. All rights reserved.",
                    "html": "© 2026 Stoltzfus Structures. All rights reserved.",
                    "products": []
                  }
                ]
              }
            ],
            "footnotes": [
              {
                "marker": "1",
                "display": "¹",
                "disclosureId": "disc-credit",
                "title": null,
                "appliesToThisWidget": true
              },
              {
                "marker": "*",
                "display": "*",
                "disclosureId": "disc-payments",
                "title": "* Payment & APR Estimates",
                "appliesToThisWidget": true
              },
              {
                "marker": "2",
                "display": "²",
                "disclosureId": "disc-figure-funding",
                "title": "² Figure Lending — Funding Timeline",
                "appliesToThisWidget": false
              },
              {
                "marker": "3",
                "display": "³",
                "disclosureId": "disc-figure-amount",
                "title": "³ Figure Lending — Loan Amount",
                "appliesToThisWidget": false
              },
              {
                "marker": "†",
                "display": "†",
                "disclosureId": "disc-payments",
                "title": "* Payment & APR Estimates",
                "appliesToThisWidget": true,
                "note": "Interest-only (Thrive Building Loan) terms — explained in the Building Loan paragraph of this section and in each term's paymentNote."
              }
            ],
            "notALender": "Stoltzfus Structures is not a lender, broker, or financial institution. Financing is provided through third-party lending partners. Subject to credit approval. Subject to lender approval. Rates and terms subject to change. Financing is not guaranteed. Loan funds can only be used for your project with Stoltzfus Structures. Program summaries on this page are simplified — your agreement with the lender controls. Nothing on this page is financial, legal, or tax advice.",
            "representativeExample": "Representative example: a $25,000 loan at 8.99% APR for 5 years (60 months) would result in 60 monthly payments of $518.84.",
            "rentToOwnStructures": "Structures that are 2 stories or permanently anchored to a foundation or concrete footings do not qualify for rent-to-own."
          },
          "displayRules": [
            "Always show a loan payment together with its APR and term (federal advertising rule: never a payment amount by itself).",
            "Keep the * on APRs and the † on interest-only (Thrive) terms, and put the matching disclosures on the page.",
            "Do not name the lender on the payment choices; name lender(s) only at the Apply step (loans.terms[].offers).",
            "Never show an APR or interest rate for rent-to-own — it is a lease, not a loan.",
            "Never call any of these products \"unsecured\".",
            "When a result carries overMaxText, show it next to those payments.",
            "Show every block in disclosures.forThisWidget on the page, in order — they are copied word-for-word from the estimator page and update automatically when it changes. Do not edit or retype them.",
            "Show each lender's applyHint (the small print under the estimator's Apply buttons) next to its Apply button.",
            "Point Apply buttons at applyLink (it counts the click, then forwards to the lender) and open it in a new tab when applyOpensNewTab is true.",
            "Do not call the API for custom-quote structures with no set price — show \"request a quote\" instead."
          ]
        },
        "summary": "creditScore=500 — loans.available=false with loans.message"
      },
      "BadInput": {
        "value": {
          "ok": false,
          "error": "invalid_input",
          "fields": {
            "zip": "Enter a valid 5-digit US ZIP code",
            "price": "Enter the total price as a number, e.g. 18500"
          }
        },
        "summary": "zip=123&price=abc"
      },
      "EstZip00000": {
        "value": {
          "ok": false,
          "error": "invalid_input",
          "fields": {
            "zip": "Enter a valid 5-digit US ZIP code"
          }
        },
        "summary": "zip=00000"
      },
      "SimInvalid": {
        "value": {
          "ok": false,
          "error": "invalid_input",
          "fields": {
            "zip": "Enter a 5-digit US ZIP code",
            "price": "Enter the total price as a number, e.g. 18500"
          },
          "simulated": "invalid"
        },
        "summary": "simulate=invalid"
      },
      "PostMissing": {
        "value": {
          "ok": false,
          "error": "invalid_input",
          "fields": {
            "zip": "Enter a valid 5-digit US ZIP code",
            "price": "Enter the total price as a number, e.g. 18500",
            "creditScore": "Must be one of: 840, 820, 800, 720, 680, 640, 600, 550, 500",
            "ownProperty": "Must be one of: own, biz, no"
          }
        },
        "summary": "Body {}"
      },
      "PostBadjson": {
        "value": {
          "ok": false,
          "error": "invalid_json"
        },
        "summary": "Malformed JSON body"
      },
      "PostSimInvalid": {
        "value": {
          "ok": false,
          "error": "invalid_input",
          "fields": {
            "zip": "Enter a 5-digit US ZIP code",
            "price": "Enter the total price as a number, e.g. 18500"
          },
          "simulated": "invalid"
        },
        "summary": "simulate=invalid"
      },
      "Brands": {
        "value": {
          "ok": true,
          "brands": [
            {
              "brand": "stoltzfus",
              "name": "Stoltzfus Structures"
            }
          ]
        }
      },
      "Options": {
        "value": {
          "ok": true,
          "apiVersion": "2026-10-13",
          "brand": "stoltzfus",
          "brandName": "Stoltzfus Structures",
          "rulesFrom": {
            "estimator": "https://shedlender.com/estimator.html",
            "estimatorVersion": "e29cbbafc3fb90f1",
            "readAt": "2026-10-13T15:00:00.072Z",
            "source": "cache"
          },
          "questions": {
            "creditScore": {
              "field": "creditScore",
              "label": "What is your credit score?",
              "placeholder": "— Select credit score —",
              "helpText": "Not sure? Use your best estimate — you can change it anytime, and checking your options never affects your credit.",
              "options": [
                {
                  "value": "840",
                  "label": "840 – 850"
                },
                {
                  "value": "820",
                  "label": "820 – 839"
                },
                {
                  "value": "800",
                  "label": "800 – 819"
                },
                {
                  "value": "720",
                  "label": "720 – 799"
                },
                {
                  "value": "680",
                  "label": "680 – 719"
                },
                {
                  "value": "640",
                  "label": "640 – 679"
                },
                {
                  "value": "600",
                  "label": "600 – 639"
                },
                {
                  "value": "550",
                  "label": "550 – 599"
                },
                {
                  "value": "500",
                  "label": "Below 550"
                }
              ]
            },
            "ownProperty": {
              "field": "ownProperty",
              "label": "Do you own the property where the project is located?",
              "placeholder": "— Select an option —",
              "helpText": "Select \"No\" if your name or your business is not on the deed to the property.",
              "options": [
                {
                  "value": "own",
                  "label": "Yes, I own the property"
                },
                {
                  "value": "biz",
                  "label": "Yes, my business owns the property"
                },
                {
                  "value": "no",
                  "label": "No, I do not own the property"
                }
              ]
            }
          },
          "inputs": {
            "zip": "5-digit US ZIP where the structure will be delivered",
            "price": "Total price in US dollars (number)",
            "creditScore": "One of questions.creditScore.options[].value",
            "ownProperty": "One of questions.ownProperty.options[].value"
          },
          "lenders": {
            "upgrade": {
              "lender": "Upgrade",
              "product": "Consumer Financing",
              "minCreditScore": 680,
              "minAmount": 2000,
              "maxAmount": 100000,
              "requiresPropertyOwnership": false,
              "notOfferedInStates": [],
              "comingSoon": false,
              "applyUrl": "https://upgrade.com/h/RkVh79xDIQ",
              "applyHint": {
                "text": "Soft credit check to see your offers — checking offers does not affect your credit score.¹",
                "html": "Soft credit check to see your offers — checking offers does not affect your credit score.<sup>1</sup>"
              }
            },
            "thrive": {
              "lender": "Thrive Financial",
              "product": "Building Loan",
              "minCreditScore": 550,
              "minAmount": 3000,
              "maxAmount": 200000,
              "requiresPropertyOwnership": true,
              "notOfferedInStates": [],
              "comingSoon": false,
              "applyUrl": "https://shedlender.com/thrive-prequal.html",
              "applyHint": {
                "text": "Soft credit check to see if you pre-qualify — does not impact your credit score.¹",
                "html": "Soft credit check to see if you pre-qualify — does not impact your credit score.<sup>1</sup>"
              }
            },
            "rto": {
              "lender": "SmartPay",
              "product": "Rent-to-Own",
              "minCreditScore": 0,
              "minAmount": 1000,
              "maxAmount": 25000,
              "requiresPropertyOwnership": false,
              "notOfferedInStates": [
                "MN",
                "MS",
                "WA",
                "WI",
                "WY",
                "AK",
                "HI"
              ],
              "comingSoon": false,
              "applyUrl": "https://www.smartpayrentals.com/app/StoltzfusStructures",
              "applyHint": {
                "text": "Approval is not guaranteed. Rent-to-own is a rental-purchase agreement, not a loan — see Important Disclosures.",
                "html": "Approval is not guaranteed. Rent-to-own is a rental-purchase agreement, not a loan — see Important Disclosures."
              }
            }
          },
          "disclosures": {
            "source": "https://shedlender.com/estimator.html (footer, \"Important Disclosures\") — copied word-for-word, updates automatically",
            "forThisWidget": [
              {
                "type": "paragraph",
                "id": null,
                "title": null,
                "titleHtml": null,
                "paragraphs": [
                  {
                    "text": "Stoltzfus Structures is not a lender, broker, or financial institution. Financing is provided through third-party lending partners. Subject to credit approval. Subject to lender approval. Rates and terms subject to change. Financing is not guaranteed. Loan funds can only be used for your project with Stoltzfus Structures. Program summaries on this page are simplified — your agreement with the lender controls. Nothing on this page is financial, legal, or tax advice.",
                    "html": "Stoltzfus Structures is not a lender, broker, or financial institution. Financing is provided through third-party lending partners. Subject to credit approval. Subject to lender approval. Rates and terms subject to change. Financing is not guaranteed. Loan funds can only be used for your project with Stoltzfus Structures. Program summaries on this page are simplified — your agreement with the lender controls. Nothing on this page is financial, legal, or tax advice."
                  }
                ]
              },
              {
                "type": "paragraph",
                "id": "disc-credit",
                "title": null,
                "titleHtml": null,
                "paragraphs": [
                  {
                    "text": "¹ Payments and APRs shown are estimates for illustration purposes only and are not an offer of credit; actual rates, terms, and payments are determined by the lender. The lender will provide you with your eligible loan offers. Promotional offers are subject to credit approval and may change or end at any time. A soft credit inquiry used to see offers does not affect your credit score; a hard inquiry occurs only after you accept a loan offer and proceed with the loan application. Our lending partners are Equal Opportunity Lenders. Rent-to-Own (SmartPay) uses no credit check.",
                    "html": "<sup><strong>1</strong></sup> Payments and APRs shown are estimates for illustration purposes only and are not an offer of credit; actual rates, terms, and payments are determined by the lender. The lender will provide you with your eligible loan offers. Promotional offers are subject to credit approval and may change or end at any time. A soft credit inquiry used to see offers does not affect your credit score; a hard inquiry occurs only after you accept a loan offer and proceed with the loan application. Our lending partners are Equal Opportunity Lenders. Rent-to-Own (SmartPay) uses no credit check."
                  }
                ]
              },
              {
                "type": "paragraph",
                "id": null,
                "title": null,
                "titleHtml": null,
                "paragraphs": [
                  {
                    "text": "Rent-to-own is a rental-purchase (lease) agreement offered by SmartPay — not a loan or credit product, so no interest rate or APR applies. Home equity products are secured by your home and are offered by Figure Lending LLC, NMLS #1717824.",
                    "html": "Rent-to-own is a rental-purchase (lease) agreement offered by SmartPay — not a loan or credit product, so no interest rate or APR applies. Home equity products are secured by your home and are offered by Figure Lending LLC, NMLS #1717824."
                  }
                ]
              },
              {
                "type": "paragraph",
                "id": null,
                "title": null,
                "titleHtml": null,
                "paragraphs": [
                  {
                    "text": "Representative example: a $25,000 loan at 8.99% APR for 5 years (60 months) would result in 60 monthly payments of $518.84.",
                    "html": "<strong>Representative example:</strong> a $25,000 loan at 8.99% APR for 5 years (60 months) would result in 60 monthly payments of $518.84."
                  }
                ]
              },
              {
                "type": "heading",
                "text": "Important Disclosures"
              },
              {
                "type": "section",
                "id": "disc-payments",
                "title": "* Payment & APR Estimates",
                "titleHtml": "* Payment &amp; APR Estimates",
                "paragraphs": [
                  {
                    "text": "APRs marked with an asterisk (*) include a 0.50% autopay discount, which requires enrollment in automatic payments (Consumer Financing and Building Loan only); your APR is higher without autopay. Your actual rate and payment depend on your credit profile, loan amount, term, state, and lender approval — the lowest rates require excellent credit.",
                    "html": "APRs marked with an asterisk (*) include a 0.50% autopay discount, which requires enrollment in automatic payments (Consumer Financing and Building Loan only); your APR is higher without autopay. Your actual rate and payment depend on your credit profile, loan amount, term, state, and lender approval — the lowest rates require excellent credit."
                  },
                  {
                    "text": "Building Loan (Thrive Financial): months 1–6 are interest-only — interest accrues on 50% of the loan after the first release of funds and on the full loan after delivery; principal & interest payments begin in month 7 and amortize over the remaining term (term minus 6 months).",
                    "html": "<strong>Building Loan (Thrive Financial):</strong> months 1–6 are interest-only — interest accrues on 50% of the loan after the first release of funds and on the full loan after delivery; principal &amp; interest payments begin in month 7 and amortize over the remaining term (term minus 6 months)."
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-rto",
                "title": "Rent-to-Own (SmartPay)",
                "titleHtml": "Rent-to-Own (SmartPay)",
                "paragraphs": [
                  {
                    "text": "You do not own the structure until you have made all scheduled payments or exercised an early purchase option. The total of scheduled payments is higher than the cash price of the structure. A deposit or initial payment is required, and additional fees may apply — your agreement discloses the cash price, total of payments, and all fees before you sign. Rent-to-own is regulated under state rental-purchase laws and is not available in all states.",
                    "html": "You do not own the structure until you have made all scheduled payments or exercised an early purchase option. The total of scheduled payments is <strong>higher than the cash price</strong> of the structure. A deposit or initial payment is required, and additional fees may apply — your agreement discloses the cash price, total of payments, and all fees before you sign. Rent-to-own is regulated under state rental-purchase laws and is not available in all states."
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-ecoa",
                "title": "Equal Credit Opportunity",
                "titleHtml": "Equal Credit Opportunity",
                "paragraphs": [
                  {
                    "text": "The federal Equal Credit Opportunity Act prohibits creditors from discriminating against credit applicants on the basis of race, color, religion, national origin, sex, marital status, or age (provided the applicant has the capacity to enter into a binding contract); because all or part of the applicant’s income derives from any public assistance program; or because the applicant has in good faith exercised any right under the Consumer Credit Protection Act. Each lender will identify the federal agency that administers its compliance with this law.",
                    "html": "The federal Equal Credit Opportunity Act prohibits creditors from discriminating against credit applicants on the basis of race, color, religion, national origin, sex, marital status, or age (provided the applicant has the capacity to enter into a binding contract); because all or part of the applicant’s income derives from any public assistance program; or because the applicant has in good faith exercised any right under the Consumer Credit Protection Act. Each lender will identify the federal agency that administers its compliance with this law."
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-state",
                "title": "State Availability",
                "titleHtml": "State Availability",
                "paragraphs": [
                  {
                    "text": "Not every program is available in every state. This page checks availability based on the state you select — for example, the 6-month no-interest program is not offered to residents of certain states, and rent-to-own is not offered in Alaska, Hawaii, Minnesota, Mississippi, Washington, Wisconsin, or Wyoming. Availability is determined by each lender and may change.",
                    "html": "Not every program is available in every state. This page checks availability based on the state you select — for example, the 6-month no-interest program is not offered to residents of certain states, and rent-to-own is not offered in Alaska, Hawaii, Minnesota, Mississippi, Washington, Wisconsin, or Wyoming. Availability is determined by each lender and may change."
                  }
                ]
              }
            ],
            "all": [
              {
                "type": "paragraph",
                "id": null,
                "products": [],
                "paragraphs": [
                  {
                    "text": "Stoltzfus Structures is not a lender, broker, or financial institution. Financing is provided through third-party lending partners. Subject to credit approval. Subject to lender approval. Rates and terms subject to change. Financing is not guaranteed. Loan funds can only be used for your project with Stoltzfus Structures. Program summaries on this page are simplified — your agreement with the lender controls. Nothing on this page is financial, legal, or tax advice.",
                    "html": "Stoltzfus Structures is not a lender, broker, or financial institution. Financing is provided through third-party lending partners. Subject to credit approval. Subject to lender approval. Rates and terms subject to change. Financing is not guaranteed. Loan funds can only be used for your project with Stoltzfus Structures. Program summaries on this page are simplified — your agreement with the lender controls. Nothing on this page is financial, legal, or tax advice.",
                    "products": []
                  }
                ]
              },
              {
                "type": "paragraph",
                "id": "disc-credit",
                "products": [
                  "rto"
                ],
                "paragraphs": [
                  {
                    "text": "¹ Payments and APRs shown are estimates for illustration purposes only and are not an offer of credit; actual rates, terms, and payments are determined by the lender. The lender will provide you with your eligible loan offers. Promotional offers are subject to credit approval and may change or end at any time. A soft credit inquiry used to see offers does not affect your credit score; a hard inquiry occurs only after you accept a loan offer and proceed with the loan application. Our lending partners are Equal Opportunity Lenders. Rent-to-Own (SmartPay) uses no credit check.",
                    "html": "<sup><strong>1</strong></sup> Payments and APRs shown are estimates for illustration purposes only and are not an offer of credit; actual rates, terms, and payments are determined by the lender. The lender will provide you with your eligible loan offers. Promotional offers are subject to credit approval and may change or end at any time. A soft credit inquiry used to see offers does not affect your credit score; a hard inquiry occurs only after you accept a loan offer and proceed with the loan application. Our lending partners are Equal Opportunity Lenders. Rent-to-Own (SmartPay) uses no credit check.",
                    "products": [
                      "rto"
                    ]
                  }
                ]
              },
              {
                "type": "paragraph",
                "id": null,
                "products": [
                  "rto",
                  "figure"
                ],
                "paragraphs": [
                  {
                    "text": "Rent-to-own is a rental-purchase (lease) agreement offered by SmartPay — not a loan or credit product, so no interest rate or APR applies. Home equity products are secured by your home and are offered by Figure Lending LLC, NMLS #1717824.",
                    "html": "Rent-to-own is a rental-purchase (lease) agreement offered by SmartPay — not a loan or credit product, so no interest rate or APR applies. Home equity products are secured by your home and are offered by Figure Lending LLC, NMLS #1717824.",
                    "products": [
                      "rto",
                      "figure"
                    ]
                  }
                ]
              },
              {
                "type": "paragraph",
                "id": null,
                "products": [],
                "paragraphs": [
                  {
                    "text": "Representative example: a $25,000 loan at 8.99% APR for 5 years (60 months) would result in 60 monthly payments of $518.84.",
                    "html": "<strong>Representative example:</strong> a $25,000 loan at 8.99% APR for 5 years (60 months) would result in 60 monthly payments of $518.84.",
                    "products": []
                  }
                ]
              },
              {
                "type": "heading",
                "text": "Important Disclosures"
              },
              {
                "type": "section",
                "id": "disc-payments",
                "title": "* Payment & APR Estimates",
                "titleHtml": "* Payment &amp; APR Estimates",
                "products": [],
                "paragraphs": [
                  {
                    "text": "APRs marked with an asterisk (*) include a 0.50% autopay discount, which requires enrollment in automatic payments (Consumer Financing and Building Loan only); your APR is higher without autopay. Your actual rate and payment depend on your credit profile, loan amount, term, state, and lender approval — the lowest rates require excellent credit.",
                    "html": "APRs marked with an asterisk (*) include a 0.50% autopay discount, which requires enrollment in automatic payments (Consumer Financing and Building Loan only); your APR is higher without autopay. Your actual rate and payment depend on your credit profile, loan amount, term, state, and lender approval — the lowest rates require excellent credit.",
                    "products": [
                      "upgrade",
                      "thrive"
                    ]
                  },
                  {
                    "text": "Building Loan (Thrive Financial): months 1–6 are interest-only — interest accrues on 50% of the loan after the first release of funds and on the full loan after delivery; principal & interest payments begin in month 7 and amortize over the remaining term (term minus 6 months).",
                    "html": "<strong>Building Loan (Thrive Financial):</strong> months 1–6 are interest-only — interest accrues on 50% of the loan after the first release of funds and on the full loan after delivery; principal &amp; interest payments begin in month 7 and amortize over the remaining term (term minus 6 months).",
                    "products": [
                      "thrive"
                    ]
                  },
                  {
                    "text": "6 Months No Interest (Pure Finance): no interest and no minimum payments for the first 6 months. Any balance remaining when the promotional period ends automatically converts to a 10-year loan at 10.99% APR fixed. Pay the balance in full within 6 months and you pay no interest.",
                    "html": "<strong>6 Months No Interest (Pure Finance):</strong> no interest and no minimum payments for the first 6 months. Any balance remaining when the promotional period ends automatically converts to a 10-year loan at 10.99% APR fixed. Pay the balance in full within 6 months and you pay no interest.",
                    "products": [
                      "pure"
                    ]
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-rto",
                "title": "Rent-to-Own (SmartPay)",
                "titleHtml": "Rent-to-Own (SmartPay)",
                "products": [
                  "rto"
                ],
                "paragraphs": [
                  {
                    "text": "You do not own the structure until you have made all scheduled payments or exercised an early purchase option. The total of scheduled payments is higher than the cash price of the structure. A deposit or initial payment is required, and additional fees may apply — your agreement discloses the cash price, total of payments, and all fees before you sign. Rent-to-own is regulated under state rental-purchase laws and is not available in all states.",
                    "html": "You do not own the structure until you have made all scheduled payments or exercised an early purchase option. The total of scheduled payments is <strong>higher than the cash price</strong> of the structure. A deposit or initial payment is required, and additional fees may apply — your agreement discloses the cash price, total of payments, and all fees before you sign. Rent-to-own is regulated under state rental-purchase laws and is not available in all states.",
                    "products": [
                      "rto"
                    ]
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-figure",
                "title": "Home Equity (Figure Lending)",
                "titleHtml": "Home Equity (Figure Lending)",
                "products": [
                  "figure"
                ],
                "paragraphs": [
                  {
                    "text": "You could lose your home if you do not make payments. Loan amounts, rates, and terms are set by Figure after you apply and are approved; rates vary and are not guaranteed. Not available in all states.",
                    "html": "<strong>You could lose your home if you do not make payments.</strong> Loan amounts, rates, and terms are set by Figure after you apply and are approved; rates vary and are not guaranteed. Not available in all states.",
                    "products": [
                      "figure"
                    ]
                  },
                  {
                    "text": "⌂ Equal Housing Opportunity",
                    "html": "⌂ Equal Housing Opportunity",
                    "products": [
                      "figure"
                    ]
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-figure-funding",
                "title": "² Figure Lending — Funding Timeline",
                "titleHtml": "<sup><strong>2</strong></sup> Figure Lending — Funding Timeline",
                "products": [
                  "figure"
                ],
                "paragraphs": [
                  {
                    "text": "As soon as five to ten business day funding timeline assumes closing the loan with our remote online notary, and where loan amounts are under $400,000 which would not require an appraisal. Funding timelines may be longer for loans secured by properties located in counties that do not permit recording of e-signatures or that otherwise require an in-person closing, or that require a waiting period prior to closing, or where loan amounts exceed $400,000.",
                    "html": "As soon as five to ten business day funding timeline assumes closing the loan with our remote online notary, and where loan amounts are under $400,000 which would not require an appraisal. Funding timelines may be longer for loans secured by properties located in counties that do not permit recording of e-signatures or that otherwise require an in-person closing, or that require a waiting period prior to closing, or where loan amounts exceed $400,000.",
                    "products": [
                      "figure"
                    ]
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-figure-amount",
                "title": "³ Figure Lending — Loan Amount",
                "titleHtml": "<sup><strong>3</strong></sup> Figure Lending — Loan Amount",
                "products": [
                  "figure"
                ],
                "paragraphs": [
                  {
                    "text": "Our loan amounts range from a minimum of $15,000 to a maximum of $750,000. For properties located in AK, the minimum loan amount is $25,001 and for properties located in TX, the minimum loan amount is $35,000. Your maximum loan amount may be lower than $750,000, and will ultimately depend on your home value, lien position, credit profile, verified income amount, and equity available at the time of application. We determine home value and resulting equity through independent data sources and automated valuation models or appraisal. Loan amounts above $400,000 are subject to appraisal.",
                    "html": "Our loan amounts range from a minimum of $15,000 to a maximum of $750,000. For properties located in AK, the minimum loan amount is $25,001 and for properties located in TX, the minimum loan amount is $35,000. Your maximum loan amount may be lower than $750,000, and will ultimately depend on your home value, lien position, credit profile, verified income amount, and equity available at the time of application. We determine home value and resulting equity through independent data sources and automated valuation models or appraisal. Loan amounts above $400,000 are subject to appraisal.",
                    "products": [
                      "figure"
                    ]
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-ecoa",
                "title": "Equal Credit Opportunity",
                "titleHtml": "Equal Credit Opportunity",
                "products": [],
                "paragraphs": [
                  {
                    "text": "The federal Equal Credit Opportunity Act prohibits creditors from discriminating against credit applicants on the basis of race, color, religion, national origin, sex, marital status, or age (provided the applicant has the capacity to enter into a binding contract); because all or part of the applicant’s income derives from any public assistance program; or because the applicant has in good faith exercised any right under the Consumer Credit Protection Act. Each lender will identify the federal agency that administers its compliance with this law.",
                    "html": "The federal Equal Credit Opportunity Act prohibits creditors from discriminating against credit applicants on the basis of race, color, religion, national origin, sex, marital status, or age (provided the applicant has the capacity to enter into a binding contract); because all or part of the applicant’s income derives from any public assistance program; or because the applicant has in good faith exercised any right under the Consumer Credit Protection Act. Each lender will identify the federal agency that administers its compliance with this law.",
                    "products": []
                  }
                ]
              },
              {
                "type": "section",
                "id": "disc-state",
                "title": "State Availability",
                "titleHtml": "State Availability",
                "products": [],
                "paragraphs": [
                  {
                    "text": "Not every program is available in every state. This page checks availability based on the state you select — for example, the 6-month no-interest program is not offered to residents of certain states, and rent-to-own is not offered in Alaska, Hawaii, Minnesota, Mississippi, Washington, Wisconsin, or Wyoming. Availability is determined by each lender and may change.",
                    "html": "Not every program is available in every state. This page checks availability based on the state you select — for example, the 6-month no-interest program is not offered to residents of certain states, and rent-to-own is not offered in Alaska, Hawaii, Minnesota, Mississippi, Washington, Wisconsin, or Wyoming. Availability is determined by each lender and may change.",
                    "products": [
                      "pure",
                      "rto"
                    ]
                  }
                ]
              },
              {
                "type": "company",
                "id": null,
                "products": [],
                "paragraphs": [
                  {
                    "text": "Stoltzfus Structures — 5075 Lower Valley Rd. (Rte. 372), Atglen, PA 19310 • 3898 W Lincoln Hwy, Parkesburg, PA 19365",
                    "html": "Stoltzfus Structures — 5075 Lower Valley Rd. (Rte. 372), Atglen, PA 19310 &nbsp;•&nbsp; 3898 W Lincoln Hwy, Parkesburg, PA 19365",
                    "products": []
                  }
                ]
              },
              {
                "type": "company",
                "id": null,
                "products": [],
                "paragraphs": [
                  {
                    "text": "© 2026 Stoltzfus Structures. All rights reserved.",
                    "html": "© 2026 Stoltzfus Structures. All rights reserved.",
                    "products": []
                  }
                ]
              }
            ],
            "footnotes": [
              {
                "marker": "1",
                "display": "¹",
                "disclosureId": "disc-credit",
                "title": null,
                "appliesToThisWidget": true
              },
              {
                "marker": "*",
                "display": "*",
                "disclosureId": "disc-payments",
                "title": "* Payment & APR Estimates",
                "appliesToThisWidget": true
              },
              {
                "marker": "2",
                "display": "²",
                "disclosureId": "disc-figure-funding",
                "title": "² Figure Lending — Funding Timeline",
                "appliesToThisWidget": false
              },
              {
                "marker": "3",
                "display": "³",
                "disclosureId": "disc-figure-amount",
                "title": "³ Figure Lending — Loan Amount",
                "appliesToThisWidget": false
              },
              {
                "marker": "†",
                "display": "†",
                "disclosureId": "disc-payments",
                "title": "* Payment & APR Estimates",
                "appliesToThisWidget": true,
                "note": "Interest-only (Thrive Building Loan) terms — explained in the Building Loan paragraph of this section and in each term's paymentNote."
              }
            ],
            "notALender": "Stoltzfus Structures is not a lender, broker, or financial institution. Financing is provided through third-party lending partners. Subject to credit approval. Subject to lender approval. Rates and terms subject to change. Financing is not guaranteed. Loan funds can only be used for your project with Stoltzfus Structures. Program summaries on this page are simplified — your agreement with the lender controls. Nothing on this page is financial, legal, or tax advice.",
            "representativeExample": "Representative example: a $25,000 loan at 8.99% APR for 5 years (60 months) would result in 60 monthly payments of $518.84.",
            "rentToOwnStructures": "Structures that are 2 stories or permanently anchored to a foundation or concrete footings do not qualify for rent-to-own."
          },
          "displayRules": [
            "Always show a loan payment together with its APR and term (federal advertising rule: never a payment amount by itself).",
            "Keep the * on APRs and the † on interest-only (Thrive) terms, and put the matching disclosures on the page.",
            "Do not name the lender on the payment choices; name lender(s) only at the Apply step (loans.terms[].offers).",
            "Never show an APR or interest rate for rent-to-own — it is a lease, not a loan.",
            "Never call any of these products \"unsecured\".",
            "When a result carries overMaxText, show it next to those payments.",
            "Show every block in disclosures.forThisWidget on the page, in order — they are copied word-for-word from the estimator page and update automatically when it changes. Do not edit or retype them.",
            "Show each lender's applyHint (the small print under the estimator's Apply buttons) next to its Apply button.",
            "Point Apply buttons at applyLink (it counts the click, then forwards to the lender) and open it in a new tab when applyOpensNewTab is true.",
            "Do not call the API for custom-quote structures with no set price — show \"request a quote\" instead."
          ]
        }
      },
      "PreflightEvil": {
        "value": {
          "ok": false,
          "error": "origin_not_allowed",
          "message": "This website is not allowed to call this API. Contact Tim Brazil to be added."
        }
      },
      "Health": {
        "value": {
          "ok": true,
          "brand": "stoltzfus",
          "estimator": "https://shedlender.com/estimator.html",
          "rulesSource": "live",
          "estimatorVersion": "e29cbbafc3fb90f1",
          "parseError": null,
          "fingerprintMismatch": [],
          "snippetMissing": [],
          "fingerprintsNow": {
            "pay": "48db92f5147c5380",
            "tier": "3eda939996b47628",
            "thriveTermsFor": "d3275ce5fc250fea",
            "eligible": "64bc74907c08f3de"
          },
          "disclosureParagraphsSynced": 16,
          "smartpayLinkConfigured": true,
          "checkedAt": "2026-10-13T15:00:14.494Z"
        }
      },
      "Rules": {
        "value": {
          "ok": true,
          "brand": "stoltzfus",
          "estimator": "https://shedlender.com/estimator.html",
          "estimatorVersion": "e29cbbafc3fb90f1",
          "parseError": null,
          "fingerprintMismatch": [],
          "snippetMissing": [],
          "snapshot": {
            "lenders": {
              "upgrade": {
                "lender": "Upgrade",
                "product": "Consumer Financing",
                "minCreditScore": 680,
                "minAmount": 2000,
                "maxAmount": 100000,
                "requiresPropertyOwnership": false,
                "notOfferedInStates": [],
                "comingSoon": false,
                "applyUrl": "https://upgrade.com/h/RkVh79xDIQ",
                "applyHint": "Soft credit check to see your offers — checking offers does not affect your credit score.¹"
              },
              "thrive": {
                "lender": "Thrive Financial",
                "product": "Building Loan",
                "minCreditScore": 550,
                "minAmount": 3000,
                "maxAmount": 200000,
                "requiresPropertyOwnership": true,
                "notOfferedInStates": [],
                "comingSoon": false,
                "applyUrl": "https://shedlender.com/thrive-prequal.html",
                "applyHint": "Soft credit check to see if you pre-qualify — does not impact your credit score.¹"
              },
              "rto": {
                "lender": "SmartPay",
                "product": "Rent-to-Own",
                "minCreditScore": 0,
                "minAmount": 1000,
                "maxAmount": 25000,
                "requiresPropertyOwnership": false,
                "notOfferedInStates": [
                  "MN",
                  "MS",
                  "WA",
                  "WI",
                  "WY",
                  "AK",
                  "HI"
                ],
                "comingSoon": false,
                "applyUrl": "https://www.smartpayrentals.com/app/StoltzfusStructures",
                "applyHint": "Approval is not guaranteed. Rent-to-own is a rental-purchase agreement, not a loan — see Important Disclosures."
              }
            },
            "upgradeTerms": [
              {
                "years": 5,
                "months": 60,
                "apr": 8.99
              },
              {
                "years": 7,
                "months": 84,
                "apr": 9.99
              },
              {
                "years": 10,
                "months": 120,
                "apr": 9.99
              },
              {
                "years": 12,
                "months": 144,
                "apr": 9.99
              },
              {
                "years": 15,
                "months": 180,
                "apr": 9.99
              }
            ],
            "thriveTerms": [
              {
                "years": 5,
                "months": 60,
                "scoreTiers": [
                  {
                    "minScore": 720,
                    "apr": 7.99
                  },
                  {
                    "minScore": 680,
                    "apr": 9.99
                  },
                  {
                    "minScore": 640,
                    "apr": 12.99
                  },
                  {
                    "minScore": 600,
                    "apr": 18.99
                  },
                  {
                    "minScore": 550,
                    "apr": 28.99
                  }
                ],
                "counterOfferBelow680": false
              },
              {
                "years": 10,
                "months": 120,
                "scoreTiers": [
                  {
                    "minScore": 800,
                    "apr": 7.99
                  },
                  {
                    "minScore": 680,
                    "apr": 9.99
                  },
                  {
                    "minScore": 640,
                    "apr": 12.99
                  },
                  {
                    "minScore": 600,
                    "apr": 18.99
                  },
                  {
                    "minScore": 550,
                    "apr": 28.99
                  }
                ],
                "counterOfferBelow680": false
              },
              {
                "years": 15,
                "months": 180,
                "scoreTiers": [
                  {
                    "minScore": 820,
                    "apr": 7.99
                  },
                  {
                    "minScore": 680,
                    "apr": 9.99
                  }
                ],
                "counterOfferBelow680": true
              },
              {
                "years": 20,
                "months": 240,
                "scoreTiers": [
                  {
                    "minScore": 840,
                    "apr": 7.99
                  },
                  {
                    "minScore": 680,
                    "apr": 9.99
                  }
                ],
                "counterOfferBelow680": true
              }
            ],
            "thriveCounterOffer": [
              {
                "minScore": 640,
                "apr": 12.99
              },
              {
                "minScore": 600,
                "apr": 18.99
              },
              {
                "minScore": 550,
                "apr": 28.99
              }
            ],
            "interestOnlyMonths": 6,
            "creditScoreOptions": [
              "840=840 – 850",
              "820=820 – 839",
              "800=800 – 819",
              "720=720 – 799",
              "680=680 – 719",
              "640=640 – 679",
              "600=600 – 639",
              "550=550 – 599",
              "500=Below 550"
            ],
            "ownPropertyOptions": [
              "own=Yes, I own the property",
              "biz=Yes, my business owns the property",
              "no=No, I do not own the property"
            ],
            "helpText": {
              "creditScore": "Not sure? Use your best estimate — you can change it anytime, and checking your options never affects your credit.",
              "ownProperty": "Select \"No\" if your name or your business is not on the deed to the property."
            },
            "rentToOwnStructureNote": "Structures that are 2 stories or permanently anchored to a foundation or concrete footings do not qualify for rent-to-own.",
            "disclosures": [
              {
                "id": null,
                "title": null,
                "text": [
                  "Stoltzfus Structures is not a lender, broker, or financial institution. Financing is provided through third-party lending partners. Subject to credit approval. Subject to lender approval. Rates and terms subject to change. Financing is not guaranteed. Loan funds can only be used for your project with Stoltzfus Structures. Program summaries on this page are simplified — your agreement with the lender controls. Nothing on this page is financial, legal, or tax advice."
                ]
              },
              {
                "id": "disc-credit",
                "title": null,
                "text": [
                  "¹ Payments and APRs shown are estimates for illustration purposes only and are not an offer of credit; actual rates, terms, and payments are determined by the lender. The lender will provide you with your eligible loan offers. Promotional offers are subject to credit approval and may change or end at any time. A soft credit inquiry used to see offers does not affect your credit score; a hard inquiry occurs only after you accept a loan offer and proceed with the loan application. Our lending partners are Equal Opportunity Lenders. Rent-to-Own (SmartPay) uses no credit check."
                ]
              },
              {
                "id": null,
                "title": null,
                "text": [
                  "Rent-to-own is a rental-purchase (lease) agreement offered by SmartPay — not a loan or credit product, so no interest rate or APR applies. Home equity products are secured by your home and are offered by Figure Lending LLC, NMLS #1717824."
                ]
              },
              {
                "id": null,
                "title": null,
                "text": [
                  "Representative example: a $25,000 loan at 8.99% APR for 5 years (60 months) would result in 60 monthly payments of $518.84."
                ]
              },
              {
                "heading": "Important Disclosures"
              },
              {
                "id": "disc-payments",
                "title": "* Payment & APR Estimates",
                "text": [
                  "APRs marked with an asterisk (*) include a 0.50% autopay discount, which requires enrollment in automatic payments (Consumer Financing and Building Loan only); your APR is higher without autopay. Your actual rate and payment depend on your credit profile, loan amount, term, state, and lender approval — the lowest rates require excellent credit.",
                  "Building Loan (Thrive Financial): months 1–6 are interest-only — interest accrues on 50% of the loan after the first release of funds and on the full loan after delivery; principal & interest payments begin in month 7 and amortize over the remaining term (term minus 6 months)."
                ]
              },
              {
                "id": "disc-rto",
                "title": "Rent-to-Own (SmartPay)",
                "text": [
                  "You do not own the structure until you have made all scheduled payments or exercised an early purchase option. The total of scheduled payments is higher than the cash price of the structure. A deposit or initial payment is required, and additional fees may apply — your agreement discloses the cash price, total of payments, and all fees before you sign. Rent-to-own is regulated under state rental-purchase laws and is not available in all states."
                ]
              },
              {
                "id": "disc-ecoa",
                "title": "Equal Credit Opportunity",
                "text": [
                  "The federal Equal Credit Opportunity Act prohibits creditors from discriminating against credit applicants on the basis of race, color, religion, national origin, sex, marital status, or age (provided the applicant has the capacity to enter into a binding contract); because all or part of the applicant’s income derives from any public assistance program; or because the applicant has in good faith exercised any right under the Consumer Credit Protection Act. Each lender will identify the federal agency that administers its compliance with this law."
                ]
              },
              {
                "id": "disc-state",
                "title": "State Availability",
                "text": [
                  "Not every program is available in every state. This page checks availability based on the state you select — for example, the 6-month no-interest program is not offered to residents of certain states, and rent-to-own is not offered in Alaska, Hawaii, Minnesota, Mississippi, Washington, Wisconsin, or Wyoming. Availability is determined by each lender and may change."
                ]
              }
            ]
          },
          "checkedAt": "2026-10-13T15:00:14.915Z"
        }
      }
    },
    "headers": {
      "X-Simulated": {
        "description": "Present only on responses produced with `simulate`; echoes the value.",
        "schema": {
          "type": "string",
          "example": "rto_unavailable"
        }
      },
      "Cache-Control": {
        "description": "Responses are never cached.",
        "schema": {
          "type": "string",
          "example": "no-store"
        }
      },
      "Access-Control-Allow-Origin": {
        "description": "Echoes an allowed browser Origin. Absent for server calls and disallowed origins.",
        "schema": {
          "type": "string",
          "example": "https://www.mysheds.com"
        }
      },
      "Vary": {
        "schema": {
          "type": "string",
          "example": "Origin"
        }
      }
    }
  }
}