Add a page
Adds a page and the template that holds its content, in one step. A site holds at most 50 pages. The page can use one of the site’s own menus, named by its slug.
curl --request POST \
--url https://api.fluid.app/api/member/v2026-10/sites/{site_id}/pages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"slug": "about",
"title": "About us",
"published": true,
"content": "<h1>About us</h1>"
}
'import requests
url = "https://api.fluid.app/api/member/v2026-10/sites/{site_id}/pages"
payload = {
"slug": "about",
"title": "About us",
"published": True,
"content": "<h1>About us</h1>"
}
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: 'about',
title: 'About us',
published: true,
content: '<h1>About us</h1>'
})
};
fetch('https://api.fluid.app/api/member/v2026-10/sites/{site_id}/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.fluid.app/api/member/v2026-10/sites/{site_id}/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' => 'about',
'title' => 'About us',
'published' => true,
'content' => '<h1>About us</h1>'
]),
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.fluid.app/api/member/v2026-10/sites/{site_id}/pages"
payload := strings.NewReader("{\n \"slug\": \"about\",\n \"title\": \"About us\",\n \"published\": true,\n \"content\": \"<h1>About us</h1>\"\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.fluid.app/api/member/v2026-10/sites/{site_id}/pages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"slug\": \"about\",\n \"title\": \"About us\",\n \"published\": true,\n \"content\": \"<h1>About us</h1>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/member/v2026-10/sites/{site_id}/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\": \"about\",\n \"title\": \"About us\",\n \"published\": true,\n \"content\": \"<h1>About us</h1>\"\n}"
response = http.request(request)
puts response.read_body{
"status": 201,
"data": {
"id": "0192f4e5-7a01-7b8c-9d0e-1f2a3b4c5d02",
"slug": "about",
"title": "About us",
"position": 0,
"published": true,
"layout_name": null,
"menu": null,
"lock_version": 0,
"created_at": "2026-09-01T10:00:00.000000Z",
"updated_at": "2026-09-01T10:00:00.000000Z"
},
"meta": {
"request_uuid": "0192f4c8-5b6c-7d74-a3e8-0f1a2b3c4d5e",
"timestamp": "2026-09-30T15:08:21Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}Authorizations
A member credential in the Authorization: Bearer header: a member
session JWT, a portal JWT whose login is linked to a membership in
that company, an opaque member token, or a verified One Auth identity
access token. The credential alone identifies the member and company.
Member session and portal JWTs are read-only and are refused with 403
on every write.
Path Parameters
Public id of one of the member's sites.
Body
A new page. Fields a member cannot set are refused as unknown fields.
Lowercase letters and digits separated by single hyphens, unique in the site, or / for the home page. index is reserved for the home page.
1 - 255^(/|[a-z0-9]+(-[a-z0-9]+)*)$Display title.
1 - 255^[^\u0000]*[^\s\u0000][^\u0000]*$Order of the page among the site's pages. Defaults to 0.
Whether the page is shown once the site is published. Defaults to false.
The layout this page uses. Null or omitted uses the site's default.
255The slug of one of the site's own menus. A menu of another site is refused. Null or omitted assigns none.
255The page's content, kept in the site file pages/<slug>.liquid. Empty by default.
^[^\u0000]*$Response
The new page.
curl --request POST \
--url https://api.fluid.app/api/member/v2026-10/sites/{site_id}/pages \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"slug": "about",
"title": "About us",
"published": true,
"content": "<h1>About us</h1>"
}
'import requests
url = "https://api.fluid.app/api/member/v2026-10/sites/{site_id}/pages"
payload = {
"slug": "about",
"title": "About us",
"published": True,
"content": "<h1>About us</h1>"
}
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: 'about',
title: 'About us',
published: true,
content: '<h1>About us</h1>'
})
};
fetch('https://api.fluid.app/api/member/v2026-10/sites/{site_id}/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.fluid.app/api/member/v2026-10/sites/{site_id}/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' => 'about',
'title' => 'About us',
'published' => true,
'content' => '<h1>About us</h1>'
]),
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.fluid.app/api/member/v2026-10/sites/{site_id}/pages"
payload := strings.NewReader("{\n \"slug\": \"about\",\n \"title\": \"About us\",\n \"published\": true,\n \"content\": \"<h1>About us</h1>\"\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.fluid.app/api/member/v2026-10/sites/{site_id}/pages")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"slug\": \"about\",\n \"title\": \"About us\",\n \"published\": true,\n \"content\": \"<h1>About us</h1>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/member/v2026-10/sites/{site_id}/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\": \"about\",\n \"title\": \"About us\",\n \"published\": true,\n \"content\": \"<h1>About us</h1>\"\n}"
response = http.request(request)
puts response.read_body{
"status": 201,
"data": {
"id": "0192f4e5-7a01-7b8c-9d0e-1f2a3b4c5d02",
"slug": "about",
"title": "About us",
"position": 0,
"published": true,
"layout_name": null,
"menu": null,
"lock_version": 0,
"created_at": "2026-09-01T10:00:00.000000Z",
"updated_at": "2026-09-01T10:00:00.000000Z"
},
"meta": {
"request_uuid": "0192f4c8-5b6c-7d74-a3e8-0f1a2b3c4d5e",
"timestamp": "2026-09-30T15:08:21Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": 123,
"error": {
"message": "<string>",
"details": {}
},
"meta": {
"request_uuid": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"timestamp": "2023-11-07T05:31:56Z"
}
}