Track and Fix Product Status
This guide shows you how to use GetContent to find out why a product isn't live yet and what to fix. By the end, you'll have a repeatable process for moving a product from incomplete to OVERALL_STATUS_ACTIVE.
Prerequisites
- Authentication set up — see Getting Credentials and Authenticating Your Requests
- A
sku_parentfrom a previousUpsertProductcall — see Submit a Product
Step 1 — Check product status
GetContent (POST /content/v1/product/content/get) returns the current state of a product: stored attribute values, image review results, and per-language completeness and QC status.
- Python
- Node.js
# get_authenticated_session() is provided in docs/snippets/auth.mdx — see Authenticating Your Requests
session = get_authenticated_session()
response = session.post(
"https://noon-api-gateway.noon.partners/content/v1/product/content/get",
json={"sku_parent": "Z1ABC234"},
headers={"User-Agent": "MyCatalogApp/1.0.0"},
timeout=30,
)
response.raise_for_status()
result = response.json()
// getAuthenticatedClient() is provided in docs/snippets/auth.mdx — see Authenticating Your Requests
const client = await getAuthenticatedClient();
const response = await client.post(
"https://noon-api-gateway.noon.partners/content/v1/product/content/get",
{ sku_parent: "Z1ABC234" },
{
headers: {
"Content-Type": "application/json",
"User-Agent": "MyCatalogApp/1.0.0",
},
}
);
const result = response.data;
Response:
{
"sku_parent": "Z1ABC234",
"attributes": { "product_title": { "values": [{"value": "Acme Runner Sneaker", "language": "LANGUAGE_EN"}] } },
"images": [
{
"url": "https://cdn.example.com/acme-runner-main.jpg",
"sort": 1,
"visibility": "VISIBILITY_STATUS_VISIBLE",
"review_status": "REVIEW_STATUS_PENDING",
"issues": []
}
],
"statuses": [
{
"language": "LANGUAGE_EN",
"content": {
"completeness": "60%",
"missing_attributes": ["long_description", "colour"],
"invalid_attributes": ["shoe_material"]
},
"qc": {
"status": "QC_STATUS_NOT_ELIGIBLE",
"rejection_reasons": [],
"comment": ""
},
"overall_status": "OVERALL_STATUS_INACTIVE",
"errors": []
}
]
}
You'll know the product is live when every entry in statuses has overall_status: "OVERALL_STATUS_ACTIVE".
Step 2 — Diagnose what's blocking
Check statuses for each language separately — a product can be active in one language and incomplete in another. For each language status, work through the following in order:
1. Content completeness
If content.completeness is below "100%":
content.missing_attributes— required attributes with no submitted value. Add them in your nextUpsertProductcall.content.invalid_attributes— required attributes whose submitted value failed validation (wrong type, out of range, not inattribute_options). Re-check the constraints fromListCategoryAttributesand correct the values.
QC cannot start until completeness reaches 100%. While it's below that, qc.status will always be QC_STATUS_NOT_ELIGIBLE.
2. Image status
Check each entry in images:
review_status | visibility | Meaning | What to do |
|---|---|---|---|
REVIEW_STATUS_PENDING | any | Image is still under review | Wait and poll again |
REVIEW_STATUS_VALID | VISIBILITY_STATUS_VISIBLE | Image qualifies — counts toward go-live | Nothing |
REVIEW_STATUS_VALID | VISIBILITY_STATUS_HIDDEN | Image passed review but is hidden | Contact noon to make the image visible |
REVIEW_STATUS_INVALID | any | Image failed review | Check issues for the reason, replace the image in UpsertProduct |
A product needs at least one image with REVIEW_STATUS_VALID and VISIBILITY_STATUS_VISIBLE to go live.
3. QC status
qc.status values:
| Value | Meaning | What to do |
|---|---|---|
QC_STATUS_NOT_ELIGIBLE | Completeness is below 100% | Fix content first |
QC_STATUS_PENDING | noon is reviewing the product | Wait and poll again |
QC_STATUS_APPROVED | QC passed | Nothing — product goes live once images also pass |
QC_STATUS_REJECTED | QC failed | Read qc.rejection_reasons and qc.comment, fix the issues, then resubmit |
4. Errors array
statuses[].errors contains structured error codes that describe blocking conditions:
errors[].code | Meaning | Fix |
|---|---|---|
MISSING_BRAND | No brand submitted | Include brand in your next UpsertProduct call |
INVALID_BRAND | Brand value not accepted by noon | Use a brand name recognised in the noon catalog |
MISSING_CATEGORY | Category path incomplete or absent | Ensure category is a full three-segment code from ListCategories |
INVALID_CATEGORY | Category code present but not valid | Recheck the code against ListCategories output |
MISSING_ATTRIBUTES | One or more mandatory attributes absent | See content.missing_attributes for the list |
QC_REJECTED | Product rejected in QC | See qc.rejection_reasons and qc.comment |
NO_IMAGES_PROVIDED | No images were submitted | Add at least one image in UpsertProduct |
NO_VALID_IMAGES | All submitted images failed review | Replace images; check images[].issues for reasons |
NO_VISIBLE_IMAGES | No valid image is set to visible | Contact noon to set a valid image to visible |
Step 3 — Fix and resubmit
Once you've identified the issues, fix them in your system and call UpsertProduct again using the same partner_sku values — noon will update the existing product rather than create a new one. You don't need the sku_parent to update; noon resolves it from partner_sku.
After resubmitting, go back to Step 1. Repeat until every language entry in statuses shows overall_status: "OVERALL_STATUS_ACTIVE".
QC review takes time — QC_STATUS_PENDING is expected after content is complete. There is no way to accelerate the review. Poll GetContent periodically rather than continuously.
Next steps
- Go Live: Full Onboarding — see the complete lifecycle from discovery to active listing
- GetContent Reference — full request and response schema
- UpsertProduct Reference — resubmit corrected content