noon_content_UpsertProduct
Create or update a product listing on noon — new partner_skus create a product, known ones update the product they belong to.
destructivenoonnoon
Read noon_content_ListCategoryAttributes for the category first; save data.sku_parent and poll noon_content_GetContent until completeness reaches 100. noon API · ContentService_UpsertProduct · POST /content/v1/product/upsert Docs: https://noon-docs.noonpartners.dev/docs/api-reference/content/content-service-upsert-product Gate: approve — interactive: show the change (noon's preview first where one exists), wait for an explicit approve; autopilot: only when the seller's own words asked for this change; otherwise ask.
Call it
In an AI client (MCP)
{
"name": "noon_content_UpsertProduct",
"arguments": {
"store": "myStore-US",
"skus": []
}
}From code (Tool API)
curl -X POST https://api.sellersheetai.com/api/v1/tools/noon_content_UpsertProduct \
-H "Authorization: Bearer $SELLERSHEET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"store":"myStore-US","skus":[]}'Arguments
| Name | Type | Description |
|---|---|---|
storerequired | string | the noon account ref `<account>-<CC>` (name-country, e.g. 'myNoon-AE') — one of get_user_context's noon store_refs, verbatim. |
skusrequired | object[] | the variations (required, non-empty) — partner_sku, unique across all your products, and size, required when there is more than one SKU (e.g. 'Large', '42', 'S'); on update every SKU must belong to the same parent product. |
brand | string | the product's brand name. |
category | string | a category code from noon_content_ListCategories. |
images | object[] | optional [{url (a direct public URL), sort (1-based slot)}] — each sort is a slot: an image replaces that slot, a slot you leave out keeps noon's image. |
attributes | object | optional attribute_code -> {values: [{value, language, sort}]} — language is noon's English or Arabic language value, as noon_content_GetContent lists it (one value per language on a localizable attribute), sort orders a multivalued list; a METRIC attribute travels with its '<code>_unit' attribute in the same call. An attribute you leave out keeps its value on noon — nothing is removed. A number may be sent as text. |
Result
Every tool answers {notification, data, human_action}; data carries:
data.sku_parent— the product's id — save it; noon_content_GetContent takes it.data.variants[]— every variant of the product (also those not sent) — sku, partner_sku, psku_code, size.data.status— {status_code, message}.
Body (noon schema)
skus*: [{partner_sku*, size}]
brand*: string
category*: string
images*: [{url*, sort*}]
attributes*: objectGotchas
- noon refuses an unknown attribute or a value outside its options as an error naming it. A missing is_mandatory attribute is NOT refused: noon saves the product and lists it in noon_content_GetContent's missing_attributes once it has processed the content.