PushPress API Keys API
Create, list, retrieve, and revoke the API keys used to authenticate against the PushPress Platform API.
Create, list, retrieve, and revoke the API keys used to authenticate against the PushPress Platform API.
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