# Booksy Scraper — Beauty & Wellness Provider Leads (`scrapesage/booksy-scraper`) Actor

Scrape Booksy salons, barbers, nail & lash techs, spas & massage by city. Get ratings, reviews, services & prices, staff, Instagram/Facebook, website & leads, with optional website email enrichment and monitoring. No login, no key, no browser.

- **URL**: https://apify.com/scrapesage/booksy-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Lead generation, Social media, Automation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.00 / 1,000 business scrapeds

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

## Booksy Scraper — Beauty & Wellness Provider Leads (Salons, Barbers, Nail & Lash Techs, Spas)

Extract **complete Booksy business data** — salons, barbers, nail & lash techs, estheticians, spas, massage and more — for any US city. Get **ratings, review counts and full reviews, services with real prices, staff lists, opening hours, Instagram/Facebook, website, photos and lead data**. Optionally turn every provider into a **ready-to-contact lead** by crawling their own website for **emails, phone numbers and social links**.

No login, no cookies, no browser — fast JSON + JSON-LD extraction with high reliability.

### Why this Booksy scraper?

Most Booksy scrapers return a thin business card and charge a per-run start fee. This actor combines Booksy's public city pages (JSON-LD) with its keyless business API to ship the **richest dataset in the category — and never charges a start fee**:

| Data | Typical scrapers | This actor |
|---|---|---|
| Business name, rating, review count | ✅ | ✅ |
| Full address + lat/lng | partial | ✅ |
| **Services with real prices & durations** | ❌ | ✅ |
| **Staff / team members** | ❌ | ✅ |
| Opening hours, amenities, parking, booking policy | ❌ | ✅ |
| **Instagram & Facebook handles** | ❌ | ✅ |
| Provider **website** | ❌ | ✅ |
| Full customer **reviews** (text, author, owner reply) | ❌ | ✅ opt-in |
| Provider **contact emails / phones** (from their website) | ❌ | ✅ opt-in |
| Lead score (0–100) per business | ❌ | ✅ |
| Monitoring — only new providers on re-runs | ❌ | ✅ |
| Start fee | $0.05+ | **none** |

### Use cases

- **Lead generation** — beauty & wellness pros are active buyers: they need salon software, booking & POS, payment processing, booth rental, beauty supplies, insurance and marketing. Score them by audience (`reviewsCount`, `rating`) and reach them directly via `instagram`, `website` or enriched `contactEmails`.
- **Market & pricing intelligence** — compare service menus and prices (`services`, `minPrice`, `maxPrice`) across a city or category.
- **Local SEO & directory building** — populate niche directories and apps with structured provider data including geo, hours and categories.
- **Competitor & territory analysis** — map provider density, ratings and review velocity by city and category.
- **New-provider monitoring** — schedule recurring runs to capture salons and pros that newly list on Booksy in a market.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **Booksy Scraper**, pick categories and locations (or paste Booksy URLs), and click **Start**.
3. Watch results stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "searchCategories": ["Hair Salon", "Barber Shop", "Nail Salon"],
    "locations": ["Austin, TX", "Miami, FL"],
    "maxResults": 200,
    "includeBusinessDetails": true,
    "includeReviews": false,
    "enrichContactEmails": true,
    "monitorMode": false
}
```

- **searchCategories** — beauty/wellness categories (`Hair Salon`, `Barber Shop`, `Nail Salon`, `Brows & Lashes`, `Skin Care`, `Day Spa`, `Massage`, `Makeup`, `Aesthetic Medicine`, `Hair Removal`, `Tattoo Shop`, `Piercing`, `Braids & Locs`, `Health & Fitness`, `Pet Services`). You can also type any raw Booksy treatment slug (`balayage`, `highlights`, `crochet-braids`, …).
- **locations** — US locations as `City, ST` (`Austin, TX`, `Brooklyn, NY`). Each location is scraped for every selected category. Required unless you use Start URLs.
- **startUrls** — direct Booksy city-category pages (`/en-us/s/hair-salon/134608_austin`) or business profiles (`/en-us/1303645_justin-coleman_...`).
- **maxResults / maxResultsPerSearch** — global and per-category caps.
- **minRating / minReviews** — keep only providers above a rating / review threshold.
- **includeBusinessDetails** *(default true)* — full profile: services & prices, staff, hours, website, Instagram/Facebook, amenities, booking policy, photos.
- **includeReviews** *(default false)* — customer reviews (rating, text, author, date, owner reply); `maxReviewsPerBusiness` controls how many.
- **enrichContactEmails** *(default false)* — crawl each provider's own website (home + contact/about) for emails, phones and socials. Booksy routes bookings in-app, so this is the main way to get a direct email.
- **monitorMode** *(default false)* — emit only providers not seen in previous runs; pairs with Schedules.

### Output

One record per business (`type: "business"`):

```json
{
    "source": "booksy",
    "type": "business",
    "businessId": "1303645",
    "name": "Cutbyjcole",
    "profileUrl": "https://booksy.com/en-us/1303645_cutbyjcole_barber-shop_134608_austin",
    "category": "Barbershop",
    "categories": ["Barbershop"],
    "rating": 5,
    "reviewScore": 4.95,
    "reviewsCount": 36,
    "pricingLevel": 2,
    "priceRange": "$$",
    "street": "2226 E Cesar Chavez St",
    "city": "Austin",
    "state": "TX",
    "postalCode": "78702",
    "latitude": 30.25563,
    "longitude": -97.71954,
    "website": "https://cutbyjcole.com",
    "instagram": "https://www.instagram.com/cutbyjcole/",
    "facebook": null,
    "staffCount": 1,
    "staff": [{ "name": "Justin Coleman", "position": "Barber" }],
    "serviceCount": 3,
    "minPrice": 35,
    "maxPrice": 80,
    "currency": "USD",
    "services": [{ "name": "Haircut", "category": "Hair", "price": 60, "durationMinutes": 60 }],
    "openHours": [{ "day": "Monday", "from": "10:00", "till": "18:00" }],
    "amenities": ["Parking", "Card payments"],
    "images": { "logo": "https://...", "cover": "https://...", "photoCount": 24 },
    "reviews": [{ "rating": 5, "text": "Great cut", "author": "Andrew", "date": "2026-05-30", "reply": null }],
    "contactEmails": ["hello@cutbyjcole.com"],
    "socialLinks": { "instagram": "https://instagram.com/cutbyjcole" },
    "leadScore": 84,
    "searchCategory": "barber-shop",
    "searchLocation": "Austin, TX",
    "scrapedAt": "2026-06-15T12:00:00.000Z"
}
```

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it daily/weekly with `monitorMode` to capture only newly listed providers in a market; perfect for lead pipelines.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions (CRM import, Slack alert, email sequence) the moment a run finishes.

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/booksy-scraper').call({
    searchCategories: ['Hair Salon', 'Nail Salon'],
    locations: ['Miami, FL'],
    maxResults: 200,
    enrichContactEmails: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} beauty & wellness providers`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new provider leads straight into your CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a monitored search finds new providers.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. You can call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find top-rated hair salons in Miami and list their Instagram and websites" and let it run this scraper for you.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### More scrapers from scrapesage

Build a complete **local-business lead-gen stack**:

- **[Insurance Agent Scraper](https://apify.com/scrapesage/insurance-agent-scraper)** — State Farm & Farmers agent leads.
- **[Healthgrades Scraper](https://apify.com/scrapesage/healthgrades-scraper)** — doctors, reviews & provider leads.
- **[WebMD Scraper](https://apify.com/scrapesage/webmd-scraper)** — doctors, insurance & provider leads.
- **[FindLaw Scraper](https://apify.com/scrapesage/findlaw-scraper)** — lawyers, law firms & leads.
- **[Financial Advisor Scraper](https://apify.com/scrapesage/financial-advisor-scraper)** — FINRA & SEC advisor/broker data.
- **[Houzz Scraper](https://apify.com/scrapesage/houzz-scraper)** — home-improvement pros, contacts & reviews.
- **[Bark Listing Scraper](https://apify.com/scrapesage/bark-listing-scraper)** — service-provider leads from Bark.
- **[US Business Formation Scraper](https://apify.com/scrapesage/us-business-formation-scraper)** — new LLC & company leads.

### Tips

- **Exhaust a big city**: add more `searchCategories` (e.g. Hair Salon + Barber Shop + Nail Salon + Brows & Lashes) — Booksy paginates ~20 businesses per page per category.
- **Get emails**: turn on `enrichContactEmails`. Most direct emails come from the provider's linked website; many solo pros only list an Instagram, which is captured either way.
- **Same-named cities**: include the state (`Austin, TX` vs `Austin, MN`) — the actor verifies the right market automatically.
- **Cost control**: turn off `includeBusinessDetails` for a fast, cheap listing-only pass (name, rating, address, geo, price range).

### FAQ

**How do I scrape Booksy for a specific city?** Put the city in `locations` as `City, ST` (e.g. `Austin, TX`) and pick one or more `searchCategories`. Or paste a Booksy city or profile URL into `startUrls`.

**Does it need the Booksy API or a login?** No. It reads Booksy's public city pages and public business endpoint — no key, no login, no browser.

**Where do the emails come from?** Not from Booksy (it routes bookings in-app). With `enrichContactEmails` on, the actor visits the provider's own linked website and extracts publicly listed contact emails — the same thing a human visitor would see. Instagram/Facebook handles come straight from the Booksy profile.

**Can I export to Google Sheets, CSV, or Excel?** Yes — one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**How do I monitor new providers automatically?** Turn on `monitorMode` and create a [Schedule](https://docs.apify.com/platform/schedules); each run returns only providers not seen before.

**Is scraping Booksy legal?** This actor collects publicly available data only. You are responsible for using the data in compliance with applicable laws (GDPR/CCPA for personal data) and Booksy's terms.

**A field is null — why?** Some providers genuinely don't publish a website, phone, or full service menu. Fields are `null` only when the data doesn't exist, not because the scraper skipped them.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

## `searchCategories` (type: `array`):

Beauty & wellness categories to scrape in each location. Each category is fetched on Booksy's public city pages. You can also type any raw Booksy treatment slug (e.g. `balayage`, `highlights`, `crochet-braids`).

## `locations` (type: `array`):

US locations as `City, ST` (e.g. `Austin, TX`, `Miami, FL`, `Brooklyn, NY`). Each location is scraped for every selected category. Required unless you use Start URLs.

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

Optional. Paste Booksy city-category pages (`booksy.com/en-us/s/hair-salon/134608_austin`) or business profile pages (`booksy.com/en-us/1303645_justin-coleman_barber-shop_134608_austin`). Processed in addition to the locations above.

## `maxResultsPerSearch` (type: `integer`):

Cap the number of businesses collected per category, per location.

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

Global cap on the total number of business records emitted in this run.

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

Keep only businesses with at least this average star rating (1–5). Leave empty for no filter.

## `minReviews` (type: `integer`):

Keep only businesses with at least this many reviews. Leave empty for no filter.

## `includeBusinessDetails` (type: `boolean`):

Fetch each business's full profile (services & prices, staff, opening hours, website, Instagram/Facebook, amenities, booking policy, photos). Turn off for a faster, listing-only run (name, rating, address, geo, price range).

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

Also pull each business's customer reviews (rating, text, author, date, owner reply, services & staff mentioned).

## `maxReviewsPerBusiness` (type: `integer`):

How many recent reviews to fetch per business when reviews are enabled.

## `enrichContactEmails` (type: `boolean`):

Opt-in lead enrichment: when a business links its own website, crawl it (home + contact/about) for emails, phone numbers and social links. Booksy routes bookings in-app, so this is the main way to get a direct email.

## `deduplicateBusinesses` (type: `boolean`):

Emit each business only once per run (keyed by Booksy business id), even across categories and locations.

## `monitorMode` (type: `boolean`):

Remember businesses already returned and emit ONLY businesses not seen in previous runs (newly listed providers for a market). Pairs with Apify Schedules to track new providers over time.

## `monitorStoreName` (type: `string`):

Named key-value store that holds the 'already seen' business ids for monitoring mode. Use a different name per tracked market to keep histories separate.

## `maxConcurrency` (type: `integer`):

Maximum parallel requests. Lower it if you hit rate limits on very large runs.

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

Proxy settings. Booksy serves clean pages to US IPs, so the default Apify proxy is enough; switch to residential for very large or high-frequency runs.

## Actor input object example

```json
{
  "searchCategories": [
    "Hair Salon",
    "Barber Shop",
    "Nail Salon"
  ],
  "locations": [
    "Austin, TX"
  ],
  "maxResultsPerSearch": 100,
  "maxResults": 200,
  "includeBusinessDetails": true,
  "includeReviews": false,
  "maxReviewsPerBusiness": 20,
  "enrichContactEmails": false,
  "deduplicateBusinesses": true,
  "monitorMode": false,
  "monitorStoreName": "booksy-monitor",
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped business records in the default dataset.

# 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 = {
    "locations": [
        "Austin, TX"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/booksy-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 = { "locations": ["Austin, TX"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/booksy-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 '{
  "locations": [
    "Austin, TX"
  ]
}' |
apify call scrapesage/booksy-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/JPyb0yG9S0sCLqjGl/builds/63Qr5aznqGyLKKEbt/openapi.json
