curl --request PATCH \
--url https://app.sideshift.app/api/oauth/v1/brand-content-pages/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"body": {},
"publicShare": true,
"rotatePublicShareToken": true
}
'import requests
url = "https://app.sideshift.app/api/oauth/v1/brand-content-pages/{id}"
payload = {
"title": "<string>",
"body": {},
"publicShare": True,
"rotatePublicShareToken": True
}
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({
title: '<string>',
body: JSON.stringify({}),
publicShare: true,
rotatePublicShareToken: true
})
};
fetch('https://app.sideshift.app/api/oauth/v1/brand-content-pages/{id}', 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://app.sideshift.app/api/oauth/v1/brand-content-pages/{id}",
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([
'title' => '<string>',
'body' => [
],
'publicShare' => true,
'rotatePublicShareToken' => 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://app.sideshift.app/api/oauth/v1/brand-content-pages/{id}"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"body\": {},\n \"publicShare\": true,\n \"rotatePublicShareToken\": true\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://app.sideshift.app/api/oauth/v1/brand-content-pages/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"body\": {},\n \"publicShare\": true,\n \"rotatePublicShareToken\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/oauth/v1/brand-content-pages/{id}")
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 \"title\": \"<string>\",\n \"body\": {},\n \"publicShare\": true,\n \"rotatePublicShareToken\": true\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "<string>",
"companyId": "<string>",
"title": "<string>",
"body": {},
"status": "draft",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"shareToken": "<string>"
}
}{
"error": {
"code": "unauthorized",
"message": "Missing bearer access token",
"requestId": "req_..."
}
}{
"error": {
"code": "insufficient_scope",
"message": "Requires scope 'campaigns:write'",
"requestId": "req_..."
}
}{
"error": {
"code": "not_found",
"message": "Resource not found",
"requestId": "req_..."
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded",
"requestId": "req_..."
}
}Update a brand content page
Update one of the token tenant’s brand content pages. Requires the brand-content-pages:write scope.
curl --request PATCH \
--url https://app.sideshift.app/api/oauth/v1/brand-content-pages/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"body": {},
"publicShare": true,
"rotatePublicShareToken": true
}
'import requests
url = "https://app.sideshift.app/api/oauth/v1/brand-content-pages/{id}"
payload = {
"title": "<string>",
"body": {},
"publicShare": True,
"rotatePublicShareToken": True
}
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({
title: '<string>',
body: JSON.stringify({}),
publicShare: true,
rotatePublicShareToken: true
})
};
fetch('https://app.sideshift.app/api/oauth/v1/brand-content-pages/{id}', 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://app.sideshift.app/api/oauth/v1/brand-content-pages/{id}",
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([
'title' => '<string>',
'body' => [
],
'publicShare' => true,
'rotatePublicShareToken' => 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://app.sideshift.app/api/oauth/v1/brand-content-pages/{id}"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"body\": {},\n \"publicShare\": true,\n \"rotatePublicShareToken\": true\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://app.sideshift.app/api/oauth/v1/brand-content-pages/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"body\": {},\n \"publicShare\": true,\n \"rotatePublicShareToken\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.sideshift.app/api/oauth/v1/brand-content-pages/{id}")
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 \"title\": \"<string>\",\n \"body\": {},\n \"publicShare\": true,\n \"rotatePublicShareToken\": true\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "<string>",
"companyId": "<string>",
"title": "<string>",
"body": {},
"status": "draft",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"shareToken": "<string>"
}
}{
"error": {
"code": "unauthorized",
"message": "Missing bearer access token",
"requestId": "req_..."
}
}{
"error": {
"code": "insufficient_scope",
"message": "Requires scope 'campaigns:write'",
"requestId": "req_..."
}
}{
"error": {
"code": "not_found",
"message": "Resource not found",
"requestId": "req_..."
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded",
"requestId": "req_..."
}
}Authorizations
OAuth 2.1 authorization code + PKCE (S256). Tokens are tenant-bound (company_id) and scoped. Discover endpoints via /.well-known/oauth-authorization-server.
Path Parameters
The id.
Body
Update a brand content page (writers only). All fields optional; only provided fields are changed. Body is permissive (unknown fields are ignored). The public-share flags drive the share-link lifecycle.
New page title (trimmed, truncated to 200 chars; blank becomes "Untitled").
New rich content as a TipTap/ProseMirror JSON document ({ "type": "doc", ... }); any other shape is normalized to an empty document.
New publication status (anything other than "published" is treated as "draft").
draft, published Enable (true) or disable (false) the public share link. Enabling reuses the existing token or mints one; disabling removes the share token. Tri-state: omit to leave unchanged.
When true, rotate (regenerate) the public share token. Takes precedence over publicShare.
Response
The updated brand content page.
A brand content page (rich-text marketing/landing page) owned by the token's company. shareToken is present only for writers (editors); non-writers reading a published page never receive it.
Show child attributes
Show child attributes