--- sidebar_position: 3 --- # Track and Fix Product Status import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; 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][getting-credentials] and [Authenticating Your Requests][authenticating-requests] - A `sku_parent` from a previous `UpsertProduct` call — see [Submit a Product][content-submit-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 # 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() ``` ```javascript // 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:** ```json { "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 next `UpsertProduct` call. - `content.invalid_attributes` — required attributes whose submitted value failed validation (wrong type, out of range, not in `attribute_options`). Re-check the constraints from `ListCategoryAttributes` and 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"`. :::info 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][content-go-live] — see the complete lifecycle from discovery to active listing - [GetContent Reference][content-get-content-api] — full request and response schema - [UpsertProduct Reference][content-upsert-product-api] — resubmit corrected content