Back to Blog
TutorialOctober 22, 202611 min read

Build a Cross-Border Grocery Price Dashboard for India and the UAE

FMCG brands, importers and analysts selling in both markets want one view of shelf prices. Here's how to build it with group search in each country and the per-product currency field.

#dashboard#currency#india#uae#fmcg#price monitoring

Many brands sell the same products in India and the Gulf: Indian staples on UAE shelves, global FMCG brands in both. Until now that meant two data sources with different shapes. QuickCommerce API covers 18 platforms across both countries, including Noon Minutes & talabat mart in the UAE, and every product carries a `currency` field, so one pipeline handles both markets.

Pipeline

๐Ÿ‡ฎ๐Ÿ‡ณIndia searchgroupsearch, INR
๐Ÿ‡ฆ๐Ÿ‡ชUAE searchgroupsearch, AED
๐Ÿ’ฑNormalisecurrency + pack size
๐Ÿ—„๏ธStoreone table
๐Ÿ“ˆChartdashboard

Why the currency field matters

A price of `12.5` is cheap milk in Dubai and impossible in Bengaluru. Rather than inferring currency from the platform name (and breaking the day a new country launches), read `currency` from each product: `INR` for Indian platforms, `AED` for UAE platforms. It's included in `/v1/search`, `/v1/groupsearch`, `/v1/item` and `/v1/items` responses for every platform.

Info

One group search runs at one location, so make one call per country: an Indian lat/lon for the Indian platforms and a UAE lat/lon (no pincode) for Noon Minutes and talabat mart.

Step 1: collect prices in both countries

collect.py
import datetime as dt, os, requests

API = "https://api.quickcommerceapi.com/v1/groupsearch"
HEADERS = {"X-API-Key": os.environ["QC_API_KEY"]}

MARKETS = {
    "IN": {"lat": 12.9021, "lon": 77.6639, "platforms": "BlinkIt,Zepto,Swiggy"},   # Bengaluru
    "AE": {"lat": 25.1972, "lon": 55.2744, "platforms": "NoonMinutes,TalabatMart"},  # Downtown Dubai
}
PRODUCTS = ["nutella 350g", "maggi noodles", "basmati rice", "kelloggs corn flakes"]

def collect():
    rows, ts = [], dt.datetime.utcnow().isoformat()
    for country, params in MARKETS.items():
        for q in PRODUCTS:
            r = requests.get(API, headers=HEADERS, params={"q": q, **params}, timeout=60)
            r.raise_for_status()
            for platform, products in r.json()["data"]["results"].items():
                for p in products[:5]:  # top matches per platform
                    if not p.get("offer_price"):
                        continue
                    rows.append({
                        "ts": ts, "country": country, "query": q, "platform": platform,
                        "name": p["name"], "brand": p.get("brand"), "quantity": p.get("quantity"),
                        "price": float(p["offer_price"]), "mrp": p.get("mrp"),
                        "currency": p["currency"], "available": p.get("available"),
                    })
    return rows

Credits: group search charges one credit per platform, so each product costs 3 credits in India and 2 in the UAE. Four products is 20 credits per snapshot.

Step 2: normalise currency and pack size

Convert to one reporting currency with an exchange rate you control (your finance team's monthly rate, or a rates API you already use). The QuickCommerce API returns prices in local currency and doesn't do FX for you, which keeps the raw data honest. Then divide by pack size so a 350 g jar and a 400 g jar compare fairly.

normalise.py
import re

# Rates to your reporting currency. Fill from your own source; these are placeholders.
TO_INR = {"INR": 1.0, "AED": None}

UNITS = {"g": 1, "kg": 1000, "ml": 1, "l": 1000}

def grams_or_ml(quantity):
    m = re.search(r"([\d.]+)\s*(kg|g|ml|l)\b", (quantity or "").lower())
    return float(m.group(1)) * UNITS[m.group(2)] if m else None

def normalise(row):
    rate = TO_INR[row["currency"]]
    size = grams_or_ml(row["quantity"])
    row["price_inr"] = row["price"] * rate if rate else None
    row["inr_per_100"] = row["price_inr"] / size * 100 if row["price_inr"] and size else None
    return row

Warning

Never hardcode `AED` or `INR` per platform in your pipeline. Read it from the response so a new platform or country flows through without code changes.

Step 3: store snapshots

Append each run to one table (Postgres, BigQuery, or a CSV to start). Keep the local `price` and `currency` alongside the converted value, so you can re-convert history if you change rates later.

ColumnExample (IN)Example (AE)
`country`INAE
`platform`ZeptoTalabatMart
`price`local selling pricelocal selling price
`currency`INRAED
`price_inr`same as priceprice ร— your AED rate
`inr_per_100`per 100 g / mlper 100 g / ml

Step 4: chart it

1

Price index per product

Cheapest available price per 100 g in each country, in your reporting currency, as two lines over time.

2

Platform spread within a country

Min and max across Blinkit, Zepto and Instamart, or Noon Minutes and talabat mart, to see how much platform choice matters locally.

3

Availability

Share of tracked products in stock per platform: a gap in one market is often more actionable than a price difference.

Any BI tool works. If you're building in React, the charts in market intelligence and pricing trends use Recharts and drop in directly.

Next steps

Once you know which products you care about, switch from search to `/v1/items` with their IDs, so every refresh returns exactly those products rather than the best keyword match. Start in the API Playground with 100 free credits.

Frequently asked questions

Does the API convert AED prices to INR?

No. Prices are returned in local currency with a currency field (INR or AED). Apply your own exchange rate so your numbers match your finance source.

Can one group search cover India and UAE platforms together?

Group search runs at a single location, so call it once per country: an Indian lat/lon for Indian platforms and a UAE lat/lon for Noon Minutes and talabat mart.

Which responses include the currency field?

Products in /v1/search and /v1/groupsearch, and items in /v1/item and /v1/items, for every platform.

Ready to Get Started?

Sign up for free and get 100 credits instantly. No credit card required. Start querying quick commerce and marketplace platforms with a single API.