curl --request POST \
--url https://api.1club.ai/v1/platform/events \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"startTime": "2026-06-01T18:00:00",
"endTime": "2026-06-01T18:00:00",
"summary": "<string>",
"description": "<string>",
"coverImage": "<string>",
"location": "<string>",
"clubId": 123,
"featured": true,
"bookable": true,
"sports": [
"<string>"
],
"translations": {},
"instructorIds": [
123
],
"areaIds": [
123
],
"tickets": [
{
"name": "<string>",
"id": 123,
"description": "<string>",
"price": 1,
"capacity": 2,
"revenueAccountId": 123,
"sortOrder": 123,
"translations": {}
}
],
"notifyStaff": true
}
'import requests
url = "https://api.1club.ai/v1/platform/events"
payload = {
"title": "<string>",
"startTime": "2026-06-01T18:00:00",
"endTime": "2026-06-01T18:00:00",
"summary": "<string>",
"description": "<string>",
"coverImage": "<string>",
"location": "<string>",
"clubId": 123,
"featured": True,
"bookable": True,
"sports": ["<string>"],
"translations": {},
"instructorIds": [123],
"areaIds": [123],
"tickets": [
{
"name": "<string>",
"id": 123,
"description": "<string>",
"price": 1,
"capacity": 2,
"revenueAccountId": 123,
"sortOrder": 123,
"translations": {}
}
],
"notifyStaff": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: '<string>',
startTime: '2026-06-01T18:00:00',
endTime: '2026-06-01T18:00:00',
summary: '<string>',
description: '<string>',
coverImage: '<string>',
location: '<string>',
clubId: 123,
featured: true,
bookable: true,
sports: ['<string>'],
translations: {},
instructorIds: [123],
areaIds: [123],
tickets: [
{
name: '<string>',
id: 123,
description: '<string>',
price: 1,
capacity: 2,
revenueAccountId: 123,
sortOrder: 123,
translations: {}
}
],
notifyStaff: true
})
};
fetch('https://api.1club.ai/v1/platform/events', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.1club.ai/v1/platform/events",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'title' => '<string>',
'startTime' => '2026-06-01T18:00:00',
'endTime' => '2026-06-01T18:00:00',
'summary' => '<string>',
'description' => '<string>',
'coverImage' => '<string>',
'location' => '<string>',
'clubId' => 123,
'featured' => true,
'bookable' => true,
'sports' => [
'<string>'
],
'translations' => [
],
'instructorIds' => [
123
],
'areaIds' => [
123
],
'tickets' => [
[
'name' => '<string>',
'id' => 123,
'description' => '<string>',
'price' => 1,
'capacity' => 2,
'revenueAccountId' => 123,
'sortOrder' => 123,
'translations' => [
]
]
],
'notifyStaff' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.1club.ai/v1/platform/events"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"startTime\": \"2026-06-01T18:00:00\",\n \"endTime\": \"2026-06-01T18:00:00\",\n \"summary\": \"<string>\",\n \"description\": \"<string>\",\n \"coverImage\": \"<string>\",\n \"location\": \"<string>\",\n \"clubId\": 123,\n \"featured\": true,\n \"bookable\": true,\n \"sports\": [\n \"<string>\"\n ],\n \"translations\": {},\n \"instructorIds\": [\n 123\n ],\n \"areaIds\": [\n 123\n ],\n \"tickets\": [\n {\n \"name\": \"<string>\",\n \"id\": 123,\n \"description\": \"<string>\",\n \"price\": 1,\n \"capacity\": 2,\n \"revenueAccountId\": 123,\n \"sortOrder\": 123,\n \"translations\": {}\n }\n ],\n \"notifyStaff\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.1club.ai/v1/platform/events")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"startTime\": \"2026-06-01T18:00:00\",\n \"endTime\": \"2026-06-01T18:00:00\",\n \"summary\": \"<string>\",\n \"description\": \"<string>\",\n \"coverImage\": \"<string>\",\n \"location\": \"<string>\",\n \"clubId\": 123,\n \"featured\": true,\n \"bookable\": true,\n \"sports\": [\n \"<string>\"\n ],\n \"translations\": {},\n \"instructorIds\": [\n 123\n ],\n \"areaIds\": [\n 123\n ],\n \"tickets\": [\n {\n \"name\": \"<string>\",\n \"id\": 123,\n \"description\": \"<string>\",\n \"price\": 1,\n \"capacity\": 2,\n \"revenueAccountId\": 123,\n \"sortOrder\": 123,\n \"translations\": {}\n }\n ],\n \"notifyStaff\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.1club.ai/v1/platform/events")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"<string>\",\n \"startTime\": \"2026-06-01T18:00:00\",\n \"endTime\": \"2026-06-01T18:00:00\",\n \"summary\": \"<string>\",\n \"description\": \"<string>\",\n \"coverImage\": \"<string>\",\n \"location\": \"<string>\",\n \"clubId\": 123,\n \"featured\": true,\n \"bookable\": true,\n \"sports\": [\n \"<string>\"\n ],\n \"translations\": {},\n \"instructorIds\": [\n 123\n ],\n \"areaIds\": [\n 123\n ],\n \"tickets\": [\n {\n \"name\": \"<string>\",\n \"id\": 123,\n \"description\": \"<string>\",\n \"price\": 1,\n \"capacity\": 2,\n \"revenueAccountId\": 123,\n \"sortOrder\": 123,\n \"translations\": {}\n }\n ],\n \"notifyStaff\": true\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"slug": "<string>",
"title": "<string>",
"summary": "<string>",
"description": {
"blocks": [
{
"type": "paragraph",
"data": {},
"id": "<string>",
"tunes": {}
}
],
"time": 123,
"version": "<string>"
},
"descriptionText": "<string>",
"coverImage": "<string>",
"location": "<string>",
"clubId": 123,
"club": {
"id": 123,
"name": "<string>"
},
"startTime": "2023-11-07T05:31:56Z",
"endTime": "2023-11-07T05:31:56Z",
"status": "draft",
"visibility": "Public",
"featured": true,
"bookable": true,
"paymentCollection": "online",
"sports": [
"<string>"
],
"notifyStaff": true,
"translations": {},
"publishedAt": "2023-11-07T05:31:56Z",
"publicUrl": "<string>",
"instructors": [
{
"id": 123,
"name": "<string>"
}
],
"areas": [
{
"id": 123,
"name": "<string>"
}
],
"tickets": [
{
"id": 123,
"name": "<string>",
"description": "<string>",
"price": 123,
"capacity": 123,
"revenueAccountId": 123,
"sortOrder": 123,
"translations": {},
"soldCount": 123
}
],
"bookedCount": 123,
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}Create an event
Creates an event as a draft: members see nothing until it is published with POST /v1/platform/events//publish.
startTime and endTime with an offset (2026-06-01T18:00:00+02:00, or Z) are exact instants. Without one (2026-06-01T18:00:00) they are the wall clock at the event’s club, in the club’s own timezone - or the organization’s for an event that names no club. The club, every instructor, every area and every ticket’s revenue account must belong to the organization, and a new event’s club must still be taking events (not closed, and not past its closing date).
To sell places, add tickets: an event with at least one ticket is bookable, and a bookable event must have one. description is plain text (blank lines start a new paragraph) or an Editor.js document. Supports the Idempotency-Key header.
curl --request POST \
--url https://api.1club.ai/v1/platform/events \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"startTime": "2026-06-01T18:00:00",
"endTime": "2026-06-01T18:00:00",
"summary": "<string>",
"description": "<string>",
"coverImage": "<string>",
"location": "<string>",
"clubId": 123,
"featured": true,
"bookable": true,
"sports": [
"<string>"
],
"translations": {},
"instructorIds": [
123
],
"areaIds": [
123
],
"tickets": [
{
"name": "<string>",
"id": 123,
"description": "<string>",
"price": 1,
"capacity": 2,
"revenueAccountId": 123,
"sortOrder": 123,
"translations": {}
}
],
"notifyStaff": true
}
'import requests
url = "https://api.1club.ai/v1/platform/events"
payload = {
"title": "<string>",
"startTime": "2026-06-01T18:00:00",
"endTime": "2026-06-01T18:00:00",
"summary": "<string>",
"description": "<string>",
"coverImage": "<string>",
"location": "<string>",
"clubId": 123,
"featured": True,
"bookable": True,
"sports": ["<string>"],
"translations": {},
"instructorIds": [123],
"areaIds": [123],
"tickets": [
{
"name": "<string>",
"id": 123,
"description": "<string>",
"price": 1,
"capacity": 2,
"revenueAccountId": 123,
"sortOrder": 123,
"translations": {}
}
],
"notifyStaff": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: '<string>',
startTime: '2026-06-01T18:00:00',
endTime: '2026-06-01T18:00:00',
summary: '<string>',
description: '<string>',
coverImage: '<string>',
location: '<string>',
clubId: 123,
featured: true,
bookable: true,
sports: ['<string>'],
translations: {},
instructorIds: [123],
areaIds: [123],
tickets: [
{
name: '<string>',
id: 123,
description: '<string>',
price: 1,
capacity: 2,
revenueAccountId: 123,
sortOrder: 123,
translations: {}
}
],
notifyStaff: true
})
};
fetch('https://api.1club.ai/v1/platform/events', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.1club.ai/v1/platform/events",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'title' => '<string>',
'startTime' => '2026-06-01T18:00:00',
'endTime' => '2026-06-01T18:00:00',
'summary' => '<string>',
'description' => '<string>',
'coverImage' => '<string>',
'location' => '<string>',
'clubId' => 123,
'featured' => true,
'bookable' => true,
'sports' => [
'<string>'
],
'translations' => [
],
'instructorIds' => [
123
],
'areaIds' => [
123
],
'tickets' => [
[
'name' => '<string>',
'id' => 123,
'description' => '<string>',
'price' => 1,
'capacity' => 2,
'revenueAccountId' => 123,
'sortOrder' => 123,
'translations' => [
]
]
],
'notifyStaff' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.1club.ai/v1/platform/events"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"startTime\": \"2026-06-01T18:00:00\",\n \"endTime\": \"2026-06-01T18:00:00\",\n \"summary\": \"<string>\",\n \"description\": \"<string>\",\n \"coverImage\": \"<string>\",\n \"location\": \"<string>\",\n \"clubId\": 123,\n \"featured\": true,\n \"bookable\": true,\n \"sports\": [\n \"<string>\"\n ],\n \"translations\": {},\n \"instructorIds\": [\n 123\n ],\n \"areaIds\": [\n 123\n ],\n \"tickets\": [\n {\n \"name\": \"<string>\",\n \"id\": 123,\n \"description\": \"<string>\",\n \"price\": 1,\n \"capacity\": 2,\n \"revenueAccountId\": 123,\n \"sortOrder\": 123,\n \"translations\": {}\n }\n ],\n \"notifyStaff\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.1club.ai/v1/platform/events")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"startTime\": \"2026-06-01T18:00:00\",\n \"endTime\": \"2026-06-01T18:00:00\",\n \"summary\": \"<string>\",\n \"description\": \"<string>\",\n \"coverImage\": \"<string>\",\n \"location\": \"<string>\",\n \"clubId\": 123,\n \"featured\": true,\n \"bookable\": true,\n \"sports\": [\n \"<string>\"\n ],\n \"translations\": {},\n \"instructorIds\": [\n 123\n ],\n \"areaIds\": [\n 123\n ],\n \"tickets\": [\n {\n \"name\": \"<string>\",\n \"id\": 123,\n \"description\": \"<string>\",\n \"price\": 1,\n \"capacity\": 2,\n \"revenueAccountId\": 123,\n \"sortOrder\": 123,\n \"translations\": {}\n }\n ],\n \"notifyStaff\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.1club.ai/v1/platform/events")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"<string>\",\n \"startTime\": \"2026-06-01T18:00:00\",\n \"endTime\": \"2026-06-01T18:00:00\",\n \"summary\": \"<string>\",\n \"description\": \"<string>\",\n \"coverImage\": \"<string>\",\n \"location\": \"<string>\",\n \"clubId\": 123,\n \"featured\": true,\n \"bookable\": true,\n \"sports\": [\n \"<string>\"\n ],\n \"translations\": {},\n \"instructorIds\": [\n 123\n ],\n \"areaIds\": [\n 123\n ],\n \"tickets\": [\n {\n \"name\": \"<string>\",\n \"id\": 123,\n \"description\": \"<string>\",\n \"price\": 1,\n \"capacity\": 2,\n \"revenueAccountId\": 123,\n \"sortOrder\": 123,\n \"translations\": {}\n }\n ],\n \"notifyStaff\": true\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"slug": "<string>",
"title": "<string>",
"summary": "<string>",
"description": {
"blocks": [
{
"type": "paragraph",
"data": {},
"id": "<string>",
"tunes": {}
}
],
"time": 123,
"version": "<string>"
},
"descriptionText": "<string>",
"coverImage": "<string>",
"location": "<string>",
"clubId": 123,
"club": {
"id": 123,
"name": "<string>"
},
"startTime": "2023-11-07T05:31:56Z",
"endTime": "2023-11-07T05:31:56Z",
"status": "draft",
"visibility": "Public",
"featured": true,
"bookable": true,
"paymentCollection": "online",
"sports": [
"<string>"
],
"notifyStaff": true,
"translations": {},
"publishedAt": "2023-11-07T05:31:56Z",
"publicUrl": "<string>",
"instructors": [
{
"id": 123,
"name": "<string>"
}
],
"areas": [
{
"id": 123,
"name": "<string>"
}
],
"tickets": [
{
"id": 123,
"name": "<string>",
"description": "<string>",
"price": 123,
"capacity": 123,
"revenueAccountId": 123,
"sortOrder": 123,
"translations": {},
"soldCount": 123
}
],
"bookedCount": 123,
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}{
"error": "<string>",
"code": "<string>",
"details": {}
}Authorizations
Organization-scoped bearer credential: a customer API key (1club_sk_live_...) or an MCP OAuth access token.
Headers
Retry-safe key; a repeat of the same request replays the first response
255Body
Fields accepted when creating an event. It is always created as a draft. Unknown fields are refused.
Changing it changes the slug, and with it the public URL.
1 - 200Start. With an offset or Z it is an exact instant; without one (2026-06-01T18:00:00) it is the wall clock at the event's club, in the club's timezone - or the organization's when the event names no club.
"2026-06-01T18:00:00"
End, after the start. With an offset or Z it is an exact instant; without one (2026-06-01T18:00:00) it is the wall clock at the event's club, in the club's timezone - or the organization's when the event names no club.
"2026-06-01T18:00:00"
Plain-text teaser shown on cards and in notifications.
500Plain text (a blank line starts a new paragraph) or an Editor.js document. null clears it.
20000Image URL, e.g. from the media library.
Free text; the event may take place away from any club.
300The club it belongs to; null for an organization-wide or off-site event. Decides the timezone wall-clock times are read in, and on create must still be taking events.
Who sees it once live: anyone, signed-in members only, or nobody (reachable by staff only). Defaults to Public.
Public, Member_only, Private Promote it on the website and portal.
Whether places can be booked. An event with tickets always is, and a bookable event must have at least one ticket.
How paid tickets are paid: online at booking, at the desk on arrival, or the buyer chooses. Free tickets never charge.
online, on_arrival, member_choice Sport ids, e.g. padel, tennis.
Per-locale wording, as { "es": { "title": "...", "summary": "..." } }. Replaces the whole map when sent; null clears it.
Show child attributes
Show child attributes
Coaches running it. Each must belong to the organization. Replaces the whole list when sent.
Areas (courts, rooms) it occupies for its whole window while live. Each must belong to the organization. Replaces the whole list when sent.
Every ticket the event should sell. Replaces the set: resend each ticket you keep with its id; one without an id is new; one left out is retired (deactivated if it has bookings, deleted if not).
50Show child attributes
Show child attributes
Email admins and managers when a booking for this event is confirmed.
Response
Event created as a draft
A one-off occasion a club puts on, sold through tickets. Counts only: who booked is not part of an event.
The last part of the public URL; follows the title.
An Editor.js document: { blocks: [{ type, data }] }.
Show child attributes
Show child attributes
description as plain text.
Show child attributes
Show child attributes
draft: members see nothing. live: published. cancelled: called off, its bookings cancelled.
draft, live, cancelled Public, Member_only, Private online, on_arrival, member_choice Per-locale wording, as { "es": { "title": "..." } }. Replaces the whole map when sent.
Show child attributes
Show child attributes
When it was first published.
The member-facing page. null unless the event is live, or when the organization publishes neither a website nor a member portal.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Active tickets, in display order.
Show child attributes
Show child attributes
Active bookings (confirmed, pending, checked in) across all tickets.
Was this page helpful?