Models

Esta página solo está disponible en inglés.

The Product object

Every field of the Product object, with types, required flags and validation rules.

Product

FieldTypeDescription
idstringe.g. prod_66a1f09b2
objectstringalways product
titlestring · nullablee.g. Vintage denim jacket
descriptionstring · nullableThe product text (HTML allowed) that the dashboard shows and every channel publishes, unless a listing has its own text (listing overrides)
brandstring · nullable
categorystring · nullableSeller's own product category / collection label (free text; channel categories live on the listing)
short_descriptionstring · nullableDeprecated alias of description: always the same value. Read description
vat_ratenumber · nullableVAT percentage applied to this product, when set
mpnstring · nullableManufacturer part number
weightobjectProduct-level shipping weight
weight.valuestring · nullableDecimal number as a string
weight.unitstring · nullableone of: oz, lb, g, kg, null
dimensionsobjectPackage dimensions
dimensions.lengthstring · nullable
dimensions.widthstring · nullable
dimensions.heightstring · nullable
dimensions.unitstring · nullableone of: in, ft, yd, mm, cm, m, null
tagsarray of string
currencystringISO-4217; echo of the store base currency
statusProductStatusOne status per product, the first that applies in this order: archived (deleted or merged; out of lists unless asked for), to_verify ("Requires attention": an import in conflict, paused until resolved), ongoing (a publish or delist is running on at least one channel), error (at least one listing is in error), sold_out (every variant at quantity 0, on a channel or not), listed (on at least one channel: a listing that isn't delisted, even if some variants are at 0), ready (in Nembol only, not on any channel). So a product with one listed and one failed listing is error, and a sold-out listed product is sold_out. sync_status sums up the listings only: error if one is in error, pending if one is in progress, else ok. Per-channel detail is in listings[].status. New values may be added; tolerate unknowns. One of: ready, listed, archived, sold_out, error, ongoing, to_verify
requires_attentionRequiresAttentionWhy a to_verify product is paused ("Requires attention"): it was imported from a channel in conflict (possible duplicate, variants that don't match, a channel setting) instead of being discarded. Until resolved it isn't published, synced or linked. null for every other product
merged_intostring · nullableSet on a product absorbed by POST /products/merge (status archived): the product it became part of. An archived product with merged_into: null was deleted
sync_statusstringRollup of the listings' statuses. One of: ok, pending, error
imagesarray of Image
variantsarray of Variant
listingsarray of ListingSummaryRead-only summary; the canonical resource is GET /listings?product_id=
created_atstringISO 8601
updated_atstringISO 8601

Variant

FieldTypeDescription
idstringe.g. var_66a1f1
objectstringalways variant
skustring · nullablee.g. VDJ-M-001
titlestring · nullable
pricestring (money)Decimal string, 2 decimals. e.g. 19.90
msrpstring · nullableCompare-at / list price (decimal string, 2 decimals, like price), shown struck-through on channels that support it. null when not set. To remove it send "msrp": null (or "0.00") to PATCH /products/{id}/variants/{variant_id}. e.g. 24.90
quantityinteger
barcodestring · nullable
gramsnumber · nullableVariant weight in grams (used for shipping on supported channels)
asinstring · nullableAmazon ASIN, when attached
imagesarray of objectVariant-specific images, referencing the product's images
images[].image_idstringe.g. img_66a1f2
images[].urlstring · nullableuri
images[].positioninteger
optionsobjectOption name → value (e.g. {"Color": "Red", "Size": "M"})

Image

FieldTypeDescription
idstringe.g. img_ph1x8
objectstringalways image
urlstringNembol's own copy of the image. It keeps the real type: the name ends in .jpg, .png, .webp or .gif and the Content-Type matches (images stored before 2026-10-16 may say .png / image/png whatever their type). Uri
altstring · nullableAlt text of the image. Sent to Shopify, WooCommerce, Etsy, Wix, Squarespace and the Storefront; read back on import from them
positionintegerZero-based; equals array index

Request models

What you send when creating or updating. Fields not listed are ignored.

ProductCreate

FieldTypeRequiredDescription
titlestringrequiredmax 255 chars
descriptionstringoptionalThe product text (HTML allowed) every channel publishes. Wins over short_description when both are sent
brandstringoptional
tagsarray of stringoptional
imagesarray of ImageInputoptionalmax 20 items
variantsarray of VariantInputoptionalOmit for a single-variant product (top-level price/quantity/sku instead). When variants carry options, they must cover EVERY combination of the option values (dense matrix). Channels generate the full matrix, so sparse sets are rejected with 422. Variant titles are built automatically from the option values. Max 100 items
pricestring (money)optionalDecimal string, 2 decimals. e.g. 19.90
msrpstring (money)optionalDecimal string, 2 decimals. e.g. 19.90
quantityintegeroptionalmin 0
skustringoptionalThe single variant's SKU. Optional: without one a 10-character letters-and-digits SKU is generated (see VariantInput.sku)
gramsnumberoptionalmin 0
categorystringoptionalmax 255 chars
short_descriptionstringoptional · deprecatedDeprecated alias of description, used only when description is not sent
vat_ratenumberoptionalmin 0
mpnstringoptionalmax 70 chars
weightobjectoptional
weight.valuestringoptionalDecimal number as a string, e.g. "1.5"
weight.unitstringoptionalone of: oz, lb, g, kg
dimensionsobjectoptional
dimensions.lengthstringoptional
dimensions.widthstringoptional
dimensions.heightstringoptional
dimensions.unitstringoptionalone of: in, ft, yd, mm, cm, m

ProductUpdate

FieldTypeRequiredDescription
titlestringoptionalmax 255 chars
descriptionstringoptionalThe product text (HTML allowed) every channel publishes. Wins over short_description when both are sent
brandstringoptional
categorystringoptionalmax 255 chars
short_descriptionstringoptional · deprecatedDeprecated alias of description, used only when description is not sent
vat_ratenumberoptionalmin 0
mpnstringoptionalmax 70 chars
weightobjectoptional
weight.valuestringoptionalDecimal number as a string, e.g. "1.5"
weight.unitstringoptionalone of: oz, lb, g, kg
dimensionsobjectoptional
dimensions.lengthstringoptional
dimensions.widthstringoptional
dimensions.heightstringoptional
dimensions.unitstringoptionalone of: in, ft, yd, mm, cm, m
tagsarray of stringoptional
imagesarray of ImageInputoptionalDesired state, id-keyed diff. See endpoint description. Max 20 items
expected_updated_atstringoptionalOptimistic-concurrency precondition; 412 on mismatch. ISO 8601

VariantInput

FieldTypeRequiredDescription
skustringoptionalOptional. Without one, Nembol generates a SKU of 10 letters and digits (e.g. q5KXVoPaU7), because channels and SKU matching (stock batches, orders, imports, merge) need one; it's stored and sent to channels like any SKU. Older generated SKUs (before 2026-10-17) may contain _ or =. A SKU you send is kept as is
titlestringoptional
pricestring (money)optionalDecimal string, 2 decimals. e.g. 19.90
msrpstring (money)optionalDecimal string, 2 decimals. e.g. 19.90
quantityintegeroptionalmin 0
barcodestringoptional
gramsnumberoptionalVariant weight in grams. Min 0
asinstringoptionalmax 20 chars
optionsobjectoptional

ImageInput

One of url or base64 for new images; pass id alone to keep an existing image. Every new image must be a JPEG, PNG, WebP or GIF of at most 10 MB, checked on its bytes whatever the source: otherwise 422 unsupported_file_type / file_too_large, with the image in param, and nothing is saved.

FieldTypeRequiredDescription
idstringoptionalExisting image id (keeps it untouched)
urlstringoptionalPublic URL of the image file itself (not a page that shows it). Nembol downloads it once and keeps its own copy. A URL that can't be downloaded answers 422 image_unreachable; one that answers anything other than an image (e.g. an HTML page) answers 422 unsupported_file_type. Uri
base64stringoptionalBase64-encoded image (max 10 MB)
altstringoptionalAlt text (accessibility, SEO). Stored on the image; on an image you keep by id, a new alt replaces it ("" clears it). Sent to Shopify, WooCommerce, Etsy (max 500 characters), Wix, Squarespace (max 200) and the Storefront when the images are pushed (publish, or an edit with push updates on); read back on import from those channels. eBay, Amazon, TikTok Shop, Google Merchant Center, Meta and the others have no image alt text. Max 512 chars

Última actualización el 18 de octubre de 2026

¿Necesitas ayuda?

Escríbenos y te responde una persona, normalmente en un día laborable.

En esta página