# Gurunavi Scraper — Japan Restaurants, Budgets & Phones (`youfuxu/gurunavi-japan-restaurants-scraper`) Actor

Scrape Gurunavi (ぐるなび), a major Japanese restaurant directory. Names, genres, lunch/dinner budgets, station access, phone numbers, addresses and opening hours as clean JSON.

- **URL**: https://apify.com/youfuxu/gurunavi-japan-restaurants-scraper.md
- **Developed by:** [Youfu Xu](https://apify.com/youfuxu) (community)
- **Categories:** E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 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/platform/actors/running/actors-in-store#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

## Gurunavi Scraper — Japan restaurants, budgets & phone numbers (ぐるなび)

Pull structured restaurant data from **[Gurunavi / ぐるなび](https://r.gnavi.co.jp)**, one of Japan's largest restaurant directories. Search any cuisine in Japanese or English, filter by area, and export as JSON, CSV or Excel. No login, no browser, no proxy setup.

### What you get

Default run (list only, fast):

```json
{
  "shopNo": "dagvus5r0000",
  "url": "https://r.gnavi.co.jp/dagvus5r0000/",
  "name": "ラーメン 尹善栄の店",
  "genre": "塩ラーメン ラーメン",
  "lunchBudgetYen": null,
  "dinnerBudgetYen": 1000,
  "access": "ＪＲ西日暮里駅 徒歩2分",
  "photoUrls": ["https://rimage.gnst.jp/rest/img/dagvus5r0000/s_0n5o.jpg"],
  "photoCaption": "「透きとおった塩ラーメン」"
}
```

With **Include detail page data** every restaurant also carries the contact block:

```json
{
  "phone": "03-5615-2487",
  "postalCode": "116-0013",
  "addressRegion": "東京都",
  "addressLocality": "荒川区",
  "streetAddress": "西日暮里5-11-1野田ビル1F",
  "cuisine": "ラーメン",
  "priceRange": "￥1,000",
  "openingHours": ["Mo,Tu,We,Th,Fr 11:00-15:00"],
  "amenities": ["カード可", "個室あり"],
  "description": "札幌すすきの名店いそつー姉妹店！…"
}
```

### Who uses this

- **Restaurant-tech & POS sales** — a clean list of independent restaurants by area, with phone numbers, for outreach
- **Food delivery & reservation platforms** — find venues not yet on your platform, by genre and station
- **Market research** — lunch and dinner budgets are structured numbers, so you can chart price levels by ward or by cuisine
- **Travel content & guides** — genre, access from the nearest station, photos and opening hours in one row
- **Location analysis** — cross the address and station fields with your own foot-traffic data

### How to use

1. Enter a **keyword** (`ラーメン`, `sushi`, `焼肉`, `izakaya`) or leave it empty to list everything in the area
2. Set an **area slug** the way Gurunavi writes it: `jp` for all of Japan, or `tokyo`, `osaka`, `kyoto`, `fukuoka`, `hokkaido`, `aichi` …
3. Set **Max restaurants** (Gurunavi pages 30 at a time)
4. Enable **Include detail page data** when you need phone numbers, addresses and opening hours
5. Run, then download from the **Dataset** tab as JSON / CSV / Excel, or fetch through the Apify API

#### Example input

```json
{
  "keyword": "焼肉",
  "prefecture": "osaka",
  "maxItems": 300,
  "includeDetails": true
}
```

### Notes on reliability

- List data comes from the same structured payload Gurunavi's own site renders from, and detail data from the restaurant's schema.org block — both far steadier than scraping styled markup
- Requests are paced with backoff and retries, and results are de-duplicated by shop number across pages, so you never pay twice for the same restaurant
- The Actor stops by itself once Gurunavi stops returning new venues

### Pricing model

You pay per result — a small fee for each restaurant returned. You only pay for rows you actually receive.

### FAQ

**Does it need a proxy?**
No. It runs from Apify's servers without residential proxies.

**Are phone numbers always present?**
They come from the restaurant's own listing, so nearly all member venues publish one. Non-member listings occasionally omit it, in which case the field is empty rather than wrong.

**Can I export a whole city?**
Yes — leave the keyword empty, pick the area slug and raise `maxItems`. The log prints Gurunavi's total match count first, so you can see the size of the job before committing.

**How is this different from a Tabelog scraper?**
Different directory, different venue mix. Gurunavi skews toward member restaurants that publish structured budget and contact details, which makes it the better source when you need phone numbers and price levels rather than user reviews.

# Actor input Schema

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

Free-text search, in Japanese or English, e.g. <code>ラーメン</code> (ramen), <code>sushi</code>, <code>焼肉</code> (yakiniku), <code>izakaya</code>. Leave empty to list everything in the chosen area.

## `prefecture` (type: `string`):

Gurunavi's own area slug: <code>jp</code> (all Japan), <code>tokyo</code>, <code>osaka</code>, <code>kyoto</code>, <code>hokkaido</code>, <code>fukuoka</code>, <code>aichi</code> …

## `maxItems` (type: `integer`):

Maximum number of restaurants to return (Gurunavi pages 30 at a time).

## `includeDetails` (type: `boolean`):

Visit each restaurant page to add the phone number, full address with postcode, opening hours, amenities and description. One extra request per restaurant, so it is slower — but this is what makes the dataset usable for outreach.

## Actor input object example

```json
{
  "keyword": "ラーメン",
  "prefecture": "tokyo",
  "maxItems": 60,
  "includeDetails": false
}
```

# 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 = {
    "keyword": "ラーメン",
    "prefecture": "tokyo",
    "maxItems": 60
};

// Run the Actor and wait for it to finish
const run = await client.actor("youfuxu/gurunavi-japan-restaurants-scraper").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 = {
    "keyword": "ラーメン",
    "prefecture": "tokyo",
    "maxItems": 60,
}

# Run the Actor and wait for it to finish
run = client.actor("youfuxu/gurunavi-japan-restaurants-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "keyword": "ラーメン",
  "prefecture": "tokyo",
  "maxItems": 60
}' |
apify call youfuxu/gurunavi-japan-restaurants-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=youfuxu/gurunavi-japan-restaurants-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Gurunavi Scraper — Japan Restaurants, Budgets & Phones",
        "description": "Scrape Gurunavi (ぐるなび), a major Japanese restaurant directory. Names, genres, lunch/dinner budgets, station access, phone numbers, addresses and opening hours as clean JSON.",
        "version": "1.0",
        "x-build-id": "2lpvXlUh8cIPUNIFX"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/youfuxu~gurunavi-japan-restaurants-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-youfuxu-gurunavi-japan-restaurants-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/youfuxu~gurunavi-japan-restaurants-scraper/runs": {
            "post": {
                "operationId": "runs-sync-youfuxu-gurunavi-japan-restaurants-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/youfuxu~gurunavi-japan-restaurants-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-youfuxu-gurunavi-japan-restaurants-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "keyword": {
                        "title": "Search keyword",
                        "type": "string",
                        "description": "Free-text search, in Japanese or English, e.g. <code>ラーメン</code> (ramen), <code>sushi</code>, <code>焼肉</code> (yakiniku), <code>izakaya</code>. Leave empty to list everything in the chosen area.",
                        "default": ""
                    },
                    "prefecture": {
                        "title": "Area slug",
                        "type": "string",
                        "description": "Gurunavi's own area slug: <code>jp</code> (all Japan), <code>tokyo</code>, <code>osaka</code>, <code>kyoto</code>, <code>hokkaido</code>, <code>fukuoka</code>, <code>aichi</code> …",
                        "default": "jp"
                    },
                    "maxItems": {
                        "title": "Max restaurants",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of restaurants to return (Gurunavi pages 30 at a time).",
                        "default": 60
                    },
                    "includeDetails": {
                        "title": "Include detail page data",
                        "type": "boolean",
                        "description": "Visit each restaurant page to add the phone number, full address with postcode, opening hours, amenities and description. One extra request per restaurant, so it is slower — but this is what makes the dataset usable for outreach.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
