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

# Quote in one call

> Price several policies as one loan, with taxes and fees and your own ids, and read every part of the response.

One `POST /v1/quotes` prices a deal: one insured and up to 25 policies financed together as one loan, from any mix of carriers. There's no session to open and nothing to clean up afterwards.

## Build the request

This example finances a general liability and property package plus a standalone windstorm policy, with the taxes and fees from the binder:

<CodeGroup>
  ```bash cURL theme={null}
  curl https://portal.bridgelinepf.com/api/v1/quotes \
    -H "Authorization: Bearer $BRIDGELINE_API_KEY" \
    -H "Content-Type: application/json" \
    -H "Idempotency-Key: $(uuidgen)" \
    -d '{
      "broker_email": "maria@lonestarrisk.example",
      "client_reference_id": "EPIC-PROP-2026-0412",
      "metadata": {"ams_account_id": "ACCT-10442"},
      "insured": {
        "name": "Lone Star Fabrication LLC",
        "fein": "74-0000000",
        "address": {
          "line1": "1200 Industrial Blvd",
          "city": "Houston",
          "state": "TX",
          "postal_code": "77002"
        }
      },
      "policies": [
        {
          "premium": "46100.00",
          "taxes_and_fees": [
            {
              "description": "Surplus lines tax (4.85%)",
              "amount": "2235.85",
              "earned": false
            },
            {"description": "Stamping fee (0.075%)", "amount": "34.58", "earned": false},
            {"description": "Policy fee", "amount": "250.00"}
          ],
          "minimum_earned": {"rate": 0.25},
          "effective_date": "2026-10-15",
          "expiration_date": "2027-10-15",
          "carrier": {"name": "Scottsdale Insurance Company", "naic_code": "41297"},
          "coverages": [
            {"type": "general_liability"},
            {
              "type": "commercial_property",
              "description": "Commercial Property (Ex-Wind)"
            }
          ],
          "auditable": false,
          "document_type": "binder",
          "policy_number": "CPS7712045",
          "metadata": {"ams_policy_id": "POL-889213"}
        },
        {
          "premium": "13000.00",
          "taxes_and_fees": [
            {
              "description": "Surplus lines tax (4.85%)",
              "amount": "630.50",
              "earned": false
            }
          ],
          "minimum_earned": {"rate": 0.25},
          "effective_date": "2026-10-15",
          "expiration_date": "2027-10-15",
          "carrier": {"name": "Blue Mesa Specialty Insurance Co"},
          "coverages": [{"type": "windstorm", "description": "Named Storm"}],
          "document_type": "quote",
          "metadata": {"ams_policy_id": "POL-889214"}
        }
      ]
    }'
  ```

  ```javascript Node theme={null}
  const res = await fetch('https://portal.bridgelinepf.com/api/v1/quotes', {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${process.env.BRIDGELINE_API_KEY}`,
      'Content-Type': 'application/json',
      'Idempotency-Key': crypto.randomUUID(),
    },
    body: JSON.stringify({
      broker_email: 'maria@lonestarrisk.example',
      client_reference_id: 'EPIC-PROP-2026-0412',
      metadata: { ams_account_id: 'ACCT-10442' },
      insured: {
        name: 'Lone Star Fabrication LLC',
        fein: '74-0000000',
        address: { line1: '1200 Industrial Blvd', city: 'Houston', state: 'TX', postal_code: '77002' },
      },
      policies: [
        {
          premium: '46100.00',
          taxes_and_fees: [
            { description: 'Surplus lines tax (4.85%)', amount: '2235.85', earned: false },
            { description: 'Stamping fee (0.075%)', amount: '34.58', earned: false },
            { description: 'Policy fee', amount: '250.00' },
          ],
          minimum_earned: { rate: 0.25 },
          effective_date: '2026-10-15',
          expiration_date: '2027-10-15',
          carrier: { name: 'Scottsdale Insurance Company', naic_code: '41297' },
          coverages: [
            { type: 'general_liability' },
            { type: 'commercial_property', description: 'Commercial Property (Ex-Wind)' },
          ],
          auditable: false,
          document_type: 'binder',
          policy_number: 'CPS7712045',
          metadata: { ams_policy_id: 'POL-889213' },
        },
        {
          premium: '13000.00',
          taxes_and_fees: [{ description: 'Surplus lines tax (4.85%)', amount: '630.50', earned: false }],
          minimum_earned: { rate: 0.25 },
          effective_date: '2026-10-15',
          expiration_date: '2027-10-15',
          carrier: { name: 'Blue Mesa Specialty Insurance Co' },
          coverages: [{ type: 'windstorm', description: 'Named Storm' }],
          document_type: 'quote',
          metadata: { ams_policy_id: 'POL-889214' },
        },
      ],
    }),
  })
  const quote = await res.json()
  ```

  ```python Python theme={null}
  import os
  import uuid
  import requests

  res = requests.post(
      "https://portal.bridgelinepf.com/api/v1/quotes",
      headers={
          "Authorization": f"Bearer {os.environ['BRIDGELINE_API_KEY']}",
          "Idempotency-Key": str(uuid.uuid4()),
      },
      json={
          "broker_email": "maria@lonestarrisk.example",
          "client_reference_id": "EPIC-PROP-2026-0412",
          "metadata": {"ams_account_id": "ACCT-10442"},
          "insured": {
              "name": "Lone Star Fabrication LLC",
              "fein": "74-0000000",
              "address": {
                  "line1": "1200 Industrial Blvd",
                  "city": "Houston",
                  "state": "TX",
                  "postal_code": "77002",
              },
          },
          "policies": [
              {
                  "premium": "46100.00",
                  "taxes_and_fees": [
                      {
                          "description": "Surplus lines tax (4.85%)",
                          "amount": "2235.85",
                          "earned": False,
                      },
                      {
                          "description": "Stamping fee (0.075%)",
                          "amount": "34.58",
                          "earned": False,
                      },
                      {"description": "Policy fee", "amount": "250.00"},
                  ],
                  "minimum_earned": {"rate": 0.25},
                  "effective_date": "2026-10-15",
                  "expiration_date": "2027-10-15",
                  "carrier": {"name": "Scottsdale Insurance Company", "naic_code": "41297"},
                  "coverages": [
                      {"type": "general_liability"},
                      {
                          "type": "commercial_property",
                          "description": "Commercial Property (Ex-Wind)",
                      },
                  ],
                  "auditable": False,
                  "document_type": "binder",
                  "policy_number": "CPS7712045",
                  "metadata": {"ams_policy_id": "POL-889213"},
              },
              {
                  "premium": "13000.00",
                  "taxes_and_fees": [
                      {
                          "description": "Surplus lines tax (4.85%)",
                          "amount": "630.50",
                          "earned": False,
                      },
                  ],
                  "minimum_earned": {"rate": 0.25},
                  "effective_date": "2026-10-15",
                  "expiration_date": "2027-10-15",
                  "carrier": {"name": "Blue Mesa Specialty Insurance Co"},
                  "coverages": [{"type": "windstorm", "description": "Named Storm"}],
                  "document_type": "quote",
                  "metadata": {"ams_policy_id": "POL-889214"},
              },
          ],
      },
      timeout=30,
  )
  quote = res.json()
  ```
</CodeGroup>

What each part does:

<ResponseField name="insured" type="object" required>
  The borrower. `name` (legal name) and `address.state`, the two-letter USPS state code such as `TX`, are required to quote. A full state name such as `Texas` is a `422` (`Use the two-letter state code, e.g. "TX" for Texas.`), and so is any other value that isn't a code (`Must be a two-letter US state code, e.g. "TX".`). A valid code outside Texas still gets a quote, marked [ineligible](/concepts/eligibility#insured-state). `dba`, `fein` and the rest of the address are optional now, but the full address is needed before the deal can bind, so send it if you have it.
</ResponseField>

<ResponseField name="policies[].premium" type="string" required>
  The premium as the binder or quote shows it, excluding taxes and fees, as a decimal string. If you only have the total amount due, send it here with no `taxes_and_fees`; we'll note that assumption.
</ResponseField>

<ResponseField name="policies[].minimum_earned" type="object" required>
  Exactly one of `rate` (a fraction: `0.25` is 25%) or `amount` (the dollar minimum earned premium from the binder). We convert an amount to a rate and tell you so in `assumptions`. If the minimum earned changes during the policy, as hurricane-season windstorm forms do, send the highest one that applies during the loan.
</ResponseField>

<ResponseField name="policies[].taxes_and_fees" type="array">
  Each with an `amount` and optional `description`. Mark `earned: false` for a tax or fee the insured gets back on cancellation, such as surplus lines tax; leave it out and we assume `true`. Every tax and fee is financed either way; `earned` only affects the collateral math.
</ResponseField>

<ResponseField name="policies[].effective_date, expiration_date" type="string" required>
  `YYYY-MM-DD`. Every policy on one loan must share the same dates; mixed dates make the deal ineligible. Financing starts on the effective date, which can be at most 30 days in the past.
</ResponseField>

<ResponseField name="policies[].carrier" type="object" required>
  `name`, plus `naic_code` or `am_best_id` if you have them. We look up the AM Best rating ourselves and return the rating we used and where it came from.
</ResponseField>

<ResponseField name="policies[].coverages" type="array" required>
  The lines the policy covers, from the [coverage types](/guides/coverage-types) list. A package lists each line.
</ResponseField>

<ResponseField name="policies[].document_type, policy_number" type="string">
  Not needed to price. `document_type` is `quote`, `binder` or `policy`. Both feed [binding readiness](/concepts/binding-readiness).
</ResponseField>

<ResponseField name="client_reference_id, metadata" type="string, object">
  Your own ids, returned unchanged on the quote. `metadata` (up to 20 string pairs) also works on each policy. See [your ids](/concepts/conventions#your-ids).
</ResponseField>

<ResponseField name="broker_email" type="string">
  The broker who owns the quote. Leave it out to use the key's default broker. See [acting as a broker](/authentication#acting-as-a-broker).
</ResponseField>

Unknown fields are rejected, with a "did you mean" hint, and every problem in the body comes back in one `422`, so you can fix them all at once. See [`VALIDATION_FAILED`](/errors/VALIDATION_FAILED).

## Read the response

A `201 Created` returns the quote (illustrative figures; 29 of the 30 options removed):

```jsonc 201 Created theme={null}
{
  "id": "qte_2lo4LFk5rf8toDFJM99oES",
  "object": "quote",
  "livemode": true,
  "status": "active",
  "client_reference_id": "EPIC-PROP-2026-0412",
  "metadata": {"ams_account_id": "ACCT-10442"},
  "broker": {"email": "maria@lonestarrisk.example"},
  "created_at": "2026-10-04T15:04:05Z",
  "expires_at": "2026-11-03T15:04:05Z",
  "hosted_url": "https://portal.bridgelinepf.com/q/p98_xZUO2zaltiX49vC59BgOE1EUoRZSpIGtWjFUs0M",
  "selected_option_id": null,
  "interest": null,
  "totals": {
    "premium": "59100.00",
    "taxes_and_fees": "3150.93",
    "total": "62250.93",
    "weighted_minimum_earned_rate": 0.25,
    "financing_start_date": "2026-10-15"
  },
  "policies": [
    {
      "id": "pol_4Hq8Zt2m",
      "total": "48620.43",
      "minimum_earned": {"rate": 0.25},
      "carrier": {
        "name": "Scottsdale Insurance Company",
        "am_best": {"rating": "A+", "source": "am_best"}
      },
      "metadata": {"ams_policy_id": "POL-889213"}
    },
    {
      "id": "pol_9Rk3Wv7c",
      "total": "13630.50",
      "minimum_earned": {"rate": 0.25},
      "carrier": {
        "name": "Blue Mesa Specialty Insurance Co",
        "am_best": {"rating": "A-", "source": "assumed"}
      },
      "metadata": {"ams_policy_id": "POL-889214"}
    }
  ],
  "eligibility": {
    "status": "eligible",
    "checks": [
      {"code": "INPUT_VALID", "passed": true},
      {"code": "INSURED_STATE", "passed": true, "limit": "TX", "actual": "TX"},
      {"code": "PREMIUM_MIN", "passed": true, "limit": "4500.00", "actual": "62250.93"},
      {"code": "PREMIUM_MAX", "passed": true, "limit": "175000.00", "actual": "62250.93"},
      {"code": "AM_BEST_MIN", "passed": true, "limit": "A-", "basis": "partially_assumed"},
      {"code": "ISSUER", "passed": true},
      {"code": "COVERAGE", "passed": true},
      {"code": "POLICY_BACKDATE", "passed": true, "limit": "30 days"},
      {"code": "DATE_UNIFORMITY", "passed": true},
      {"code": "POLICY_TERM", "passed": true, "limit": "3 months", "actual": "12 months"},
      {"code": "MINIMUM_EARNED_MAX", "passed": true, "limit": "90%", "actual": "25.3%"}
    ],
    "reasons": []
  },
  "assumptions": [
    {
      "code": "EARNED_ASSUMED",
      "param": "policies[0].taxes_and_fees[2].earned",
      "message": "Not marked; treated as earned (not refunded on cancellation)."
    },
    {
      "code": "AM_BEST_UNVERIFIED",
      "param": "policies[1].carrier",
      "message": "We couldn't verify this carrier's AM Best rating; assumed A-. Confirm before binding."
    },
    {
      "code": "AUDITABLE_ASSUMED",
      "param": "policies[1].auditable",
      "message": "Not provided; assumed auditable (the conservative choice)."
    }
  ],
  "warnings": [
    {
      "code": "VERIFY_MINIMUM_EARNED",
      "param": "policies[1].minimum_earned",
      "message": "Windstorm policies are often fully earned or carry a hurricane-season MEP. Confirm the MEP before binding."
    }
  ],
  "binding_readiness": {
    "ready": false,
    "issues": [
      {
        "code": "QUOTE_ONLY_DOCUMENT",
        "param": "policies[1].document_type",
        "message": "This is still a quote; binding needs the binder or policy, or an attestation."
      },
      {
        "code": "AM_BEST_UNRESOLVED",
        "param": "policies[1].carrier",
        "message": "The carrier's AM Best rating must be confirmed before binding."
      }
    ]
  },
  "recommended_option_id": "opt_25_10",
  "options": [
    {
      "id": "opt_25_10",
      "down_payment_rate": 0.25,
      "term_months": 10,
      "apr": 0.1185,
      "down_payment": "15562.73",
      "amount_financed": "46688.20",
      "monthly_payment": "4926.21",
      "finance_charge": "2573.90",
      "total_of_payments": "49262.10",
      "total_cost": "64824.83",
      "spread_clamped": false
    }
    // ...29 more options
  ]
}
```

Work through it in this order:

<Steps>
  <Step title="eligibility">
    `status` is `eligible` or `ineligible`. `checks` lists every rule we ran, with its limit, and `reasons` says why an ineligible deal failed. An ineligible quote still returns `201` with no options. See [eligibility](/concepts/eligibility).
  </Step>

  <Step title="assumptions and warnings">
    `assumptions` is everything we filled in, each pointing at the request field (`param`) it concerns. Here: one fee not marked as earned, an unverified carrier rating and an unknown audit status. `warnings` flags things to check before binding, like a windstorm policy's minimum earned. Send the real values and quote again to clear them. See [assumptions](/concepts/assumptions).
  </Step>

  <Step title="options">
    Every down payment and term we can offer. Each option has its own `id`, the APR, and every amount you'd put in front of a client: `down_payment`, `amount_financed`, `monthly_payment`, `finance_charge`, `total_of_payments` and `total_cost`. They add up to the cent: `down_payment + total_of_payments = total_cost`. Show `recommended_option_id` first. To pick one by rule, see [choosing an option in code](/guides/choosing-an-option).
  </Step>

  <Step title="binding_readiness">
    What's still needed before this deal can bind, such as a policy that is still a quote. It doesn't stop you quoting or sharing the link. See [binding readiness](/concepts/binding-readiness).
  </Step>

  <Step title="hosted_url">
    The page your client opens to choose. It's returned only now, so store it. See [the interactive quote](/guides/hosted-quote-page).
  </Step>
</Steps>

The down payments in this example are 15%, 20%, 25%, 30% and 35%. They follow the deal's premium-weighted minimum earned (25% here), not a fixed grid, so a deal with a different minimum earned gets different down payments. That's why you shouldn't hard-code an option id; [choosing an option in code](/guides/choosing-an-option) shows the safe way.

## Good to know

* **A quote is a snapshot.** We price once and store the result; `GET /v1/quotes/{id}` returns it unchanged and never re-prices. To change anything, create a new quote. See [indicative quotes](/concepts/indicative-quotes).
* **Quotes expire** 30 days after they're created (`expires_at`).
* **Comparing alternatives,** such as two carriers for the same risk? Create one quote per alternative and give them the same `client_reference_id`.
* **Policies come back in the order you sent them,** each with an `id` (`pol_...`) and your `metadata`.
* **The quote counts toward your daily quote limit** whatever the outcome, including `422`s. Validate on your side first. See [rate limits](/guides/rate-limits).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.