---
components:
  headers:
    CoverageCatApiVersion:
      description: The Coverage Cat agent API version used to serve this response.
      schema:
        enum:
          - v1
        type: string
    Location:
      description: Absolute URL where the async delegated-homeowners job can be polled safely.
      schema:
        format: uri
        type: string
    RateLimitLimit:
      description: Maximum requests allowed in the current window.
      schema:
        type: integer
    RateLimitPolicy:
      description: Human-readable rate-limit policy for the current bucket.
      schema:
        type: string
    RateLimitRemaining:
      description: Requests remaining in the current window.
      schema:
        type: integer
    RateLimitReset:
      description: Seconds until the current rate-limit window resets.
      schema:
        type: integer
    RetryAfter:
      description: Seconds to wait before retrying a rate-limited request.
      schema:
        type: integer
    SkillVersion:
      description: Published Coverage Cat runtime-contract version for this response surface.
      schema:
        example: 1.0.0
        type: string
  parameters:
    CoverageCatApiVersion:
      description: Optional explicit Coverage Cat API version selector. Omit the header to use the current stable version.
      in: header
      name: Coverage-Cat-API-Version
      required: false
      schema:
        default: v1
        enum:
          - v1
        type: string
    DashboardCursor:
      description: Opaque cursor returned by a prior homeowners dashboard response.
      in: query
      name: cursor
      required: false
      schema:
        type: string
    IdempotencyKey:
      description: Optional idempotency key for consumer or operator write requests. Coverage Cat replays the cached successful response for the same subject, path, and key for 24 hours, and rejects a changed payload under the same key.
      in: header
      name: Idempotency-Key
      required: false
      schema:
        type: string
    IntakeUid:
      description: Coverage Cat intake uid returned by the consumer-prefill or intake creation step.
      in: path
      name: uid
      required: true
      schema:
        type: string
  schemas:
    ToolBatchResult:
      properties:
        error:
          $ref: '#/components/schemas/ToolBatchError'
        id:
          type: string
        result:
          additionalProperties: true
          type: object
        status:
          enum:
            - ok
            - error
          type: string
        tool:
          enum:
            - home_calculator
            - umbrella_calculator
            - auto_estimates
            - collision_and_comprehensive_coverage
            - file_a_claim
            - homeowners_agent_finder
            - umbrella_limit_planner
            - umbrella_underlying_limit_check
            - umbrella_bundle_comparison
          type: string
      type: object
    ConsumerPolicyServiceRequest:
      additionalProperties: false
      oneOf:
        - properties:
            request_type:
              const: policy_cancellation
              type: string
          required:
            - request_type
            - reason
            - requested_effective_date
        - properties:
            request_type:
              const: refund_request
              type: string
          required:
            - request_type
            - reason
        - properties:
            request_type:
              const: support_case
              type: string
          required:
            - request_type
            - reason
      properties:
        confirm_request:
          description: Whether to open the request now. false, the default, returns a preview of the consequences without opening anything; send true only after the shopper approves that preview.
          type: boolean
        details:
          description: Shopper-approved context beyond the short reason, such as the specifics of a billing dispute, recorded on the request and its preview.
          type: string
        reason:
          description: Short shopper-approved reason for the request.
          type: string
        request_type:
          description: What the shopper wants done after purchase. `policy_cancellation` asks the carrier to end the policy on requested_effective_date; `refund_request` asks the carrier or billing provider to review a refund or outstanding balance without changing coverage; `support_case` opens a general support case for anything else.
          enum:
            - policy_cancellation
            - refund_request
            - support_case
          type: string
        requested_effective_date:
          description: 'Day the shopper wants a cancellation to take effect; used only for policy_cancellation. It is a request: the carrier reviews it and may set a different date.'
          format: date
          type: string
      required:
        - request_type
        - reason
      type: object
    BindResponse:
      properties:
        agent_instructions:
          items:
            type: string
          type: array
        next_action:
          $ref: '#/components/schemas/NextAction'
        next_question:
          $ref: '#/components/schemas/NextQuestion'
        offers_url:
          description: Secure link to the Coverage Cat offers page for this delegated session.
          format: uri
          type: string
        payment_url:
          description: Secure payment-setup link, returned only when Coverage Cat is ready to collect payment.
          format: uri
          type: string
        post_choose:
          additionalProperties: true
          type: object
        required_upload_types:
          items:
            enum:
              - declarations
              - auto_declarations
            type: string
          type: array
        response_summary:
          type: string
        selected_offer:
          $ref: '#/components/schemas/OfferSnapshot'
        status:
          enum:
            - needs_more_info_to_bind
            - ready_to_finalize
            - documents_needed
            - documents_pending_review
            - payment_needed
            - chosen
          type: string
        uid:
          type: string
      type: object
    UmbrellaFieldEstimate:
      description: |
        One umbrella field whose current value is still estimated rather than directly user-confirmed. Use `review_path` to mark the same value in the `review` JSON when rendering the single review page.
      properties:
        confidence:
          enum:
            - low
            - medium
            - high
          type: string
        confirmed_by_user:
          description: Whether a later draft update re-sent the same value as a confirmed answer.
          type: boolean
        estimated_at:
          format: date-time
          type: string
        field:
          description: Intake dot-path for the estimated answer.
          type: string
        review_path:
          description: Path to the same value inside the `review` object.
          items:
            type: string
          type: array
        source:
          description: Provenance label for the estimate.
          type: string
        value:
          description: Current serialized intake value for the estimated field.
          type: string
      type: object
    DraftRequest:
      additionalProperties: false
      properties:
        field_estimates:
          description: |
            Optional provenance rows for non-user-confirmed answers you included in the same `intake` payload, including values sourced from CRM, documents, email threads, or heuristics. Omit this only for values the human has directly confirmed. Coverage Cat may also add its own `historical_mode` estimates when it safely auto-prefills common umbrella defaults.
          items:
            $ref: '#/components/schemas/UmbrellaFieldEstimateInput'
          type: array
        intake:
          additionalProperties: true
          description: |
            Partial umbrella intake patch. Prefer sending the fullest context-backed application you can assemble from CRM, email threads, document drives, OCR'd policy files, and prior Coverage Cat sessions. Send only changed fields on follow-up calls instead of resubmitting the full application. Accepted aliases: `birthday -> age`, `spouse_birthday -> spouse_age`, `approximate_asset_value -> net_worth_numeric`. Send birthdays to Coverage Cat as ISO dates; if the shopper replies in normal US `MM-DD-YYYY` form, normalize it to ISO before sending. Do not send raw integer ages. Common keys include `full_name`, `email`, `phone_number`, `age`, `marital_status`, `license_status`, `license_state`, `license_number`, `address`, `occupation`, `line_of_work`, `net_worth_numeric`, `additional_drivers`, `household_members`, `auto_has_insurance`, `coverage_e_for_residences`, `has_citizens_home_coverage`, and `umbrella_details`.
          type: object
        sandbox:
          description: |
            Optional mocked-mode flag for delegated umbrella testing. Set this to true only when creating a brand-new delegated umbrella session. The sandbox flag sticks to that `uid`, reuses the real draft/review validation loop, returns mocked quote responses, and does not send live customer emails or carrier traffic.
          type: boolean
        uid:
          description: Existing delegated umbrella session identifier. Omit to create a new one.
          type: string
      type: object
    ErrorResponse:
      additionalProperties: true
      properties:
        error:
          description: Stable machine-readable error code. Workflow clients should branch mainly on invalid_request, not_found, conflict, rate_limited, stale_token, sandbox_unsupported, and internal_error.
          enum:
            - invalid_request
            - not_found
            - conflict
            - rate_limited
            - idempotency_conflict
            - stale_token
            - sandbox_unsupported
            - credit_consent_required
            - internal_error
            - unauthorized
            - forbidden
            - key_expired
            - too_many_attempts
            - tool_not_found
            - tool_rate_limited
            - unsupported_api_version
            - invalid_email
            - invalid_otp
            - invalid_json
            - request_too_large
            - invalid_request_signature
          type: string
        message:
          description: Human-readable explanation of the failure.
          type: string
      type: object
    AgentOffer:
      properties:
        annual_price:
          type: integer
        carrier:
          type: string
        choice_guidance:
          type: string
        coverage_limit:
          type: string
        display_notes:
          items:
            type: string
          type: array
        is_estimate:
          type: boolean
        price_range:
          properties:
            high:
              type: integer
            low:
              type: integer
          type:
            - object
            - 'null'
        rank:
          type: integer
        recommended:
          type: boolean
        sample_policy_url:
          description: Public specimen-policy PDF for this carrier in the shopper's state, when Coverage Cat has one on file.
          format: uri
          type: string
        selection_token:
          type: string
      type: object
    UmbrellaPendingField:
      properties:
        estimated:
          description: Whether `suggested_values` currently includes a fallback prior for this field.
          type: boolean
        field:
          type: string
        label:
          type: string
        number:
          type: integer
      type: object
    NextQuestion:
      properties:
        display_note:
          type: string
        fields:
          items:
            $ref: '#/components/schemas/QuestionField'
          type: array
        item_index:
          type:
            - integer
            - 'null'
        prompt:
          type: string
        schema:
          additionalProperties: true
          type: object
        scope:
          type: string
        title:
          type: string
      type: object
    HomeownersDashboardResponse:
      properties:
        filters:
          additionalProperties: true
          type: object
        generated_at:
          type: string
        has_more:
          description: True when another dashboard page is available with the returned next_cursor.
          type: boolean
        next_cursor:
          description: Opaque cursor to request the next dashboard page.
          type: string
        operator_uid:
          type: string
        properties:
          items:
            $ref: '#/components/schemas/HomeownersPropertyStatusRow'
          type: array
        property_count:
          type: integer
        status_counts:
          additionalProperties: true
          type: object
      type: object
    ConsumerOfferSummary:
      properties:
        cheapest_annual_premium:
          type: number
        cheapest_carrier:
          type: string
        quote_count:
          type: integer
        recommended_annual_premium:
          type: number
        recommended_carrier:
          type: string
      type: object
    ConsumerUmbrellaBindRequest:
      additionalProperties: false
      properties:
        intake:
          additionalProperties: true
          description: Minimal patch answering only the current bind-stage next_question fields.
          type: object
      type: object
    AgentKeyResponse:
      properties:
        api_key:
          type: string
        expires_at:
          format: date-time
          type: string
        key_prefix:
          type: string
        message:
          type: string
        status:
          type: string
      type: object
    ConsumerStatusResponse:
      properties:
        detail_status:
          type: string
        line:
          enum:
            - umbrella
            - homeowners
          type: string
        offer_summary:
          $ref: '#/components/schemas/ConsumerOfferSummary'
        response_summary:
          type: string
        sandbox:
          type: boolean
        status:
          enum:
            - in_review
            - review_pending
            - credit_consent_pending
            - quoted
            - bound
            - abandoned
          type: string
      type: object
    UmbrellaCalculatorRequest:
      additionalProperties: false
      properties:
        antique_vehicles:
          default: 0
          type: integer
        at_fault_accidents:
          default: 0
          type: integer
        auto_count:
          default: 1
          type: integer
        drivers_over_70:
          default: 0
          type: integer
        drivers_under_22:
          default: 0
          type: integer
        jet_skis:
          default: 0
          type: integer
        large_watercraft:
          default: 0
          type: integer
        motorcycles:
          default: 0
          type: integer
        moving_violations:
          default: 0
          type: integer
        property_count:
          default: 1
          type: integer
        zip:
          pattern: ^[0-9]{5}$
          type: string
      required:
        - zip
      type: object
    QuoteRequest:
      additionalProperties: false
      properties:
        review_confirmed:
          const: true
          type: boolean
        review_token:
          description: Token returned from the latest ready_for_review draft response.
          type: string
        sandbox:
          description: |
            Optional mocked-mode flag. Once a delegated umbrella session is created with `sandbox: true`, later `quotes` and `status` calls may omit it because the uid stays sandbox-scoped.
          type: boolean
        uid:
          type: string
      required:
        - uid
        - review_token
        - review_confirmed
      type: object
    NextAction:
      properties:
        display_note:
          type: string
        type:
          enum:
            - bind
          type: string
      type: object
    IntakeAssistantResponse:
      additionalProperties: false
      description: REST consumer follow-up payload for the `/api/intake/{uid}` surface.
      properties:
        post_choose:
          additionalProperties: true
          description: Structured post-choose state after a quoted umbrella offer is selected.
          type: object
        next_action:
          additionalProperties: true
          description: A structured hint for the next allowed tool or endpoint action.
          type: object
        required_upload_types:
          items:
            type: string
          type: array
        service_preview:
          additionalProperties: false
          properties:
            action_summary:
              type: string
            approval_required:
              type: boolean
            billing_effect:
              type: string
            carrier_conditions:
              items:
                type: string
              type: array
            coverage_effect:
              type: string
            details:
              type: string
            estimated_refund_status:
              enum:
                - not_applicable
                - unknown_pending_review
              type: string
            reason:
              type: string
            request_type:
              enum:
                - policy_cancellation
                - refund_request
                - support_case
              type: string
            requested_effective_date:
              format: date
              type: string
            status:
              enum:
                - preview
              type: string
            uncertainty:
              type: string
          type: object
        credit_consent_question:
          type: string
        detail_status:
          enum:
            - abandoned
            - blocked
            - bound
            - cancelled
            - chosen
            - credit_consent_pending
            - credit_consent_required
            - dev_success
            - documents_needed
            - documents_pending_review
            - email_sent
            - in_review
            - ineligible
            - info_requested
            - needs_more_info
            - needs_more_info_to_bind
            - no_policy
            - no_chosen_offer
            - no_quotes
            - no_selection
            - ok
            - payment_collection_ready
            - payment_needed
            - pending
            - pending_quotes
            - queued
            - quote_rate_limited
            - quoted
            - ready_for_review
            - ready_for_submission
            - ready_to_finalize
            - review_pending
            - service_preview
            - service_requested
            - sandbox_unsupported
            - stale_selection
            - verifying_documents
            - waiting_on_carrier
            - waiting_on_documents
            - waiting_on_payment
          type: string
        expires_at:
          description: When the current consumer handoff expires.
          format: date-time
          type: string
        selected_offer:
          additionalProperties: false
          properties:
            address:
              additionalProperties: false
              properties:
                city:
                  type: string
                state:
                  type: string
                street:
                  type: string
                zip:
                  type: string
              type: object
            annual_price:
              type: number
            carrier:
              type: string
            coverage_limit:
              type: string
            coverage_summary:
              additionalProperties: true
              description: Homeowners or umbrella coverage details Coverage Cat can safely summarize.
              type: object
            deductible:
              type: number
            dwelling_coverage:
              type: number
            is_estimate:
              type: boolean
            minimum_auto_limits:
              additionalProperties: true
              description: Underlying auto-limit requirements for this offer.
              type: object
            personal_liability:
              type: number
            policy_subtype:
              type: string
            policy_subtype_display:
              type: string
            price_range:
              additionalProperties: false
              properties:
                high:
                  type: number
                low:
                  type: number
              type: object
            quote_number:
              type: string
            recommended:
              type: boolean
            sample_policy_url:
              format: uri
              type: string
            selection_guidance:
              additionalProperties: true
              description: Offer-specific same-reply requirements and guidance.
              type: object
            selection_token:
              type: string
            um_uim_selection:
              additionalProperties: true
              description: Optional excess UM/UIM election details for this offer.
              type: object
          type: object
        schema:
          additionalProperties: true
          description: Supplemental schema hints for homeowners review payloads.
          type: object
        line:
          enum:
            - umbrella
            - homeowners
          type: string
        pending_fields:
          description: Structured missing-value hints for umbrella pre-submit review.
          items:
            additionalProperties: true
            description: Structured missing-value hints for umbrella pre-submit review.
            type: object
          type: array
        uploaded_count:
          type: integer
        offers:
          items:
            additionalProperties: false
            properties:
              address:
                additionalProperties: false
                properties:
                  city:
                    type: string
                  state:
                    type: string
                  street:
                    type: string
                  zip:
                    type: string
                type: object
              annual_price:
                type: number
              carrier:
                type: string
              coverage_limit:
                type: string
              coverage_summary:
                additionalProperties: true
                description: Homeowners or umbrella coverage details Coverage Cat can safely summarize.
                type: object
              deductible:
                type: number
              dwelling_coverage:
                type: number
              is_estimate:
                type: boolean
              minimum_auto_limits:
                additionalProperties: true
                description: Underlying auto-limit requirements for this offer.
                type: object
              personal_liability:
                type: number
              policy_subtype:
                type: string
              policy_subtype_display:
                type: string
              price_range:
                additionalProperties: false
                properties:
                  high:
                    type: number
                  low:
                    type: number
                type: object
              quote_number:
                type: string
              recommended:
                type: boolean
              sample_policy_url:
                format: uri
                type: string
              selection_guidance:
                additionalProperties: true
                description: Offer-specific same-reply requirements and guidance.
                type: object
              selection_token:
                type: string
              um_uim_selection:
                additionalProperties: true
                description: Optional excess UM/UIM election details for this offer.
                type: object
            type: object
          type: array
        response_summary:
          type: string
        payment_status:
          additionalProperties: false
          properties:
            channel:
              type: string
            customer_owned_inbox_required:
              type: boolean
            destination_hint:
              type: string
            payment_intent_id:
              type: string
            payment_method_saved_at:
              format: date-time
              type: string
            provider:
              type: string
            state:
              type: string
            timing:
              type: string
          type: object
        poll_after_seconds:
          type: integer
        uid:
          description: Coverage Cat intake uid for the current handoff.
          type: string
        conversation:
          additionalProperties: false
          properties:
            messages:
              items:
                additionalProperties: false
                properties:
                  author_label:
                    type: string
                  delivery_state:
                    enum:
                      - received
                      - queued
                      - sent
                    type: string
                  direction:
                    enum:
                      - incoming
                      - outgoing
                    type: string
                  medium:
                    enum:
                      - email
                      - app
                      - sms
                    type: string
                  message_id:
                    type: integer
                  subject:
                    type: string
                  text:
                    type: string
                  timestamp:
                    format: date-time
                    type: string
                type: object
              type: array
            reply_pending:
              type: boolean
            reply_supported:
              type: boolean
            reply_to_message_id:
              type: integer
            reply_via:
              type: string
          type: object
        compare_details_url:
          description: Coverage Cat browser URL for compare-details follow-up.
          format: uri
          type: string
        offer_summary:
          additionalProperties: false
          properties:
            cheapest_annual_premium:
              type: number
            cheapest_carrier:
              type: string
            quote_count:
              type: integer
            recommended_annual_premium:
              type: number
            recommended_carrier:
              type: string
          type: object
        review_token:
          description: Opaque review token for delegated review-style submit paths.
          type: string
        status:
          enum:
            - abandoned
            - blocked
            - bound
            - cancelled
            - chosen
            - credit_consent_pending
            - credit_consent_required
            - dev_success
            - documents_needed
            - documents_pending_review
            - email_sent
            - in_review
            - ineligible
            - info_requested
            - needs_more_info
            - needs_more_info_to_bind
            - no_policy
            - no_chosen_offer
            - no_quotes
            - no_selection
            - ok
            - payment_collection_ready
            - payment_needed
            - pending
            - pending_quotes
            - queued
            - quote_rate_limited
            - quoted
            - ready_for_review
            - ready_for_submission
            - ready_to_finalize
            - review_pending
            - service_preview
            - service_requested
            - sandbox_unsupported
            - stale_selection
            - verifying_documents
            - waiting_on_carrier
            - waiting_on_documents
            - waiting_on_payment
          type: string
        preview_token:
          description: Opaque bind-preview token for the next homeowners bind confirmation.
          type: string
        next_question:
          additionalProperties: true
          description: The current shopper-owned question bundle or bind-stage question.
          type: object
        review_estimates:
          items:
            additionalProperties: true
            description: Coverage Cat estimate provenance metadata for reviewed values.
            type: object
          type: array
        known_summary:
          additionalProperties: true
          description: Structured facts Coverage Cat can safely summarize at this stage.
          type: object
        user_action_required:
          type: string
        payment_collection_supported:
          type: boolean
        offers_url:
          description: Coverage Cat browser URL for the selected offer or offer-tracking page.
          format: uri
          type: string
        service_request:
          additionalProperties: false
          properties:
            action_summary:
              type: string
            billing_effect:
              type: string
            carrier_conditions:
              items:
                type: string
              type: array
            coverage_effect:
              type: string
            details:
              type: string
            estimated_refund_status:
              enum:
                - not_applicable
                - unknown_pending_review
              type: string
            final_outcome:
              additionalProperties: true
              description: Final carrier or billing outcome once Coverage Cat can confirm it.
              type: object
            reason:
              type: string
            request_id:
              type: string
            request_type:
              enum:
                - policy_cancellation
                - refund_request
                - support_case
              type: string
            requested_at:
              format: date-time
              type: string
            requested_effective_date:
              format: date
              type: string
            status:
              enum:
                - pending_review
                - completed
              type: string
            uncertainty:
              type: string
          type: object
        review:
          additionalProperties: true
          description: Structured review card or selected-offer review block.
          type: object
        sandbox:
          description: True when Coverage Cat is returning consumer sandbox test data rather than a live shopper workflow.
          type: boolean
        selection_guidance:
          additionalProperties: true
          description: Guidance for completing an offer choice in one shopper-facing reply.
          type: object
        documents:
          items:
            additionalProperties: false
            properties:
              content_type:
                type: string
              download_url:
                description: Short-lived browser continuation for this policy document.
                format: uri
                type: string
              label:
                type: string
              name:
                type: string
              type:
                type: string
            type: object
          type: array
        notification_channel:
          additionalProperties: false
          properties:
            customer_owned_inbox_required:
              type: boolean
            destination_hint:
              type: string
            events:
              items:
                type: string
              type: array
            registered:
              type: boolean
            role:
              type: string
            type:
              type: string
          type: object
        support:
          additionalProperties: false
          properties:
            contact_url:
              description: Coverage Cat support route for billing, cancellations, and quote follow-up.
              format: uri
              type: string
            email:
              type: string
            phone:
              type: string
          type: object
        purchase_preview:
          additionalProperties: false
          properties:
            action_summary:
              type: string
            approval_required:
              type: boolean
            carrier_conditions:
              items:
                type: string
              type: array
            coverage_summary:
              additionalProperties: true
              description: Coverage details tied to the current previewed offer.
              type: object
            effective_date:
              format: date
              type: string
            effective_period:
              additionalProperties: false
              properties:
                ends_on:
                  format: date
                  type: string
                starts_on:
                  format: date
                  type: string
              type: object
            payment_timing:
              type: string
            price:
              additionalProperties: false
              properties:
                annual_premium:
                  type: number
                currency:
                  type: string
                payment_method:
                  type: string
              type: object
            status:
              type: string
            uncertainty:
              type: string
          type: object
        uploaded:
          items:
            additionalProperties: false
            properties:
              filename:
                type: string
              type:
                type: string
            type: object
          type: array
        payment_ui:
          additionalProperties: false
          properties:
            availability:
              enum:
                - ready
                - unknown
                - unsupported
              type: string
            fallback_reason:
              type: string
            mode:
              type: string
          type: object
        field_estimates:
          items:
            additionalProperties: true
            description: Coverage Cat estimate provenance metadata for reviewed values.
            type: object
          type: array
        policy:
          additionalProperties: false
          properties:
            cancellation_note:
              type: string
            cancelled_at:
              format: date
              type: string
            carrier:
              type: string
            confirmation_timestamp:
              format: date-time
              type: string
            coverage_summary:
              additionalProperties: true
              description: Carrier-confirmed policy coverage details Coverage Cat can safely return.
              type: object
            effective_date:
              format: date
              type: string
            effective_period:
              additionalProperties: false
              properties:
                ends_on:
                  format: date
                  type: string
                starts_on:
                  format: date
                  type: string
              type: object
            policy_number:
              type: string
            state:
              enum:
                - bound
                - cancelled
              type: string
          type: object
        payment_setup:
          additionalProperties: false
          properties:
            environment:
              enum:
                - test
                - live
              type: string
            payment_method_types:
              items:
                type: string
              type: array
            provider:
              type: string
            setup_intent_id:
              type: string
            usage:
              type: string
          type: object
        agent_instructions:
          items:
            type: string
          type: array
        service_requests:
          items:
            additionalProperties: false
            properties:
              action_summary:
                type: string
              billing_effect:
                type: string
              carrier_conditions:
                items:
                  type: string
                type: array
              coverage_effect:
                type: string
              details:
                type: string
              estimated_refund_status:
                enum:
                  - not_applicable
                  - unknown_pending_review
                type: string
              final_outcome:
                additionalProperties: true
                description: Final carrier or billing outcome once Coverage Cat can confirm it.
                type: object
              reason:
                type: string
              request_id:
                type: string
              request_type:
                enum:
                  - policy_cancellation
                  - refund_request
                  - support_case
                type: string
              requested_at:
                format: date-time
                type: string
              requested_effective_date:
                format: date
                type: string
              status:
                enum:
                  - pending_review
                  - completed
                type: string
              uncertainty:
                type: string
            type: object
          type: array
        missing_fields:
          description: Structured missing-value hints for homeowners pre-submit review.
          items:
            additionalProperties: true
            description: Structured missing-value hints for homeowners pre-submit review.
            type: object
          type: array
        application_submitted:
          type: boolean
        payment_url:
          description: Coverage Cat browser URL for secure payment fallback.
          format: uri
          type: string
        review_items:
          items:
            additionalProperties: false
            properties:
              description:
                type: string
              display_value:
                type: string
              enum:
                items:
                  type: string
                type: array
              label:
                type: string
              number:
                type: integer
              path:
                items:
                  type:
                    - string
                    - integer
                type: array
              suggested_value: {}
            type: object
          type: array
        verification:
          additionalProperties: false
          properties:
            instructions:
              type: string
            request_tool:
              type: string
            required:
              type: boolean
            retry_after_seconds:
              minimum: 0
              type: integer
            status:
              enum:
                - required
                - pending
                - verified
                - not_required
              type: string
            status_tool:
              type: string
          required:
            - status
            - required
            - retry_after_seconds
            - request_tool
            - status_tool
            - instructions
          type: object
        intake_access_token:
          description: Short-lived follow-up bearer. On REST, send it back as Authorization for the next `/api/intake/{uid}` call. On MCP, retry the same follow-up tool with this token only when your host cannot preserve Coverage Cat's hidden shopper session. Never display it to the shopper.
          type: string
      required:
        - uid
        - status
      type: object
    HomeownersOfferSummary:
      properties:
        address:
          additionalProperties: true
          type: object
        annual_price:
          type: number
        carrier:
          type: string
        coverage_summary:
          type: string
        deductible:
          type: number
        dwelling_coverage:
          description: |
            Coverage A / replacement cost as priced by the carrier. Derived from a Replacement Cost Estimator, not from purchase price or appraised value; do not substitute either of those in operator-side displays.
          type: number
        is_estimate:
          type: boolean
        personal_liability:
          type: number
        policy_subtype:
          type: string
        policy_subtype_display:
          type: string
        property_id:
          description: Stable per operator plus normalized property address; reuse it as a property correlation key, not an intake-row identifier.
          type: string
        quote_number:
          type: string
        recommended:
          type: boolean
      type: object
    SelectRequest:
      additionalProperties: false
      properties:
        credit_consent:
          additionalProperties: false
          description: |
            Real-user consent for a soft credit check. Required before Coverage Cat can bind a chosen offer. If omitted or declined, Coverage Cat returns `credit_consent_required` with the prompt to render.
          properties:
            answer:
              description: Must be the real user's answer. Only Yes authorizes the pull.
              enum:
                - 'Yes'
              type: string
            collected_from_user:
              const: true
              type: boolean
          required:
            - answer
            - collected_from_user
          type: object
        sandbox:
          description: |
            Optional sticky sandbox flag. Sandbox delegated umbrella sessions currently reject `select` with `sandbox_unsupported`; this field is accepted so a client carrying the same request envelope does not fail schema validation first.
          type: boolean
        selection_confirmed:
          const: true
          type: boolean
        selection_token:
          type: string
        uid:
          type: string
      required:
        - uid
        - selection_token
        - selection_confirmed
      type: object
    QuoteResponse:
      properties:
        agent_instructions:
          items:
            type: string
          type: array
        compare_details_url:
          format: uri
          type: string
        field_estimates:
          description: |
            The estimated-field state that was present on the reviewed application. Use it to keep CRM estimate badges aligned with the review page the user approved.
          items:
            $ref: '#/components/schemas/UmbrellaFieldEstimate'
          type: array
        offers:
          items:
            $ref: '#/components/schemas/AgentOffer'
          type: array
        response_summary:
          type: string
        sandbox:
          description: True when the offer response is mocked sandbox data.
          type: boolean
        selection_guidance:
          properties:
            default_selection_token:
              type: string
            display_note:
              type: string
            summary:
              type: string
          type: object
        status:
          enum:
            - quoted
            - no_quotes
          type: string
        uid:
          type: string
      type: object
    AutoCalculatorRequest:
      additionalProperties: true
      properties:
        coverage:
          properties:
            collision_deductible:
              default: 1000
              type: integer
            comprehensive_deductible:
              default: 1000
              type: integer
          type: object
        driver:
          properties:
            age:
              default: 35
              type: integer
            gender:
              default: 'N'
              type: string
            state:
              default: CA
              type: string
            zip:
              type: string
          type: object
        repair_estimate:
          description: Used by the file-a-claim calculator.
          type: integer
        vehicle:
          properties:
            make:
              type: string
            model:
              type: string
            style:
              type: string
            submodel:
              type: string
            year:
              type: integer
          type: object
      type: object
    AgentKeyRequest:
      additionalProperties: false
      properties:
        email:
          format: email
          type: string
      required:
        - email
      type: object
    StatusResponse:
      properties:
        agent_instructions:
          items:
            type: string
          type: array
        compare_details_url:
          format: uri
          type: string
        credit_consent_question:
          description: |
            Present when Coverage Cat needs the real user's consent for a soft credit check before binding an offer, typically returned from `select` with `status: credit_consent_required`.
          type: string
        fallback_step:
          $ref: '#/components/schemas/FallbackStep'
        field_estimates:
          items:
            $ref: '#/components/schemas/UmbrellaFieldEstimate'
          type: array
        known_summary:
          additionalProperties: true
          description: |
            Current delegated umbrella application summary. This may include PII such as applicant name, email, phone number, and address; do not treat it as safe-to-log telemetry.
          type: object
        next_action:
          $ref: '#/components/schemas/NextAction'
        next_question:
          $ref: '#/components/schemas/NextQuestion'
        offers:
          items:
            $ref: '#/components/schemas/AgentOffer'
          type: array
        offers_url:
          description: Secure link to the Coverage Cat offers page for this delegated session.
          format: uri
          type: string
        payment_url:
          description: Secure payment-setup link, returned only when Coverage Cat is ready to collect payment.
          format: uri
          type: string
        policy:
          additionalProperties: true
          type: object
        poll_after_seconds:
          type: integer
        post_choose:
          additionalProperties: true
          type: object
        required_upload_types:
          items:
            enum:
              - declarations
              - auto_declarations
            type: string
          type: array
        response_summary:
          type: string
        review:
          additionalProperties: true
          description: Review JSON for the latest ready-for-review state.
          type: object
        review_token:
          type: string
        sandbox:
          description: True when this delegated umbrella status payload is mocked sandbox data.
          type: boolean
        selected_offer:
          $ref: '#/components/schemas/OfferSnapshot'
        selection_guidance:
          additionalProperties: true
          type: object
        status:
          enum:
            - ineligible
            - needs_more_info
            - ready_for_review
            - quoted
            - no_quotes
            - needs_more_info_to_bind
            - ready_to_finalize
            - documents_needed
            - documents_pending_review
            - payment_needed
            - waiting_on_carrier
            - info_requested
            - bound
            - blocked
          type: string
        uid:
          type: string
      type: object
    ConsumerHomeownersBindRequest:
      additionalProperties: false
      properties:
        bind_confirmed:
          const: true
          description: Must be true. Confirms the shopper approved the exact homeowners preview, including carrier-direct email delivery for any payment or signing links.
          type: boolean
        preview_token:
          description: Bind-preview token returned by the homeowners ready_to_finalize follow-up payload.
          type: string
      required:
        - preview_token
        - bind_confirmed
      type: object
    HomeownersPropertyStatusRow:
      properties:
        field_estimates:
          description: |
            Field-level estimates Coverage Cat filled for this property. See `HomeownersFieldEstimate` for handling rules. Estimated values keep quoting moving, but unconfirmed estimated home fields must still be reviewed in the homeowner portal before final bind.
          items:
            $ref: '#/components/schemas/HomeownersFieldEstimate'
          type: array
        fix_issues_email_available:
          description: |
            True when the operator may trigger Coverage Cat to send the homeowner a secure fix-issues email for this request UID.
          type: boolean
        home_index:
          type: integer
        home_ownership:
          type: string
        homeowner_fix_issues_request_login_url:
          description: |
            Shareable homeowner sign-in request page for the fix-issues flow. Use this when the property is still in `needs_more_info` and the homeowner should complete the missing items in Coverage Cat's GUI.
          format: uri
          type: string
        homeowner_quotes_request_login_url:
          description: |
            Shareable homeowner sign-in request page for the offers view. The homeowner still has to request their own login link by email, so this URL does not sign the operator or agent into the homeowner's private quotes page.
          format: uri
          type: string
        inserted_at:
          type: string
        location:
          additionalProperties: true
          type: object
        new_purchase:
          type: boolean
        offers_page_available:
          type: boolean
        offers_published:
          description: True once homeowners offers have been published to the homeowner's portal.
          type: boolean
        property_id:
          description: Stable per operator plus normalized property address; reuse it as a property correlation key, not an intake-row identifier.
          type: string
        property_type:
          type: string
        request_uid:
          type: string
        status:
          enum:
            - needs_more_info
            - pending_quotes
            - quoted
            - quotes_published
          type: string
        status_summary:
          description: Coarse operator-facing summary for the current status, without exact missing-field or offer counts.
          type: string
        submitted_at:
          type: string
        updated_at:
          type: string
      type: object
    AgentKeyConfirmRequest:
      additionalProperties: false
      properties:
        assistant_email:
          description: Optional mailbox to CC on the same customer-facing emails Coverage Cat sends during delegated umbrella checkout. This supplements, but does not replace, polling `status`.
          format: email
          type: string
        code:
          deprecated: true
          description: Legacy alias for `otp`. New integrations should send `otp`.
          type: string
        contact_name:
          type: string
        email:
          format: email
          type: string
        organization_name:
          type: string
        otp:
          description: 6-digit confirmation code emailed to the operator.
          type: string
        referral_source_name:
          description: Customer-facing partner or referral-source name used in delegated-homeowners emails.
          type: string
        use_case_description:
          type: string
      required:
        - email
        - otp
      type: object
    IntakeAssistantPatchRequest:
      additionalProperties: true
      description: "Partial intake patch for the first-party assistant follow-up API. Send user-confirmed edits directly as top-level intake fields. For homeowners after submission, this same patch call can also send `message_reply` to answer insurer or shopper follow-up already surfaced under `conversation.messages`, and `reply_to_message_id` pins the reply to one returned conversation message when Coverage Cat marks `conversation.reply_pending`. For umbrella intakes, top-level field_estimates[] rows may accompany inferred values when you are certain each field path matches a current umbrella review field. Use canonical umbrella count corrections such as `umbrella_details.motorized_vehicle_count` and never send `vehicles` rows on this pre-submit patch. `current_auto_coverages` is a banded enum, not free text: send one of `unsure` for I'm not sure; `500k/1m` for $500k/$1 Million/$100k or higher; `500k/500k` for $500k/$500k/$100k or $500k CSL; `300k/300k` for $250k/$500k/$100k or $300k/$300k/$100k or $300k CSL; `100k/300k` for $100k/$300k/$100k or lower. Coverage Cat rejects the shopper's raw limits, so translate them into the strongest band those limits fully satisfy. Underlying auto limits gate umbrella eligibility, so reserve `unsure` for limits the shopper genuinely does not know rather than using it to skip the translation. Normalize shopper birthdays from MM-DD-YYYY to YYYY-MM-DD before sending them. Set confirm_submission: true on the final one-time review turn to submit and start quote generation."
      properties:
        confirm_submission:
          description: 'Set to true on the single human review turn once the user has reviewed the application and wants Coverage Cat to submit now. Homeowners also require credit_check_authorized: true on that same final turn; umbrella consent for a soft credit check is collected later at select.'
          type: boolean
        current_auto_coverages:
          description: "Which band the shopper's current underlying auto liability limits fall into: `500k/1m` covers $500k/$1 Million/$100k or higher; `500k/500k` covers $500k/$500k/$100k or $500k CSL; `300k/300k` covers $250k/$500k/$100k or $300k/$300k/$100k or $300k CSL; `100k/300k` covers $100k/$300k/$100k or lower. Pick the strongest band the shopper's actual limits fully satisfy. Underlying auto limits gate umbrella eligibility, so use `unsure` only when the shopper genuinely does not know their limits."
          enum:
            - unsure
            - 500k/1m
            - 500k/500k
            - 300k/300k
            - 100k/300k
          type: string
        field_estimates:
          description: Umbrella-only estimate metadata for inferred values included in the same patch. Omit it unless you are certain each field path matches a current umbrella review field. Homeowners estimate provenance stays under intake.home[].field_estimates[].
          items:
            $ref: '#/components/schemas/UmbrellaFieldEstimateInput'
          type: array
        message_reply:
          description: Homeowners post-submit only. Send the reply text Coverage Cat should deliver in-thread when the latest issues payload shows `conversation.reply_pending`, such as answering a carrier underwriting question.
          type: string
        reply_to_message_id:
          description: Optional homeowners post-submit target from `conversation.messages[].message_id`. Use it when Coverage Cat returned a specific follow-up message to answer in-thread.
          type: integer
      type: object
    ConsumerUmbrellaAttachRequest:
      additionalProperties: false
      oneOf:
        - required:
            - type
            - filename
            - content
        - required:
            - attachments
      properties:
        attachments:
          description: Upload multiple declarations in one call when both files are already available.
          items:
            additionalProperties: false
            properties:
              content:
                description: Base64-encoded file bytes.
                type: string
              filename:
                type: string
              type:
                enum:
                  - declarations
                  - auto_declarations
                type: string
            required:
              - type
              - filename
              - content
            type: object
          minItems: 1
          type: array
        content:
          description: Base64-encoded file bytes.
          type: string
        filename:
          type: string
        type:
          enum:
            - declarations
            - auto_declarations
          type: string
      type: object
    ConsumerBindRequest:
      oneOf:
        - $ref: '#/components/schemas/ConsumerUmbrellaBindRequest'
        - $ref: '#/components/schemas/ConsumerHomeownersBindRequest'
    ConsumerUmbrellaPaymentRequest:
      oneOf:
        - additionalProperties: false
          properties:
            payment_collection_requested:
              const: true
              description: Starts secure card collection by asking Coverage Cat to prepare a Stripe SetupIntent for hosted card entry. Send it on the first payment call, without setup_intent_id or payment_method_id.
              type: boolean
          required:
            - payment_collection_requested
          type: object
        - additionalProperties: false
          properties:
            payment_method_id:
              description: Reusable Stripe PaymentMethod id produced by the secure client-side setup confirmation.
              type: string
            setup_intent_id:
              description: SetupIntent id returned by the earlier payment_collection_ready response.
              type: string
          required:
            - setup_intent_id
            - payment_method_id
          type: object
    HomeownersQuotesResponse:
      properties:
        agent_instructions:
          items:
            type: string
          type: array
        homeowner_fix_issues_request_login_url:
          description: |
            Safe homeowner-facing sign-in request page for the fix-issues flow. Coverage Cat returns this while the delegated intake still needs more information and you want the homeowner to complete those remaining items in Coverage Cat's GUI.
          format: uri
          type: string
        homeowner_portal_url:
          deprecated: true
          description: |
            Secure Coverage Cat consumer portal link for this intake. The homeowner uses this portal to review details, choose an offer, confirm any estimated home answers, and complete final bind. Treat this as a sensitive direct session link; if you need a safer pass-through URL, use `homeowner_quotes_request_login_url`.
          format: uri
          type: string
        homeowner_quotes_request_login_url:
          description: |
            Safe homeowner-facing sign-in request page for the offers view. Share this with the homeowner when you need them to reach their offers page without handing over an operator or direct OTP login link.
          format: uri
          type: string
        job_id:
          description: Stable delegated-homeowners async job identifier. Reuses the intake uid.
          type: string
        known_summary:
          additionalProperties: true
          description: |
            Current delegated homeowners intake summary. This may include PII such as applicant name, applicant email, and full insured-property addresses. It may also include a `homes[].field_estimates[]` array per home listing values that were estimated by either the operator or Coverage Cat. Delegated quoting may proceed with these estimates, but unconfirmed estimated home fields are sent back through the homeowner review flow before final bind completes in Coverage Cat's consumer portal. Do not treat this object as safe-to-log telemetry.
          type: object
        missing_fields:
          items:
            $ref: '#/components/schemas/HomeownersMissingField'
          type: array
        offers:
          items:
            $ref: '#/components/schemas/HomeownersOfferSummary'
          type: array
        offers_page_url:
          deprecated: true
          description: Backwards-compatible alias for `homeowner_portal_url`.
          format: uri
          type: string
        operator_dashboard_url:
          description: Short-lived browser login link for the operator homeowners dashboard, usually prefiltered to this intake UID.
          format: uri
          type: string
        poll_after_seconds:
          description: Suggested minimum wait before polling again.
          type: integer
        poll_request:
          additionalProperties: true
          description: Structured POST request reference for polling the same delegated homeowners uid.
          type: object
        response_summary:
          type: string
        sandbox:
          description: True when this delegated homeowners response is mocked sandbox data.
          type: boolean
        schema:
          additionalProperties: true
          type: object
        status:
          enum:
            - needs_more_info
            - pending_quotes
            - quoted
          type: string
        status_endpoint:
          additionalProperties: true
          description: Structured status polling reference for the async job.
          type: object
        status_url:
          description: GET endpoint returning coarse non-PII status rows for this delegated homeowners request.
          format: uri
          type: string
        uid:
          type: string
      type: object
    ToolBatchRequest:
      additionalProperties: false
      properties:
        operations:
          items:
            $ref: '#/components/schemas/ToolBatchOperation'
          maxItems: 25
          minItems: 1
          type: array
      required:
        - operations
      type: object
    ToolBatchError:
      properties:
        error:
          type: string
        message:
          type: string
        reason:
          type: string
      type: object
    HomeownersAgentFinderRequest:
      additionalProperties: false
      properties:
        limit:
          default: 25
          type: integer
        lines:
          description: Homeowners, dwelling_fire, condominium, renters, mobile_home, personal_lines, property_and_casualty, or surplus_lines.
          items:
            type: string
          type: array
        zip:
          pattern: ^[0-9]{5}$
          type: string
      required:
        - zip
        - lines
      type: object
    ConsumerSelectRequest:
      oneOf:
        - $ref: '#/components/schemas/ConsumerUmbrellaSelectRequest'
        - $ref: '#/components/schemas/ConsumerHomeownersSelectRequest'
    ConsumerUmbrellaSelectRequest:
      additionalProperties: false
      properties:
        credit_consent:
          additionalProperties: false
          description: Real-user consent for a soft credit check, collected on the selection turn when Coverage Cat asks for it.
          properties:
            answer:
              description: "Records the shopper's own reply agreeing to Coverage Cat's credit_consent_question. Send it only after the shopper agrees in their own words."
              enum:
                - 'Yes'
              type: string
            collected_from_user:
              const: true
              description: Attests that the shopper personally answered the credit consent question in this conversation, rather than the agent assuming their consent.
              type: boolean
          required:
            - answer
            - collected_from_user
          type: object
        intake:
          additionalProperties: true
          description: Optional bind-stage answers for the current next_question. Use this when Coverage Cat asked for consent for a soft credit check and bind details in the same shopper-facing turn, so you can retry select with both the consent and the answers together.
          type: object
        selection_confirmed:
          const: true
          type: boolean
        selection_token:
          description: Offer-selection token returned by the quoted umbrella follow-up payload.
          type: string
        um_uim_election:
          description: Optional. Use this when the shopper wants to include or decline the offer's $1M excess UM/UIM option in the same selection reply.
          oneOf:
            - type: boolean
            - enum:
                - include
                - decline
              type: string
            - additionalProperties: false
              properties:
                elected:
                  type: boolean
              required:
                - elected
              type: object
      required:
        - selection_token
        - selection_confirmed
      type: object
    QuestionField:
      properties:
        description:
          type: string
        enum:
          items: {}
          type: array
        format:
          type: string
        label:
          type: string
        path:
          items:
            type: string
          type: array
        type:
          type: string
      type: object
    DraftResponse:
      properties:
        agent_instructions:
          items:
            type: string
          type: array
        field_estimates:
          items:
            $ref: '#/components/schemas/UmbrellaFieldEstimate'
          type: array
        known_summary:
          additionalProperties: true
          description: |
            Current delegated umbrella application summary. This may include PII such as applicant name, email, phone number, and address; do not treat it as safe-to-log telemetry.
          type: object
        next_question:
          $ref: '#/components/schemas/NextQuestion'
        pending_fields:
          description: |
            Only present while Coverage Cat still needs more data before a final review page can be shown. Use this behind the scenes with operator-side context search; the intended UX is that the human only sees `ready_for_review`.
          items:
            $ref: '#/components/schemas/UmbrellaPendingField'
          type: array
        response_summary:
          type: string
        review:
          additionalProperties: true
          description: |
            Full review JSON to render only when `status` is `ready_for_review`. Render it directly, mark every `field_estimates[].review_path` entry with `*`, include the short note `* = estimated` once above and once below the review list, and do not prefix every estimated line with `[Estimated]`. Credit consent is not asked here; Coverage Cat collects it at `select`.
          type: object
        review_token:
          description: Token bound to the latest review JSON. Refresh it after every draft edit before calling quotes.
          type: string
        sandbox:
          description: True when this delegated umbrella session is running in mocked sandbox mode.
          type: boolean
        status:
          enum:
            - needs_more_info
            - ready_for_review
            - ineligible
          type: string
        suggested_values:
          additionalProperties: true
          description: |
            Historical-mode fallback priors for unresolved fields. Treat these as hints for operator-side enrichment, not as substitutes for actual user or document-backed answers.
          type: object
        uid:
          type: string
      type: object
    SelectResponse:
      properties:
        agent_instructions:
          items:
            type: string
          type: array
        credit_consent_question:
          description: |
            Present only when `status` is `credit_consent_required`. The real user's affirmative Yes must be collected and passed back on the next `select` call as `credit_consent`.
          type: string
        next_question:
          $ref: '#/components/schemas/NextQuestion'
        offers_url:
          description: Secure link to the Coverage Cat offers page for this delegated session.
          format: uri
          type: string
        payment_url:
          description: Secure payment-setup link, returned only when Coverage Cat is ready to collect payment.
          format: uri
          type: string
        post_choose:
          additionalProperties: true
          type: object
        required_upload_types:
          items:
            enum:
              - declarations
              - auto_declarations
            type: string
          type: array
        response_summary:
          type: string
        selected_offer:
          $ref: '#/components/schemas/OfferSnapshot'
        status:
          enum:
            - credit_consent_required
            - needs_more_info_to_bind
            - documents_needed
            - documents_pending_review
            - payment_needed
            - chosen
          type: string
        uid:
          type: string
      type: object
    ConsumerPrefillRequest:
      additionalProperties: false
      properties:
        credit_consent_pending:
          const: true
          description: Must be true. Signals that the user has not yet been shown the review page. Homeowners handoffs collect consent for a soft credit check on that review turn; umbrella handoffs defer credit consent until the user chooses an offer at `select`.
          type: boolean
        field_estimates:
          description: Optional estimate metadata for values that are defensible but not yet directly confirmed by the user. On the initial consumer umbrella handoff, prefer sending only `intake`; add top-level `field_estimates` only when you are certain each `field` already matches a current umbrella review field path.
          items:
            additionalProperties: true
            type: object
          type: array
        intake:
          additionalProperties: true
          description: "Fullest currently known consumer application patch assembled from the user's own context before any piecemeal follow-up. Use canonical consumer umbrella keys such as `address.street`, `address.city`, `address.state`, `address.zip`, `license_state`, `license_number`, `approximate_asset_value` or `net_worth_numeric`, `desired_coverage_limit`, `required_coverage_e_limit`, and `vehicle_count` or `umbrella_details.motorized_vehicle_count` for umbrella counts. Avoid top-level `street`/`city`/`state`/`zip`, `drivers_license_state`, `drivers_license_number`, `net_worth`, or `desired_umbrella_liability_limit`. Do not send `vehicles` rows before submission. Use `vehicle_count` or `umbrella_details.motorized_vehicle_count` for the household vehicle count; actual vehicle details are collected later only if a selected offer requires them, such as a Markel bind follow-up. `current_auto_coverages` is a banded enum, not free text: send one of `unsure` for I'm not sure; `500k/1m` for $500k/$1 Million/$100k or higher; `500k/500k` for $500k/$500k/$100k or $500k CSL; `300k/300k` for $250k/$500k/$100k or $300k/$300k/$100k or $300k CSL; `100k/300k` for $100k/$300k/$100k or lower. Coverage Cat rejects the shopper's raw limits, so translate them into the strongest band those limits fully satisfy. Underlying auto limits gate umbrella eligibility, so reserve `unsure` for limits the shopper genuinely does not know rather than using it to skip the translation."
          properties:
            current_auto_coverages:
              description: "Which band the shopper's current underlying auto liability limits fall into: `500k/1m` covers $500k/$1 Million/$100k or higher; `500k/500k` covers $500k/$500k/$100k or $500k CSL; `300k/300k` covers $250k/$500k/$100k or $300k/$300k/$100k or $300k CSL; `100k/300k` covers $100k/$300k/$100k or lower. Pick the strongest band the shopper's actual limits fully satisfy. Underlying auto limits gate umbrella eligibility, so use `unsure` only when the shopper genuinely does not know their limits."
              enum:
                - unsure
                - 500k/1m
                - 500k/500k
                - 300k/300k
                - 100k/300k
              type: string
          type: object
        sandbox:
          description: Optional. Set true only on the first consumer umbrella prefill call when you want a fully synthetic shopper rehearsal. That same consumer sandbox uid can then continue through issues, patch, select, bind, attach, payment, and status with synthetic quotes, uploads, payment credentials, and policy results.
          type: boolean
      required:
        - intake
        - credit_consent_pending
      type: object
    HomeownersMissingField:
      properties:
        description:
          type: string
        enum:
          items: {}
          type: array
        field:
          type: string
        format:
          type: string
        label:
          type: string
        message:
          type: string
        path:
          items:
            type: string
          type: array
        type:
          oneOf:
            - type: string
            - items:
                type: string
              type: array
      type: object
    FallbackStep:
      properties:
        display_note:
          type: string
        type:
          enum:
            - dashboard
          type: string
        url:
          format: uri
          type: string
      type: object
    ConsumerUmbrellaServiceRequest:
      additionalProperties: false
      oneOf:
        - properties:
            request_type:
              const: policy_cancellation
              type: string
          required:
            - request_type
            - reason
            - requested_effective_date
        - properties:
            request_type:
              const: refund_request
              type: string
          required:
            - request_type
            - reason
        - properties:
            request_type:
              const: support_case
              type: string
          required:
            - request_type
            - reason
      properties:
        confirm_request:
          description: Whether to open the request now. false, the default, returns a preview of the consequences without opening anything; send true only after the shopper approves that preview.
          type: boolean
        details:
          description: Shopper-approved context beyond the short reason, such as the specifics of a billing dispute, recorded on the request and its preview.
          type: string
        reason:
          description: Short shopper-approved reason for the request.
          type: string
        request_type:
          description: What the shopper wants done after purchase. `policy_cancellation` asks the carrier to end the policy on requested_effective_date; `refund_request` asks the carrier or billing provider to review a refund or outstanding balance without changing coverage; `support_case` opens a general support case for anything else.
          enum:
            - policy_cancellation
            - refund_request
            - support_case
          type: string
        requested_effective_date:
          description: 'Day the shopper wants a cancellation to take effect; used only for policy_cancellation. It is a request: the carrier reviews it and may set a different date.'
          format: date
          type: string
      required:
        - request_type
        - reason
      type: object
    CalculatorResponse:
      additionalProperties: true
      description: Read-only calculator response. Shape varies by calculator.
      type: object
    UmbrellaFieldEstimateInput:
      additionalProperties: false
      description: |
        Metadata for one umbrella answer in the draft request whose current value is not directly user-confirmed yet. The actual value still comes from the `intake` patch at the same field path.
      properties:
        confidence:
          enum:
            - low
            - medium
            - high
          type: string
        field:
          description: |
            Intake dot-path for the inferred answer, such as `marital_status`, `address.zip`, or `additional_drivers.0.license_state`.
          type: string
        source:
          description: |
            Opaque operator-side provenance label such as `crm`, `email_thread`, `policy_declarations`, or `historical_mode`.
          type: string
      required:
        - field
        - source
        - confidence
      type: object
    ConsumerHomeownersSelectRequest:
      additionalProperties: false
      properties:
        selection_confirmed:
          const: true
          description: Must be true. Confirms the shopper chose this exact homeowners offer.
          type: boolean
        selection_token:
          description: Offer-selection token returned by the quoted homeowners follow-up payload.
          type: string
      required:
        - selection_token
        - selection_confirmed
      type: object
    OfferSnapshot:
      properties:
        annual_price:
          type: integer
        carrier:
          type: string
        coverage_limit:
          type: string
        is_estimate:
          type: boolean
        price_range:
          properties:
            high:
              type: integer
            low:
              type: integer
          type:
            - object
            - 'null'
      type: object
    ConsumerHomeownersPrefillRequest:
      additionalProperties: false
      properties:
        credit_consent_pending:
          const: true
          description: Must be true. Signals that the user has not yet been shown the review page. Homeowners handoffs collect consent for a soft credit check on that review turn; umbrella handoffs defer credit consent until the user chooses an offer at `select`.
          type: boolean
        field_estimates:
          description: Optional estimate metadata for values that are defensible but not yet directly confirmed by the user. On the initial consumer umbrella handoff, prefer sending only `intake`; add top-level `field_estimates` only when you are certain each `field` already matches a current umbrella review field path.
          items:
            additionalProperties: true
            type: object
          type: array
        intake:
          additionalProperties: true
          description: Fullest currently known consumer homeowners application patch assembled from the user's own context before any piecemeal follow-up. The first create call must already identify whether the property is standard homeowners, condo, or landlord coverage.
          properties:
            home:
              description: Initial product-selection row for the first create call. Send a single object or an array, and make sure the first home row already distinguishes standard homeowners, condo, or landlord coverage.
              oneOf:
                - $ref: '#/components/schemas/ConsumerHomeownersInitialHome'
                - items:
                    $ref: '#/components/schemas/ConsumerHomeownersInitialHome'
                  minItems: 1
                  type: array
          required:
            - home
          type: object
      required:
        - intake
        - credit_consent_pending
      type: object
    ToolBatchResponse:
      properties:
        error_count:
          type: integer
        operation_count:
          type: integer
        results:
          items:
            $ref: '#/components/schemas/ToolBatchResult'
          type: array
        success_count:
          type: integer
      type: object
    HomeownersQuotesRequest:
      additionalProperties: false
      properties:
        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. Treat `credit_check_authorized` as the real homeowner's explicit authorization for Coverage Cat's soft credit pull on the assembled application. If the operator already collected that exact consent separately, a complete first create call may include `credit_check_authorized: true`. Otherwise omit or keep `credit_check_authorized` false until the homeowner has reviewed the assembled application and explicitly consented to the soft credit pull. 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.
          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.
              oneOf:
                - $ref: '#/components/schemas/ConsumerHomeownersInitialHome'
                - items:
                    $ref: '#/components/schemas/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`.
          type: boolean
        uid:
          description: Existing delegated homeowners intake identifier. Omit to create a new intake.
          type: string
      type: object
    BindRequest:
      additionalProperties: false
      properties:
        intake:
          additionalProperties: true
          description: |
            Minimal patch answering only the fields from the current bind-stage `next_question`. Do not send quote-affecting changes here.
          type: object
        sandbox:
          description: |
            Optional sticky sandbox flag. Sandbox delegated umbrella sessions currently reject `bind` with `sandbox_unsupported`; this field is accepted so a client carrying the same request envelope does not fail schema validation first.
          type: boolean
        uid:
          type: string
      required:
        - uid
      type: object
    ConsumerPrefillResponse:
      additionalProperties: false
      properties:
        expires_at:
          description: When the returned consumer handoff credentials expire.
          format: date-time
          type: string
        intake_access_token:
          description: Short-lived direct follow-up bearer for `/api/intake/{uid}`.
          type: string
        polling_token:
          description: Opaque coarse-status polling token for `/api/consumer/status`.
          type: string
        resume_url:
          description: Short-lived browser continuation for the same consumer handoff.
          format: uri
          type: string
        review_summary:
          additionalProperties: false
          description: Current non-authoritative pre-submit checkpoint the agent may summarize before continuing in chat or opening a browser fallback. Unless a later follow-up response shows quote progress, treat this application as not submitted yet. If any shown value is estimated, mark that bullet or value with `*`, include the short note `* = estimated` once above and once below the list, and do not prefix every estimated line with `[Estimated]`.
          properties:
            post_choose:
              additionalProperties: true
              description: Structured post-choose state after a quoted umbrella offer is selected.
              type: object
            next_action:
              additionalProperties: true
              description: A structured hint for the next allowed tool or endpoint action.
              type: object
            required_upload_types:
              items:
                type: string
              type: array
            service_preview:
              additionalProperties: false
              properties:
                action_summary:
                  type: string
                approval_required:
                  type: boolean
                billing_effect:
                  type: string
                carrier_conditions:
                  items:
                    type: string
                  type: array
                coverage_effect:
                  type: string
                details:
                  type: string
                estimated_refund_status:
                  enum:
                    - not_applicable
                    - unknown_pending_review
                  type: string
                reason:
                  type: string
                request_type:
                  enum:
                    - policy_cancellation
                    - refund_request
                    - support_case
                  type: string
                requested_effective_date:
                  format: date
                  type: string
                status:
                  enum:
                    - preview
                  type: string
                uncertainty:
                  type: string
              type: object
            credit_consent_question:
              type: string
            selected_offer:
              additionalProperties: false
              properties:
                address:
                  additionalProperties: false
                  properties:
                    city:
                      type: string
                    state:
                      type: string
                    street:
                      type: string
                    zip:
                      type: string
                  type: object
                annual_price:
                  type: number
                carrier:
                  type: string
                coverage_limit:
                  type: string
                coverage_summary:
                  additionalProperties: true
                  description: Homeowners or umbrella coverage details Coverage Cat can safely summarize.
                  type: object
                deductible:
                  type: number
                dwelling_coverage:
                  type: number
                is_estimate:
                  type: boolean
                minimum_auto_limits:
                  additionalProperties: true
                  description: Underlying auto-limit requirements for this offer.
                  type: object
                personal_liability:
                  type: number
                policy_subtype:
                  type: string
                policy_subtype_display:
                  type: string
                price_range:
                  additionalProperties: false
                  properties:
                    high:
                      type: number
                    low:
                      type: number
                  type: object
                quote_number:
                  type: string
                recommended:
                  type: boolean
                sample_policy_url:
                  format: uri
                  type: string
                selection_guidance:
                  additionalProperties: true
                  description: Offer-specific same-reply requirements and guidance.
                  type: object
                selection_token:
                  type: string
                um_uim_selection:
                  additionalProperties: true
                  description: Optional excess UM/UIM election details for this offer.
                  type: object
              type: object
            schema:
              additionalProperties: true
              description: Supplemental schema hints for homeowners review payloads.
              type: object
            pending_fields:
              description: Structured missing-value hints for umbrella pre-submit review.
              items:
                additionalProperties: true
                description: Structured missing-value hints for umbrella pre-submit review.
                type: object
              type: array
            uploaded_count:
              type: integer
            offers:
              items:
                additionalProperties: false
                properties:
                  address:
                    additionalProperties: false
                    properties:
                      city:
                        type: string
                      state:
                        type: string
                      street:
                        type: string
                      zip:
                        type: string
                    type: object
                  annual_price:
                    type: number
                  carrier:
                    type: string
                  coverage_limit:
                    type: string
                  coverage_summary:
                    additionalProperties: true
                    description: Homeowners or umbrella coverage details Coverage Cat can safely summarize.
                    type: object
                  deductible:
                    type: number
                  dwelling_coverage:
                    type: number
                  is_estimate:
                    type: boolean
                  minimum_auto_limits:
                    additionalProperties: true
                    description: Underlying auto-limit requirements for this offer.
                    type: object
                  personal_liability:
                    type: number
                  policy_subtype:
                    type: string
                  policy_subtype_display:
                    type: string
                  price_range:
                    additionalProperties: false
                    properties:
                      high:
                        type: number
                      low:
                        type: number
                    type: object
                  quote_number:
                    type: string
                  recommended:
                    type: boolean
                  sample_policy_url:
                    format: uri
                    type: string
                  selection_guidance:
                    additionalProperties: true
                    description: Offer-specific same-reply requirements and guidance.
                    type: object
                  selection_token:
                    type: string
                  um_uim_selection:
                    additionalProperties: true
                    description: Optional excess UM/UIM election details for this offer.
                    type: object
                type: object
              type: array
            response_summary:
              type: string
            payment_status:
              additionalProperties: false
              properties:
                channel:
                  type: string
                customer_owned_inbox_required:
                  type: boolean
                destination_hint:
                  type: string
                payment_intent_id:
                  type: string
                payment_method_saved_at:
                  format: date-time
                  type: string
                provider:
                  type: string
                state:
                  type: string
                timing:
                  type: string
              type: object
            poll_after_seconds:
              type: integer
            conversation:
              additionalProperties: false
              properties:
                messages:
                  items:
                    additionalProperties: false
                    properties:
                      author_label:
                        type: string
                      delivery_state:
                        enum:
                          - received
                          - queued
                          - sent
                        type: string
                      direction:
                        enum:
                          - incoming
                          - outgoing
                        type: string
                      medium:
                        enum:
                          - email
                          - app
                          - sms
                        type: string
                      message_id:
                        type: integer
                      subject:
                        type: string
                      text:
                        type: string
                      timestamp:
                        format: date-time
                        type: string
                    type: object
                  type: array
                reply_pending:
                  type: boolean
                reply_supported:
                  type: boolean
                reply_to_message_id:
                  type: integer
                reply_via:
                  type: string
              type: object
            compare_details_url:
              description: Coverage Cat browser URL for compare-details follow-up.
              format: uri
              type: string
            offer_summary:
              additionalProperties: false
              properties:
                cheapest_annual_premium:
                  type: number
                cheapest_carrier:
                  type: string
                quote_count:
                  type: integer
                recommended_annual_premium:
                  type: number
                recommended_carrier:
                  type: string
              type: object
            review_token:
              description: Opaque review token for delegated review-style submit paths.
              type: string
            status:
              enum:
                - abandoned
                - blocked
                - bound
                - cancelled
                - chosen
                - credit_consent_pending
                - credit_consent_required
                - dev_success
                - documents_needed
                - documents_pending_review
                - email_sent
                - in_review
                - ineligible
                - info_requested
                - needs_more_info
                - needs_more_info_to_bind
                - no_policy
                - no_chosen_offer
                - no_quotes
                - no_selection
                - ok
                - payment_collection_ready
                - payment_needed
                - pending
                - pending_quotes
                - queued
                - quote_rate_limited
                - quoted
                - ready_for_review
                - ready_for_submission
                - ready_to_finalize
                - review_pending
                - service_preview
                - service_requested
                - sandbox_unsupported
                - stale_selection
                - verifying_documents
                - waiting_on_carrier
                - waiting_on_documents
                - waiting_on_payment
              type: string
            preview_token:
              description: Opaque bind-preview token for the next homeowners bind confirmation.
              type: string
            next_question:
              additionalProperties: true
              description: The current shopper-owned question bundle or bind-stage question.
              type: object
            review_estimates:
              items:
                additionalProperties: true
                description: Coverage Cat estimate provenance metadata for reviewed values.
                type: object
              type: array
            known_summary:
              additionalProperties: true
              description: Structured facts Coverage Cat can safely summarize at this stage.
              type: object
            user_action_required:
              type: string
            payment_collection_supported:
              type: boolean
            offers_url:
              description: Coverage Cat browser URL for the selected offer or offer-tracking page.
              format: uri
              type: string
            service_request:
              additionalProperties: false
              properties:
                action_summary:
                  type: string
                billing_effect:
                  type: string
                carrier_conditions:
                  items:
                    type: string
                  type: array
                coverage_effect:
                  type: string
                details:
                  type: string
                estimated_refund_status:
                  enum:
                    - not_applicable
                    - unknown_pending_review
                  type: string
                final_outcome:
                  additionalProperties: true
                  description: Final carrier or billing outcome once Coverage Cat can confirm it.
                  type: object
                reason:
                  type: string
                request_id:
                  type: string
                request_type:
                  enum:
                    - policy_cancellation
                    - refund_request
                    - support_case
                  type: string
                requested_at:
                  format: date-time
                  type: string
                requested_effective_date:
                  format: date
                  type: string
                status:
                  enum:
                    - pending_review
                    - completed
                  type: string
                uncertainty:
                  type: string
              type: object
            review:
              additionalProperties: true
              description: Structured review card or selected-offer review block.
              type: object
            sandbox:
              description: True when Coverage Cat is returning consumer sandbox test data rather than a live shopper workflow.
              type: boolean
            selection_guidance:
              additionalProperties: true
              description: Guidance for completing an offer choice in one shopper-facing reply.
              type: object
            documents:
              items:
                additionalProperties: false
                properties:
                  content_type:
                    type: string
                  download_url:
                    description: Short-lived browser continuation for this policy document.
                    format: uri
                    type: string
                  label:
                    type: string
                  name:
                    type: string
                  type:
                    type: string
                type: object
              type: array
            notification_channel:
              additionalProperties: false
              properties:
                customer_owned_inbox_required:
                  type: boolean
                destination_hint:
                  type: string
                events:
                  items:
                    type: string
                  type: array
                registered:
                  type: boolean
                role:
                  type: string
                type:
                  type: string
              type: object
            support:
              additionalProperties: false
              properties:
                contact_url:
                  description: Coverage Cat support route for billing, cancellations, and quote follow-up.
                  format: uri
                  type: string
                email:
                  type: string
                phone:
                  type: string
              type: object
            purchase_preview:
              additionalProperties: false
              properties:
                action_summary:
                  type: string
                approval_required:
                  type: boolean
                carrier_conditions:
                  items:
                    type: string
                  type: array
                coverage_summary:
                  additionalProperties: true
                  description: Coverage details tied to the current previewed offer.
                  type: object
                effective_date:
                  format: date
                  type: string
                effective_period:
                  additionalProperties: false
                  properties:
                    ends_on:
                      format: date
                      type: string
                    starts_on:
                      format: date
                      type: string
                  type: object
                payment_timing:
                  type: string
                price:
                  additionalProperties: false
                  properties:
                    annual_premium:
                      type: number
                    currency:
                      type: string
                    payment_method:
                      type: string
                  type: object
                status:
                  type: string
                uncertainty:
                  type: string
              type: object
            uploaded:
              items:
                additionalProperties: false
                properties:
                  filename:
                    type: string
                  type:
                    type: string
                type: object
              type: array
            payment_ui:
              additionalProperties: false
              properties:
                availability:
                  enum:
                    - ready
                    - unknown
                    - unsupported
                  type: string
                fallback_reason:
                  type: string
                mode:
                  type: string
              type: object
            field_estimates:
              items:
                additionalProperties: true
                description: Coverage Cat estimate provenance metadata for reviewed values.
                type: object
              type: array
            policy:
              additionalProperties: false
              properties:
                cancellation_note:
                  type: string
                cancelled_at:
                  format: date
                  type: string
                carrier:
                  type: string
                confirmation_timestamp:
                  format: date-time
                  type: string
                coverage_summary:
                  additionalProperties: true
                  description: Carrier-confirmed policy coverage details Coverage Cat can safely return.
                  type: object
                effective_date:
                  format: date
                  type: string
                effective_period:
                  additionalProperties: false
                  properties:
                    ends_on:
                      format: date
                      type: string
                    starts_on:
                      format: date
                      type: string
                  type: object
                policy_number:
                  type: string
                state:
                  enum:
                    - bound
                    - cancelled
                  type: string
              type: object
            payment_setup:
              additionalProperties: false
              properties:
                environment:
                  enum:
                    - test
                    - live
                  type: string
                payment_method_types:
                  items:
                    type: string
                  type: array
                provider:
                  type: string
                setup_intent_id:
                  type: string
                usage:
                  type: string
              type: object
            agent_instructions:
              items:
                type: string
              type: array
            service_requests:
              items:
                additionalProperties: false
                properties:
                  action_summary:
                    type: string
                  billing_effect:
                    type: string
                  carrier_conditions:
                    items:
                      type: string
                    type: array
                  coverage_effect:
                    type: string
                  details:
                    type: string
                  estimated_refund_status:
                    enum:
                      - not_applicable
                      - unknown_pending_review
                    type: string
                  final_outcome:
                    additionalProperties: true
                    description: Final carrier or billing outcome once Coverage Cat can confirm it.
                    type: object
                  reason:
                    type: string
                  request_id:
                    type: string
                  request_type:
                    enum:
                      - policy_cancellation
                      - refund_request
                      - support_case
                    type: string
                  requested_at:
                    format: date-time
                    type: string
                  requested_effective_date:
                    format: date
                    type: string
                  status:
                    enum:
                      - pending_review
                      - completed
                    type: string
                  uncertainty:
                    type: string
                type: object
              type: array
            missing_fields:
              description: Structured missing-value hints for homeowners pre-submit review.
              items:
                additionalProperties: true
                description: Structured missing-value hints for homeowners pre-submit review.
                type: object
              type: array
            application_submitted:
              type: boolean
            payment_url:
              description: Coverage Cat browser URL for secure payment fallback.
              format: uri
              type: string
            review_items:
              items:
                additionalProperties: false
                properties:
                  description:
                    type: string
                  display_value:
                    type: string
                  enum:
                    items:
                      type: string
                    type: array
                  label:
                    type: string
                  number:
                    type: integer
                  path:
                    items:
                      type:
                        - string
                        - integer
                    type: array
                  suggested_value: {}
                type: object
              type: array
            verification:
              additionalProperties: false
              properties:
                instructions:
                  type: string
                request_tool:
                  type: string
                required:
                  type: boolean
                retry_after_seconds:
                  minimum: 0
                  type: integer
                status:
                  enum:
                    - required
                    - pending
                    - verified
                    - not_required
                  type: string
                status_tool:
                  type: string
              required:
                - status
                - required
                - retry_after_seconds
                - request_tool
                - status_tool
                - instructions
              type: object
          required:
            - status
          type: object
        sandbox:
          description: True when Coverage Cat is returning consumer sandbox test data rather than a live shopper workflow.
          type: boolean
        uid:
          description: Coverage Cat intake uid for follow-up.
          type: string
      required:
        - uid
        - expires_at
        - review_summary
        - resume_url
        - polling_token
        - intake_access_token
      type: object
    ToolBatchOperation:
      additionalProperties: false
      properties:
        id:
          type: string
        input:
          additionalProperties: true
          type: object
        tool:
          enum:
            - home_calculator
            - umbrella_calculator
            - auto_estimates
            - collision_and_comprehensive_coverage
            - file_a_claim
            - homeowners_agent_finder
            - umbrella_limit_planner
            - umbrella_underlying_limit_check
            - umbrella_bundle_comparison
          type: string
      required:
        - tool
        - input
      type: object
    HomeownersFieldEstimate:
      description: |
        One estimated answer on a homeowners intake, whether it came from operator-side context or Coverage Cat's own probe/estimator pass. These estimates can keep delegated quoting moving, but homeowners finalization still happens in Coverage Cat's consumer portal. If the operator's system later has a real user-confirmed value for the same field, resend it in the next intake payload and Coverage Cat will overwrite the estimate.
      properties:
        confidence:
          description: |
            Coverage Cat's internal confidence, not carrier acceptance risk. Prioritize confirming `low` confidence estimates with the customer before binding.
          enum:
            - low
            - medium
            - high
          type: string
        confirmed_by_user:
          description: |
            Whether a human has re-sent this field as a confirmed answer on a subsequent update, whether from the delegated operator payload or the homeowner reviewing the pre-filled value in Coverage Cat's portal.
          type: boolean
        estimated_at:
          format: date-time
          type: string
        field:
          description: Dot-path of the field on the intake (e.g. `property_type`).
          type: string
        source:
          description: |
            Opaque provenance label for the estimate. Common operator-side labels include `crm`, `email_thread`, `policy_declarations`, and `prior_coverage_cat_session`; Coverage Cat-generated labels include `loan_file`, `zillow`, `realtor`, `vintage_rule`, and `zdr_openai`. Treat unknown values as opaque; new sources may be added over time.
          type: string
        value:
          description: Estimated value. Type matches the underlying intake field.
      type: object
    HomeownersFixIssuesEmailResponse:
      properties:
        agent_instructions:
          items:
            type: string
          type: array
        homeowner_fix_issues_request_login_url:
          description: |
            Safe homeowner-facing sign-in request page for the same fix-issues flow Coverage Cat emailed. Share this only when you need a pass-through link in chat.
          format: uri
          type: string
        operator_dashboard_url:
          description: Short-lived browser login link for the operator homeowners dashboard, usually prefiltered to this intake UID.
          format: uri
          type: string
        response_summary:
          type: string
        status:
          enum:
            - email_sent
          type: string
        uid:
          type: string
      type: object
    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
    HomeCalculatorRequest:
      additionalProperties: false
      properties:
        home_sqft:
          maximum: 25000
          minimum: 1
          type: integer
        risk_factors:
          description: Optional risk factor IDs returned by available_risk_factors.
          items:
            type: string
          type: array
        zip:
          pattern: ^[0-9]{5}$
          type: string
      required:
        - zip
        - home_sqft
      type: object
  securitySchemes:
    agent_api_key:
      scheme: bearer
      type: http
    intake_access_token:
      description: Short-lived bearer token returned by consumer-prefill and rotated by each successful direct follow-up response.
      scheme: bearer
      type: http
info:
  description: |-
    Public consumer APIs for personal shopper agents using Coverage Cat. Start here when the shopper's own AI assistant is gathering facts on their behalf and no Coverage Cat operator credential is present. Initial prefill and coarse status polling do not require a Coverage Cat operator API key or OAuth exchange. Continue the direct follow-up loop with the latest rotated `intake_access_token` returned by Coverage Cat, and after bind use `/api/intake/{uid}/policy` plus `/api/intake/{uid}/service` for homeowners or umbrella policy retrieval and policy-support follow-up. Homeowners quotes or carrier bind follow-up may take up to 48 hours, so poll the latest issue status and keep the registered customer email channel on file. During messy homeowners pre-bind follow-up, `GET /api/intake/{uid}/issues` can return `conversation.messages` plus `conversation.reply_pending`, and `PATCH /api/intake/{uid}` can answer those insurer or shopper follow-up questions in-thread with `message_reply` and `reply_to_message_id`. Coverage Cat does not collect first-party homeowners payment on this surface; carrier payment or signing links go directly to the customer's email on file. Consumer prefill/direct-follow-up writes accept optional `Idempotency-Key` headers for retry-safe replay. Use shopper data from this surface only for insurance purchase and policy-support work, not unrelated advertising or model training. See `/developers/data-handling` for the connector-specific notice and precedence rule for these surfaces. Delegated `/api/agent/*` purchase endpoints are for operator-authenticated back-office workflows and are intentionally omitted from this consumer surface.

    Versioning: send the optional `Coverage-Cat-API-Version: v1` header to pin the stable agent API contract explicitly.

    Coverage Cat keeps `v1` as the current stable agent API version by default. If a future version supersedes it, Coverage Cat will announce the change in the developer portal and emit `Deprecation` and `Sunset` headers on the retiring version for at least 90 days before removal.

    Coverage Cat also echoes `X-Skill-Version: 1.0.0` so clients can log which published runtime-contract version served the response.

    Consumer prefill/direct-follow-up writes and authenticated operator writes also accept an `Idempotency-Key` header. Coverage Cat replays the cached successful response for the same subject, path, and key for 24 hours, and rejects a changed payload under the same key.

    Public consumer handoff endpoints live at `/api/consumer/umbrella/prefill`, `/api/consumer/homeowners/prefill`, `/api/consumer/status`, and the direct follow-up intake endpoints under `/api/intake/{uid}`, including `/policy` and `/service` for homeowners and umbrella aftercare.

    Connector-use notice: Coverage Cat publishes these consumer surfaces for insurance purchase and policy-support tasks. Do not use shopper data from them for unrelated advertising or model training. See `/developers/data-handling` for the connector-specific notice and the precedence rule that governs these surfaces if broader site policies conflict.

    Rate-limited endpoints return `RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset`, and `RateLimit-Policy`. A `429` response also includes `Retry-After`.
  title: Coverage Cat Consumer Insurance Purchase APIs
  version: 1.0.0
  x-coverage-cat-consumer-openapi: /api/consumer/openapi.yaml
  x-coverage-cat-surface: consumer
  x-skill-version: 1.0.0
openapi: 3.1.0
paths:
  /api/consumer/homeowners/prefill:
    post:
      description: "Accepts the fullest consumer homeowners application you can assemble, prepares Coverage Cat's one-shot review and soft-credit consent checkpoint, and returns the handoff `uid`, a rotating `intake_access_token` for direct API follow-up, a short-lived `/intake?resume=...` browser fallback URL, and a coarse public `polling_token`. On a cold start, ask only for the shopper's full name, email, property address, and whether the property should be treated as standard homeowners, condo, or landlord coverage first. The initial `intake.home[0]` data must preserve that distinction by sending `home_ownership: owned_rental` or a rented `rental_status` for landlord coverage, `property_type: condo` for condo coverage, or both a non-rental `home_ownership` and a non-condo `property_type` for standard homeowners coverage. Then recover core shopper and occupancy facts such as date of birth, marital status, and owner-occupied vs new-purchase from user-controlled context before calling this endpoint. Until a later follow-up response shows quote progress, the application is not submitted yet. Coverage Cat can then estimate many reviewable home fields for the review card. Stay on the same consumer follow-up loop through long-lag quote polling, `/api/intake/{uid}/select`, `/api/intake/{uid}/bind`, and later `/api/intake/{uid}/policy` plus `/api/intake/{uid}/service`; do not switch to delegated operator endpoints just to keep the shopper moving. Homeowners quotes or carrier bind follow-up may take up to 48 hours, so keep polling and keep the registered customer email channel on file. Coverage Cat does not collect first-party homeowners payment in chat; any carrier payment or signing link goes directly to the customer's email on file. On the review turn, tell the shopper explicitly that Coverage Cat has not submitted the application yet, ask for any remaining items or the soft-credit Yes/No in plain English, and render gathered details plus remaining items as short labeled bullets or sections rather than a prose paragraph. If any shown value is estimated, mark each estimated bullet label or value with `*`, include the short note `* = estimated` once above and once below the list, and do not prefix every estimated line with `[Estimated]`. Successful direct follow-up responses rotate a fresh `intake_access_token`; always reuse the newest token you have."
      operationId: create_consumer_homeowners_prefill
      parameters:
        - $ref: '#/components/parameters/CoverageCatApiVersion'
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConsumerHomeownersPrefillRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConsumerPrefillResponse'
          description: Consumer homeowners handoff prepared.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Invalid request body.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Too many consumer handoff or public polling requests. Honor the Retry-After header before retrying.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Coverage Cat could not prepare the consumer homeowners handoff.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
      security: []
      summary: Create a consumer-prefill homeowners handoff.
      x-codeSamples:
        - label: POST /api/consumer/homeowners/prefill
          lang: cURL
          source: |-
            curl -X POST https://www.coveragecat.com/api/consumer/homeowners/prefill \
              -H "Coverage-Cat-API-Version: v1" \
              -H "Idempotency-Key: demo-post-api-consumer-homeowners-prefill" \
              -H "Content-Type: application/json" \
              --data-binary @- <<'JSON'
            {
              "credit_consent_pending": true,
              "intake": {
                "email": "taylor@example.test",
                "full_name": "Taylor Example",
                "home": {
                  "city": "San Francisco",
                  "home_ownership": "owned_primary",
                  "property_type": "single_family",
                  "state": "CA",
                  "street": "123 Main St",
                  "zip": "94107"
                }
              }
            }
            JSON
        - label: fetch
          lang: JavaScript
          source: |-
            const payload = {
              "credit_consent_pending": true,
              "intake": {
                "email": "taylor@example.test",
                "full_name": "Taylor Example",
                "home": {
                  "city": "San Francisco",
                  "home_ownership": "owned_primary",
                  "property_type": "single_family",
                  "state": "CA",
                  "street": "123 Main St",
                  "zip": "94107"
                }
              }
            };

            const response = await fetch("https://www.coveragecat.com/api/consumer/homeowners/prefill", {
              method: "POST",
              headers: {
                "Coverage-Cat-API-Version": "v1",
                "Idempotency-Key": "demo-post-api-consumer-homeowners-prefill",
                "Content-Type": "application/json"
              },
              body: JSON.stringify(payload)
            });
            const data = await response.json();
            console.log(data);
        - label: requests
          lang: Python
          source: |-
            import requests

            payload = {
                "credit_consent_pending": True,
                "intake": {
                "email": "taylor@example.test",
                "full_name": "Taylor Example",
                "home": {
                "city": "San Francisco",
                "home_ownership": "owned_primary",
                "property_type": "single_family",
                "state": "CA",
                "street": "123 Main St",
                "zip": "94107"
            }
            }
            }

            response = requests.post(
                "https://www.coveragecat.com/api/consumer/homeowners/prefill",
                headers={
                    "Coverage-Cat-API-Version": "v1",
                    "Idempotency-Key": "demo-post-api-consumer-homeowners-prefill",
                    "Content-Type": "application/json"
                },
                json=payload,
                timeout=30,
            )

            print(response.json())
      x-coverage-cat-surface: consumer
      x-openai-isConsequential: true
  /api/consumer/status:
    get:
      description: Returns non-PII public progress for a prior consumer handoff. Once quoted, `offer_summary` includes only quote count and premium highlights rather than direct session URLs.
      operationId: get_consumer_handoff_status
      parameters:
        - description: Opaque polling token returned by a consumer prefill response.
          in: query
          name: token
          required: true
          schema:
            type: string
        - $ref: '#/components/parameters/CoverageCatApiVersion'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConsumerStatusResponse'
          description: Current consumer handoff status.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Invalid or missing token parameter.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: No matching consumer handoff exists.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: The polling token is stale or expired.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Too many consumer handoff or public polling requests. Honor the Retry-After header before retrying.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Coverage Cat could not read the consumer handoff status.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
      security: []
      summary: Poll coarse public consumer handoff status.
      x-codeSamples:
        - label: GET /api/consumer/status
          lang: cURL
          source: |-
            curl -X GET https://www.coveragecat.com/api/consumer/status?token=polling-token \
              -H "Coverage-Cat-API-Version: v1"
        - label: fetch
          lang: JavaScript
          source: |-
            const response = await fetch("https://www.coveragecat.com/api/consumer/status?token=polling-token", {
              method: "GET",
              headers: {
                "Coverage-Cat-API-Version": "v1"
              }
            });
            const data = await response.json();
            console.log(data);
        - label: requests
          lang: Python
          source: |-
            import requests

            response = requests.get(
                "https://www.coveragecat.com/api/consumer/status?token=polling-token",
                headers={
                    "Coverage-Cat-API-Version": "v1"
                },
                timeout=30,
            )

            print(response.json())
      x-coverage-cat-surface: consumer
      x-openai-isConsequential: false
  /api/consumer/umbrella/prefill:
    post:
      description: "Accepts the fullest consumer umbrella application or estimate you can assemble, stores it at Coverage Cat's one-shot review checkpoint, and returns the handoff `uid`, a rotating `intake_access_token` for direct API follow-up, a short-lived `resume_url` browser fallback, and a coarse public `polling_token`. On a cold start, call this before you question the shopper. On the initial consumer umbrella handoff, prefer sending only `intake`; add top-level `field_estimates` only when you are certain each `field` already matches a current umbrella review field path. Use canonical consumer umbrella keys such as `address.street`, `address.city`, `address.state`, `address.zip`, `license_state`, `license_number`, `approximate_asset_value` or `net_worth_numeric`, `desired_coverage_limit`, `required_coverage_e_limit`, and `vehicle_count` or `umbrella_details.motorized_vehicle_count` for umbrella counts. Avoid top-level `street`/`city`/`state`/`zip`, `drivers_license_state`, `drivers_license_number`, `net_worth`, or `desired_umbrella_liability_limit`. Do not send `vehicles` rows before submission. Use `vehicle_count` or `umbrella_details.motorized_vehicle_count` for the household vehicle count; actual vehicle details are collected later only if a selected offer requires them, such as a Markel bind follow-up. Optional consumer sandbox: set top-level `sandbox: true` only on this first prefill call when you want a fully synthetic shopper rehearsal. That same consumer sandbox uid can then keep using `/api/intake/{uid}/issues`, `/api/intake/{uid}`, `/api/intake/{uid}/select`, `/api/intake/{uid}/bind`, `/api/intake/{uid}/attach`, `/api/intake/{uid}/payment`, `/api/intake/{uid}/policy`, `/api/intake/{uid}/service`, and `/api/consumer/status` with synthetic quotes, uploads, payment credentials, policy outcomes, and service-request results only. Until a later follow-up response shows quote progress, the application is not submitted yet. Coverage Cat may answer with a staged `review_summary.review` plus a bundled `review_summary.next_question` so the assistant can collect the shopper-owned details it still needs, such as full name, email, phone, full address, birthday, marital status, driver's license state, driver's license number, net worth, and any corrections, in one turn instead of drifting into a field-by-field questionnaire. When that happens, tell the shopper explicitly that Coverage Cat has not submitted the application yet, ask for those remaining items in plain English, and render the gathered details plus remaining items as short labeled bullets or sections rather than a prose paragraph. If any shown value is estimated, mark each estimated bullet label or value with `*`, include the short note `* = estimated` once above and once below the list, and do not prefix every estimated line with `[Estimated]`. If the staged review shows a wrong estimated umbrella count from context, patch the canonical `umbrella_details.*` count field before you show the final review. Coverage Cat will not resume or expose a prior consumer umbrella draft based on email alone. Continue an existing consumer draft only through the issued `uid` plus the current hidden MCP session or latest `intake_access_token` handoff. If the shopper replies with a birthday in MM-DD-YYYY form, normalize it to YYYY-MM-DD before the follow-up patch. Successful direct follow-up responses rotate a fresh `intake_access_token`; always reuse the newest token you have. Credit consent is not required here — Coverage Cat collects the soft-credit pull authorization after the user chooses an offer."
      operationId: create_consumer_umbrella_prefill
      parameters:
        - $ref: '#/components/parameters/CoverageCatApiVersion'
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConsumerPrefillRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConsumerPrefillResponse'
          description: Consumer umbrella handoff prepared.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Invalid request body.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Too many consumer handoff or public polling requests. Honor the Retry-After header before retrying.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Coverage Cat could not prepare the consumer umbrella handoff.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
      security: []
      summary: Create a consumer-prefill umbrella handoff.
      x-codeSamples:
        - label: POST /api/consumer/umbrella/prefill
          lang: cURL
          source: |-
            curl -X POST https://www.coveragecat.com/api/consumer/umbrella/prefill \
              -H "Coverage-Cat-API-Version: v1" \
              -H "Idempotency-Key: demo-post-api-consumer-umbrella-prefill" \
              -H "Content-Type: application/json" \
              --data-binary @- <<'JSON'
            {
              "credit_consent_pending": true,
              "intake": {
                "address": {
                  "city": "San Francisco",
                  "state": "CA",
                  "street": "123 Main St",
                  "zip": "94107"
                },
                "email": "taylor@example.test",
                "full_name": "Taylor Example",
                "license_number": "D1234567",
                "license_state": "CA",
                "vehicle_count": 1
              }
            }
            JSON
        - label: fetch
          lang: JavaScript
          source: |-
            const payload = {
              "credit_consent_pending": true,
              "intake": {
                "address": {
                  "city": "San Francisco",
                  "state": "CA",
                  "street": "123 Main St",
                  "zip": "94107"
                },
                "email": "taylor@example.test",
                "full_name": "Taylor Example",
                "license_number": "D1234567",
                "license_state": "CA",
                "vehicle_count": 1
              }
            };

            const response = await fetch("https://www.coveragecat.com/api/consumer/umbrella/prefill", {
              method: "POST",
              headers: {
                "Coverage-Cat-API-Version": "v1",
                "Idempotency-Key": "demo-post-api-consumer-umbrella-prefill",
                "Content-Type": "application/json"
              },
              body: JSON.stringify(payload)
            });
            const data = await response.json();
            console.log(data);
        - label: requests
          lang: Python
          source: |-
            import requests

            payload = {
                "credit_consent_pending": True,
                "intake": {
                "address": {
                "city": "San Francisco",
                "state": "CA",
                "street": "123 Main St",
                "zip": "94107"
            },
                "email": "taylor@example.test",
                "full_name": "Taylor Example",
                "license_number": "D1234567",
                "license_state": "CA",
                "vehicle_count": 1
            }
            }

            response = requests.post(
                "https://www.coveragecat.com/api/consumer/umbrella/prefill",
                headers={
                    "Coverage-Cat-API-Version": "v1",
                    "Idempotency-Key": "demo-post-api-consumer-umbrella-prefill",
                    "Content-Type": "application/json"
                },
                json=payload,
                timeout=30,
            )

            print(response.json())
      x-coverage-cat-surface: consumer
      x-openai-isConsequential: true
  /api/intake/{uid}:
    patch:
      description: 'Applies top-level intake edits for the consumer-prefill follow-up API. Authenticate with `Authorization: Bearer <intake_access_token>` from the latest consumer-prefill follow-up response. Use this after gathering context-backed answers; for homeowners, recover core shopper and occupancy facts from user-controlled context first, then let Coverage Cat carry estimated home-editor fields into one final review card. After a homeowners application is submitted, this same patch route can answer messy carrier or shopper follow-up in-thread with `message_reply`; when `GET /api/intake/{uid}/issues` shows `conversation.reply_pending`, echo the answer here and pass `reply_to_message_id` from that conversation payload when Coverage Cat returned one. For umbrella, use the staged review turn to send the bundled shopper-owned details and any corrections, then set `confirm_submission: true` on that same final turn. Use canonical umbrella count corrections such as `umbrella_details.motorized_vehicle_count`, never send `vehicles` rows on this pre-submit patch, and omit top-level `field_estimates` unless you are certain each field path matches a current umbrella review field. Until that final submit happens, say explicitly that the application is not submitted yet, ask for any remaining items in plain English, and present gathered details plus remaining items as short labeled bullets or sections rather than a prose paragraph. If any shown value is estimated, mark each estimated bullet label or value with `*`, include the short note `* = estimated` once above and once below the list, and do not prefix every estimated line with `[Estimated]`. If the staged review shows a wrong estimated umbrella count from context, patch the canonical `umbrella_details.*` count field before you show the final review. Coverage Cat will not resume or expose a prior consumer umbrella draft based on email alone. Continue an existing consumer draft only through the issued `uid` plus the current hidden MCP session or latest `intake_access_token` handoff. Normalize shopper birthdays from MM-DD-YYYY to YYYY-MM-DD before you send them. Reserve a single human interruption for the final review-and-submit step, keep umbrella credit consent out of this turn, and keep offer selection and post-choose bind continuation on the dedicated `/select`, `/bind`, and `/attach` routes.'
      operationId: patch_first_party_intake
      parameters:
        - $ref: '#/components/parameters/IntakeUid'
        - $ref: '#/components/parameters/CoverageCatApiVersion'
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/IntakeAssistantPatchRequest'
        required: true
      responses:
        '202':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IntakeAssistantResponse'
          description: Patch accepted. The response either reflects the updated review checkpoint or the post-submit quote-progress state.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            Location:
              $ref: '#/components/headers/Location'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Invalid patch or invalid confirm_submission value.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Invalid, missing, or stale intake access token.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: No intake exists for that uid.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Too many consumer intake follow-up requests. Honor the Retry-After header before retrying, and always retry with the newest intake access token.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
      security:
        - intake_access_token: []
      summary: Patch and optionally submit a first-party homeowners or umbrella intake.
      x-codeSamples:
        - label: PATCH /api/intake/{uid}
          lang: cURL
          source: |-
            curl -X PATCH https://www.coveragecat.com/api/intake/consumer-intake-123 \
              -H "Coverage-Cat-API-Version: v1" \
              -H "Authorization: Bearer intake-access-token" \
              -H "Idempotency-Key: demo-patch-api-intake-uid" \
              -H "Content-Type: application/json" \
              --data-binary @- <<'JSON'
            {
              "confirm_submission": true,
              "intake": {
                "marital_status": "single"
              }
            }
            JSON
        - label: fetch
          lang: JavaScript
          source: |-
            const payload = {
              "confirm_submission": true,
              "intake": {
                "marital_status": "single"
              }
            };

            const response = await fetch("https://www.coveragecat.com/api/intake/consumer-intake-123", {
              method: "PATCH",
              headers: {
                "Coverage-Cat-API-Version": "v1",
                "Authorization": "Bearer intake-access-token",
                "Idempotency-Key": "demo-patch-api-intake-uid",
                "Content-Type": "application/json"
              },
              body: JSON.stringify(payload)
            });
            const data = await response.json();
            console.log(data);
        - label: requests
          lang: Python
          source: |-
            import requests

            payload = {
                "confirm_submission": True,
                "intake": {
                "marital_status": "single"
            }
            }

            response = requests.patch(
                "https://www.coveragecat.com/api/intake/consumer-intake-123",
                headers={
                    "Coverage-Cat-API-Version": "v1",
                    "Authorization": "Bearer intake-access-token",
                    "Idempotency-Key": "demo-patch-api-intake-uid",
                    "Content-Type": "application/json"
                },
                json=payload,
                timeout=30,
            )

            print(response.json())
      x-coverage-cat-surface: consumer
      x-openai-isConsequential: true
  /api/intake/{uid}/attach:
    post:
      description: 'Use this only after the consumer umbrella follow-up reports `documents_needed`. Authenticate with `Authorization: Bearer <intake_access_token>` from the latest consumer-prefill follow-up response. Coverage Cat accepts base64-encoded PDF or image uploads and reuses the same attachment validation and OCR flow as the delegated umbrella checkout. If both the home and auto declarations are already available, prefer one attach call with `attachments[]` so the shopper only approves one upload turn. If your runtime already has the files on disk or can stream raw bytes, prefer the binary `/api/intake/{uid}/attach-upload` fallback instead of hand-building base64. Once the declarations uploads are on file for Monoline or Markel, `documents_pending_review` usually advances to `payment_needed` with a secure `payment_url` within about 5-10 minutes while declarations verification continues in parallel.'
      operationId: attach_consumer_umbrella_document
      parameters:
        - $ref: '#/components/parameters/IntakeUid'
        - $ref: '#/components/parameters/CoverageCatApiVersion'
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConsumerUmbrellaAttachRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IntakeAssistantResponse'
          description: Document attached successfully.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Invalid attachment body or file type.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Invalid, missing, or stale intake access token.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: No intake exists for that uid.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Declarations uploads are not currently allowed for this intake state.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Too many consumer intake follow-up requests. Honor the Retry-After header before retrying, and always retry with the newest intake access token.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
      security:
        - intake_access_token: []
      summary: Upload declarations for the consumer umbrella post-choose flow.
      x-codeSamples:
        - label: POST /api/intake/{uid}/attach
          lang: cURL
          source: |-
            curl -X POST https://www.coveragecat.com/api/intake/consumer-intake-123/attach \
              -H "Coverage-Cat-API-Version: v1" \
              -H "Authorization: Bearer intake-access-token" \
              -H "Idempotency-Key: demo-post-api-intake-uid-attach" \
              -H "Content-Type: application/json" \
              --data-binary @- <<'JSON'
            {
              "attachments": [
                {
                  "content": "JVBERi0xLjQKJcTl8uXrp",
                  "filename": "home-dec.pdf",
                  "type": "declarations"
                },
                {
                  "content": "JVBERi0xLjQKJcTl8uXrp",
                  "filename": "auto-dec.pdf",
                  "type": "auto_declarations"
                }
              ]
            }
            JSON
        - label: fetch
          lang: JavaScript
          source: |-
            const payload = {
              "attachments": [
                {
                  "content": "JVBERi0xLjQKJcTl8uXrp",
                  "filename": "home-dec.pdf",
                  "type": "declarations"
                },
                {
                  "content": "JVBERi0xLjQKJcTl8uXrp",
                  "filename": "auto-dec.pdf",
                  "type": "auto_declarations"
                }
              ]
            };

            const response = await fetch("https://www.coveragecat.com/api/intake/consumer-intake-123/attach", {
              method: "POST",
              headers: {
                "Coverage-Cat-API-Version": "v1",
                "Authorization": "Bearer intake-access-token",
                "Idempotency-Key": "demo-post-api-intake-uid-attach",
                "Content-Type": "application/json"
              },
              body: JSON.stringify(payload)
            });
            const data = await response.json();
            console.log(data);
        - label: requests
          lang: Python
          source: |-
            import requests

            payload = {
                "attachments": [{
                "content": "JVBERi0xLjQKJcTl8uXrp",
                "filename": "home-dec.pdf",
                "type": "declarations"
            }, {
                "content": "JVBERi0xLjQKJcTl8uXrp",
                "filename": "auto-dec.pdf",
                "type": "auto_declarations"
            }]
            }

            response = requests.post(
                "https://www.coveragecat.com/api/intake/consumer-intake-123/attach",
                headers={
                    "Coverage-Cat-API-Version": "v1",
                    "Authorization": "Bearer intake-access-token",
                    "Idempotency-Key": "demo-post-api-intake-uid-attach",
                    "Content-Type": "application/json"
                },
                json=payload,
                timeout=30,
            )

            print(response.json())
      x-coverage-cat-surface: consumer
      x-openai-isConsequential: true
  /api/intake/{uid}/attach-upload:
    post:
      description: 'Use this only after the consumer umbrella follow-up reports `documents_needed`. Authenticate with `Authorization: Bearer <intake_access_token>` from the latest consumer-prefill follow-up response. This raw-binary fallback is intended for local agents or runtimes that already have a PDF, PNG, JPG, or JPEG on disk and want to avoid inlining base64 in JSON. Send `type=declarations` for the home/renters/landlord declarations page or `type=auto_declarations` for the auto declarations page, set `filename` in the query string or `X-Client-Name`, and stream the file body as `application/octet-stream`. Uploading the file itself is usually quick once the documents are available; after Coverage Cat has the uploads on file, secure checkout is usually ready within about 5-10 minutes while declarations verification continues in parallel.'
      operationId: attach_consumer_umbrella_document_binary
      parameters:
        - $ref: '#/components/parameters/IntakeUid'
        - description: Which declarations slot this uploaded file should fill.
          in: query
          name: type
          required: true
          schema:
            enum:
              - declarations
              - auto_declarations
            type: string
        - description: Optional original filename. If omitted, send the same value in the X-Client-Name header.
          in: query
          name: filename
          required: false
          schema:
            type: string
        - $ref: '#/components/parameters/CoverageCatApiVersion'
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        content:
          application/octet-stream:
            schema:
              format: binary
              type: string
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IntakeAssistantResponse'
          description: Document attached successfully.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Invalid file type or upload parameters.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Invalid, missing, or stale intake access token.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: No intake exists for that uid.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Declarations uploads are not currently allowed for this intake state.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Too many consumer intake follow-up requests. Honor the Retry-After header before retrying, and always retry with the newest intake access token.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
      security:
        - intake_access_token: []
      summary: Stream one declarations file without base64 for the consumer umbrella post-choose flow.
      x-codeSamples:
        - label: POST /api/intake/{uid}/attach-upload
          lang: cURL
          source: |-
            curl -X POST https://www.coveragecat.com/api/intake/consumer-intake-123/attach-upload \
              -H "Coverage-Cat-API-Version: v1" \
              -H "Authorization: Bearer intake-access-token" \
              -H "Idempotency-Key: demo-post-api-intake-uid-attach-upload"
        - label: fetch
          lang: JavaScript
          source: |-
            const response = await fetch("https://www.coveragecat.com/api/intake/consumer-intake-123/attach-upload", {
              method: "POST",
              headers: {
                "Coverage-Cat-API-Version": "v1",
                "Authorization": "Bearer intake-access-token",
                "Idempotency-Key": "demo-post-api-intake-uid-attach-upload"
              }
            });
            const data = await response.json();
            console.log(data);
        - label: requests
          lang: Python
          source: |-
            import requests

            response = requests.post(
                "https://www.coveragecat.com/api/intake/consumer-intake-123/attach-upload",
                headers={
                    "Coverage-Cat-API-Version": "v1",
                    "Authorization": "Bearer intake-access-token",
                    "Idempotency-Key": "demo-post-api-intake-uid-attach-upload"
                },
                timeout=30,
            )

            print(response.json())
      x-coverage-cat-surface: consumer
      x-openai-isConsequential: true
  /api/intake/{uid}/bind:
    post:
      description: "Use this only after the current direct-follow-up payload says bind can continue. Authenticate with `Authorization: Bearer <intake_access_token>` from the latest consumer-prefill follow-up response. For umbrella, use this after `needs_more_info_to_bind` or `ready_to_finalize`, then send only the current bind-stage `next_question` fields inside `intake`. For homeowners, use this only after select returns `ready_to_finalize`, then send `preview_token` plus `bind_confirmed: true` to start carrier bind follow-up. Homeowners quotes or carrier bind follow-up may take up to 48 hours, and any carrier payment or signing link will be sent directly to the customer's email on file rather than a first-party payment endpoint."
      operationId: continue_consumer_bind
      parameters:
        - $ref: '#/components/parameters/IntakeUid'
        - $ref: '#/components/parameters/CoverageCatApiVersion'
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConsumerBindRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IntakeAssistantResponse'
          description: Updated consumer homeowners or umbrella bind follow-up state.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Invalid bind patch.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Invalid, missing, or stale intake access token.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: No intake exists for that uid.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: The selected offer state is stale or the intake is not currently ready for bind continuation.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Too many consumer intake follow-up requests. Honor the Retry-After header before retrying, and always retry with the newest intake access token.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
      security:
        - intake_access_token: []
      summary: Continue the consumer homeowners or umbrella bind follow-up in chat.
      x-codeSamples:
        - label: POST /api/intake/{uid}/bind
          lang: cURL
          source: |-
            curl -X POST https://www.coveragecat.com/api/intake/consumer-intake-123/bind \
              -H "Coverage-Cat-API-Version: v1" \
              -H "Authorization: Bearer intake-access-token" \
              -H "Idempotency-Key: demo-post-api-intake-uid-bind" \
              -H "Content-Type: application/json" \
              --data-binary @- <<'JSON'
            {
              "intake": {
                "current_auto_coverages": "250_500_100"
              }
            }
            JSON
        - label: fetch
          lang: JavaScript
          source: |-
            const payload = {
              "intake": {
                "current_auto_coverages": "250_500_100"
              }
            };

            const response = await fetch("https://www.coveragecat.com/api/intake/consumer-intake-123/bind", {
              method: "POST",
              headers: {
                "Coverage-Cat-API-Version": "v1",
                "Authorization": "Bearer intake-access-token",
                "Idempotency-Key": "demo-post-api-intake-uid-bind",
                "Content-Type": "application/json"
              },
              body: JSON.stringify(payload)
            });
            const data = await response.json();
            console.log(data);
        - label: requests
          lang: Python
          source: |-
            import requests

            payload = {
                "intake": {
                "current_auto_coverages": "250_500_100"
            }
            }

            response = requests.post(
                "https://www.coveragecat.com/api/intake/consumer-intake-123/bind",
                headers={
                    "Coverage-Cat-API-Version": "v1",
                    "Authorization": "Bearer intake-access-token",
                    "Idempotency-Key": "demo-post-api-intake-uid-bind",
                    "Content-Type": "application/json"
                },
                json=payload,
                timeout=30,
            )

            print(response.json())
      x-coverage-cat-surface: consumer
      x-openai-isConsequential: true
  /api/intake/{uid}/issues:
    get:
      description: "Returns a line-aware follow-up payload for a consumer-prefill homeowners or umbrella intake uid. Authenticate with `Authorization: Bearer <intake_access_token>` from the latest consumer-prefill follow-up response. Before submission, this exposes the one-time review checkpoint and any remaining missing or estimated values, and the agent should say explicitly that the application is not submitted yet before asking for anything else. Present gathered details, review facts, and remaining items as short labeled bullets or sections rather than a prose paragraph. If any shown value is estimated, mark each estimated bullet label or value with `*`, include the short note `* = estimated` once above and once below the list, and do not prefix every estimated line with `[Estimated]`. For homeowners, treat those missing fields as a behind-the-scenes enrichment backlog rather than a first-turn questionnaire, and keep recovering context-backed answers until the payload is ready for one review card. After submission, homeowners issue payloads can stay in `pending_quotes` or `waiting_on_carrier` for up to 48 hours; keep polling and use the returned notification-channel details to keep the registered customer email on file. When the homeowners carrier or chat thread needs another answer, Coverage Cat returns `conversation.messages`, `conversation.reply_pending`, and `conversation.reply_to_message_id` so the assistant can answer the follow-up in chat with the patch route instead of breaking out to delegated tools. Homeowners quoted offers include `selection_token`, the select step can return a `purchase_preview` plus `preview_token`, and any carrier payment or signing link will go directly to the customer's email on file rather than a first-party payment endpoint. For umbrella, Coverage Cat may keep `status: needs_more_info` while still returning a staged `review` preview plus a bundled `next_question` for the final shopper-owned review turn, so the assistant can collect details such as full name, email, phone, full address, birthday, marital status, driver's license state, driver's license number, net worth, and any corrections in one message rather than one field at a time. Once quotes are ready, `selection_guidance.same_reply_requirements` can preview small carrier-specific bind questions for a chosen offer so the shopper can answer those in the same selection reply instead of opening a second turn. If the staged review shows a wrong estimated umbrella count from context, patch the canonical `umbrella_details.*` count field before you show the final review. Coverage Cat will not resume or expose a prior consumer umbrella draft based on email alone. Continue an existing consumer draft only through the issued `uid` plus the current hidden MCP session or latest `intake_access_token` handoff. If the shopper gives a birthday in MM-DD-YYYY form, normalize it to YYYY-MM-DD before the patch call. After submission, umbrella issue payloads expose quote progress, structured umbrella offers with `selection_token`, detailed post-choose umbrella states, payment_setup details once secure Stripe collection is prepared, and a refreshed `intake_access_token` for the next direct follow-up call. For Monoline and Markel, once declarations uploads are on file, `documents_pending_review` usually advances to `payment_needed` with a secure `payment_url` within about 5-10 minutes while declarations verification continues in parallel."
      operationId: get_first_party_intake_issues
      parameters:
        - $ref: '#/components/parameters/IntakeUid'
        - $ref: '#/components/parameters/CoverageCatApiVersion'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IntakeAssistantResponse'
          description: Current first-party assistant intake status.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Unsupported line or invalid request.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Invalid, missing, or stale intake access token.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: No intake exists for that uid.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Too many consumer intake follow-up requests. Honor the Retry-After header before retrying, and always retry with the newest intake access token.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
      security:
        - intake_access_token: []
      summary: Read first-party assistant blockers or quote progress for a homeowners or umbrella intake.
      x-codeSamples:
        - label: GET /api/intake/{uid}/issues
          lang: cURL
          source: |-
            curl -X GET https://www.coveragecat.com/api/intake/consumer-intake-123/issues \
              -H "Coverage-Cat-API-Version: v1" \
              -H "Authorization: Bearer intake-access-token"
        - label: fetch
          lang: JavaScript
          source: |-
            const response = await fetch("https://www.coveragecat.com/api/intake/consumer-intake-123/issues", {
              method: "GET",
              headers: {
                "Coverage-Cat-API-Version": "v1",
                "Authorization": "Bearer intake-access-token"
              }
            });
            const data = await response.json();
            console.log(data);
        - label: requests
          lang: Python
          source: |-
            import requests

            response = requests.get(
                "https://www.coveragecat.com/api/intake/consumer-intake-123/issues",
                headers={
                    "Coverage-Cat-API-Version": "v1",
                    "Authorization": "Bearer intake-access-token"
                },
                timeout=30,
            )

            print(response.json())
      x-coverage-cat-surface: consumer
      x-openai-isConsequential: false
  /api/intake/{uid}/payment:
    post:
      description: 'Use this only after the consumer umbrella follow-up reports `payment_needed`. Authenticate with `Authorization: Bearer <intake_access_token>` from the latest consumer-prefill follow-up response. First call this endpoint with `payment_collection_requested: true` to request a secure Stripe SetupIntent session; this native step comes before handing the shopper to `payment_url`. If your runtime can render the registered secure payment UI, display it and wait for completion; do not collect card details through conversational text. Then call this same endpoint again with `setup_intent_id` and `payment_method_id` so Coverage Cat can place the reusable payment method on file. If the secure UI is unavailable or setup fails in chat, use the returned `payment_url` browser fallback and preserve the specific fallback reason. When `payment_needed` appears, the current checkout price shown came directly from the insurer while Coverage Cat is down to final declarations verification before charging the card. Never describe successful payment-method setup as premium collected or active insurance.'
      operationId: collect_consumer_umbrella_payment_method
      parameters:
        - $ref: '#/components/parameters/IntakeUid'
        - $ref: '#/components/parameters/CoverageCatApiVersion'
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConsumerUmbrellaPaymentRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IntakeAssistantResponse'
          description: Payment collection is ready or the payment method is now on file.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Invalid payment request.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Invalid, missing, or stale intake access token.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: No intake exists for that uid.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: The intake is not currently ready for payment collection or the submitted payment state is stale.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Too many consumer intake follow-up requests. Honor the Retry-After header before retrying, and always retry with the newest intake access token.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
      security:
        - intake_access_token: []
      summary: Prepare or complete consumer umbrella payment collection in chat.
      x-codeSamples:
        - label: POST /api/intake/{uid}/payment
          lang: cURL
          source: |-
            curl -X POST https://www.coveragecat.com/api/intake/consumer-intake-123/payment \
              -H "Coverage-Cat-API-Version: v1" \
              -H "Authorization: Bearer intake-access-token" \
              -H "Idempotency-Key: demo-post-api-intake-uid-payment" \
              -H "Content-Type: application/json" \
              --data-binary @- <<'JSON'
            {
              "payment_collection_requested": true
            }
            JSON
        - label: fetch
          lang: JavaScript
          source: |-
            const payload = {
              "payment_collection_requested": true
            };

            const response = await fetch("https://www.coveragecat.com/api/intake/consumer-intake-123/payment", {
              method: "POST",
              headers: {
                "Coverage-Cat-API-Version": "v1",
                "Authorization": "Bearer intake-access-token",
                "Idempotency-Key": "demo-post-api-intake-uid-payment",
                "Content-Type": "application/json"
              },
              body: JSON.stringify(payload)
            });
            const data = await response.json();
            console.log(data);
        - label: requests
          lang: Python
          source: |-
            import requests

            payload = {
                "payment_collection_requested": True
            }

            response = requests.post(
                "https://www.coveragecat.com/api/intake/consumer-intake-123/payment",
                headers={
                    "Coverage-Cat-API-Version": "v1",
                    "Authorization": "Bearer intake-access-token",
                    "Idempotency-Key": "demo-post-api-intake-uid-payment",
                    "Content-Type": "application/json"
                },
                json=payload,
                timeout=30,
            )

            print(response.json())
      x-coverage-cat-surface: consumer
      x-openai-isConsequential: true
  /api/intake/{uid}/policy:
    get:
      description: 'Use this only after Coverage Cat reports a policy on file for the homeowners or umbrella direct-follow-up flow. Authenticate with `Authorization: Bearer <intake_access_token>` from the latest consumer-prefill or follow-up response. The response can include a bound or cancelled policy record, available policy documents, existing cancellation/refund/support request history, a browser next_action, and the support contact URL. In the consumer umbrella sandbox, every policy, document, and service-history value is synthetic test data only.'
      operationId: get_consumer_policy
      parameters:
        - $ref: '#/components/parameters/IntakeUid'
        - $ref: '#/components/parameters/CoverageCatApiVersion'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IntakeAssistantResponse'
          description: Current homeowners or umbrella policy record and servicing history.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Unsupported line or invalid request.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Invalid, missing, or stale intake access token.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: No intake exists for that uid.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Coverage Cat does not have a homeowners or umbrella policy record on file for that uid yet.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Too many consumer intake follow-up requests. Honor the Retry-After header before retrying, and always retry with the newest intake access token.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
      security:
        - intake_access_token: []
      summary: Read the current consumer homeowners or umbrella policy record and servicing history.
      x-codeSamples:
        - label: GET /api/intake/{uid}/policy
          lang: cURL
          source: |-
            curl -X GET https://www.coveragecat.com/api/intake/consumer-intake-123/policy \
              -H "Coverage-Cat-API-Version: v1" \
              -H "Authorization: Bearer intake-access-token"
        - label: fetch
          lang: JavaScript
          source: |-
            const response = await fetch("https://www.coveragecat.com/api/intake/consumer-intake-123/policy", {
              method: "GET",
              headers: {
                "Coverage-Cat-API-Version": "v1",
                "Authorization": "Bearer intake-access-token"
              }
            });
            const data = await response.json();
            console.log(data);
        - label: requests
          lang: Python
          source: |-
            import requests

            response = requests.get(
                "https://www.coveragecat.com/api/intake/consumer-intake-123/policy",
                headers={
                    "Coverage-Cat-API-Version": "v1",
                    "Authorization": "Bearer intake-access-token"
                },
                timeout=30,
            )

            print(response.json())
      x-coverage-cat-surface: consumer
      x-openai-isConsequential: false
  /api/intake/{uid}/select:
    post:
      description: "Use this only after `GET /api/intake/{uid}/issues` returns structured offers with `selection_token`. Authenticate with `Authorization: Bearer <intake_access_token>` from the latest consumer-prefill follow-up response. For homeowners, this stages the selected offer for one final bind approval and returns `purchase_preview`, `preview_token`, carrier-direct payment guidance, and the registered notification channel; it does not collect payment and does not start carrier bind follow-up yet. For umbrella, Coverage Cat collects consent for a soft credit check here, after the user chooses an offer. If an umbrella offer exposes `um_uim_selection`, send the shopper's include-or-decline choice here as `um_uim_election` on the first select call. If the umbrella quote payload exposed `selection_guidance.same_reply_requirements` for the chosen offer, send those answers under `intake` on this first select call so the shopper can finish selection in one reply. If Coverage Cat still returns `credit_consent_required` with a bind-stage `next_question`, ask for both the soft-credit-check consent and those bind details in one shopper-facing turn, then retry this same endpoint with both `credit_consent` and the bind-stage answers under `intake`. Successful responses return detailed post-choose states rather than collapsing back into a coarse quoted bucket. For homeowners, any carrier payment or signing link will later be sent directly to the customer's email on file. For Monoline and Markel umbrella offers, once declarations uploads are on file, `documents_pending_review` usually transitions to `payment_needed` with a secure `payment_url` within about 5-10 minutes while declarations verification continues in parallel."
      operationId: select_consumer_offer
      parameters:
        - $ref: '#/components/parameters/IntakeUid'
        - $ref: '#/components/parameters/CoverageCatApiVersion'
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConsumerSelectRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IntakeAssistantResponse'
          description: Selection accepted or the next bind-stage state is ready.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Invalid selection request.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Invalid, missing, or stale intake access token.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: No intake exists for that uid.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: The selection token is stale, consent is missing, or the intake is not ready for selection.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Too many consumer intake follow-up requests. Honor the Retry-After header before retrying, and always retry with the newest intake access token.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
      security:
        - intake_access_token: []
      summary: Select a quoted homeowners or umbrella offer on the consumer direct-follow-up path.
      x-codeSamples:
        - label: POST /api/intake/{uid}/select
          lang: cURL
          source: |-
            curl -X POST https://www.coveragecat.com/api/intake/consumer-intake-123/select \
              -H "Coverage-Cat-API-Version: v1" \
              -H "Authorization: Bearer intake-access-token" \
              -H "Idempotency-Key: demo-post-api-intake-uid-select" \
              -H "Content-Type: application/json" \
              --data-binary @- <<'JSON'
            {
              "credit_consent": {
                "answer": "Yes",
                "collected_from_user": true
              },
              "selection_confirmed": true,
              "selection_token": "sel_demo"
            }
            JSON
        - label: fetch
          lang: JavaScript
          source: |-
            const payload = {
              "credit_consent": {
                "answer": "Yes",
                "collected_from_user": true
              },
              "selection_confirmed": true,
              "selection_token": "sel_demo"
            };

            const response = await fetch("https://www.coveragecat.com/api/intake/consumer-intake-123/select", {
              method: "POST",
              headers: {
                "Coverage-Cat-API-Version": "v1",
                "Authorization": "Bearer intake-access-token",
                "Idempotency-Key": "demo-post-api-intake-uid-select",
                "Content-Type": "application/json"
              },
              body: JSON.stringify(payload)
            });
            const data = await response.json();
            console.log(data);
        - label: requests
          lang: Python
          source: |-
            import requests

            payload = {
                "credit_consent": {
                "answer": "Yes",
                "collected_from_user": True
            },
                "selection_confirmed": True,
                "selection_token": "sel_demo"
            }

            response = requests.post(
                "https://www.coveragecat.com/api/intake/consumer-intake-123/select",
                headers={
                    "Coverage-Cat-API-Version": "v1",
                    "Authorization": "Bearer intake-access-token",
                    "Idempotency-Key": "demo-post-api-intake-uid-select",
                    "Content-Type": "application/json"
                },
                json=payload,
                timeout=30,
            )

            print(response.json())
      x-coverage-cat-surface: consumer
      x-openai-isConsequential: true
  /api/intake/{uid}/service:
    post:
      description: 'Use this only after Coverage Cat reports a policy on file for the homeowners or umbrella direct-follow-up flow. Authenticate with `Authorization: Bearer <intake_access_token>` from the latest consumer-prefill or follow-up response. Send `request_type` plus `reason`, and send `requested_effective_date` for `policy_cancellation`. Omit `confirm_request` or send false to preview the consequences first. Send `confirm_request: true` only after the shopper approves opening the request. Opening a request does not itself confirm cancellation, a refund amount, or final issue resolution.'
      operationId: request_consumer_policy_service
      parameters:
        - $ref: '#/components/parameters/IntakeUid'
        - $ref: '#/components/parameters/CoverageCatApiVersion'
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConsumerPolicyServiceRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IntakeAssistantResponse'
          description: Preview prepared or service request opened.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Invalid service request body.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Invalid, missing, or stale intake access token.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: No intake exists for that uid.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Coverage Cat does not have a homeowners or umbrella policy record on file for that uid yet.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Too many consumer intake follow-up requests. Honor the Retry-After header before retrying, and always retry with the newest intake access token.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
      security:
        - intake_access_token: []
      summary: Preview or open a consumer homeowners or umbrella policy-support request.
      x-codeSamples:
        - label: POST /api/intake/{uid}/service
          lang: cURL
          source: |-
            curl -X POST https://www.coveragecat.com/api/intake/consumer-intake-123/service \
              -H "Coverage-Cat-API-Version: v1" \
              -H "Authorization: Bearer intake-access-token" \
              -H "Idempotency-Key: demo-post-api-intake-uid-service" \
              -H "Content-Type: application/json" \
              --data-binary @- <<'JSON'
            {
              "details": "Please confirm whether any refund is pending.",
              "reason": "Need billing help",
              "request_type": "support_case"
            }
            JSON
        - label: fetch
          lang: JavaScript
          source: |-
            const payload = {
              "details": "Please confirm whether any refund is pending.",
              "reason": "Need billing help",
              "request_type": "support_case"
            };

            const response = await fetch("https://www.coveragecat.com/api/intake/consumer-intake-123/service", {
              method: "POST",
              headers: {
                "Coverage-Cat-API-Version": "v1",
                "Authorization": "Bearer intake-access-token",
                "Idempotency-Key": "demo-post-api-intake-uid-service",
                "Content-Type": "application/json"
              },
              body: JSON.stringify(payload)
            });
            const data = await response.json();
            console.log(data);
        - label: requests
          lang: Python
          source: |-
            import requests

            payload = {
                "details": "Please confirm whether any refund is pending.",
                "reason": "Need billing help",
                "request_type": "support_case"
            }

            response = requests.post(
                "https://www.coveragecat.com/api/intake/consumer-intake-123/service",
                headers={
                    "Coverage-Cat-API-Version": "v1",
                    "Authorization": "Bearer intake-access-token",
                    "Idempotency-Key": "demo-post-api-intake-uid-service",
                    "Content-Type": "application/json"
                },
                json=payload,
                timeout=30,
            )

            print(response.json())
      x-coverage-cat-surface: consumer
      x-openai-isConsequential: true
  /api/intake/{uid}/verify-email:
    post:
      description: "Use when the latest issue status has verification.required: true. Authenticate with the intake_access_token. Send confirm_send: true only after shopper approval. Delivery uses only the application's email on file and never returns the login link. The shopper opens the email link; poll /api/intake/{uid}/issues until verification.required is false."
      operationId: verify_consumer_intake_email
      parameters:
        - $ref: '#/components/parameters/IntakeUid'
        - $ref: '#/components/parameters/CoverageCatApiVersion'
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        content:
          application/json:
            schema:
              additionalProperties: false
              properties:
                confirm_send:
                  enum:
                    - true
                  type: boolean
              required:
                - confirm_send
              type: object
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IntakeAssistantResponse'
          description: Verification email sent, or verification is not required.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Shopper confirmation is missing or parameters are invalid.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Invalid, missing, or stale intake access token.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: No authorized intake was found.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Delivery failed or a recent email is still pending.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Too many consumer intake follow-up requests. Honor the Retry-After header before retrying, and always retry with the newest intake access token.
          headers:
            Coverage-Cat-API-Version:
              $ref: '#/components/headers/CoverageCatApiVersion'
            RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimitPolicy'
            RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
            X-Skill-Version:
              $ref: '#/components/headers/SkillVersion'
      security:
        - intake_access_token: []
      summary: Send a requested verification email to the shopper.
      x-codeSamples:
        - label: POST /api/intake/{uid}/verify-email
          lang: cURL
          source: |-
            curl -X POST https://www.coveragecat.com/api/intake/consumer-intake-123/verify-email \
              -H "Coverage-Cat-API-Version: v1" \
              -H "Authorization: Bearer intake-access-token" \
              -H "Idempotency-Key: demo-post-api-intake-uid-verify-email" \
              -H "Content-Type: application/json" \
              --data-binary @- <<'JSON'
            {
              "confirm_send": true
            }
            JSON
        - label: fetch
          lang: JavaScript
          source: |-
            const payload = {
              "confirm_send": true
            };

            const response = await fetch("https://www.coveragecat.com/api/intake/consumer-intake-123/verify-email", {
              method: "POST",
              headers: {
                "Coverage-Cat-API-Version": "v1",
                "Authorization": "Bearer intake-access-token",
                "Idempotency-Key": "demo-post-api-intake-uid-verify-email",
                "Content-Type": "application/json"
              },
              body: JSON.stringify(payload)
            });
            const data = await response.json();
            console.log(data);
        - label: requests
          lang: Python
          source: |-
            import requests

            payload = {
                "confirm_send": True
            }

            response = requests.post(
                "https://www.coveragecat.com/api/intake/consumer-intake-123/verify-email",
                headers={
                    "Coverage-Cat-API-Version": "v1",
                    "Authorization": "Bearer intake-access-token",
                    "Idempotency-Key": "demo-post-api-intake-uid-verify-email",
                    "Content-Type": "application/json"
                },
                json=payload,
                timeout=30,
            )

            print(response.json())
      x-coverage-cat-surface: consumer
      x-openai-isConsequential: true
security: []
servers:
  - description: Current request origin
    url: https://www.coveragecat.com
