# Vrisko Scraper - Greek Business Directory (vrisko.gr) (`crawlerbros/vrisko-scraper`) Actor

Scrape vrisko.gr, Greece's leading business directory. Search by category/keyword and city/region, or fetch full business profiles by URL. Get names, addresses, phone numbers, emails, websites, ratings, reviews, opening hours, and social links.

- **URL**: https://apify.com/crawlerbros/vrisko-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, Lead generation, Other
- **Stats:** 1 total users, 0 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 and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Vrisko Scraper - Greek Business Directory (vrisko.gr)

Scrape **vrisko.gr** — Greece's leading business directory. Search any business category or brand/company name in any Greek city or region and get names, addresses, phone numbers, and locations. Optionally follow through to each business's full profile page for ratings, reviews, opening hours, operating months, website, and social links. No login, no cookies, no API key required.

### What this actor does

- **Two modes:** `search` (category/keyword + city/region) and `detail` (direct business profile URLs)
- **55+ curated categories** to pick from, or type any custom category/keyword — vrisko.gr matches free text like a keyword search, including business and brand names
- **44 curated cities and regions** across Greece, or type any custom location — both Greek-script (`Αθήνα`) and Latin-transliterated (`Athina`) place names work
- **Full Greek-alphabet support** — both input and output correctly handle Greek script (names, addresses, descriptions) with no encoding issues
- **Sort by** relevance, rating, name (A-Z), or review count
- **Filter by** minimum rating, minimum review count, requires-website, requires-phone
- **Rich business profiles** — ratings, individual written reviews, opening hours, operating months (useful for seasonal island/resort businesses), own website, Facebook/Instagram/LinkedIn/Twitter/YouTube/TikTok/Pinterest links, photo gallery
- **Empty fields are omitted** — you only ever see fields that were actually found for a business

### Output per business

- `name` — business name
- `businessType` — the specific business category schema.org type vrisko.gr assigned (e.g. `Restaurant`, `Hotel`, `LocalBusiness`)
- `category` — primary listed category, `categories[]` — all categories/tags shown on the profile page (when profile fetched)
- `profession` — business's own tagline/description line shown under its name (when profile fetched)
- `description` — full business description
- `street`, `city`, `region`, `postalCode`, `country`
- `latitude`, `longitude` — GPS coordinates
- `phone`, `phones[]` — primary and all listed phone numbers
- `email`, `website`
- `rating`, `reviewCount`, `ratingScaleMax` — average star rating and total written reviews (when profile fetched; only present once a business has at least one review)
- `reviews[]` — individual written reviews (`author`, `date`, `rating`, `text`; when profile fetched — `text` is only present for reviews that included written comments)
- `productsAndServices[]` — the business's own menu/services/product list, when it has published one (when profile fetched)
- `openingHours[]` — opening-hours lines exactly as vrisko.gr publishes them (when profile fetched)
- `operatingMonths[]` — months of the year the business operates, useful for seasonal tourist-area businesses (when profile fetched)
- `logoUrl`, `images[]` — business logo and photo gallery (when profile fetched)
- `facebookUrl`, `instagramUrl`, `linkedinUrl`, `twitterUrl`, `youtubeUrl`, `tiktokUrl`, `pinterestUrl` — social links the business has published (when profile fetched)
- `searchCategory`, `searchLocation` — the search parameters used (mode=search)
- `sourceUrl` — canonical vrisko.gr profile URL for the business
- `businessId` — vrisko.gr's internal listing identifier
- `recordType: "business"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string (select) | `search` | `search` (category + city/region) or `detail` (fetch by URL) |
| `category` | string (select) | `estiatoria` | Pick a common category, or `custom` to use `customCategory` (mode=search) |
| `customCategory` | string | – | Any free-text category, brand name, or keyword; overrides `category` (mode=search) |
| `location` | string (select) | `athina` | Pick a common Greek city/region, or `custom` to use `customLocation` (mode=search) |
| `customLocation` | string | – | Any free-text Greek city, town, or region; overrides `location` (mode=search) |
| `sortBy` | string (select) | `relevance` | `relevance` / `rating` / `name` (A-Z) / `reviewCount` — applied client-side across the fetched batch |
| `minRating` | integer | `0` (no minimum) | Only return businesses rated at least 1-5 stars |
| `minReviewCount` | integer | `0` (no minimum) | Only return businesses with at least this many written reviews |
| `requireWebsite` | boolean | `false` | Only return businesses with a listed website |
| `requirePhone` | boolean | `false` | Only return businesses with a listed phone number |
| `fetchDetails` | boolean | `false` | Also visit each business's profile page for rating, reviews, hours, website, social links (slower) |
| `businessUrls` | array | – | vrisko.gr profile URLs to fetch directly (mode=detail) |
| `maxItems` | int | `20` | Hard cap on returned records (1-1000) |

#### Example: search restaurants in Athens

```json
{
  "mode": "search",
  "category": "estiatoria",
  "location": "athina",
  "maxItems": 20
}
```

#### Example: highest-rated dentists in Thessaloniki, with full profiles

```json
{
  "mode": "search",
  "category": "odontiatroi",
  "location": "thessaloniki",
  "sortBy": "rating",
  "fetchDetails": true,
  "maxItems": 30
}
```

#### Example: hotels with at least 5 reviews across all of Crete

```json
{
  "mode": "search",
  "category": "ksenodoxeia",
  "location": "kriti",
  "fetchDetails": true,
  "minReviewCount": 5,
  "maxItems": 50
}
```

#### Example: search a custom Greek-script keyword and location

```json
{
  "mode": "search",
  "customCategory": "κομμωτήριο",
  "customLocation": "Ζάκυνθος",
  "maxItems": 20
}
```

#### Example: fetch specific business profiles

```json
{
  "mode": "detail",
  "businessUrls": [
    { "url": "https://www.vrisko.gr/advdetails/1d_57hc3_d2a0ea64b7h6_715caa2k_j6ja_d75h5j34c61_2f214ha00e136215" }
  ]
}
```

### Use cases

- **Local lead generation** — build a prospect list of Greek businesses by trade and city/region for B2B outreach
- **Market research** — measure business density and average ratings for a category across Greek regions
- **Directory aggregation** — feed structured Greek business data into your own local-search product
- **Competitor mapping** — see who else operates in a category and area, with ratings and contact info
- **Tourism & hospitality analysis** — evaluate hotel/restaurant coverage and seasonal operating patterns across Greek islands and resort towns

### Limitations

- **Ratings, reviews, opening hours, website, and social links require `fetchDetails: true` (or `mode: detail`).** vrisko.gr only publishes this richer data on each business's own profile page, not on the search-results listing page. Enabling `fetchDetails` adds one extra request per result.
- **`sortBy` is applied client-side.** vrisko.gr's search-results pages don't expose a server-side sort parameter, so `rating`/`name`/`reviewCount` sorting is applied across the batch of records this run actually fetched, not the entire category.
- **`minRating`, `minReviewCount`, and `requireWebsite` only take effect with `fetchDetails: true` in search mode** (or always in `detail` mode), since the underlying fields aren't available from the search listing alone.
- **No structured day-by-day opening-hours schema.** vrisko.gr publishes opening hours as free-text lines (e.g. `"Δευτέρα έως Σάββατο από 13:00 έως 01:00"`, i.e. "Monday to Saturday from 13:00 to 01:00"), not a machine-parsed per-day schedule, so `openingHours[]` is returned as-is rather than split into individual day/open/close fields that could silently misparse Greek day-range phrasing.
- **Some broad category + region combinations return fewer results than `maxItems`.** For very broad searches (e.g. a common category across an entire multi-city region), vrisko.gr's own search index only returns a bounded number of unique listings before its pagination runs dry — the actor always returns every genuinely available result rather than silently under-fetching; it will never return fewer records than the category/region combination actually has. Narrower city-level searches typically have deeper result sets.
- **`website` mirrors vrisko.gr's own listed value verbatim.** A small fraction of businesses list a website domain on their vrisko.gr profile that has since expired or gone offline — this is an upstream data-quality characteristic, not a scraping error, since the actor cannot verify third-party domain liveness without adding a costly extra request per record.

### FAQ

**What data source does this actor use?**
It reads the publicly available search and business-profile pages on vrisko.gr, Greece's leading business directory. No account or API key is needed.

**Is this affiliated with vrisko.gr?**
No. This is an independent, third-party actor that reads publicly accessible pages.

**Why do some businesses have no rating or reviews?**
vrisko.gr only shows a rating and review count once a business has received at least one review. Fields with no data are simply omitted from the record rather than shown as empty or null.

**Can I search using Greek script directly?**
Yes — both `category`/`location` and their `custom*` free-text overrides accept Greek-script text directly (e.g. `"καφετέρια"`, `"Θεσσαλονίκη"`) as well as Latin transliterations (`"kafeteries"`, `"thessaloniki"`) — vrisko.gr's search accepts both equally.

**Can I search a whole region instead of a single city?**
Yes — set `location` to any of the curated Greek regions (e.g. `"attiki"`, `"kriti"`, `"peloponnisos"`) or type a region name into `customLocation`.

**Can I search by a company/brand name instead of a category?**
Yes — vrisko.gr's category field doubles as a keyword search, so business and brand names (e.g. a national chain) work the same way a category does.

**Does this actor need a proxy or login?**
No — the actor runs entirely on Apify's free plan with no login and no credentials. It uses browser-TLS impersonation to read vrisko.gr's public pages and only falls back to Apify's free datacenter proxy pool if a run happens to be temporarily rate-limited.

**Why is `fetchDetails` off by default?**
Fetching each business's full profile page requires one extra request per result, which is slower. Turn it on when you need ratings, reviews, opening hours, operating months, website, or social links.

# Actor input Schema

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

What to fetch: search a category + city/region, or fetch full business profiles from direct vrisko.gr URLs.

## `category` (type: `string`):

Business category or keyword to search for (also matches business/brand names, e.g. a chain name). Pick a common category, or choose 'Custom category' and type your own below (mode=search).

## `customCategory` (type: `string`):

Free-text category, business type, or brand/company name not in the curated list above, e.g. 'κομμωτήριο' or 'Goodys' (mode=search). Takes priority over 'Category' when set. Both Greek-script and Latin-transliterated terms work.

## `location` (type: `string`):

Greek city, town, or region/prefecture to search in. Pick a common one, or choose 'Custom location' and type your own below (mode=search).

## `customLocation` (type: `string`):

Free-text Greek city, town, or region not in the curated list above, e.g. 'Ναύπλιο' or 'Ζάκυνθος' (mode=search). Takes priority over 'City or region' when set. Both Greek-script and Latin-transliterated terms work.

## `sortBy` (type: `string`):

How to order search results after fetching (mode=search). vrisko.gr itself only returns relevance order, so 'rating', 'name', and 'reviewCount' are applied client-side across the fetched batch. Rating/reviewCount sorting only makes sense with 'Fetch full business profiles' enabled, since ratings are only published on business profile pages.

## `minRating` (type: `integer`):

Only return businesses rated at least this many stars, e.g. 4 for 4.0+ (mode=search with fetchDetails=true, or mode=detail). 0 means no minimum. Ratings are only published on business profile pages, so this filter requires 'Fetch full business profiles' to be effective in search mode.

## `minReviewCount` (type: `integer`):

Only return businesses with at least this many written reviews (mode=search with fetchDetails=true, or mode=detail). 0 means no minimum.

## `requireWebsite` (type: `boolean`):

Only return businesses that have a website listed. Websites are only published on business profile pages, so this filter requires 'Fetch full business profiles' to be effective in search mode.

## `requirePhone` (type: `boolean`):

Only return businesses that have a phone number listed.

## `fetchDetails` (type: `boolean`):

For each search result, also visit its business profile page to collect rating, review count, individual reviews, precise opening hours, operating months, own website, social links, and additional photos. Slower -- one extra request per result (mode=search).

## `businessUrls` (type: `array`):

Direct vrisko.gr business profile URLs to fetch, e.g. https://www.vrisko.gr/advdetails/<id>. Use the 'sourceUrl' field from search results.

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

Hard cap on the number of business records to return.

## Actor input object example

```json
{
  "mode": "search",
  "category": "estiatoria",
  "location": "athina",
  "sortBy": "relevance",
  "minRating": 0,
  "minReviewCount": 0,
  "requireWebsite": false,
  "requirePhone": false,
  "fetchDetails": false,
  "businessUrls": [],
  "maxItems": 20
}
```

# Actor output Schema

## `businesses` (type: `string`):

Dataset containing all scraped vrisko.gr business listings.

# 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 = {
    "mode": "search",
    "category": "estiatoria",
    "location": "athina",
    "sortBy": "relevance",
    "minRating": 0,
    "minReviewCount": 0,
    "requireWebsite": false,
    "requirePhone": false,
    "fetchDetails": false,
    "businessUrls": [],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/vrisko-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 = {
    "mode": "search",
    "category": "estiatoria",
    "location": "athina",
    "sortBy": "relevance",
    "minRating": 0,
    "minReviewCount": 0,
    "requireWebsite": False,
    "requirePhone": False,
    "fetchDetails": False,
    "businessUrls": [],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/vrisko-scraper").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 '{
  "mode": "search",
  "category": "estiatoria",
  "location": "athina",
  "sortBy": "relevance",
  "minRating": 0,
  "minReviewCount": 0,
  "requireWebsite": false,
  "requirePhone": false,
  "fetchDetails": false,
  "businessUrls": [],
  "maxItems": 20
}' |
apify call crawlerbros/vrisko-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/vrisko-scraper"
        }
    }
}

```

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/2d1Em4oM08IndWAVX/builds/rP6cfIMAEbbtIw0EV/openapi.json
