Booksy Scraper - Beauty Salons, Services, Prices & Reviews avatar

Booksy Scraper - Beauty Salons, Services, Prices & Reviews

Pricing

from $1.50 / 1,000 business records

Go to Apify Store
Booksy Scraper - Beauty Salons, Services, Prices & Reviews

Booksy Scraper - Beauty Salons, Services, Prices & Reviews

Scrape Booksy beauty businesses across the US, UK and Poland by category, location or URL. Extract business profiles, service menus, prices, durations, photos, opening hours, ratings and client reviews. Supports resume, incremental updates and MCP export.

Pricing

from $1.50 / 1,000 business records

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Features

Limited permissions

Share

Booksy Scraper: Beauty Businesses, Services, Prices & Reviews

Booksy Scraper turns Booksy into a clean beauty-business data API. Get barbershops, hair salons, nail studios, spas and massage therapists with their full priced service menus, durations and discounts, photo galleries, opening hours, business profiles, ratings and nested client reviews. Search by plain category and location names across the United States, United Kingdom and Poland, or paste business links and results links, then export to JSON, CSV or Excel, or pull the results straight into your app through the API.

Why This Scraper?

  • Search the way people talk. Enter barber in Orlando or hair salon in London; the actor resolves plain names through the marketplace's own lookup. No raw ids needed.
  • Full priced service menus by default. Every business row carries its bookable services with price, duration, deposit and discount fields. No extra toggle, no per-service requests.
  • Nested client reviews. Reviews attach to the business record as a structured list (rating, text, appointment date, business reply, verified flag), read up to 20 per business by default.
  • Three markets, one actor. United States, United Kingdom and Poland. A pasted link's locale prefix picks the market automatically; every record carries the marketplace's own resolved location.
  • Every URL shape. Business links, bare business ids, category-and-location results links with pagination. A link's numeric identifiers decide what it points at, never its readable slug.
  • Built for schedules. Resume, incremental change detection (NEW / UPDATED / UNCHANGED / EXPIRED) and MCP connector export are built in, and a refused run fails loudly instead of returning an empty dataset.

Use Cases

  • Beauty suppliers and distributors: build lead lists of barbershops, salons and spas per city with size signals (review counts, ratings, service counts) and contact links.
  • Service-pricing analysts: pull full priced menus across cities and markets to benchmark what a fade, balayage or gel manicure costs.
  • Directory builders: feed marketplace pages, city pages or category pages into the actor and get normalized business records with photos, hours and geolocation.
  • Reputation monitoring: track ratings, review counts and review text per business on a schedule; incremental mode reports only what changed.
  • Market researchers: compare category density and pricing between the US, UK and Polish marketplaces with one input change.

Data You Get

Sample shape: values are illustrative placeholders, not from a live record.

FieldExample
recordId"booksy:us:business:147413"
businessId147413
name"Sample Barber Shop"
url / bookingUrlBooksy link to the business page
market / currency"us" / "USD" (also gb, pl)
primaryCategoryName"Barber"
address / city / state / zipCode / country"2709 Sample Ave." / "Orlando" / "Florida" / "32805" / "United States"
latitude / longitude28.51 / -81.38
rating / reviewsCount4.9 / 329
serviceCount / priceFrom / priceTo9 / 30 / 60
servicesone entry per bookable variant: name, price, durationMin, priceText, discountPercent, deposit, onlineBookable
imageUrl / imageCoverUrl / imageUrlslogo, cover and full gallery URLs
description / contactNameprofile text and contact person (when profile fetching is on)
openHours / openHoursText7-day normalized hours with explicit closed days
website / instagramUrl / facebookUrlbusiness contact links (when profile fetching is on)
bookingPolicy / depositPolicy / depositCancelDaysbooking and cancellation terms (when profile fetching is on)
staff / topServices / categories / amenitiesprofile staff and taxonomy (when profile fetching is on)
reviewsnested list: reviewId, reviewAuthor, reviewRating, reviewText, reviewCreated, reviewReply, reviewVerified
changeType / changedFields / firstSeenAt / lastSeenAtincremental-mode change tracking

The Output tabs include unwound views: one row per service (Service menus) and one row per review (Client reviews), so flat exports need no post-processing.

How to Use

  1. Pick a mode: search (category and location names) or urls (paste links).
  2. Fill in the fields for that mode, and switch on the enrichment you need (profile fetching, reviews).
  3. Set Max items to control run size and cost, then click Start.
  4. Download the dataset as JSON, CSV or Excel, or read it through the API.

Search a category and location:

{
"mode": "search",
"market": "us",
"locations": ["Orlando", "Tampa"],
"category": "barber",
"maxItems": 50,
"fetchDetails": true,
"fetchReviews": true,
"maxReviews": 20
}

Two Florida barbershop sweeps with profiles and 20 reviews per business.

Paste links:

{
"mode": "urls",
"urls": [
"https://booksy.com/en-us/s/barber-shop/134763_orlando",
"https://booksy.com/en-us/147413_sam-at-the-barber-spot_barber-shop_134763_orlando",
"https://booksy.com/en-gb/s/barber/311817_london",
"147413"
],
"maxItems": 30,
"fetchDetails": true,
"fetchReviews": true
}

A results walk, a US business profile, a London results walk and a bare business id in one run.

Narrow a search with a keyword and filters:

{
"mode": "search",
"market": "gb",
"locations": ["London"],
"category": "hair salon",
"searchQuery": "balayage",
"minRating": 4.5,
"sortOrder": "price",
"maxItems": 30,
"fetchDetails": false,
"fetchReviews": false
}

London hair salons offering balayage, rated 4.5+, cheapest first, card shape only.

Monitor for changes on a schedule:

{
"mode": "urls",
"urls": ["https://booksy.com/en-us/s/barber-shop/134763_orlando"],
"maxItems": 100,
"incrementalMode": true,
"stateKey": "orlando-barbers-weekly",
"fetchDetails": true,
"fetchReviews": true
}

A weekly watch of one results page: unchanged businesses are suppressed, changes ship with changedFields.

Run it from your code

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("abotapi/booksy-beauty-business-scraper").call(run_input={
"mode": "search",
"locations": ["Orlando"],
"category": "barber",
"maxItems": 50,
"fetchDetails": True,
"fetchReviews": True,
"maxReviews": 20,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_dataset_items():
print(item["name"], item["rating"], item["priceFrom"])
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('abotapi/booksy-beauty-business-scraper').call({
mode: 'search',
locations: ['Orlando'],
category: 'barber',
maxItems: 50,
fetchDetails: true,
fetchReviews: true,
maxReviews: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const item of items) {
console.log(item.name, item.rating, item.priceFrom);
}

Card vs profile fields

The results feed already carries service menus with prices, galleries and the review summary. Profile fetching adds the written description, opening hours, contacts, booking and deposit policies, amenities and staff. Turn it off for large cheap sweeps; every row carries detailFetched so you can tell the shapes apart.

Resume and recurring updates

Set incrementalMode with a stable stateKey on scheduled runs: unchanged businesses are suppressed, changed ones carry changeType: UPDATED with changedFields, and businesses that disappeared from a complete scan ship as EXPIRED. Fields that move without the business changing (the feed's relevance score, promoted flags, review counters, availability flags) are excluded from change detection by default.

Send results into your apps (MCP connectors)

Add connector IDs under "Send results into your apps" and every collected record is exported after the run (Notion, Google Sheets, Airtable and dozens more through Apify MCP). The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch (category and location) or urls (paste links).
locationsarray["Orlando"]Plain city or area names (search mode).
marketstringusus, gb or pl; which marketplace to search (search mode; pasted links pick their own market).
categorystring"barber"Plain category name, for example barber, hair salon, nails, massage. Empty searches every category.
searchQuerystring(none)Optional keyword filter, for example fade or balayage.
sortOrderstringscorescore, price or distance.
minRatingnumber(none)Keep only businesses rated at least this many stars.
onlineOnlybooleanfalseKeep only businesses that take online bookings.
travelingOnlybooleanfalseKeep only mobile businesses that travel to the client.
urlsarrayone sample per link typeBooksy links (url mode): results links, business links or bare business ids.
fetchDetailsbooleantrueRead each business's own page for description, hours, contacts, policies, staff and the full gallery.
fetchReviewsbooleantrueCollect client reviews into the business record.
maxReviewsinteger20Upper bound on reviews per business (reviews serve 10 per page); 0 skips review collection.
maxItemsinteger20Hard cap on business records for the whole run.
maxPagesinteger0Bounds results pages per location walk; 0 defers to Max items.
proxyConfigurationobjectApify ProxyConnection settings.
resumeFromRunIdstring(none)Treat a previous run's records as already collected and skip them.
incrementalModebooleanfalseClassify NEW / UPDATED / UNCHANGED / EXPIRED against the saved baseline.
stateKeystring(none)Name or share an incremental-mode state.
emitUnchangedbooleanfalseAlso return unchanged records.
emitExpiredbooleanfalseAlso return records a complete scan no longer saw.
ignoreFieldsForChangesarray[]Incremental mode only: extra fields excluded from change detection.
mcpConnectorsarray(none)Optional: send each record to apps you authorized under Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which records are created.
maxNotifyListingsinteger50Cap on items written to each connector per run.

Output Example

The Output tab offers one table per view: Results (every business), Business details (profile fields), Service menus (one row per service variant), Client reviews (one row per review), plus a Changes table (change type, changed fields, first and last seen) for incremental runs.

Sample shape: values are illustrative placeholders, not from a live record.

{
"recordId": "booksy:us:business:147413",
"kind": "business",
"businessId": 147413,
"name": "Sample Barber Shop",
"market": "us",
"currency": "USD",
"primaryCategoryName": "Barber",
"address": "2709 Sample Ave., Orlando, 32805",
"city": "Orlando",
"state": "Florida",
"zipCode": "32805",
"country": "United States",
"latitude": 28.51,
"longitude": -81.38,
"rating": 4.9,
"reviewsCount": 329,
"serviceCount": 9,
"priceFrom": 30,
"priceTo": 60,
"services": [
{
"name": "Sample Cut",
"price": 40,
"durationMin": 30,
"priceText": "$40.00+",
"discountPercent": 10,
"onlineBookable": true
}
],
"openHoursText": "Monday: closed; Tuesday: 12:00-17:00; ...",
"detailFetched": true,
"reviewsCollected": true
}

Plan Requirement

The actor ships with the default Apify datacenter connection, which this marketplace serves reliably; for the most reliable long scheduled runs pick Residential under Proxy & connection instead. The run falls back to a backup connection automatically when the default is refused (it logs "Served over the backup connection (the default connection was unavailable)." when that happens). Apify proxy access needs a paid Apify plan. On a plan without residential access the run stops with a clear message instead of an empty result: "The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required". If nothing could be loaded for another reason you get "Could not load any results page ... This is a connection problem, not an empty search."

This actor is a pay-per-event actor: you are charged per collected business record, per enriched business profile and per business with collected reviews. There are no free-tier claims here; check the Pricing tab on Apify for the exact per-event prices and your plan's tiered rates.

FAQ

How much does it cost to run?

You pay the pay-per-event charges on the Pricing tab (per business record, per enriched profile, per business with reviews) plus your plan's platform usage for compute and proxy. A default 20-business run with profiles and reviews costs a fraction of a cent of platform usage. The actor charges nothing for businesses it could not read or that were suppressed as unchanged.

The actor reads publicly available business pages that Booksy serves to every visitor without login. It does not access private accounts, bookings, client records or anything behind authentication. As with any scraper, use the data responsibly and in line with applicable law and the marketplace's terms.

Can I get the businesses' phone numbers and email addresses?

No. The marketplace keeps direct phone and email behind its authenticated booking flow, which this actor does not touch. Business websites and social links are included in the profile fields, so you can follow the business's own contact channels.

Why do scheduled incremental runs report many NEW records?

The marketplace's recommended feed re-shuffles between runs and rotates which businesses appear first. A run capped below the location's total business count legitimately meets different slices each time. For stable change detection, set Max items at or above the location's business count, or keep incremental mode with a stable State key and treat NEW rows as discovery.

Why did my run return fewer results than the location's total?

Max items stops the walk once reached, and a location's total includes businesses that match the category filter less well. Raise Max items or run the same input on a schedule; the marketplace's feed rotates, so successive runs surface additional businesses.

How do I monitor businesses for changes?

Turn on incremental mode and keep the same inputs (locations, category, links, toggles) and State key across scheduled runs. A run then logs how many unchanged records it suppressed, and UPDATED means the business actually changed: a price moved, hours changed, the rating dropped.

Why did my run fail instead of returning an empty dataset?

A run that could not read any page fails loudly with a connection message rather than pretending the search was empty. Check the run log: proxy refusals name your plan's connection options, and everything else is a temporary connection problem worth retrying.

Can I use it with AI agents or MCP?

Yes. The actor works as an MCP server tool through Apify's MCP integration: point your agent at the actor and it can query businesses, service prices and reviews directly. The MCP connectors input also exports collected records to your own apps after each run.

πŸ”— More scrapers you might like

Pair this actor with these related scrapers from the same team:

🧩 Fresha Scraper
Scrape Fresha salon and spa listings: business profiles, service menus with prices and...
πŸ“‡ PagesJaunes Scraper
Scrape PagesJaunes.fr (French Yellow Pages) business listings across France. Extract...
πŸ“‡ HiPages Scraper
Scrape business listings from HiPages Australia by category, location, or URL. Extract...
✈️ Naver Map Scraper
Scrape Naver Map places by keyword or URL: names, categories, ratings, phones, addresses...
🧩 Yandex Maps Scraper
Scrape Yandex Maps businesses and places by keyword or URL for lead generation, research...
πŸ›’ DoorDash Scraper
Extract structured doordash.com data at scale. Search by keyword or paste store URLs to...

πŸ‘‰ Browse all abotapi scrapers

πŸ’¬ Support

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • πŸ› οΈ Need another site, extra fields or a private build? Email contact@abotapi.com.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.