Nana Express Products API
Every product in a Nana store category: name, brand, price, selling unit, stock and the most you can order.
- 1 credit per call
- Failed calls are free
- Updated
- nana.products.list
{ "products": [ { "name": "Fresh HASHI Meat With Bones - 1Kg", "price": 50.5, "brand": "Nana Products", "currency": "SAR", "id": "INVP04a641de-9139-41bd-9b2b-dd4c594cf304", "in_stock": true, "item_unit": "PCs", "max_quantity": 28, "pid": "PID10314271", "selling_unit": "Kilo" }, { "name": "Minced Beef Fresh", "price": 36.25, "brand": "Tamimi Markets", "currency": "SAR", "id": "INVP06fad861-7875-49f9-bb10-55b502861fd2", "in_stock": true, "item_unit": "Donate", "max_quantity": 8, "pid": "PID10247929", "selling_unit": "Kilo" } ]}
| # | Product | Brand | Price (SAR) | Sold by | In stock | Most per order | Currency | Item unit | Pid | Id |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Fresh HASHI Meat With Bones - 1Kg | Nana Products | 50.5 | Kilo | true | 28 | SAR | PCs | PID10314271 | INVP04a641de-9139-41bd-9b2b-dd4c594cf304 |
| 2 | Minced Beef Fresh | Tamimi Markets | 36.25 | Kilo | true | 8 | SAR | Donate | PID10247929 | INVP06fad861-7875-49f9-bb10-55b502861fd2 |
| 3 | Zood Goat Meat Cubes with Bone - 500g | Zod | 36 | Gram | true | 73 | SAR | PCs | PID10314274 | INVP0c8844d8-4fbe-45cb-87ab-68cbd0b13bdb |
| 4 | Goat Meat Cubes with Bone - 1kg | Nana Products | 64 | Kilo | true | 44 | SAR | PCs | PID10314277 | INVP3018328b-7970-4280-bf8a-e07f167030eb |
| 5 | Fresh HASHI Meat With Bones - 1Kg | Nana Products | 50.5 | Kilo | true | 99 | SAR | PCs | PID10314276 | INVP4a6c8176-908e-46c0-8d6c-f32a6c1af5ec |
| 6 | Siniora Fresh Beef Meat Strips 200 G | siniora | 42 | Gram | true | 11 | SAR | PCs | PID10286064 | INVP59bd1a6d-4232-4c5c-97d2-9e0ea40443d2 |
| 7 | Naeimi Fresh Lamb Meat - 1kg | Nana Products | 110.25 | Kilo | true | 8 | SAR | PCs | PID10314272 | INVP7027c3ce-9a30-485e-a59b-ee05eff94339 |
| 8 | Zod Chilled Beef Cubes - 500g | Zod | 23 | جرام | true | 13 | SAR | حبة | PID10316528 | INVP7190f239-aa70-4702-bfaf-a3ed945741e7 |
What you send
The input
object of the request, with every field the endpoint accepts.
| Field | Type | Required | What it does | Example |
|---|---|---|---|---|
| category_id | string | yes | The category's ID, from the categories endpoint. | COL7214322072 |
| store_id | string | yes | The Nana store's ID, such as STR00002232. | STR00002232 |
| category_name | string | no | The category's name, kept with the results so your rows say where they came from. |
Fields it returns
What each record in the response holds, with the values from the sample above.
| Field | Type | What it is | Example |
|---|---|---|---|
| products[].name | string | The name of the category or product. | Fresh HASHI Meat With Bones - 1Kg |
| products[].brand | string | The product's brand. | Nana Products |
| products[].price | number | The price. | 50.5 |
| products[].selling_unit | string | The unit it is sold by, such as kilo. | Kilo |
| products[].in_stock | boolean | Whether the product is in stock. | true |
| products[].max_quantity | integer | The most you can order. | 28 |
| products[].currency | string | The currency. | SAR |
| products[].id | string | Nana's ID for it. | INVP04a641de-9139-41bd-9b2b-dd4c594cf304 |
| products[].item_unit | string | The unit of one item. | PCs |
| products[].pid | string | Nana's product ID. | PID10314271 |
| products | array | The products. | 8 records |
Call it from your code, or ask your agent
Set UPSCRAPE_API_KEY to your key and copy a working request.
curl --request POST \ --url https://data.upscrape.com/execute \ --header "Authorization: Bearer $UPSCRAPE_API_KEY" \ --header "Content-Type: application/json" \ --header "Prefer: wait=30" \ --data '{ "capability": "nana.products.list", "input": { "category_id": "COL7214322072", "store_id": "STR00002232" }}'
import jsonimport osimport requestspayload = json.loads(r'''{ "capability": "nana.products.list", "input": { "category_id": "COL7214322072", "store_id": "STR00002232" }}''')response = requests.post( "https://data.upscrape.com/execute", headers={ "Authorization": f"Bearer {os.environ['UPSCRAPE_API_KEY']}", "Content-Type": "application/json", "Prefer": "wait=30", }, json=payload,)response.raise_for_status()print(json.dumps(response.json(), indent=2))
const response = await fetch("https://data.upscrape.com/execute", { method: "POST", headers: { "Authorization": `Bearer ${process.env.UPSCRAPE_API_KEY}`, "Content-Type": "application/json", "Prefer": "wait=30", }, body: JSON.stringify({ "capability": "nana.products.list", "input": { "category_id": "COL7214322072", "store_id": "STR00002232" }}),});if (!response.ok) { throw new Error(`Upscrape request failed: ${response.status}`);}console.log(JSON.stringify(await response.json(), null, 2));
https://data.upscrape.com/mcp
Using Upscrape, list the products in Nana store STR00002232's Chilled Meat category (COL7214322072). Make a table of product, brand, price and stock.
More from the Nana Express API
The same data from other platforms
Nana Express Products API FAQ
The short answers. The docs have the long ones.
How much does the Nana Express Products API cost?
1 credit per successful call, shown before it runs. You buy credits once, and paid credits never expire.
What do I send?
Send store_id and category_id. The input fields below list every option with its type and limits.
Do I need a Nana Express login?
No. It reads public Nana Express data; nothing runs on your account.
Can my AI agent call it?
Yes, over MCP: the agent finds nana.products.list, checks its price and runs it with the same credits as the REST API.
Your first Nana Express call is free.
Up to 100 free credits to start, no card needed.