1Fort broker (v2): quotes API

**Access:** requires a JWT access token.

OpenAPI Specification

1fort-broker-v2-quotes-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: '1Fort API Documentation broker (v2): quotes API'
  description: '# 1Fort API


    REST API for the 1Fort insurance platform. This document is the authoritative

    map of the API surface; endpoints are grouped in the sidebar by **app** and

    **version**, and large apps are split into per-resource sub-groups.


    ## Authentication


    Almost every endpoint requires a **JWT access token**. Send it in the

    `Authorization` header as either `Bearer <token>` or `JWT <token>`. Tokens may

    also be presented as an HTTP-only cookie. Endpoints documented with no security

    requirement are intentionally public (for example sign-in, OTP and storefront

    endpoints).


    ## Multi-tenancy


    Resources are scoped to a tenant. Nested routes carry the owning resource id in

    the path (for example `/v2/broker/{business_pk}/applications`); a token is only

    authorised for the businesses its user may access. Object-level permissions are

    enforced per endpoint.


    ## Versioning


    `v2` endpoints live under `/apis/v2/...` and are the current surface. `v1`

    endpoints remain documented for compatibility. Endpoints marked **deprecated**

    are scheduled for removal; prefer the documented replacement.

    '
  termsOfService: https://www.1fort.com/
  license:
    name: Privately owned
  version: v1
servers:
- url: https://api.1fort.com/apis/
security:
- Bearer: []
tags:
- name: 'broker (v2): quotes'
  x-displayName: Quotes
  description: '**Access:** requires a JWT access token.'
paths:
  /v2/broker/quotes:
    parameters: []
    get:
      operationId: v2_broker_quotes_list
      summary: Paginated ViewSet for retrieving quotes for the broker.
      description: "Supports Filtering By:\n- insured\n- has_tasks\n- status\n- payment_status\n- coverage_type\n- carrier (carrier UUID; comma-separated for multiple)\n- wholesaler (wholesaler UUID; comma-separated for multiple)\n- broker (Agent ID)\n- effective_date_min (minimum effective date, inclusive)\n- effective_date_max (maximum effective date, inclusive)\n\nSupports Searching By:\n- insured\n\nSupports Sorting By:\n- created_at\n- effective_date\n\nAdditional actions:\n- GET ``filter-options``: returns the distinct carriers and wholesalers\n  that appear in the broker's quotes, for populating filter dropdowns\n  without fetching the global carrier/wholesaler lists."
      parameters:
      - name: insured
        in: query
        description: 'Filter quotes by insured name.


          Examples:

          - `?insured=Acme Inc.` - Matches quotes with ''Acme Inc.'' in insured name

          - `?insured=Acme Inc., Acme Corp.` - Matches quotes with ''Acme Inc.'' or ''Acme Corp.'' in insured name'
        required: false
        schema:
          type: string
      - name: status
        in: query
        description: "Filter quotes by effective status. Supports comma-separated values.\n\n**Important:** For 'active' and 'expired' filters, this considers the `quote_validity_date` to determine the effective status, not just the database status field.\n\n**Status Behavior:**\n- `active` - Matches quotes with database status 'active' AND validity date in the future (or null)\n- `expired` - Matches quotes with:\n  - Database status 'expired', OR\n  - In-progress statuses (active, pending, referred, referral, awaiting_payment) with past validity date\n  - **Note:** Terminal statuses (declined, rejected, unsupported, unresponsive, archived) and bound statuses (bound, bind_requested) remain in their final state regardless of validity date\n- Other statuses (pending, declined, etc.) - Matches database status directly\n\n**Available statuses:**\n- `active`, `pending`, `referred`, `referral`, `declined`, `rejected`, `unsupported`, `unresponsive`, `expired`, `bind_requested`, `awaiting_payment`, `bound`, `archived`\n\n**Examples:**\n- `?status=active` - Active quotes that haven't expired by date\n- `?status=expired` - Quotes that are expired (by status or date)\n- `?status=active,pending` - Active or pending quotes\n- `?status=declined` - Declined quotes (remains declined regardless of validity date)"
        required: false
        schema:
          type: string
      - name: payment_status
        in: query
        description: 'Filter quotes by unified billing status (Ascend program and/or native checkout). Supports comma-separated values.


          Special value:

          - `pending` - No Ascend program / no program status, and no active native checkout invoice (or program row with blank status and no draft/open/partial/paid checkout)


          Standard values:

          - `created`, `ready_for_checkout`, `elected`, `checked_out`, `purchased`, `archived` — for native checkout, `created` maps to checkout draft; `ready_for_checkout` to open/partially paid; `purchased` to paid; `elected`/`checked_out`/`archived` remain Ascend program only.


          Examples:

          - `?payment_status=purchased` - Matches quotes with purchased Ascend program or paid native checkout

          - `?payment_status=ready_for_checkout` - Ascend ready_for_checkout or native checkout open/partially paid

          - `?payment_status=purchased,checked_out` - Matches either status

          - `?payment_status=pending,purchased` - Pending (no billing activity) OR purchased'
        required: false
        schema:
          type: string
      - name: coverage_type
        in: query
        description: 'Filter quotes by coverage type.


          Examples:

          - `?coverage_type=CYBER` - Matches quotes with ''CYBER'' in coverage type

          - `?coverage_type=CYBER, GENERAL_LIABILITY` - Matches quotes with ''CYBER'' or ''GENERAL_LIABILITY'' in coverage type'
        required: false
        schema:
          type: string
      - name: carrier
        in: query
        description: 'Filter quotes by carrier (market) UUID. Matches the quote''s carrier, the product''s carrier, or a carrier on any coverage under the quote''s coverage term. Supports comma-separated values for multiple carriers. Non-UUID tokens are ignored; if no valid UUIDs remain after parsing, the result set is empty.


          Examples:

          - `?carrier=<uuid>` - Quotes for that carrier

          - `?carrier=<uuid1>,<uuid2>` - Quotes for either carrier'
        required: false
        schema:
          type: string
      - name: wholesaler
        in: query
        description: wholesaler
        required: false
        schema:
          type: string
      - name: has_tasks
        in: query
        description: 'Filter quotes by whether they have tasks.


          Examples:

          - `?has_tasks=true` - Matches quotes with tasks

          - `?has_tasks=false` - Matches quotes without tasks'
        required: false
        schema:
          type: boolean
      - name: broker
        in: query
        description: 'Filter quotes by broker agent ID (BrokerUser). Supports comma-separated values to filter by multiple agents.


          Examples:

          - `?broker=20` - Matches quotes where agent with ID 20 is assigned

          - `?broker=20,21,22` - Matches quotes where agents with IDs 20, 21, or 22 are assigned'
        required: false
        schema:
          type: string
      - name: effective_date_min
        in: query
        description: 'Filter quotes by minimum effective date (inclusive). Use ISO 8601 date format.


          Examples:

          - `?effective_date_min=2024-01-01` - Matches quotes with effective date on or after January 1, 2024

          - `?effective_date_min=2024-01-01&effective_date_max=2024-12-31` - Matches quotes with effective date in 2024'
        required: false
        schema:
          type: string
          format: date
      - name: effective_date_max
        in: query
        description: 'Filter quotes by maximum effective date (inclusive). Use ISO 8601 date format.


          Examples:

          - `?effective_date_max=2024-12-31` - Matches quotes with effective date on or before December 31, 2024

          - `?effective_date_min=2024-01-01&effective_date_max=2024-12-31` - Matches quotes with effective date in 2024'
        required: false
        schema:
          type: string
          format: date
      - name: search
        in: query
        description: A search term.
        required: false
        schema:
          type: string
      - name: ordering
        in: query
        description: 'Sort quotes by specified field. Use a minus sign (-) prefix for descending order.


          **Available fields:**

          - `created_at` - Sort by creation date (default: newest first)

          - `effective_date` - Sort by policy effective date


          **Examples:**

          - `?ordering=-created_at` - Sort by newest first (default)

          - `?ordering=created_at` - Sort by oldest first

          - `?ordering=-effective_date` - Sort by newest effective date first

          - `?ordering=effective_date` - Sort by oldest effective date first'
        required: false
        schema:
          type: string
      - name: limit
        in: query
        description: Number of results to return per page.
        required: false
        schema:
          type: integer
      - name: offset
        in: query
        description: The initial index from which to return the results.
        required: false
        schema:
          type: integer
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                required:
                - count
                - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type:
                    - string
                    - 'null'
                    format: uri
                  previous:
                    type:
                    - string
                    - 'null'
                    format: uri
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/BrokerQuoteV2FlexFields'
        '403':
          description: Authentication credentials were invalid, absent or insufficient.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericError'
        '500':
          description: Internal server error.
      tags:
      - 'broker (v2): quotes'
  /v2/broker/quotes/filter-options:
    parameters: []
    get:
      operationId: v2_broker_quotes_filter_options
      summary: Return distinct markets (carriers and wholesalers) for the broker's quotes.
      description: 'Used to populate the Markets filter on the broker /quotes page without

        loading the full global carrier/wholesaler catalogues. Honors the same

        role-based scoping as the list endpoint (members only see quotes for

        businesses they''re assigned to).'
      parameters:
      - name: insured
        in: query
        description: insured
        required: false
        schema:
          type: string
      - name: status
        in: query
        description: status
        required: false
        schema:
          type: string
      - name: payment_status
        in: query
        description: payment_status
        required: false
        schema:
          type: string
      - name: coverage_type
        in: query
        description: coverage_type
        required: false
        schema:
          type: string
      - name: carrier
        in: query
        description: carrier
        required: false
        schema:
          type: string
      - name: wholesaler
        in: query
        description: wholesaler
        required: false
        schema:
          type: string
      - name: has_tasks
        in: query
        description: has_tasks
        required: false
        schema:
          type: string
      - name: broker
        in: query
        description: broker
        required: false
        schema:
          type: string
      - name: effective_date_min
        in: query
        description: effective_date_min
        required: false
        schema:
          type: string
      - name: effective_date_max
        in: query
        description: effective_date_max
        required: false
        schema:
          type: string
      - name: search
        in: query
        description: A search term.
        required: false
        schema:
          type: string
      - name: ordering
        in: query
        description: Which field to use when ordering the results.
        required: false
        schema:
          type: string
      - name: limit
        in: query
        description: Number of results to return per page.
        required: false
        schema:
          type: integer
      - name: offset
        in: query
        description: The initial index from which to return the results.
        required: false
        schema:
          type: integer
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                required:
                - count
                - results
                type: object
                properties:
                  count:
                    type: integer
                  next:
                    type:
                    - string
                    - 'null'
                    format: uri
                  previous:
                    type:
                    - string
                    - 'null'
                    format: uri
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/BrokerQuoteV2FlexFields'
        '403':
          description: Authentication credentials were invalid, absent or insufficient.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericError'
        '500':
          description: Internal server error.
      tags:
      - 'broker (v2): quotes'
  /v2/broker/quotes/{id}:
    parameters:
    - name: id
      in: path
      description: A UUID string identifying this Quote (Coverage Term).
      required: true
      schema:
        type: string
        format: uuid
    get:
      operationId: v2_broker_quotes_read
      summary: Paginated ViewSet for retrieving quotes for the broker.
      description: "Supports Filtering By:\n- insured\n- has_tasks\n- status\n- payment_status\n- coverage_type\n- carrier (carrier UUID; comma-separated for multiple)\n- wholesaler (wholesaler UUID; comma-separated for multiple)\n- broker (Agent ID)\n- effective_date_min (minimum effective date, inclusive)\n- effective_date_max (maximum effective date, inclusive)\n\nSupports Searching By:\n- insured\n\nSupports Sorting By:\n- created_at\n- effective_date\n\nAdditional actions:\n- GET ``filter-options``: returns the distinct carriers and wholesalers\n  that appear in the broker's quotes, for populating filter dropdowns\n  without fetching the global carrier/wholesaler lists."
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BrokerQuoteV2FlexFields'
        '403':
          description: Authentication credentials were invalid, absent or insufficient.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericError'
        '404':
          description: Object does not exist or caller has insufficient permissions to access it.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIException'
        '500':
          description: Internal server error.
      tags:
      - 'broker (v2): quotes'
    patch:
      operationId: v2_broker_quotes_partial_update
      summary: Update Quote Follow-Up Notifications
      description: Toggle follow-up reminder emails to underwriters for this quote. Only follow_up_notifications is writable; all other quote fields are read-only and ignored if included.
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BrokerQuoteFollowUpNotification'
        '400':
          description: Invalid input.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationError'
        '403':
          description: Authentication credentials were invalid, absent or insufficient.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericError'
        '404':
          description: Object does not exist or caller has insufficient permissions to access it.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIException'
        '500':
          description: Internal server error.
      tags:
      - 'broker (v2): quotes'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BrokerQuoteFollowUpNotification'
        required: true
components:
  schemas:
    APIException:
      title: Generic API Error
      required:
      - detail
      type: object
      properties:
        detail:
          description: Error details
          type: string
    BrokerQuoteFollowUpNotification:
      type: object
      properties:
        id:
          title: Id
          type: string
          format: uuid
          readOnly: true
        follow_up_notifications:
          title: Follow up notifications
          description: This will disable us sending email follow-ups to the underwriter for this quote
          type: boolean
    GenericError:
      title: Generic API Error
      required:
      - detail
      type: object
      properties:
        detail:
          description: Error details
          type: string
    CarrierList:
      required:
      - name
      type: object
      properties:
        id:
          title: Id
          type: string
          format: uuid
          readOnly: true
        name:
          title: Name
          type: string
          maxLength: 255
          minLength: 1
        logo:
          title: Logo
          type:
          - string
          - 'null'
          readOnly: true
          format: uri
        am_best_rating:
          title: Am best rating
          description: AM Best financial strength rating (e.g., A++, A+, A, A-, B++, B+)
          type:
          - string
          - 'null'
          maxLength: 255
        domains:
          description: Comma-separated list of domain names (e.g., example.com, example.org)
          type:
          - array
          - 'null'
          items:
            title: Domains
            type: string
            maxLength: 255
            minLength: 1
    ValidationError:
      title: Validation Error
      type: object
      properties:
        non_field_errors:
          description: List of validation errors not related to any field
          type: array
          items:
            type: string
      additionalProperties:
        description: A list of error messages for each field that triggered a validation error
        type: array
        items:
          type: string
    BrokerQuoteV2FlexFields:
      required:
      - carrier
      - coverage_type
      - task_count
      type: object
      properties:
        id:
          title: Id
          type: string
          format: uuid
          readOnly: true
        insured:
          title: Insured
          type: string
          readOnly: true
        created_at:
          title: Created at
          type: string
          format: date-time
          readOnly: true
        status:
          title: Status
          description: 'Market status of the quote. not_submitted: We have not submitted to the market yet, or decided not to because of appetite concerns. pending: We are actively sending this submission to the market. more_info_needed: We are unable to send the submission to the market because we are missing info about the insured, or the market has requested additional info. referred: The market has received all the info they need, and is still considering the risk. active: The market has provided a bindable quote. bind_requested: The insured or broker has expressed intent to move forward in binding this quote. bound: The market has bound the quote. declined: The market has reviewed the submission, but declined to provide a quote. expired: The quote is no longer valid (past its validity date with no bind request). archived: The broker has archived the quote.'
          type: string
          readOnly: true
        market_status_reason:
          title: Market status reason
          type:
          - string
          - 'null'
          readOnly: true
          minLength: 1
        primary_agent:
          title: Primary agent
          type: string
          readOnly: true
        all_agents:
          title: All agents
          type: string
          readOnly: true
        carrier:
          $ref: '#/components/schemas/CarrierList'
        coverage_application:
          title: Coverage application
          type:
          - string
          - 'null'
          format: uuid
        coverage_type:
          title: Coverage type
          type:
          - string
          - 'null'
          minLength: 1
        aggregate_limit:
          title: Aggregate limit
          type:
          - integer
          - 'null'
          maximum: 9223372036854775807
          minimum: -9223372036854775808
        aggregate_retention:
          title: Aggregate retention
          type:
          - integer
          - 'null'
          maximum: 9223372036854775807
          minimum: -9223372036854775808
        effective_date:
          title: Effective date
          type:
          - string
          - 'null'
          format: date
        payment_status:
          title: Payment status
          type: string
          readOnly: true
        task_count:
          title: Task count
          type: integer
        has_tasks:
          title: Has tasks
          type: string
          readOnly: true
        payment_link:
          title: Payment link
          type: string
          readOnly: true
        total_amount_cents:
          title: Total amount cents
          type: string
          readOnly: true
        insurance_invoice_ids:
          title: Insurance invoice ids
          type: string
          readOnly: true
        follow_up_notifications:
          title: Follow up notifications
          description: This will disable us sending email follow-ups to the underwriter for this quote
          type: boolean
        source:
          title: Source
          type: string
          readOnly: true
        source_display:
          title: Source display
          type: string
          readOnly: true
  securitySchemes:
    Bearer:
      type: apiKey
      name: Authorization
      in: header
      description: JWT access token. Send as `Bearer <token>` or `JWT <token>`.
    ApiKey:
      type: apiKey
      name: Authorization
      in: header
      description: API key. Send as `Api-Key <key>`.
x-tagGroups:
- name: Agent runtime (v2)
  tags:
  - agent_runtime (v2)
- name: Analytics
  tags:
  - analytics
- name: Application
  tags:
  - 'application: applications'
  - 'application: clients'
- name: Application (v2)
  tags:
  - 'application (v2): applications'
  - 'application (v2): coverages'
- name: Ascend
  tags:
  - ascend
- name: Ascend (v2)
  tags:
  - ascend (v2)
- name: Authentication
  tags:
  - Authentication
  - auth
- name: Billing (v2)
  tags:
  - billing (v2)
- name: Broker
  tags:
  - broker
  - broker-ams-integration
  - broker-google
  - broker-office365
  - broker-office365-individual
  - 'broker: ai-customization-types'
  - 'broker: ai-customizations'
  - 'broker: clients'
  - 'broker: email_preferences'
  - 'broker: proposal-preferences'
  - 'broker: take-rates'
  - 'broker: user-ai-customizations'
  - 'broker: users'
  - broker_groups
  - broker_settings
- name: Broker (v2)
  tags:
  - 'broker (v2): applications'
  - 'broker (v2): clients'
  - 'broker (v2): coverages'
  - 'broker (v2): email-templates'
  - 'broker (v2): quote-policies'
  - 'broker (v2): quotes'
  - 'broker (v2): storefront'
  - 'broker (v2): team-users'
- name: Business
  tags:
  - business
  - business-broker-users
  - business-user
  - business_admin
- name: Carrier
  tags:
  - carrier
- name: Checkout
  tags:
  - checkout
- name: Email AI
  tags:
  - email_ai
- name: Email AI (v2)
  tags:
  - 'email_ai (v2): attachments'
  - 'email_ai (v2): carriers'
  - 'email_ai (v2): coverage-types'
  - 'email_ai (v2): emails'
  - 'email_ai (v2): gmail'
  - 'email_ai (v2): office365'
  - 'email_ai (v2): profiles'
  - 'email_ai (v2): wholesalers'
- name: Email AI Agent
  tags:
  - Email AI Agent
  - Email AI Agent - Attachments
  - Email AI Agent - Businesses
  - Email AI Agent - Entities
  - Email AI Agent - Markets
  - Email AI Agent - Profiles
  - Email AI Agent - Reference Data
- name: Google workspace (v2)
  tags:
  - google_workspace (v2)
- name: Herald (v2)
  tags:
  - herald (v2)
- name: Indications (v2)
  tags:
  - indications (v2)
- name: Insurance (v2)
  tags:
  - insurance (v2)
- name: Invite
  tags:
  - invite
- name: Legal
  tags:
  - legal
- name: Market
  tags:
  - Markets
  - Markets - Business
- name: Market (v2)
  tags:
  - market (v2)
- name: Office365 (v2)
  tags:
  - office365 (v2)
- name: Premium finance (v2)
  tags:
  - premium_finance (v2)
- name: Quote
  tags:
  - 'quote: applications'
  - 'quote: clients'
  - 'quote: quotes'
- name: Quote (v2)
  tags:
  - 'quote (v2): application'
  - 'quote (v2): binders'
  - 'quote (v2): checkout'
  - 'quote (v2): cios'
  - 'quote (v2): coverages'
  - 'quote (v2): quote-policies'
  - 'quote (v2): quotes'
  - 'quote (v2): tasks'
  - quote_ai (v2)
- name: Reports
  tags:
  - reports
- name: Reward
  tags:
  - reward
- name: Risk manager
  tags:
  - risk_manager
- name: Sanity check AI
  tags:
  - sanity_check_ai
- name: Storefront (v2)
  tags:
  - storefront (v2)
- name: Stripe
  tags:
  - stripe
- name: Suggestion AI
  tags:
  - suggestion_ai
- name: Treasury (v2)
  tags:
  - treasury (v2)
- name: User
  tags:
  - user
  - 'user: default-access-role'