openapi: 3.0.3 info: title: PushPress Platform API description: >- The PushPress Platform API lets developers integrate with the PushPress gym and fitness business management platform. It exposes gym members (customers), check-ins (class, appointment, event, and open-facility), appointments, classes and class types, events, plan enrollments, membership plans, company details, staff/member invitations, transactional messaging (email, SMS, push, notifications), API key management, and platform webhook subscriptions for real-time events. All requests are REST over HTTPS. Every request is authenticated with an API key passed in the `API-KEY` header, and is scoped to a single gym location (company) by the `company-id` header. Endpoint PATHS and HTTP METHODS in this document are grounded in PushPress's live public API reference and the official Speakeasy-generated PushPress SDK (`@pushpress/pushpress`, production server `https://api.pushpress.com/v3`). Request and response SCHEMAS are modeled by API Evangelist to a reasonable fidelity and should be verified against the authoritative PushPress OpenAPI before code generation. version: '3.0' contact: name: PushPress url: https://www.pushpress.com x-grounding: pathsAndMethods: confirmed schemas: modeled sources: - https://ppe.apidocumentation.com/ - https://github.com/PushPress/pushpress-ts - https://www.npmjs.com/package/@pushpress/pushpress servers: - url: https://api.pushpress.com/v3 description: Production - url: https://api.pushpressstage.com/v3 description: Staging - url: https://api.pushpressdev.com/v3 description: Development security: - api_key: [] tags: - name: Company description: The gym / business (company) the API key is scoped to. - name: Customers description: Gym members and leads (customers). - name: Attributions description: Marketing / lead-source attributions for a customer. - name: Checkins description: Class, appointment, event, and open-facility check-ins. - name: Appointments description: Scheduled one-on-one or small-group appointments. - name: Classes description: Scheduled classes and class types. - name: Events description: Gym events (workshops, competitions, socials). - name: Enrollments description: Customer enrollments in membership plans. - name: Plans description: Membership and billing plans offered by the gym. - name: Invitations description: Invitations for members or staff to join the gym on PushPress. - name: Messages description: Transactional email, SMS, push, and in-app notifications. - name: ApiKeys description: Programmatic API key management. - name: Webhooks description: Platform webhook subscriptions for real-time events. paths: /company: get: operationId: getCompany tags: - Company summary: Get company details description: Retrieves details for the company (gym) the API key is scoped to. responses: '200': description: The company. content: application/json: schema: $ref: '#/components/schemas/Company' '401': $ref: '#/components/responses/Unauthorized' /customers: get: operationId: listCustomers tags: - Customers summary: List customers description: Lists customers (members and leads) for the company, with pagination. parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Offset' responses: '200': description: A page of customers. content: application/json: schema: $ref: '#/components/schemas/CustomerList' '401': $ref: '#/components/responses/Unauthorized' post: operationId: createCustomer tags: - Customers summary: Create a new customer description: Creates a new customer (member or lead) for the company. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CustomerInput' responses: '200': description: The created customer. content: application/json: schema: $ref: '#/components/schemas/Customer' '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/ValidationError' /customers/{uuid}: parameters: - $ref: '#/components/parameters/Uuid' get: operationId: getCustomer tags: - Customers summary: Get customer details description: Retrieves a single customer by UUID. responses: '200': description: The requested customer. content: application/json: schema: $ref: '#/components/schemas/Customer' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /attributions/attributions: get: operationId: listAttributions tags: - Attributions summary: List customer attributions description: Lists lead-source / marketing attributions for customers. responses: '200': description: A list of attributions. content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Attribution' '401': $ref: '#/components/responses/Unauthorized' post: operationId: createAttribution tags: - Attributions summary: Create a customer attribution description: Creates a lead-source / marketing attribution for a customer. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AttributionInput' responses: '200': description: The created attribution. content: application/json: schema: $ref: '#/components/schemas/Attribution' '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/ValidationError' /attributions/attributions/{uuid}: parameters: - $ref: '#/components/parameters/Uuid' get: operationId: getAttribution tags: - Attributions summary: Get a customer attribution description: Retrieves a single customer attribution by UUID. responses: '200': description: The requested attribution. content: application/json: schema: $ref: '#/components/schemas/Attribution' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /checkins/count: get: operationId: getCheckinCount tags: - Checkins summary: Get check-in count description: Returns the number of check-ins matching the supplied filters. parameters: - name: since in: query required: false description: Unix timestamp (ms) lower bound for the count window. schema: type: integer format: int64 - name: until in: query required: false description: Unix timestamp (ms) upper bound for the count window. schema: type: integer format: int64 responses: '200': description: The check-in count. content: application/json: schema: type: object properties: count: type: integer '401': $ref: '#/components/responses/Unauthorized' /checkins/class: get: operationId: listClassCheckins tags: - Checkins summary: List class check-ins description: Lists check-ins associated with scheduled classes. parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Offset' responses: '200': description: A page of class check-ins. content: application/json: schema: $ref: '#/components/schemas/CheckinList' '401': $ref: '#/components/responses/Unauthorized' /checkins/class/{uuid}: parameters: - $ref: '#/components/parameters/Uuid' get: operationId: getClassCheckin tags: - Checkins summary: Get class check-in details description: Retrieves a single class check-in by UUID. responses: '200': description: The requested check-in. content: application/json: schema: $ref: '#/components/schemas/Checkin' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /checkins/appointment: get: operationId: listAppointmentCheckins tags: - Checkins summary: List appointment check-ins description: Lists check-ins associated with appointments. parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Offset' responses: '200': description: A page of appointment check-ins. content: application/json: schema: $ref: '#/components/schemas/CheckinList' '401': $ref: '#/components/responses/Unauthorized' /checkins/appointment/{uuid}: parameters: - $ref: '#/components/parameters/Uuid' get: operationId: getAppointmentCheckin tags: - Checkins summary: Get appointment check-in details description: Retrieves a single appointment check-in by UUID. responses: '200': description: The requested check-in. content: application/json: schema: $ref: '#/components/schemas/Checkin' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /checkins/event: get: operationId: listEventCheckins tags: - Checkins summary: List event check-ins description: Lists check-ins associated with events. parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Offset' responses: '200': description: A page of event check-ins. content: application/json: schema: $ref: '#/components/schemas/CheckinList' '401': $ref: '#/components/responses/Unauthorized' /checkins/event/{uuid}: parameters: - $ref: '#/components/parameters/Uuid' get: operationId: getEventCheckin tags: - Checkins summary: Get event check-in details description: Retrieves a single event check-in by UUID. responses: '200': description: The requested check-in. content: application/json: schema: $ref: '#/components/schemas/Checkin' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /checkins/open: get: operationId: listOpenCheckins tags: - Checkins summary: List open-facility check-ins description: Lists open-gym / open-facility check-ins not tied to a class, appointment, or event. parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Offset' responses: '200': description: A page of open check-ins. content: application/json: schema: $ref: '#/components/schemas/CheckinList' '401': $ref: '#/components/responses/Unauthorized' /checkins/open/{uuid}: parameters: - $ref: '#/components/parameters/Uuid' get: operationId: getOpenCheckin tags: - Checkins summary: Get open-facility check-in details description: Retrieves a single open-facility check-in by UUID. responses: '200': description: The requested check-in. content: application/json: schema: $ref: '#/components/schemas/Checkin' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /appts/{id}: parameters: - $ref: '#/components/parameters/Id' get: operationId: getAppointment tags: - Appointments summary: Get details for an appointment description: Retrieves a single appointment by ID. responses: '200': description: The requested appointment. content: application/json: schema: $ref: '#/components/schemas/Appointment' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /classes/{id}: parameters: - $ref: '#/components/parameters/Id' get: operationId: getClass tags: - Classes summary: Get details for a class description: Retrieves a single scheduled class by ID. responses: '200': description: The requested class. content: application/json: schema: $ref: '#/components/schemas/Class' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /classes/types: get: operationId: listClassTypes tags: - Classes summary: List class types description: Lists the class types offered by the gym. responses: '200': description: A list of class types. content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/ClassType' '401': $ref: '#/components/responses/Unauthorized' /classes/types/{id}: parameters: - $ref: '#/components/parameters/Id' get: operationId: getClassType tags: - Classes summary: Get a class type description: Retrieves a single class type by ID. responses: '200': description: The requested class type. content: application/json: schema: $ref: '#/components/schemas/ClassType' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /events: get: operationId: listEvents tags: - Events summary: List events description: Lists gym events, with pagination. parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Offset' responses: '200': description: A page of events. content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Event' '401': $ref: '#/components/responses/Unauthorized' /events/{id}: parameters: - $ref: '#/components/parameters/Id' get: operationId: getEvent tags: - Events summary: Get details for an event description: Retrieves a single event by ID. responses: '200': description: The requested event. content: application/json: schema: $ref: '#/components/schemas/Event' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /enrollments: get: operationId: listEnrollments tags: - Enrollments summary: List plan enrollments description: Lists customer enrollments in membership plans, with pagination. parameters: - $ref: '#/components/parameters/Limit' - $ref: '#/components/parameters/Offset' responses: '200': description: A page of enrollments. content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Enrollment' '401': $ref: '#/components/responses/Unauthorized' /enrollments/{uuid}: parameters: - $ref: '#/components/parameters/Uuid' get: operationId: getEnrollment tags: - Enrollments summary: Get plan enrollment details description: Retrieves a single plan enrollment by UUID. responses: '200': description: The requested enrollment. content: application/json: schema: $ref: '#/components/schemas/Enrollment' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /plans/{id}: parameters: - $ref: '#/components/parameters/Id' get: operationId: getPlan tags: - Plans summary: Get plan details description: Retrieves a single membership / billing plan by ID. responses: '200': description: The requested plan. content: application/json: schema: $ref: '#/components/schemas/Plan' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /invitations: get: operationId: listInvitations tags: - Invitations summary: List invitations description: Lists outstanding invitations for the company. responses: '200': description: A list of invitations. content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Invitation' '401': $ref: '#/components/responses/Unauthorized' post: operationId: createInvitations tags: - Invitations summary: Create invitations description: Creates one or more invitations for members or staff to join the gym. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/InvitationInput' responses: '200': description: The created invitation(s). content: application/json: schema: $ref: '#/components/schemas/Invitation' '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/ValidationError' /invitations/{id}: parameters: - $ref: '#/components/parameters/Id' get: operationId: getInvitation tags: - Invitations summary: Get an invitation description: Retrieves a single invitation by ID. responses: '200': description: The requested invitation. content: application/json: schema: $ref: '#/components/schemas/Invitation' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: operationId: deleteInvitation tags: - Invitations summary: Delete an invitation description: Deletes (revokes) an invitation. responses: '200': description: Deletion confirmation. content: application/json: schema: $ref: '#/components/schemas/DeleteResponse' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /messages/email/send: post: operationId: sendEmail tags: - Messages summary: Send an email description: Sends a transactional email to a customer. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/EmailMessageInput' responses: '200': description: Send result. content: application/json: schema: $ref: '#/components/schemas/MessageResult' '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/ValidationError' /messages/sms/send: post: operationId: sendSms tags: - Messages summary: Send an SMS description: Sends a transactional SMS to a customer. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SmsMessageInput' responses: '200': description: Send result. content: application/json: schema: $ref: '#/components/schemas/MessageResult' '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/ValidationError' /messages/push/send: post: operationId: sendPush tags: - Messages summary: Send a push notification description: Sends a push notification to a customer's member app. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PushMessageInput' responses: '200': description: Send result. content: application/json: schema: $ref: '#/components/schemas/MessageResult' '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/ValidationError' /messages/notification/send: post: operationId: sendNotification tags: - Messages summary: Send a notification description: >- Sends an in-app / realtime notification. First-party apps can publish realtime events to an Ably channel through this endpoint. This is a REST request that hands off to Ably; PushPress does not expose its own WebSocket endpoint to API consumers. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/NotificationInput' responses: '200': description: Send result. content: application/json: schema: $ref: '#/components/schemas/MessageResult' '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/ValidationError' /keys: get: operationId: listApiKeys tags: - ApiKeys summary: List API keys description: Lists the API keys for the company. responses: '200': description: A list of API keys. content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/ApiKey' '401': $ref: '#/components/responses/Unauthorized' post: operationId: createApiKey tags: - ApiKeys summary: Create a new API key description: Creates a new API key for the company. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ApiKeyInput' responses: '200': description: The created API key. content: application/json: schema: $ref: '#/components/schemas/ApiKey' '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/ValidationError' /keys/{id}: parameters: - $ref: '#/components/parameters/Id' get: operationId: getApiKey tags: - ApiKeys summary: Get API key description: Retrieves a single API key by ID. responses: '200': description: The requested API key. content: application/json: schema: $ref: '#/components/schemas/ApiKey' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /keys/{id}/revoke: parameters: - $ref: '#/components/parameters/Id' patch: operationId: revokeApiKey tags: - ApiKeys summary: Revoke an API key description: Revokes an API key so it can no longer be used. responses: '200': description: The revoked API key. content: application/json: schema: $ref: '#/components/schemas/ApiKey' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /webhooks: get: operationId: listWebhooks tags: - Webhooks summary: List webhooks description: Lists platform webhooks for the company, including signing secret and event subscriptions. responses: '200': description: A list of webhooks. content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/Webhook' '401': $ref: '#/components/responses/Unauthorized' post: operationId: createWebhook tags: - Webhooks summary: Create a webhook description: >- Creates a platform webhook that listens for events on the PushPress platform and delivers them to a target URL. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/WebhookInput' responses: '200': description: The created webhook. content: application/json: schema: $ref: '#/components/schemas/Webhook' '401': $ref: '#/components/responses/Unauthorized' '422': $ref: '#/components/responses/ValidationError' /webhooks/{uuid}: parameters: - $ref: '#/components/parameters/Uuid' get: operationId: getWebhook tags: - Webhooks summary: Get webhook details description: Retrieves a single webhook by UUID, including signing secret and event subscriptions. responses: '200': description: The requested webhook. content: application/json: schema: $ref: '#/components/schemas/Webhook' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' patch: operationId: updateWebhook tags: - Webhooks summary: Update a webhook description: Updates a webhook's target URL or event subscriptions. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/WebhookInput' responses: '200': description: The updated webhook. content: application/json: schema: $ref: '#/components/schemas/Webhook' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' delete: operationId: deleteWebhook tags: - Webhooks summary: Delete a webhook description: Deletes a webhook subscription. responses: '200': description: Deletion confirmation. content: application/json: schema: $ref: '#/components/schemas/DeleteResponse' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /webhooks/{uuid}/activate: parameters: - $ref: '#/components/parameters/Uuid' patch: operationId: activateWebhook tags: - Webhooks summary: Activate a webhook description: Activates a previously deactivated webhook. responses: '200': description: The activated webhook. content: application/json: schema: $ref: '#/components/schemas/Webhook' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /webhooks/{uuid}/deactivate: parameters: - $ref: '#/components/parameters/Uuid' patch: operationId: deactivateWebhook tags: - Webhooks summary: Deactivate a webhook description: Deactivates a webhook without deleting it. responses: '200': description: The deactivated webhook. content: application/json: schema: $ref: '#/components/schemas/Webhook' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /webhooks/{uuid}/rotate-signing-secret: parameters: - $ref: '#/components/parameters/Uuid' post: operationId: rotateWebhookSecret tags: - Webhooks summary: Rotate a webhook signing secret description: Rotates the signing secret used to verify webhook payload signatures. responses: '200': description: The webhook with its new signing secret. content: application/json: schema: $ref: '#/components/schemas/Webhook' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' components: securitySchemes: api_key: type: apiKey in: header name: API-KEY description: >- API key issued in the PushPress developer portal, passed in the `API-KEY` request header. Requests are also scoped to a single gym location with a `company-id` header. parameters: Uuid: name: uuid in: path required: true description: The UUID of the resource. schema: type: string Id: name: id in: path required: true description: The identifier of the resource. schema: type: string Limit: name: limit in: query required: false description: Maximum number of records to return. schema: type: integer default: 20 Offset: name: offset in: query required: false description: Number of records to skip for pagination. schema: type: integer default: 0 responses: Unauthorized: description: Missing or invalid API key. content: application/json: schema: $ref: '#/components/schemas/Error' NotFound: description: The requested resource was not found. content: application/json: schema: $ref: '#/components/schemas/Error' ValidationError: description: The request payload failed validation. content: application/json: schema: $ref: '#/components/schemas/Error' schemas: Error: type: object properties: error: type: object properties: code: type: string message: type: string DeleteResponse: type: object properties: id: type: string deleted: type: boolean Company: type: object properties: id: type: string name: type: string email: type: string phone: type: string timezone: type: string address: type: string city: type: string state: type: string country: type: string CustomerInput: type: object required: - firstName - lastName properties: firstName: type: string lastName: type: string email: type: string phone: type: string role: type: string description: Customer role, e.g. member, lead, staff. gender: type: string birthday: type: string format: date Customer: allOf: - $ref: '#/components/schemas/CustomerInput' - type: object properties: id: type: string uuid: type: string status: type: string createdAt: type: integer format: int64 CustomerList: type: object properties: data: type: array items: $ref: '#/components/schemas/Customer' limit: type: integer offset: type: integer total: type: integer AttributionInput: type: object properties: customer: type: string description: Customer UUID this attribution belongs to. source: type: string description: Lead source, e.g. referral, google, walk-in. medium: type: string campaign: type: string Attribution: allOf: - $ref: '#/components/schemas/AttributionInput' - type: object properties: uuid: type: string createdAt: type: integer format: int64 Checkin: type: object properties: id: type: string uuid: type: string customer: type: string description: Customer UUID that checked in. company: type: string type: type: string enum: - class - appointment - event - open classId: type: string typeId: type: string name: type: string role: type: string timestamp: type: integer format: int64 CheckinList: type: object properties: data: type: array items: $ref: '#/components/schemas/Checkin' limit: type: integer offset: type: integer total: type: integer Appointment: type: object properties: id: type: string customer: type: string staff: type: string typeId: type: string name: type: string status: type: string enum: - scheduled - rescheduled - canceled - noshowed - completed startTime: type: integer format: int64 endTime: type: integer format: int64 Class: type: object properties: id: type: string typeId: type: string name: type: string coach: type: string capacity: type: integer reserved: type: integer startTime: type: integer format: int64 endTime: type: integer format: int64 status: type: string ClassType: type: object properties: id: type: string name: type: string description: type: string durationMinutes: type: integer Event: type: object properties: id: type: string name: type: string description: type: string startTime: type: integer format: int64 endTime: type: integer format: int64 capacity: type: integer Enrollment: type: object properties: uuid: type: string customer: type: string plan: type: string description: Plan ID the customer is enrolled in. status: type: string enum: - active - paused - canceled - expired startDate: type: string format: date endDate: type: string format: date Plan: type: object properties: id: type: string name: type: string description: type: string price: type: number currency: type: string interval: type: string description: Billing interval, e.g. month, year, week. type: type: string description: Plan type, e.g. recurring, prepaid, dropin. Invitation: type: object properties: id: type: string email: type: string role: type: string status: type: string enum: - pending - accepted - expired createdAt: type: integer format: int64 InvitationInput: type: object properties: invitations: type: array items: type: object properties: email: type: string role: type: string EmailMessageInput: type: object required: - customer properties: customer: type: string description: Customer UUID to email. subject: type: string body: type: string SmsMessageInput: type: object required: - customer properties: customer: type: string description: Customer UUID to text. body: type: string PushMessageInput: type: object required: - customer properties: customer: type: string description: Customer UUID to push to. title: type: string body: type: string NotificationInput: type: object properties: channel: type: string description: Ably channel to publish to. event: type: string description: Event name to publish. data: type: object additionalProperties: true MessageResult: type: object properties: success: type: boolean id: type: string ApiKeyInput: type: object properties: name: type: string description: Human-readable label for the key. scopes: type: array items: type: string ApiKey: type: object properties: keyUuid: type: string apiKey: type: string description: The secret key value, returned only on creation. name: type: string status: type: string enum: - active - revoked createdAt: type: integer format: int64 WebhookInput: type: object required: - url - events properties: url: type: string format: uri description: Target URL that receives event payloads. events: type: array description: Event types to subscribe to. items: type: string enum: - checkin.created - checkin.updated - checkin.deleted - customer.created - customer.deleted - customer.statusChanged - customer.detailsChanged - appointment.scheduled - appointment.rescheduled - appointment.canceled - appointment.noshowed - class.canceled - enrollment.created - enrollment.deleted - enrollment.statusChanged - reservation.created - reservation.waitlisted - reservation.canceled - app.installed - app.uninstalled Webhook: allOf: - $ref: '#/components/schemas/WebhookInput' - type: object properties: uuid: type: string signingSecret: type: string active: type: boolean createdAt: type: integer format: int64