Booksy Salons, Services & Prices Scraper
Pricing
from $0.04 / 1,000 item extracteds
Booksy Salons, Services & Prices Scraper
💇 Extract public Booksy salons, locations, ratings, service menus, prices, discounts, and durations for territory research, lead generation, and recurring market benchmarks.
Pricing
from $0.04 / 1,000 item extracteds
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Turn public Booksy salon listings and service menus into a clean market-research dataset.
The Actor extracts one row per provider-service-price combination, including provider identity, location, ratings, current and previous prices, discounts, duration, and source URLs.
Use it for territory mapping, beauty-industry lead research, competitive menu tracking, and recurring local price benchmarks—without manually copying Booksy pages.
What does Booksy Salons, Services & Prices Scraper do?
This Booksy scraper accepts public category/city search URLs and public provider URLs.
It reads Booksy's server-rendered pages and saves structured records to an Apify dataset.
It can:
- 🔎 Extract providers from a Booksy city/category search
- 💇 Capture public service and variant names
- 💵 Compare current prices with previous prices
- 🏷️ Identify discounts and
fromprices - ⏱️ Normalize service durations to minutes
- ⭐ Capture provider ratings and review counts
- 📍 Export flat address and geographic fields
- 📄 Follow bounded public search pagination
The Actor does not book appointments or access private calendars.
Who is it for?
Beauty chains and operators
Build a recurring view of competing salons, menu coverage, and visible prices in a territory.
Beauty suppliers and distributors
Find provider prospects by location, category, rating, and service mix before outreach.
Market researchers
Measure how service names, prices, discounting, and appointment duration vary by neighborhood.
Local lead-generation teams
Create structured salon rosters with direct public provider URLs and business context.
Data and revenue operations teams
Schedule repeat runs, compare snapshots downstream, and route results into spreadsheets, warehouses, or CRMs.
Why use this Booksy scraper?
- ✅ Flat output: every row works in CSV and spreadsheet exports
- ✅ Public sources: no Booksy login or account credentials required
- ✅ Price context: current, previous, discounted, and
fromsignals - ✅ Traceability: every row includes its provider and source search URL
- ✅ Repeatability: schedule the same territory inputs on Apify
- ✅ Controlled scope: cap records and pages to control time and cost
Manual research becomes outdated quickly. A saved input can refresh the same public market view whenever you need it.
What Booksy data can you extract?
| Field | Description |
|---|---|
providerId | Numeric ID parsed from the public Booksy URL |
providerName | Public business/provider name |
providerUrl | Canonical public Booksy provider URL |
providerType | Schema.org provider category, when available |
address | Flat street address text |
city | Locality shown in structured data |
region | State or region |
postalCode | Postal or ZIP code |
country | Country code |
latitude, longitude | Public provider coordinates |
rating | Aggregate rating |
reviewCount | Public review count |
promoted | Whether the search card is marked promoted |
recommended | Whether Booksy marks the provider recommended |
mobileService | Whether the search card advertises mobile service |
serviceName | Public service/menu name |
serviceVariant | Variant label, when present |
price | Current public price |
previousPrice | Struck-through or prior price |
currency | ISO-style currency code |
discountPercent | Visible discount percentage |
priceFrom | Whether Booksy marks the price as starting/from |
durationMinutes | Duration normalized to minutes |
hasAddons | Whether add-ons are shown |
pageNumber, position | Search pagination context |
searchUrl | Input source URL |
scrapedAt | UTC extraction timestamp |
How much does it cost to scrape Booksy salon prices?
This Actor uses pay-per-event pricing:
- Start: a small one-time fee per run
- Service price record: one event per saved dataset row
The formula-derived price is $0.005 per start. Per-record pricing is $0.000072551 on Free, $0.000063088 on Bronze, $0.000049208 on Silver, $0.000037853 on Gold, $0.000025235 on Platinum, and $0.000017665 on Diamond. Apify shows your exact total before each run.
A 25-record test is intentionally small. Increase maxItems only after confirming the target and output fit your workflow.
Free-plan users can use the same small prefilled example to assess output quality within available platform credits.
How to scrape Booksy salons and prices
- Open the Actor on Apify.
- Copy a public Booksy category/city search URL or provider URL.
- Paste it into Booksy search or provider URLs.
- Set the maximum number of service-price records.
- For search URLs, choose the maximum number of result pages.
- Click Start.
- Preview the dataset while the run is active.
- Export results as JSON, CSV, Excel, XML, or another Apify format.
Input parameters
startUrls
Required array of public Booksy URLs.
Supported paths include:
- Search/category pages such as
https://booksy.com/en-us/s/hair-salon/30067_new-york-city - Provider pages such as
https://booksy.com/en-us/213922_allenstcutshave_hair-salon_30067_new-york-city
Other hosts and unsupported Booksy paths fail closed.
maxItems
Maximum unique provider-service-price rows across all inputs.
Default: 25.
Prefill: 10 for a quick first run.
maxPages
Maximum search-result pages per search URL.
Default: 1.
This setting is ignored for direct provider URLs.
Example input
{"startUrls": [{"url": "https://booksy.com/en-us/s/hair-salon/30067_new-york-city"}],"maxItems": 25,"maxPages": 1}
For a provider-menu extraction:
{"startUrls": [{"url": "https://booksy.com/en-us/213922_allenstcutshave_hair-salon_30067_new-york-city"}],"maxItems": 50,"maxPages": 1}
Example output
{"providerId": "213922","providerName": "Allenstcutshave","providerUrl": "https://booksy.com/en-us/213922_allenstcutshave_hair-salon_30067_new-york-city","providerType": "HairSalon","address": "127 Allen StNew York NY 10002, New York, 10002","city": "New York, NY","region": "New York","postalCode": "10002","country": "US","latitude": 40.71996,"longitude": -73.99028,"rating": 4.673758865248227,"reviewCount": 141,"promoted": true,"recommended": false,"mobileService": false,"serviceName": "Shape Up","price": 27,"previousPrice": 30,"currency": "USD","discountPercent": 10,"priceFrom": false,"durationMinutes": 25,"hasAddons": false,"pageNumber": 1,"position": 1,"searchUrl": "https://booksy.com/en-us/s/hair-salon/30067_new-york-city","scrapedAt": "2026-07-21T00:00:00.000Z"}
Optional fields may be absent when Booksy does not publish them for that service or provider.
Search pages versus provider pages
Search pages are best for territory rosters and side-by-side service-price comparisons.
They expose multiple providers and the services Booksy chooses to preview.
Provider pages are best when you need a deeper public menu for one known business.
Use both modes in separate saved tasks when you want broad discovery followed by focused enrichment.
Pagination and limits
For search URLs, the Actor follows Booksy's public businessesPage parameter.
Set maxPages to the minimum that answers your question.
The Actor stops as soon as maxItems unique rows have been saved.
Rows are deduplicated by provider URL, service, variant, and price.
A naturally short result set is returned as-is; the Actor does not manufacture volume.
Data quality tips
- 🎯 Use a precise Booksy category and city URL
- 📉 Start with one page before expanding a territory
- 🔗 Save
providerUrlas the stable join key for follow-up runs - 🕒 Compare
scrapedAttimestamps when monitoring price changes - 💱 Group records by
currencybefore cross-country analysis - 🏷️ Treat
promotedas placement context, not an organic rank - 📊 Keep
pageNumberandpositionwhen studying search visibility
Scheduling a Booksy price monitor
Create an Apify task with a stable city/category URL.
Schedule it daily, weekly, or monthly according to your market's rate of change.
Send each run to a named dataset or external warehouse.
Compare records by providerUrl, serviceName, and serviceVariant.
Alert only when price, previousPrice, or discountPercent changes.
This avoids repeatedly reviewing unchanged menu rows.
Integrations and workflows
Google Sheets territory roster
Send new dataset rows to Google Sheets, then filter by city, rating, and service.
CRM lead enrichment
Match provider URLs to existing accounts and append public service/category context before outreach.
BigQuery or Snowflake benchmark
Load scheduled datasets, partition by scrapedAt, and calculate price distributions by market.
Slack price-change alert
Use an Apify webhook to call Make or Zapier after a run, compare the newest snapshot, and post material changes.
Supplier prospect scoring
Combine service names, location, and review volume to prioritize relevant beauty-business prospects.
Run with the Apify API using JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/booksy-salons-services-prices-scraper').call({startUrls: [{ url: 'https://booksy.com/en-us/s/hair-salon/30067_new-york-city' }],maxItems: 25,maxPages: 1,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Run with the Apify API using Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('automation-lab/booksy-salons-services-prices-scraper').call(run_input={'startUrls': [{'url': 'https://booksy.com/en-us/s/hair-salon/30067_new-york-city'}],'maxItems': 25,'maxPages': 1,})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items)
Run with cURL
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~booksy-salons-services-prices-scraper/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"startUrls":[{"url":"https://booksy.com/en-us/s/hair-salon/30067_new-york-city"}],"maxItems":25,"maxPages":1}'
Read dataset items after the run succeeds:
$curl "https://api.apify.com/v2/datasets/DATASET_ID/items?clean=true&format=json"
Use this Booksy scraper with MCP
Connect the Actor to AI tools through the Apify MCP server.
Claude Code:
$claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/booksy-salons-services-prices-scraper"
Claude Desktop, Cursor, or VS Code configuration:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/booksy-salons-services-prices-scraper"}}}
Example prompts:
- “Extract 25 public Booksy hair salon service prices from this New York search URL.”
- “Get the public service menu and durations for this Booksy provider.”
- “Compare current and previous prices in the resulting dataset.”
Reliability and error handling
The Actor makes sequential HTTP requests with realistic browser headers and bounded retries.
HTTP 403 and 429 responses fail visibly rather than returning an empty successful dataset.
Unsupported URLs fail before scraping starts.
A page that yields no service-price records also fails non-zero, so monitors do not silently accept extraction regressions.
Individual duplicate rows are skipped.
Troubleshooting
Why did my URL fail validation?
Confirm the hostname is booksy.com and the path is either a public search/category path containing /s/ or a public provider path beginning with a numeric provider ID.
Why did I receive HTTP 403 or 429?
Booksy may temporarily rate-limit repeated traffic. Reduce pages, wait before retrying, and avoid launching many concurrent runs for the same market.
Why are only a few services shown for a provider?
Search cards often preview a subset. Use the provider's direct public Booksy URL to extract the fuller visible menu.
Why is an optional price field missing?
Some Booksy services do not expose a numeric price, previous price, discount, duration, or variant. Missing optional data is not replaced with invented values.
Legal and ethical use
This Actor extracts information displayed publicly on Booksy pages without logging in.
Use it responsibly and comply with Booksy's terms, applicable laws, and contractual obligations.
Do not use the Actor to access private calendars, customer identities, booking details, or authenticated information.
Avoid excessive request volume and collect only data necessary for a legitimate purpose.
Personal-data and outreach rules vary by jurisdiction; obtain legal advice for your specific use case.
Related scrapers
Build broader local-business workflows with other automation-lab Actors:
Use Booksy-specific output when service menu and beauty-provider price context are the central requirement.
FAQ
Does this Actor require a Booksy account?
No. V1 is limited to public anonymous search and provider pages.
Can it book appointments?
No. Booking actions and private availability are intentionally out of scope.
Can I scrape several cities?
Yes. Add multiple public Booksy search URLs and set a combined maxItems limit.
Does it output one row per provider?
No. It outputs one row per provider-service-price combination so prices and durations remain flat and exportable.
Can I export CSV or Excel?
Yes. Use the standard Apify dataset export controls or API formats.
Can I monitor price changes?
Yes. Schedule a stable input and compare snapshots downstream by provider URL and service name.
Are ratings and reviews included?
The aggregate rating and public review count are included when Booksy exposes them in structured data.
Is pagination automatic?
Yes, up to your maxPages and maxItems limits for search URLs.
Does the Actor scrape individual review text?
No. This product focuses on provider, service-menu, and price intelligence.
What happens if Booksy changes its page?
The Actor fails when no valid records can be extracted instead of silently returning a successful empty result. Report the failing public URL through the Actor issue form.
Support
For reproducible support, include:
- The public Booksy URL
- The run ID
- The expected service or provider
- Whether the page works in a normal anonymous browser
Do not include account credentials or private booking data.