Skip to main content
View as Markdown

Offer API Quickstart

By the end of this guide, you'll have retrieved the live status, price, and stock for a SKU from the Offer API.

Prerequisites

Make your first call

GetProductOffers (GET /offer/v1/product/{partner_sku}) retrieves all offer records for a partner SKU — one per country where you sell. It requires no prior domain-specific setup, making it the right starting point.

# get_authenticated_session() is provided in docs/snippets/auth.mdx — see Authenticating Your Requests
session = get_authenticated_session()

response = session.get(
"https://noon-api-gateway.noon.partners/offer/v1/product/MYSKU-001",
headers={"User-Agent": "MyApp/1.0.0"},
timeout=30,
)
response.raise_for_status()
result = response.json()

Replace MYSKU-001 with a partner SKU from your catalog.

Response:

<!-- from: v1GetProductOffersResponse / v1Offer -->
{
"partner_sku": "MYSKU-001",
"sku": "Z1234567890123",
"title": "Premium Wireless Headphones",
"brand": "SoundPlus",
"offers": [
{
"offer_code": "AE-NOON-MYSKU-001",
"country_code": "ae",
"business_model": "noon",
"price": {
"amount": 149.99,
"currency": "AED"
},
"is_active": true,
"active_net_stock": 25,
"live_status": true,
"offer_issues": []
},
{
"offer_code": "SA-NOON-MYSKU-001",
"country_code": "sa",
"business_model": "noon",
"price": null,
"is_active": true,
"active_net_stock": 0,
"live_status": false,
"offer_issues": [
{
"reason": "Price missing",
"subreason": "No active price",
"description": "No price has been configured for this offer in this country."
}
]
}
]
}

Valid values for country_code: "ae", "sa", "eg".

business_model is currently always "noon" — the only business model the Offer API supports. See the Offer API Overview for more on business models.

In offer_issues, reason and subreason are human-readable text describing the blocking issue, and description gives a fuller explanation. They are descriptive text, not a fixed set of codes, so treat them as display strings rather than values to switch on.

What you got back

The offers array contains one entry per country where you sell. The first offer (ae) is live: is_active is true, live_status is true, and offer_issues is empty. The second offer (sa) is not live despite being active — live_status is false because offer_issues contains a blocking issue. When live_status is false, offer_issues always explains why.

price is nullable. If no price is configured for a country-level offer, price will be null — always check before accessing price.amount or price.currency.

Checking for errors

A failed request returns a standard error envelope (rpcStatus) with four fields: status_id (a numeric identifier), status_code (a string code), message (a human-readable description), and details (an array of additional context).

<!-- from: rpcStatus -->
{
"status_id": 5,
"status_code": "NOT_FOUND",
"message": "No offer found for the given partner_sku.",
"details": []
}
HTTP statusWhat it meansWhat to do
401Missing or invalid authenticationRe-authenticate — see Authenticating Your Requests
404No offer exists for this partner_sku in your catalogConfirm the SKU exists in your catalog in Seller Lab. Partner SKUs are scoped to your account (unique per partner_sku + partner), so a 404 only means you have no SKU by that identifier — not that it belongs to another partner
429Rate limit exceededBack off and retry with exponential backoff

Where to go next