---
title: "Update curation product"
method: PATCH
path: "/v3/products/{chainId}/{id}"
tags: ["Labeling Curation"]
---

# Update curation product

`PATCH /v3/products/{chainId}/{id}`

Platform administrators may update any product. Entity admins and editors may update products owned by their entity when the current vault set is governed or empty; governance is reverified before the write. Entity members cannot change `entityId` or `governanceMode`, and cannot update an ungoverned product after creation.

## Path parameters

- `chainId` integer, required
- `id` string, required

## Request body

- CurationProductUpdateRequest
  - `coBrandEntityIds` string[] — Platform-managed co-branding only. Entity members cannot change this field.
  - `name` string
  - `logo` string, nullable
  - `description` string, nullable
  - `url` string, nullable
  - `portfolioNotice` string, nullable
  - `isDeprecated` boolean
  - `deprecationReason` string, nullable

## Response `200`

Updated product.

- object
  - `data` CurationProduct, required
    - `id` string, required
    - `chainId` integer, required
    - `entityId` string, required
    - `coBrandEntityIds` string[], required — Additional entities whose logos should be displayed. Product management remains exclusively with entityId.
    - `name` string, required
    - `logo` string, nullable
    - `description` string, nullable
    - `url` string, nullable
    - `portfolioNotice` string, nullable
    - `isDeprecated` boolean, required
    - `deprecationReason` string, nullable
    - `governanceMode` 'governed' | 'ungoverned' | 'unknown', required — Server-derived from the current governance state of member vaults. Empty products are unknown.
    - `resolved` ResolvedProductLabels, required — Read-time entity fallbacks for display. Derived, never stored.
      - `entityName` string, nullable, required
      - `url` string, nullable, required — Product url, falling back to the owning entity url.
      - `logo` string, nullable, required — Product logo, falling back to the owning entity logo.
    - `anyExplorableLend` boolean, required — True when at least one member vault is lend-discoverable per the materialized visibility verdicts. Live chain state (e.g. borrowability) is deliberately excluded.
    - `anyExplorableBorrow` boolean, required — True when at least one member vault is borrow-discoverable per the materialized visibility verdicts. Live chain state (e.g. borrowability) is deliberately excluded.
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
  - `meta` PaginationMeta, required
    - `total` integer — Exact total count when the endpoint provides one.
    - `hasMore` boolean — Indicates whether another page exists beyond the current page.
    - `offset` integer
    - `limit` integer — Echoed page size after endpoint-side clamping.
    - `timestamp` string, date-time, required
    - `chainId` string — Comma-separated chain IDs for multi-chain responses.
    - `degradedProviders` string[] — Live providers whose data is incomplete in this response.

## Other responses

- `400` — Bad request
- `401` — Unauthorized
- `403` — Forbidden
- `404` — Not found
- `409` — Current vault membership mixes governed and ungoverned vaults or contains a vault type that cannot belong to a product.
- `422` — Validation error
- `503` — Current vault governance could not be verified.

---

[API](https://skmtc.dev/euler/apis/euler-data-api-v3.md) · [All operations](https://skmtc.dev/euler/apis/euler-data-api-v3/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/euler/euler-data-api-v3/revisions/9573a5fbd4a6/schema)
