---
title: "Create curation product"
method: POST
path: "/v3/products"
tags: ["Labeling Curation"]
---

# Create curation product

`POST /v3/products`

Creates a chain-scoped product. Platform administrators may create for any entity; entity admins and editors may create only for their own entity. `entityId` becomes immutable and `governanceMode` is server-derived.

## Request body

- CurationProductRequest
  - `id` string, required
  - `chainId` integer, required
  - `entityId` string, required
  - `coBrandEntityIds` string[] — Platform-managed co-branding only. Entity members cannot set this field.
  - `name` string, required
  - `logo` string, nullable
  - `description` string, nullable
  - `url` string, nullable
  - `portfolioNotice` string, nullable
  - `isDeprecated` boolean
  - `deprecationReason` string, nullable

## Response `201`

Product created.

- 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
- `409` — Conflict
- `422` — Validation error

---

[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)
