openapi: 3.0.2 info: title: Jammed Bookings API version: 2.4.0 license: name: Jammed Bookings url: https://jammed.app contact: email: api@jammed.app url: https://support.jammed.app x-logo: url: "https://fileshare.jammedapp.com/Profile%20Images/Artboard%205.png" altText: Jammed logo description: | Jammed API allows you to integrate with the Jammed system, and automate key events within third-party systems. We are adding endpoints and features as we need them and as studios request them. If there's an endpoint you need, please contact us. By subscribing to and listening to webhooks your studio can automate sending reminders, automate customer lists and mailing systems, finance and accounting packages, and anything you can imagine really. # Introduction Jammed is powering scheduling and bookings for independent creative spaces, and we're building a new way to connect with them. You can read more about [Jammed on the support pages](https://support.jammedapp.com). Jammed offers webhooks and a polling API, so you can integrate how ever you like with the system. You can also see the version history and roadmap for the [Jammed API on the public Github project](https://github.com/jammed-org/api). # Authentication You authenticate with the API using an API key - this is found in the website settings of the admin section. Issue this header with all requests to the API or it will return a `401 Unauthorized` error. # Getting started To get started, you'll need to create a Jammed account and create a studio account. Once you have setup your studio, head the to Website Setting page and press the 'Enable webhooks' button. From there, you can set the webhook URLs you want Jammed to send to. x-tagGroups: - name: Endpoints tags: - Booking Endpoints - Customer Endpoints - Room Endpoints - Extra Endpoints - Notification Endpoints - Blocked Time Endpoints - Reporting Endpoints - Group Endpoints - Coupon Endpoints - Promocode Endpoints - Studio Endpoints - name: Webhooks tags: - Booking Webhooks - Customer Webhooks - Booking Webhooks - name: Models tags: - booking_model - customer_model - group_model - room_model - coupon_model - promocode_model tags: - name: Booking Webhooks description: Events that happen with a booking - name: Customer Webhooks description: Events that happen with a customer - name: Group Webhooks description: Events that happen with a group/band - name: Booking Endpoints description: Polling API for bookings - name: Customer Endpoints description: Polling API for customers - name: Group Endpoints description: Polling API for groups - name: Room Endpoints description: Polling API for rooms - name: booking_model x-displayName: Booking Model description: | - name: customer_model x-displayName: Customer Model description: | - name: group_model x-displayName: Group Model description: | - name: room_model x-displayName: Room Model description: | - name: coupon_model x-displayName: Coupon Model description: | - name: promocode_model x-displayName: Promocode Model description: | - name: Studio Endpoints description: Studio configuration and feature discovery servers: - url: https://api.jammed.app/api/v2/ description: Jammed API endpoint paths: /bookings.json: get: tags: - Booking Endpoints summary: All bookings description: Returns all non-cancelled bookings with optional sorting and pagination support. operationId: getBookings responses: "200": description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/booking' "401": description: Unauthorized - Invalid API key parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " - name: sort_by in: query required: false description: Field to sort by schema: type: string enum: - created_at - updated_at - start_at - end_at - customer_name - room_name default: created_at example: "created_at" - name: sort_order in: query required: false description: Sort order (ascending or descending) schema: type: string enum: - asc - desc default: desc example: "desc" - name: page in: query required: false description: Page number for pagination schema: type: integer minimum: 1 default: 1 example: 1 - name: per_page in: query required: false description: Number of items per page schema: type: integer minimum: 1 maximum: 100 default: 25 example: 25 post: tags: - Booking Endpoints summary: Create a booking description: | Create a new booking on Jammed as an admin. This creates a booking in the same way as a staff member would from the admin dashboard. You must provide **booking_details** with at least a `start_at`, `end_at`, `room_id`, and `price`. For the customer, you can either: - Provide a `customer_id` to book for an existing customer - Provide `customer_details` with `name` and `email` to create a new customer inline Optionally provide `band_details` with a `name` to associate a group/band, and `extra_ids` to add extras to the booking. The booking is created with source `manually_added` and platform `api_v2`. operationId: createBooking responses: "201": description: Booking created content: application/json: schema: $ref: '#/components/schemas/booking' "401": description: Unauthorized - Invalid API key "422": description: Unprocessable - the booking parameters you provided are invalid content: application/json: schema: $ref: '#/components/schemas/unprocessable_error' requestBody: description: Create a new booking in Jammed required: true content: application/json: schema: $ref: '#/components/schemas/booking_create' parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " /bookings/{code}.json: get: tags: - Booking Endpoints summary: Find a booking by code description: Returns booking with the given code operationId: getBooking responses: "200": description: successful operation content: application/json: schema: $ref: '#/components/schemas/booking' "401": description: Unauthorized - Invalid API key "404": description: Not found - Booking was not found parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " - name: code in: path required: true schema: type: string description: The booking code patch: tags: - Booking Endpoints summary: Update a booking description: | Update an existing booking as an admin. This uses the same booking update flow as staff members would from the admin dashboard. You can update various booking details including time, room, pricing, customer information, and other booking attributes. The booking is identified by its code (same as the GET endpoint). operationId: updateBooking responses: "200": description: Booking updated successfully content: application/json: schema: $ref: '#/components/schemas/booking' "401": description: Unauthorized - Invalid API key "404": description: Not found - Booking was not found "422": description: Unprocessable - the booking parameters you provided are invalid content: application/json: schema: $ref: '#/components/schemas/unprocessable_error' requestBody: description: Update booking details required: true content: application/json: schema: $ref: '#/components/schemas/booking_update' parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " - name: code in: path required: true schema: type: string description: The booking code /bookings/cancelled.json: get: tags: - Booking Endpoints summary: Cancelled bookings description: Returns all cancelled bookings, ordered by cancellation date descending. Supports pagination. operationId: getBookingsCancelled responses: "200": description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/booking' "401": description: Unauthorized - Invalid API key parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " /bookings/started.json: get: tags: - Booking Endpoints summary: Started bookings description: Returns all upcoming bookings (starting in the future), ordered by start time descending. Supports pagination. operationId: getBookingsStarted responses: "200": description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/booking' "401": description: Unauthorized - Invalid API key parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " /bookings/finished.json: get: tags: - Booking Endpoints summary: Finished bookings description: Returns all bookings that have not yet ended, ordered by start time descending. Supports pagination. operationId: getBookingsFinished responses: "200": description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/booking' "401": description: Unauthorized - Invalid API key parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " /bookings/reminder.json: get: tags: - Booking Endpoints summary: Reminder bookings description: Returns all bookings starting 24 hours or more from now, ordered by start time descending. Matches the reminder webhook window. operationId: getBookingsReminder responses: "200": description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/booking' "401": description: Unauthorized - Invalid API key parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " /bookings/one_hour_before.json: get: tags: - Booking Endpoints summary: One hour before bookings description: Returns all bookings starting 1 hour or more from now, ordered by start time descending. Matches the one_hour_before webhook window. operationId: getBookingsOneHourBefore responses: "200": description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/booking' "401": description: Unauthorized - Invalid API key parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " /bookings/updated.json: get: tags: - Booking Endpoints summary: Updated bookings description: Returns all non-cancelled bookings, ordered by last updated date descending. Useful for polling for recently changed bookings. operationId: getBookingsUpdated responses: "200": description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/booking' "401": description: Unauthorized - Invalid API key parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " /bookings/{code}/transactions.json: get: tags: - Booking Endpoints summary: List booking transactions description: | Returns all money log transactions for the specified booking, ordered by most recent first. This includes payments, refunds, credit notes, and other financial transactions associated with the booking. operationId: getBookingTransactions responses: "200": description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/money_log' "401": description: Unauthorized - Invalid API key "404": description: Not found - Booking was not found parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " - name: code in: path required: true schema: type: string description: The booking code post: tags: - Booking Endpoints summary: Create a transaction for a booking description: | Create a new transaction (money log entry) for the specified booking. This creates a credit note transaction with the specified amount and description. The transaction will be associated with the booking and its customer. All amounts should be provided as positive integers in the smallest currency unit (cents/pence) - e.g., £10.50 should be provided as 1050. operationId: createBookingTransaction responses: "201": description: Transaction created successfully content: application/json: schema: $ref: '#/components/schemas/money_log' "401": description: Unauthorized - Invalid API key "404": description: Not found - Booking was not found "422": description: Unprocessable - the transaction parameters you provided are invalid requestBody: description: Create a new transaction for the booking required: true content: application/json: schema: $ref: '#/components/schemas/transaction_create' parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " - name: code in: path required: true schema: type: string description: The booking code /bookings/{code}/studio_notes.json: get: tags: - Booking Endpoints summary: Get booking studio notes description: | Returns the studio notes for the specified booking. Studio notes are internal notes that studios can add to bookings for their own reference. These are not visible to customers. operationId: getBookingStudioNotes responses: "200": description: successful operation content: application/json: schema: type: object properties: studio_notes: type: string description: The studio notes text nullable: true "401": description: Unauthorized - Invalid API key "404": description: Not found - Booking was not found parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " - name: code in: path required: true schema: type: string description: The booking code patch: tags: - Booking Endpoints summary: Update booking studio notes description: | Update the studio notes for the specified booking. Studio notes are internal notes that studios can add to bookings for their own reference. These are not visible to customers. operationId: updateBookingStudioNotes responses: "200": description: Studio notes updated successfully content: application/json: schema: type: object properties: studio_notes: type: string description: The updated studio notes text nullable: true "401": description: Unauthorized - Invalid API key "404": description: Not found - Booking was not found requestBody: description: Update studio notes for the booking required: true content: application/json: schema: $ref: '#/components/schemas/studio_notes_update' parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " - name: code in: path required: true schema: type: string description: The booking code /customers.json: get: tags: - Customer Endpoints summary: Find all customers description: Returns all customers operationId: getCustomers responses: "200": description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/customer' "401": description: Unauthorized - Invalid API key parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " post: tags: - Customer Endpoints summary: Create a customer description: | Create a new customer on Jammed. With a new customer, you must at least provide an **name** and **email address**. You can also issue `actions` to the endpoint, to create and invite the customer to set a password - Jammed will then send them an email from your account with a link to set their password. You can't create a customer with an email address that already exists as a registered customer on Jammed. You can create a customer with an email address that already exists, so long as the customer is not yet registered on Jammed. **Jammed API doesn't accept passwords for customer creation process** - they must be set by the customer themselves in the invitation process to verify the email and to improve security. operationId: createCustomer responses: "201": description: Customer created content: application/json: schema: type: array items: $ref: '#/components/schemas/customer' "401": description: Unauthorized - Invalid API key "422": description: Unprocessable - the customer parameters you provided are invalid content: application/json: schema: $ref: '#/components/schemas/unprocessable_error' requestBody: description: Create a new customer in Jammed required: true content: form-data: schema: $ref: '#/components/schemas/customer_create' parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " /customers/{id}.json: get: tags: - Customer Endpoints summary: Find a customer by ID description: Returns customer with the given ID operationId: getCustomer responses: "200": description: successful operation content: application/json: schema: $ref: '#/components/schemas/customer' "401": description: Unauthorized - Invalid API key "404": description: Not found - Customer was not found parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " - name: id in: path required: true schema: type: integer /coupons/{id}.json: get: tags: - Coupon Endpoints summary: Find a coupon by ID description: Returns coupon with the given ID operationId: getCoupon responses: "200": description: successful operation content: application/json: schema: $ref: '#/components/schemas/coupon' "401": description: Unauthorized - Invalid API key "404": description: Not found - Coupon was not found parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " - name: id in: path required: true schema: type: integer /coupons.json: get: tags: - Coupon Endpoints summary: Find all coupons description: Returns all coupons operationId: getCoupons responses: "200": description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/coupon' "401": description: Unauthorized - Invalid API key parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " post: tags: - Coupon Endpoints summary: Create a coupon description: | Create a new coupon on Jammed. With a new coupon, you must at least provide an **name**, **amount** and **discount_type**. `discount type` is either `fixed_amount`, or `percentage` - and `amount` is in pence/cents or whole pencentage points. Once created, a Coupon can be used by staff members only on a booking. To allow customers to use the Coupon, you need to generate Promocode for the Coupon. operationId: createCoupon responses: "201": description: Coupon created content: application/json: schema: $ref: '#/components/schemas/coupon' "401": description: Unauthorized - Invalid API key "422": description: Unprocessable - the coupon parameters you provided are invalid content: application/json: schema: $ref: '#/components/schemas/unprocessable_error' requestBody: description: Create a new coupon in Jammed required: true content: form-data: schema: $ref: '#/components/schemas/coupon_create' parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " /coupons/{coupon_id}/promocodes.json: get: tags: - Promocode Endpoints summary: Find all promocodes description: Returns all promocodes operationId: getPromocodes responses: "200": description: successful operation content: application/json: schema: $ref: '#/components/schemas/promocode' "401": description: Unauthorized - Invalid API key parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " - name: coupon_id description: Coupon ID to list the promocodes for in: path required: true schema: type: integer example: 123 post: tags: - Promocode Endpoints summary: Create a promocode description: | Create a promocode for a coupon You can provide the API with a **code**, but if you don't we'll generate one for you. You can just `POST` an empty body to create a promocode for a coupon with a generated code. With promocodes you can specify minimum booking values, redemptions limits, limit only to one customer, and limit one use per customer. Once created, a Promocode can be used to apply the Coupon to a booking via the customer booking form operationId: createPromocode responses: "201": description: Promocode created content: application/json: schema: type: array items: $ref: '#/components/schemas/promocode' "401": description: Unauthorized - Invalid API key "422": description: Unprocessable - the promocode parameters you provided are invalid content: application/json: schema: $ref: '#/components/schemas/unprocessable_error' requestBody: description: Create a new promocode in Jammed required: true content: form-data: schema: $ref: '#/components/schemas/promocode_create' parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " - name: coupon_id description: Coupon ID to create promocode for in: path required: true schema: type: integer example: 123 /coupons/{coupon_id}/assign_to_customer.json: post: tags: - Coupon Endpoints summary: Assign Coupon to Customer description: | Assign a Coupon to a Customer Using the Coupon ID and a Customer ID, we can assign a Coupon to a Customer This will mean that the Customer will automatically be able to use the Coupon when booking without the use of a promocode operationId: assignPromocode responses: "201": description: Promocode assigned content: application/json: schema: $ref: '#/components/schemas/promocode' "401": description: Unauthorized - Invalid API key "422": description: Coupon has already been assigned to this Customer content: application/json: schema: $ref: '#/components/schemas/unprocessable_error' requestBody: description: Assign a Coupon to a Customer required: true content: form-data: schema: $ref: '#/components/schemas/coupon_assign_to_customer' parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " - name: coupon_id description: Coupon ID to create promocode for in: path required: true schema: type: integer example: 123 /groups.json: get: tags: - Group Endpoints summary: Find all groups description: Returns all groups operationId: getGroups responses: "200": description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/group' "401": description: Unauthorized - Invalid API key parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " /rooms.json: get: tags: - Room Endpoints summary: Find all rooms description: Returns all rooms operationId: getRooms responses: "200": description: successful operation content: application/json: schema: type: array items: $ref: '#/components/schemas/room' "401": description: Unauthorized - Invalid API key parameters: - name: Authorization in: header required: true schema: type: string example: "Bearer " /studio.json: get: tags: - Studio Endpoints summary: Studio configuration description: | Returns studio branding, feature toggles, usage flags, payment setup, wordings, and plan info. Designed to be called on app launch and cached client-side (recommended: 1 hour). operationId: getStudio parameters: - $ref: '#/components/parameters/authHeader' responses: "200": description: Studio configuration content: application/json: schema: type: object properties: studio: type: object properties: name: type: string description: Studio display name slug: type: string description: Studio subdomain identifier url: type: string description: Studio's default Jammed URL logo: type: object properties: default: type: string nullable: true description: Cropped logo URL square: type: string nullable: true description: Square (512x512) logo URL app: type: string nullable: true description: App-sized (100x100) logo URL timezone: type: string description: IANA timezone (e.g. Europe/London) currency_code: type: string description: ISO 4217 currency code (e.g. GBP) currency_symbol: type: string description: Currency symbol (e.g. £) country_code: type: string description: ISO country code (e.g. GB) opening_time: type: integer description: Opening time in seconds from midnight (e.g. 32400 = 9am) closing_time: type: integer description: Closing time in seconds from midnight (e.g. 82800 = 11pm) slot_length: type: integer description: Booking slot length in seconds (e.g. 1800 = 30min) tax_rate: type: number description: Tax rate percentage (e.g. 20.0), 0 if none configured rooms_count: type: integer description: Total number of rooms features: type: object description: System-wide feature toggles properties: bands_and_groups: type: boolean bookable_staff: type: boolean approval_required: type: boolean enquiries: type: boolean memberships: type: boolean smart_lock_provider: type: string nullable: true description: Smart lock provider name, or null if not configured wordings: type: object description: Custom terminology for the studio properties: customer: type: string description: What the studio calls customers (default 'customer') group: type: string description: What the studio calls groups (default 'group') room: type: string description: What the studio calls rooms (default 'room') usage: type: object description: Subsystem usage flags — true if the studio has data in that subsystem properties: extras: type: boolean recording_sessions: type: boolean audio_uploads: type: boolean custom_questions: type: boolean regular_bookings: type: boolean coupons: type: boolean credit_balance: type: boolean multi_location: type: boolean locations: type: boolean payments: type: object properties: stripe_connected: type: boolean square_connected: type: boolean square_terminal: type: boolean manual_payments: type: boolean description: True when no online payment gateway is configured plan: type: object properties: name: type: string nullable: true description: Plan name (e.g. 'standard') max_rooms: type: integer nullable: true description: Maximum rooms allowed on the plan /dashboard: get: tags: - Booking Endpoints summary: Dashboard composite data description: | Returns rooms, today's bookings, blocked times, opening time, slot length, and timezone in a single call. Powers the ePOS home screen. Accepts optional `from` and `to` date parameters for a date range, or a single `date` parameter. Defaults to today. operationId: getDashboard parameters: - $ref: '#/components/parameters/authHeader' - name: date in: query schema: type: string format: date description: Single date (defaults to today) - name: from in: query schema: type: string format: date description: Start of date range - name: to in: query schema: type: string format: date description: End of date range responses: "200": description: Dashboard data content: application/json: schema: type: object properties: rooms: type: array items: $ref: '#/components/schemas/room' bookings: type: array items: $ref: '#/components/schemas/dashboard_booking' blocked_times: type: array items: $ref: '#/components/schemas/blocked_time' opening_time: type: integer description: Opening time in seconds from midnight (e.g. 32400 = 9am) slot_length: type: integer description: Slot length in seconds (e.g. 3600 = 1 hour) timezone: type: string # --- Booking Management --- x-epos: true /bookings/{code}: delete: tags: - Booking Endpoints summary: Cancel a booking description: Soft-deletes (cancels) a booking. Optionally sends cancellation email. operationId: cancelBooking parameters: - $ref: '#/components/parameters/authHeader' - $ref: '#/components/parameters/bookingCode' - name: send_email in: query schema: type: boolean responses: "200": description: Booking cancelled content: application/json: schema: $ref: '#/components/schemas/status_response' "404": description: Booking not found x-epos: true /bookings/{code}/uncancel: patch: tags: - Booking Endpoints summary: Uncancel a booking description: Restores a previously cancelled booking. operationId: uncancelBooking parameters: - $ref: '#/components/parameters/authHeader' - $ref: '#/components/parameters/bookingCode' responses: "200": description: Booking restored content: application/json: schema: $ref: '#/components/schemas/booking' "404": description: Booking not found x-epos: true /bookings/search: get: tags: - Booking Endpoints summary: Search bookings description: Search bookings by customer name, email, mobile, band name, or booking code. Supports status filtering. operationId: searchBookings parameters: - $ref: '#/components/parameters/authHeader' - name: q in: query schema: type: string description: Search query - name: status_filter in: query schema: type: string enum: [active, cancelled, cancelled_and_active] description: Filter by booking status - $ref: '#/components/parameters/page' - $ref: '#/components/parameters/perPage' responses: "200": description: Search results content: application/json: schema: type: array items: $ref: '#/components/schemas/booking' x-epos: true /bookings/by_dates: get: tags: - Booking Endpoints summary: Bookings by date range description: Returns bookings for a date range, optimized for calendar/schedule display. operationId: bookingsByDates parameters: - $ref: '#/components/parameters/authHeader' - name: from in: query required: true schema: type: string format: date - name: to in: query required: true schema: type: string format: date responses: "200": description: Bookings for date range content: application/json: schema: type: array items: $ref: '#/components/schemas/dashboard_booking' x-epos: true /bookings/awaiting_approval: get: tags: - Booking Endpoints summary: Bookings awaiting approval description: List bookings pending manager approval. operationId: bookingsAwaitingApproval parameters: - $ref: '#/components/parameters/authHeader' - $ref: '#/components/parameters/page' - $ref: '#/components/parameters/perPage' responses: "200": description: Pending bookings content: application/json: schema: type: array items: $ref: '#/components/schemas/booking' x-epos: true /bookings/{code}/approve: post: tags: - Booking Endpoints summary: Approve a booking description: Approve a booking that is awaiting approval. operationId: approveBooking parameters: - $ref: '#/components/parameters/authHeader' - $ref: '#/components/parameters/bookingCode' responses: "200": description: Booking approved content: application/json: schema: $ref: '#/components/schemas/booking' x-epos: true /bookings/{code}/reject: post: tags: - Booking Endpoints summary: Reject a booking description: Reject a booking that is awaiting approval. operationId: rejectBooking parameters: - $ref: '#/components/parameters/authHeader' - $ref: '#/components/parameters/bookingCode' - name: made_by_user_id in: query schema: type: integer responses: "200": description: Booking rejected content: application/json: schema: $ref: '#/components/schemas/booking' x-epos: true /bookings/{code}/pdf: get: tags: - Booking Endpoints summary: Generate booking PDF description: Generate a receipt/confirmation PDF for the booking. operationId: bookingPdf parameters: - $ref: '#/components/parameters/authHeader' - $ref: '#/components/parameters/bookingCode' responses: "200": description: PDF file content: application/pdf: schema: type: string format: binary x-epos: true /bookings/{code}/resend_confirmation: post: tags: - Booking Endpoints summary: Resend confirmation email description: Re-send the booking confirmation email to the customer. operationId: resendConfirmation parameters: - $ref: '#/components/parameters/authHeader' - $ref: '#/components/parameters/bookingCode' responses: "200": description: Email sent content: application/json: schema: $ref: '#/components/schemas/status_response' x-epos: true /bookings/{code}/refund_transaction: post: tags: - Booking Endpoints summary: Refund a transaction description: Refund a specific payment transaction on a booking (Stripe, Square, or Jammed Pay). operationId: refundTransaction parameters: - $ref: '#/components/parameters/authHeader' - $ref: '#/components/parameters/bookingCode' - name: transaction_id in: query required: true schema: type: integer responses: "200": description: Transaction refunded content: application/json: schema: $ref: '#/components/schemas/status_response' x-epos: true /bookings/{code}/refunds: post: tags: - Booking Endpoints summary: Full refund description: Cancel and refund all payments on a booking. operationId: fullRefund parameters: - $ref: '#/components/parameters/authHeader' - $ref: '#/components/parameters/bookingCode' requestBody: content: application/json: schema: type: object properties: send_email: type: boolean refund_reason: type: string responses: "200": description: Booking refunded content: application/json: schema: $ref: '#/components/schemas/status_response' x-epos: true /bookings/{code}/credit_payments: post: tags: - Booking Endpoints summary: Apply credit balance description: Pay a booking using the customer's credit balance. operationId: applyCreditPayment parameters: - $ref: '#/components/parameters/authHeader' - $ref: '#/components/parameters/bookingCode' responses: "200": description: Credit applied content: application/json: schema: $ref: '#/components/schemas/status_response' x-epos: true /bookings/{code}/credit_balances: post: tags: - Booking Endpoints summary: Credit to customer balance description: Credit the booking amount to the customer's balance. operationId: creditToCustomerBalance parameters: - $ref: '#/components/parameters/authHeader' - $ref: '#/components/parameters/bookingCode' requestBody: content: application/json: schema: type: object properties: credit_amount: type: integer send_email: type: boolean responses: "200": description: Booking credited content: application/json: schema: $ref: '#/components/schemas/status_response' x-epos: true /bookings/{code}/notes: patch: tags: - Booking Endpoints summary: Update booking notes description: Update internal staff notes and colour override for a booking. operationId: updateBookingNotes parameters: - $ref: '#/components/parameters/authHeader' - $ref: '#/components/parameters/bookingCode' requestBody: required: true content: application/json: schema: type: object properties: booking: type: object properties: studio_notes: type: string block_colour_override: type: string responses: "200": description: Notes updated content: application/json: schema: $ref: '#/components/schemas/booking' x-epos: true /bookings/{code}/notifications: get: tags: - Booking Endpoints summary: Booking notifications description: View notification history for a booking. operationId: bookingNotifications parameters: - $ref: '#/components/parameters/authHeader' - $ref: '#/components/parameters/bookingCode' responses: "200": description: Notifications list content: application/json: schema: type: array items: type: object x-epos: true /bookings/{code}/history.json: get: tags: - Booking Endpoints summary: Booking history description: | Returns a chronological timeline of all activity on a booking, sorted ascending by time. Includes transactions, notifications, status changes, price changes, coupon redemptions, and more. operationId: getBookingHistory parameters: - $ref: '#/components/parameters/authHeader' - $ref: '#/components/parameters/bookingCode' responses: "200": description: History timeline content: application/json: schema: type: array items: $ref: '#/components/schemas/booking_history_entry' "401": description: Unauthorized - Invalid API key "404": description: Not found - Booking was not found /bookings/{code}/payment_requests: post: tags: - Booking Endpoints summary: Send payment request description: Create and send a payment link to the customer. operationId: createPaymentRequest parameters: - $ref: '#/components/parameters/authHeader' - $ref: '#/components/parameters/bookingCode' requestBody: required: true content: application/json: schema: type: object properties: price: type: integer description: Amount in minor currency units (pence/cents). Must be an integer. required: - price responses: "200": description: Payment request sent content: application/json: schema: $ref: '#/components/schemas/status_response' x-epos: true /bookings/{code}/payment_requests/charge: post: tags: - Booking Endpoints summary: Charge saved card description: Create a payment request and immediately charge the customer's saved card. This is a collection action — it creates a new payment request and settles it in one step. operationId: chargePaymentRequest parameters: - $ref: '#/components/parameters/authHeader' - $ref: '#/components/parameters/bookingCode' requestBody: required: true content: application/json: schema: type: object properties: price: type: integer description: Amount in minor currency units (pence/cents). Must be an integer. use_payment_method: type: string required: - price responses: "200": description: Payment taken content: application/json: schema: $ref: '#/components/schemas/status_response' x-epos: true /bookings/{code}/payment_requests/{id}/mark_as_paid: post: tags: - Booking Endpoints summary: Mark payment as paid description: Record that a manual payment has been received. operationId: markPaymentAsPaid parameters: - $ref: '#/components/parameters/authHeader' - $ref: '#/components/parameters/bookingCode' - name: id in: path required: true schema: type: integer responses: "200": description: Marked as paid content: application/json: schema: $ref: '#/components/schemas/status_response' x-epos: true /bookings/{code}/payment_requests/{id}/cancel: post: tags: - Booking Endpoints summary: Cancel payment request description: Cancel an open payment request. operationId: cancelPaymentRequest parameters: - $ref: '#/components/parameters/authHeader' - $ref: '#/components/parameters/bookingCode' - name: id in: path required: true schema: type: integer responses: "200": description: Payment request cancelled content: application/json: schema: $ref: '#/components/schemas/status_response' x-epos: true /bookings/{code}/settlement_supported: get: tags: - Booking Endpoints summary: Check settlement support description: Check if the booking's customer can be charged remotely (has saved payment methods). operationId: settlementSupported parameters: - $ref: '#/components/parameters/authHeader' - $ref: '#/components/parameters/bookingCode' responses: "200": description: Settlement check result content: application/json: schema: type: object properties: settlement_supported: type: boolean payment_methods: type: array items: type: object # --- Customer Management --- x-epos: true /customers/{id}: put: tags: - Customer Endpoints summary: Update customer description: Update an existing customer's details. operationId: updateCustomer parameters: - $ref: '#/components/parameters/authHeader' - name: id in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: type: object properties: customer: $ref: '#/components/schemas/customer_create_body' responses: "200": description: Customer updated content: application/json: schema: $ref: '#/components/schemas/customer' x-epos: true /customers/search: get: tags: - Customer Endpoints summary: Search customers description: Autocomplete search by name, email, mobile, or band name. Returns top 10 results by booking count. operationId: searchCustomers parameters: - $ref: '#/components/parameters/authHeader' - name: q in: query required: true schema: type: string description: Search query (min 1 character) - name: limit in: query schema: type: integer default: 10 responses: "200": description: Matching customers content: application/json: schema: type: array items: $ref: '#/components/schemas/short_customer' x-epos: true /customers/{id}/notes: patch: tags: - Customer Endpoints summary: Update customer notes description: Add or update internal staff notes about a customer. operationId: updateCustomerNotes parameters: - $ref: '#/components/parameters/authHeader' - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object properties: customer: type: object properties: notes: type: string responses: "200": description: Notes updated content: application/json: schema: $ref: '#/components/schemas/customer' x-epos: true /customers/{id}/invite: post: tags: - Customer Endpoints summary: Invite an existing customer description: | Send a registration invitation to an existing customer who has not yet created their account. Jammed emails the customer a link to set their password, exactly as if they had been created with the `invite` action on `POST /customers.json` - but without creating a duplicate customer record. Use this when the customer already exists (for example, they've already made a booking) and you want them to register. On success, the customer's `status` becomes `invited`. The invitation link is valid for 2 days - after it expires, calling this endpoint again issues a fresh invitation. Returns a `422` error if the customer has already registered an account, or if they already have a valid (unexpired) invitation. Returns a `404` if the customer does not exist or has been deleted. operationId: inviteCustomer parameters: - $ref: '#/components/parameters/authHeader' - name: id in: path required: true schema: type: integer responses: "200": description: Invitation sent content: application/json: schema: $ref: '#/components/schemas/customer' "401": description: Unauthorized - Invalid API key "404": description: Not found - Customer was not found "422": description: Unprocessable - the customer has already registered, or already has a valid invite content: application/json: schema: $ref: '#/components/schemas/unprocessable_error' /customers/{id}/bookings: get: tags: - Customer Endpoints summary: Customer bookings description: List a customer's completed, non-cancelled bookings. operationId: customerBookings parameters: - $ref: '#/components/parameters/authHeader' - name: id in: path required: true schema: type: integer - $ref: '#/components/parameters/page' - $ref: '#/components/parameters/perPage' responses: "200": description: Customer's bookings content: application/json: schema: type: array items: $ref: '#/components/schemas/booking' x-epos: true /customers/{id}/credit_balance: get: tags: - Customer Endpoints summary: Get credit balance description: View the customer's current credit balance. operationId: getCustomerCreditBalance parameters: - $ref: '#/components/parameters/authHeader' - name: id in: path required: true schema: type: integer responses: "200": description: Credit balance content: application/json: schema: type: object properties: id: type: integer credit_balance: type: integer x-epos: true patch: tags: - Customer Endpoints summary: Update credit balance description: Adjust the customer's credit balance. Creates a credit movement record. operationId: updateCustomerCreditBalance parameters: - $ref: '#/components/parameters/authHeader' - name: id in: path required: true schema: type: integer requestBody: required: true content: application/json: schema: type: object properties: customer: type: object properties: credit_balance: type: integer description: New credit balance in minor currency units responses: "200": description: Balance updated content: application/json: schema: type: object properties: id: type: integer credit_balance: type: integer x-epos: true /customers/{id}/credit_movements: get: tags: - Customer Endpoints summary: Credit movements description: View credit transaction history for a customer. operationId: customerCreditMovements parameters: - $ref: '#/components/parameters/authHeader' - name: id in: path required: true schema: type: integer - $ref: '#/components/parameters/page' - $ref: '#/components/parameters/perPage' responses: "200": description: Credit movements content: application/json: schema: type: array items: $ref: '#/components/schemas/credit_movement' x-epos: true /customers/{id}/status: get: tags: - Customer Endpoints summary: Customer status description: Check if a customer is banned or behind on payment. operationId: customerStatus parameters: - $ref: '#/components/parameters/authHeader' - name: id in: path required: true schema: type: integer responses: "200": description: Customer status content: application/json: schema: type: object properties: id: type: integer status: type: string banned: type: boolean behind_payment: type: boolean status_reason_text: type: string x-epos: true /customers/{id}/payment_methods: get: tags: - Customer Endpoints summary: Payment methods description: List a customer's saved payment methods (for remote charging). operationId: customerPaymentMethods parameters: - $ref: '#/components/parameters/authHeader' - name: id in: path required: true schema: type: integer responses: "200": description: Payment methods content: application/json: schema: type: array items: type: object # --- Pricing --- x-epos: true /booking_price: post: tags: - Booking Endpoints summary: Calculate booking price description: | Real-time price calculation with extras, tax, and staff costs. Provide either a `booking_code` to calculate from an existing booking, or `price.hours` and `price.price` for a custom calculation. operationId: calculateBookingPrice parameters: - $ref: '#/components/parameters/authHeader' requestBody: required: true content: application/json: schema: type: object properties: booking_price: type: object properties: booking_code: type: string price: type: object properties: hours: type: string days: type: string price: type: string extras: type: array items: type: object properties: id: type: integer quantity: type: integer staff_ids: type: array items: type: integer responses: "200": description: Price breakdown content: application/json: schema: type: object properties: hours: type: number days: type: integer time_cost: type: integer extras: type: array items: type: object extras_total: type: integer staff_total: type: integer subtotal: type: integer tax_total: type: integer total: type: integer x-epos: true /slot_projection: post: tags: - Booking Endpoints summary: Project time slot description: Preview cost and check conflicts for a time slot. operationId: slotProjection parameters: - $ref: '#/components/parameters/authHeader' requestBody: required: true content: application/json: schema: type: object properties: projection_params: type: object properties: start_time: type: string end_time: type: string date: type: string format: date start_at: type: string end_at: type: string room_id: type: integer room_code: type: string booking_code: type: string responses: "200": description: Slot projection content: application/json: schema: type: object properties: cost: type: integer hours: type: number days: type: integer overlapping_bookings: type: array items: type: object explanation: type: string # --- Extras --- x-epos: true /extras: get: tags: - Extra Endpoints summary: List extras description: All available add-on items with pricing. operationId: listExtras parameters: - $ref: '#/components/parameters/authHeader' responses: "200": description: Extras list content: application/json: schema: type: array items: $ref: '#/components/schemas/extra' x-epos: true /extras/{id}: get: tags: - Extra Endpoints summary: Show extra description: Single extra with stock and pricing detail. operationId: showExtra parameters: - $ref: '#/components/parameters/authHeader' - name: id in: path required: true schema: type: integer responses: "200": description: Extra detail content: application/json: schema: $ref: '#/components/schemas/extra' # --- Rooms (show) --- x-epos: true /rooms/{id}: get: tags: - Room Endpoints summary: Show room description: Room detail with images, pricing, and capacity. operationId: showRoom parameters: - $ref: '#/components/parameters/authHeader' - name: id in: path required: true schema: type: integer responses: "200": description: Room detail content: application/json: schema: $ref: '#/components/schemas/room' # --- Terminals --- /notifications: get: tags: - Notification Endpoints summary: List notifications description: Recent notifications from the last 7 days. operationId: listNotifications parameters: - $ref: '#/components/parameters/authHeader' responses: "200": description: Notifications content: application/json: schema: type: array items: $ref: '#/components/schemas/notification' x-epos: true /notifications/{id}/read: post: tags: - Notification Endpoints summary: Mark as read operationId: markNotificationRead parameters: - $ref: '#/components/parameters/authHeader' - name: id in: path required: true schema: type: integer responses: "200": description: Marked as read content: application/json: schema: $ref: '#/components/schemas/status_response' x-epos: true /notifications/{id}/archive: post: tags: - Notification Endpoints summary: Archive notification operationId: archiveNotification parameters: - $ref: '#/components/parameters/authHeader' - name: id in: path required: true schema: type: integer responses: "200": description: Archived content: application/json: schema: $ref: '#/components/schemas/status_response' x-epos: true /notifications/clear: post: tags: - Notification Endpoints summary: Clear all notifications operationId: clearNotifications parameters: - $ref: '#/components/parameters/authHeader' responses: "200": description: All notifications cleared content: application/json: schema: $ref: '#/components/schemas/status_response' # --- Blocked Times --- x-epos: true /blocked_times: get: tags: - Blocked Time Endpoints summary: List blocked times description: Get all future schedule blocks. operationId: listBlockedTimes parameters: - $ref: '#/components/parameters/authHeader' responses: "200": description: Blocked times content: application/json: schema: type: array items: $ref: '#/components/schemas/blocked_time' x-epos: true post: tags: - Blocked Time Endpoints summary: Create blocked time description: Block a room/time slot for maintenance, private events, etc. operationId: createBlockedTime parameters: - $ref: '#/components/parameters/authHeader' requestBody: required: true content: application/json: schema: type: object properties: blocked_time: type: object properties: room_id: type: integer start_at: type: string format: date-time end_at: type: string format: date-time reason: type: string required: - room_id - start_at - end_at responses: "201": description: Blocked time created content: application/json: schema: $ref: '#/components/schemas/blocked_time' x-epos: true /blocked_times/{id}: patch: tags: - Blocked Time Endpoints summary: Update blocked time operationId: updateBlockedTime parameters: - $ref: '#/components/parameters/authHeader' - name: id in: path required: true schema: type: integer requestBody: content: application/json: schema: type: object properties: blocked_time: type: object properties: room_id: type: integer start_at: type: string format: date-time end_at: type: string format: date-time reason: type: string responses: "200": description: Blocked time updated content: application/json: schema: $ref: '#/components/schemas/blocked_time' x-epos: true delete: tags: - Blocked Time Endpoints summary: Delete blocked time operationId: deleteBlockedTime parameters: - $ref: '#/components/parameters/authHeader' - name: id in: path required: true schema: type: integer responses: "200": description: Blocked time deleted content: application/json: schema: $ref: '#/components/schemas/status_response' # --- Reporting --- x-epos: true /recent_transactions: get: tags: - Reporting Endpoints summary: Recent transactions description: Today's and yesterday's transaction totals by payment method (Stripe, Square, manual cash/card/other). operationId: recentTransactions parameters: - $ref: '#/components/parameters/authHeader' responses: "200": description: Transaction summaries content: application/json: schema: type: object properties: today: $ref: '#/components/schemas/transaction_summary' yesterday: $ref: '#/components/schemas/transaction_summary' x-epos: true /money_ledger: get: tags: - Reporting Endpoints summary: Money ledger description: Searchable transaction history with pagination. operationId: moneyLedger parameters: - $ref: '#/components/parameters/authHeader' - name: q in: query schema: type: string description: Search query (source, transaction ID, booking code, customer name/email) - $ref: '#/components/parameters/page' - $ref: '#/components/parameters/perPage' responses: "200": description: Money logs content: application/json: schema: type: array items: $ref: '#/components/schemas/money_ledger_entry' x-epos: true /bookings/{code}/credit_notes: post: tags: - Booking Endpoints x-epos: true summary: Create credit note description: Apply a manual credit note to a booking (cash, card, or other payment). operationId: createCreditNote parameters: - $ref: '#/components/parameters/authHeader' - $ref: '#/components/parameters/bookingCode' requestBody: required: true content: application/json: schema: type: object properties: price: type: integer description: Amount in minor currency units (pence/cents). Must be an integer. description: type: string manual_type: type: string enum: - cash - card - other required: - price responses: '200': description: Credit note created content: application/json: schema: $ref: '#/components/schemas/status_response' /bookings/{code}/credit_notes/{id}: delete: tags: - Booking Endpoints x-epos: true summary: Delete credit note description: Remove a credit note from a booking. operationId: deleteCreditNote parameters: - $ref: '#/components/parameters/authHeader' - $ref: '#/components/parameters/bookingCode' - name: id in: path required: true schema: type: integer description: Credit note (MoneyLog) ID responses: '200': description: Credit note removed content: application/json: schema: $ref: '#/components/schemas/status_response' '404': description: Credit note or booking not found x-webhooks: booking.created: get: summary: booking.created description: Made when a Jammed booking is made by a customer online, or made by an admin user. Use the taken_by parameter to distinguish. When taken online, taken_by=online - otherwise it is the name of the admin user that took the booking. tags: - Booking Webhooks responses: "200": description: Response content: application/json: schema: "$ref": "#/components/schemas/booking" example: "$ref": "#/components/examples/booking_example/value" booking.updated: get: summary: booking.updated description: Triggered when a booking is updated by a staff member tags: - Booking Webhooks responses: "200": description: Response content: application/json: schema: "$ref": "#/components/schemas/booking" example: "$ref": "#/components/examples/booking_example/value" booking.cancelled: get: summary: booking.cancelled description: Triggered when a booking is cancelled by a customer or by a staff member. Cancellations will free up this time to other customers wishing to book the same time. tags: - Booking Webhooks responses: "200": description: Response content: application/json: schema: "$ref": "#/components/schemas/booking" example: "$ref": "#/components/examples/booking_example/value" booking.reminder: get: summary: booking.reminder description: Booking reminders in Jammed are customisable, but by default are triggered 24 hours prior to the start of the booking. An email is sent to the user, but this event exists so you can also hook in other integrations at this point tags: - Booking Webhooks responses: "200": description: Response content: application/json: example: "$ref": "#/components/examples/booking_example/value" booking.one_hour_before: get: summary: booking.one_hour_before description: Triggered 1 hour before the booking starts tags: - Booking Webhooks responses: "200": description: Response content: application/json: example: "$ref": "#/components/examples/booking_example/value" booking.started: get: summary: booking.started description: Triggered when the booking starts tags: - Booking Webhooks responses: "200": description: Response content: application/json: example: "$ref": "#/components/examples/booking_example/value" booking.finished: get: summary: booking.finished description: Triggered when the booking finishes tags: - Booking Webhooks responses: "200": description: Response content: application/json: example: "$ref": "#/components/examples/booking_example/value" booking.abandoned: get: summary: booking.abandoned description: Triggered when a customer abandons their booking during the checkout process and does not complete the booking. This booking is automatically cancelled by Jammed, but this hook allows you to connect a custom workflow to this event. tags: - Booking Webhooks responses: "200": description: Response content: application/json: schema: "$ref": "#/components/schemas/booking" example: "$ref": "#/components/examples/booking_example/value" booking.proceeding_to_payment: get: summary: booking.proceeding_to_payment description: Triggered as soon as a booking that has to be paid for is sent to the hosted checkout page. It fires immediately and does not wait for the payment to be taken, so pair it with booking.payment to find out whether the checkout was completed. Bookings that skip checkout, such as free bookings, unpaid reservations and pay on arrival, never send this event. tags: - Booking Webhooks responses: "200": description: Response content: application/json: schema: "$ref": "#/components/schemas/booking" example: "$ref": "#/components/examples/booking_example/value" group.created: get: summary: group.created description: Trigger when a group is made on Jammed (also known as bands). It can be manually made in the admin interface, or made at booking time if the group is new tags: - Group Webhooks responses: "200": description: Response content: application/json: schema: "$ref": "#/components/schemas/group" example: "$ref": "#/components/examples/group_example/value" group.updated: get: summary: group.updated description: Trigger when a group is updated on Jammed (also known as bands) tags: - Group Webhooks responses: "200": description: Response content: application/json: schema: "$ref": "#/components/schemas/group" example: "$ref": "#/components/examples/group_example/value" group.deleted: get: summary: group.deleted description: Trigger when a group is deleted on Jammed (also known as bands) tags: - Group Webhooks responses: "200": description: Response content: application/json: schema: "$ref": "#/components/schemas/group" example: "$ref": "#/components/examples/group_example/value" customer.created: get: summary: customer.created description: Trigger when a customer is made on Jammed. It can be manually made in the admin interface, or made at booking time if the customer is new tags: - Customer Webhooks responses: "200": description: Response content: application/json: schema: $ref: "#/components/schemas/customer" example: $ref: "#/components/examples/customer_example/value" customer.updated: get: summary: customer.updated description: Trigger when a customer is updated on Jammed tags: - Customer Webhooks responses: "200": description: Response content: application/json: schema: "$ref": "#/components/schemas/customer" example: "$ref": "#/components/examples/customer_example/value" customer.deleted: get: summary: customer.deleted description: Trigger when a customer is deleted on Jammed tags: - Customer Webhooks responses: "200": description: Response content: application/json: schema: "$ref": "#/components/schemas/customer" example: "$ref": "#/components/examples/customer_example/value" # ===== ePOS ENDPOINTS ===== # --- Dashboard --- components: schemas: booking_history_entry: type: object title: Booking history entry properties: title: type: string description: Short description of the event timestamp: type: integer description: Unix epoch timestamp of the event description: type: string nullable: true description: Detailed description of the event required: - title - timestamp customer_create_body: type: object title: Customer info properties: name: type: string title: Name description: "The customers given full name" email: type: string title: Email description: "The customers email address" mobile: type: string title: Mobile description: "The customers mobile phone number" reminders_opt_in: type: boolean title: Reminders opt-in description: "Whether this customer wants to receive reminders" mailing_list_opt_in: type: boolean title: Mailing list opt-in description: "Whether this customer wants to be on the mailing list" required: - name - email customer_create_actions: type: object title: Customer creation actions - optional properties: invite: type: boolean title: Invite description: Invite this customer to set a password on Jammed. An email will be sent to them and the invite code will last 2 days customer_create: type: object description: "" properties: customer: "$ref": "#/components/schemas/customer_create_body" actions: "$ref": "#/components/schemas/customer_create_actions" short_room: type: object title: Basic room info properties: name: type: string title: Name description: "The name of the room" code: type: string title: Code description: "The code of the room - used internally by Jammed" required: - name - code additionalProperties: false short_extra: type: object title: Basic extra info properties: name: type: string title: Name description: "The name of the extra" category: type: string title: Category description: "The category of the extra" required: - name additionalProperties: false short_customer: type: object title: Basic customer info description: "" properties: name: type: string title: Name description: "The customers given full name" properties: {} email: type: string title: Email description: "The customers email address" properties: {} mobile: type: string title: Mobile description: "The customers mobile phone number" properties: {} avatar: type: string title: Avatar description: "The customers avatar image URL, if any" properties: {} reminders_opt_in: type: boolean title: Reminders opt-in description: "Whether this customer wants to receive reminders" mailing_list_opt_in: type: boolean title: Mailing list opt-in description: "Whether this customer wants to be on the mailing list" required: - name - email additionalProperties: false short_group: type: object title: Basic group info description: "" properties: name: type: string title: Name description: "The name of the group" code: type: string title: Code description: "The code of the group - used internally by Jammed" number_of_members: type: integer title: NumberOfMembers description: "The number of members in the group (only present in full group responses)" number: type: integer title: Number description: "The number of members in the group (present in customer band responses)" nullable: true booking_count: type: integer title: BookingCount description: "The number of bookings for this group" required: - name - code additionalProperties: false booking_custom_answer: type: object properties: question_id: type: integer title: QuestionId description: "The ID of the question that was asked" name: type: string title: Name description: "The name of the question" response: type: string title: Response description: "The response/answer to the question" booking: type: object properties: group: "$ref": "#/components/schemas/short_group" customer: "$ref": "#/components/schemas/short_customer" room: "$ref": "#/components/schemas/short_room" extras: type: array title: Extras description: "The addons/extras added to the booking" items: "$ref": "#/components/schemas/short_extra" custom_answers: type: array title: Custom Answers description: "The responses to custom questions added to the booking" items: "$ref": "#/components/schemas/booking_custom_answer" source_data: type: object title: Source Data description: "The source metadata of the booking, how and where the booking was made" properties: source: type: string title: Source description: "The source of the booking: app, online, regular_booking etc." platform: type: string title: Platform description: "The platform where the booking was made: booking_form, dashboard, staff_section, calendar, app etc." referrer: type: string title: Referrer description: "The referrer - the URL of the booking page" code: type: string title: Code description: "The code of the booking - seen by customers on the booking page" id: type: string title: id description: "Same as code" recording: type: boolean title: Recording description: "Whether the room has been marked as a recording" regular: type: boolean title: Regular description: "Whether the booking is part of a regular booking" online_booking: type: boolean title: OnlineBooking description: "Whether the booking was made online by the customer" created_at: type: integer title: CreatedAt description: "Unix timestamp from epoch" updated_at: type: integer title: UpdatedAt description: "Unix timestamp from epoch" approved_at: type: integer title: ApprovedAt description: "Unix timestamp from epoch - when the booking was approved (if approved)" rejected_at: type: integer title: RejectedAt description: "Unix timestamp from epoch - when the booking was rejected (if rejected)" price: type: integer title: Price description: "The price of the booking time only in cents/pence/units" price_currency: type: string title: PriceCurrency description: "The currency of the price" title: type: string title: Title description: "The title of the booking - this is generated from the customer and group names" start_at: type: integer title: StartAt description: "Unix timestamp from epoch" end_at: type: integer title: EndAt description: "Unix timestamp from epoch" duration: type: integer title: Duration description: "The duration of the booking in seconds" duration_hours: type: number title: DurationHours description: "The duration of the booking in hours, e.g. 1pm-2.30pm = `2.5` hours" duration_full_hours: type: integer title: DurationFullHours description: "The duration of the booking in hours, rounded up to each full hour, e.g. 1pm-2.30pm = `3` hours" activity_name: type: string title: ActivityName description: "The name of the activity the booking is part of - e.g. 'Rehearsal'" dates: type: array title: Dates description: "The dates that the booking is part of in local time - given as strings YYYYMMDD format" items: type: string timezone: type: string title: Timezone description: "The timezone of the booking" has_amount_due: type: boolean title: HasAmountDue description: "Whether the booking still has an amount due" remaining_amount: type: integer title: RemainingAmount description: "The remaining amount due for the booking" cancelled: type: boolean title: Cancelled description: "Whether the booking has been cancelled" taken_by: type: string title: TakenBy description: "The name of the staff member who took the booking - if null, the booking was made by the customer themselves" room: type: object properties: id: type: integer title: id description: "Same as code" code: type: string title: Code description: "The code of the room - used internally by Jammed" name: type: string title: Name description: "The name of the room" description: type: string title: Description description: "The description of the room - you can set this in the admin interface" space_for: type: integer title: SpaceFor description: "The capacity of the room" order: type: integer title: Order twenty_four_hour_booking: type: boolean title: TwentyFourHourBooking description: "Whether the room can be booked 24 hours a day" space_type: type: string title: SpaceType description: "The type of space the room is" hex_colour: type: string title: HexColour description: "The hex colour of the room on the dashboard" active: type: boolean title: Active description: "Whether the room is active for Jammed online bookings" prices_set: type: integer title: PricesSet description: "The count of prices set for the room" price_to: type: string title: PriceTo description: "The maximum price for the room" price_from: type: string title: PriceFrom description: "The minimum price for the room" images: type: array title: Images description: "The images of the room" items: type: object properties: original: type: string title: original description: "Image URL" data: type: object title: Data description: "The hidden data of the room - can be set and used by back-end systems" customer: type: object properties: id: type: integer title: ID description: "Use to identify the customer in other API calls" name: type: string title: Name description: "The customers given full name" email: type: string title: Email description: "The customers email address" mobile: type: string title: Mobile description: "The customers mobile phone number" avatar: type: string title: Avatar description: "The customers avatar image URL, if any" credit_balance: type: integer title: CreditBalance description: "The customers current credit balance in cents/pence/units\n\nThis cannot be changed via the API" status: $ref: "#/components/schemas/customer_statuses" reminders_opt_in: type: boolean title: Reminders opt-in description: "Whether this customer wants to receive reminders" mailing_list_opt_in: type: boolean title: Mailing list opt-in description: "Whether this customer wants to be on the mailing list" signed_up: type: boolean title: SignedUp description: "Whether the customer has signed up" signed_up_at: type: integer title: SignedUpAt description: "Unix timestamp from epoch - when the customer signed up" regular_bookings_count: title: RegularBookingsCount description: 'The number of regular bookings the customer has made. Note: may return boolean `false` instead of `0` when the customer has no regular bookings.' oneOf: - type: integer - type: boolean bookings_count: type: integer title: BookingsCount description: "The number of bookings the customer has made" created_at: type: integer title: CreatedAt description: "Unix timestamp from epoch - when the customer was created" updated_at: type: integer title: UpdatedAt description: "Unix timestamp from epoch - when the customer was last updated" last_booking_at: type: integer title: LastBookingAt description: "Unix timestamp from epoch - when the customer last booked" regular_bookings: type: array title: RegularBookings description: "The customer's regular bookings" items: type: object title: "" description: "" properties: name: type: string title: Name description: "" id: type: integer title: Id description: "" bands: type: array title: Bands or Groups description: "" items: "$ref": "#/components/schemas/short_group" address: "$ref": "#/components/schemas/customer_billing_address" customer_billing_address: type: object title: Customer billing address description: | The customer's billing address, as captured during checkout. This is `null` when the customer has not provided a billing address. properties: company: type: string nullable: true title: Company description: "The company name on the billing address, if any" address_1: type: string nullable: true title: Address line 1 description: "The first line of the billing address" address_2: type: string nullable: true title: Address line 2 description: "The second line of the billing address, if any" town: type: string nullable: true title: Town/City description: "The town or city of the billing address" state: type: string nullable: true title: State/County description: "The state, county or region of the billing address, if any" postcode: type: string nullable: true title: Postcode/ZIP description: "The postal or ZIP code of the billing address" country: type: string nullable: true title: Country description: "The ISO 3166-1 alpha-2 country code of the billing address, e.g. `GB` or `US`" formatted_address: type: string nullable: true title: Formatted address description: "The full billing address as a single comma-separated string, with the country name expanded (e.g. `United States of America`)" group: type: object properties: name: type: string title: Name description: "The name of the group" group_type: type: string title: GroupType description: "The type of the group - e.g. band" number_of_members: type: integer title: NumberOfMembers description: "The number of members in the group" customer_count: type: integer title: CustomerCount description: "The number of customers assigned to the group" regular_bookings_count: type: integer title: RegularBookingsCount description: "The number of regular bookings the group has" bookings_count: type: integer title: BookingsCount description: "The number of bookings the group has" created_at: type: integer title: CreatedAt description: "Unix timestamp from epoch - when the group was created" updated_at: type: integer title: UpdatedAt description: "Unix timestamp from epoch - when the group was last updated" last_booking_at: type: integer title: LastBookingAt description: "Unix timestamp from epoch - when the group last booked" customers: type: array title: Customers description: "The customers assigned to the group" items: "$ref": "#/components/schemas/short_customer" regular_bookings: type: array title: RegularBookings description: "The group's regular bookings" items: type: object title: "" description: "" properties: name: type: string title: Name description: "The name of the regular booking" id: type: integer title: Id description: "The ID of the regular booking" promocode: type: object properties: id: type: integer code: type: string description: | The code the customer can use to redeem the promocode, they enter this code when booking. The code is case-insensitive and must be unique minimum_booking_value: type: integer description: | The minimum booking value the Promocode can be used for. If attempted for a booking below this value, the Coupon will not be applied first_time_use_only: type: boolean description: | If set to true, the Promocode will only be usable once per customer - applies to logged in customers only coupon: type: object properties: id: type: integer name: type: string description: A label for the coupon - this is seen by your customers discount_type: type: string description: | The type of discount the coupon gives Either: 'fixed_amount' or 'percentage' amount: type: integer description: | The integer decimal amount, or percentage that the coupon will deduct. For `discount_type=percentage`, `10` would mean 10% For `discount_type=fixed_amount`, `10` would mean $0.10 or £0.10 etc all_new_customers: type: boolean description: Set to true if you want the coupon to apply to all new customers automatically expires_at: type: string description: The ISO8601 timestamp when the coupon expires. If not set, the coupon will never expire created_at: type: string description: The ISO8601 timestamp when the coupon was created fully_used: type: boolean description: Is set as true if the coupon has been used up, and cannot be used anymore expired: type: boolean description: Is set as true if the coupon has expired status: type: string description: | The status of the coupon: `active`, `deleted`, `expired`, `fully used` duration: type: string description: | The duration of the coupon: `once`, `forever` If `forever`, the coupon can be used over and over by the same customer If `once`, the coupon can only be used once by the same customer total_number_of_uses: type: integer description: The total number of times the coupon can be used number_of_times_used: type: integer description: The number of times the coupon has been used promocodes: type: array description: | The promocodes that are linked to this coupon. items: type: object properties: coupon: "$ref": "#/components/schemas/promocode" coupon_create: type: object description: "" properties: coupon: "$ref": "#/components/schemas/coupon_create_body" coupon_create_body: type: object title: Coupon info properties: name: type: string description: A label for the coupon - this is seen by your customers amount: type: string description: | The integer decimal amount, or percentage that the coupon will deduct. For `discount_type=percentage`, `10` would mean 10% For `discount_type=fixed_amount`, `10` would mean $0.10 or £0.10 etc duration: type: string description: | The duration of the coupon: `once`, `forever` If `forever`, the coupon can be used over and over by the same customer If `once`, the coupon can only be used once by the same customer discount_type: type: string description: | The type of discount the coupon gives Either: 'fixed_amount' or 'percentage' all_new_customers: type: boolean description: Set to true if you want the coupon to apply to all new customers automatically total_number_of_uses: type: integer description: The total number of times the coupon can be used expires_at: type: string description: The ISO8601 timestamp when the coupon expires. If not set, the coupon will never expire required: - name - duration - amount - discount_type promocode_create: type: object description: "" properties: promocode: "$ref": "#/components/schemas/promocode_create_body" promocode_create_body: type: object title: Promocode info properties: code: type: string description: | The code the customer can use to redeem the promocode, they enter this code when booking. The code is case-insensitive and must be unique minimum_booking_value: type: integer description: | The minimum booking value the Promocode can be used for. If attempted for a booking below this value, the Coupon will not be applied coupon_assign_to_customer: type: object title: Coupon assignment properties: customer_id: type: integer description: | The Customer's ID to assign the Coupon to booking_create: type: object description: "" properties: booking: $ref: '#/components/schemas/booking_create_body' booking_create_body: type: object title: Booking info properties: booking_details: $ref: '#/components/schemas/booking_create_details' customer_id: type: integer title: Customer ID description: | The ID of an existing customer to make the booking for. If provided, `customer_details` is not required. customer_details: $ref: '#/components/schemas/booking_create_customer_details' band_details: $ref: '#/components/schemas/booking_create_band_details' band_code: type: string title: Band code description: "The code of an existing band/group to associate with the booking" extra_ids: type: array title: Extra IDs description: "Array of extra IDs to add to the booking" items: type: integer is_recording: type: boolean title: Is recording description: "Whether this booking is a recording session" number_expected: type: integer title: Number expected description: "The number of people expected for the booking" additional_notes: type: string title: Additional notes description: "Any additional notes for the booking" send_email: type: boolean title: Send email description: "Whether to send a confirmation email to the customer. Defaults to true" required: - booking_details booking_create_details: type: object title: Booking time details properties: start_at: type: string title: Start at description: "The start time of the booking in ISO8601 format" example: "2026-03-01T10:00:00Z" end_at: type: string title: End at description: "The end time of the booking in ISO8601 format" example: "2026-03-01T14:00:00Z" room_id: type: integer title: Room ID description: "The ID of the room to book" price: type: integer title: Price description: "The price of the booking in cents/pence/units" example: 6000 required: - start_at - end_at - room_id - price booking_create_customer_details: type: object title: New customer details description: "Provide these if creating a booking for a new customer (instead of using customer_id)" properties: name: type: string title: Name description: "The customer's full name" email: type: string title: Email description: "The customer's email address" mobile: type: string title: Mobile description: "The customer's mobile phone number" required: - name - email booking_create_band_details: type: object title: Band/group details description: "Provide to create or associate a band/group with the booking" properties: name: type: string title: Name description: "The name of the band/group" required: - name unprocessable_error: type: object properties: status: type: string description: Error status example: "error" message: type: string description: Error message example: "The model parameters you provided are invalid" customer_statuses: type: string title: CustomerStatus enum: - unregistered - invited - registered - banned - behind_payment description: | The status of the customer `unregistered`: The customer has booked but not registered an account `invited`: The customer has been invited to register an account `registered`: The customer has registered an account `banned`: The customer has been marked as banned from booking (and will not be able to book) `behind_payment`: The customer has been marked as behind on payments (and will not be able to book) booking_update: type: object description: Booking update parameters properties: booking: type: object properties: start_at: type: string format: date-time description: Start time of the booking end_at: type: string format: date-time description: End time of the booking room_id: type: integer description: ID of the room for the booking price: type: integer description: Price of the booking in cents/pence additional_notes: type: string description: Additional notes for the booking studio_notes: type: string description: Internal studio notes number_expected: type: integer description: Expected number of attendees transaction_create: type: object description: Transaction creation parameters properties: transaction: type: object properties: amount: type: integer description: Transaction amount in cents/pence (must be positive) description: type: string description: Description of the transaction manual_type: type: string description: Type of manual transaction enum: [card, cash, bank_transfer, other] default: card required: - amount - description studio_notes_update: type: object description: Studio notes update parameters properties: booking: type: object properties: studio_notes: type: string description: Internal studio notes (visible only to studio staff) money_log: type: object description: A financial transaction record properties: id: type: integer description: Unique identifier for the money log entry source: type: string description: The source/type of the transaction amount: type: integer description: Transaction amount in cents/pence currency_code: type: string description: Currency code (e.g., GBP, USD, EUR) created_at: type: integer description: Unix timestamp when the transaction was created display_amount: type: string description: Formatted amount with currency symbol refund: type: boolean description: Whether this transaction is a refund success: type: boolean description: Whether the transaction was successful title: type: string description: Display title for the transaction description: type: string description: Description of the transaction (for credit notes) nullable: true manual_type: type: string description: Type of manual transaction (for credit notes) nullable: true notification: type: object title: Notification properties: id: type: integer title: type: string body: type: string severity: type: string enum: [normal, high] label: type: string read: type: boolean created_at: type: integer description: Unix timestamp read_at: type: integer description: Unix timestamp (null if unread) nullable: true blocked_time: type: object title: Blocked Time properties: id: type: integer room_id: type: integer reason: type: string start_at: type: integer description: Unix timestamp end_at: type: integer description: Unix timestamp start_time: type: string description: "Format: YYYY-MM-DD HH:MM" end_time: type: string description: "Format: YYYY-MM-DD HH:MM" room: type: object properties: id: type: integer name: type: string code: type: string extra: type: object title: Extra properties: id: type: integer title: type: string type: type: string code: type: string category: type: string available: type: boolean can_add_multiple_quantity: type: boolean track_stock: type: boolean price_per_use: type: integer price_per_hour: type: integer price_per_daily: type: integer price_per_weekly: type: integer dashboard_booking: type: object title: DashboardBooking description: 'A booking as returned by the dashboard endpoint. Note: this format differs significantly from the full booking schema.' properties: id: type: integer code: type: string name: type: string description: Customer name title: type: string description: Display title, e.g. "John Doe (The Beatles)" band_name: type: string description: Band/group name, empty string if none is_recording: type: boolean nullable: true session_name: type: string nullable: true block_colour_override: type: string nullable: true description: Hex colour override for the booking block studio_notes: type: string nullable: true additional_notes: type: string nullable: true number_expected: type: integer nullable: true start: type: string description: 'Start datetime as "YYYY-MM-DD HH:mm"' example: "2026-03-24 11:41" end: type: string description: 'End datetime as "YYYY-MM-DD HH:mm"' example: "2026-03-24 12:41" split: type: string description: Room code — use to match against rooms[].code room_name: type: string description: Room display name has_amount_due: type: boolean amount_due: type: string description: 'Formatted currency string e.g. "£1.00"' payments_recieved: type: boolean description: 'Whether any payments have been received (note: API uses this spelling)' regular: type: boolean incomplete: type: boolean show_studio_notes: type: boolean extras_summary: type: array items: type: string description: Array of extra item descriptions (empty array if none) link: type: string description: 'Admin link path e.g. "/admin/bookings/R9XT9J1JFX"' type: type: string description: '"booking" or "blocked"' class: type: string description: 'CSS class for the booking block e.g. "room-l3j5nwp8"' credit_movement: type: object title: Credit Movement properties: id: type: integer amount: type: integer source: type: string created_at: type: integer booking: type: object properties: id: type: integer code: type: string made_by: type: string money_ledger_entry: type: object title: Money Ledger Entry properties: id: type: integer source: type: string amount: type: integer currency_code: type: string transaction_id: type: string created_at: type: integer source_data: type: object booking: type: object properties: code: type: string name: type: string customer: type: object properties: id: type: integer name: type: string transaction_summary: type: object title: Transaction Summary properties: date: type: string stripe: type: integer stripe_refunds: type: integer square: type: integer square_refunds: type: integer square_terminal: type: integer square_terminal_refunds: type: integer manual_total: type: integer manual_cash: type: integer manual_card: type: integer manual_other: type: integer total_taken: type: integer total_refunded: type: integer total: type: integer status_response: type: object title: Status Response properties: status: type: string enum: [ok, error] message: type: string examples: booking_example: value: name: Rush group_type: band number_of_members: 3 customers: - name: Geddy Lee email: geddy22@yahoo.ca - name: Neil Peart email: theprofessor2112@gmail.com mobile: "+447584948502" - name: Alex Lifeson email: alex-lifeson@me.com mobile: "+442072983029" customer_count: 3 regular_bookings: - name: Monday 8pm Red Room id: 503 regular_bookings_count: 1 bookings_count: 61 created_at: 1646247874 updated_at: 1646247874 customer_example: value: email: Geddy Lee avatar: https://www.gravatar.com/avatar/02e414a53149473ddd8ed541fac40b6f?d=mp&s=45 status: unregistered signed_up: false bands: - name: Rush code: DI3EK30SP number: 3 booking_count: 9 regular_bookings_count: 1 regular_bookings: - name: Geddy Lee (Rush) id: 2112 bookings_count: 9 last_booking_at: 1643799530 created_at: 1643799530 updated_at: 1643799530 address: company: Rush address_1: 2112 Tom Sawyer Avenue address_2: Studio B town: Toronto state: ON postcode: M5V 2T6 country: CA formatted_address: 2112 Tom Sawyer Avenue, Studio B, Toronto, ON, M5V 2T6, Canada group_example: value: name: Rush group_type: band number_of_members: 3 customers: - name: Geddy Lee email: geddy22@yahoo.ca mobile: "+447584948502" - name: Neil Peart email: theprofessor2112@gmail.com mobile: "+447584948502" - name: Alex Lifeson email: alex-lifeson@me.com mobile: "+442072983029" customer_count: 3 regular_bookings: - name: Geddy Lee (Rush) id: 2112 regular_bookings_count: 1 bookings_count: 6171 created_at: 1646247874 updated_at: 1646247874 # ePOS schemas parameters: authHeader: name: Authorization in: header required: true schema: type: string example: "Bearer " bookingCode: name: code in: path required: true schema: type: string description: Booking code page: name: page in: query schema: type: integer minimum: 1 default: 1 perPage: name: per_page in: query schema: type: integer minimum: 1 maximum: 100 default: 25 securitySchemes: apiKey: type: apiKey name: "Authorization: 'Bearer '" in: header description: | Issue a http header with the key 'Authorization' and value 'Bearer api_key'