PushPress Messaging API
Send transactional email, SMS, push, and in-app / realtime notifications to gym members. Realtime notifications are published to an Ably channel over a REST request, not a PushPress WebSocket.
Send transactional email, SMS, push, and in-app / realtime notifications to gym members. Realtime notifications are published to an Ably channel over a REST request, not a PushPress WebSocket.
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 r
# --- truncated at 32 KB (41 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/pushpress/refs/heads/main/openapi/pushpress-openapi.yml