CD Fade APIcdfade.ca ↗
Access CD Fade Barber Shop's barbers, services, open appointment slots, and pre-filled booking links via 3 structured JSON endpoints.
What is the CD Fade API?
The CD Fade Barber Shop API exposes 3 endpoints covering the shop's barbers, bookable services, real-time availability, and booking link generation. The list_services endpoint returns full business details alongside every barber profile and service with price, duration, and image. The list_available_slots endpoint narrows that down to open appointment times for a specific service and barber over a configurable date window, and get_booking_link builds a pre-filled checkout URL so a customer lands directly at the confirmation step.
No input parameters required.
curl -X GET 'https://api.parse.bot/scraper/47519a8c-a43c-48b5-aeff-ad2644c04dcb/list_services' \ -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 cdfade-ca-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.
"""Walkthrough: CD Fade Barber Shop — browse services, check availability, get a booking link."""
from parse_apis.cdfade_ca_api import CdFade, InputNotFound
client = CdFade()
# Fetch the full shop catalog: business info, barbers, and services.
catalog = client.catalog.get()
print(catalog.business.name, catalog.business.timezone)
for barber in catalog.barbers:
print(f" Barber: {barber.name} ({barber.staff_id})")
# Pick the first service from the paginated list.
service = client.services.list(limit=5).first()
if service is not None:
print(f"Service: {service.title} ${service.price} {service.currency} ({service.duration_mins} min)")
# Check available slots for this service over the next 7 days.
schedule = service.available_slots(start_date="2026-10-15", days=7)
print(f"Found {schedule.slot_count} slots from {schedule.start_date} to {schedule.end_date}")
if schedule.slots:
# Take the first open slot and generate a pre-filled booking link.
slot = schedule.slots[0]
print(f" Slot: {slot.start_time} – {slot.end_time}")
try:
booking = service.booking(slot_id=slot.slot_id, staff_id=schedule.barber.staff_id)
except InputNotFound:
print(" Service or barber no longer available.")
else:
print(f" Available: {booking.is_available}")
print(f" Link: {booking.booking_link}")
print(f" Note: {booking.note}")
print("exercised: catalog.get / services.list / available_slots / booking")
Returns the shop's business details (name, timezone, address, phone, currency, booking policy), the list of barbers, and the list of bookable services with price, duration and image. One request, no pagination. Use service_id and staff_id values from this response in list_available_slots and get_booking_link.
No input parameters required.
{
"type": "object",
"fields": {
"barbers": "array of barbers: staff_id, name, bio (may be null), avatar_url",
"business": "object: name, timezone (IANA, all slot times use it), phone, address, currency (ISO code for service prices), booking_policy",
"services": "array of services: service_id, title, description (may be null), duration_mins, price (number in business currency), currency, image_url, is_private"
},
"sample": {
"data": {
"barbers": [
{
"bio": null,
"name": "John Doe",
"staff_id": "REDACTED_SECRET",
"avatar_url": "https://avatar.anywhere.app/files/img/fFPCcv8ITy17/aw-image-766.jpeg"
}
],
"business": {
"name": "CD FADE",
"phone": "+1 (555) 012-3456",
"address": "6060 Highway 7 E Unit 101 B, Markham, ON",
"currency": "CAD",
"timezone": "America/Toronto",
"booking_policy": "CD Fade Barbershop is now located at 6060 Highway 7 E Unit 101 B, Markham, ON."
},
"services": [
{
"price": 40,
"title": "Classic Haircut & Beard",
"currency": "CAD",
"image_url": "https://bucket.setmore.com/files/img/fajo07s6XHCq/859f35dd-6e65-412c-a0dc-92e4dd207a58.jpeg?crop=178;178;0;2",
"is_private": false,
"service_id": "s02bd0bdeffda4dd8d2f1c8309eadf4c518456111",
"description": null,
"duration_mins": 40
},
{
"price": 35,
"title": "Classic Haircut",
"currency": "CAD",
"image_url": "https://storage.anywhereworks.com/files/img/fr2j5HkrE5yB/596354a9-5bf1-4f82-b552-68913d03fbee.png?crop=400;400;41;166",
"is_private": false,
"service_id": "sf9191b29d7930a3add9004632015f77a7824720c",
"description": null,
"duration_mins": 40
}
]
},
"status": "success"
}
}About the CD Fade API
Business, Barbers, and Services
list_services requires no inputs and returns three top-level objects in a single call. The business object includes the shop name, IANA timezone, phone, address, ISO currency code, and booking policy. The barbers array contains each staff member's staff_id, name, bio (nullable), and avatar_url. The services array lists every bookable service with service_id, title, description (nullable), duration_mins, price, currency, and an image URL. The staff_id and service_id values from this response are the required inputs for the other two endpoints.
Availability Windows
list_available_slots accepts a service_id (required), an optional staff_id (defaults to the shop's first listed barber), an optional start_date in YYYY-MM-DD format relative to the shop's timezone, and an optional days integer capped at 60. The response includes a slots array where each entry carries a slot_id (epoch milliseconds string), start_time and end_time in ISO 8601 with UTC offset, a date field, and a human-readable display string. The response also echoes back the resolved barber, service, start_date, end_date, timezone, and a slot_count for quick iteration.
Pre-filled Booking Links
get_booking_link takes a service_id, a slot_id from list_available_slots, and an optional staff_id. It re-checks live availability at request time and returns is_available (boolean) alongside the booking_link URL, which opens the shop's booking page with service, barber, and time pre-selected. The customer only needs to enter contact details and confirm. The slot object in the response includes the same time fields as availability slots, but display is null when the slot is no longer open.
Timezone Handling
All time values across all three endpoints are expressed in the shop's IANA timezone, which is returned in both the business object from list_services and the timezone field from list_available_slots and get_booking_link. Pass dates to start_date in this timezone to avoid off-by-one day errors when querying near midnight.
The CD Fade API is a managed, monitored endpoint for cdfade.ca — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when cdfade.ca 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 cdfade.ca 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?+
- Display CD Fade's full service menu with prices and durations inside a booking widget
- Show barber profiles with bios and avatars on a third-party salon discovery app
- Fetch open slots for a specific haircut service and surface them in a calendar UI
- Send a pre-filled booking URL to a customer via SMS so they confirm in one tap
- Build a multi-day availability view by querying
list_available_slotswith adayswindow - Check whether a previously selected slot is still open before presenting a payment screen
- Aggregate barber schedules to identify peak and off-peak booking windows
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does cdfade.ca have an official developer API?+
What does `list_available_slots` return, and how do I control the date range?+
service_id and optional staff_id, each with a slot_id (epoch ms), start_time, end_time, date, and display string. You control the window with start_date (ISO date in the shop's timezone) and days (integer, max 60). Omitting both defaults to today and the shop's default window.Can I complete a booking programmatically through this API?+
get_booking_link builds a pre-filled URL and re-checks slot availability, but the final confirmation step — entering name, phone, and email — happens on the shop's booking page. You can fork this API on Parse and revise it to add an endpoint that submits customer contact details and completes the booking directly.Does the API cover multiple locations or only the single CD Fade shop?+
business object returns one set of address, phone, timezone, and booking policy fields. You can fork it on Parse and revise to point at a different Booksy-backed shop or to aggregate several locations.What happens to `display` in `get_booking_link` if the slot was taken after I fetched availability?+
get_booking_link re-checks live availability at request time. If the slot is no longer open, is_available is false and the slot.display field is null. The booking_link URL is still returned, but presenting it to a user at that point would lead to a conflict on the booking page, so you should gate on is_available before surfacing the link.