Products
A Product is a sellable item in your catalog. Each product can carry channel-, country- and time-aware pricing through its variants, and can be assigned to collections and categories. Products are the parent of Variants and own a set of Options that define their variant matrix.
The Product object
Section titled “The Product object”| Property | Type | Required | Description |
|---|---|---|---|
category | string | Category | null | - | The category to which this product belongs. Serialized as IRI string by default; pass ?expand=category to embed the full CategoryResource. Requires the categories:read scope. Returned null when the scope is missing. |
channels | array | - | A list of Channel, each one representing a channel associated with the product. Serialized as IRI strings by default; pass ?expand=channels to embed full ChannelResource objects. Requires the channels:read scope. Returned empty when the scope is missing. |
collections | array | - | A list of Collection, each one representing a collection associated with the product. Serialized as IRI strings by default; pass ?expand=collections to embed full CollectionResource objects. Requires the collections:read scope. Returned empty when the scope is missing. |
createdAt | string | - | The date and time when the resource was created (ISO 8601 format). |
description | string | null | - | This property supports translations. A description of the product. |
id | string | - | Stable UUID of the product. |
medias | array | - | A list of Media, ordered by position. Only media of type "image" can be associated with a product. Returned as IRI strings by default; pass ?expand=medias to embed full Media objects. Requires the medias:read scope. Returned empty when the scope is missing. |
metafields | array | - | Metafields owned by this product. Serialized as IRI strings by default; pass ?expand=metafields to embed full MetafieldResource objects. Requires the metafields:read scope. Returned empty when the scope is missing. |
options | array | - | A list of Product Option, each one representing an option associated with the product. Serialized as IRI strings by default; pass ?expand=options to embed the full Product Option objects. Requires the products:read scope. Returned empty when the scope is missing. |
status | "/api/statuses/DRAFT" | "/api/statuses/ACTIVE" | "/api/statuses/ARCHIVED" | - | The status of the product. |
tags | string | null | - | A string of comma-separated tags. |
title | string | null | - | This property supports translations. The name of the product. |
updatedAt | string | - | The date and time when the resource was last modified (ISO 8601 format). |
variants | array | - | A list of Variant, each one representing a variant associated with the product. Serialized as IRI strings by default; pass ?expand=variants to embed the full Variant objects (including resolvedPrice, lowestPriceLast30Days, medias, and metafields when composed with ?expand=metafields). Requires the products:read scope. Returned empty when the scope is missing. |
Common workflows
Section titled “Common workflows”- Sync a catalog from your ERP. Use
POST /api/productsto create products in bulk, then patch them as inventory shifts. TheupdatedAt[after]filter onGET /api/productslets you poll only the products that changed since your last sync. - Surface prices for a specific channel. Pass
resolveContext[channel],resolveContext[country]andresolveContext[at]toGET /api/productsso each variant’sresolvedPricereflects what a buyer in that channel and country would see at that moment. - Take a product down without losing its history.
DELETE /api/products/{id}removes the product from active channels but preserves its audit trail.
Conventions
Section titled “Conventions”These conventions apply to every endpoint on this resource.
Authentication and headers
Section titled “Authentication and headers”All requests require an OAuth 2.0 bearer token:
Authorization: Bearer <token>For localized fields, set the active locale:
Flowkiwi-Locale: fr-FRResolve context
Section titled “Resolve context”Three query parameters control how prices and channel-specific fields are computed on read endpoints:
resolveContext[channel]- channel identifierresolveContext[country]- ISO 3166-1 alpha-2 country coderesolveContext[at]- ISO 8601 UTC timestamp
All three must be set together, or none. When set, embedded variants gain a resolvedPrice field.
Pagination
Section titled “Pagination”List endpoints accept page (1-based) and itemsPerPage. Defaults follow the standard Hydra collection contract.
Partial updates
Section titled “Partial updates”PATCH uses JSON Merge Patch with Content-Type: application/merge-patch+json. To clear a field, pass null; to leave it untouched, omit it.