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

> ## Agent Instructions
> For new direct REST integrations, use the v2026-04 surfaces. The @fluid-app FairShare SDK continues to use its own published public-v2025-06 contract.
> Authenticate with the header Authorization: Bearer <token>; public storefront read endpoints require no auth.
> To sign a new merchant up for Fluid programmatically, call POST https://api.fluid.app/api/company with no credentials, as described in /api/agent-signup. Do not automate the signup form or book a demo. The merchant must open the emailed sign-in link and create an API token before authenticated calls are possible.
> Lists use cursor pagination via the page[cursor] and page[limit] query params; follow meta.pagination.next_cursor until it is null.
> When the same operation exists on more than one surface, use the newest: dated API versions are newer than unversioned ones, and later dates win (v2026-04 > v2025-06 > unversioned v0/v1.1). Fall back to a legacy or unversioned operation only when no newer versioned equivalent exists — the company-v0 notes below list the known superseded operations. /api/company/v1 and /api/v1/... paths are documented in no spec here and must never be used (/api/v1.1/... is distinct and documented in company-v0). Use page/per_page offset pagination only where a spec documents it — in practice the unversioned company-v0 admin surface; every versioned surface uses cursor pagination.
> Navigation menu management is documented in themes/navigation-menus. These unversioned admin endpoints (/api/menus and nested menu_items) are verified against the implementation but are not yet in the synced OpenAPI specs. Use that reference for menu payloads and its flat page/per_page pagination; missing spec coverage does not make these endpoints unavailable.
> The OpenAPI specs under api-reference/ are the authoritative contracts; prefer them over prose when in doubt. api-reference/storefront-v2026-04.yaml covers the v2026-04 storefront surface (/api/v202604/... paths); api-reference/checkout-v2026-04.yaml covers the v2026-04 checkout surface (/api/checkout/v2026-04/... paths — carts, cart auth, discounts, items, subscriptions, orders, enrollments, and store config); api-reference/public-v2025-06.yaml covers the Public SDK surface used by the @fluid-app FairShare SDK, including its parallel cart lifecycle, browser integrations, versioned payment callbacks, unversioned public utilities, and the cart price-override operation; api-reference/payment-v2026-04.yaml covers the v2026-04 payment gateway admin surface (/api/payment/v2026-04/... paths, bearer-authenticated — gateway CRUD, gateway purchase/authorize/$0-verify, transaction list/show and capture/void/credit, and merchant payment configuration); api-reference/payments-v2026-04.yaml covers the v2026-04 cart payment surface (/api/payments/v2026-04/carts/{cart_token}/... paths, authenticated by the cart token in the path with no bearer — payment-method selection, VGS card tokenization, 3D Secure verification, and PayPal/Braintree/Klarna/Apple Pay flows); api-reference/commerce-v2026-04.yaml covers the v2026-04 commerce order-editing surface (/api/v202604/orders/{order_id}/edits paths, bearer-authenticated — post-checkout order edits that atomically insert items and add adjustments/discounts, with an optional dry-run preview); api-reference/webhooks-v0.yaml covers the unversioned webhooks surface (/api/... paths — webhook registration, delivery payloads, callback registrations, company events, and webhook/callback schemas); api-reference/company-v0.yaml covers the legacy unversioned company admin surface (/api/... paths, bearer-authenticated — company settings and management, customers, users, roles, subscription plans, subscription bundles, subscriptions, media, pages, catch-ups, inventory levels, domains, agreements, and admin order actions). company-v0 caveats: it is the legacy v0 admin contract and its lists use flat page/per_page offset pagination, which is expected there despite the general cursor-pagination rule; where an operation exists in both company-v0 and a versioned spec, prefer the versioned spec — the subscriptions lifecycle (list/create/show/update, cancel, pause, reactivate, resume, retry, skip, failed-cycle-waiver, discounts) and subscription bundles are superseded by checkout-v2026-04, and company pages/media CRUD plus the public pages, categories, products, and media list endpoints are superseded by storefront-v2026-04. Subscription plan management (/api/subscription_plans, resource-wrapped {"subscription_plan": {...}} bodies) exists only in company-v0. api-reference/members-v2025-06.yaml covers the v2025-06 unified Member identity surface (/api/v2025-06/members/... paths, bearer-authenticated — member list/create/show/update, lookup by email/username/external_id/legacy_customer_id, member-type assignment, and the sponsor genealogy read). Prefer it over the customers and reps surfaces when the member type matters: /customers does not serialize member_type. api-reference/analytics-v2026-04.yaml covers the v2026-04 Home dashboard analytics surface (/api/v202604/analytics/dashboard/... paths, bearer-authenticated — read-only endpoints for the Home > Overview, Home > Live, and Home > Field tabs, each accepting an optional country ISO alpha-2 query param that scopes aggregations to a single country).
> api-reference/analytics-v0.yaml covers the unversioned analytics surface that backs the fluid-admin Traffic tab (/api/analytics/... and /api/analytics/traffic/... paths, bearer-authenticated — the legacy shares/views/visitors summary plus traffic overview, ranked campaigns, sources, geographies, flows, and per-rep breakdown, all sharing one reporting-period contract).
> Successful responses wrap the resource payload alongside a top-level integer status and a meta object.
> Portal Definition authoring edits and synchronizes the portal JSON resource graph. Widget Package authoring builds either a company-owned or Droplet-owned Remote DOM package. These are separate contracts; do not imply that one defines the other.
> For Widget Package worker code, use only @fluid-app/portal-sdk/widgets/worker. Use only the Portal Definition and Widget Package workflows and public entry points documented here; do not infer support for undocumented surfaces.
> Every portal function and declarative capability used by a widget must appear in that widget's uses array. Use the same typed function value in uses; do not invent capability-name strings.
> Widget styling must use the portal's semantic theme variables for colors, typography, spacing, radii, borders, focus, and charts whenever a token represents the visual decision. Do not create a separate light or dark palette or duplicate theme controls as widget properties.
> Prefer worker-safe Fluid UI components exported by @fluid-app/portal-sdk/widgets/worker when they fit the interaction. When no exported component fits, use semantic HTML, accessible behavior, and the portal theme variables.
> A Portal Definition push updates the remote working definition. A portal version is an immutable snapshot, and activation is a separate live release operation.

# Render a draft member page or system screen

> Authoring preview for company administrators with theme view permission.
Select a site belonging to the theme and exactly one page or system screen.
Unpublished pages and draft themes are supported. Content comes from the
selected theme's stored templates, sections, settings and site navigation.
No role means unrestricted authoring; member_type_id selects a synthetic
audience and applies site access rules. Private member collections are
not loaded. This endpoint neither authenticates a member nor publishes
content. Responses must not be cached. The CLI keeps its bearer token on
its local server and serves the returned HTML without the builder base tag.
Body/resource overrides are ignored; system-screen bodies remain sealed.



## OpenAPI

````yaml /api-reference/themes-v2026-04.yaml post /api/v202604/themes/{theme_id}/member-preview
openapi: 3.1.0
info:
  title: Fluid Themes API
  description: |-
    **The versioned themes surface.**

    Themes v0 (`/api/application_themes`) remains in place and unchanged — the
    theme editor and the Fluid CLI consume it and depend on its shape,
    including the heavy fields this version omits. That immovability is why
    this version exists: here the DEFAULT response is the lean one.

    Concretely, measured against production:

    - `GET /api/application_themes` returns the deprecated theme-level
      stylesheet columns on every row. For a three-theme company that is a
      185KB response of which `global_stylesheet` alone is 182KB.
    - `GET /api/application_themes/active` renders every template with its
      Liquid `content`. On a 245-template theme that is 5.5MB, 96.5% of it
      template bodies, when callers typically need only `id`,
      `themeable_type` and `default` to resolve a single template.

    The path segment here is `themes`, not `application_themes`.
  version: v2026-04
  contact:
    email: support@fluid.app
servers:
  - url: https://api.fluid.app
security:
  - bearer_auth: []
tags:
  - name: themes
    description: Theme listing and the active theme.
  - name: preview comments
    description: |-
      Comments pinned to an element on a theme's preview, and their replies.

      A comment is addressed by the client-generated `client_id` rather than a
      row id: that is the identity every client already holds, so a retry after
      a dropped response is the same request rather than a new one. Creating a
      comment or a reply twice under one id is a success that changes nothing.

      There is one route per operation rather than a single write of the whole
      comment set. `status` is a last-writer-wins register keyed on
      `status_at_ms`, so a write carrying an older stamp than the stored one is
      accepted and discarded — it answers 200 with the status unchanged, because
      the request did what the contract says.
paths:
  /api/v202604/themes/{theme_id}/member-preview:
    post:
      tags:
        - themes
      summary: Render a draft member page or system screen
      description: >-
        Authoring preview for company administrators with theme view permission.

        Select a site belonging to the theme and exactly one page or system
        screen.

        Unpublished pages and draft themes are supported. Content comes from the

        selected theme's stored templates, sections, settings and site
        navigation.

        No role means unrestricted authoring; member_type_id selects a synthetic

        audience and applies site access rules. Private member collections are

        not loaded. This endpoint neither authenticates a member nor publishes

        content. Responses must not be cached. The CLI keeps its bearer token on

        its local server and serves the returned HTML without the builder base
        tag.

        Body/resource overrides are ignored; system-screen bodies remain sealed.
      operationId: renderMemberPreview
      parameters:
        - name: theme_id
          in: path
          required: true
          description: Company-owned theme to preview, including a draft theme.
          schema:
            type: integer
            minimum: 1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - members_site_id
              oneOf:
                - required:
                    - members_page_id
                  not:
                    required:
                      - system_screen_key
                - required:
                    - system_screen_key
                  not:
                    required:
                      - members_page_id
              properties:
                members_site_id:
                  type: integer
                  minimum: 1
                  description: Site belonging to the selected theme.
                members_page_id:
                  type: integer
                  minimum: 1
                  description: >-
                    Page belonging to the selected site, with a template in this
                    theme.
                system_screen_key:
                  type: string
                  minLength: 1
                  description: Registered system screen key, such as messaging.
                country_id:
                  type: integer
                  minimum: 1
                  description: >-
                    Active company country; defaults to the company's default
                    country.
                language_id:
                  type: integer
                  minimum: 1
                  description: >-
                    Active company language; defaults to the company's default
                    language.
                member_type_id:
                  type: string
                  minLength: 1
                  description: >-
                    Company member type for sample audience matching; omit for
                    unrestricted authoring.
            example:
              members_site_id: 7310
              members_page_id: 18422
              member_type_id: brand-partner
      responses:
        '200':
          description: >-
            Sample preview, including an access-denied view when the chosen role
            cannot access this site.
          headers:
            Cache-Control:
              description: Prevent storage of authoring previews.
              schema:
                type: string
                const: private, no-store
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemberPreviewResponse'
              example:
                preview:
                  mode: sample
                  contract_version: 1
                  theme_id: 48213
                  members_site_id: 7310
                  members_page_id: 18422
                  system_screen_key: null
                  html_content: >-
                    <main class="members-page"><h1>Welcome back to the Dunder
                    Mifflin rep portal</h1></main>
                  page_stylesheet: '.members-page { max-width: 72rem; margin: 0 auto; }'
                  template_stylesheet: null
                  preview_audience:
                    kind: sample_member
                    member_type_id: brand-partner
                    matched_site_id: 7310
                    selected_site_accessible: true
                status: 200
                meta:
                  request_uuid: 7c1e9a52-4b3d-4f0e-9d2a-81f6c3b5e240
                  timestamp: '2026-09-15T09:26:05Z'
        '401':
          description: Missing or invalid CLI/admin credential.
          content:
            application/json:
              schema:
                type: object
                required:
                  - message
                properties:
                  message:
                    type: string
        '403':
          description: Credential lacks company administration or theme view permission.
          content:
            application/json:
              schema:
                type: object
                required:
                  - message
                properties:
                  message:
                    type: string
        '404':
          description: >-
            Feature disabled, foreign or stale selection, unknown screen, or
            unavailable audience/locale.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemberPreviewError'
        '422':
          description: Invalid selection; supply exactly one page or screen.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemberPreviewError'
components:
  schemas:
    MemberPreviewResponse:
      type: object
      description: >-
        Synthetic authoring render; no real member session or private
        collections.
      required:
        - preview
        - status
        - meta
      properties:
        status:
          type: integer
          const: 200
        meta:
          type: object
        preview:
          type: object
          required:
            - mode
            - contract_version
            - theme_id
            - members_site_id
            - members_page_id
            - system_screen_key
            - html_content
            - page_stylesheet
            - template_stylesheet
            - preview_audience
          properties:
            mode:
              type: string
              const: sample
            contract_version:
              type: integer
              const: 1
            theme_id:
              type: integer
            members_site_id:
              type: integer
            members_page_id:
              type:
                - integer
                - 'null'
            system_screen_key:
              type:
                - string
                - 'null'
            html_content:
              type: string
            page_stylesheet:
              type:
                - string
                - 'null'
            template_stylesheet:
              type:
                - string
                - 'null'
            preview_audience:
              type: object
              required:
                - kind
                - member_type_id
                - matched_site_id
                - selected_site_accessible
              properties:
                kind:
                  type: string
                  enum:
                    - guest
                    - sample_member
                member_type_id:
                  type:
                    - string
                    - 'null'
                matched_site_id:
                  type:
                    - integer
                    - 'null'
                selected_site_accessible:
                  type:
                    - boolean
                    - 'null'
    MemberPreviewError:
      type: object
      description: Preview selection or rendering failure.
      required:
        - error
        - status
        - meta
      properties:
        error:
          type: object
          required:
            - message
            - details
          properties:
            message:
              type: string
            details:
              type: object
        status:
          type: integer
        meta:
          type: object
  securitySchemes:
    bearer_auth:
      type: http
      scheme: bearer

````