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

# List products

> List enriched product records, including custom columns added at import time.

Returns the product catalog visible to your API key. Each record includes canonical product fields plus a `custom` map of any custom columns that were added when products were imported.

This is the read-side counterpart of [Bulk upsert products](/api-reference/products/bulk-upsert). Use it for ERP / BI ingestion where you need the current enriched state of the catalog.

## Authentication

Bearer token. See [Authentication](/api-reference/authentication).

## Query parameters

| Name            | Type                   | Required | Description                                               |
| :-------------- | :--------------------- | :------- | :-------------------------------------------------------- |
| `limit`         | integer                | No       | Page size, default `100`, max `1000`.                     |
| `cursor`        | string                 | No       | Opaque pagination cursor returned by a previous response. |
| `product_id`    | string                 | No       | Filter to a single canonical product ID.                  |
| `sku`           | string                 | No       | Filter to a single SKU.                                   |
| `updated_after` | string (ISO-8601, UTC) | No       | Only return products updated at or after this timestamp.  |

## Response

```json theme={null}
{
  "data": [
    {
      "product_id": "SKU-12345",
      "sku": "SKU-12345",
      "name": "Whole Milk 1L",
      "brand": "Arla",
      "category": "Dairy",
      "price": "1.49",
      "unit_cost": "0.92",
      "image_url": "https://cdn.example.com/sku-12345.jpg",
      "product_url": "https://www.example.com/products/sku-12345",
      "created_at": "2026-01-04T11:08:00Z",
      "updated_at": "2026-05-21T08:14:21Z",
      "custom": {
        "role": "KVI",
        "buyer": "E. Kirilov"
      }
    }
  ],
  "next_cursor": "eyJvZmZzZXQiOjEwMH0="
}
```

The `custom` map contains every custom column attached to the product during import - the keys are the column names you defined.

Numeric values are returned as strings - see [Conventions](/api-reference/conventions).

## Example request

```bash theme={null}
curl -s "https://clientapi.retailgrid.io/v1/products?updated_after=2026-05-01T00:00:00Z&limit=500" \
  -H "Authorization: Bearer rg_live_xxx"
```

## Related

* [Bulk upsert products](/api-reference/products/bulk-upsert)
* [Conventions](/api-reference/conventions)
* [Errors](/api-reference/errors)
