# Talabat Mart Grocery Price Index — Basket Cost by Branch (`hebaabdalaziz/talabat-mart-grocery-price-index`) Actor

Track a real grocery basket's price across Talabat Mart branches and cities: rice, oil, milk, eggs, bread and more, with the cheapest branch flagged and full price breakdown per item. Egypt, UAE, Saudi, Kuwait, Qatar, Bahrain, Oman, Jordan, Iraq.

- **URL**: https://apify.com/hebaabdalaziz/talabat-mart-grocery-price-index.md
- **Developed by:** [Heba Abdalaziz](https://apify.com/hebaabdalaziz) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 66.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Talabat Mart Grocery Price Index — Basket Cost by Branch 🛒

Track what a real grocery basket actually costs on Talabat Mart, compared across branches and cities. No other tool on the Store does this: everyone else scrapes raw product lists, this one turns those prices into a **cost-of-living signal** you can act on.

Give it a basket of staples (rice, oil, milk, eggs, bread, and whatever else you choose) and a list of branches, and it returns each branch's total basket price, ranks the cheapest, and shows the exact matched product and price for every item.

### What you get, per location

- **Branch identified automatically** from any address, mall, or neighbourhood name, the same way you'd search delivery locations in the Talabat app
- **A priced basket**: for every item you asked for, the cheapest matching product's exact name, price, discount, stock status, and category
- **A basket total**, and a **rank across all the branches you requested** in the same run, cheapest first
- Optionally, the **full catalog** scanned at that branch (hundreds of real products with live prices), for broader price research beyond the basket

### Who this is for

- **Journalists and economists** tracking real food-price inflation in MENA cities, run the same basket weekly or monthly and watch the total move
- **Expats and residents** comparing which branch or city is actually cheaper for everyday shopping
- **FMCG brands and retailers** doing competitive pricing research on Talabat Mart's assortment
- **Researchers** studying quick-commerce pricing across Egypt, UAE, Kuwait, Qatar, Bahrain, Oman, and Jordan

### How to use it

1. List the locations you want priced: a country (`egypt`, `uae`, `kuwait`, `qatar`, `bahrain`, `oman`, or `jordan`) and an area name for each, e.g. `{"country": "egypt", "area": "Maadi, Cairo"}`.
2. List the basket items you want priced, in English keywords. The default is a standard staples basket: rice, sunflower oil, sugar, eggs, milk, chicken breast, bread, tea, tomatoes, bananas.
3. Click **Start**. Each location becomes one row, with its full basket breakdown nested inside.

### Output example

```json
{
  "country": "egypt",
  "area": "Maadi, Cairo",
  "branchName": "talabat mart New Maadi",
  "currency": "EGP",
  "basketItemsFound": 10,
  "basketItemsRequested": 10,
  "basketTotal": 759.7,
  "isCheapestBranch": true,
  "priceRankAmongLocations": 1,
  "basket": [
    { "keyword": "rice", "matchedTitle": "Zaeem Rice, 1kg", "price": 40.95 },
    { "keyword": "milk", "matchedTitle": "Tom Oat Milk, 1L", "price": 114 }
  ]
}
```

### How matching works, and its limits

Each keyword is matched to the cheapest real product whose title contains every word of that keyword as a whole word (so "tea" never matches inside "steak"), with basic plural handling ("tomato" matches "tomatoes" and back). For common fresh produce, the Actor prefers a match from the Fruit & Veg category over a processed item elsewhere (so "banana" prefers the fruit over banana-flavoured milk, when the fruit is in the scanned categories).

This is a **best-effort keyword match, not a guarantee**. At a given branch, the closest match to your keyword may occasionally be a processed or related product rather than the plain staple, especially if the branch happens to be out of stock on the plain item that day. **Every row shows the exact `matchedTitle` that was priced**, so you can always see precisely what was compared, and drop or override any item that doesn't look right for your use case.

### Coverage and reliability

Talabat Mart requires a delivery location to be set before it shows prices, the same way the real app does. This Actor drives that step the same way a real shopper would, and uses residential proxy by default for consistency. A location that can't be resolved is reported with a clear `status` instead of failing your whole run.

Saudi Arabia and Iraq are not currently included; Talabat Mart's public web presence in KSA wasn't confirmed at build time.

### Legal note

This Actor reads only prices Talabat shows publicly to any visitor, without logging in or placing an order. Prices change frequently and are shown as observed at run time. You are responsible for using the data in line with applicable law and Talabat's terms. This Actor is not affiliated with or endorsed by Talabat or Delivery Hero.

### Questions or a basket item that's not matching well?

Open an issue on the **Issues** tab. Requests for more countries, category filters, or scheduled price-tracking runs are welcome.

# Actor input Schema

## `locations` (type: `array`):

One entry per branch you want priced. `country` must be one of: egypt, uae, ksa, kuwait, qatar, bahrain, oman, jordan, iraq. `area` is any address, mall, or neighbourhood name you'd type into Talabat's own delivery-location search, e.g. "Maadi, Cairo" or "Downtown Dubai".

## `basketItems` (type: `array`):

Product keywords to price at every branch, in English. The cheapest matching product for each keyword is used. Leave the default for a standard staples basket.

## `maxCategoriesToScan` (type: `integer`):

Caps how many grocery subcategories are scanned per branch when looking for basket matches. The most staple-relevant categories (produce, dairy, bakery, meat, pantry, beverages) are always scanned first. 90 covers all of them at a typical branch; lower it for a faster, cheaper run if you only need a few common items.

## `includeFullCatalog` (type: `boolean`):

Also include every product seen while scanning (not just basket matches) inside each branch's result. Useful for broader price research, makes results much larger.

## `proxyConfiguration` (type: `object`):

Talabat Mart works fine straight from Apify's servers, so no proxy is used by default. Only turn one on if you start seeing blocked/stuck requests.

## Actor input object example

```json
{
  "locations": [
    {
      "country": "egypt",
      "area": "Maadi, Cairo"
    },
    {
      "country": "uae",
      "area": "Downtown Dubai"
    }
  ],
  "basketItems": [
    "rice",
    "sunflower oil",
    "sugar",
    "eggs",
    "milk",
    "chicken breast",
    "bread",
    "tea",
    "tomatoes",
    "bananas"
  ],
  "maxCategoriesToScan": 90,
  "includeFullCatalog": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `baskets` (type: `string`):

One row per branch, with the priced basket and cheapest-branch comparison.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "locations": [
        {
            "country": "egypt",
            "area": "Maadi, Cairo"
        },
        {
            "country": "uae",
            "area": "Downtown Dubai"
        }
    ],
    "basketItems": [
        "rice",
        "sunflower oil",
        "sugar",
        "eggs",
        "milk",
        "chicken breast",
        "bread",
        "tea",
        "tomatoes",
        "bananas"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("hebaabdalaziz/talabat-mart-grocery-price-index").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "locations": [
        {
            "country": "egypt",
            "area": "Maadi, Cairo",
        },
        {
            "country": "uae",
            "area": "Downtown Dubai",
        },
    ],
    "basketItems": [
        "rice",
        "sunflower oil",
        "sugar",
        "eggs",
        "milk",
        "chicken breast",
        "bread",
        "tea",
        "tomatoes",
        "bananas",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("hebaabdalaziz/talabat-mart-grocery-price-index").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "locations": [
    {
      "country": "egypt",
      "area": "Maadi, Cairo"
    },
    {
      "country": "uae",
      "area": "Downtown Dubai"
    }
  ],
  "basketItems": [
    "rice",
    "sunflower oil",
    "sugar",
    "eggs",
    "milk",
    "chicken breast",
    "bread",
    "tea",
    "tomatoes",
    "bananas"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call hebaabdalaziz/talabat-mart-grocery-price-index --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,hebaabdalaziz/talabat-mart-grocery-price-index"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/D0oTVHmXFXfoyUdZA/builds/Rlsz6gTE2yQyrOJq0/openapi.json
