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

# List Products

> Retrieve a list of products

# List Products

Returns a paginated list of products in the store.

## Request

```bash theme={null}
curl -X GET "https://api.launchmystore.io/api/v1/products.json" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
```

## Parameters

<ParamField query="page" type="integer" default="1">
  Page number for pagination
</ParamField>

<ParamField query="limit" type="integer" default="50">
  Number of items per page
</ParamField>

<ParamField query="status" type="string">
  Filter by status: `active`, `draft`, `archived`
</ParamField>

<ParamField query="handle" type="string">
  Filter by exact product handle
</ParamField>

<ParamField query="ids" type="string">
  Filter by a comma-separated list of product IDs
</ParamField>

<ParamField query="title" type="string">
  Filter by product title (case-insensitive partial match)
</ParamField>

## Response

Returns the products as a bare array under the `products` key. Money
fields are returned as decimal strings and IDs are numeric.

Pagination is communicated through the RFC 5988 `Link` response header,
which carries `rel="next"` and `rel="previous"` URLs when further pages
exist (e.g. `<https://api.launchmystore.io/api/v1/products.json?limit=50&page=2>; rel="next"`).
The header `X-LMS-Api-Version` advertises the contract version.

<ResponseField name="products" type="array">
  Array of product objects

  <Expandable title="Product Object">
    <ResponseField name="id" type="integer">
      Numeric product ID
    </ResponseField>

    <ResponseField name="title" type="string">
      Product title
    </ResponseField>

    <ResponseField name="handle" type="string">
      URL-safe product handle
    </ResponseField>

    <ResponseField name="body_html" type="string">
      Product description (HTML)
    </ResponseField>

    <ResponseField name="vendor" type="string">
      Product vendor
    </ResponseField>

    <ResponseField name="product_type" type="string">
      Product type/category
    </ResponseField>

    <ResponseField name="published_scope" type="string">
      Publication scope. Always `global`. (The product body does not
      return a `status` field — see [Get Product](/api-reference/products/get).
      You can still filter the list by `status`.)
    </ResponseField>

    <ResponseField name="variants" type="array">
      Array of product variants
    </ResponseField>

    <ResponseField name="images" type="array">
      Array of product images
    </ResponseField>

    <ResponseField name="created_at" type="string">
      Creation timestamp (ISO 8601)
    </ResponseField>

    <ResponseField name="updated_at" type="string">
      Last update timestamp (ISO 8601)
    </ResponseField>
  </Expandable>
</ResponseField>

## Example Response

```json theme={null}
{
  "products": [
    {
      "id": 482910,
      "title": "Classic T-Shirt",
      "handle": "classic-t-shirt",
      "body_html": "<p>A comfortable cotton t-shirt.</p>",
      "vendor": "MyBrand",
      "product_type": "Apparel",
      "published_scope": "global",
      "variants": [
        {
          "id": 731204,
          "title": "Small / Black",
          "price": "25.00",
          "sku": "TSHIRT-S-BLK",
          "inventory_quantity": 50,
          "position": 1
        }
      ],
      "images": [
        {
          "id": 1,
          "src": "https://cdn.launchmystore.io/images/tshirt.jpg",
          "position": 1
        }
      ],
      "created_at": "2024-01-15T10:30:00.000Z",
      "updated_at": "2024-01-20T14:45:00.000Z"
    }
  ]
}
```
