> ## 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.

# Create a quote

> Prices one or more policies financed together as one loan and returns every down payment × term option we can offer. A deal we cannot finance still returns 201, with eligibility.status "ineligible", its reasons and no options; 422 is only for malformed input. hosted_url is returned only here.

A deal we can't finance is still a `201`: `eligibility.status` is `ineligible`, `eligibility.reasons` says why, and `options` is empty. A `422` means only that the request was malformed, and it lists every problem at once in `details`.

* `hosted_url` is returned **only** in this response (and an idempotent replay of it). Store it, or [get a new one](/api-reference/quotes/hosted-link) later.
* Quotes expire 30 days after they're created. Each call counts toward your [daily quote limits](/guides/rate-limits).
* Guides: [quote in one call](/guides/quote-in-one-call), [choosing an option in code](/guides/choosing-an-option), [coverage types](/guides/coverage-types).

<RequestExample>
  ```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()
  ```
</RequestExample>

<ResponseExample>
  ```jsonc 201 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
    ]
  }
  ```

  ```jsonc 201 ineligible theme={null}
  {
    "id": "qte_2lo4LFk5rf8toDFJVWUIca",
    "object": "quote",
    "livemode": true,
    "status": "active",
    "client_reference_id": null,
    "metadata": {},
    "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": "240000.00",
      "taxes_and_fees": "0.00",
      "total": "240000.00",
      "weighted_minimum_earned_rate": 0.25,
      "financing_start_date": "2026-10-15"
    },
    "policies": [
      {
        "id": "pol_4Hq8Zt2m",
        "total": "240000.00",
        "minimum_earned": {"rate": 0.25},
        "carrier": {
          "name": "Scottsdale Insurance Company",
          "am_best": {"rating": "A+", "source": "am_best"}
        },
        "metadata": {}
      }
    ],
    "eligibility": {
      "status": "ineligible",
      "checks": [
        {"code": "INPUT_VALID", "passed": true},
        {"code": "INSURED_STATE", "passed": true, "limit": "TX", "actual": "TX"},
        {"code": "PREMIUM_MIN", "passed": true, "limit": "4500.00", "actual": "240000.00"},
        {"code": "PREMIUM_MAX", "passed": false, "limit": "175000.00", "actual": "240000.00"},
        {"code": "AM_BEST_MIN", "passed": true, "limit": "A-"},
        {"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%"}
      ],
      "reasons": [
        {
          "code": "PREMIUM_TOO_HIGH",
          "param": "policies",
          "message": "The total to finance ($240000.00) is above the $175000.00 maximum. Contact Bridgeline about larger deals."
        }
      ]
    },
    "assumptions": [
      {
        "code": "TAXES_AND_FEES_NOT_PROVIDED",
        "param": "policies[0].taxes_and_fees",
        "message": "No taxes or fees provided; the amount financed is the premium only."
      },
      {
        "code": "AUDITABLE_ASSUMED",
        "param": "policies[0].auditable",
        "message": "Not provided; assumed auditable (the conservative choice)."
      }
    ],
    "warnings": [],
    "binding_readiness": {
      "ready": false,
      "issues": [
        {
          "code": "DOCUMENT_TYPE_REQUIRED",
          "param": "policies[0].document_type",
          "message": "Say whether this is a quote, binder or policy."
        },
        {
          "code": "MISSING_POLICY_NUMBER",
          "param": "policies[0].policy_number",
          "message": "A real policy number is required before binding."
        },
        {
          "code": "INSURED_ADDRESS_INCOMPLETE",
          "param": "insured.address",
          "message": "The insured's full mailing address is required before binding (statutory notices are mailed to it)."
        }
      ]
    },
    "recommended_option_id": null,
    "options": []
  }
  ```

  ```json 422 theme={null}
  {
    "error": {
      "type": "invalid_request",
      "code": "VALIDATION_FAILED",
      "message": "Invalid request body: policies[0].premium: Send money as a decimal string, e.g. \"46100.00\", not a JSON number. (and 1 more; see details)",
      "param": "policies[0].premium",
      "details": [
        {
          "code": "INVALID_TYPE",
          "param": "policies[0].premium",
          "message": "Send money as a decimal string, e.g. \"46100.00\", not a JSON number."
        },
        {
          "code": "UNKNOWN_FIELD",
          "param": "policies[0].polcy_number",
          "message": "\"polcy_number\" is not a field here. Did you mean \"policy_number\"?"
        }
      ],
      "doc_url": "https://docs.bridgelinepf.com/errors#VALIDATION_FAILED",
      "request_id": "req_8fJ2kQ9xLm4TzW7nB3cY5pDv"
    }
  }
  ```
</ResponseExample>


## OpenAPI

````yaml POST /v1/quotes
openapi: 3.1.0
info:
  title: Bridgeline Public API
  version: '2026-09-23'
  description: >-
    Premium finance quotes and applications for agencies. Authenticate with an
    API key from Agency Portal → API Keys. Scopes: `quotes:read` (Read quotes),
    `quotes:write` (Create quotes), `applications:read` (Read applications),
    `applications:write` (Create and edit applications and policies),
    `agreements:write` (Send and void agreements, attest down payments),
    `loans:read` (Read agreements, loans and payouts), `webhooks:manage` (Manage
    webhook endpoints).
servers:
  - url: https://portal.bridgelinepf.com/api
    description: Production (base URL not final, see D2)
security:
  - bearerAuth: []
paths:
  /v1/quotes:
    post:
      tags:
        - Quotes
      summary: Create a quote
      description: >-
        Prices one or more policies financed together as one loan and returns
        every down payment × term option we can offer. A deal we cannot finance
        still returns 201, with eligibility.status "ineligible", its reasons and
        no options; 422 is only for malformed input. hosted_url is returned only
        here.
      operationId: createQuote
      parameters:
        - name: Bridgeline-Version
          in: header
          required: false
          description: >-
            API version (a date). Defaults to 2026-09-23; echoed on every
            response.
          schema:
            type: string
            pattern: ^\d{4}-\d{2}-\d{2}$
        - name: Idempotency-Key
          in: header
          required: false
          description: >-
            Retrying with the same key and body within 24h replays the original
            response.
          schema:
            type: string
            minLength: 1
            maxLength: 255
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                broker_email:
                  anyOf:
                    - type: string
                      format: email
                      pattern: >-
                        ^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
                    - type: 'null'
                insured:
                  type: object
                  properties:
                    name:
                      type: string
                      maxLength: 500
                    dba:
                      anyOf:
                        - type: string
                          maxLength: 500
                        - type: 'null'
                    fein:
                      anyOf:
                        - type: string
                          maxLength: 500
                        - type: 'null'
                    address:
                      type: object
                      properties:
                        line1:
                          anyOf:
                            - type: string
                              maxLength: 500
                            - type: 'null'
                        line2:
                          anyOf:
                            - type: string
                              maxLength: 500
                            - type: 'null'
                        city:
                          anyOf:
                            - type: string
                              maxLength: 500
                            - type: 'null'
                        state:
                          type: string
                          enum:
                            - AL
                            - AK
                            - AZ
                            - AR
                            - CA
                            - CO
                            - CT
                            - DE
                            - FL
                            - GA
                            - HI
                            - ID
                            - IL
                            - IN
                            - IA
                            - KS
                            - KY
                            - LA
                            - ME
                            - MD
                            - MA
                            - MI
                            - MN
                            - MS
                            - MO
                            - MT
                            - NE
                            - NV
                            - NH
                            - NJ
                            - NM
                            - NY
                            - NC
                            - ND
                            - OH
                            - OK
                            - OR
                            - PA
                            - RI
                            - SC
                            - SD
                            - TN
                            - TX
                            - UT
                            - VT
                            - VA
                            - WA
                            - WV
                            - WI
                            - WY
                            - DC
                            - PR
                            - GU
                            - VI
                            - AS
                            - MP
                          description: Two-letter USPS state code (e.g. `TX`)
                          examples:
                            - TX
                        postal_code:
                          anyOf:
                            - type: string
                              maxLength: 500
                            - type: 'null'
                      required:
                        - state
                      additionalProperties: false
                  required:
                    - name
                    - address
                  additionalProperties: false
                policies:
                  minItems: 1
                  type: array
                  items:
                    type: object
                    properties:
                      premium:
                        type: string
                        pattern: ^\d+(\.\d{1,2})?$
                      taxes_and_fees:
                        anyOf:
                          - maxItems: 50
                            type: array
                            items:
                              type: object
                              properties:
                                description:
                                  anyOf:
                                    - type: string
                                      maxLength: 500
                                    - type: 'null'
                                amount:
                                  type: string
                                  pattern: ^\d+(\.\d{1,2})?$
                                earned:
                                  type:
                                    - boolean
                                    - 'null'
                              required:
                                - amount
                              additionalProperties: false
                          - type: 'null'
                      minimum_earned:
                        type: object
                        properties:
                          rate:
                            type:
                              - number
                              - 'null'
                          amount:
                            anyOf:
                              - type: string
                                pattern: ^\d+(\.\d{1,2})?$
                              - type: 'null'
                        additionalProperties: false
                      effective_date:
                        type: string
                        maxLength: 500
                      expiration_date:
                        type: string
                        maxLength: 500
                      carrier:
                        type: object
                        properties:
                          name:
                            type: string
                            maxLength: 500
                          naic_code:
                            anyOf:
                              - type: string
                                maxLength: 500
                              - type: 'null'
                          am_best_id:
                            anyOf:
                              - type: string
                                maxLength: 500
                              - type: 'null'
                        required:
                          - name
                        additionalProperties: false
                      mga:
                        anyOf:
                          - type: object
                            properties:
                              name:
                                anyOf:
                                  - type: string
                                    maxLength: 500
                                  - type: 'null'
                            additionalProperties: false
                          - type: 'null'
                      coverages:
                        minItems: 1
                        maxItems: 20
                        type: array
                        items:
                          type: object
                          properties:
                            type:
                              type: string
                              maxLength: 500
                            description:
                              anyOf:
                                - type: string
                                  maxLength: 500
                                - type: 'null'
                          required:
                            - type
                          additionalProperties: false
                      auditable:
                        type:
                          - boolean
                          - 'null'
                      document_type:
                        anyOf:
                          - type: string
                            enum:
                              - quote
                              - binder
                              - policy
                          - type: 'null'
                      policy_number:
                        anyOf:
                          - type: string
                            maxLength: 500
                          - type: 'null'
                      metadata:
                        anyOf:
                          - type: object
                            propertyNames:
                              type: string
                            additionalProperties:
                              type: string
                              maxLength: 500
                          - type: 'null'
                    required:
                      - premium
                      - minimum_earned
                      - effective_date
                      - expiration_date
                      - carrier
                      - coverages
                    additionalProperties: false
                client_reference_id:
                  anyOf:
                    - type: string
                      minLength: 1
                      maxLength: 255
                    - type: 'null'
                metadata:
                  anyOf:
                    - type: object
                      propertyNames:
                        type: string
                      additionalProperties:
                        type: string
                        maxLength: 500
                    - type: 'null'
              required:
                - insured
                - policies
              additionalProperties: false
      responses:
        '201':
          description: The quote, eligible or not.
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                    description: qte_…
                  object:
                    type: string
                    const: quote
                  livemode:
                    type: boolean
                  status:
                    type: string
                    enum:
                      - active
                      - interested
                      - expired
                  client_reference_id:
                    type:
                      - string
                      - 'null'
                  metadata:
                    type: object
                    propertyNames:
                      type: string
                    additionalProperties:
                      type: string
                  broker:
                    anyOf:
                      - type: object
                        properties:
                          email:
                            type: string
                        required:
                          - email
                      - type: 'null'
                  created_at:
                    type: string
                  expires_at:
                    type: string
                  hosted_url:
                    description: Returned when the quote is created; null when retrieved.
                    type:
                      - string
                      - 'null'
                  selected_option_id:
                    type:
                      - string
                      - 'null'
                  interest:
                    anyOf:
                      - type: object
                        properties:
                          option_id:
                            type: string
                            description: >-
                              The option the insured picked (opt_…); the same as
                              selected_option_id.
                          note:
                            description: >-
                              The insured's optional note to the broker (at most
                              500 characters); null when left blank. Untrusted
                              text typed on a public page: escape it before
                              rendering.
                            type:
                              - string
                              - 'null'
                          submitted_at:
                            type: string
                            description: When the insured tapped I'm interested.
                          broker_notification:
                            type: object
                            properties:
                              status:
                                type: string
                                enum:
                                  - pending
                                  - sent
                                  - skipped
                                  - failed
                                description: >-
                                  pending until we have tried to email the
                                  agency; then sent, skipped (nothing was sent;
                                  see reason) or failed.
                              reason:
                                anyOf:
                                  - type: string
                                    enum:
                                      - demo_agency
                                      - test_mode
                                      - no_recipient
                                      - email_disabled
                                      - send_failed
                                  - type: 'null'
                                description: >-
                                  Why nothing was sent; null when pending or
                                  sent. demo_agency: a demo agency, where we
                                  email only internal Bridgeline addresses, and
                                  none applied. test_mode: a test-mode
                                  (bl_test_) quote, which never emails anyone.
                                  no_recipient: the agency has no active broker
                                  or admin to email. email_disabled: email
                                  delivery is switched off in this environment.
                                  send_failed: the email could not be sent, and
                                  Bridgeline ops were alerted.
                              recipient:
                                anyOf:
                                  - type: string
                                    enum:
                                      - broker
                                      - agency_admins
                                  - type: 'null'
                                description: >-
                                  Who we emailed: the quote's broker, or the
                                  agency's admins when that broker is no longer
                                  active. null when nobody was chosen.
                              recipients:
                                type: array
                                items:
                                  type: string
                                description: >-
                                  The agency staff email addresses the
                                  notification was actually sent to. Empty for a
                                  broker-scoped key when the email went to the
                                  agency's admins.
                              at:
                                description: >-
                                  When the outcome was recorded; null while
                                  pending.
                                type:
                                  - string
                                  - 'null'
                            required:
                              - status
                              - reason
                              - recipient
                              - recipients
                              - at
                            description: Whether we emailed the agency about this interest.
                        required:
                          - option_id
                          - note
                          - submitted_at
                          - broker_notification
                      - type: 'null'
                    description: >-
                      The insured's response on the hosted page; null unless
                      status is interested. This object is also the payload the
                      Phase 3 quote.interest_expressed webhook will reuse.
                  totals:
                    type: object
                    properties:
                      premium:
                        type: string
                        pattern: ^\d+\.\d{2}$
                        description: US dollars, a decimal string with two decimal places.
                      taxes_and_fees:
                        type: string
                        pattern: ^\d+\.\d{2}$
                        description: US dollars, a decimal string with two decimal places.
                      total:
                        type: string
                        pattern: ^\d+\.\d{2}$
                        description: US dollars, a decimal string with two decimal places.
                      weighted_minimum_earned_rate:
                        type: number
                        description: 'A fraction: 0.25 means 25%.'
                      financing_start_date:
                        type:
                          - string
                          - 'null'
                    required:
                      - premium
                      - taxes_and_fees
                      - total
                      - weighted_minimum_earned_rate
                      - financing_start_date
                  policies:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                        total:
                          type: string
                          pattern: ^\d+\.\d{2}$
                          description: Premium plus all taxes and fees.
                        minimum_earned:
                          type: object
                          properties:
                            rate:
                              anyOf:
                                - type: number
                                  description: 'A fraction: 0.25 means 25%.'
                                - type: 'null'
                              description: The minimum earned rate we used.
                          required:
                            - rate
                        carrier:
                          type: object
                          properties:
                            name:
                              type:
                                - string
                                - 'null'
                            am_best:
                              type: object
                              properties:
                                rating:
                                  type: string
                                source:
                                  type: string
                                  enum:
                                    - am_best
                                    - broker
                                    - document
                                    - assumed
                              required:
                                - rating
                                - source
                          required:
                            - name
                            - am_best
                        metadata:
                          type: object
                          propertyNames:
                            type: string
                          additionalProperties:
                            type: string
                      required:
                        - id
                        - total
                        - minimum_earned
                        - carrier
                        - metadata
                  eligibility:
                    type: object
                    properties:
                      status:
                        type: string
                        enum:
                          - eligible
                          - ineligible
                      checks:
                        type: array
                        items:
                          type: object
                          properties:
                            code:
                              type: string
                            passed:
                              type: boolean
                            limit:
                              type: string
                            actual:
                              type: string
                            basis:
                              type: string
                              enum:
                                - partially_assumed
                            param:
                              type: string
                          required:
                            - code
                            - passed
                      reasons:
                        type: array
                        items:
                          type: object
                          properties:
                            code:
                              type: string
                            param:
                              type: string
                              description: >-
                                The request path this refers to, e.g.
                                policies[1].auditable.
                            message:
                              type: string
                          required:
                            - code
                            - param
                            - message
                        description: Why the deal is ineligible; empty when eligible.
                    required:
                      - status
                      - checks
                      - reasons
                  assumptions:
                    type: array
                    items:
                      type: object
                      properties:
                        code:
                          type: string
                        param:
                          type: string
                          description: >-
                            The request path this refers to, e.g.
                            policies[1].auditable.
                        message:
                          type: string
                      required:
                        - code
                        - param
                        - message
                  warnings:
                    type: array
                    items:
                      type: object
                      properties:
                        code:
                          type: string
                        param:
                          type: string
                          description: >-
                            The request path this refers to, e.g.
                            policies[1].auditable.
                        message:
                          type: string
                      required:
                        - code
                        - param
                        - message
                  binding_readiness:
                    type: object
                    properties:
                      ready:
                        type: boolean
                      issues:
                        type: array
                        items:
                          type: object
                          properties:
                            code:
                              type: string
                            param:
                              type: string
                              description: >-
                                The request path this refers to, e.g.
                                policies[1].auditable.
                            message:
                              type: string
                          required:
                            - code
                            - param
                            - message
                    required:
                      - ready
                      - issues
                  recommended_option_id:
                    type:
                      - string
                      - 'null'
                  options:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          description: >-
                            opt_<down payment percent>_<term months>, e.g.
                            opt_25_10.
                        down_payment_rate:
                          type: number
                          description: 'A fraction: 0.25 means 25%.'
                        term_months:
                          type: integer
                          minimum: -9007199254740991
                          maximum: 9007199254740991
                        apr:
                          type: number
                          description: 'A fraction: 0.25 means 25%.'
                        down_payment:
                          type: string
                          pattern: ^\d+\.\d{2}$
                          description: >-
                            US dollars, a decimal string with two decimal
                            places.
                        amount_financed:
                          type: string
                          pattern: ^\d+\.\d{2}$
                          description: >-
                            US dollars, a decimal string with two decimal
                            places.
                        monthly_payment:
                          type: string
                          pattern: ^\d+\.\d{2}$
                          description: >-
                            US dollars, a decimal string with two decimal
                            places.
                        finance_charge:
                          type: string
                          pattern: ^\d+\.\d{2}$
                          description: >-
                            US dollars, a decimal string with two decimal
                            places.
                        total_of_payments:
                          type: string
                          pattern: ^\d+\.\d{2}$
                          description: >-
                            US dollars, a decimal string with two decimal
                            places.
                        total_cost:
                          type: string
                          pattern: ^\d+\.\d{2}$
                          description: >-
                            US dollars, a decimal string with two decimal
                            places.
                        spread_clamped:
                          type: boolean
                          description: >-
                            True when the agency's spread was reduced to keep
                            this option under the APR limit.
                      required:
                        - id
                        - down_payment_rate
                        - term_months
                        - apr
                        - down_payment
                        - amount_financed
                        - monthly_payment
                        - finance_charge
                        - total_of_payments
                        - total_cost
                        - spread_clamped
                required:
                  - id
                  - object
                  - livemode
                  - status
                  - client_reference_id
                  - metadata
                  - broker
                  - created_at
                  - expires_at
                  - hosted_url
                  - selected_option_id
                  - interest
                  - totals
                  - policies
                  - eligibility
                  - assumptions
                  - warnings
                  - binding_readiness
                  - recommended_option_id
                  - options
                description: 'An indicative quote: a stored snapshot, not a price lock.'
        '400':
          description: Malformed request (bad JSON, version or header).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing, invalid, revoked or expired API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: >-
            API access not enabled for this agency (API_ACCESS_NOT_ENABLED for a
            live key, TEST_MODE_NOT_ENABLED for a test key), missing scope, or
            the acting broker is not active.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: Idempotency-Key reused with a different request, or still in flight.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: Validation failed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limited. See Retry-After.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal error. Safe to retry with the same Idempotency-Key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: >-
            Temporarily unable to serve the request (e.g. pricing inputs
            unavailable). Retry later.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - bearerAuth: []
components:
  schemas:
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - type
            - code
            - message
            - doc_url
            - request_id
          properties:
            type:
              type: string
              enum:
                - invalid_request
                - authentication
                - permission
                - not_found
                - conflict
                - rate_limit
                - api_error
            code:
              type: string
              description: >-
                Stable, machine-readable error code. Branch on this, never on
                `message`.
              examples:
                - INVALID_REQUEST
                - INVALID_JSON
                - INVALID_API_VERSION
                - INVALID_PAGINATION
                - IDEMPOTENCY_KEY_REQUIRED
                - IDEMPOTENCY_KEY_INVALID
                - VALIDATION_FAILED
                - INVALID_API_KEY
                - KEY_REVOKED
                - KEY_EXPIRED
                - MISSING_SCOPE
                - BROKER_NOT_ACTIVE
                - DEFAULT_BROKER_INACTIVE
                - ACTING_BROKER_NOT_ALLOWED
                - API_ACCESS_NOT_ENABLED
                - TEST_MODE_NOT_ENABLED
                - TEST_MODE_ONLY
                - NOT_FOUND
                - METHOD_NOT_ALLOWED
                - IDEMPOTENCY_KEY_REUSED
                - IDEMPOTENCY_REQUEST_IN_PROGRESS
                - QUOTE_EXPIRED
                - QUOTE_ALREADY_INTERESTED
                - RATE_LIMITED
                - INTERNAL
                - IDEMPOTENCY_RECORD_LOST
                - SERVICE_UNAVAILABLE
            message:
              type: string
            param:
              type: string
            details:
              type: array
              items:
                type: object
                required:
                  - code
                  - message
                properties:
                  code:
                    type: string
                  message:
                    type: string
                  param:
                    type: string
            doc_url:
              type: string
              format: uri
            request_id:
              type: string
              pattern: ^req_
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: bl_live_… or bl_test_… API key.

````

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