Beyond Open Play — Advanced Configuration
Explore how the same booking flow supports additional event types, advanced configuration, and automation — combining API flexibility with Web Admin operations.
The flow demonstrated in this guide focused on creating a 1-hour Open Play event using the API.
However, the same structure and endpoints support a wide range of event types, configurations, and automation scenarios.
At this point, you understand the core pattern:
Discover structure (areas → pods → courts)
Retrieve available sessions
Create a booking
Verify the event
This pattern applies across the entire event system.
The Booking Endpoint as the Core Engine
The main entry point for event creation is:
POST /bookingsThe booking endpoint acts as the engine behind:
Open Play sessions
Classes
Tournaments
Private events
By adjusting the request payload, you can create different types of events without changing the overall flow.
Supporting Different Event Types
You can create other event categories by changing the eventSubtype field in the booking payload.
Examples include:
"KIDS_CLASS""ADULT_CLASS""TOURNAMENT""PRIVATE_EVENT"
The session selection logic remains the same — only the configuration changes.
Admission Control
You can control who is allowed to join an event using the admission field.
Supported values:
"OPEN"The event is visible and any eligible user can sign up."MEMBERS_ONLY"The event is visible, but only members can register."CLOSED"Registration is completely disabled. No users can sign up.
Important
"CLOSED" is typically used for:
Court maintenance blocks
Internal operational holds
Time slots that should not accept participants
It is not intended to create “exclusive” playable events.
If you want to create an event that is playable but restricted, use:
"MEMBERS_ONLY"for member-restricted eventsOr control visibility and access through your operational workflow
Holistic Approach: Admin + API
Most event management workflows can be handled directly through the Web Admin interface.
In many cases:
Staff can create and manage events manually.
No API integration is required.
However, the API enables:
Automation
Integration with external systems
Low-code platform workflows
AI-assisted operational flows
Bulk or scheduled event creation
The Web Admin and the API should be seen as complementary tools.
The Admin is ideal for operational management.
The API enables programmability and scale.
Together, they provide a complete ecosystem for managing events.
When to Use the API
You may consider using the API when:
Events depend on external triggers.
You integrate with CRM, ERP, or scheduling systems.
You want to build custom booking experiences.
You are developing a mobile or external application.
If your needs are operational and manual, the Web Admin may already be sufficient.
Booking API — Technical Specification
To implement automated event creation, you will interact directly with the Booking endpoint and related resources as defined in the API specification.
The following section provides the formal definition of the Booking API, including the request structure and supported configuration fields.
This is the lower-level technical layer that powers the higher-level workflows demonstrated throughout this guide.
Filter coaches by type
["HUMAN","ROBOT"]An optional parameter to tell the User is agreeing the "Terms" along with the booking request.
An optional parameter to tell the User is agreeing the "Liability waiver" along with the booking request.
Returns a Booking
An optional parameter to tell the User is agreeing the "Terms" along with the booking request.
An optional parameter to tell the User is agreeing the "Liability waiver" along with the booking request.
Returns an ErrorDto in case of missing or incorrect request parameter
Returns an ErrorDto in case of a lack of permissions to perform the requested action
Returns an ErrorDto in case of validation errors or failures.
Possible error codes are:EB001: The coupon {{couponCode}} is not valid.EB002: The coupon code {{couponCode}} is not valid.EB003: The coupon {{couponCode}} is not applicable to {{podDisplayName}}.EB020: The coupon {{couponCode}} cannot be reused.EB021: The coupon {{couponCode}} is valid only for the first booking.EB022: The coupon {{couponCode}} is not valid for the selected dates.EB023: The coupon {{couponCode}} is not applicable to reservations.EB004: The amount of virtual credits cannot be negative.EB005: The current account balance does not have virtual credits.EB006: The amount of virtual credits exceeds the account balance.EB007: You're not allowed to book free of charge reservations.EB008: Only admins are authorized to create events.EB009: Events must be booked as FREE_OF_CHARGE booking mode.EB010: Events must have an admission rate defined, even if it's zero.EB011: Invalid total spots number.EB012: Invalid team size number.EB013: Only REGULAR, PRIVATE and OPERATIONS events can have CLOSED admission.EB014: REGULAR and PRIVATE events must have CLOSED admission.EB000: This action requires a logged in user.EB015: There's no payment method set up.EB016: The payment method configured is not active. Please, add a new one.EB017: User phone number is required.EB018: Terms of Service agreement is required.EB019: Invalid free signup cancellation horizon.EB025: You're not allowed to book cash reservations.EB026: There was an issue processing the payment for your membership. Please update your payment method to continue booking.EB027: There was an issue processing the payment for your group membership. Please ask the person paying for the membership to update their payment details to continue using your membership.EB024: Liability waiver acceptance is required.EB028: Liability Waiver agreement not found. Please contact support.EB030: No courts left at the pod during the selected time.EB031: There's a conflicting reservation at the selected time.EB032: The selected {{coachTerm}} is not available for this session.EB033: Invalid session subtype PRIVATE, as there is a {{coachTerm}} selected.EB034: Invalid session subtype COACHING, as there is no {{coachTerm}} selected.EB035: Ooops! This booking takes you over the limit of {{maxFreeOffPeakReservationsHours}} hours of free upcoming reservations. You currently have {{userFreeOffPeakReservationsHours}} hours of free upcoming reservations. Please modify in order to stay below.EB036: Booking can be made for a minimum of 1 hourEB037: Booking must start sharp on the hourEB038: Booking time beyond the allowed horizonEB039: Booking can be made for a maximum of {{count}} hours.EB040: Unable to proceed with the current payment method. Please try using a different one.EB041: Prepaid cards are not accepted, please use a credit or debit card.EB042: You need to cover the full amount with {{virtualCreditsTerm}}.EB043: Membership is required to make bookings.EB050: One or more Reservation Play Passes aren't valid for this purchase.EB051: One or more Reservation Play Passes have expired.EB052: Only {{maxDailyReservationPasses}} Reservation Play Passes can be redeemed per day. You can continue booking by removing your Play Pass.EB060: You reached the maximum of {{count}} future reservations.EB061: Multiple bookings aren't allowed.BCA00: The selected time is temporarily unavailable, either come back later or pick a different date.BCA01: There is no room to assign this reservation in contiguous slots, split {{courtsTerm}} is not allowed.BCA02: There is no room to assign this reservation, please pick a different date.RA001: Could not confirm the payment. Please try again.
POST /apis/v2/bookings HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
user-agent: text
Content-Type: application/json
Accept: */*
Content-Length: 2064
{
"type": "PREVIEW",
"eventSubtype": "OPERATIONS",
"eventCustomType": "text",
"eventStatus": "DRAFT",
"eventName": "text",
"eventDescription": "text",
"eventFeatures": [
"WAITLIST"
],
"tournamentDivision": {
"provider": "SWISH",
"swish": {
"eventFormat": "rotating_partners_round_robin",
"gameId": "game123",
"editPlayersPath": "rotating-partners-round-robin"
},
"podplay": {
"eventFormat": "round_robin",
"gameId": "game123",
"url": "https://tournaments.podplay.app/admin/tournaments/game123"
},
"lastSyncedAt": "2025-07-09T17:32:26.800Z",
"visibility": "VISIBLE"
},
"totalTeams": 1,
"teamSize": 1,
"maxGuests": 1,
"admission": "OPEN",
"admissionRate": {
"regular": 1,
"membersDefault": 1,
"memberships": {
"items": [
{
"membership": {
"id": "text"
},
"rate": 1
}
],
"_total": 1,
"_links": {
"self": {
"href": "text"
}
}
},
"chargingStrategy": "spot+"
},
"admissionDate": {
"regular": "2026-01-01T00:00:00.000Z",
"membersDefault": "2026-01-01T00:00:00.000Z",
"memberships": {
"items": [
{
"membership": {
"id": "text"
},
"date": "2026-01-01T00:00:00.000Z"
}
],
"_total": 1,
"_links": {
"self": {
"href": "text"
}
}
}
},
"admissionRating": {
"minRating": 1,
"maxRating": 1,
"type": "text"
},
"admissionKids": "OPEN",
"allowedMemberships": {
"items": [
"text"
],
"_total": 1,
"_links": {
"self": {
"href": "text"
}
}
},
"coachRate": 1,
"freeSignupCancellationHorizonHours": 1,
"picture": {
"id": "text"
},
"tags": [
"text"
],
"visibility": "LISTED",
"items": [
{
"session": {
"id": "text"
},
"sessionTable": {
"id": "text"
},
"sessionCoach": {
"id": "text"
},
"sessionGuests": {
"id": "text"
}
}
],
"couponCode": "text",
"virtualCredits": 1,
"bookingMode": "USER_BOOKED",
"paymentMethod": "CARD",
"termsAgreed": true,
"liabilityWaiverAgreed": true,
"owner": {
"id": "text"
},
"createAsSeries": true,
"seriesPriceSettings": {
"full": {
"members": {
"rate": 1,
"overrides": {
"items": [
{
"membership": {
"id": "text"
},
"rate": 1,
"_links": {}
}
],
"_total": 1
}
},
"nonMembers": {
"rate": 1
}
},
"unit": {
"members": {
"rate": 1,
"overrides": {
"items": [
{
"membership": {
"id": "text"
},
"rate": 1,
"_links": {}
}
],
"_total": 1
}
},
"nonMembers": {
"rate": 1
}
}
},
"chargeStrategy": "BILL_SPLIT",
"passesStrategy": "USE_ALL",
"recurrence": {
"id": "text",
"cadence": "day",
"daysOfWeek": [
1
],
"untilDate": "2026-01-01T00:00:00.000Z"
},
"_links": {}
}{
"id": "text",
"type": "PREVIEW",
"status": "DRAFT",
"eventSubtype": "OPERATIONS",
"eventCustomType": "text",
"eventStatus": "DRAFT",
"eventName": "text",
"eventDescription": "text",
"eventFeatures": [
"WAITLIST"
],
"tournamentDivision": {
"id": "7229d7d5-5581-4d86-975f-5b7efc9b00e9",
"tournament": "7229d7d5-5581-4d86-975f-5b7efc9b00e9",
"provider": "SWISH",
"swish": {
"eventFormat": "rotating_partners_round_robin",
"gameId": "game123",
"editPlayersPath": "rotating-partners-round-robin"
},
"podplay": {
"eventFormat": "round_robin",
"gameId": "game123",
"url": "https://tournaments.podplay.app/admin/tournaments/game123"
},
"status": "DRAFT",
"createdAt": "2025-07-09T17:32:26.800Z",
"event": "7229d7d5-5581-4d86-975f-5b7efc9b00e9",
"lastSyncedAt": "2025-07-09T17:32:26.800Z",
"visibility": "VISIBLE",
"_links": {}
},
"totalTeams": 1,
"teamSize": 1,
"maxGuests": 1,
"admission": "OPEN",
"admissionRate": {
"regular": 1,
"member": 1,
"membersDefault": 1,
"memberships": {
"items": [
{
"membership": {
"id": "text"
},
"rate": 1
}
],
"_total": 1,
"_links": {
"self": {
"href": "text"
}
}
},
"chargingStrategy": "spot+"
},
"admissionDate": {
"regular": "2026-01-01T00:00:00.000Z",
"member": "2026-01-01T00:00:00.000Z",
"membersDefault": "2026-01-01T00:00:00.000Z",
"memberships": {
"items": [
{
"membership": {
"id": "text"
},
"date": "2026-01-01T00:00:00.000Z"
}
],
"_total": 1,
"_links": {
"self": {
"href": "text"
}
}
}
},
"admissionRating": {
"minRating": 1,
"maxRating": 1,
"type": "text"
},
"admissionKids": "OPEN",
"allowedMemberships": {
"items": [
"text"
],
"_total": 1,
"_links": {
"self": {
"href": "text"
}
}
},
"coachRate": 1,
"freeSignupCancellationHorizonHours": 1,
"picture": {
"id": "text"
},
"tags": [
"text"
],
"visibility": "LISTED",
"items": [
{
"session": {
"id": "text"
},
"sessionTable": {
"id": "text"
},
"sessionCoach": {
"id": "text"
},
"sessionGuests": {
"id": "text"
},
"errors": [
"text"
]
}
],
"coupon": {
"id": "text",
"code": "text",
"discountType": "AMOUNT_OFF",
"value": 1,
"_links": {
"self": {
"href": "text"
}
}
},
"order": {
"id": "text"
},
"summary": {
"events": {
"items": [
"text"
],
"_total": 1,
"_links": {
"self": {
"href": "text"
}
}
},
"reservations": [
{
"reservation": {
"id": "text",
"startTime": "2026-01-01T00:00:00.000Z",
"endTime": "2026-01-01T00:00:00.000Z",
"tableAssignment": "PENDING",
"sessions": {
"items": [
{
"id": "text",
"session": {
"id": "text"
},
"coupon": {
"id": "text"
},
"charge": {
"id": "text"
},
"_links": {}
}
],
"_total": 1,
"_links": {
"self": {
"href": "text"
}
}
},
"pod": {
"id": "text"
},
"table": {
"id": "text"
},
"coach": {
"id": "text"
},
"guests": 1,
"charges": {
"_total": 1
},
"quickReplays": {
"_total": 1
},
"customReplays": {
"_total": 1
},
"_links": {}
},
"rate": 1,
"baseRate": 1,
"tableRate": 1,
"guestsRate": 1,
"coachRate": 1,
"admissionRate": 1,
"errors": [
{
"code": "text",
"message": "text",
"details": {}
}
]
}
],
"currency": "text",
"series": {
"id": "text"
},
"subtotal": 1,
"taxes": [
{
"name": "text",
"amount": 1,
"percentage": 1
}
],
"couponDiscount": 1,
"coachingDiscount": 1,
"virtualCredits": 1,
"total": 1,
"maxChargableAmount": 1,
"dayPass": {
"id": "text",
"displayName": "text",
"rate": 1
},
"passes": {
"items": [
{
"id": {},
"available": 1,
"quantity": 1,
"displayName": "text",
"displayNamePlural": "text",
"rate": 1
}
],
"_total": 1,
"_links": {}
},
"errors": [
{
"code": "text",
"message": "text",
"details": {}
}
],
"messages": [
{
"code": "text",
"message": "text"
}
]
},
"chargeStrategy": "BILL_SPLIT",
"passesStrategy": "USE_ALL",
"_links": {}
}Last updated
Was this helpful?

