> ## 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.

# The Enrichment Pipeline

> How a third-party enrichment integration reads, generates, submits, and gets reviewed.

The enrichment pipeline is a four-stage loop. You run it on whatever cadence makes sense — a nightly
batch, a continuous stream, or an on-demand run for a handful of SKUs.

<Steps>
  <Step title="Authenticate" icon="key">
    Every request carries your `X-Api-Client-Key` header. Your key is bound to a single merchant
    organization and a set of [scopes](/authentication/making-requests#scopes). No key, no access.
  </Step>

  <Step title="Read the schema" icon="table-list">
    Fetch the merchant's [attribute templates](/enrichment/attribute-templates). These describe the
    attributes the merchant cares about — names, units, data types, and priority — so your model
    enriches against a known schema instead of inventing fields.
  </Step>

  <Step title="Read the catalog" icon="boxes-stacked">
    Pull products to enrich — either a [paginated export](/enrichment/fetching-products#paginated-export)
    of the whole catalog or a [targeted SKU lookup](/enrichment/fetching-products#fetch-by-sku). Each
    product carries identity, the current enrichable fields, and read-only context (brand, categories,
    images).
  </Step>

  <Step title="Generate & submit proposals" icon="wand-magic-sparkles">
    Run your model, then [submit](/enrichment/submitting-proposals) the enriched fields. Each item
    carries a `confidence` score so reviewers can sort the easy wins first. Every accepted item
    becomes a **pending revision** — never a live change.
  </Step>
</Steps>

## The data flow

```mermaid theme={null}
sequenceDiagram
    participant P as Your Service
    participant V as Verzla Enrichment API
    participant R as Merchant Reviewer

    P->>V: GET /attribute-templates (catalog:read)
    V-->>P: Template options (schema)
    P->>V: GET /products (catalog:read)
    V-->>P: Paginated products
    Note over P: Generate enrichments with your model
    P->>V: POST /products/submissions (catalog:submit)
    V-->>P: Per-item result (CREATED / UNMATCHED / REJECTED_FIELDS)
    Note over V,R: Proposals queue as pending revisions
    R->>V: Accept / reject revisions
    P->>V: GET /acceptance-rate (catalog:read)
    V-->>P: Your acceptance metrics
```

## What "enrichment" means here

Each product exposes a small set of **enrichable** fields that your proposals may change, plus
**read-only context** you should use as input but cannot modify.

| Field                                            | Enrichable? | Notes                                                                              |
| ------------------------------------------------ | ----------- | ---------------------------------------------------------------------------------- |
| `name`                                           | ✅           | Product display name                                                               |
| `slug`                                           | ✅           | URL slug                                                                           |
| `description`                                    | ✅           | Long-form description                                                              |
| `attributes`                                     | ✅           | Structured attributes, ideally aligned to templates                                |
| `files`                                          | ✅           | Associated document references                                                     |
| `sku`, `externalId`, `gtin`, `id`                | ❌           | Identity — used to match your submission back to a product                         |
| `brand`, `categories`, `images`                  | ❌           | Read-only context to inform your model                                             |
| `variantAttributes`, `variants`, `variantMaster` | ❌           | Read-only [variant family](/enrichment/fetching-products#product-variants) context |

<Info>
  Any non-enrichable or empty field in a submission item is silently ignored and reported back in
  the `ignoredFields` array of the result. See [Submitting proposals](/enrichment/submitting-proposals).
</Info>

## Guardrails

The API enforces a few hard limits so a runaway job can't overwhelm the catalog:

| Limit                    | Value | Endpoint                     |
| ------------------------ | ----- | ---------------------------- |
| Max page size            | 500   | `GET /products`              |
| Max SKUs per lookup      | 50    | `GET /products/skus`         |
| Max items per submission | 1000  | `POST /products/submissions` |

Stay within these and design your batching around them — see each endpoint's reference page for the
exact error responses when you exceed them.
