Developer docs
API reference
Every endpoint of the Bewtee developer API, with parameters and examples.
On this page (9)
Every endpoint lives under the base URL and needs your API key:
https://api.bewtee.com/api/v1
Authorization: Bearer bw_live_YOUR_API_KEY
Responses use the envelope { "status": true, "message": "...", "data": ... }. Errors are described in Errors, rate limits and retries. The machine-readable description of this API is available as an OpenAPI file, which you can import into Postman, Insomnia and similar tools.
| Method | Path | Purpose |
|---|---|---|
GET |
/business |
The business profile and opening hours |
GET |
/services |
Bookable services with prices and durations |
GET |
/staff |
Staff members customers can book |
GET |
/availability |
Free start times for a date and a set of services |
GET |
/bookings |
List bookings |
POST |
/bookings |
Create a booking |
GET |
/bookings/{id} |
Fetch one booking |
POST |
/bookings/{id}/cancel |
Cancel a booking |
Get the business
GET /business
Profile, booking settings and opening hours of the business that owns the API key.
curl https://api.bewtee.com/api/v1/business \
-H "Authorization: Bearer $BEWTEE_API_KEY"
{
"status": true,
"message": "OK",
"data": {
"id": 123,
"name": "Glow Salon",
"tag_line": "Hair and beauty studio",
"description": null,
"address": { "line_1": "12 MG Road", "line_2": null, "city": "Jaipur", "pin_code": "302001" },
"profile_url": "https://bewtee.com/glow-salon-123",
"timezone": "Asia/Kolkata",
"currency": "INR",
"auto_accept_bookings": true,
"working_hours": [
{ "day": "monday", "is_closed": false, "opens_at": "10:00", "closes_at": "20:00" }
]
}
}
| Field | Description |
|---|---|
auto_accept_bookings |
When true, new bookings are confirmed immediately. |
working_hours[].day |
monday to sunday. |
working_hours[].opens_at, closes_at |
24-hour HH:MM, or null. |
List services
GET /services
Services customers can book: active services that have a price. Up to 1000 are returned.
curl https://api.bewtee.com/api/v1/services \
-H "Authorization: Bearer $BEWTEE_API_KEY"
{
"status": true,
"message": "OK",
"data": [
{
"id": 10,
"name": "Haircut",
"description": null,
"category": { "id": 1, "name": "Hair" },
"price": 500,
"currency": "INR",
"duration_minutes": 45,
"gender": "unisex"
}
]
}
| Field | Description |
|---|---|
id |
Use this in service_ids when checking availability or booking. |
price |
In rupees. |
gender |
Who the service is for: male, female, unisex or null. |
List staff
GET /staff
Active staff members that customers can book with. An empty list means the business does not offer a choice of staff.
curl https://api.bewtee.com/api/v1/staff \
-H "Authorization: Bearer $BEWTEE_API_KEY"
{
"status": true,
"message": "OK",
"data": [
{ "id": 7, "name": "Meera", "designation": "Stylist", "photo_url": null }
]
}
Get free time slots
GET /availability
Start times on one day at which the selected services can be booked. Slots are 15 minutes apart. A slot is listed only when a staff member is free for the whole booking, the business is open, and the time is not in the past.
| Query parameter | Required | Description |
|---|---|---|
date |
Yes | YYYY-MM-DD, today or up to 180 days ahead. |
service_ids[] |
Yes | One to 20 service IDs. Repeat an ID to book it more than once. |
staff_id |
No | Only return times when this staff member is free. |
curl -G https://api.bewtee.com/api/v1/availability \
-H "Authorization: Bearer $BEWTEE_API_KEY" \
--data-urlencode "date=2026-11-16" \
--data-urlencode "service_ids[]=10"
{
"status": true,
"message": "OK",
"data": {
"date": "2026-11-16",
"timezone": "Asia/Kolkata",
"duration_minutes": 45,
"is_closed": false,
"slots": [
{ "time": "14:00", "end": "14:45", "available_staff_ids": [7] },
{ "time": "14:15", "end": "15:00", "available_staff_ids": [7] }
]
}
}
| Field | Description |
|---|---|
duration_minutes |
Total length of the selected services. |
is_closed |
true when the business is closed that day. |
slots[].available_staff_ids |
Staff free for the whole booking. Empty when the business has no bookable staff list. |
Errors: 422 validation_failed when the date is out of range or a service cannot be booked.
List bookings
GET /bookings
Bookings of the business, newest first.
| Query parameter | Required | Description |
|---|---|---|
status |
No | pending, accepted, rejected, cancelled, completed, no_show or expired. |
date_from |
No | Only bookings on or after this appointment date (YYYY-MM-DD). |
date_to |
No | Only bookings on or before this appointment date. |
page |
No | Page number, starting at 1. |
per_page |
No | 1 to 100. Default 25. |
curl -G https://api.bewtee.com/api/v1/bookings \
-H "Authorization: Bearer $BEWTEE_API_KEY" \
--data-urlencode "status=accepted" \
--data-urlencode "date_from=2026-11-16"
{
"status": true,
"message": "OK",
"data": [ { "id": 9812, "status": "accepted", "date": "2026-11-16", "time": "14:00" } ],
"meta": { "page": 1, "per_page": 25, "has_more": false }
}
Each item is a full booking object. When meta.has_more is true, request the next page.
Create a booking
POST /bookings
Books the services at the given time for a customer. The booking starts as pending and is accepted straight away when the business accepts bookings automatically. Payment is at the salon. The customer is matched by phone number, or created if new. See the booking lifecycle.
| Header | Required | Description |
|---|---|---|
Idempotency-Key |
No | Any string up to 255 characters. Repeating a request with the same key returns the original booking instead of creating another. |
| Body field | Required | Description |
|---|---|---|
date |
Yes | YYYY-MM-DD, today or up to 180 days ahead. |
time |
Yes | 24-hour start time HH:MM, in the business timezone. |
service_ids |
Yes | One to 20 service IDs. Repeat an ID to book it more than once. |
staff_id |
No | Book with this staff member. Leave out to let Bewtee assign someone who is free. |
customer.name |
Yes | Up to 100 characters. |
customer.phone |
Yes | 10-digit Indian mobile number, without country code. |
customer.email |
No | Email address. |
customer.gender |
No | male, female or other. |
curl https://api.bewtee.com/api/v1/bookings \
-H "Authorization: Bearer $BEWTEE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-42" \
-d '{
"date": "2026-11-16",
"time": "14:00",
"service_ids": [10],
"customer": { "name": "Asha Rao", "phone": "9876543210", "email": "[email protected]" }
}'
The response is 201 Created with the booking object, or 200 OK with the original booking when the same Idempotency-Key was used before.
| Status | error.code |
Meaning |
|---|---|---|
| 409 | slot_unavailable |
The time is no longer free. Fetch availability again and offer another slot. |
| 409 | idempotency_conflict |
The Idempotency-Key was already used with different booking details. |
| 422 | validation_failed |
A field is missing or invalid. See errors. |
Get a booking
GET /bookings/{id}
curl https://api.bewtee.com/api/v1/bookings/9812 \
-H "Authorization: Bearer $BEWTEE_API_KEY"
Returns the booking object, or 404 not_found when no such booking exists for this business.
Cancel a booking
POST /bookings/{id}/cancel
Cancels a pending or accepted booking on behalf of the business and tells the customer.
| Body field | Required | Description |
|---|---|---|
reason |
No | Up to 200 characters. Shown to the business and the customer. |
curl https://api.bewtee.com/api/v1/bookings/9812/cancel \
-H "Authorization: Bearer $BEWTEE_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "reason": "Customer asked to cancel" }'
Returns the cancelled booking object. Errors: 404 not_found, or 409 invalid_state when the booking is not pending or accepted.
The booking object
The same shape is used by every booking endpoint and inside webhook events.
{
"id": 9812,
"status": "accepted",
"date": "2026-11-16",
"time": "14:00",
"starts_at": "2026-11-16T14:00:00+05:30",
"ends_at": "2026-11-16T14:45:00+05:30",
"duration_minutes": 45,
"amount": { "subtotal": 500, "discount": 0, "total": 500, "currency": "INR" },
"payment_method": "pay_at_salon",
"payment_status": "pay_at_salon",
"customer": { "id": 77, "name": "Asha Rao", "phone": "9876543210", "email": "[email protected]" },
"services": [
{ "service_id": 10, "name": "Haircut", "price": 500, "duration_minutes": 45, "quantity": 1, "staff_id": 7 }
],
"status_reason": null,
"cancelled_by": null,
"accept_deadline_at": null,
"status_updated_at": "2026-11-16T14:02:11+05:30",
"created_at": "2026-11-16T14:01:40+05:30"
}
| Field | Description |
|---|---|
status |
pending, accepted, rejected, cancelled, completed, no_show or expired. |
amount.total |
What the customer pays, in whole rupees. |
services[].service_id |
null for one-off items the business added by hand. |
cancelled_by |
customer, salon or null. |
accept_deadline_at |
While pending, when the request expires if the business does not answer. |