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

# Menu Products

> Read published restaurant products with filters, pagination, modifiers, and CMS data.

Use the menu products API to render product lists outside Plato.

```text theme={null}
GET /api/public/menu/products
```

This endpoint currently expects the API key in the query string.

## Example

```bash theme={null}
curl "https://api.plato.ae/api/public/menu/products?apiKey=$PLATO_API_KEY&limit=20&page=1"
```

## Query Parameters

| Parameter        | Type       | Default     | Notes                                                   |
| ---------------- | ---------- | ----------- | ------------------------------------------------------- |
| `apiKey`         | string     | required    | Plato API key.                                          |
| `search`         | string     | none        | Search product names.                                   |
| `q`              | string     | none        | Alternative search parameter.                           |
| `categoryId`     | string     | none        | Filter by category id.                                  |
| `categorySlug`   | string     | none        | Filter by one category slug.                            |
| `categorySlugs`  | comma list | none        | Filter by multiple category slugs.                      |
| `published`      | boolean    | `true`      | Use `false` to fetch unpublished products when allowed. |
| `soldout`        | boolean    | none        | Filter sold-out state.                                  |
| `minPrice`       | number     | none        | Filter by price options.                                |
| `maxPrice`       | number     | none        | Filter by price options.                                |
| `slug`           | string     | none        | Fetch by exact product slug.                            |
| `ids`            | comma list | none        | Fetch specific product ids.                             |
| `sortBy`         | string     | `createdAt` | `name`, `createdAt`, `updatedAt`, or `slug`.            |
| `sortOrder`      | string     | `desc`      | `asc` or `desc`.                                        |
| `page`           | number     | `1`         | Page number.                                            |
| `limit`          | number     | `20`        | Minimum `1`, maximum `100`.                             |
| `includeCmsData` | boolean    | `true`      | Include CMS entries related to products.                |

## Response

```json theme={null}
{
  "data": [
    {
      "id": "product_123",
      "slug": "classic-burger",
      "barcode": null,
      "name": {
        "en": "Classic Burger"
      },
      "intro": null,
      "description": null,
      "priceOptions": [
        {
          "id": "regular",
          "price": 38
        }
      ],
      "thumbnail": null,
      "images": [],
      "published": true,
      "soldout": false,
      "preparationTime": null,
      "nutritionFacts": null,
      "suggestions": [],
      "category": {
        "id": "category_123",
        "slug": "burgers",
        "name": {
          "en": "Burgers"
        }
      },
      "optionSets": [],
      "cmsData": {},
      "createdAt": "2026-06-17T08:20:00.000Z",
      "updatedAt": "2026-06-17T09:15:00.000Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 42,
    "totalPages": 3,
    "hasMore": true
  }
}
```

## CMS Data

When `includeCmsData=true`, Plato looks for CMS entries related to `MenuProduct`.

The `cmsData` object is grouped by CMS database identifier:

```json theme={null}
{
  "cmsData": {
    "product_badges": [
      {
        "id": "entry_123",
        "label": {
          "en": "Popular"
        }
      }
    ]
  }
}
```

Set `includeCmsData=false` when you only need the core product fields.

## Notes

* Products default to `published=true`.
* Price filtering is applied against product price options.
* Use `slug` for product detail pages.
* Use `ids` when another system already knows the product ids.
