> ## 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.
> Lists use cursor pagination via the page[cursor] and page[limit] query params; follow meta.pagination.next_cursor until it is null.
> Never use /api/company/v1 or /api/v1 paths, page/per_page params, or offset pagination — they are legacy.
> 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/auth-v0.yaml covers the unversioned auth surface (/api/... paths — authentication, MFA, social auth, and token exchange); 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).
> Successful responses wrap the resource payload alongside a top-level integer status and a meta object.

# Query product

> Returns a single product and its purchasable variants for the checkout
surface. `{id}` accepts a product id or slug. Uses POST because the request
body carries the shop, locale negotiation, and session context under
`metadata` — here `metadata.fluid_shop` is the full host (e.g.
`acme.fluid.app`), unlike the bare subdomain used in `create_cart` /
`send_magic_link`. Public — no bearer token is required. Note the error
envelope: this operation's `404` (product not found) uses the legacy
`{ status: "fail", data: { error } }` shape, whereas its `422` — and every
other operation on this surface — uses the standard `ErrorResponse`
(`{ error_message, errors, meta }`), so a uniform error parser must
special-case this `404`.




## OpenAPI

````yaml /api-reference/checkout-v2026-04.yaml post /api/checkout/v2026-04/products/{id}
openapi: 3.1.0
info:
  title: Fluid Checkout API
  description: >-
    **Fluid Checkout API — for building a checkout directly against REST.**


    Use this surface if you are integrating server-to-server or building your
    own

    checkout UI. It covers the full order lifecycle (cart → address → shipping →

    discount → complete → order) plus the logged-in customer's account: saved

    addresses, saved payment methods, order history, loyalty points, and

    subscription management (pause, resume, skip, cancel, retry).


    **The cart token in the URL scopes cart access** — creating a cart, adding

    items, applying a discount, and completing a cart need no bearer token.

    Among the cart operations, a Bearer token is required only for

    `carts/{cart_token}/sync`, `carts/{cart_token}/volume_rep`, and

    `carts/{cart_token}/discount/manual`. Off the cart, a token is required for

    everything under `customers/me` and `subscriptions`, and for the store and

    directory lookups (`store/config`, `store/languages`, `reps`, `users`) and

    `subscription_bundles`. `store/countries` accepts a token but does not

    require one — it returns the same list either way.


    **If you are using the `@fluid-app` FairShare SDK in a theme or storefront,

    you are not calling this surface** — the SDK calls the Fluid Public SDK API

    (`public-v2025-06`). Do not mix the two against one cart: they share the
    same

    cart records and services, but their request shapes differ. See

    [Choosing a cart
    surface](https://docs.fluid.app/api/choosing-a-cart-surface)

    for the operation map and boundary.
  version: v2026-04
  contact:
    email: support@fluid.app
  license:
    name: Proprietary
    identifier: LicenseRef-Proprietary
servers:
  - url: https://api.fluid.app
security: []
tags:
  - name: carts
    description: >-
      Create, read, and mutate checkout carts (email, address, country,
      language, shipping, recalculation, completion).
  - name: cart-auth
    description: >-
      Cart-scoped customer authentication — magic-link challenge, verification,
      identity, and logout.
  - name: cart-discount
    description: >-
      Apply, list, and remove cart discount codes, including admin manual
      discounts.
  - name: cart-items
    description: Add, update, and remove line items on a cart.
  - name: cart-points
    description: Apply and remove loyalty points on a cart.
  - name: customers
    description: The authenticated customer's profile and company memberships.
  - name: customer-addresses
    description: The authenticated customer's saved shipping/billing addresses.
  - name: customer-orders
    description: The authenticated customer's order history.
  - name: customer-payment-methods
    description: The authenticated customer's saved payment methods and tokenization.
  - name: customer-points
    description: The authenticated customer's loyalty point balances.
  - name: directory
    description: Company rep and user directory lookups.
  - name: enrollments
    description: >-
      Public enrollment forms — retrieve a form and submit, update, or upload
      field answers.
  - name: orders
    description: Public order lookup by token.
  - name: products
    description: Public product queries for the storefront checkout.
  - name: store
    description: >-
      Store-level checkout configuration — countries, languages, address fields,
      agreements, drop zones, and Apple Pay domain verification.
  - name: subscriptions
    description: >-
      Manage subscriptions — pause, resume, skip, cancel, reactivate, retry, and
      failed-cycle waivers.
  - name: subscription-bundles
    description: List and create subscription bundles.
paths:
  /api/checkout/v2026-04/products/{id}:
    post:
      tags:
        - products
      summary: Query product
      description: >
        Returns a single product and its purchasable variants for the checkout

        surface. `{id}` accepts a product id or slug. Uses POST because the
        request

        body carries the shop, locale negotiation, and session context under

        `metadata` — here `metadata.fluid_shop` is the full host (e.g.

        `acme.fluid.app`), unlike the bare subdomain used in `create_cart` /

        `send_magic_link`. Public — no bearer token is required. Note the error

        envelope: this operation's `404` (product not found) uses the legacy

        `{ status: "fail", data: { error } }` shape, whereas its `422` — and
        every

        other operation on this surface — uses the standard `ErrorResponse`

        (`{ error_message, errors, meta }`), so a uniform error parser must

        special-case this `404`.
      operationId: checkout_v2026_04_query_product
      parameters:
        - name: id
          in: path
          required: true
          description: Product ID or slug
          schema:
            type: string
      requestBody:
        content:
          application/json:
            examples:
              by_slug:
                summary: Resolve a product by slug for a given shop
                value:
                  metadata:
                    fluid_shop: acme.fluid.app
                    fluid_locale: en
            schema:
              type: object
              additionalProperties: false
              required:
                - metadata
              properties:
                metadata:
                  type: object
                  additionalProperties: false
                  required:
                    - fluid_shop
                  properties:
                    fluid_shop:
                      type: string
                      description: Fluid shop identifier
                      example: acme.fluid.app
                    fluid_locale:
                      type:
                        - string
                        - 'null'
                      description: Locale for product content
                      example: en
                    fluid_session:
                      type:
                        - string
                        - 'null'
                      description: Session identifier
      responses:
        '200':
          description: Product details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CheckoutProductQueryResponse'
        '404':
          description: Product not found
          content:
            application/json:
              schema:
                type: object
                additionalProperties: false
                required:
                  - status
                  - data
                properties:
                  status:
                    type: string
                    enum:
                      - fail
                  data:
                    type: object
                    additionalProperties: false
                    required:
                      - error
                    properties:
                      error:
                        type: string
        '422':
          description: Unprocessable entity
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security: []
components:
  schemas:
    CheckoutProductQueryResponse:
      type: object
      properties:
        metadata:
          type: object
          properties:
            fluid_locale:
              type: string
            fluid_session:
              type:
                - string
                - 'null'
            fluid_shop:
              type: string
            request_uuid:
              type: string
            timestamp:
              type: string
              format: date-time
          required:
            - fluid_locale
            - fluid_session
            - fluid_shop
            - request_uuid
            - timestamp
          additionalProperties: false
        product:
          type: object
          properties:
            canonical_url:
              type: string
            cv:
              type: string
              format: decimal
            cv_in_currency:
              type: string
            external_id:
              type:
                - string
                - 'null'
            id:
              type: integer
            image_path:
              type:
                - string
                - 'null'
            image_url:
              type: string
            introduction:
              type:
                - string
                - 'null'
            metadata:
              type:
                - object
                - 'null'
            metafields:
              type: array
              items:
                type: object
                additionalProperties: false
                required:
                  - id
                  - namespace
                  - key
                  - value
                  - value_type
                  - description
                  - owner_type
                  - owner_id
                  - created_at
                  - updated_at
                  - metafield_definition
                properties:
                  id:
                    type: integer
                  namespace:
                    type: string
                  key:
                    type: string
                  value:
                    $ref: '#/components/schemas/JsonValue'
                  value_type:
                    type: string
                  description:
                    type:
                      - string
                      - 'null'
                  owner_type:
                    type: string
                  owner_id:
                    type: integer
                  created_at:
                    type: string
                    format: date-time
                  updated_at:
                    type: string
                    format: date-time
                  metafield_definition:
                    type:
                      - object
                      - 'null'
                    additionalProperties: false
                    required:
                      - id
                      - company_id
                      - namespace
                      - key
                      - name
                      - description
                      - value_type
                      - validation_rules
                      - owner_resource
                      - pinned
                      - position
                      - locked
                      - created_at
                      - updated_at
                      - list_type
                      - reference_type
                      - supported_validations
                      - validation_description
                      - category_ids
                    properties:
                      id:
                        type: integer
                      company_id:
                        type: integer
                      namespace:
                        type: string
                      key:
                        type: string
                      name:
                        type: string
                      description:
                        type:
                          - string
                          - 'null'
                      value_type:
                        type: string
                      validation_rules:
                        type:
                          - object
                          - 'null'
                        additionalProperties:
                          $ref: '#/components/schemas/JsonValue'
                      owner_resource:
                        type: string
                      pinned:
                        type:
                          - boolean
                          - 'null'
                      position:
                        type:
                          - integer
                          - 'null'
                      locked:
                        type:
                          - boolean
                          - 'null'
                      created_at:
                        type: string
                        format: date-time
                      updated_at:
                        type: string
                        format: date-time
                      list_type:
                        type: boolean
                      reference_type:
                        type: boolean
                      supported_validations:
                        type: array
                        items:
                          type: string
                      validation_description:
                        type:
                          - string
                          - 'null'
                      category_ids:
                        type: array
                        items:
                          type: integer
            price:
              type:
                - string
                - number
                - 'null'
            price_in_currency:
              type: string
            sku:
              type: string
            tax:
              type: string
            tax_in_currency:
              type: string
            title:
              type: string
          required:
            - canonical_url
            - cv
            - cv_in_currency
            - external_id
            - id
            - image_path
            - image_url
            - introduction
            - metadata
            - metafields
            - price
            - price_in_currency
            - sku
            - tax
            - tax_in_currency
            - title
          additionalProperties: false
        status:
          type: integer
        subscription_plans:
          type: array
          items:
            type: object
            additionalProperties: false
            required:
              - id
              - name
              - billing_interval
              - billing_interval_unit
              - billing_frequency_in_words
              - shipping_interval
              - shipping_interval_unit
              - volume_interval
              - volume_interval_unit
              - trial_period
              - trial_period_unit
              - split_volume
              - allow_skipping
              - max_skips
              - allow_max_billing_cycles
              - max_billing_cycles
              - price_adjustment_type
              - price_adjustment_amount
              - savings_display_mode
              - active
              - company_default
              - created_at
              - updated_at
              - products_count
              - subscribers_count
            properties:
              id:
                type: integer
              name:
                type: string
              billing_interval:
                type: integer
              billing_interval_unit:
                type: string
                enum:
                  - day
                  - week
                  - month
                  - year
              billing_frequency_in_words:
                type: string
              shipping_interval:
                type: integer
              shipping_interval_unit:
                type: string
                enum:
                  - day
                  - week
                  - month
                  - year
              volume_interval:
                type: integer
              volume_interval_unit:
                type: string
                enum:
                  - day
                  - week
                  - month
                  - year
              trial_period:
                type:
                  - integer
                  - 'null'
              trial_period_unit:
                type:
                  - string
                  - 'null'
              split_volume:
                type: boolean
              allow_skipping:
                type:
                  - boolean
                  - 'null'
              max_skips:
                type:
                  - integer
                  - 'null'
              allow_max_billing_cycles:
                type: boolean
              max_billing_cycles:
                type:
                  - integer
                  - 'null'
              price_adjustment_type:
                type:
                  - string
                  - 'null'
              price_adjustment_amount:
                type: number
                description: Serialized via to_f — nil becomes 0.0, so never null.
              savings_display_mode:
                type: string
              active:
                type:
                  - boolean
                  - 'null'
              company_default:
                type:
                  - boolean
                  - 'null'
              created_at:
                type: string
                format: date-time
              updated_at:
                type: string
                format: date-time
              products_count:
                type: integer
              subscribers_count:
                type: integer
        variants:
          type: array
          items:
            $ref: '#/components/schemas/CheckoutProductVariant'
      required:
        - metadata
        - product
        - status
        - subscription_plans
        - variants
      additionalProperties: false
    ErrorResponse:
      type: object
      additionalProperties: false
      required:
        - error_message
        - errors
        - meta
      properties:
        error_message:
          type: string
        errors:
          $ref: '#/components/schemas/ErrorBag'
        meta:
          $ref: '#/components/schemas/CheckoutMeta'
    JsonValue:
      description: >-
        Any valid JSON value for provider, integration, theme, metadata, or
        other dynamic payloads whose keys are not fixed by the API contract.
      anyOf:
        - type: string
        - type: number
        - type: boolean
        - type: 'null'
        - type: array
          items:
            $ref: '#/components/schemas/JsonValue'
        - type: object
          additionalProperties:
            $ref: '#/components/schemas/JsonValue'
    CheckoutProductVariant:
      type: object
      properties:
        id:
          type: integer
        title:
          type: string
        display_name:
          type:
            - string
            - 'null'
        image_url:
          type:
            - string
            - 'null'
        image_path:
          type:
            - string
            - 'null'
        sku:
          type:
            - string
            - 'null'
        primary_image:
          type:
            - string
            - 'null'
        price:
          type:
            - number
            - string
            - 'null'
        price_in_currency:
          type: string
        currency_code:
          type:
            - string
            - 'null'
        options:
          type: array
          items:
            $ref: '#/components/schemas/CheckoutProductVariantOption'
      required:
        - id
        - title
        - display_name
        - image_url
        - image_path
        - sku
        - primary_image
        - price
        - price_in_currency
        - currency_code
        - options
      additionalProperties: false
    ErrorBag:
      description: >-
        Validation errors keyed by field, a list of errors, a single error
        message, or null when no structured error details are available.
      anyOf:
        - type: string
        - type: array
          items:
            $ref: '#/components/schemas/ErrorValue'
        - type: object
          additionalProperties:
            $ref: '#/components/schemas/ErrorValue'
        - type: 'null'
    CheckoutMeta:
      type: object
      additionalProperties: false
      required:
        - request_id
        - timestamp
      properties:
        request_id:
          type:
            - string
            - 'null'
        timestamp:
          type: string
          format: date-time
    CheckoutProductVariantOption:
      type: object
      properties:
        title:
          type: string
        value:
          type: string
      required:
        - title
        - value
      additionalProperties: false
    ErrorValue:
      description: A validation or API error value.
      anyOf:
        - type: string
        - type: array
          items:
            type: string
        - type: object
          additionalProperties:
            $ref: '#/components/schemas/JsonValue'

````