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
| Field | Type | Description |
|---|---|---|
id | string | e.g. prod_66a1f09b2 |
object | string | always product |
title | string · nullable | e.g. Vintage denim jacket |
description | string · nullable | The product text (HTML allowed) that the dashboard shows and every channel publishes, unless a listing has its own text (listing overrides) |
brand | string · nullable | |
category | string · nullable | Seller's own product category / collection label (free text; channel categories live on the listing) |
short_description | string · nullable | Deprecated alias of description: always the same value. Read description |
vat_rate | number · nullable | VAT percentage applied to this product, when set |
mpn | string · nullable | Manufacturer part number |
weight | object | Product-level shipping weight |
weight.value | string · nullable | Decimal number as a string |
weight.unit | string · nullable | one of: oz, lb, g, kg, null |
dimensions | object | Package dimensions |
dimensions.length | string · nullable | |
dimensions.width | string · nullable | |
dimensions.height | string · nullable | |
dimensions.unit | string · nullable | one of: in, ft, yd, mm, cm, m, null |
tags | array of string | |
currency | string | ISO-4217; echo of the store base currency |
status | ProductStatus | One 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_attention | RequiresAttention | Why 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_into | string · nullable | Set 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_status | string | Rollup of the listings' statuses. One of: ok, pending, error |
images | array of Image | |
variants | array of Variant | |
listings | array of ListingSummary | Read-only summary; the canonical resource is GET /listings?product_id= |
created_at | string | ISO 8601 |
updated_at | string | ISO 8601 |
Variant
| Field | Type | Description |
|---|---|---|
id | string | e.g. var_66a1f1 |
object | string | always variant |
sku | string · nullable | e.g. VDJ-M-001 |
title | string · nullable | |
price | string (money) | Decimal string, 2 decimals. e.g. 19.90 |
msrp | string · nullable | Compare-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 |
quantity | integer | |
barcode | string · nullable | |
grams | number · nullable | Variant weight in grams (used for shipping on supported channels) |
asin | string · nullable | Amazon ASIN, when attached |
images | array of object | Variant-specific images, referencing the product's images |
images[].image_id | string | e.g. img_66a1f2 |
images[].url | string · nullable | uri |
images[].position | integer | |
options | object | Option name → value (e.g. {"Color": "Red", "Size": "M"}) |
Image
| Field | Type | Description |
|---|---|---|
id | string | e.g. img_ph1x8 |
object | string | always image |
url | string | Nembol'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 |
alt | string · nullable | Alt text of the image. Sent to Shopify, WooCommerce, Etsy, Wix, Squarespace and the Storefront; read back on import from them |
position | integer | Zero-based; equals array index |
Request models
What you send when creating or updating. Fields not listed are ignored.
ProductCreate
| Field | Type | Required | Description |
|---|---|---|---|
title | string | required | max 255 chars |
description | string | optional | The product text (HTML allowed) every channel publishes. Wins over short_description when both are sent |
brand | string | optional | |
tags | array of string | optional | |
images | array of ImageInput | optional | max 20 items |
variants | array of VariantInput | optional | Omit 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 |
price | string (money) | optional | Decimal string, 2 decimals. e.g. 19.90 |
msrp | string (money) | optional | Decimal string, 2 decimals. e.g. 19.90 |
quantity | integer | optional | min 0 |
sku | string | optional | The single variant's SKU. Optional: without one a 10-character letters-and-digits SKU is generated (see VariantInput.sku) |
grams | number | optional | min 0 |
category | string | optional | max 255 chars |
short_description | string | optional · deprecated | Deprecated alias of description, used only when description is not sent |
vat_rate | number | optional | min 0 |
mpn | string | optional | max 70 chars |
weight | object | optional | |
weight.value | string | optional | Decimal number as a string, e.g. "1.5" |
weight.unit | string | optional | one of: oz, lb, g, kg |
dimensions | object | optional | |
dimensions.length | string | optional | |
dimensions.width | string | optional | |
dimensions.height | string | optional | |
dimensions.unit | string | optional | one of: in, ft, yd, mm, cm, m |
ProductUpdate
| Field | Type | Required | Description |
|---|---|---|---|
title | string | optional | max 255 chars |
description | string | optional | The product text (HTML allowed) every channel publishes. Wins over short_description when both are sent |
brand | string | optional | |
category | string | optional | max 255 chars |
short_description | string | optional · deprecated | Deprecated alias of description, used only when description is not sent |
vat_rate | number | optional | min 0 |
mpn | string | optional | max 70 chars |
weight | object | optional | |
weight.value | string | optional | Decimal number as a string, e.g. "1.5" |
weight.unit | string | optional | one of: oz, lb, g, kg |
dimensions | object | optional | |
dimensions.length | string | optional | |
dimensions.width | string | optional | |
dimensions.height | string | optional | |
dimensions.unit | string | optional | one of: in, ft, yd, mm, cm, m |
tags | array of string | optional | |
images | array of ImageInput | optional | Desired state, id-keyed diff. See endpoint description. Max 20 items |
expected_updated_at | string | optional | Optimistic-concurrency precondition; 412 on mismatch. ISO 8601 |
VariantInput
| Field | Type | Required | Description |
|---|---|---|---|
sku | string | optional | Optional. 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 |
title | string | optional | |
price | string (money) | optional | Decimal string, 2 decimals. e.g. 19.90 |
msrp | string (money) | optional | Decimal string, 2 decimals. e.g. 19.90 |
quantity | integer | optional | min 0 |
barcode | string | optional | |
grams | number | optional | Variant weight in grams. Min 0 |
asin | string | optional | max 20 chars |
options | object | optional |
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.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | optional | Existing image id (keeps it untouched) |
url | string | optional | Public 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 |
base64 | string | optional | Base64-encoded image (max 10 MB) |
alt | string | optional | Alt 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.