Fresha APIfresha.com ↗
Search Fresha salons and spas, retrieve service pricing, check appointment availability, and browse help center articles via a single structured API.
What is the Fresha API?
The Fresha API exposes 9 endpoints covering the full Fresha beauty and wellness marketplace: search businesses by location and keyword, pull detailed venue profiles with service pricing and working hours, and check real appointment availability by date. The search_businesses endpoint returns paginated results including each business's rating, review count, address, and service list, with a slug you carry forward to get_business_details and get_availability.
curl -X GET 'https://api.parse.bot/scraper/bf942bc5-c330-41c8-adb7-3648c24f18e1/search_businesses?after=WzEuMCwxLjE2MzA4NjMxMjQ3NDY4NDIsMjYyODA3MV0%3D&limit=5&query=massage&latitude=40.7128&longitude=-74.006' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace fresha-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Fresha API — discover beauty & wellness businesses, check availability, and browse help articles."""
from parse_apis.fresha_api import Fresha, CategorySlug, BusinessNotFound
client = Fresha()
# Search businesses near NYC
for biz in client.businesses.search(query="massage", latitude=40.7128, longitude=-74.006, limit=3):
print(biz.name, biz.rating, biz.slug)
# Get detailed info for a specific business by slug
try:
detail = client.businesses.get(slug="tribeca-hair-studio-nyc-new-york-74-chambers-st-k6zp5nas")
print(detail.name, detail.reviews_count)
except BusinessNotFound as exc:
print(f"Business not found: {exc.slug}")
# Check appointment availability for a business on a date
biz = client.business(slug="tribeca-hair-studio-nyc-new-york-74-chambers-st-k6zp5nas")
for slot in biz.time_slots.list(date="2026-06-20", limit=5):
print(slot.label, slot.start_time)
# Browse knowledge base categories and drill into articles
kb_cat = client.knowledgebasecategory(slug="calendar")
for article in kb_cat.articles.list(limit=3):
full = article.details(category_slug=CategorySlug.CALENDAR)
print(full.title, full.url)
# Search the knowledge base
for hit in client.articlehits.search(query="booking", limit=3):
print(hit.title, hit.preview_description)
print("exercised: businesses.search / businesses.get / time_slots.list / articles.list / article.details / articlehits.search")
Search for beauty and wellness businesses by location and optional keyword. Returns paginated results with business details, services offered, ratings, and pricing. Each result includes the business slug needed for get_business_details and get_availability. Pagination uses cursor-based navigation via the endCursor field.
| Param | Type | Description |
|---|---|---|
| after | string | Pagination cursor from a previous response's endCursor field. |
| limit | integer | Number of results to return per page. |
| query | string | Search keyword (e.g. 'hair salon', 'massage', 'nails'). |
| latitude | number | Latitude of the search location. |
| longitude | number | Longitude of the search location. |
{
"type": "object",
"fields": {
"count": "integer total number of matching businesses",
"edges": "array of business objects each with id, name, slug, rating, reviewsCount, address, currency, description, images, services, and servicesExpandLabel at top level",
"endCursor": "string pagination cursor for the next page",
"hasNextPage": "boolean whether more results are available"
},
"sample": {
"data": {
"count": 447,
"edges": [
{
"id": "283271",
"name": "Tribeca Hair Studio NYC",
"slug": "tribeca-hair-studio-nyc-new-york-74-chambers-st-k6zp5nas",
"rating": 5,
"address": {
"latitude": 40.714,
"longitude": -74.007,
"simpleFormatted": "74 Chambers St, New York"
},
"currency": "USD",
"services": [
{
"id": "22346906",
"name": "Haircut (Barbering)",
"caption": "20 min - 45 min",
"formattedRetailPrice": "from $55"
}
],
"description": "Tribeca Hair Studio was built on a simple belief: excellence is the standard.",
"reviewsCount": 2881,
"servicesExpandLabel": "View 54 matching services"
}
],
"endCursor": "WzEuMCwxLjIwMjEyMTY2MDU2MzcxMTcsNDA3Mjc2XQ==",
"hasNextPage": true
},
"status": "success"
}
}About the Fresha API
Business Search and Venue Profiles
The search_businesses endpoint accepts a query string (e.g. 'hair salon', 'massage') plus latitude and longitude coordinates and returns a paginated list of matching venues. Each result node includes id, name, slug, rating, reviewsCount, address, and a services array. Pagination is cursor-based: pass the endCursor value from one response as the after parameter on the next call. The get_business_details endpoint takes a slug from those results and returns the full venue profile — description, contactNumber, working hours, photos, employee profiles, amenities, and a services array with per-service pricing.
Availability and Filtering
get_availability accepts a slug and an ISO date string (YYYY-MM-DD) and returns either actual bookable time slots per service (for Fresha-partnered businesses with online booking enabled) or working hours for that day (for non-partnered listings). Each service entry in the response includes service_id, service_name, duration, price, and an available_times array, plus a has_more_times flag. The booking_type field distinguishes 'online' from 'call_to_book' venues. get_search_filters returns location-specific facets — highlights (e.g. Pet-friendly), amenities (e.g. Parking, Sauna), and values (e.g. Woman-owned, LGBTQ+) — useful for building filter UIs without hardcoding options.
Categories and Discovery
get_business_categories returns all treatment and service categories available on the Fresha marketplace, each node containing an id, name, and icon, alongside suggested locations. This endpoint requires no parameters and is useful for populating category browsers or validating query values before passing them to search_businesses.
Help Center Knowledge Base
Three endpoints cover the Fresha Help Center. get_knowledge_base_categories lists all top-level categories with title, slug, and url. get_knowledge_base_category takes a category_slug and returns article stubs with title, description, url, and slug. get_knowledge_base_article takes both article_slug and category_slug and returns the full article content, thumbnail, and description. search_knowledge_base runs a full-text search over articles and returns hits with previewDescription, categorySlug, and thumbnailImage, plus an estimatedTotalHits count.
The Fresha API is a managed, monitored endpoint for fresha.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when fresha.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official fresha.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a location-aware salon finder that surfaces nearby businesses with ratings, reviews, and service pricing from
search_businesses. - Display real-time appointment availability for a specific venue and date using
get_availabilityservice slots andbooking_typeflags. - Aggregate service menus and pricing across multiple venues in a city using
get_business_detailsfor competitive analysis. - Populate a category and filter browse UI without hardcoding values by pulling data from
get_business_categoriesandget_search_filters. - Index Fresha Help Center documentation into an internal knowledge base using
search_knowledge_baseandget_knowledge_base_article. - Track new business listings in a metro area over time by paginating
search_businessesresults with the cursor-basedafterparameter. - Build a booking-type classifier that segments Fresha venues into online-bookable vs. call-to-book using the
booking_typefield fromget_availability.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Fresha have an official public developer API?+
What does `get_availability` return for businesses that don't support online booking?+
day_of_week string, and contact details. The booking_type field will be 'call_to_book' rather than 'online', and the services array will not include available_times slots.Does the API return customer photos or uploaded images from venue galleries?+
get_business_details endpoint includes a photos array for the venue, and get_knowledge_base_article returns a thumbnail URL. Customer-uploaded review photos are not currently exposed as a distinct field. You can fork this API on Parse and revise it to add a dedicated review-photos endpoint.Can I filter `search_businesses` results by amenities or values like 'Woman-owned'?+
search_businesses accepts query, latitude, longitude, limit, and after as inputs. Passing filter IDs (from get_search_filters) directly as search parameters is not currently supported in the endpoint signature. You can fork this API on Parse and revise the search_businesses endpoint to accept and forward filter facet IDs.How does pagination work in `search_businesses`?+
endCursor string and a hasNextPage boolean. Pass endCursor as the after parameter in your next request to retrieve the following page. If hasNextPage is false, you have reached the last page. The count field in the response gives the total number of matching businesses across all pages.