LuLu Hypermarket API & Scraper
LuLu Hypermarket is one of the largest supermarket chains in the Gulf, and its online shop serves six countries from one catalogue.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
`search` returns the products for a search term in the country you choose (ae, sa, qa, kw, bh or om) with the price a shopper pays in that country's currency, the regular price when a cut is running, the cut in money and percent, the country's promotion badge such as "Buy 3→Cart Free" or "Online Exclusive", the stock count, pack size, a price per kg, litre or piece, the other pack sizes of the same item with their own prices, brand, barcodes, category path, dietary flags and the per-order limit. Filters are brand, product type, category, price range, minimum discount and organic, with sorting by price, newest or biggest discount. `category` lists a category, `categories` returns the shop's category tree and `product` returns one product with every pack size, images, description, highlights, ingredients and the full specification sheet. Names and descriptions are available in English or Arabic.
What a LuLu Hypermarket field actually contains
Fields that read differently from how they look. Every row was measured against live LuLu Hypermarket responses on 2026-10-15.
| Field | What it holds |
|---|---|
| price | What a shopper pays now in the chosen country, the price the product page prints first (Almarai Full Fat Fresh Milk 2 L on 2026-10-15: 12.50 AED, 12.85 SAR, 11.00 QAR, 1.035 KWD, 1.250 BHD, 1.330 OMR). |
| currency, currency_decimals | The country's currency and how many decimals it uses: 2 for AED, SAR and QAR, 3 for KWD, BHD and OMR (1.035 KWD is one dinar and 35 fils, not 1,035). |
| regular_price, discount_amount, discount_percent | The price before a running cut and the cut itself (Al Rawabi milk 2 L: 13.10, 1.00, 7.63 %). The page prints the percent rounded (8 % Off). All three are empty when no cut runs. |
| badges | The promotion label the shop shows in that country only, for example Buy 3→Cart Free on Pampers in the UAE. The same product can carry a different badge, or none, in another country. |
| pack_options | The other pack sizes of the same item, each with its own product_id and price (Almarai Double Chocolate Milk 200 ml: 1 pc 2.85 AED, 6 pcs 12.85 AED). Price and discount filters keep a row when any of its pack sizes matches, so check pack_options when a row's own price is outside your range. |
| unit_price, unit_price_unit | Price per kg, litre or piece worked out from price and pack_size (2 L at 12.10 AED gives 6.05 per litre). Empty when the pack size is not one plain measure, such as 500 g + Offer. |
| stock, in_stock | The online stock count and availability in the chosen country. The same milk had 282 units in the UAE and 0 (out of stock) in Qatar in the same minute. |
| pinned | True when the shop puts a promoted item on top of a page sorted by price, above cheaper items. The row is kept in the shop's order and flagged. |
Prices are the shop's online prices for scheduled delivery in each country. In-store prices and the express (minutes) delivery range are not part of the public listings.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/luluhypermarket/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "milk",
"country": "ae"
}
}{
"ok": true,
"meta": {
"api": "luluhypermarket",
"endpoint": "search",
"mode": "live",
"latency_ms": 3418.2,
"record_count": 20,
"bytes": 132410,
"cache_hit": false,
"upstream_requests": 1,
"total": 311,
"charged_credits": 2,
"version": "0.1.0",
"request_id": "66687305b42845d8",
"fetched_at": "2026-10-15T17:02:57.978Z"
},
"data": {
"country": "ae",
"country_name": "United Arab Emirates",
"currency": "AED",
"currency_decimals": 2,
"language": "en",
"query": "milk",
"category": null,
"filters": {},
"sort": "relevance",
"total": 311,
"total_capped": false,
"page": 1,
"page_size": 20,
"last_page": 16,
"last_reachable_page": 16,
"has_more": true,
"returned": 20,
"facets": {
"categories": [
{
"category_id": "5017",
"name": "Grocery",
"count": 128
},
{
"category_id": "5207",
"name": "Fresh Food",
"count": 188
}
],
"brands": [
{
"name": "Activia",
"count": 12
},
{
"name": "Al Ain",
"count": 4
},
{
"name": "Al Mudhish",
"count": 2
}
],
"product_types": [
{
"name": "UHT Milk",
"count": 37
},
{
"name": "Laban",
"count": 60
},
{
"name": "Flavoured Milk",
"count": 59
}
],
"pack_sizes": [
{
"name": "1 pc",
"value": "1",
"count": 50
},
{
"name": "3 pcs",
"value": "3",
"count": 3
},
{
"name": "4 pcs",
"value": "4",
"count": 19
}
],
"price_range": {
"min": 0.8,
"max": 269.5
}
},
"results": [
{
"rank": 1,
"product_id": "278",
"sku": "7564",
"base_code": "7564",
"name": "Al Rawabi Full Cream Fresh Milk 2 Litres",
"brand": "Al Rawabi",
"barcodes": [
"0000000075640",
"0001212120104",
"6291030200025"
],
"price": 12.1,
"regular_price": 13.1,
"discount_amount": 1,
"discount_percent": 7.63,
"on_offer": true,
"currency": "AED",
"currency_decimals": 2,
"tax_rate_percent": 5,
"badges": [],
"pack_size": "2 Litres",
"unit_price": 6.05,
"unit_price_unit": "l",
"pack_quantity": null,
"pack_options": [],
"in_stock": true,
"stock": 136,
"max_order_quantity": 1,
"delivery_type": "Quick",
"product_type": "Full Cream",
"category_path": [
"Fresh Food",
"Dairy , Eggs & Cheese",
"Cooking Ingredients"
],
"dietary": [],
"hidden_in_country": false,
"image": "https://bf1af2.akinoncloudcdn.com/products/2025/03/25/55843/3fef2873-2f71-44bc-9c8d-efe4f87c192e.jpg",
"url": "https://gcc.luluhypermarket.com/en-ae/al-rawabi-full-cream-fresh-milk-2-litres/p/7564/",
"pinned": false
},
{
"rank": 2,
"product_id": "276",
"sku": "7548",
"base_code": "7548",
"name": "Almarai Full Fat Fresh Milk 2 Litres",
"brand": "Almarai",
"barcodes": [
"6281007120401",
"0000000075480"
],
"price": 12.5,
"regular_price": 13.6,
"discount_amount": 1.1,
"discount_percent": 8.09,
"on_offer": true,
"currency": "AED",
"currency_decimals": 2,
"tax_rate_percent": 5,
"badges": [],
"pack_size": "2 Litres",
"unit_price": 6.25,
"unit_price_unit": "l",
"pack_quantity": null,
"pack_options": [],
"in_stock": true,
"stock": 290,
"max_order_quantity": null,
"delivery_type": "Quick",
"product_type": "Full Fat",
"category_path": [
"Fresh Food",
"Dairy , Eggs & Cheese",
"Cooking Ingredients"
],
"dietary": [],
"hidden_in_country": false,
"image": "https://bf1af2.akinoncloudcdn.com/products/2026/06/04/55822/0f4647e1-8167-4efb-82e9-6a511cbdc432.jpg",
"url": "https://gcc.luluhypermarket.com/en-ae/almarai-full-fat-fresh-milk-2-litres/p/7548/",
"pinned": false
},
{
"rank": 3,
"product_id": "260",
"sku": "12701",
"base_code": "12701",
"name": "Al Ain Farms Full Cream Fresh Milk 2 Litres",
"brand": "Al Ain Farms",
"barcodes": [
"6291056001101",
"0000000127011",
"6291056001002"
],
"price": 13.15,
"regular_price": null,
"discount_amount": null,
"discount_percent": null,
"on_offer": false,
"currency": "AED",
"currency_decimals": 2,
"tax_rate_percent": 5,
"badges": [],
"pack_size": "2 Litres",
"unit_price": 6.58,
"unit_price_unit": "l",
"pack_quantity": null,
"pack_options": [],
"in_stock": true,
"stock": 334,
"max_order_quantity": 1,
"delivery_type": "Quick",
"product_type": "Full Cream",
"category_path": [
"Fresh Food",
"Dairy , Eggs & Cheese",
"Cooking Ingredients"
],
"dietary": [],
"hidden_in_country": false,
"image": "https://bf1af2.akinoncloudcdn.com/products/2025/11/27/55797/873dc4fa-812f-4418-8c8c-60ae8c8a75d3.jpg",
"url": "https://gcc.luluhypermarket.com/en-ae/al-ain-farms-full-cream-fresh-milk-2-litres/p/12701/",
"pinned": false
}
]
}
}What the LuLu Hypermarket API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search LuLu Hypermarket's online shop in one Gulf country: price paid and regular price in the local currency, discount, promotion badges, stock count, pack size and price per kg/l/pc, other pack sizes with their prices, brand, barcodes, category path. `query` required; filters brand, product_type, category_id, min_price/max_price, min_discount, organic; sort; page. | Pricing teams call search to search LuLu Hypermarket's online shop in one Gulf country. | query, country, language, category_id, brand, ... |
| category | List one LuLu category (its path from `categories`, e.g. grocery-food-cupboard-beverage, or a numeric category id) with the same row fields, filters and sorts as `search`. | Marketplace operators call category to list one LuLu category (its path from `categories`, e.g. | category, country, language, brand, product_type, ... |
| product | One LuLu product by the `product_id` a search row returns (or its shop URL), in one country: prices, discount, badges, stock, every pack size with its own price and stock flag, barcodes, images, description, highlights, ingredients and the full specification sheet. | Catalog enrichment teams call product to get one LuLu product by the `product_id` a search row. | product_id, country, language |
| categories | LuLu's category tree from the shop menu (318 nodes on 2026-10-15): name, path, id where the menu gives one, children. Paths and ids feed `category`. | Retail analysts call categories to get luLu's category tree from the shop menu (318 nodes on 2026-10-15). | category, country, language |
Call search from your stack
curl -X POST https://api.reefapi.com/luluhypermarket/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"milk","country":"ae"}'import requests
r = requests.post(
"https://api.reefapi.com/luluhypermarket/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "milk",
"country": "ae"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/luluhypermarket/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "milk",
"country": "ae"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.luluhypermarket.search with {"query":"milk","country":"ae"}.Who uses this API and why
- Track grocery prices, price cuts and promotion badges across the six Gulf countries.
- Compare the same product's price, stock and pack sizes between the UAE, Saudi Arabia, Qatar, Kuwait, Bahrain and Oman.
- Compare prices per kg or litre across brands and LuLu's own label.
- Build a Gulf grocery and electronics catalogue with barcodes, brands, category paths and specifications.
- Monitor which products are discounted by at least a given percent in one country.
Questions developers ask before integrating
Which countries are covered?
All six LuLu online shops: United Arab Emirates (AED), Saudi Arabia (SAR), Qatar (QAR), Kuwait (KWD), Bahrain (BHD) and Oman (OMR). Pass country on each call; every response names the country and currency it is for.
Do prices differ between countries?
Yes, and so do stock, range, badges and order limits. The same 2-litre Almarai milk cost 12.50 AED in the UAE, 12.85 SAR in Saudi Arabia and was out of stock in Qatar on 2026-10-15. The shop also hides some products in some countries, and the API leaves them out the same way.
Do I need a LuLu account?
No. Everything is read logged out: the prices, badges, stock counts and product details any visitor sees.
Can I get Arabic names?
Yes. Pass language=ar and names, descriptions and badges come in Arabic where the shop has them.
Which filters work?
brand, product_type, category_id, min_price and max_price, min_discount and organic, plus sorting by price, newest or biggest discount. Each was checked against the unfiltered count in the same run: 'milk' in the UAE had 315 products, 44 from Almarai, 60 Laban, 99 between 10 and 20 AED, 33 cut by at least 10 % and 6 organic.
Why does a row's price fall outside my price range?
LuLu filters whole product groups: a row is kept when any of its pack sizes is in range. The matching pack is in pack_options with its own price and product_id.
How deep can I page?
Up to 20 products per page and up to the first 10,000 products of any listing (page 500 at 20 per page). last_reachable_page says where a listing stops; narrow with filters or a category to reach the rest.
How fresh is the data?
Every call reads the shop live; nothing is cached.
What is the LuLu Hypermarket API?
LuLu Hypermarket API is a ReefAPI endpoint group for gulf supermarket prices from lulu hypermarket in the uae, saudi arabia, qatar, kuwait, bahrain and oman: price paid and regular price, discounts, promotion badges, stock and pack sizes. It returns live JSON through POST requests under /luluhypermarket/v1.
Is the LuLu Hypermarket API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. LuLu Hypermarket calls use the same shared credit balance as every other ReefAPI engine.
Do I need a LuLu Hypermarket login or account?
No login to LuLu Hypermarket is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the LuLu Hypermarket data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the LuLu Hypermarket API use?
LuLu Hypermarket actions currently cost 1-3 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call LuLu Hypermarket from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call luluhypermarket actions with the same key, credit pool and JSON envelope used by normal REST requests.