---
title: "Update Catalog Mapping"
method: PUT
path: "/supplier_provider/{supplier_provider_uid}/catalog_map"
---

# Update Catalog Mapping

`PUT /supplier_provider/{supplier_provider_uid}/catalog_map`

## Request

- Base URL: `https://dc-region.zuperpro.com/api`
- URL: `https://dc-region.zuperpro.com/api/supplier_provider/{supplier_provider_uid}/catalog_map`
- Auth: API key in header `x-api-key`

Updates existing catalog rows of one saved branch (`vendor_uid`), identified by `vendor_catalog_uid`: you can change the linked Zuper or supplier option, SKU, unit of measure, cost and remarks. Each row's cost is refreshed from the supplier's price for that branch when one is returned (not for a branch that does not stock the item); otherwise the `vendor_cost` you send is stored. Zuper may reuse a supplier price answer for up to 15 minutes, so a price can be that old. When a row's option mapping changes, rows at the provider's other branches that used the old supplier option are re-linked in the same request (`mapping_changes`, `affected_vendors`); when its unit changes, the product's rows at other branches are re-priced in the new unit in the background (`uom_propagation`). All rows are saved together or not at all, and only one update per branch can run at a time (429 otherwise). Instead of an option UID, an entry can name the Zuper option in `zuper_product_option_name`: Zuper reuses the product option with that name or creates it, and reports the outcome in `data.zuper_option_resolutions`. Options created this way are kept even if the rest of the update then fails. Admin only: the API key must belong to an admin user; other roles receive 405 Access Denied.

## Path parameters

- `supplier_provider_uid` string, required

## Request body

- object
  - `vendor_uid` string, required: Required. UID of the saved branch (Zuper vendor) of this supplier provider whose rows are being updated.
  - `vendor_catalog` object[], required: Required. One entry per row to update. Every field is written, so send the full row, not just the changed fields.
    - `vendor_catalog_uid` string, required: Required. The catalog row to update. It must belong to the branch in `vendor_uid`; use a `catalog_uids` value from Create Catalog Mapping or the branch's vendor catalog. Each row may appear only once.
    - `zuper_product_uid` string, required: Required. The Zuper product the row is linked to.
    - `zuper_product_option_uid` string, nullable: The Zuper product option (`option_uid`) this row stands for. Required when the Zuper product has options, unless you send `zuper_product_option_name` instead; omit or send `null` only for a product without options. The same Zuper option may appear only once per request.
    - `zuper_product_option_name` string, nullable: Name of the Zuper product option this row stands for, used instead of `zuper_product_option_uid`. Zuper reuses the product option with this name (matched ignoring case and extra spaces; disabled options count) or creates it when none exists, labelling a product without options "Option" and using the supplier variant image. Ignored when `zuper_product_option_uid` is sent. Must not be blank or "N/A"; a product can hold at most 50 options.
    - `supplier_product_uid` string, required: Required. The supplier product, from Get Supplier Products. It must be stocked at one or more of your saved branches for this provider. For ABC Supply cut-to-length (dimensional) items, each length is a separate supplier product.
    - `supplier_product_option_uid` string, required: Required. The `option_uid` of one of the supplier product's `supplier_product_variants`.
    - `vendor_sku` string, required: Required. Must equal the `variant_code` of the selected supplier variant (the supplier's item number).
    - `vendor_uom` string, required: Required. Must exactly match one of the supplier product's `uoms[].code` values. Changing it re-prices this product's rows at the provider's other branches in the new unit, in the background; rows the supplier cannot price in that unit are left unchanged.
    - `vendor_cost` number, required: Required. 0 or more; a numeric string such as `"38.50"` is also accepted. Stored only when the supplier returns no price for this branch, or the branch does not stock the item; otherwise the supplier's price is saved.
    - `remarks` string: Optional note stored on the row. Omitting it clears any existing note.

## Response `200`

200

- object
  - `type` 'success'
  - `title` string
  - `message` string
  - `count` integer: Rows updated for the branch in `vendor_uid`.
  - `mapping_changes` integer: Number of entries whose new option mapping was also applied to rows at other branches.
  - `affected_vendors` object[]: Other branches whose rows were re-linked by this request.
    - `vendor_uid` string
    - `catalogs_updated` integer
  - `uom_propagation` object: Present only when a unit change was queued for other branches.
    - `branches` integer: Other branches whose rows will be re-priced.
    - `products` integer: Supplier products whose unit changed.
  - `data` object: How each row that sent `zuper_product_option_name` was resolved; empty when no row sent one.
    - `zuper_option_resolutions` object[]
      - `zuper_product_uid` string
      - `supplier_product_option_uid` string
      - `option_uid` string: The Zuper option the row now uses.
      - `option_value` string
      - `is_available` boolean
      - `created` boolean: `true` when Zuper created the option for this request; `false` when an existing option matched the name.

## Other responses

- `400`: 400
- `403`: 403
- `404`: 404
- `405`: 405
- `409`: 409
- `429`: 429

## Changes

- **2026-11-03** `3c21bc232e16`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/zuper/apis/zuper-pro-api/changes/supplier_provider/:supplier_provider_uid/catalog_map/put.md)

---

[API](https://skmtc.dev/zuper/apis/zuper-pro-api.md) - [All operations](https://skmtc.dev/zuper/apis/zuper-pro-api/llms.txt) - [OpenAPI document](https://skmtc.dev/zuper/apis/zuper-pro-api/revisions/3c21bc232e16?raw)
