# Fresha Scraper API Salon Leads, Services & Prices (`lofomachines/fresha-scraper-api`) Actor

Find Fresha salons, spas, barbers and beauty businesses. Export public contacts, service prices, ratings, hours, teams and review samples for prospecting and market research. No Fresha login needed.

- **URL**: https://apify.com/lofomachines/fresha-scraper-api.md
- **Developed by:** [Lofomachines](https://apify.com/lofomachines) (community)
- **Categories:** Lead generation, E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

### What does Fresha Scraper do?

**Turn Fresha salons, spas and beauty businesses into a practical prospecting and market research dataset.** Find businesses by city and category, or add Fresha URLs, then export public phone numbers, websites, addresses, ratings, service prices, opening hours and team information. Optional review samples add useful customer feedback to your research.

This **Fresha scraper** helps beauty suppliers, salon software companies, marketing agencies and researchers spend less time copying listings and more time identifying opportunities. **No Fresha account, login, cookies or external API key is required.** Run from a simple form, download your results, or connect them to your existing workflow with Apify scheduling, integrations and API access.

Try it with **London → United Kingdom → Hair salons → 20 businesses**.

### Why use Fresha Scraper for salon and spa research?

- **Build useful business lead lists.** Keep public contact details, location, business category and Fresha URL together.
- **Compare services and prices.** Review treatment names, starting prices, currencies, durations and available service options.
- **Research different beauty markets.** Cover hair salons, barbers, nail salons, spas, massage businesses, lash studios, waxing salons and aesthetics businesses.
- **Work with consistent records.** One row represents one unique Fresha business URL. Repeat appearances are removed within the run.
- **Choose your scope.** Start with a small sample or request up to 10,000 businesses across your selections.
- **Understand data availability.** Missing values stay empty, and returned service and review counts are separate from published totals.

### Practical use cases

#### Salon lead generation for beauty suppliers

Find salons in your sales territories. Segment prospects by category, treatment menu and location, then review their public business contact channels before planning outreach. Useful for haircare distributors, nail product brands and professional equipment suppliers.

#### Prospecting for salon software and marketing services

Build a list of beauty businesses for account research. Compare public websites, social profiles, team information and review volume to prioritize the businesses most relevant to your offer.

#### Competitor service-price comparisons

Compare haircuts, colouring, manicures, lash treatments, massage and other services across selected businesses. Keep currencies, starting-price labels and durations alongside prices for a fairer comparison.

#### Beauty market research and territory planning

Explore businesses in several cities or specific Fresha neighborhoods. Use addresses and coordinates in a spreadsheet or mapping dashboard to assess the available local business landscape.

#### Scheduled business and pricing monitoring

Save a selection of Fresha business URLs and run it weekly or monthly. Compare exports using `url` as the business key and `scrapedAt` as the observation date to identify changes in prices, ratings or contact information.

#### Review research and AI-assisted analysis

Include available review samples to explore service feedback and recurring themes. Send review text to your preferred analysis workflow, and keep the sample size visible. Review samples are not a representative survey or a full review history.

### How to scrape Fresha businesses without coding

1. Click **Try for free** or **Start**.
2. Enter one or more **Cities**, then choose their **Country** and **Business category**. Alternatively, paste public **Fresha URLs** and clear Cities.
3. Set **Maximum businesses**. Start with 20 to check the result format.
4. Enable **Include review samples** if you need customer feedback.
5. Start the run and open **Output**. Use Overview, Business contacts, Services and prices, or Review samples.
6. Download the dataset in formats such as **JSON, HTML, CSV or Excel**, or connect it to your workflow.

### Input examples

The Input tab provides a form with six simple fields:

| Field | What to enter |
|---|---|
| `cities` | City names, one per line. Leave empty for a URL-only run. |
| `country` | Country for your cities. Default: United Kingdom (`GB`). |
| `category` | Business type for city searches. Default: hair salons. |
| `startUrls` | Optional public Fresha business, category or treatment URLs. |
| `maxResults` | Total maximum unique businesses for the entire run. Default: 100; maximum: 10,000. |
| `includeReviews` | Include available public review samples. Default: false. |

#### Find London hair salons

```json
{
  "cities": ["London"],
  "country": "GB",
  "category": "hair-salons",
  "maxResults": 20,
  "includeReviews": false
}
```

#### Compare nail salons in two Australian cities

```json
{
  "cities": ["Sydney", "Melbourne"],
  "country": "AU",
  "category": "nail-salons",
  "maxResults": 100
}
```

#### Research a Dubai category with review samples

```json
{
  "startUrls": [
    { "url": "https://www.fresha.com/lp/en/bt/nail-salons/in/ae-dubai" }
  ],
  "maxResults": 20,
  "includeReviews": true
}
```

You can also paste individual Fresha business URLs. City and URL selections are combined when both are supplied. The result limit applies to the whole run, not to each city. Results are not guaranteed to be evenly distributed between selections.

### What data does the Fresha scraper return?

Each dataset item represents a business. Here is an **illustrative, shortened output example**; values are examples, not a current business listing:

```json
{
  "schemaVersion": "1.0",
  "businessId": "example-123",
  "name": "Example Hair Studio",
  "url": "https://www.fresha.com/a/example-hair-studio",
  "profileType": "bookable",
  "category": "Hair Salon",
  "city": "London",
  "countryCode": "GB",
  "phone": null,
  "website": "https://example.com/",
  "rating": 4.8,
  "reviewCount": 240,
  "currency": "GBP",
  "serviceCount": 12,
  "servicesReturned": 1,
  "services": [
    {
      "serviceId": "example-service-1",
      "name": "Cut and finish",
      "category": "Haircuts",
      "price": 45,
      "currency": "GBP",
      "priceType": "STARTS_AT",
      "durationMinMinutes": 45,
      "durationMaxMinutes": 60
    }
  ],
  "reviewsReturned": 0,
  "reviews": [],
  "dataQuality": {
    "servicesComplete": null,
    "reviewsAreSample": false,
    "reviewsRequested": false,
    "missingFields": ["phone"]
  },
  "scrapedAt": "2026-09-25T12:00:00.000Z"
}
```

#### Dataset field guide

| Data group | Main fields | How to use it |
|---|---|---|
| Business identity | `businessId`, `name`, `businessName`, `url`, `profileType`, `category`, `description` | Identify and segment businesses. Use `url` as the unique key. |
| Public contacts | `phone`, `website`, `instagram`, `facebook` | Research business contact channels. Availability varies. |
| Location | `address`, `street`, `city`, `region`, `postalCode`, `countryCode`, `neighborhood`, `latitude`, `longitude`, `mapsUrl` | Build territory lists and map available listings. |
| Ratings | `rating`, `reviewCount` | Compare published reputation indicators. |
| Prices | `currency`, `priceMin`, `priceMax`, `priceRangeText` | Summarize available pricing with currency context. |
| Service menu | `services`, `serviceCategories`, `serviceCount`, `servicesReturned` | Compare service names, prices, durations and options. |
| Business details | `openingHours`, `amenities`, `team`, `teamMembersReturned` | Understand hours, facilities and public team information. |
| Business features | `isBookable`, `isFreshaVerified`, `hasDeals`, `hasGiftCards`, `hasMemberships` | Review published features when available. |
| Images | `imageUrl`, `imageUrls` | Reference available business photos. |
| Review samples | `reviews`, `reviewsReturned` | Review available text, ratings, dates and public business replies. |
| Quality and freshness | `dataQuality`, `scrapedAt`, `schemaVersion` | Track missing fields, completeness and observation dates. |

**Export tip:** Overview and Business contacts are convenient for spreadsheets. Use JSON when you want the complete nested service, variant, team and review records. The Services and prices view expands available services for easier inspection.

#### How to interpret missing data and prices

Unavailable scalar fields are `null`; unavailable lists are empty arrays. Contact details are not guaranteed for every business. Generic social-network homepages are excluded from profile fields.

`serviceCount` is the published total when available; `servicesReturned` is what you received. `dataQuality.servicesComplete` is true only when these totals match; otherwise completeness is unverified. Directory-only listings can have fewer details and may list treatments without prices.

`price` can be a **starting price**: check `priceType` and `priceText`. Variant prices retain their displayed wording in `priceText`. Minimum and maximum summaries use the published range when available; otherwise they summarize returned service prices and may not cover all options. Always compare businesses in the same currency. Hours are in the business's local time and may not reflect holiday exceptions.

### Connect Fresha data to n8n, Make, Zapier and your CRM

- **n8n:** Run a saved city selection, wait for completion, then add business records to Google Sheets or your CRM.
- **Make:** Schedule a weekly business export and match records by Fresha URL before updating Airtable.
- **Zapier:** Trigger a workflow when an Apify run succeeds, then route results to your spreadsheet or sales tools.
- **Business intelligence:** Import location, category and pricing fields into Power BI or Looker Studio through your data pipeline.
- **AI assistants:** Use structured JSON through the Apify API or Apify MCP to support research and summarization with dated business records.

Use Apify schedules for recurring runs and webhooks for completion notifications. Integrations with other services may require their own accounts.

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

Check this Actor's **Pricing** tab for current charges and your Apify plan for platform usage. Start with 20 businesses, inspect the run's actual cost, and increase the limit once the data meets your needs. Costs and completion times depend on availability, selected locations and the number of businesses returned; no fixed speed or cheapest-price guarantee is implied.

### Tips for better results

- Start with a small city or a specific category before expanding your research.
- Use a public Fresha neighborhood or treatment URL for a more focused selection.
- If a city name is not found, use the exact category URL shown on Fresha.
- For repeated monitoring, save the business URLs you want to track.
- Check the **Run summary** for unavailable selections or partial results.
- A higher maximum allows more results; it does not guarantee that many listings or exhaustive city coverage. Fresha may include nearby businesses in a selected area's results.

### Frequently asked questions

#### Do I need a Fresha login?

No. This Actor works with available public business information. You need an Apify account to run it on the platform.

#### Can I scrape multiple cities?

Yes. Supply city names in one country per run, or combine Fresha URLs from different countries. Use separate runs if you need a specific number of results from every city.

#### Can I export every review?

No. This Actor returns optional **available review samples**, not full review history. Samples are not guaranteed to be the newest reviews. Overall rating and review totals are separate fields. Reviewer names are omitted.

#### Does this include phone numbers and emails?

It includes public business phone numbers and website/social links when available. Email enrichment is not included. You can use the related Website Contact Extractor for further business-website research.

#### Are all businesses currently bookable?

No. `profileType` distinguishes standard Fresha profiles from directory listings; `isBookable` reports availability when published. Appointment slots are not included.

#### Which links can I use?

Public Fresha business, category, neighborhood and treatment pages. Search results, booking checkout, customer accounts and private links are not supported.

#### Can I use the data in spreadsheets or AI workflows?

Yes. Export CSV or Excel for business analysis and JSON for nested records. Use the Fresha URL and observation date to keep your research traceable.

#### What if some selections fail?

Completed business records remain available. Check the run summary and retry the affected selection with a valid Fresha URL. If no business data can be retrieved, the run reports a failure rather than presenting an empty success.

#### Where can I get support?

Open the Actor's **Issues** tab with the run URL and a short description of the result you expected. For tailored datasets or custom requirements, contact **Lofomachines** through the developer profile.

This Actor is an independent tool and is not affiliated with Fresha. Use collected information responsibly and in accordance with applicable terms and data-protection requirements.

### Expand your workflow with Lofomachines

These five complementary Actors help you turn business research into a broader workflow:

1. [Google Maps Scraper — Contacts](https://apify.com/lofomachines/google-maps-places-contact-scraper) — expand local business research beyond Fresha.
2. [Website Contact Extractor](https://apify.com/lofomachines/website-contact-extractor) — research available contacts on business websites.
3. [Website Tech Profiler](https://apify.com/lofomachines/website-tech-profiler) — assess business websites for technology-related opportunities.
4. [Google Search Results Scraper](https://apify.com/lofomachines/google-serp-scraper) — extend company and local competitor research.
5. [Sentiment and Topics Text Classifier](https://apify.com/lofomachines/sentiment-and-topics-text-classifier) — organize collected feedback into themes and sentiment categories.

**Discover more automation tools in the [Lofomachines Actor collection](https://apify.com/lofomachines).** Start with a small Fresha export today and build a repeatable research workflow around the businesses that matter to you.

# Actor input Schema

## `cities` (type: `array`):

Enter city names, one per line, such as London or Manchester. Choose their country below. Leave blank when using only Fresha URLs. For neighborhoods or a city not found, paste its Fresha category URL instead.

## `country` (type: `string`):

Country of the cities above. Ignored for pasted Fresha URLs. Use URLs for countries not listed.

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

Type of business to find in your cities. For a specific treatment, paste a Fresha treatment page URL below. Businesses may offer several kinds of treatments.

## `startUrls` (type: `array`):

Paste public Fresha business, city/category or treatment URLs. Supports bookable and directory listings. Search, booking and account links are not supported. Leave Cities blank to use URLs only.

## `maxResults` (type: `integer`):

Maximum total unique businesses for this run, across all cities and URLs. Fewer results may be available. Start with 20 to preview your data.

## `includeReviews` (type: `boolean`):

Include available public review samples, ratings, dates and business replies. This is not a full review-history export. Overall business ratings are always included.

## Actor input object example

```json
{
  "cities": [
    "London"
  ],
  "country": "GB",
  "category": "hair-salons",
  "maxResults": 20,
  "includeReviews": false
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `contacts` (type: `string`):

No description

## `pricing` (type: `string`):

No description

## `reviews` (type: `string`):

No description

## `summary` (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 = {
    "cities": [
        "London"
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("lofomachines/fresha-scraper-api").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 = {
    "cities": ["London"],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("lofomachines/fresha-scraper-api").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 '{
  "cities": [
    "London"
  ],
  "maxResults": 20
}' |
apify call lofomachines/fresha-scraper-api --silent --output-dataset

```

## MCP server setup

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

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/dWVm99sfz9pnkuG6X/builds/XXuL2DQAKbdYfxrJ8/openapi.json
