For the complete documentation index, see llms.txt. This page is also available as Markdown.

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:

  1. Discover structure (areas → pods → courts)

  2. Retrieve available sessions

  3. Create a booking

  4. 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 /bookings

The 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 events

  • Or control visibility and access through your operational workflow

For the complete programmatic definition of the booking request, refer to the API specification at the bottom of this page.

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.

post
Authorizations
AuthorizationstringRequired
Bearer authentication header of the form Bearer <token>.
Query parameters
coachTypestring[]Optional

Filter coaches by type

Example: ["HUMAN","ROBOT"]
Header parameters
user-agentstringRequired
Body
idstringRead-onlyRequired
typestring · enumRequiredPossible values:
statusstring · enumRead-onlyRequiredPossible values:
eventSubtypestring · enumRequiredPossible values:
eventCustomTypestringRequired
eventStatusstring · enumRequiredPossible values:
eventNamestringRequired
eventDescriptionstringRequired
totalTeamsnumber · nullableRequired
teamSizenumber · nullableRequired
maxGuestsnumber · nullableRequired
admissionstring · enumRequiredPossible values:
admissionKidsstring · enumRequiredPossible values:
coachRatenumberRequired
freeSignupCancellationHorizonHoursnumberRequired
tagsstring[]Required
visibilitystring · enumRequiredPossible values:
couponCodestring · nullableWrite-onlyRequired
virtualCreditsnumber · nullableWrite-onlyRequired
bookingModestring · enum · nullableWrite-onlyRequiredPossible values:
paymentMethodstring · enum · nullableWrite-onlyRequiredPossible values:
termsAgreedboolean · nullableWrite-onlyRequired

An optional parameter to tell the User is agreeing the "Terms" along with the booking request.

liabilityWaiverAgreedboolean · nullableWrite-onlyRequired

An optional parameter to tell the User is agreeing the "Liability waiver" along with the booking request.

createAsSeriesbooleanWrite-onlyRequired
chargeStrategystring · enum · nullableRequiredPossible values:
passesStrategystring · enum · nullableRequiredPossible values:
_linksobjectRequired
Responses
201

Returns a Booking

application/json
idstringRead-onlyRequired
typestring · enumRequiredPossible values:
statusstring · enumRead-onlyRequiredPossible values:
eventSubtypestring · enumRequiredPossible values:
eventCustomTypestringRequired
eventStatusstring · enumRequiredPossible values:
eventNamestringRequired
eventDescriptionstringRequired
totalTeamsnumber · nullableRequired
teamSizenumber · nullableRequired
maxGuestsnumber · nullableRequired
admissionstring · enumRequiredPossible values:
admissionKidsstring · enumRequiredPossible values:
coachRatenumberRequired
freeSignupCancellationHorizonHoursnumberRequired
tagsstring[]Required
visibilitystring · enumRequiredPossible values:
couponCodestring · nullableWrite-onlyRequired
virtualCreditsnumber · nullableWrite-onlyRequired
bookingModestring · enum · nullableWrite-onlyRequiredPossible values:
paymentMethodstring · enum · nullableWrite-onlyRequiredPossible values:
termsAgreedboolean · nullableWrite-onlyRequired

An optional parameter to tell the User is agreeing the "Terms" along with the booking request.

liabilityWaiverAgreedboolean · nullableWrite-onlyRequired

An optional parameter to tell the User is agreeing the "Liability waiver" along with the booking request.

createAsSeriesbooleanWrite-onlyRequired
chargeStrategystring · enum · nullableRequiredPossible values:
passesStrategystring · enum · nullableRequiredPossible values:
_linksobjectRequired
post/bookings
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?