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

# Product List

> Send up to 30 products from your catalog, organized in sections

## Request

Use `type` as `interactive` and set `interactive.type` to `product_list`.

A multi-product message displays products from your catalog grouped in sections. The recipient can browse, view details, add items to their WhatsApp cart, and send the cart back as an order.

### Field types

* `to`: string (required)
* `type`: string = `interactive` (required)
* `interactive`: object (required)
* `interactive.type`: string = `product_list` (required)
* `interactive.header`: object (required)
* `interactive.header.type`: string = `text` (required)
* `interactive.header.text`: string (required)
* `interactive.body`: object (required)
* `interactive.body.text`: string (required)
* `interactive.footer`: object (optional)
* `interactive.footer.text`: string (optional)
* `interactive.action`: object (required)
* `interactive.action.catalog_id`: string (required)
* `interactive.action.sections`: array of objects (required)
* `interactive.action.sections[].title`: string (required)
* `interactive.action.sections[].product_items`: array of objects (required)
* `interactive.action.sections[].product_items[].product_retailer_id`: string (required)
* `tags`: array of strings (optional)
* `metadata`: object | string (optional)

### Field behavior and limits

* `interactive.header.text` is required, max 60 characters. The header type must be `text`.
* `interactive.body.text` is required, max 1024 characters.
* `interactive.footer.text` is optional, max 60 characters.
* `interactive.action.catalog_id` is the ID of the Meta catalog connected to the WhatsApp Business account.
* `interactive.action.sections` requires at least 1 section.
* Across all sections, at most 30 `product_items` in total.
* Product data (image, name, price, stock) is fetched by WhatsApp at delivery time — the recipient always sees the latest catalog state.
* If none of the `product_retailer_id` values match a product in the catalog, the message is not delivered and an error is returned. If at least one matches, the message is sent and missing items are dropped silently.
* Cannot be sent as a notification — only inside an existing conversation.

```json theme={null}
{
  "to": "+573001112233",
  "type": "interactive",
  "interactive": {
    "type": "product_list",
    "header": { "type": "text", "text": "Nuestro menú" },
    "body": { "text": "Elige uno o más productos" },
    "footer": { "text": "Envío disponible" },
    "action": {
      "catalog_id": "1234567890",
      "sections": [
        {
          "title": "Entradas",
          "product_items": [
            { "product_retailer_id": "SKU-001" },
            { "product_retailer_id": "SKU-002" }
          ]
        },
        {
          "title": "Platos fuertes",
          "product_items": [
            { "product_retailer_id": "SKU-101" },
            { "product_retailer_id": "SKU-102" },
            { "product_retailer_id": "SKU-103" }
          ]
        }
      ]
    }
  }
}
```
