curl --request PATCH \
--url https://api.1club.ai/v1/platform/website \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"seoSettings": {
"siteDescription": "<string>",
"defaultOgImage": "<string>",
"verification": {
"google": "<string>",
"bing": "<string>"
}
},
"buttonStyle": {
"uppercase": true
},
"clubId": 123,
"supportedLocales": []
}
'import requests
url = "https://api.1club.ai/v1/platform/website"
payload = {
"name": "<string>",
"seoSettings": {
"siteDescription": "<string>",
"defaultOgImage": "<string>",
"verification": {
"google": "<string>",
"bing": "<string>"
}
},
"buttonStyle": { "uppercase": True },
"clubId": 123,
"supportedLocales": []
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
seoSettings: {
siteDescription: '<string>',
defaultOgImage: '<string>',
verification: {google: '<string>', bing: '<string>'}
},
buttonStyle: {uppercase: true},
clubId: 123,
supportedLocales: []
})
};
fetch('https://api.1club.ai/v1/platform/website', 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/website",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'seoSettings' => [
'siteDescription' => '<string>',
'defaultOgImage' => '<string>',
'verification' => [
'google' => '<string>',
'bing' => '<string>'
]
],
'buttonStyle' => [
'uppercase' => true
],
'clubId' => 123,
'supportedLocales' => [
]
]),
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/website"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"seoSettings\": {\n \"siteDescription\": \"<string>\",\n \"defaultOgImage\": \"<string>\",\n \"verification\": {\n \"google\": \"<string>\",\n \"bing\": \"<string>\"\n }\n },\n \"buttonStyle\": {\n \"uppercase\": true\n },\n \"clubId\": 123,\n \"supportedLocales\": []\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.1club.ai/v1/platform/website")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"seoSettings\": {\n \"siteDescription\": \"<string>\",\n \"defaultOgImage\": \"<string>\",\n \"verification\": {\n \"google\": \"<string>\",\n \"bing\": \"<string>\"\n }\n },\n \"buttonStyle\": {\n \"uppercase\": true\n },\n \"clubId\": 123,\n \"supportedLocales\": []\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.1club.ai/v1/platform/website")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"seoSettings\": {\n \"siteDescription\": \"<string>\",\n \"defaultOgImage\": \"<string>\",\n \"verification\": {\n \"google\": \"<string>\",\n \"bing\": \"<string>\"\n }\n },\n \"buttonStyle\": {\n \"uppercase\": true\n },\n \"clubId\": 123,\n \"supportedLocales\": []\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"name": "<string>",
"slug": "<string>",
"domain": "<string>",
"isDefault": true,
"isActive": true,
"clubId": 123,
"url": "<string>",
"previewUrl": "<string>",
"published": true,
"activeReleaseVersion": 123,
"lastPublishedAt": "2023-11-07T05:31:56Z",
"themeSupport": "both",
"defaultTheme": "light",
"supportedLocales": [
"<string>"
],
"defaultLocale": "<string>",
"seoSettings": {
"siteDescription": "<string>",
"defaultOgImage": "<string>",
"verification": {
"google": "<string>",
"bing": "<string>"
}
},
"pages": [
{
"slug": "<string>",
"title": "<string>",
"isHomepage": true,
"sectionCount": 123,
"sectionTypes": [
"<string>"
],
"sections": [
{
"type": "<string>",
"htmlId": "<string>",
"config": {},
"translations": {}
}
],
"metaTitle": "<string>",
"metaDescription": "<string>",
"ogImage": "<string>",
"noindex": true,
"translations": {},
"seo": {
"metaTitle": "<string>",
"metaDescription": "<string>",
"ogImage": "<string>",
"canonicalUrl": "<string>",
"indexable": true,
"notIndexableReason": "page_noindex",
"localizedLocales": [
"<string>"
]
},
"url": "<string>"
}
],
"layout": {
"header": {
"type": "<string>",
"htmlId": "<string>",
"config": {},
"translations": {}
},
"footer": {
"type": "<string>",
"htmlId": "<string>",
"config": {},
"translations": {}
}
},
"hasCustomCss": true,
"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": {}
}Update website-level settings
Changes the website’s name, theme behaviour and site-wide SEO defaults. Every field is optional; omitted fields are left alone.
supportedLocales and defaultLocale are organization-level and need the additional organization:write scope. They also decide which languages the member portal, the mobile app and outbound email offer, and they take effect immediately rather than on publish - so they are a separate grant from editing the draft. They are reachable here at all because they are what decides which localized URLs the website serves: a page or section translated into an unlisted locale has no URL to be served at and no hreflang alternate pointing to it. A defaultLocale outside supportedLocales is a 400.
Everything else in this body edits the draft, seoSettings included - it is stored in the site’s settings, so a release carries it and the public site keeps serving the previously published values until you publish.
Deliberately cannot change the site’s address (slug, domain), which website is the organization’s default, or whether the site is switched on - those move a customer’s public presence and are not side effects a content edit should have.
curl --request PATCH \
--url https://api.1club.ai/v1/platform/website \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"seoSettings": {
"siteDescription": "<string>",
"defaultOgImage": "<string>",
"verification": {
"google": "<string>",
"bing": "<string>"
}
},
"buttonStyle": {
"uppercase": true
},
"clubId": 123,
"supportedLocales": []
}
'import requests
url = "https://api.1club.ai/v1/platform/website"
payload = {
"name": "<string>",
"seoSettings": {
"siteDescription": "<string>",
"defaultOgImage": "<string>",
"verification": {
"google": "<string>",
"bing": "<string>"
}
},
"buttonStyle": { "uppercase": True },
"clubId": 123,
"supportedLocales": []
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
seoSettings: {
siteDescription: '<string>',
defaultOgImage: '<string>',
verification: {google: '<string>', bing: '<string>'}
},
buttonStyle: {uppercase: true},
clubId: 123,
supportedLocales: []
})
};
fetch('https://api.1club.ai/v1/platform/website', 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/website",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'seoSettings' => [
'siteDescription' => '<string>',
'defaultOgImage' => '<string>',
'verification' => [
'google' => '<string>',
'bing' => '<string>'
]
],
'buttonStyle' => [
'uppercase' => true
],
'clubId' => 123,
'supportedLocales' => [
]
]),
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/website"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"seoSettings\": {\n \"siteDescription\": \"<string>\",\n \"defaultOgImage\": \"<string>\",\n \"verification\": {\n \"google\": \"<string>\",\n \"bing\": \"<string>\"\n }\n },\n \"buttonStyle\": {\n \"uppercase\": true\n },\n \"clubId\": 123,\n \"supportedLocales\": []\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.1club.ai/v1/platform/website")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"seoSettings\": {\n \"siteDescription\": \"<string>\",\n \"defaultOgImage\": \"<string>\",\n \"verification\": {\n \"google\": \"<string>\",\n \"bing\": \"<string>\"\n }\n },\n \"buttonStyle\": {\n \"uppercase\": true\n },\n \"clubId\": 123,\n \"supportedLocales\": []\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.1club.ai/v1/platform/website")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"seoSettings\": {\n \"siteDescription\": \"<string>\",\n \"defaultOgImage\": \"<string>\",\n \"verification\": {\n \"google\": \"<string>\",\n \"bing\": \"<string>\"\n }\n },\n \"buttonStyle\": {\n \"uppercase\": true\n },\n \"clubId\": 123,\n \"supportedLocales\": []\n}"
response = http.request(request)
puts response.read_body{
"id": 123,
"name": "<string>",
"slug": "<string>",
"domain": "<string>",
"isDefault": true,
"isActive": true,
"clubId": 123,
"url": "<string>",
"previewUrl": "<string>",
"published": true,
"activeReleaseVersion": 123,
"lastPublishedAt": "2023-11-07T05:31:56Z",
"themeSupport": "both",
"defaultTheme": "light",
"supportedLocales": [
"<string>"
],
"defaultLocale": "<string>",
"seoSettings": {
"siteDescription": "<string>",
"defaultOgImage": "<string>",
"verification": {
"google": "<string>",
"bing": "<string>"
}
},
"pages": [
{
"slug": "<string>",
"title": "<string>",
"isHomepage": true,
"sectionCount": 123,
"sectionTypes": [
"<string>"
],
"sections": [
{
"type": "<string>",
"htmlId": "<string>",
"config": {},
"translations": {}
}
],
"metaTitle": "<string>",
"metaDescription": "<string>",
"ogImage": "<string>",
"noindex": true,
"translations": {},
"seo": {
"metaTitle": "<string>",
"metaDescription": "<string>",
"ogImage": "<string>",
"canonicalUrl": "<string>",
"indexable": true,
"notIndexableReason": "page_noindex",
"localizedLocales": [
"<string>"
]
},
"url": "<string>"
}
],
"layout": {
"header": {
"type": "<string>",
"htmlId": "<string>",
"config": {},
"translations": {}
},
"footer": {
"type": "<string>",
"htmlId": "<string>",
"config": {},
"translations": {}
}
},
"hasCustomCss": true,
"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": {}
}Authorizations
Organization-scoped bearer credential: a customer API key (1club_sk_live_...) or an MCP OAuth access token.
Query Parameters
Body
both lets a visitor switch; light/dark fixes the theme.
both, light, dark Only meaningful when themeSupport is both.
light, dark, system Site-wide SEO defaults, replacing the whole object - read the current one from GET /website first. Every field is a fallback a page can override.
Show child attributes
Show child attributes
How buttons look across the WHOLE website. Site-wide on purpose: a section chooses each button's emphasis (primary/secondary/outline/ghost), but a site with pill buttons in the hero and square ones in a CTA reads as broken. Unlike seoSettings this MERGES field by field, so setting the shape leaves the casing alone. An all-default style is stored as nothing, and the renderer falls back to pill.
Show child attributes
Show child attributes
How round every corner on the site is - section cards, media frames, form controls, and buttons on sharp/round. Defaults to soft, which is what every site rendered before this existed. null returns to the default.
sharp, soft, round The site's baseline vertical rhythm: the gap BETWEEN sections and the default padding inside one. A section's own paddingY overrides the padding half; the gap is the part no per-section control reaches. null returns to the default.
compact, default, airy How large headings run relative to body text. A multiplier on the heading ladder rather than a set of sizes. null returns to the default.
compact, default, editorial Club this website represents. When set, the header and footer use that club's logo instead of the organization's. null clears the binding. Takes effect immediately, like name — logos are branding assets rather than a published token.
Locales this organization serves, in display order. Organization-level, requires organization:write, and applies immediately - see the endpoint description. Must contain defaultLocale.
en, es, fr, de, bg, cs Locale served at the site root. Organization-level, requires organization:write.
en, es, fr, de, bg, cs Response
The updated website
A website belonging to the organization. Page content, layout and theme tokens describe the draft. url, published, activeReleaseVersion and lastPublishedAt describe what the public is currently being served. name and clubId are live row fields — they take effect without a publish.
Platform host label - the site answers on <slug>.1club.me.
Custom domain, when one is pointed at this site.
True for the site an organization-wide caller means by "the website". Exactly one per organization.
False means the site is switched off and serves nothing publicly, whatever the draft contains.
Club this website represents. When set, the header and footer use that club's logo instead of the organization's. Live, like name.
Public URL - the custom domain when set, else the platform host.
The same site rendered from the unpublished draft - the link to review edits before publishing. Carries a signed grant that expires 24 hours after this response was generated; read the website again for a fresh one. Anyone holding the link can view the draft, so it is shareable without a login but should be treated as sensitive.
Whether the site has ever been published. False means nothing is publicly reachable yet.
both, light, dark light, dark, system Locales the site serves, which is what its hreflang alternates and sitemap.xml advertise. Organization-level - see PATCH /v1/platform/website.
Locale served at the site root. Organization-level.
Site-wide SEO defaults. Each field is a fallback a page can override.
Show child attributes
Show child attributes
Present when fetching one website; omitted from the site list.
Show child attributes
Show child attributes
Header and footer, rendered on every page.
Show child attributes
Show child attributes
Was this page helpful?