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

# Get product

> Load a product from a composed menu with pricing and availability.

Returns a single product from the active menu, including localized name and description, image, and per-channel pricing and availability. Use this endpoint for product detail pages or to hydrate cart line items.

<Note>
  Requires a Fire spark access token obtained through [token
  exchange](/docs/storefront-api/oauth/exchange/post).
</Note>

## Path parameters

| Parameter | Description                                                                               |
| --------- | ----------------------------------------------------------------------------------------- |
| `id`      | External product identifier. Alphanumeric characters, `_`, and `-` only. 1–64 characters. |

## Query parameters

| Parameter        | Required | Description                      |
| ---------------- | -------- | -------------------------------- |
| `fulfillment_id` | No       | External fulfillment identifier. |
| `store_id`       | No       | External store identifier.       |
| `channel_id`     | No       | External channel identifier.     |
| `brand_id`       | No       | External brand identifier.       |

## Request

```bash theme={null}
curl "https://firespark.cloud/api/storefront/v1/menus/products/burger-classic?fulfillment_id=delivery&store_id=downtown&channel_id=app&brand_id=0001" \
  -H "Authorization: Bearer ACCESS_TOKEN"
```

## Response

<ResponseExample>
  ```json Success theme={null}
  {
    "data": {
      "id": "burger-classic",
      "uid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "brand_id": "0001",
      "organization_id": "11111111-1111-1111-1111-111111111111",
      "merchant_id": "22222222-2222-2222-2222-222222222222",
      "name": "Classic burger",
      "description": "Angus beef patty with lettuce and tomato.",
      "image_url": "https://cdn.example.com/burger-classic.jpg",
      "channels": {
        "APP": {
          "id": "app",
          "uid": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
          "name": "Mobile app",
          "stores": {
            "downtown": {
              "id": "downtown",
              "uid": "c3d4e5f6-a7b8-9012-cdef-123456789012",
              "name": "Downtown",
              "fulfillment": {
                "DELIVERY": {
                  "uid": "d4e5f6a7-b8c9-0123-def4-567890abcdef",
                  "id": "delivery",
                  "type": "DELIVERY",
                  "name": "Delivery",
                  "pricing": {
                    "minimum_quantity": 1,
                    "maximum_quantity": 10,
                    "is_tax_inclusive": true,
                    "tax_rate": 0.15,
                    "price": 12.99,
                    "anchor_price": 14.99,
                    "anchor_price_percentage": 0.13,
                    "modifiers": [],
                    "modifier_group_ids": ["choose-drink"]
                  },
                  "availability": {
                    "status": "AVAILABLE",
                    "schedules": [
                      { "day_of_week": "monday", "periods": [{ "start_time": "11:00:00", "end_time": "22:00:00" }] }
                    ],
                    "out_of_stock_until": null
                  },
                  "bundled_items": []
                }
              }
            }
          }
        }
      },
      "cms_template_id": null,
      "cms": null,
      "status": "ACTIVE"
    }
  }
  ```
</ResponseExample>

## Product object

| Field             | Type           | Description                                                               |
| ----------------- | -------------- | ------------------------------------------------------------------------- |
| `id`              | string         | External product identifier.                                              |
| `uid`             | string (UUID)  | Fire spark internal identifier.                                           |
| `brand_id`        | string \| null | External brand identifier. `null` when the resource is not brand-scoped.  |
| `organization_id` | string (UUID)  | Fire spark organization identifier.                                       |
| `merchant_id`     | string (UUID)  | Fire spark merchant identifier.                                           |
| `name`            | string         | Display name. 1–100 characters.                                           |
| `description`     | string         | Optional description. Up to 500 characters. `null` when omitted.          |
| `image_url`       | string         | Product image URL.                                                        |
| `channels`        | object         | Per-channel, per-store, per-fulfillment pricing and availability.         |
| `cms_template_id` | string (UUID)  | CMS template linked to this product. `null` when no template is assigned. |
| `cms`             | object         | Read-only. Resolved CMS template when assigned.                           |
| `status`          | string         | `ACTIVE` or `INACTIVE`.                                                   |

<AccordionGroup>
  <Accordion title="channels">
    Map of channel codes. Each entry contains `id`, `uid`, `name`, and a `stores` map.

    Each store contains `id`, `uid`, `name`, and a `fulfillment` map keyed by fulfillment type code.

    Each fulfillment entry requires `uid`, `id`, `type`, `name`, `pricing`, and `availability`.
  </Accordion>

  <Accordion title="pricing">
    | Field                     | Required | Type    | Description                                                 |
    | ------------------------- | -------- | ------- | ----------------------------------------------------------- |
    | `minimum_quantity`        | Yes      | number  | Minimum units per order. ≥ 0.                               |
    | `maximum_quantity`        | Yes      | number  | Maximum units per order. 0–1,000,000.                       |
    | `is_tax_inclusive`        | Yes      | boolean | Whether `price` includes tax.                               |
    | `tax_rate`                | Yes      | number  | Tax rate as a decimal (for example `0.15` for 15%). 0–1.    |
    | `price`                   | Yes      | number  | List price. ≥ 0.                                            |
    | `anchor_price`            | Yes      | number  | Reference price for strikethrough or comparison. ≥ 0.       |
    | `anchor_price_percentage` | Yes      | number  | Discount shown relative to `anchor_price`. 0–1.             |
    | `modifiers`               | No       | array   | Per-modifier pricing overrides. Defaults to `[]`.           |
    | `modifier_group_ids`      | No       | array   | Modifier groups attached to this product. Defaults to `[]`. |

    Each fulfillment entry may also include `bundled_items` — items included in a bundle or combo:

    | Field               | Required | Type   | Description                                             |
    | ------------------- | -------- | ------ | ------------------------------------------------------- |
    | `id`                | Yes      | string | External identifier of the bundled product.             |
    | `refund_price`      | Yes      | number | Refund amount when the customer removes this item. ≥ 0. |
    | `included_quantity` | Yes      | number | Units included by default. ≥ 0.                         |
  </Accordion>

  <Accordion title="availability">
    | Field                | Required | Type          | Description                                                                                      |
    | -------------------- | -------- | ------------- | ------------------------------------------------------------------------------------------------ |
    | `status`             | Yes      | string        | `AVAILABLE`, `UNAVAILABLE`, or `OUT_OF_STOCK`.                                                   |
    | `schedules`          | No       | array \| null | Schedule entries with `day_of_week` and `periods`. `null` when there is no schedule restriction. |
    | `out_of_stock_until` | No       | string        | Optional ISO 8601 datetime when the product returns to stock.                                    |

    Each schedule entry contains `day_of_week` (`monday` through `sunday`) and a `periods` array. Each period has optional `closed` (default `false`), `start_time`, `end_time`, and optional `start_date` / `end_date` bounds.
  </Accordion>
</AccordionGroup>

## Error responses

| Status | Description                                            |
| ------ | ------------------------------------------------------ |
| `401`  | Missing or invalid access token.                       |
| `403`  | Token does not have access to this product.            |
| `404`  | Product not found in the active menu for this context. |


## OpenAPI

````yaml GET /menus/products/{id}
openapi: 3.0.1
info:
  title: Fire spark Storefront API
  description: Customer-facing channel endpoints for Fire spark.
  version: 1.0.0
servers:
  - url: https://firespark.cloud/api/storefront/v1
security:
  - bearerAuth: []
paths:
  /menus/products/{id}:
    get:
      summary: Get product
      parameters:
        - in: path
          name: id
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 64
            pattern: ^[a-zA-Z0-9_-]+$
          description: External product identifier.
        - in: query
          name: fulfillment_id
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 64
            pattern: ^[a-zA-Z0-9_-]+$
          description: External fulfillment identifier.
        - in: query
          name: store_id
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 64
            pattern: ^[a-zA-Z0-9_-]+$
          description: External store identifier.
        - in: query
          name: channel_id
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 64
            pattern: ^[a-zA-Z0-9_-]+$
          description: External channel identifier.
        - in: query
          name: brand_id
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 64
            pattern: ^[a-zA-Z0-9_-]+$
          description: External brand identifier.
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/MenuProduct'
components:
  schemas:
    MenuProduct:
      type: object
      properties:
        id:
          type: string
          minLength: 1
          maxLength: 64
          pattern: ^[a-zA-Z0-9_-]+$
        name:
          $ref: '#/components/schemas/MultiLanguageText'
        pricing:
          type: object
        availability:
          type: object
    MultiLanguageText:
      type: object
      additionalProperties:
        type: string
      example:
        en_us: Example
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

````