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

# Catalog and products

> Connect a Meta catalog, set up the shop on your number, and send product messages, carousels and catalog links.

Product and catalog interactive messages use a Meta Commerce catalog you already manage in Meta. `GET /v1/catalog/products` reads Meta directly. `POST /v1/catalog/sync` copies the catalog into a local cache that lasts one hour. `commerce.catalog_sync` is on by default and can be turned off per connection.

> [!NOTE]
>
> Catalog is on the Growth and Pro plans. On a smaller plan you cannot add or change products, or send product messages from the inbox. Test mode is never limited. See [Plans and limits](https://docs.lazyapp.in/billing/pricing-and-tiers.md#feature-gating).

## Shop settings

A WhatsApp shop starts with a catalog in Meta Commerce Manager. Connect the catalog to your number and choose what contacts see. Then add products in LazyApp under **Products** or with `POST /v1/catalog/items` (see [Manage products](https://docs.lazyapp.in/sending/catalog-inventory.md)), or keep using Commerce Manager, a data feed or your store platform.

In the console, open **Phone numbers → your number → Advanced → Shop**. Over the API:

```bash theme={null}
curl -X PATCH "https://lazyapp.in/v1/connections/{connection}/commerce" \
  -H "Authorization: Bearer $LAZYAPP_API_KEY" \
  -H "Idempotency-Key: shop-setup-1" \
  -H "Content-Type: application/json" \
  -d '{
    "catalog_id": "1234567890",
    "is_catalog_visible": true,
    "is_cart_enabled": true
  }'
```

**Scope:** `messages:send`. `GET /v1/connections/{connection}/commerce` reads the same settings with `messages:read`.

| Field | Does |
| - | - |
| `catalog_id` | Connects this Meta catalog to the WhatsApp account and saves it on every number of that account. Send `null` to forget it in LazyApp. Meta has no API to disconnect a catalog, so do that in Commerce Manager |
| `is_catalog_visible` | Shows the shop icon in the chat header and the catalog on your business profile. Off by default |
| `is_cart_enabled` | Lets contacts add products to a cart and send it to you as an order. On by default |
| `order_handoff_url` | An `https://` address LazyApp posts every incoming order to, as well as the `message.received` webhook |

The response:

```json theme={null}
{
  "catalog_id": "1234567890",
  "connected_catalogs": [{ "id": "1234567890", "name": "Acme shop" }],
  "is_catalog_visible": true,
  "is_cart_enabled": true,
  "order_handoff_url": null,
  "catalog_link": "https://wa.me/c/919812345670"
}
```

`catalog_link` opens your catalog in WhatsApp. Share it anywhere, or send it as a [catalog link](#catalog-links). Product sends still accept `catalog_id` in the interactive payload; the saved value is the default for the inbox and for `GET /v1/catalog/products`.

## List products

```bash theme={null}
curl "https://lazyapp.in/v1/catalog/products" \
  -H "Authorization: Bearer $LAZYAPP_API_KEY"
```

Optional query params: `connection_uuid`, `phone_number_id`, `limit`, `cursor`.

**Required scope:** `messages:read`

The connection must have `catalog_id` set. LazyApp proxies Meta's catalog products and returns:

```json theme={null}
{
  "catalog_id": "1234567890",
  "data": [
    {
      "id": "prod-1",
      "retailer_id": "sku-tee",
      "name": "T-Shirt",
      "description": "Cotton tee",
      "price": "499 INR",
      "image_url": "https://cdn.acme.example/tee.jpg",
      "availability": "in stock"
    }
  ],
  "next_cursor": null
}
```

## Sync products

```bash theme={null}
curl -X POST "https://lazyapp.in/v1/catalog/sync" \
  -H "Authorization: Bearer $LAZYAPP_API_KEY" \
  -H "Idempotency-Key: catalog-sync-1"
```

**Required scope:** `messages:send`

The response includes `catalog_id`, `synced` (how many products were cached), `synced_at`, and `products` in the same shape as the list above. The cache lasts one hour. If `commerce.catalog_sync` is off, the call returns `422`.

## Send product interactive messages

Use `POST /v1/messages` with `type: interactive`. Check `messages.product` / `messages.product_list` / `messages.catalog` on [capabilities](https://docs.lazyapp.in/concepts/capabilities.md) first.

```json Product theme={null}
{
  "type": "interactive",
  "to": "+919812345670",
  "interactive": {
    "type": "product",
    "body": { "text": "This one is in stock." },
    "action": {
      "catalog_id": "1234567890",
      "product_retailer_id": "sku-tee"
    }
  }
}
```

```json Multi-product theme={null}
{
  "type": "interactive",
  "to": "+919812345670",
  "interactive": {
    "type": "product_list",
    "header": { "type": "text", "text": "Featured" },
    "body": { "text": "Pick a product." },
    "action": {
      "catalog_id": "1234567890",
      "sections": [
        {
          "title": "Tops",
          "product_items": [
            { "product_retailer_id": "sku-tee" },
            { "product_retailer_id": "sku-hoodie" }
          ]
        }
      ]
    }
  }
}
```

```json Full catalog theme={null}
{
  "type": "interactive",
  "to": "+919812345670",
  "interactive": {
    "type": "catalog_message",
    "body": { "text": "Browse the shop." },
    "action": {
      "name": "catalog_message",
      "parameters": {
        "thumbnail_product_retailer_id": "sku-tee"
      }
    }
  }
}
```

`catalog_message` opens the catalog linked to the WABA on Meta. The optional thumbnail is a product retailer id, not the catalog id.

## Product carousels

A product carousel shows products as cards the contact swipes through. Check `messages.carousel` on [capabilities](https://docs.lazyapp.in/concepts/capabilities.md).

```json theme={null}
{
  "type": "interactive",
  "to": "+919812345670",
  "interactive": {
    "type": "carousel",
    "body": { "text": "Our bestsellers this week." },
    "action": {
      "cards": [
        { "card_index": 0, "type": "product", "action": { "product_retailer_id": "sku-tee", "catalog_id": "1234567890" } },
        { "card_index": 1, "type": "product", "action": { "product_retailer_id": "sku-hoodie", "catalog_id": "1234567890" } }
      ]
    }
  }
}
```

In the inbox, choose **Product carousel** as the interactive message type.

## Templates with products

Outside the 24-hour window, products go in [templates](https://docs.lazyapp.in/sending/templates.md). Create them with these buttons, then fill in the products when you send through `template.features`:

| Template | Button | At send time |
| - | - | - |
| Catalog | `CATALOG` (no header) | Optional `thumbnail_product_retailer_id` |
| Multi-product | `MPM` (text header) | `thumbnail_product_retailer_id` and `sections` |
| Single product | `SPM` (`PRODUCT` header) | `product_retailer_id` |
| Product card carousel | Cards with a `PRODUCT` header and one `SPM` or URL button | `cards`: one `{ "product_retailer_id": … }` per card, 1 to 10 |

In the template builder, a product card carousel is a carousel with **Product** as the card type. LazyApp builds each card from the number's catalog; pass `catalog_id` on a card to use another one. See [Template formats](https://docs.lazyapp.in/sending/template-formats.md#sending-these-formats) for every card field.

```json theme={null}
{
  "to": "+919812345670",
  "type": "template",
  "template": {
    "name": "weekly_picks",
    "language": "en",
    "features": {
      "cards": [
        { "product_retailer_id": "sku-tee" },
        { "product_retailer_id": "sku-hoodie" },
        { "product_retailer_id": "sku-cap" }
      ]
    }
  }
}
```

## Catalog links

`catalog_link` from the shop settings is a plain `https://wa.me/c/…` link. Send it in any text message, or put it in a template URL button. When the contact taps it, WhatsApp opens your catalog.

## Inbound orders

When a contact submits a WhatsApp cart, LazyApp stores an inbound message with `type` `order`. The structured cart is on `content.order`:

```json theme={null}
{
  "order": {
    "catalog_id": "1234567890",
    "text": null,
    "product_items": [
      { "product_retailer_id": "sku-tee", "quantity": 2 }
    ]
  }
}
```

That `content` object is included on `message.received` [webhooks](https://docs.lazyapp.in/webhooks/events.md). If you set `order_handoff_url`, LazyApp also posts `{ "type": "commerce.order", "order": …, "connection": … }` to it.

To take payment for a cart, send a [payment request](https://docs.lazyapp.in/guides/payments-india.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.