---
openapi: 3.0.2
info:
title: Jammed Bookings API
version: 2.0.3
license:
name: Jammed Bookings
url: https://jammed.app
contact:
email: api@jammed.app
url: https://support.jammedapp.com
x-logo:
url: "https://jammed.app/static/assets/logo/fill.svg"
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, 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
- Group Endpoints
- Room Endpoints
- name: Webhooks
tags:
- Booking Webhooks
- Customer Webhooks
- Booking Webhooks
- name: Models
tags:
- booking_model
- customer_model
- group_model
- room_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: |
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 bookings, ordered by creation date
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 "
/bookings/cancelled.json:
get:
tags:
- Booking Endpoints
summary: Cancelled bookings
description: Returns all cancelled bookings, ordered by cancellation date
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 started bookings, ordered by start time
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 finished bookings, ordered by start time
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 "
/customers.json:
get:
tags:
- Customer Endpoints
summary: Find all customer
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:
type: array
items:
$ref: '#/components/schemas/customer'
"401":
description: Unauthorized - Invalid API key
"404":
description: Not found - Customer with the given ID was not found
parameters:
- name: Authorization
in: header
required: true
schema:
type: string
example: "Bearer "
- name: id
in: path
required: true
schema:
type: integer
/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 "
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"
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"
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"
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:
schema:
"$ref": "#/components/schemas/booking"
example:
"$ref": "#/components/examples/booking"
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:
schema:
"$ref": "#/components/schemas/booking"
example:
"$ref": "#/components/examples/booking"
booking.started:
get:
summary: booking.started
description: Triggered when the booking starts
tags:
- Booking Webhooks
responses:
"200":
description: Response
content:
application/json:
schema:
"$ref": "#/components/schemas/booking"
example:
"$ref": "#/components/examples/booking"
booking.finished:
get:
summary: booking.finished
description: Triggered when the booking finishes
tags:
- Booking Webhooks
responses:
"200":
description: Response
content:
application/json:
schema:
"$ref": "#/components/schemas/booking"
example:
"$ref": "#/components/examples/booking"
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"
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"
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"
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"
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"
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"
components:
schemas:
customer_create_body:
type: object
title: Customer info
properties:
name:
type: string
title: Name
description: ""
properties: {}
email:
type: string
title: Email
description: ""
properties: {}
mobile:
type: string
title: Mobile
description: ""
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
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: ""
code:
type: string
title: Code
description: ""
required:
- name
additionalProperties: false
short_customer:
type: object
title: Basic customer info
description: ""
properties:
name:
type: string
title: Name
description: ""
properties: {}
email:
type: string
title: Email
description: ""
properties: {}
mobile:
type: string
title: Mobile
description: ""
properties: {}
avatar:
type: string
title: Avatar
description: ""
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
additionalProperties: false
short_group:
type: object
title: Basic group info
description: ""
properties:
name:
type: string
title: Name
description: ""
properties: {}
code:
type: string
title: Code
description: ""
properties: {}
number_of_members:
type: integer
title: NumberOfMembers
description: ""
properties: {}
required: []
additionalProperties: false
booking:
type: object
properties:
group:
type: object
"$ref": "#/components/schemas/short_group"
customer:
"$ref": "#/components/schemas/short_customer"
room:
"$ref": "#/components/schemas/short_room"
code:
type: string
title: Code
description: ""
id:
type: string
title: id
description: "Same as code"
created_at:
type: integer
title: CreatedAt
description: "Unix timestamp from epoch"
updated_at:
type: integer
title: UpdatedAt
description: "Unix timestamp from epoch"
price:
type: integer
title: Price
description: ""
price_currency:
type: string
title: PriceCurrency
description: ""
recording:
type: boolean
title: Recording
description: ""
regular:
type: boolean
title: Regular
description: ""
title:
type: string
title: Title
description: ""
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: float
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"
number_expected:
type: integer
title: NumberExpected
description: ""
has_amount_due:
type: boolean
title: HasAmountDue
description: ""
remaining_amount:
type: integer
title: RemainingAmount
description: ""
taken_by:
type: string
title: TakenBy
description: ""
room:
type: object
properties:
id:
type: string
title: id
code:
type: string
title: Code
name:
type: string
title: Name
description:
type: string
title: Description
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"
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"
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"
customer:
type: object
properties:
name:
type: string
title: Name
description: ""
email:
type: string
title: Email
description: ""
mobile:
type: string
title: Mobile
description: ""
avatar:
type: string
title: Avatar
description: ""
status:
type: string
title: Status
description: ""
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"
bands:
type: array
title: Bands or Groups
description: ""
items:
type: object
title: ""
description: ""
"$ref": "#/components/schemas/short_group"
signed_up:
type: boolean
title: SignedUp
description: ""
signed_up_at:
type: integer
title: SignedUpAt
description: ""
regular_bookings_count:
type: integer
title: RegularBookingsCount
description: ""
regular_bookings:
type: array
title: RegularBookings
description: ""
items:
type: object
title: ""
description: ""
properties:
name:
type: string
title: Name
description: ""
id:
type: integer
title: Id
description: ""
bookings_count:
type: integer
title: BookingsCount
description: ""
created_at:
type: integer
title: CreatedAt
description: ""
updated_at:
type: integer
title: UpdatedAt
description: ""
last_booking_at:
type: integer
title: LastBookingAt
description: ""
group:
type: object
properties:
name:
type: string
title: Name
description: ""
group_type:
type: string
title: GroupType
description: ""
number_of_members:
type: integer
title: NumberOfMembers
description: ""
customers:
type: array
title: Customers
description: ""
items:
type: object
title: ""
description: ""
"$ref": "#/components/schemas/short_customer"
regular_bookings:
type: array
title: RegularBookings
description: ""
items:
type: object
title: ""
description: ""
properties:
name:
type: string
title: Name
description: ""
id:
type: integer
title: Id
description: ""
customer_count:
type: integer
title: CustomerCount
description: ""
regular_bookings_count:
type: integer
title: RegularBookingsCount
description: ""
bookings_count:
type: integer
title: BookingsCount
description: ""
created_at:
type: integer
title: CreatedAt
description: ""
updated_at:
type: integer
title: UpdatedAt
description: ""
last_booking_at:
type: integer
title: LastBookingAt
description: ""
unprocessable_error:
type: object
properties:
status:
type: string
description: Error status
example: "error"
message:
type: string
description: Error message
example: "The customer parameters you provided are invalid"
examples:
booking:
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:
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
group:
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
securitySchemes:
apiKey:
type: apiKey
name: "Authorization: 'Bearer '"
in: header
description: |
Issue a http header with the key 'Authorization' and value 'Bearer api_key'