# GrabFood Merchant Intelligence (`subimpact/grabfood-merchant-intel`) Actor

Extract GrabFood merchant intelligence: ratings, vote counts, full menus, hours, cuisines, promos. Batch IDs or search by keyword/location across SEA.

- **URL**: https://apify.com/subimpact/grabfood-merchant-intel.md
- **Developed by:** [subimpact](https://apify.com/subimpact) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 1 total users, 1 monthly users, 16.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.00 / 1,000 merchant extracteds

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

## GrabFood Merchant Intelligence

Extract **GrabFood merchant intelligence** — ratings, vote counts, full menus with prices, opening hours, cuisines, and promos — via Grab's guest API. Batch merchant IDs or search by keyword/location.

**Perfect for:** F\&B competitive monitoring, menu tracking, market research, franchise expansion analysis, and AI-ready merchant datasets across Southeast Asia.

### Features

- **Batch merchant detail** — fetch full intelligence for up to hundreds of merchant IDs in one run
- **Keyword search** — find merchants by keyword near any location (KL, SG, Bangkok, Manila, Jakarta...)
- **Full menu extraction** — categories, items, prices, descriptions, images
- **Rating + vote counts** — track rating trends over time
- **Opening hours, cuisines, promos, chain/branch info**
- **Streaming output** — rows appear in the dataset as they're fetched (no all-or-nothing runs)
- **Pay-per-event** — you're charged only for merchants actually delivered

### Input

| Field | Type | Required | Description |
|---|---|---|---|
| `mode` | string | yes | `merchant_ids` or `search` |
| `merchant_ids` | array | for merchant\_ids mode | GrabFood merchant IDs (e.g. `1-CY5FNLDUNXDKCE`) |
| `keyword` | string | for search mode | e.g. `pizza`, `subway`, `nasi lemak` |
| `latlng` | string | for search mode | `lat,lng` (e.g. `3.1390,101.6869` for KL) |
| `country_code` | string | no | `MY` (default), `SG`, `TH`, `PH`, `VN`, `ID`, `KH`, `MM` |
| `max_merchants` | integer | no | Max results in search mode (default 50) |
| `include_menu` | boolean | no | Include full menu in detail (default true) |
| `session_cookie` | string | recommended | Grab session cookie from a logged-in food.grab.com session (see below) |
| `web_app_version` | string | no | `x-grab-web-app-version` header (defaults to a known-good value) |

### Session cookie (recommended)

Grab's guest API requires an authenticated session. Provide a cookie string from a logged-in browser session:

1. Open [food.grab.com](https://food.grab.com) and log in
2. Open DevTools (F12) → Application → Cookies → `https://food.grab.com`
3. Copy the values of `passenger_authn_token` and `grabid-openid-authn-ck`
4. Paste as: `passenger_authn_token=<value>; grabid-openid-authn-ck=<value>`

Cookies expire — refresh them periodically. Without a valid cookie, the API returns 401.

### Output

Each merchant is one dataset row:

```json
{
  "merchant_id": "1-CY5FNLDUNXDKCE",
  "name": "Subway - Axiata Arena Bukit Jalil",
  "cuisine": ["Western", "Sandwich", "Wrap"],
  "rating": 4.5,
  "vote_count": 2365,
  "opening_hours": { "open": true, "displayedHours": "00:00-01:40 09:30-23:59" },
  "address": { ... },
  "menu": [
    {
      "category": "For You",
      "items": [
        { "name": "6-Inch Roasted Chicken", "price": 16.98, "price_display": "RM16.98" }
      ]
    }
  ],
  "source": "merchant_detail"
}
```

Search mode returns lightweight rows (no menu). A final summary row reports counts and the run URL.

### Pricing

- **$4.00 / 1,000 merchants** (pay-per-event, charged per merchant delivered)
- Platform usage (compute) billed separately by Apify

### Notes

- Unofficial — not affiliated with Grab. Use responsibly and respect Grab's terms of service.
- The guest API is rate-limited; the actor uses bounded concurrency (5 workers) to stay safe.
- If you see 401s, refresh your session cookie.

# Actor input Schema

## `mode` (type: `string`):

merchant\_ids: fetch full detail for specific merchant IDs. search: find merchants by keyword near a location.

## `merchant_ids` (type: `array`):

List of GrabFood merchant IDs (e.g. 1-CY5FNLDUNXDKCE). Found in the restaurant URL or via search mode.

## `keyword` (type: `string`):

Keyword to search for (e.g. pizza, subway, nasi lemak). Used in search mode.

## `latlng` (type: `string`):

Search location as 'lat,lng' (e.g. 3.1390,101.6869 for KL). Used in search mode.

## `country_code` (type: `string`):

Country code for the search.

## `max_merchants` (type: `integer`):

Maximum number of merchants to return in search mode.

## `include_menu` (type: `boolean`):

Include the complete menu (categories, items, prices) in merchant detail. Makes responses much larger.

## `session_cookie` (type: `string`):

Optional. A Grab session cookie string (passenger\_authn\_token=...; grabid-openid-authn-ck=...) from a logged-in food.grab.com browser session. Required for reliable access. Without it, the guest API may return 401.

## `web_app_version` (type: `string`):

Optional. The x-grab-web-app-version header value. Defaults to a known-good value.

## Actor input object example

```json
{
  "mode": "merchant_ids",
  "keyword": "food",
  "latlng": "3.1390,101.6869",
  "country_code": "MY",
  "max_merchants": 50,
  "include_menu": true,
  "web_app_version": "KiD91Esa2cUXp_nXkoalT"
}
```

# Actor output Schema

## `merchant_id` (type: `string`):

No description

## `name` (type: `string`):

No description

## `rating` (type: `string`):

No description

## `vote_count` (type: `string`):

No description

## `source` (type: `string`):

No description

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("subimpact/grabfood-merchant-intel").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("subimpact/grabfood-merchant-intel").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 '{}' |
apify call subimpact/grabfood-merchant-intel --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,subimpact/grabfood-merchant-intel"
        }
    }
}

```

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/7fdhyJYiAWwG8Ss4T/builds/y9EqFpYIseboVeaRC/openapi.json
