curl --request POST \
--url https://api.1club.ai/v1/platform/area-types \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"slug": "<string>",
"description": "<string>",
"revenueAccountId": 123,
"sports": [
"<string>"
],
"isBookable": true,
"defaultPricePerHour": 1,
"defaultMaxPlayers": 500,
"maxConcurrentBookings": 1
}
'import requests
url = "https://api.1club.ai/v1/platform/area-types"
payload = {
"name": "<string>",
"slug": "<string>",
"description": "<string>",
"revenueAccountId": 123,
"sports": ["<string>"],
"isBookable": True,
"defaultPricePerHour": 1,
"defaultMaxPlayers": 500,
"maxConcurrentBookings": 1
}
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({
name: '<string>',
slug: '<string>',
description: '<string>',
revenueAccountId: 123,
sports: ['<string>'],
isBookable: true,
defaultPricePerHour: 1,
defaultMaxPlayers: 500,
maxConcurrentBookings: 1
})
};
fetch('https://api.1club.ai/v1/platform/area-types', 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/area-types",
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([
'name' => '<string>',
'slug' => '<string>',
'description' => '<string>',
'revenueAccountId' => 123,
'sports' => [
'<string>'
],
'isBookable' => true,
'defaultPricePerHour' => 1,
'defaultMaxPlayers' => 500,
'maxConcurrentBookings' => 1
]),
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/area-types"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"slug\": \"<string>\",\n \"description\": \"<string>\",\n \"revenueAccountId\": 123,\n \"sports\": [\n \"<string>\"\n ],\n \"isBookable\": true,\n \"defaultPricePerHour\": 1,\n \"defaultMaxPlayers\": 500,\n \"maxConcurrentBookings\": 1\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/area-types")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"slug\": \"<string>\",\n \"description\": \"<string>\",\n \"revenueAccountId\": 123,\n \"sports\": [\n \"<string>\"\n ],\n \"isBookable\": true,\n \"defaultPricePerHour\": 1,\n \"defaultMaxPlayers\": 500,\n \"maxConcurrentBookings\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.1club.ai/v1/platform/area-types")
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 \"name\": \"<string>\",\n \"slug\": \"<string>\",\n \"description\": \"<string>\",\n \"revenueAccountId\": 123,\n \"sports\": [\n \"<string>\"\n ],\n \"isBookable\": true,\n \"defaultPricePerHour\": 1,\n \"defaultMaxPlayers\": 500,\n \"maxConcurrentBookings\": 1\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"name": "<string>",
"slug": "<string>",
"description": "<string>",
"revenueAccountId": 123,
"areaCount": 123,
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"sports": [
"<string>"
],
"isBookable": true,
"defaultPricePerHour": 123,
"defaultMaxPlayers": 123,
"maxConcurrentBookings": 123
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Create an area type
Adds a kind of space the organization books. List the existing types first: an organization is seeded with one per sport its clubs offer, and a second “Padel court” splits inventory that should be one group.
sports is what makes areas of this type bookable for a sport at all, and it is canonicalized - send padel, not Padel. An unknown sport is refused rather than stored as a value nothing will match. slug is optional and derived from the name when omitted. Supports the Idempotency-Key header.
curl --request POST \
--url https://api.1club.ai/v1/platform/area-types \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"slug": "<string>",
"description": "<string>",
"revenueAccountId": 123,
"sports": [
"<string>"
],
"isBookable": true,
"defaultPricePerHour": 1,
"defaultMaxPlayers": 500,
"maxConcurrentBookings": 1
}
'import requests
url = "https://api.1club.ai/v1/platform/area-types"
payload = {
"name": "<string>",
"slug": "<string>",
"description": "<string>",
"revenueAccountId": 123,
"sports": ["<string>"],
"isBookable": True,
"defaultPricePerHour": 1,
"defaultMaxPlayers": 500,
"maxConcurrentBookings": 1
}
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({
name: '<string>',
slug: '<string>',
description: '<string>',
revenueAccountId: 123,
sports: ['<string>'],
isBookable: true,
defaultPricePerHour: 1,
defaultMaxPlayers: 500,
maxConcurrentBookings: 1
})
};
fetch('https://api.1club.ai/v1/platform/area-types', 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/area-types",
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([
'name' => '<string>',
'slug' => '<string>',
'description' => '<string>',
'revenueAccountId' => 123,
'sports' => [
'<string>'
],
'isBookable' => true,
'defaultPricePerHour' => 1,
'defaultMaxPlayers' => 500,
'maxConcurrentBookings' => 1
]),
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/area-types"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"slug\": \"<string>\",\n \"description\": \"<string>\",\n \"revenueAccountId\": 123,\n \"sports\": [\n \"<string>\"\n ],\n \"isBookable\": true,\n \"defaultPricePerHour\": 1,\n \"defaultMaxPlayers\": 500,\n \"maxConcurrentBookings\": 1\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/area-types")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"slug\": \"<string>\",\n \"description\": \"<string>\",\n \"revenueAccountId\": 123,\n \"sports\": [\n \"<string>\"\n ],\n \"isBookable\": true,\n \"defaultPricePerHour\": 1,\n \"defaultMaxPlayers\": 500,\n \"maxConcurrentBookings\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.1club.ai/v1/platform/area-types")
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 \"name\": \"<string>\",\n \"slug\": \"<string>\",\n \"description\": \"<string>\",\n \"revenueAccountId\": 123,\n \"sports\": [\n \"<string>\"\n ],\n \"isBookable\": true,\n \"defaultPricePerHour\": 1,\n \"defaultMaxPlayers\": 500,\n \"maxConcurrentBookings\": 1\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"name": "<string>",
"slug": "<string>",
"description": "<string>",
"revenueAccountId": 123,
"areaCount": 123,
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"sports": [
"<string>"
],
"isBookable": true,
"defaultPricePerHour": 123,
"defaultMaxPlayers": 123,
"maxConcurrentBookings": 123
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}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 area type. Only name is required; slug is derived from it when omitted, and suffixed if that is taken. The defaults shown are what an omitted field becomes, and unknown fields are rejected.
255Stable key. Derived from the name when omitted; send one only when something outside 1club already refers to it. An explicit slug that clashes is a 409, and a rename never moves it.
120^[a-z0-9]+(-[a-z0-9]+)*$2000Where a booking on this kind of area posts, from GET /v1/platform/revenue-accounts. Leave it unset and the sale posts to whichever account the organization has marked default, resolved at the time of the sale.
Canonical sport ids an area of this type can be booked for, e.g. ["padel"]. This is what makes the areas bookable for a sport at all; an unrecognised value is rejected rather than stored.
20False for a kind of space that is not booked at all (a storeroom, a corridor).
Hourly price an area of this type starts from. An area may override it.
x >= 0How many people a slot on this type normally takes.
1 <= x <= 1000How many bookings may hold an area of this type at once. 1 for an ordinary court.
1 <= x <= 100Response
Area type created
A kind of area, and the defaults every area of that kind inherits. One shape for the list, get-by-id, create and update.
Stable key, derived from the name when a create does not send one. A rename never moves it.
Where a booking on this kind of area posts. Null falls back to the organization's default account.
Areas currently of this type, whatever their status.
Sports an area of this type can be booked for.
False for a type that is not booked at all (a storeroom, a corridor). Do not build bookable inventory on one.
Hourly price an area of this type starts from; an area may override it.
How many people a slot on this type normally takes.
How many bookings may hold an area of this type at once. 1 for an ordinary court.
Was this page helpful?