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

# Get Products

> GET /api/enrichment/products

<Info>**`GET /api/enrichment/products`** · Scope: `catalog:read`</Info>

Paginated export of **active** products, sorted by ascending `id`. See the
[guide](/enrichment/fetching-products#paginated-export).

## Query parameters

<ParamField query="page" type="integer" default="0">Zero-based page index.</ParamField>
<ParamField query="pageSize" type="integer" default="100">Items per page, clamped to **1–500**.</ParamField>

<ParamField query="modifiedSince" type="string">
  Optional incremental filter. Epoch millis, ISO-8601 instant (`2026-06-01T00:00:00Z`), or local
  date-time (`2026-06-01T00:00:00`). Returns only products updated after this moment.
</ParamField>

## Request

```bash theme={null}
curl "https://api.verzla.com/api/enrichment/products?page=0&pageSize=250&modifiedSince=2026-06-01T00:00:00Z" \
  -H "X-Api-Client-Key: sk_live_your_key_here"
```

## Response `200`

<ResponseField name="items" type="object[]">Products on this page (see shape below).</ResponseField>
<ResponseField name="page" type="number">Current zero-based page index.</ResponseField>
<ResponseField name="pageSize" type="number">Page size actually used (post-clamp).</ResponseField>
<ResponseField name="totalElements" type="number">Total matching products across all pages.</ResponseField>
<ResponseField name="totalPages" type="number">Total number of pages.</ResponseField>

### Product shape (`items[]`)

<ResponseField name="id" type="number">Internal product id. Identity — read-only.</ResponseField>
<ResponseField name="sku" type="string">Stock keeping unit. Identity — read-only.</ResponseField>
<ResponseField name="externalId" type="string">External/ERP id. Identity — read-only.</ResponseField>
<ResponseField name="gtin" type="string">Global trade item number. Read-only.</ResponseField>
<ResponseField name="name" type="string">Product name. **Enrichable.**</ResponseField>
<ResponseField name="slug" type="string">URL slug. **Enrichable.**</ResponseField>
<ResponseField name="description" type="string">Long-form description. **Enrichable.**</ResponseField>
<ResponseField name="attributeTemplateId" type="number">Template this product is bound to.</ResponseField>

<ResponseField name="attributes" type="object[]">
  Current attributes. **Enrichable.** Attributes with an empty value are omitted.

  <Expandable title="attribute">
    <ResponseField name="attribute" type="string">Attribute name.</ResponseField>
    <ResponseField name="detail" type="string">Attribute value.</ResponseField>

    <ResponseField name="option" type="object | null">
      Link to a template option, or `null` for free-form. Fields: `optionId`, `unit`, `priority`,
      `dataType`, `showOnWebsite`.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="brand" type="object">Read-only context: `{ id, name, website, slug }`.</ResponseField>
<ResponseField name="categories" type="string[]">Read-only category names.</ResponseField>
<ResponseField name="images" type="string[]">Read-only image URLs.</ResponseField>
<ResponseField name="files" type="string[]">Document references. **Enrichable.**</ResponseField>

<ResponseField name="variantAttributes" type="string[] | null">
  Read-only. On a **master** product, the attribute names that differentiate its variants. `null` on
  variants and standalone products.
</ResponseField>

<ResponseField name="variants" type="object[] | null">
  Read-only. On a **master** product, its sibling variants (the master itself is not included).
  `null` on variants and standalone products.

  <Expandable title="variant">
    <ResponseField name="id" type="number">Internal product id of the variant.</ResponseField>
    <ResponseField name="sku" type="string">Variant SKU.</ResponseField>
    <ResponseField name="name" type="string">Variant name.</ResponseField>

    <ResponseField name="attributes" type="object[]">
      The variant's attributes, same shape as the product `attributes` above. Empty-valued attributes
      are omitted.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="variantMaster" type="string | null">
  Read-only. On a **variant** product, the SKU of its family's master product. `null` on the master
  and on standalone products.
</ResponseField>

```json theme={null}
{
  "items": [
    {
      "id": 90210,
      "sku": "ABC-123",
      "externalId": "erp-55021",
      "gtin": "5012345678900",
      "name": "Cordless Impact Driver",
      "slug": "cordless-impact-driver",
      "description": "An 18V brushless impact driver...",
      "attributeTemplateId": 41,
      "attributes": [
        { "attribute": "Voltage", "detail": "18", "option": { "optionId": 880, "unit": "V", "priority": 1, "dataType": "NUMBER", "showOnWebsite": true } }
      ],
      "brand": { "id": 12, "name": "Acme Tools", "website": "https://acme.example", "slug": "acme-tools" },
      "categories": ["Power Tools", "Drivers"],
      "images": ["https://cdn.verzla.com/p/abc-123/1.jpg"],
      "files": ["https://cdn.verzla.com/p/abc-123/manual.pdf"],
      "variantAttributes": ["Voltage"],
      "variants": [
        { "id": 90211, "sku": "ABC-124", "name": "Cordless Impact Driver 12V", "attributes": [ { "attribute": "Voltage", "detail": "12", "option": null } ] }
      ],
      "variantMaster": null
    }
  ],
  "page": 0,
  "pageSize": 250,
  "totalElements": 4820,
  "totalPages": 20
}
```

## Errors

| Status | When                                                         |
| ------ | ------------------------------------------------------------ |
| `400`  | Invalid `modifiedSince` value (not epoch millis or ISO-8601) |
| `401`  | Missing or invalid API key                                   |
| `403`  | Key lacks `catalog:read`                                     |
