{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/coveragecat-com/json-schema/coveragecat-com-homeowners-quotes-request-schema.json",
  "title": "HomeownersQuotesRequest",
  "x-generated": "2026-11-04",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/coveragecat-com-agent-openapi.yml#/components/schemas/HomeownersQuotesRequest",
  "additionalProperties": false,
  "properties": {
    "contact_preferences": {
      "additionalProperties": false,
      "description": "Optional service SMS/call choices. Offer alongside an existing review when useful; do not add a required purchase step. Omission leaves choices unchanged. Marketing is disabled.",
      "properties": {
        "service_call": {
          "additionalProperties": false,
          "description": "Optional service contact choice for the phone number already on file; never a purchase requirement or marketing authorization.",
          "properties": {
            "answer": {
              "description": "The customer's own Yes, No or Revoke answer to the corresponding service disclosure.",
              "enum": [
                "Yes",
                "No",
                "Revoke"
              ],
              "type": "string"
            },
            "collected_from_user": {
              "const": true,
              "description": "The customer personally answered this service contact question.",
              "type": "boolean"
            },
            "disclosure_hash": {
              "description": "text_hash from the corresponding contact_preferences_disclosures entry.",
              "type": "string"
            },
            "disclosure_version": {
              "description": "Version from the corresponding contact_preferences_disclosures entry.",
              "type": "string"
            },
            "presentation_reference": {
              "description": "Optional opaque conversation or message reference; do not include message contents or personal information.",
              "maxLength": 200,
              "type": "string"
            },
            "presented_at": {
              "description": "RFC 3339 timestamp from the assistant runtime for when the complete disclosure was shown. It must be within the prior 24 hours and no more than five minutes in the future.",
              "format": "date-time",
              "type": "string"
            },
            "shown_to_user": {
              "const": true,
              "description": "Attests that the complete returned disclosure text was presented verbatim before the shopper answered.",
              "type": "boolean"
            }
          },
          "required": [
            "answer",
            "collected_from_user",
            "shown_to_user",
            "disclosure_version",
            "disclosure_hash",
            "presented_at"
          ],
          "type": "object"
        },
        "service_sms": {
          "additionalProperties": false,
          "description": "Optional service contact choice for the phone number already on file; never a purchase requirement or marketing authorization.",
          "properties": {
            "answer": {
              "description": "The customer's own Yes, No or Revoke answer to the corresponding service disclosure.",
              "enum": [
                "Yes",
                "No",
                "Revoke"
              ],
              "type": "string"
            },
            "collected_from_user": {
              "const": true,
              "description": "The customer personally answered this service contact question.",
              "type": "boolean"
            },
            "disclosure_hash": {
              "description": "text_hash from the corresponding contact_preferences_disclosures entry.",
              "type": "string"
            },
            "disclosure_version": {
              "description": "Version from the corresponding contact_preferences_disclosures entry.",
              "type": "string"
            },
            "presentation_reference": {
              "description": "Optional opaque conversation or message reference; do not include message contents or personal information.",
              "maxLength": 200,
              "type": "string"
            },
            "presented_at": {
              "description": "RFC 3339 timestamp from the assistant runtime for when the complete disclosure was shown. It must be within the prior 24 hours and no more than five minutes in the future.",
              "format": "date-time",
              "type": "string"
            },
            "shown_to_user": {
              "const": true,
              "description": "Attests that the complete returned disclosure text was presented verbatim before the shopper answered.",
              "type": "boolean"
            }
          },
          "required": [
            "answer",
            "collected_from_user",
            "shown_to_user",
            "disclosure_version",
            "disclosure_hash",
            "presented_at"
          ],
          "type": "object"
        }
      },
      "type": "object"
    },
    "credit_consent": {
      "additionalProperties": false,
      "description": "The real user's response to Coverage Cat's current consumer-report authorization for insurance underwriting, collected only after Coverage Cat returns the disclosure.",
      "properties": {
        "answer": {
          "description": "Records the shopper's own Yes, No or Revoke reply. Preserve declines and revocations; never infer or convert another answer into Yes.",
          "enum": [
            "Yes",
            "No",
            "Revoke"
          ],
          "type": "string"
        },
        "collected_from_user": {
          "const": true,
          "description": "Attests that the shopper personally answered the displayed authorization in this conversation, rather than the agent assuming their response.",
          "type": "boolean"
        },
        "disclosure_hash": {
          "description": "The text_hash from credit_consent_disclosure.",
          "type": "string"
        },
        "disclosure_version": {
          "description": "The version from credit_consent_disclosure.",
          "type": "string"
        },
        "presentation_reference": {
          "description": "Optional opaque conversation or message reference; do not include message contents or personal information.",
          "maxLength": 200,
          "type": "string"
        },
        "presented_at": {
          "description": "RFC 3339 timestamp from the assistant runtime for when the complete disclosure was shown. It must be within the prior 24 hours and no more than five minutes in the future.",
          "format": "date-time",
          "type": "string"
        },
        "shown_to_user": {
          "const": true,
          "description": "Attests that the complete returned disclosure text was presented verbatim before the shopper answered.",
          "type": "boolean"
        }
      },
      "required": [
        "answer",
        "collected_from_user",
        "shown_to_user",
        "disclosure_version",
        "disclosure_hash",
        "presented_at"
      ],
      "type": "object"
    },
    "intake": {
      "additionalProperties": true,
      "description": "Partial homeowners intake patch containing the fullest currently known applicant and property facts you can assemble from approved operator-side context. On the first create call, `intake.home` must already identify whether each property is standard homeowners, condo, or landlord coverage: send both a non-rental `home_ownership` and a non-condo `property_type` for standard homeowners, `property_type: condo` for condo coverage, or `home_ownership: owned_rental` / a rented `rental_status` for landlord coverage. Coverage Cat rejects the first create call instead of guessing if that product-selection row is missing. This endpoint accepts partial follow-up patches after create; for a given intake's live requiredness, treat the returned `schema` and `missing_fields[].enum` as authoritative. Common eventual base requirements include `home_sqft`, `new_purchase`, the property address, `home_ownership`, and `property_type`, with state- and property-specific follow-ups returned in `missing_fields`. For any non-user-confirmed home value you include under `intake.home[]`, also include a matching `intake.home[].field_estimates[]` row using the same object shape returned in responses. Those rows should mirror the current field value, carry an opaque provenance `source`, set `confirmed_by_user: false`, and include `estimated_at`; Coverage Cat will persist that value as an estimate and send the homeowner back through review before final bind in the consumer portal. After the homeowner reviews the assembled application, display the complete returned `credit_consent_disclosure.text` verbatim and send the resulting top-level `credit_consent` receipt with the shopper's answer, display and collection attestations, and that disclosure's version and hash. A raw authorization boolean is not consent evidence. Do NOT derive homeowners dwelling replacement cost from purchase price or appraised value — that field must come from a Replacement Cost Estimator or be left for Coverage Cat's carrier-side estimator to fill. Do NOT send lender-side fields (note_rate, term_months, escrow flags); Coverage Cat prices homeowners premium directly and those inputs have no effect on the intake. Optional mortgage metadata such as `intake.home[].loans[].lender_name`, `loan_number`, `mortgagee_clause`, and `loan_effective_date` may be sent when available; partial loan rows are accepted. For enum/list fields, treat the `schema` and `missing_fields[].enum` returned by this endpoint as the authoritative allowed vocabulary for the current intake state.\n",
      "properties": {
        "home": {
          "description": "Initial product-selection row for the first create call. Send a single object or an array, and make sure each home row already distinguishes standard homeowners, condo, or landlord coverage. Later update or poll calls may omit `home` when unchanged.\n",
          "oneOf": [
            {
              "$ref": "#/$defs/ConsumerHomeownersInitialHome"
            },
            {
              "items": {
                "$ref": "#/$defs/ConsumerHomeownersInitialHome"
              },
              "minItems": 1,
              "type": "array"
            }
          ]
        }
      },
      "type": "object"
    },
    "sandbox": {
      "description": "Optional mocked-mode flag for delegated homeowners testing. Set this to true only when creating a brand-new delegated homeowners session. The sandbox flag sticks to that `uid`, reuses the real validation and one-time review/credit-consent checkpoint, skips live customer emails and carrier traffic, returns `pending_quotes` after the first successful submit, and returns mocked homeowners offers on a later poll of the same `uid`.\n",
      "type": "boolean"
    },
    "uid": {
      "description": "Existing delegated homeowners intake identifier. Omit to create a new intake.",
      "type": "string"
    }
  },
  "type": "object",
  "$defs": {
    "ConsumerHomeownersInitialHome": {
      "additionalProperties": true,
      "anyOf": [
        {
          "description": "Standard homeowners coverage. Send both a non-rental home_ownership and a non-condo property_type.",
          "properties": {
            "home_ownership": {
              "enum": [
                "owned_primary",
                "owned_seasonal",
                "under_construction"
              ],
              "type": "string"
            },
            "property_type": {
              "enum": [
                "single_family",
                "duplex",
                "triplex",
                "quadplex",
                "apartment",
                "townhouse",
                "manufacture_or_mobile"
              ],
              "type": "string"
            }
          },
          "required": [
            "home_ownership",
            "property_type"
          ],
          "type": "object"
        },
        {
          "description": "Condo coverage. Send property_type: condo.",
          "properties": {
            "property_type": {
              "const": "condo",
              "type": "string"
            }
          },
          "required": [
            "property_type"
          ],
          "type": "object"
        },
        {
          "description": "Landlord coverage. Send home_ownership: owned_rental.",
          "properties": {
            "home_ownership": {
              "const": "owned_rental",
              "type": "string"
            }
          },
          "required": [
            "home_ownership"
          ],
          "type": "object"
        },
        {
          "description": "Landlord coverage. A rented rental_status also counts when home_ownership is not yet known.",
          "properties": {
            "rental_status": {
              "enum": [
                "room",
                "attached_unit",
                "detached_unit"
              ],
              "type": "string"
            }
          },
          "required": [
            "rental_status"
          ],
          "type": "object"
        }
      ],
      "description": "Initial homeowners home row. Coverage Cat needs this row to distinguish standard homeowners, condo, or landlord coverage before it can assemble the rest of the application.",
      "type": "object"
    }
  }
}