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

# Product with special schedule

> Limit when a product can be ordered using availability schedules.

Menu-level schedules control when an entire composed menu is active. **Product-level schedules** narrow orderability further — useful for happy-hour items, lunch-only specials, or seasonal products that stay in the catalog but are not always purchasable.

## What this example includes

| Entity                      | Schedule                | Behavior                                  |
| --------------------------- | ----------------------- | ----------------------------------------- |
| Menu                        | `schedules: null`       | Available 24/7                            |
| Product: `drink-happy-hour` | Weekdays 17:00–19:00    | Orderable only during happy hour          |
| Product: `salad-house`      | No schedule restriction | Always orderable while the menu is active |

```mermaid theme={null}
flowchart TB
    MENU["Menu: all-day delivery\n24/7"]
    MENU --> SALAD["salad-house\nalways available"]
    MENU --> BEER["drink-happy-hour\nMon–Fri 17:00–19:00"]
```

## Request

Set `availability.schedules` on the product. Use the same weekly shape as menu schedules: exactly **7** `day_of_week` entries (`monday`–`sunday`), each with a `periods` array. Open periods use `start_time` / `end_time`; optional `closed` defaults to `false`; optional `start_date` / `end_date` bound a dated window. Use `null` when the product has no hour restriction. See [Schedules](/docs/integrations-api/guides/menu-sync#schedules).

```bash theme={null}
curl --request PUT \
  --url 'https://firespark.cloud/api/integrations/v1/menus?fulfillment_id=delivery&store_id=downtown&channel_id=app&brand_id=0001' \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d @product-special-schedule.json
```

```json product-special-schedule.json theme={null}
{
  "style": "DEFAULT",
  "products": [
    {
      "id": "drink-happy-hour",
      "name": { "en_us": "Happy hour beer" },
      "description": { "en_us": "Draft beer at happy hour pricing." },
      "image_url": null,
      "status": "ACTIVE",
      "bundled_items": [],
      "pricing": {
        "minimum_quantity": 1,
        "maximum_quantity": 6,
        "is_tax_inclusive": true,
        "tax_rate": 0.15,
        "price": 4.99,
        "anchor_price": 6.99,
        "anchor_price_percentage": 0.29,
        "modifiers": [],
        "modifier_group_ids": []
      },
      "availability": {
        "status": "AVAILABLE",
        "schedules": [
          { "day_of_week": "monday", "periods": [{ "start_time": "17:00:00", "end_time": "19:00:00" }] },
          { "day_of_week": "tuesday", "periods": [{ "start_time": "17:00:00", "end_time": "19:00:00" }] },
          { "day_of_week": "wednesday", "periods": [{ "start_time": "17:00:00", "end_time": "19:00:00" }] },
          { "day_of_week": "thursday", "periods": [{ "start_time": "17:00:00", "end_time": "19:00:00" }] },
          { "day_of_week": "friday", "periods": [{ "start_time": "17:00:00", "end_time": "19:00:00" }] },
          { "day_of_week": "saturday", "periods": [] },
          { "day_of_week": "sunday", "periods": [] }
        ],
        "out_of_stock_until": null
      },
      "metadata": {}
    },
    {
      "id": "salad-house",
      "name": { "en_us": "House salad" },
      "description": { "en_us": "Mixed greens with vinaigrette." },
      "image_url": null,
      "status": "ACTIVE",
      "bundled_items": [],
      "pricing": {
        "minimum_quantity": 1,
        "maximum_quantity": 10,
        "is_tax_inclusive": true,
        "tax_rate": 0.15,
        "price": 8.99,
        "anchor_price": 8.99,
        "anchor_price_percentage": 0,
        "modifiers": [],
        "modifier_group_ids": []
      },
      "availability": {
        "status": "AVAILABLE",
        "schedules": null,
        "out_of_stock_until": null
      },
      "metadata": {}
    }
  ],
  "categories": [
    {
      "id": "specials",
      "name": { "en_us": "Specials" },
      "description": null,
      "status": "ACTIVE",
      "items": [
        { "type": "PRODUCT", "id": "drink-happy-hour" },
        { "type": "PRODUCT", "id": "salad-house" }
      ],
      "availability": {
        "status": "AVAILABLE",
        "schedules": null,
        "out_of_stock_until": null
      },
      "metadata": {}
    }
  ],
  "modifier_groups": [],
  "menus": [
    {
      "id": "all-day-delivery",
      "name": { "en_us": "All-day delivery" },
      "description": null,
      "schedules": null,
      "metadata": {},
      "category_ids": ["specials"],
      "status": "ACTIVE"
    }
  ]
}
```

## Key points

* **Menu vs product schedules.** The menu stays active all day. The beer is hidden outside 17:00–19:00 on weekdays even though the category and menu remain visible.
* **Full week required.** Weekend days still appear with `"periods": []` (closed all day). Partial weeks fail validation.
* **Categories can be scheduled too.** Use `categories[].availability.schedules` when an entire section should appear only during certain hours.
* **Temporary unavailability.** For one-off 86s, prefer `availability.status: OUT_OF_STOCK` with `out_of_stock_until` instead of rebuilding schedules.
* **Per-context overrides.** To change product hours for one channel, store, fulfillment type, or composed menu without a full menu upsert, call [Update product](/docs/integrations-api/menus/products/\[id]/put) with `?store_id`, `?channel_id`, `?fulfillment_id`, and/or `?menu_id`, sending `availability.schedules` in the menu product body.

## Related

<CardGroup cols={2}>
  <Card title="Menu sync — schedules" icon="clock" href="/docs/integrations-api/guides/menu-sync">
    Menu, category, and product schedule levels
  </Card>

  <Card title="Multi-schedule menu" icon="calendar" href="/docs/integrations-api/examples/menu-sync/multi-schedule">
    Two daypart menus in one upsert
  </Card>
</CardGroup>
