# Fresha Scraper: Salons, Spas & Clinics with Prices (`cprussin/fresha-venues`) Actor

Scrape Fresha salons, barbers, spas, nail and aesthetics clinics by country and city: address, geo, phone, rating, review count, opening hours and services with prices and durations. Only what the venue publishes. No login. $4 per 1,000 venues.

- **URL**: https://apify.com/cprussin/fresha-venues.md
- **Developed by:** [Connor Prussin](https://apify.com/cprussin) (community)
- **Categories:** Lead generation, Business
- **Security:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 90.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 venues

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Fresha Scraper: Salons, Spas & Clinics with Prices

**Fresha Scraper** exports hair salons, barbershops, nail salons, spas, massage studios and aesthetics clinics from [Fresha](https://www.fresha.com) as clean JSON, CSV or Excel. It reads Fresha's public venue sitemaps and venue pages, with no login, no API key and no browser:

- ✅ **Any Fresha country**: UK, US, Australia, Canada, Ireland, UAE, Netherlands, Germany, South Africa and 190 more, optionally filtered to one city.
- ✅ **Contact and location**: venue name, business type, phone, street, city, region, postal code, country, latitude/longitude.
- ✅ **Reputation**: average rating and review count.
- ✅ **Services and prices**: every service with category, price (or from/to prices), currency and duration in minutes, plus the venue's price range.
- ✅ **Opening hours**, website, Instagram and Facebook, amenities, neighbourhoods served and a photo.
- ✅ **GDPR-friendly**: only what the venue publishes on its own Fresha page. No reviewer names, no review texts, no staff.
- ✅ Light and polite: plain HTTP, sitemaps streamed (not downloaded whole), respects robots.txt and never touches Fresha search.

### Start in one minute

Click **Start** with the prefilled input:

```json
{
  "countryCode": "gb",
  "cityFilter": "London",
  "maxItems": 10
}
```

You get: 10 London venues with `name`, `businessTypes`, `phone`, `address`, `postalCode`, `rating`, `reviewCount`, `openingHours` and `services` (name, price, duration).

**Cost:** $0.04: 10 venues × $0.004, plus the $0.00005 actor-start fee.

### Use with an AI assistant

Connect the [Apify MCP server](https://mcp.apify.com) to Claude, ChatGPT, Cursor or any MCP client (`https://mcp.apify.com?tools=cprussin/fresha-venues` loads only this actor), then paste:

```text
Use the Apify actor cprussin/fresha-venues to get 20 Fresha venues in Dubai (countryCode ae, cityFilter Dubai) and list name, type, phone, rating and the cheapest service price.
```

### Recipes

#### Salon lead list for one city

```json
{
  "countryCode": "au",
  "cityFilter": "Sydney",
  "maxItems": 500
}
```

#### A whole country

```json
{
  "countryCode": "ie",
  "maxItems": 2000
}
```

#### Specific venues (price monitoring)

Schedule it daily or weekly to track service prices and ratings.

```json
{
  "venueUrls": [
    "https://www.fresha.com/a/the-floating-spa-birmingham-23-24-hall-street-sn4l8c7f",
    "https://www.fresha.com/a/rockabelles-northampton-4-dychurch-lane-dc2jts1o"
  ]
}
```

### Who uses Fresha data?

- **B2B sales teams**: build lead lists of salons, spas and clinics (products, software, payments, insurance) with phone, address and rating.
- **Salon and spa owners**: compare service menus, prices and ratings of competitors in your area.
- **Beauty brands and distributors**: find well-rated venues by type and city.
- **Market researchers**: map the beauty and wellness market and price levels across cities and countries.
- **AI agents**: give an LLM live salon data and prices through the Apify API or MCP server.

### How does the Fresha scraper work?

1. It reads Fresha's venue sitemap index (`sitemaps.fresha.com/www/sitemap-salons.xml`) and streams the sitemap of your country, URL by URL.
2. With a city, it keeps venue URLs that name the city, then checks the venue's address; venues elsewhere are skipped and not billed.
3. It opens each venue page (`fresha.com/a/<venue>`) and reads the venue's own structured data (schema.org JSON-LD and page data).
4. It stops as soon as it has `maxItems` venues.

### How do I choose which Fresha venues to scrape?

| Field         | Description                                            | Example                                      |
| ------------- | ------------------------------------------------------ | -------------------------------------------- |
| `countryCode` | Two-letter ISO country code                            | `"gb"`                                       |
| `cityFilter`  | City name (matched on the venue URL, then the address) | `"Manchester"`                               |
| `venueUrls`   | Fresha venue pages                                     | `["https://www.fresha.com/a/some-venue-id"]` |
| `maxItems`    | Max venues in total                                    | `1000`                                       |

- Sitemap order isn't a ranking: a city's venues come in the order Fresha lists them.
- Cities are matched on the venue's locality: `London` doesn't match "London Road, Brighton".

### What data do you get for each Fresha venue?

```json
{
  "venueId": "998",
  "name": "The Floating Spa",
  "url": "https://www.fresha.com/a/the-floating-spa-birmingham-23-24-hall-street-sn4l8c7f",
  "businessTypes": ["DaySpa"],
  "description": "From the moment you arrive, The Floating Spa creates a sense of serenity...",
  "phone": "+44 121 448 7977",
  "address": "23-24 Hall Street",
  "city": "Birmingham",
  "region": "England",
  "postalCode": "B18 6BS",
  "country": "GB",
  "latitude": 52.4877,
  "longitude": -1.9086,
  "rating": 5,
  "reviewCount": 637,
  "priceRange": "GBP 75-400",
  "currency": "GBP",
  "openingHours": [{ "day": "Monday", "open": "10:00", "close": "19:00" }],
  "services": [
    {
      "name": "Float 1 hour - Room 1",
      "category": "Float",
      "price": 75,
      "priceFrom": null,
      "priceTo": null,
      "currency": "GBP",
      "durationMinutes": 60,
      "description": "Full induction will be provided for your first visit"
    }
  ],
  "serviceCount": 5,
  "website": "http://www.thefloatingspa.com/",
  "instagramUrl": "https://www.instagram.com/thefloatingspa/",
  "facebookUrl": "https://www.facebook.com/thefloatingspa/",
  "otherLinks": [],
  "imageUrl": "https://images.fresha.com/locations/location-profile-images/901/112004/623776c2-27ad-4015-81ba-15439ad3138f.jpg?class=venue-gallery-small",
  "amenities": ["Instant confirmation"],
  "neighborhoods": ["Jewellery Quarter", "Hockley"],
  "isBookable": true,
  "scrapedAt": "2026-10-29T15:30:00.000Z"
}
```

### How much does it cost to scrape Fresha?

Pay-per-event, only for venues written to your dataset:

| Event | Price      |
| ----- | ---------- |
| Venue | **$0.004** |

That's **$4 per 1,000 venues**, services and hours included. Venues skipped by the city filter are free. If you set a **maximum cost per run**, the actor stops cleanly when it reaches it.

### Fresha scraper FAQ

**Is this an official Fresha API?** No. It reads Fresha's public sitemaps and venue pages, within its robots.txt (Fresha search is never used).

**Is the data GDPR-compliant?** The actor returns only business information each venue publishes on its own Fresha page (name, business phone, address, services, hours). It never returns reviewer names, review texts or staff. Many venues are sole traders, so their business details can still be personal data under GDPR: you are responsible for a lawful basis and for honoring opt-outs when you use them (e.g. for marketing).

**Why is a field `null`?** Venues fill in what they want: new venues have no rating yet, some don't list a phone or website.

**How long does a whole country take?** Large countries (UK, US) have tens of thousands of venues: about one second per venue page, a few in parallel. Use `maxItems` or a city to keep runs short.

**Disclaimer:** This actor is not affiliated with, endorsed by or sponsored by Fresha. Fresha is a trademark of its owner. You are responsible for complying with Fresha's terms and applicable laws when using the data.

### Related actors

- [Impressum Extractor](https://apify.com/cprussin/impressum-extractor?fpr=to54nm): company data from DACH legal notices.
- [New Business Registrations](https://apify.com/cprussin/new-business-registrations?fpr=to54nm): newly registered LLCs and corporations from official state registries.
- [Eventbrite Events Scraper](https://apify.com/cprussin/eventbrite-events?fpr=to54nm): Eventbrite events by city, category and date, with venues and prices.

# Actor input Schema

## `countryCode` (type: `string`):

Two-letter ISO country code: <code>gb</code>, <code>us</code>, <code>au</code>, <code>ca</code>, <code>ie</code>, <code>ae</code>, <code>nl</code>, <code>de</code>, <code>za</code>, ... The actor walks Fresha's venue sitemap for that country.

## `cityFilter` (type: `string`):

Optional city, e.g. <code>London</code>, <code>Manchester</code>, <code>Dubai</code>, <code>Sydney</code>. Matched against the venue URL and then its address (venues elsewhere are skipped and not billed). Empty: the whole country.

## `venueUrls` (type: `array`):

Optional Fresha venue pages, e.g. <code>https://www.fresha.com/a/the-floating-spa-birmingham-23-24-hall-street-sn4l8c7f</code>.

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

Stop after this many venues in total. Each venue is billed as one event.

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

Not needed: Fresha answers direct requests. With Apify Proxy, venue pages fall back to direct requests if the proxy keeps failing.

## Actor input object example

```json
{
  "countryCode": "gb",
  "cityFilter": "London",
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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 = {
    "countryCode": "gb",
    "cityFilter": "London",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("cprussin/fresha-venues").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 = {
    "countryCode": "gb",
    "cityFilter": "London",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("cprussin/fresha-venues").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 '{
  "countryCode": "gb",
  "cityFilter": "London",
  "maxItems": 10
}' |
apify call cprussin/fresha-venues --silent --output-dataset

```

## MCP server setup

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

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/KIjabYV3xnGwuT2Ig/builds/eJZFLX5aR1XEXfm3r/openapi.json
