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

# List Quotes

> List quote summaries with live totals, date filters, cursor pagination, and optional expansions

Return a paginated list of quotes for your company. Each quote includes the same base fields and live `totalPriceCents` as [Get Quote](/api-reference/quote/get).

Use your `x-api-key` with [public API access](/api-reference/introduction#plan-access). These endpoints require Scale or an eligible Grandfathered Pro plan.

```bash theme={null}
curl --get 'https://app.flashquotes.com/api/quotes' \
  --header "x-api-key: $FLASHQUOTES_API_KEY" \
  --data-urlencode 'limit=25' \
  --data-urlencode 'service_start_time[gte]=2026-10-01T00:00:00Z' \
  --data-urlencode 'service_start_time[lt]=2026-11-01T00:00:00Z' \
  --data-urlencode 'expand[]=data.lead' \
  --data-urlencode 'expand[]=data.serviceDays'
```

Set `FLASHQUOTES_API_KEY` to your API key. This request finds quotes with at least one service day starting in October 2026 and includes contact and service-day details.

## Pagination

| Parameter        | Description                                        |
| ---------------- | -------------------------------------------------- |
| `limit`          | Page size. Integer from `1` to `100`; default `10` |
| `starting_after` | ID of the last quote from the previous page        |

Results are sorted by `createdAt` descending, then `id` descending. Sort order is fixed.

The response contains `object: "list"`, `url: "/api/quotes"`, `hasMore`, and a `data` array of quote objects. When `hasMore` is `true`, pass the ID of the last quote in `data` as `starting_after`. Keep the filters unchanged between pages.

```bash theme={null}
curl --get 'https://app.flashquotes.com/api/quotes' \
  --header "x-api-key: $FLASHQUOTES_API_KEY" \
  --data-urlencode 'limit=25' \
  --data-urlencode 'starting_after=cmf2q8n4x0000kz01a1b2c3d4' \
  --data-urlencode 'service_start_time[gte]=2026-10-01T00:00:00Z' \
  --data-urlencode 'service_start_time[lt]=2026-11-01T00:00:00Z' \
  --data-urlencode 'expand[]=data.lead' \
  --data-urlencode 'expand[]=data.serviceDays'
```

Replace the example cursor with the last returned quote ID. An unknown or inaccessible cursor, or one that does not match the supplied filters, returns an empty page. No matching quotes also returns:

```json theme={null}
{
  "object": "list",
  "url": "/api/quotes",
  "hasMore": false,
  "data": []
}
```

## Equality filters

| Parameter       | Matches                                     |
| --------------- | ------------------------------------------- |
| `lead_id`       | Exact contact ID (`leadId` in the response) |
| `location_id`   | Exact location ID                           |
| `booking_id`    | Exact booking ID                            |
| `event_type_id` | Exact event type ID                         |

All supplied filters apply together. For example, pass `lead_id` and `location_id` to find a contact's quotes at one location.

## Date-range filters

| Field                | Matches                                                                 |
| -------------------- | ----------------------------------------------------------------------- |
| `created_at`         | Quote creation time                                                     |
| `updated_at`         | Quote row update time                                                   |
| `service_start_time` | At least one service day whose start time satisfies all supplied bounds |

Each field accepts `[gt]` (after), `[gte]` (at or after), `[lt]` (before), and `[lte]` (at or before). Values must be full ISO 8601 datetimes with a timezone: for example, `2026-10-01T00:00:00Z` or `2026-10-01T00:00:00-06:00`. Bare dates such as `2026-10-01` return `400`.

Use `--data-urlencode` as shown above to encode brackets and timezone offsets correctly, including the `+` in positive offsets.

For a multi-day quote, **one service day must satisfy the entire range**. A start time before the lower bound on one day and after the upper bound on another does not match. Expanding `serviceDays` returns all of the matching quote's service days, including days outside the filter range.

<Note>
  `updated_at` filters the quote row's timestamp. Child pricing edits can change `totalPriceCents` without updating that timestamp, so this filter is not a complete financial change feed.
</Note>

## Expanding related objects

Use the [Get Quote expansion paths](/api-reference/quote/get#expanding-related-objects), prefixed with **`data.`** on every path:

```bash theme={null}
curl --get 'https://app.flashquotes.com/api/quotes' \
  --header "x-api-key: $FLASHQUOTES_API_KEY" \
  --data-urlencode 'expand[]=data.booking.invoices' \
  --data-urlencode 'expand[]=data.booking.events.resources'
```

Nested paths include their parents. Missing single relations return `null`; empty collections return `[]`. Expansions do not change quote totals and do not expose line items or unit prices.

The limit is **20 distinct paths** and **four segments per path**, excluding the `data.` prefix. Missing prefixes and unsupported paths return `400`. Request only what you need: expanded collections are not independently paginated, and these routes do not currently enforce per-key rate or concurrency limits.

## Errors

| Status | Meaning                                                                 |
| ------ | ----------------------------------------------------------------------- |
| `400`  | Invalid page size, date-range value, expansion path, or expansion limit |
| `401`  | Authentication denied: check the API key, allowed IPs, and plan access  |
| `500`  | Internal server error                                                   |
| `503`  | Authentication service temporarily unavailable                          |

For example, `limit=101` returns:

```json theme={null}
{
  "error": {
    "type": "invalid_request_error",
    "code": "invalid_parameter",
    "message": "limit must be an integer between 1 and 100",
    "param": "limit"
  }
}
```


## OpenAPI

````yaml GET /quotes
openapi: 3.0.1
info:
  title: Flashquotes API
  description: API for accessing quote, event, form, and invoice data from Flashquotes
  version: 1.0.0
  contact:
    name: Flashquotes Support
    email: support@flashquotes.com
servers:
  - url: https://app.flashquotes.com/api
    description: Production server
security:
  - apiKey: []
paths:
  /quotes:
    get:
      summary: List Quotes
      description: >-
        List quote summaries for your company with live totals, equality and
        date-range filters, cursor pagination, and optional related-object
        expansions. Requires public API access (Scale, or eligible Grandfathered
        Pro). Results are ordered by createdAt descending, then id descending;
        sort order is fixed.
      parameters:
        - name: limit
          in: query
          required: false
          description: Page size, from 1 to 100. Defaults to 10.
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 10
          example: 25
        - name: starting_after
          in: query
          required: false
          description: >-
            ID of the last quote in the previous page. The cursor must be
            accessible and match all supplied filters; otherwise the response is
            an empty page with hasMore false. Keep filters unchanged between
            pages.
          schema:
            type: string
          example: cmf2q8n4x0000kz01a1b2c3d4
        - name: lead_id
          in: query
          required: false
          description: Filter by exact contact ID.
          schema:
            type: string
        - name: location_id
          in: query
          required: false
          description: Filter by exact location ID.
          schema:
            type: string
        - name: booking_id
          in: query
          required: false
          description: Filter by exact booking ID.
          schema:
            type: string
        - name: event_type_id
          in: query
          required: false
          description: Filter by exact event type ID.
          schema:
            type: string
        - name: created_at[gt]
          in: query
          required: false
          description: >-
            Filter quote creation time: strictly after this ISO 8601 datetime.
            Include a timezone (Z or ±HH:MM); bare dates are rejected.
          schema:
            type: string
            format: date-time
          example: '2026-10-01T00:00:00Z'
        - name: created_at[gte]
          in: query
          required: false
          description: >-
            Filter quote creation time: at or after this ISO 8601 datetime.
            Include a timezone (Z or ±HH:MM); bare dates are rejected.
          schema:
            type: string
            format: date-time
          example: '2026-10-01T00:00:00Z'
        - name: created_at[lt]
          in: query
          required: false
          description: >-
            Filter quote creation time: strictly before this ISO 8601 datetime.
            Include a timezone (Z or ±HH:MM); bare dates are rejected.
          schema:
            type: string
            format: date-time
          example: '2026-10-01T00:00:00Z'
        - name: created_at[lte]
          in: query
          required: false
          description: >-
            Filter quote creation time: at or before this ISO 8601 datetime.
            Include a timezone (Z or ±HH:MM); bare dates are rejected.
          schema:
            type: string
            format: date-time
          example: '2026-10-01T00:00:00Z'
        - name: updated_at[gt]
          in: query
          required: false
          description: >-
            Filter quote row update time (not a complete financial change feed):
            strictly after this ISO 8601 datetime. Include a timezone (Z or
            ±HH:MM); bare dates are rejected.
          schema:
            type: string
            format: date-time
          example: '2026-10-01T00:00:00Z'
        - name: updated_at[gte]
          in: query
          required: false
          description: >-
            Filter quote row update time (not a complete financial change feed):
            at or after this ISO 8601 datetime. Include a timezone (Z or
            ±HH:MM); bare dates are rejected.
          schema:
            type: string
            format: date-time
          example: '2026-10-01T00:00:00Z'
        - name: updated_at[lt]
          in: query
          required: false
          description: >-
            Filter quote row update time (not a complete financial change feed):
            strictly before this ISO 8601 datetime. Include a timezone (Z or
            ±HH:MM); bare dates are rejected.
          schema:
            type: string
            format: date-time
          example: '2026-10-01T00:00:00Z'
        - name: updated_at[lte]
          in: query
          required: false
          description: >-
            Filter quote row update time (not a complete financial change feed):
            at or before this ISO 8601 datetime. Include a timezone (Z or
            ±HH:MM); bare dates are rejected.
          schema:
            type: string
            format: date-time
          example: '2026-10-01T00:00:00Z'
        - name: service_start_time[gt]
          in: query
          required: false
          description: >-
            Filter service-day start time; at least one day must satisfy all
            supplied bounds: strictly after this ISO 8601 datetime. Include a
            timezone (Z or ±HH:MM); bare dates are rejected.
          schema:
            type: string
            format: date-time
          example: '2026-10-01T00:00:00Z'
        - name: service_start_time[gte]
          in: query
          required: false
          description: >-
            Filter service-day start time; at least one day must satisfy all
            supplied bounds: at or after this ISO 8601 datetime. Include a
            timezone (Z or ±HH:MM); bare dates are rejected.
          schema:
            type: string
            format: date-time
          example: '2026-10-01T00:00:00Z'
        - name: service_start_time[lt]
          in: query
          required: false
          description: >-
            Filter service-day start time; at least one day must satisfy all
            supplied bounds: strictly before this ISO 8601 datetime. Include a
            timezone (Z or ±HH:MM); bare dates are rejected.
          schema:
            type: string
            format: date-time
          example: '2026-10-01T00:00:00Z'
        - name: service_start_time[lte]
          in: query
          required: false
          description: >-
            Filter service-day start time; at least one day must satisfy all
            supplied bounds: at or before this ISO 8601 datetime. Include a
            timezone (Z or ±HH:MM); bare dates are rejected.
          schema:
            type: string
            format: date-time
          example: '2026-10-01T00:00:00Z'
        - name: expand[]
          in: query
          required: false
          description: >-
            Every path must start with data. Repeat expand[] or use
            comma-separated paths. A nested path includes its parents;
            unrequested siblings stay absent. Maximum 20 distinct paths per
            request and four segments, excluding data. Unknown or malformed
            paths return 400. Allowed paths: data.lead, data.location,
            data.eventType, data.services, data.addons, data.discounts,
            data.taxRate, data.paymentTerms, data.serviceCharges,
            data.serviceDays, data.contract, data.booking, data.booking.lead,
            data.booking.eventType, data.booking.invoices, data.booking.events,
            data.booking.events.location, data.booking.events.services,
            data.booking.events.staff, data.booking.events.addons,
            data.booking.events.resources, data.booking.events.booking,
            data.booking.events.booking.lead,
            data.booking.events.booking.eventType,
            data.booking.events.booking.invoices,
            data.booking.events.booking.events.
          style: form
          explode: true
          schema:
            type: array
            items:
              type: string
          example:
            - data.lead
            - data.serviceDays
      responses:
        '200':
          description: >-
            Paginated quotes. No matches or an unusable cursor returns data: []
            and hasMore: false.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/QuoteList'
              examples:
                Default:
                  summary: Default (no expand)
                  value:
                    object: list
                    url: /api/quotes
                    hasMore: false
                    data:
                      - object: quote
                        id: cmf2q8n4x0000kz01a1b2c3d4
                        createdAt: '2026-09-01T14:23:11.000Z'
                        updatedAt: '2026-09-08T09:12:44.000Z'
                        sentAt: '2026-09-02T10:00:00.000Z'
                        expiresAt: '2026-09-30T23:59:59.000Z'
                        bookedAt: null
                        lostAt: null
                        lostReason: null
                        leadId: cmf2l8n4x0001kz01a1b2c3d4
                        locationId: cmf2p8n4x0002kz01a1b2c3d4
                        eventTypeId: null
                        bookingId: null
                        discountId: null
                        taxRateId: null
                        paymentTermsId: null
                        contractId: null
                        numberOfStaff: 4
                        numberOfResources: 2
                        guestCount: 120
                        eventAddress: 123 Market Street, Denver, CO 80202
                        eventDescription: Acme launch party
                        siteContactName: Jane Doe
                        siteContactPhone: '+15555550123'
                        entityToInvoice: Acme
                        currency:
                          isoCode: USD
                        totalPriceCents: 250000
                Empty:
                  summary: No matching quotes
                  value:
                    object: list
                    url: /api/quotes
                    hasMore: false
                    data: []
        '400':
          description: Invalid limit, date-range value, or expansion.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  type: invalid_request_error
                  code: invalid_parameter
                  message: limit must be an integer between 1 and 100
                  param: limit
        '401':
          description: >-
            Authentication denied: missing or invalid API key, disallowed IP, or
            plan without public API access.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  type: authentication_error
                  code: missing_or_invalid_api_key
                  message: Unauthorized, invalid or missing API key
        '500':
          description: Internal server error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  type: api_error
                  code: server_error
                  message: Internal server error
        '503':
          description: Authentication service temporarily unavailable.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  type: api_error
                  code: auth_service_unavailable
                  message: Authentication service unavailable
components:
  schemas:
    QuoteList:
      type: object
      required:
        - object
        - url
        - hasMore
        - data
      properties:
        object:
          type: string
          enum:
            - list
        url:
          type: string
          enum:
            - /api/quotes
        hasMore:
          type: boolean
          description: >-
            Whether more pages exist. Pass the last returned quote ID as
            starting_after to retrieve the next page.
        data:
          type: array
          items:
            $ref: '#/components/schemas/Quote'
      example:
        object: list
        url: /api/quotes
        hasMore: false
        data:
          - object: quote
            id: cmf2q8n4x0000kz01a1b2c3d4
            createdAt: '2026-09-01T14:23:11.000Z'
            updatedAt: '2026-09-08T09:12:44.000Z'
            sentAt: '2026-09-02T10:00:00.000Z'
            expiresAt: '2026-09-30T23:59:59.000Z'
            bookedAt: null
            lostAt: null
            lostReason: null
            leadId: cmf2l8n4x0001kz01a1b2c3d4
            locationId: cmf2p8n4x0002kz01a1b2c3d4
            eventTypeId: null
            bookingId: null
            discountId: null
            taxRateId: null
            paymentTermsId: null
            contractId: null
            numberOfStaff: 4
            numberOfResources: 2
            guestCount: 120
            eventAddress: 123 Market Street, Denver, CO 80202
            eventDescription: Acme launch party
            siteContactName: Jane Doe
            siteContactPhone: '+15555550123'
            entityToInvoice: Acme
            currency:
              isoCode: USD
            totalPriceCents: 250000
    ErrorResponse:
      type: object
      example:
        error:
          type: invalid_request_error
          code: invalid_parameter
          message: limit must be an integer between 1 and 100
          param: limit
      properties:
        error:
          type: object
          properties:
            type:
              type: string
              enum:
                - api_error
                - invalid_request_error
                - authentication_error
                - permission_error
                - rate_limit_error
                - idempotency_error
            code:
              type: string
              description: >-
                Machine-readable error code (e.g. `not_found`,
                `invalid_parameter`, `missing_or_invalid_api_key`).
            message:
              type: string
            param:
              type: string
              description: Name of the offending parameter, when applicable.
              nullable: true
          required:
            - type
            - code
            - message
      required:
        - error
    Quote:
      type: object
      required:
        - object
        - id
        - createdAt
        - updatedAt
        - sentAt
        - expiresAt
        - bookedAt
        - lostAt
        - lostReason
        - leadId
        - locationId
        - eventTypeId
        - bookingId
        - discountId
        - taxRateId
        - paymentTermsId
        - contractId
        - numberOfStaff
        - numberOfResources
        - guestCount
        - eventAddress
        - eventDescription
        - siteContactName
        - siteContactPhone
        - entityToInvoice
        - currency
        - totalPriceCents
      properties:
        object:
          type: string
          enum:
            - quote
        id:
          type: string
          description: Quote ID.
        createdAt:
          type: string
          format: date-time
          description: When the quote was created.
        updatedAt:
          type: string
          format: date-time
          description: >-
            When the quote row was last updated. Child pricing changes can
            change totalPriceCents without changing this timestamp.
        sentAt:
          type: string
          format: date-time
          nullable: true
          description: When the quote was sent, or null.
        expiresAt:
          type: string
          format: date-time
          nullable: true
          description: Quote expiration time, or null.
        bookedAt:
          type: string
          format: date-time
          nullable: true
          description: When the quote was booked, or null.
        lostAt:
          type: string
          format: date-time
          nullable: true
          description: When the quote was marked lost, or null.
        lostReason:
          type: string
          enum:
            - PRICE
            - DATE_UNAVAILABLE
            - WENT_SILENT
            - CHOSE_COMPETITOR
            - OTHER
          nullable: true
          description: Reason the quote was marked lost, or null.
        leadId:
          type: string
          description: Contact ID. The related object is named lead in the API.
        locationId:
          type: string
          description: Location ID.
        eventTypeId:
          type: string
          nullable: true
          description: Event type ID, or null.
        bookingId:
          type: string
          nullable: true
          description: Booking ID, or null.
        discountId:
          type: string
          nullable: true
          description: >-
            Quote-level discount ID, or null. The discounts expansion also
            includes line-level discount definitions.
        taxRateId:
          type: string
          nullable: true
          description: Tax rate ID, or null.
        paymentTermsId:
          type: string
          nullable: true
          description: Payment terms ID, or null.
        contractId:
          type: string
          nullable: true
          description: Contract template ID, or null.
        numberOfStaff:
          type: integer
          description: Requested staff count.
        numberOfResources:
          type: integer
          description: Requested resource count.
        guestCount:
          type: integer
          description: Guest count.
        eventAddress:
          type: string
          description: Event address.
        eventDescription:
          type: string
          nullable: true
          description: Event description, or null.
        siteContactName:
          type: string
          nullable: true
          description: On-site contact name, or null.
        siteContactPhone:
          type: string
          nullable: true
          description: On-site contact phone number, or null.
        entityToInvoice:
          type: string
          nullable: true
          description: Entity to invoice, or null.
        currency:
          type: object
          required:
            - isoCode
          properties:
            isoCode:
              type: string
              description: ISO 4217 currency code.
              example: USD
        totalPriceCents:
          type: integer
          description: >-
            Live overall quote total in the currency’s minor units (cents for
            USD), recalculated on every request from saved pricing, fees,
            discounts, service charges, and tax. Excludes booking-time gratuity;
            not an unpaid invoice balance. Expansion does not change this value.
          example: 250000
        lead:
          type: object
          nullable: true
          allOf:
            - $ref: '#/components/schemas/Lead'
          description: >-
            Present only when `lead` is expanded (use `data.lead` on lists).
            Returns null when the relation is missing or inaccessible.
        location:
          type: object
          nullable: true
          allOf:
            - $ref: '#/components/schemas/Location'
          description: >-
            Present only when `location` is expanded (use `data.location` on
            lists). Returns null when the relation is missing or inaccessible.
        eventType:
          type: object
          nullable: true
          allOf:
            - $ref: '#/components/schemas/EventType'
          description: >-
            Present only when `eventType` is expanded (use `data.eventType` on
            lists). Returns null when the relation is missing or inaccessible.
        services:
          type: array
          items:
            $ref: '#/components/schemas/Service'
          description: >-
            Present only when `services` is expanded (use `data.services` on
            lists). Returns [] when empty. Distinct current line-item service
            definitions. Archived services are omitted; saved prices still
            contribute to the total.
        addons:
          type: array
          items:
            $ref: '#/components/schemas/Addon'
          description: >-
            Present only when `addons` is expanded (use `data.addons` on lists).
            Returns [] when empty. Distinct current line-item add-on
            definitions, without unit prices. Archived add-ons are omitted;
            saved prices still contribute to the total.
        discounts:
          type: array
          items:
            $ref: '#/components/schemas/Discount'
          description: >-
            Present only when `discounts` is expanded (use `data.discounts` on
            lists). Returns [] when empty. Deduplicated quote-level and
            line-level definitions, with the quote-level definition first. No
            allocations or realized discount amounts. Attached archived
            definitions remain visible.
        taxRate:
          type: object
          nullable: true
          allOf:
            - $ref: '#/components/schemas/TaxRate'
          description: >-
            Present only when `taxRate` is expanded (use `data.taxRate` on
            lists). Returns null when the relation is missing or inaccessible.
        paymentTerms:
          type: object
          nullable: true
          allOf:
            - $ref: '#/components/schemas/PaymentTerms'
          description: >-
            Present only when `paymentTerms` is expanded (use
            `data.paymentTerms` on lists). Returns null when the relation is
            missing or inaccessible.
        serviceCharges:
          type: array
          items:
            $ref: '#/components/schemas/ServiceCharge'
          description: >-
            Present only when `serviceCharges` is expanded (use
            `data.serviceCharges` on lists). Returns [] when empty. Flat
            definition array without association wrappers or calculated charge
            amounts. Attached archived definitions remain visible.
        serviceDays:
          type: array
          items:
            $ref: '#/components/schemas/ServiceDay'
          description: >-
            Present only when `serviceDays` is expanded (use `data.serviceDays`
            on lists). Returns [] when empty. Flat array ordered by
            serviceStartTime ascending, then id ascending.
        contract:
          type: object
          nullable: true
          allOf:
            - $ref: '#/components/schemas/Contract'
          description: >-
            Present only when `contract` is expanded (use `data.contract` on
            lists). Returns null when the relation is missing or inaccessible.
            Template metadata only; excludes contract content and signatures.
        booking:
          type: object
          nullable: true
          allOf:
            - $ref: '#/components/schemas/Booking'
          description: >-
            Present only when `booking` is expanded (use `data.booking` on
            lists). Returns null when the relation is missing or inaccessible.
      description: >-
        Quote summary with live overall value. Base fields are always present;
        nullable native values remain null. Relations appear only when expanded.
        Quote and invoice line items, quantities, unit prices, and pricing
        configuration are not exposed.
    Lead:
      type: object
      properties:
        object:
          type: string
          enum:
            - lead
        id:
          type: string
        firstName:
          type: string
          nullable: true
        lastName:
          type: string
          nullable: true
        email:
          type: string
          nullable: true
        phone:
          type: string
          nullable: true
        companyName:
          type: string
          nullable: true
    Location:
      type: object
      properties:
        object:
          type: string
          enum:
            - location
        id:
          type: string
        name:
          type: string
        streetAddress:
          type: string
        city:
          type: string
        state:
          type: string
        zip:
          type: string
        timeZone:
          type: string
    EventType:
      type: object
      properties:
        object:
          type: string
          enum:
            - eventType
        id:
          type: string
        name:
          type: string
    Service:
      type: object
      properties:
        object:
          type: string
          enum:
            - service
        id:
          type: string
        name:
          type: string
        description:
          type: string
          nullable: true
        imageUrl:
          type: string
          nullable: true
    Addon:
      type: object
      properties:
        object:
          type: string
          enum:
            - addon
        id:
          type: string
        name:
          type: string
        description:
          type: string
          nullable: true
        imageUrl:
          type: string
          nullable: true
    Discount:
      type: object
      required:
        - object
        - id
        - name
        - type
        - percentOff
        - amountOff
      properties:
        object:
          type: string
          enum:
            - discount
        id:
          type: string
        name:
          type: string
        type:
          type: string
          enum:
            - PERCENT
            - AMOUNT
        percentOff:
          type: number
          nullable: true
          description: Percentage discount (10 means 10%), or null.
        amountOff:
          type: integer
          nullable: true
          description: Fixed discount in minor currency units, or null.
    TaxRate:
      type: object
      required:
        - object
        - id
        - name
        - rate
      properties:
        object:
          type: string
          enum:
            - taxRate
        id:
          type: string
        name:
          type: string
        rate:
          type: number
          description: Tax rate as a fraction (0.0825 means 8.25%).
    PaymentTerms:
      type: object
      required:
        - object
        - id
        - name
        - paymentSchedule
        - depositType
        - depositPercentage
        - depositAmountCents
        - invoiceDueDays
      properties:
        object:
          type: string
          enum:
            - paymentTerms
        id:
          type: string
        name:
          type: string
        paymentSchedule:
          type: string
          enum:
            - DEPOSIT
            - FULL
            - CARD_ON_FILE
            - INVOICE_ONLY
        depositType:
          type: string
          enum:
            - PERCENT
            - AMOUNT
        depositPercentage:
          type: integer
          description: Deposit percentage (25 means 25%).
        depositAmountCents:
          type: integer
          description: Fixed deposit amount in minor currency units.
        invoiceDueDays:
          type: integer
          description: Configured invoice due-days value.
    ServiceCharge:
      type: object
      required:
        - object
        - id
        - name
        - type
        - percentageValue
        - amountCents
        - taxable
      properties:
        object:
          type: string
          enum:
            - serviceCharge
        id:
          type: string
        name:
          type: string
        type:
          type: string
          enum:
            - PERCENT
            - FLAT
        percentageValue:
          type: number
          nullable: true
          description: Percentage charge as a fraction (0.15 means 15%), or null.
        amountCents:
          type: integer
          nullable: true
          description: Fixed charge in minor currency units, or null.
        taxable:
          type: boolean
          description: Whether this charge is taxable.
    ServiceDay:
      type: object
      required:
        - object
        - id
        - quoteId
        - serviceStartTime
        - serviceEndTime
        - createdAt
        - updatedAt
      properties:
        object:
          type: string
          enum:
            - serviceDay
        id:
          type: string
        quoteId:
          type: string
        serviceStartTime:
          type: string
          format: date-time
        serviceEndTime:
          type: string
          format: date-time
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
    Contract:
      type: object
      required:
        - object
        - id
        - name
        - description
        - createdAt
        - updatedAt
      properties:
        object:
          type: string
          enum:
            - contract
        id:
          type: string
        name:
          type: string
        description:
          type: string
          nullable: true
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
    Booking:
      type: object
      properties:
        object:
          type: string
          enum:
            - booking
        id:
          type: string
        quoteId:
          type: string
          nullable: true
        leadId:
          type: string
          nullable: true
        entityToInvoice:
          type: string
        fullName:
          type: string
        email:
          type: string
        phone:
          type: string
        paymentMethod:
          type: string
          nullable: true
        billingNotes:
          type: string
          nullable: true
        cardOnFile:
          type: boolean
        totalPriceCents:
          type: integer
        gratuityAmountCents:
          type: integer
          nullable: true
        eventTypeId:
          type: string
          nullable: true
        canceledAt:
          type: string
          format: date-time
          nullable: true
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        currency:
          type: object
          properties:
            isoCode:
              type: string
              example: USD
        lead:
          type: object
          nullable: true
          allOf:
            - $ref: '#/components/schemas/Lead'
          description: >-
            Present only when lead is expanded on this booking. Returns null
            when missing or inaccessible.
        eventType:
          type: object
          nullable: true
          allOf:
            - $ref: '#/components/schemas/EventType'
          description: >-
            Present only when eventType is expanded on this booking. Returns
            null when missing or inaccessible.
        invoices:
          type: array
          items:
            $ref: '#/components/schemas/Invoice'
          description: >-
            Present only when invoices is expanded on this booking. Terminal
            invoice summaries; deeper invoice expansions and line items are not
            supported.
        events:
          type: array
          items:
            $ref: '#/components/schemas/Event'
          description: >-
            Present only when events is expanded on this booking. Ordered by
            serviceStartTime ascending, then id ascending.
    Invoice:
      type: object
      description: Slim invoice shape used everywhere invoices appear in the public API.
      properties:
        object:
          type: string
          enum:
            - invoice
        id:
          type: string
        invoiceNumber:
          type: string
        description:
          type: string
          nullable: true
        notes:
          type: string
          nullable: true
        poNumber:
          type: string
          nullable: true
        dueDate:
          type: string
          format: date-time
        voidedAt:
          type: string
          format: date-time
          nullable: true
        taxable:
          type: boolean
        discountAmountCents:
          type: integer
          nullable: true
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        bookingId:
          type: string
        leadId:
          type: string
          nullable: true
        currency:
          type: object
          properties:
            isoCode:
              type: string
        url:
          type: string
          description: Encrypted public URL to view the invoice.
        status:
          type: string
          description: >-
            Computed invoice status (e.g. Draft, Open, Paid, Overdue,
            PartiallyPaid).
        total:
          type: integer
          description: Total amount in the smallest currency unit (cents).
        amountPaid:
          type: integer
          description: Amount paid excluding failed payments, in cents.
        amountDue:
          type: integer
          description: Outstanding amount in cents.
    Event:
      type: object
      description: >-
        Default response includes only the fields below plus foreign-key ids
        (bookingId, locationId, eventBriefId). Related objects (location,
        services, staff, addons, resources, booking) appear only when requested
        via expand[].
      example:
        object: event
        id: evt_8K3aN1qV2x
        name: Acme launch party
        clientName: Jane Doe
        clientEmail: jane@acme.com
        clientPhone: '+15555550123'
        siteContactName: Mark Site
        siteContactPhone: '+15555550199'
        eventDescription: Evening reception with passed apps
        eventAddress: 500 Market St, San Francisco, CA 94105
        additionalLocationInfo: Load in via rear loading dock
        specialNotes: No nuts in any service items
        parkingLoadingInfo: Free street parking after 6pm
        serviceStartTime: '2026-06-12T18:00:00.000Z'
        serviceEndTime: '2026-06-12T23:00:00.000Z'
        staffNumber: 4
        resourceNumber: 2
        companyId: cmp_a1b2c3
        locationId: loc_7H2pQ9
        bookingId: bkg_4F2yL8
        eventBriefId: ebf_3R9wM1
        eventBriefUrl: https://app.flashquotes.com/event-briefs/ebf_3R9wM1
        createdAt: '2026-05-01T14:23:11.000Z'
        updatedAt: '2026-05-08T09:12:44.000Z'
        staffDressCode: Black tie
        customData:
          internal_ref: ACME-Q2
        multiDay: false
        guestCount: 120
        loadingTime: 30
        setupTime: 60
        breakdownTime: 45
        unloadingTime: 30
        shiftStartTime: '2026-06-12T16:30:00.000Z'
        shiftEndTime: '2026-06-12T23:45:00.000Z'
        specialPrepTime: 15
        travelToEventTime: 45
        travelFromEventTime: 45
        tipJarAllowed: true
        outdoors: false
      properties:
        object:
          type: string
          enum:
            - event
        id:
          type: string
        name:
          type: string
        clientName:
          type: string
        clientEmail:
          type: string
        clientPhone:
          type: string
        siteContactName:
          type: string
        siteContactPhone:
          type: string
        eventDescription:
          type: string
        eventAddress:
          type: string
        additionalLocationInfo:
          type: string
        specialNotes:
          type: string
        parkingLoadingInfo:
          type: string
        serviceStartTime:
          type: string
          format: date-time
        serviceEndTime:
          type: string
          format: date-time
        staffNumber:
          type: integer
        resourceNumber:
          type: integer
        companyId:
          type: string
        locationId:
          type: string
        bookingId:
          type: string
          nullable: true
        eventBriefId:
          type: string
          nullable: true
        eventBriefUrl:
          type: string
          nullable: true
          description: Public URL to view the event brief, or null if no brief exists.
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        staffDressCode:
          type: string
          nullable: true
        customData:
          description: Arbitrary JSON metadata attached to the event.
        multiDay:
          type: boolean
        guestCount:
          type: integer
          nullable: true
        loadingTime:
          type: integer
          nullable: true
          description: Minutes.
        setupTime:
          type: integer
          nullable: true
          description: Minutes.
        breakdownTime:
          type: integer
          nullable: true
          description: Minutes.
        unloadingTime:
          type: integer
          nullable: true
          description: Minutes.
        shiftStartTime:
          type: string
          format: date-time
          nullable: true
        shiftEndTime:
          type: string
          format: date-time
          nullable: true
        specialPrepTime:
          type: integer
          nullable: true
          description: Minutes.
        travelToEventTime:
          type: integer
          nullable: true
          description: Minutes.
        travelFromEventTime:
          type: integer
          nullable: true
          description: Minutes.
        tipJarAllowed:
          type: boolean
        outdoors:
          type: boolean
        location:
          $ref: '#/components/schemas/Location'
          description: Present only when `expand[]=location` (or `data.location` on list).
        services:
          type: array
          items:
            $ref: '#/components/schemas/Service'
          description: Present only when expanded.
        staff:
          type: array
          items:
            $ref: '#/components/schemas/Staff'
          description: Present only when expanded.
        addons:
          type: array
          items:
            $ref: '#/components/schemas/Addon'
          description: Present only when expanded.
        resources:
          type: array
          items:
            $ref: '#/components/schemas/Resource'
          description: Present only when expanded.
        booking:
          $ref: '#/components/schemas/Booking'
          description: >-
            Present only when expanded (auto-promoted by any `booking.*`
            expand).
      required:
        - object
        - id
        - locationId
        - bookingId
    Staff:
      type: object
      properties:
        object:
          type: string
          enum:
            - staff
        id:
          type: string
        firstName:
          type: string
        lastName:
          type: string
        email:
          type: string
        phone:
          type: string
          nullable: true
        role:
          type: string
          nullable: true
        status:
          type: string
          description: >-
            Staff status. Retrieve returns members regardless of status;
            inactive staff resolve directly by id.
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
    Resource:
      type: object
      description: >-
        Default response includes all fields below. Resources have no expandable
        relations.
      properties:
        object:
          type: string
          enum:
            - resource
        id:
          type: string
        name:
          type: string
        description:
          type: string
          nullable: true
        imageUrl:
          type: string
          nullable: true
        category:
          type: string
          nullable: true
        status:
          type: string
        locationId:
          type: string
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
      required:
        - object
        - id
        - locationId
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: x-api-key
      description: API key for authentication

````