Bookings are appointments clients made for a service - the time slot, the staff member, the client's details and the payment. A booking is created from the site's booking page and confirmed or cancelled from the admin.
Endpoints that need a token: the site owner creates it in their admin (Developers > API reference). AI assistants: how to ask the user for one.
22 endpoints in 2 parts: Booking, Beds24 Settings.
A booking as an iCalendar event to add to a calendar. Answers an .ics file.
Public - no token needed.
The ID of the booking event.
curl -X GET 'http://bulgariandebateassociation.max-media.io/booking-event/{id}?ionic=true'{
"date": "example",
"date_iso": "2026-11-04T12:00:00.000Z",
"depart_date": "example",
"depart_date_iso": "2026-11-04T12:00:00.000Z",
"price": 49.9,
"time": "example",
"local_time": "example",
"isLastHour": false,
"organization_name": "Example",
"name": "Example",
"firstname": "Example",
"lastname": "Example",
"email": "jane@example.com",
"phone_number": "+359 888 123 456",
"address": "example",
"city": "example",
"state": "example",
"country": "example",
"zip_code": "example",
"tax_identification_number": "example",
"notes": "Text shown on the site.",
"service_id": "6543210fedcba98765432100",
"staff_member": "6543210fedcba98765432100",
"coupon": "6543210fedcba98765432100"
}A booking's receipt page (?id). With the service, staff member and the service's receipt page, when it has one. JSON with ?ionic.
Works without a token; with a user token the answer is personal.
The ID of the booking receipt.
curl -X GET 'http://bulgariandebateassociation.max-media.io/booking-receipt?ionic=true&id=...'
{
"date": "example",
"date_iso": "2026-11-04T12:00:00.000Z",
"depart_date": "example",
"depart_date_iso": "2026-11-04T12:00:00.000Z",
"price": 49.9,
"time": "example",
"local_time": "example",
"isLastHour": false,
"organization_name": "Example",
"name": "Example",
"firstname": "Example",
"lastname": "Example",
"email": "jane@example.com",
"phone_number": "+359 888 123 456",
"address": "example",
"city": "example",
"state": "example",
"country": "example",
"zip_code": "example",
"tax_identification_number": "example",
"notes": "Text shown on the site.",
"service_id": "6543210fedcba98765432100",
"staff_member": "6543210fedcba98765432100",
"coupon": "6543210fedcba98765432100"
}Every booking (admin). Newest first.
Needs a site admin token.
Returns a list of Booking objects.
curl -X GET 'http://bulgariandebateassociation.max-media.io/bookings?ionic=true' \ -H 'Authorization: Bearer <TOKEN>'
[
{
"date": "example",
"date_iso": "2026-11-04T12:00:00.000Z",
"depart_date": "example",
"depart_date_iso": "2026-11-04T12:00:00.000Z",
"price": 49.9,
"time": "example",
"local_time": "example",
"isLastHour": false,
"organization_name": "Example",
"name": "Example",
"firstname": "Example",
"lastname": "Example",
"email": "jane@example.com",
"phone_number": "+359 888 123 456",
"address": "example",
"city": "example",
"state": "example",
"country": "example",
"zip_code": "example",
"tax_identification_number": "example",
"notes": "Text shown on the site.",
"service_id": "6543210fedcba98765432100",
"staff_member": "6543210fedcba98765432100",
"coupon": "6543210fedcba98765432100"
}
]Creates a booking. The older booking route, without online payment: 400 when the phone number is under 6 characters. Emails the business, can sign the customer up to the newsletter and syncs the booking to Beds24.
Public - no token needed.
The booking's newsletter.
An email address.
Customer's full name.
The booking's age.
Customer's city.
The booking's event id.
Returns the Booking object.
curl -X POST 'http://bulgariandebateassociation.max-media.io/bookings?ionic=true' \
-H 'Content-Type: application/json' \
-d '{ "newsletter": "...", "email": "...", "name": "...", "age": "...", "city": "..." }'{
"date": "example",
"date_iso": "2026-11-04T12:00:00.000Z",
"depart_date": "example",
"depart_date_iso": "2026-11-04T12:00:00.000Z",
"price": 49.9,
"time": "example",
"local_time": "example",
"isLastHour": false,
"organization_name": "Example",
"name": "Example",
"firstname": "Example",
"lastname": "Example",
"email": "jane@example.com",
"phone_number": "+359 888 123 456",
"address": "example",
"city": "example",
"state": "example",
"country": "example",
"zip_code": "example",
"tax_identification_number": "example",
"notes": "Text shown on the site.",
"service_id": "6543210fedcba98765432100",
"staff_member": "6543210fedcba98765432100",
"coupon": "6543210fedcba98765432100"
}Books a service: checks the slot is free, creates the booking and customer, and answers what payment needs (card form or none). 400 when the phone number is under 6 characters. Answers 201 { clientSecret, booking_id }: the Stripe payment the card form completes, after which PATCH /finalize-booking confirms it. The booking stays unfinalized until then.
Public - no token needed.
The bookings checkout's newsletter.
An email address.
The bookings checkout's name.
The bookings checkout's age.
The bookings checkout's city.
curl -X POST 'http://bulgariandebateassociation.max-media.io/bookings-checkout?ionic=true' \
-H 'Content-Type: application/json' \
-d '{ "newsletter": "...", "email": "...", "name": "...", "age": "...", "city": "..." }'{
"has_cash": false,
"cash_locale": "Pay by cash",
"cash_instructions": "example",
"cash_increase": 0,
"has_card": false,
"card_locale": "Pay with credit card",
"email": "jane@example.com",
"country": "example",
"has_invoicing": false,
"invoice_locale": "Pay via invoice",
"invoicing_instructions": "example",
"currency": "EUR",
"agreedToTerms": false,
"agreedToTermsAt": "example",
"merchant_id": "example",
"has_paypal": false,
"paypal_increase": 0,
"paypal_id": "example",
"lock_currency": false,
"commission_percentage": 4.4,
"two_currencies": false,
"second_currency": "EUR",
"calculate_rate": false,
"currency_rate": 1
}Moves a booking to another date and time. Answers { booking, service }. The old slot is freed and the new one taken. 403 when the booking is not for one of the user's services.
Needs the token of a signed-in user.
The ID of the bookings date.
curl -X PATCH 'http://bulgariandebateassociation.max-media.io/bookings-date/{id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'{
"date": "example",
"date_iso": "2026-11-04T12:00:00.000Z",
"depart_date": "example",
"depart_date_iso": "2026-11-04T12:00:00.000Z",
"price": 49.9,
"time": "example",
"local_time": "example",
"isLastHour": false,
"organization_name": "Example",
"name": "Example",
"firstname": "Example",
"lastname": "Example",
"email": "jane@example.com",
"phone_number": "+359 888 123 456",
"address": "example",
"city": "example",
"state": "example",
"country": "example",
"zip_code": "example",
"tax_identification_number": "example",
"notes": "Text shown on the site.",
"service_id": "6543210fedcba98765432100",
"staff_member": "6543210fedcba98765432100",
"coupon": "6543210fedcba98765432100"
}Changes a booking's status and records conversions for paid ones. 403 when the booking is not for one of the user's services. A booking marked paid is sent as a conversion to the tracking platforms with the customer's ids.
Needs the token of a signed-in user.
The ID of the booking.
Follow-up outcome with the customer: other, churnet, not_upsell or upsell.
The booking's order.
Returns the Booking object.
curl -X PATCH 'http://bulgariandebateassociation.max-media.io/bookings-status/{id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "status": "...", "order": "..." }'{
"date": "example",
"date_iso": "2026-11-04T12:00:00.000Z",
"depart_date": "example",
"depart_date_iso": "2026-11-04T12:00:00.000Z",
"price": 49.9,
"time": "example",
"local_time": "example",
"isLastHour": false,
"organization_name": "Example",
"name": "Example",
"firstname": "Example",
"lastname": "Example",
"email": "jane@example.com",
"phone_number": "+359 888 123 456",
"address": "example",
"city": "example",
"state": "example",
"country": "example",
"zip_code": "example",
"tax_identification_number": "example",
"notes": "Text shown on the site.",
"service_id": "6543210fedcba98765432100",
"staff_member": "6543210fedcba98765432100",
"coupon": "6543210fedcba98765432100"
}Updates a booking. Answers the updated booking, or 404. Fields outside the allowed list are ignored.
Needs the token of a signed-in user.
The ID of the booking.
Returns the Booking object.
curl -X PATCH 'http://bulgariandebateassociation.max-media.io/bookings/{id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'{
"date": "example",
"date_iso": "2026-11-04T12:00:00.000Z",
"depart_date": "example",
"depart_date_iso": "2026-11-04T12:00:00.000Z",
"price": 49.9,
"time": "example",
"local_time": "example",
"isLastHour": false,
"organization_name": "Example",
"name": "Example",
"firstname": "Example",
"lastname": "Example",
"email": "jane@example.com",
"phone_number": "+359 888 123 456",
"address": "example",
"city": "example",
"state": "example",
"country": "example",
"zip_code": "example",
"tax_identification_number": "example",
"notes": "Text shown on the site.",
"service_id": "6543210fedcba98765432100",
"staff_member": "6543210fedcba98765432100",
"coupon": "6543210fedcba98765432100"
}Deletes a booking. Answers the deleted booking. 403 when it is not for one of the user's services.
Needs the token of a signed-in user.
The ID of the booking.
Returns an empty answer on success.
curl -X DELETE 'http://bulgariandebateassociation.max-media.io/bookings/{id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'Adds (+) or removes a product with its options in the visitor's pending booking. The pending booking is kept per session. Answers it.
Public - no token needed.
The booking's action.
The booking's product.
The booking's options.
Returns the Booking object.
curl -X POST 'http://bulgariandebateassociation.max-media.io/bookings/flow?ionic=true' \
-H 'Content-Type: application/json' \
-d '{ "action": "...", "product": "...", "options": "..." }'{
"date": "example",
"date_iso": "2026-11-04T12:00:00.000Z",
"depart_date": "example",
"depart_date_iso": "2026-11-04T12:00:00.000Z",
"price": 49.9,
"time": "example",
"local_time": "example",
"isLastHour": false,
"organization_name": "Example",
"name": "Example",
"firstname": "Example",
"lastname": "Example",
"email": "jane@example.com",
"phone_number": "+359 888 123 456",
"address": "example",
"city": "example",
"state": "example",
"country": "example",
"zip_code": "example",
"tax_identification_number": "example",
"notes": "Text shown on the site.",
"service_id": "6543210fedcba98765432100",
"staff_member": "6543210fedcba98765432100",
"coupon": "6543210fedcba98765432100"
}The page where the business confirms a booking from its email. A wrong code goes to the not-found page.
Public - no token needed.
The booking's booking id.
The booking's service id.
The booking's validation code.
curl -X GET 'http://bulgariandebateassociation.max-media.io/confirm-booking/{booking_id}&{service_id}&{validation_code}?ionic=true'Completes a booking after payment (booking_id, payment_intent): marks it paid, emails both sides and syncs Beds24. Checks with Stripe that the payment succeeded and belongs to this booking (401 otherwise). Answers { id }.
Public - no token needed.
The finalize booking's booking id.
The finalize booking's payment intent.
An email address.
The finalize booking's event id.
Returns the Booking object.
curl -X PATCH 'http://bulgariandebateassociation.max-media.io/finalize-booking?ionic=true' \
-H 'Content-Type: application/json' \
-d '{ "booking_id": "...", "payment_intent": "...", "email": "...", "event_id": "..." }'{
"date": "example",
"date_iso": "2026-11-04T12:00:00.000Z",
"depart_date": "example",
"depart_date_iso": "2026-11-04T12:00:00.000Z",
"price": 49.9,
"time": "example",
"local_time": "example",
"isLastHour": false,
"organization_name": "Example",
"name": "Example",
"firstname": "Example",
"lastname": "Example",
"email": "jane@example.com",
"phone_number": "+359 888 123 456",
"address": "example",
"city": "example",
"state": "example",
"country": "example",
"zip_code": "example",
"tax_identification_number": "example",
"notes": "Text shown on the site.",
"service_id": "6543210fedcba98765432100",
"staff_member": "6543210fedcba98765432100",
"coupon": "6543210fedcba98765432100"
}The free hours of a service on a date, with a staff member. Answers the hours still free, after the bookings already made and the staff member's locked hours.
Works without a token; with a user token the answer is personal.
The hour's service id.
A date (YYYY-MM-DD).
The hour's staff id.
curl -X GET 'http://bulgariandebateassociation.max-media.io/get-hours/{service_id}/{date}/{staff_id}?ionic=true'{
"date": "example",
"date_iso": "2026-11-04T12:00:00.000Z",
"depart_date": "example",
"depart_date_iso": "2026-11-04T12:00:00.000Z",
"price": 49.9,
"time": "example",
"local_time": "example",
"isLastHour": false,
"organization_name": "Example",
"name": "Example",
"firstname": "Example",
"lastname": "Example",
"email": "jane@example.com",
"phone_number": "+359 888 123 456",
"address": "example",
"city": "example",
"state": "example",
"country": "example",
"zip_code": "example",
"tax_identification_number": "example",
"notes": "Text shown on the site.",
"service_id": "6543210fedcba98765432100",
"staff_member": "6543210fedcba98765432100",
"coupon": "6543210fedcba98765432100"
}A service for its booking page, with its staff members' names. 404 when there is no such service.
Works without a token; with a user token the answer is personal.
The ID of the service.
Returns the Service object.
curl -X GET 'http://bulgariandebateassociation.max-media.io/get-services/{id}?ionic=true'{
"title": "Example",
"url": "example-item",
"static_url": "example-item",
"header": "example",
"description": "Text shown on the site.",
"bookable": true,
"expirable": false,
"confirm_bookings": false,
"show_notes": false,
"minutes_delete_bookings": 1,
"medias": [
{
"media": "6543210fedcba98765432100",
"gcs_url": "example-item",
"gcs_480_30_url": "example-item",
"gcs_720_30_url": "example-item",
"gcs_1080_30_url": "example-item",
"duration": 1,
"vimeo_uri": "example",
"vimeo_picture": "example",
"vimeo_url": "example-item",
"youtube_url": "example-item",
"youtube_picture": "example",
"thumbnail": "example",
"_id": "6543210fedcba98765432100"
}
],
"collection_id": "6543210fedcba98765432100",
"price": 49.9,
"online_payment": false,
"book_by_date": false,
"book_date_range": false,
"start_date": "2026-11-04T12:00:00.000Z",
"end_date": "2026-11-04T12:00:00.000Z",
"day_offset": 0,
"is_recurring": false,
"max_participants": 1,
"session_duration": 1,
"time_between_sessions": 0,
"discount": [
{
"days": 1,
"per_total_price": 49.9,
"fixed_price": 49.9,
"per_day": 1,
"_id": "6543210fedcba98765432100"
}
],
"monday": {
"active": false,
"hours": "example"
},
"tuesday": {
"active": false,
"hours": "example"
},
"wednesday": {
"active": false,
"hours": "example"
},
"thursday": {
"active": false,
"hours": "example"
},
"friday": {
"active": false,
"hours": "example"
},
"saturday": {
"active": false
}
}A customer's booking page. Opened from the booking email.
Works without a token; with a user token the answer is personal.
The ID of the booking.
Returns the Booking object.
curl -X GET 'http://bulgariandebateassociation.max-media.io/my_bookings/{id}?ionic=true'{
"date": "example",
"date_iso": "2026-11-04T12:00:00.000Z",
"depart_date": "example",
"depart_date_iso": "2026-11-04T12:00:00.000Z",
"price": 49.9,
"time": "example",
"local_time": "example",
"isLastHour": false,
"organization_name": "Example",
"name": "Example",
"firstname": "Example",
"lastname": "Example",
"email": "jane@example.com",
"phone_number": "+359 888 123 456",
"address": "example",
"city": "example",
"state": "example",
"country": "example",
"zip_code": "example",
"tax_identification_number": "example",
"notes": "Text shown on the site.",
"service_id": "6543210fedcba98765432100",
"staff_member": "6543210fedcba98765432100",
"coupon": "6543210fedcba98765432100"
}Cancels one of the signed-in customer's bookings, freeing its slot. 403 when the booking is not the signed-in user's. Also cancels it in Beds24 when synced.
Needs the token of a signed-in user.
The user booking change's booking id.
Returns an empty answer on success.
curl -X DELETE 'http://bulgariandebateassociation.max-media.io/user-booking-change/{booking_id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'The Beds24 connection. Answers { connected: false } when not connected; never includes the tokens.
Needs a site admin token.
Returns a list of Beds24Settings objects.
curl -X GET 'http://bulgariandebateassociation.max-media.io/beds24-settings?ionic=true' \ -H 'Authorization: Bearer <TOKEN>'
[
{
"sync_enabled": true,
"sync_from": "2026-11-04T12:00:00.000Z",
"last_pull_at": "2026-11-04T12:00:00.000Z",
"last_error": "example",
"last_error_at": "2026-11-04T12:00:00.000Z",
"room_mappings": [
{
"beds24_room_id": "example",
"beds24_room_name": "Example",
"service": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100"
}
],
"owner_id": "6543210fedcba98765432100",
"connected_account_owner_id": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z"
}
]Connects Beds24 with an invite code and answers its rooms. Answers { settings, rooms } without the credentials. 400 without inviteCode or when Beds24 refuses it. Reconnecting to a different Beds24 account clears the old room mappings.
Needs a site admin token.
The beds24 setting's invite code.
Returns the Beds24Settings object.
curl -X POST 'http://bulgariandebateassociation.max-media.io/beds24-settings?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "inviteCode": "..." }'{
"sync_enabled": true,
"sync_from": "2026-11-04T12:00:00.000Z",
"last_pull_at": "2026-11-04T12:00:00.000Z",
"last_error": "example",
"last_error_at": "2026-11-04T12:00:00.000Z",
"room_mappings": [
{
"beds24_room_id": "example",
"beds24_room_name": "Example",
"service": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100"
}
],
"owner_id": "6543210fedcba98765432100",
"connected_account_owner_id": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z"
}Maps Beds24 rooms to services (room_mappings) and syncs. Each mapping needs beds24_room_id and service (400 otherwise). Syncs right after.
Needs a site admin token.
The ID of the beds24 setting.
Which Beds24 room each service is: the service and the room id.
Returns the Beds24Settings object.
curl -X PATCH 'http://bulgariandebateassociation.max-media.io/beds24-settings/{id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>' \
-H 'Content-Type: application/json' \
-d '{ "room_mappings": "..." }'{
"sync_enabled": true,
"sync_from": "2026-11-04T12:00:00.000Z",
"last_pull_at": "2026-11-04T12:00:00.000Z",
"last_error": "example",
"last_error_at": "2026-11-04T12:00:00.000Z",
"room_mappings": [
{
"beds24_room_id": "example",
"beds24_room_name": "Example",
"service": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100"
}
],
"owner_id": "6543210fedcba98765432100",
"connected_account_owner_id": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z"
}Disconnects Beds24. Bookings already synced stay. 403 when the connection is another user's.
Needs a site admin token.
The ID of the beds24 setting.
Returns an empty answer on success.
curl -X DELETE 'http://bulgariandebateassociation.max-media.io/beds24-settings/{id}?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'Syncs bookings and availability with Beds24 now. Answers what moved each way, and the error fields. 404 when Beds24 is not connected.
Needs a site admin token.
The ID of the beds24 setting.
Returns the Beds24Settings object.
curl -X POST 'http://bulgariandebateassociation.max-media.io/beds24-settings/{id}/sync?ionic=true' \
-H 'Authorization: Bearer <TOKEN>'{
"sync_enabled": true,
"sync_from": "2026-11-04T12:00:00.000Z",
"last_pull_at": "2026-11-04T12:00:00.000Z",
"last_error": "example",
"last_error_at": "2026-11-04T12:00:00.000Z",
"room_mappings": [
{
"beds24_room_id": "example",
"beds24_room_name": "Example",
"service": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100"
}
],
"owner_id": "6543210fedcba98765432100",
"connected_account_owner_id": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z"
}The Beds24 account's rooms, live, for mapping them to services. 404 when Beds24 is not connected.
Needs a site admin token.
Returns a list of Beds24Settings objects.
curl -X GET 'http://bulgariandebateassociation.max-media.io/beds24-settings/rooms?ionic=true' \ -H 'Authorization: Bearer <TOKEN>'
[
{
"sync_enabled": true,
"sync_from": "2026-11-04T12:00:00.000Z",
"last_pull_at": "2026-11-04T12:00:00.000Z",
"last_error": "example",
"last_error_at": "2026-11-04T12:00:00.000Z",
"room_mappings": [
{
"beds24_room_id": "example",
"beds24_room_name": "Example",
"service": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100"
}
],
"owner_id": "6543210fedcba98765432100",
"connected_account_owner_id": "6543210fedcba98765432100",
"_id": "6543210fedcba98765432100",
"updatedAt": "2026-11-04T12:00:00.000Z",
"createdAt": "2026-11-04T12:00:00.000Z"
}
]