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

# Get Quote

> Retrieve a quote summary with live totals and optional related objects

Retrieve a quote by ID, including its live `totalPriceCents`, currency, dates, contact and location IDs, and event details. Related objects are included only when requested with `expand[]`.

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/cmf2q8n4x0000kz01a1b2c3d4' \
  --header "x-api-key: $FLASHQUOTES_API_KEY" \
  --data-urlencode 'expand[]=lead' \
  --data-urlencode 'expand[]=serviceDays'
```

Set `FLASHQUOTES_API_KEY` to your API key and replace the quote ID with one from [List Quotes](/api-reference/quote/list-quotes). `--data-urlencode` safely encodes the brackets in query parameters.

## Live quote total

`totalPriceCents` is calculated on every request from saved line prices, base and travel fees, line and quote discounts, service charges, and tax. It uses the same calculation, rounding, and currency rules as the app. Monetary amounts use the currency's minor units: `250000` with `currency.isoCode: "USD"` represents \$2,500.00.

The total does not reprice services, refresh tax-provider data, include booking-time gratuity, or represent an invoice's unpaid balance. Expanding related objects does not change the total.

<Note>
  Child pricing changes can change `totalPriceCents` without changing the quote's `updatedAt`. Do not use `updated_at` filtering as a complete financial change feed.
</Note>

## Expanding related objects

Repeat `expand[]` for each relation you need. Single-quote paths have no `data.` prefix. Comma-separated paths are also accepted.

| Path                               | Adds                                                                                         |
| ---------------------------------- | -------------------------------------------------------------------------------------------- |
| `lead`                             | Contact: ID, name, email, phone, and company name                                            |
| `location`                         | Location: ID, name, address fields, and time zone                                            |
| `eventType`                        | Event type ID and name                                                                       |
| `services`                         | Distinct service definitions: ID, name, description, and image URL                           |
| `addons`                           | Distinct add-on definitions: ID, name, description, and image URL                            |
| `discounts`                        | Discount definitions: ID, name, type, `percentOff`, and `amountOff`                          |
| `taxRate`                          | Tax rate ID, name, and rate                                                                  |
| `paymentTerms`                     | Payment schedule, deposit terms, and invoice due-days value                                  |
| `serviceCharges`                   | Flat array of charge definitions, including type, percentage or fixed amount, and taxability |
| `serviceDays`                      | Flat array of service days with quote ID, start/end times, and creation/update times         |
| `contract`                         | Contract template ID, name, description, and creation/update times                           |
| `booking`                          | Booking summary                                                                              |
| `booking.lead`                     | Contact inside the booking                                                                   |
| `booking.eventType`                | Event type inside the booking                                                                |
| `booking.invoices`                 | Invoice summaries, including totals, paid/due amounts, status, and payment URLs              |
| `booking.events`                   | Events inside the booking                                                                    |
| `booking.events.location`          | Each event's location                                                                        |
| `booking.events.services`          | Each event's services                                                                        |
| `booking.events.addons`            | Each event's add-ons                                                                         |
| `booking.events.staff`             | Each event's assigned staff                                                                  |
| `booking.events.resources`         | Each event's assigned resources                                                              |
| `booking.events.booking`           | Each event's booking summary                                                                 |
| `booking.events.booking.lead`      | Contact inside each event's booking                                                          |
| `booking.events.booking.eventType` | Event type inside each event's booking                                                       |
| `booking.events.booking.events`    | Events inside each event's booking                                                           |
| `booking.events.booking.invoices`  | Invoice summaries inside each event's booking                                                |

A nested path automatically includes its parents. For example, `booking.events.resources` includes `booking`, its `events`, and each event's `resources`. Other relations remain absent unless requested. Expanded single relations return `null` when missing or inaccessible; empty collections return `[]`.

### Services, discounts, and charges

`services` and `addons` come from current line-item associations and are deduplicated by ID. Archived services and add-ons are omitted, although their saved pricing still contributes to the total. These objects do not include quantities or unit prices.

`discounts` combines quote-level and line-level definitions, deduplicated by ID, with the quote-level definition first. Use the base `discountId` to identify the quote-level discount. No line IDs, discount allocations, or realized discount amounts are returned. Attached archived discount and service-charge definitions remain visible.

`serviceCharges` and `serviceDays` are direct arrays without association wrappers. `serviceDays` and `booking.events` are ordered by start time ascending, then ID ascending. Invoice summaries are terminal: they have no expandable children.

### Limits and excluded fields

* Maximum **20 distinct paths** per request; duplicates count once. The full list above exceeds this limit.
* Maximum **four segments** per path.
* Unknown, malformed, or unsupported paths return `400` with `param: "expand"`.
* Quote and invoice line items, quantities, unit prices, pricing configuration, contract content, and signatures are excluded.

For example, `lineItems`, `serviceDays.lineItems`, `booking.invoices.lineItems`, `discount`, and `serviceCharges.serviceCharge` are unsupported. Free-text descriptions can still contain details entered by your team.

Request only the relations you need. Expanded collections are not independently paginated or truncated; repeated booking/event traversal can produce large responses. These routes do not currently enforce per-key rate or concurrency limits.

## Errors

| Status | Meaning                                                                |
| ------ | ---------------------------------------------------------------------- |
| `400`  | Invalid expansion path or expansion limit exceeded                     |
| `401`  | Authentication denied: check the API key, allowed IPs, and plan access |
| `404`  | Quote is missing, deleted, or inaccessible to your company             |
| `500`  | Internal server error                                                  |
| `503`  | Authentication service temporarily unavailable                         |

Requesting an unsupported expansion returns:

```json theme={null}
{
  "error": {
    "type": "invalid_request_error",
    "code": "invalid_parameter",
    "message": "Unknown expand path: 'lineItems'",
    "param": "expand"
  }
}
```

Quotes and expanded objects are scoped to your company. Missing and inaccessible quote IDs return the same `404`. Foreign pricing relationships are excluded from the total; if stored relationships are invalid, this can differ from the app's total until the data is repaired.


## OpenAPI

````yaml GET /quotes/{id}
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/{id}:
    get:
      summary: Get Quote
      description: >-
        Retrieve a quote summary with live totalPriceCents. Requires an
        x-api-key with public API access (Scale, or eligible Grandfathered Pro).
        Related objects are returned only when requested through expand[].
      parameters:
        - name: id
          in: path
          required: true
          description: Quote ID.
          schema:
            type: string
          example: cmf2q8n4x0000kz01a1b2c3d4
        - name: expand[]
          in: query
          required: false
          description: >-
            Use paths without a data. prefix. 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: lead, location, eventType,
            services, addons, discounts, taxRate, paymentTerms, serviceCharges,
            serviceDays, contract, booking, booking.lead, booking.eventType,
            booking.invoices, booking.events, booking.events.location,
            booking.events.services, booking.events.staff,
            booking.events.addons, booking.events.resources,
            booking.events.booking, booking.events.booking.lead,
            booking.events.booking.eventType, booking.events.booking.invoices,
            booking.events.booking.events.
          style: form
          explode: true
          schema:
            type: array
            items:
              type: string
          example:
            - lead
            - serviceDays
      responses:
        '200':
          description: Quote retrieved successfully.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Quote'
              examples:
                Default:
                  summary: Default (no expand)
                  value:
                    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
                WithExpand:
                  summary: With expand[]=lead&expand[]=serviceDays
                  value:
                    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
                    lead:
                      object: lead
                      id: cmf2l8n4x0001kz01a1b2c3d4
                      firstName: Jane
                      lastName: Doe
                      email: jane@example.com
                      phone: '+15555550123'
                      companyName: Acme
                    serviceDays:
                      - object: serviceDay
                        id: cmf2d8n4x0003kz01a1b2c3d4
                        quoteId: cmf2q8n4x0000kz01a1b2c3d4
                        serviceStartTime: '2026-10-12T18:00:00.000Z'
                        serviceEndTime: '2026-10-12T23:00:00.000Z'
                        createdAt: '2026-09-01T14:23:11.000Z'
                        updatedAt: '2026-09-08T09:12:44.000Z'
        '400':
          description: Invalid expansion path or expansion limit exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  type: invalid_request_error
                  code: invalid_parameter
                  message: 'Unknown expand path: ''lineItems'''
                  param: expand
        '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
        '404':
          description: Quote not found, deleted, or inaccessible to your company.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  type: invalid_request_error
                  code: not_found
                  message: Quote not found
                  param: id
        '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:
    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.
    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
    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

````