curl --request POST \
--url https://api.1club.ai/v1/platform/website/pages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"slug": "<string>",
"title": "<string>",
"isHomepage": true,
"sections": [
{
"type": "<string>",
"config": {},
"translations": {}
}
],
"metaTitle": "<string>",
"metaDescription": "<string>",
"ogImage": "<string>",
"noindex": true,
"translations": {}
}
'import requests
url = "https://api.1club.ai/v1/platform/website/pages"
payload = {
"slug": "<string>",
"title": "<string>",
"isHomepage": True,
"sections": [
{
"type": "<string>",
"config": {},
"translations": {}
}
],
"metaTitle": "<string>",
"metaDescription": "<string>",
"ogImage": "<string>",
"noindex": True,
"translations": {}
}
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({
slug: '<string>',
title: '<string>',
isHomepage: true,
sections: [{type: '<string>', config: {}, translations: {}}],
metaTitle: '<string>',
metaDescription: '<string>',
ogImage: '<string>',
noindex: true,
translations: {}
})
};
fetch('https://api.1club.ai/v1/platform/website/pages', 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/pages",
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([
'slug' => '<string>',
'title' => '<string>',
'isHomepage' => true,
'sections' => [
[
'type' => '<string>',
'config' => [
],
'translations' => [
]
]
],
'metaTitle' => '<string>',
'metaDescription' => '<string>',
'ogImage' => '<string>',
'noindex' => true,
'translations' => [
]
]),
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/pages"
payload := strings.NewReader("{\n \"slug\": \"<string>\",\n \"title\": \"<string>\",\n \"isHomepage\": true,\n \"sections\": [\n {\n \"type\": \"<string>\",\n \"config\": {},\n \"translations\": {}\n }\n ],\n \"metaTitle\": \"<string>\",\n \"metaDescription\": \"<string>\",\n \"ogImage\": \"<string>\",\n \"noindex\": true,\n \"translations\": {}\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/website/pages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"slug\": \"<string>\",\n \"title\": \"<string>\",\n \"isHomepage\": true,\n \"sections\": [\n {\n \"type\": \"<string>\",\n \"config\": {},\n \"translations\": {}\n }\n ],\n \"metaTitle\": \"<string>\",\n \"metaDescription\": \"<string>\",\n \"ogImage\": \"<string>\",\n \"noindex\": true,\n \"translations\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.1club.ai/v1/platform/website/pages")
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 \"slug\": \"<string>\",\n \"title\": \"<string>\",\n \"isHomepage\": true,\n \"sections\": [\n {\n \"type\": \"<string>\",\n \"config\": {},\n \"translations\": {}\n }\n ],\n \"metaTitle\": \"<string>\",\n \"metaDescription\": \"<string>\",\n \"ogImage\": \"<string>\",\n \"noindex\": true,\n \"translations\": {}\n}"
response = http.request(request)
puts response.read_body{
"slug": "<string>",
"title": "<string>",
"isHomepage": true,
"sectionCount": 123,
"sectionTypes": [
"<string>"
],
"sections": [
{
"type": "<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>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Add a page
Creates a page on the draft. slug becomes its URL path segment and must be unique on the site; it is lowercased and stripped of surrounding slashes.
Adding a page does not link to it - update the header’s navItems and the footer’s links afterwards, or visitors will never find it.
curl --request POST \
--url https://api.1club.ai/v1/platform/website/pages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"slug": "<string>",
"title": "<string>",
"isHomepage": true,
"sections": [
{
"type": "<string>",
"config": {},
"translations": {}
}
],
"metaTitle": "<string>",
"metaDescription": "<string>",
"ogImage": "<string>",
"noindex": true,
"translations": {}
}
'import requests
url = "https://api.1club.ai/v1/platform/website/pages"
payload = {
"slug": "<string>",
"title": "<string>",
"isHomepage": True,
"sections": [
{
"type": "<string>",
"config": {},
"translations": {}
}
],
"metaTitle": "<string>",
"metaDescription": "<string>",
"ogImage": "<string>",
"noindex": True,
"translations": {}
}
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({
slug: '<string>',
title: '<string>',
isHomepage: true,
sections: [{type: '<string>', config: {}, translations: {}}],
metaTitle: '<string>',
metaDescription: '<string>',
ogImage: '<string>',
noindex: true,
translations: {}
})
};
fetch('https://api.1club.ai/v1/platform/website/pages', 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/pages",
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([
'slug' => '<string>',
'title' => '<string>',
'isHomepage' => true,
'sections' => [
[
'type' => '<string>',
'config' => [
],
'translations' => [
]
]
],
'metaTitle' => '<string>',
'metaDescription' => '<string>',
'ogImage' => '<string>',
'noindex' => true,
'translations' => [
]
]),
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/pages"
payload := strings.NewReader("{\n \"slug\": \"<string>\",\n \"title\": \"<string>\",\n \"isHomepage\": true,\n \"sections\": [\n {\n \"type\": \"<string>\",\n \"config\": {},\n \"translations\": {}\n }\n ],\n \"metaTitle\": \"<string>\",\n \"metaDescription\": \"<string>\",\n \"ogImage\": \"<string>\",\n \"noindex\": true,\n \"translations\": {}\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/website/pages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"slug\": \"<string>\",\n \"title\": \"<string>\",\n \"isHomepage\": true,\n \"sections\": [\n {\n \"type\": \"<string>\",\n \"config\": {},\n \"translations\": {}\n }\n ],\n \"metaTitle\": \"<string>\",\n \"metaDescription\": \"<string>\",\n \"ogImage\": \"<string>\",\n \"noindex\": true,\n \"translations\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.1club.ai/v1/platform/website/pages")
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 \"slug\": \"<string>\",\n \"title\": \"<string>\",\n \"isHomepage\": true,\n \"sections\": [\n {\n \"type\": \"<string>\",\n \"config\": {},\n \"translations\": {}\n }\n ],\n \"metaTitle\": \"<string>\",\n \"metaDescription\": \"<string>\",\n \"ogImage\": \"<string>\",\n \"noindex\": true,\n \"translations\": {}\n}"
response = http.request(request)
puts response.read_body{
"slug": "<string>",
"title": "<string>",
"isHomepage": true,
"sectionCount": 123,
"sectionTypes": [
"<string>"
],
"sections": [
{
"type": "<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>"
}{
"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.
Query Parameters
Body
Lowercase letters, numbers and hyphens, e.g. "personal-training"
Makes this the homepage, clearing the flag on whichever page held it
Initial sections. See GET /section-types for the types and their config.
Show child attributes
Show child attributes
SEO title. Falls back to the page title.
Falls back to seoSettings.siteDescription.
Absolute URL. Get one from GET /media rather than composing it.
Ask search engines not to index this page, and leave it out of sitemap.xml. For thank-you pages and campaign landing variants. The page stays publicly reachable - this is not a privacy control.
Per-locale metaTitle/metaDescription, keyed by locale: { "bg": { "metaTitle": "…" } }. Replaces the whole map. ogImage is not localizable - one social card serves every locale.
An override only reaches a visitor for a locale the organization actually serves: check supportedLocales on GET /website and add the locale there first, or the translation has no URL to be served at.
Show child attributes
Show child attributes
Response
The created page
A page on the website draft.
URL path segment. The homepage is served at "/" regardless of its slug.
Present when fetching a single page; omitted from list responses.
Show child attributes
Show child attributes
True when the page asks search engines not to index it and is left out of sitemap.xml.
Per-locale metaTitle/metaDescription overrides, keyed by locale: { "bg": { "metaTitle": "…" } }. Present when fetching a single page.
Show child attributes
Show child attributes
What the published page will actually put in its <head>, after every fallback has been applied - the authored fields alone do not answer "is my SEO right?". Present when fetching a single page. Read-only.
Show child attributes
Show child attributes
The page's public URL once published.
Was this page helpful?