Make a Site
US Region: https://public-api.sessionboard.com · EU Region: https://public-api-eu.sessionboard.com
Makes a product's first Site with no setup, from the organization's own data and Brand Kit: a Learning Site from its courses, an Awards Site with its home in the draft, or a Marketing page for an event (eventId). Pass url to rebuild an existing page: its text, menu and images come back as source_page for you to turn into edits. Nothing is published. Also at POST /v1/sites/make.
Request example
curl --request POST \ --url 'https://public-api.sessionboard.com/v1/organization/{orgId}/sites/make' \ --header 'x-access-token: <api-token>' \ --header 'Content-Type: application/json' \ --data '{ "product": "marketing", "name": "<string>", "brief": "<string>", "url": "https://example.com", "eventId": "<string>"}'const response = await fetch('https://public-api.sessionboard.com/v1/organization/{orgId}/sites/make', { method: 'POST', headers: { "x-access-token": "<api-token>", "Content-Type": "application/json" }, body: JSON.stringify({ "product": "marketing", "name": "<string>", "brief": "<string>", "url": "https://example.com", "eventId": "<string>" }),});
const data = await response.json();console.log(data);import requests
response = requests.request( "POST", "https://public-api.sessionboard.com/v1/organization/{orgId}/sites/make", headers={ "x-access-token": "<api-token>", "Content-Type": "application/json" }, json={ "product": "marketing", "name": "<string>", "brief": "<string>", "url": "https://example.com", "eventId": "<string>" },)
print(response.json())<?php
$curl = curl_init();
curl_setopt_array($curl, [ CURLOPT_URL => "https://public-api.sessionboard.com/v1/organization/{orgId}/sites/make", CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => '{ "product": "marketing", "name": "<string>", "brief": "<string>", "url": "https://example.com", "eventId": "<string>"}', CURLOPT_HTTPHEADER => [ "x-access-token: <api-token>", "Content-Type: application/json", ],]);
$response = curl_exec($curl);curl_close($curl);
echo $response;package main
import ( "fmt" "io" "net/http" "strings")
func main() { req, _ := http.NewRequest("POST", "https://public-api.sessionboard.com/v1/organization/{orgId}/sites/make", strings.NewReader(`{ "product": "marketing", "name": "<string>", "brief": "<string>", "url": "https://example.com", "eventId": "<string>"}`)) req.Header.Add("x-access-token", "<api-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))}HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://public-api.sessionboard.com/v1/organization/{orgId}/sites/make")) .header("x-access-token", "<api-token>") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"product\": \"marketing\",\n \"name\": \"<string>\",\n \"brief\": \"<string>\",\n \"url\": \"https://example.com\",\n \"eventId\": \"<string>\"\n}")) .build();
HttpResponse<String> response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());Try it
Response headers
Authorizations
x-access-tokenstringheaderOrganization API token. Generate from Organization Settings → API Tokens.
AuthorizationBearer <token>headerorOAuth 2.1 access token. Obtained via the OAuth PKCE flow at
/oauth/token.
Send one of these. See Authentication.
Path parameters
orgIdstringpathrequiredYour organization ID. Any other organization returns
404.
Request body
productstringrequired- Allowed values
"marketing", "learning", "awards"
namestring- Max length
200
briefstringWhat the Site is for, in the person's words.
- Max length
2000
urlstring<uri>An https page to rebuild.
- Max length
2048
eventIdstringMarketing only; the event the page is for.
- Pattern
^\d+$
{ "product": "marketing", "name": "<string>", "brief": "<string>", "url": "https://example.com", "eventId": "<string>"}Responses
200application/json
The new Site, read as in Get a Site, plus source_page when you sent url.
payloadobjectShow child attributes
siteobjectShow child attributes
idstring<uuid>typestringevent_page(Marketing),learning, orawards/event_portal/internal(Awards).productstring- Allowed values
"marketing", "learning", "awards"
namestringslugstringevent_idinteger | nullurlstring | nullThe live address.
revisionstringSend back as
baseRevisionon your next write.has_unpublished_changesbooleanpublished_atstring<date-time> | nulldraft_updated_atstring<date-time> | nullbrand_kit_idstring | nulllast_writeobject | nullWho wrote the draft last (a person, Ask, or an MCP client) and when.
pagesSitePage[]Show child attributes
refstringhome, or how to refer to the page in an edit.idstring | nullnullfor a page that is new in the draft.titlestringslugstringpathstringurlstring | nullis_homebooleanhiddenbooleanvisibilitystring- Allowed values
"public", "reviewers", "submitters"
is_newbooleanblocksSiteBlock[]Show child attributes
idstringkindstringA kind from the Site's
block_catalog.hiddenbooleanconfigobjectThe block's settings, as its schema in
block_catalogdescribes.
navobject | nullThe menu;
nullfollows the pages.themeobjectShow child attributes
modestring- Allowed values
"light", "dark", "auto"
primarystring | nullaccentstring | nulltextstring | nullgradientstring | null[]fontstring | nulllogo_urlstring | nullfollow_brand_kitboolean
rolesobject[]Who you can preview the Site as.
Show child attributes
idstringlabelstringhintstring
devicesstring[]has_pagesbooleanfalsefor a one-page Site (the Marketing event page): use pagehome.block_catalogobject[]Every block kind this Site takes, with a label, a JSON Schema for
configand an example.diffSiteDiffShow child attributes
changedbooleanpagesobject[]blocksobject[]settingsobject[]Show child attributes
keystringlabelstring
summarystring[]One plain sentence per change, for the person to read.
rulesstring[]How to edit this Site, in plain sentences.
source_pageobjectThe page at
url, read for you to rebuild (title, headings, text, links, images).
400
A missing eventId for Marketing, or a url that could not be read.
403
SCOPE_REQUIRED— the token lacksread:sites(orread:marketing,read:learning,read:awards) for reads, or the matchingwrite:scope for writes.FORBIDDEN— the token's user cannot edit this Site.
Response examples
{ "payload": { "site": { "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a", "type": "<string>", "product": "marketing", "name": "<string>", "slug": "<string>", "event_id": 123, "url": "<string>", "revision": "<string>", "has_unpublished_changes": true, "published_at": "2026-01-15T09:30:00Z", "draft_updated_at": "2026-01-15T09:30:00Z", "brand_kit_id": "<string>", "last_write": {} }, "pages": [ { "ref": "<string>", "id": "<string>", "title": "<string>", "slug": "<string>", "path": "<string>", "url": "<string>", "is_home": true, "hidden": true, "visibility": "public", "is_new": true, "blocks": [ { "id": "<string>", "kind": "<string>", "hidden": true, "config": {} } ] } ], "nav": {}, "theme": { "mode": "light", "primary": "<string>", "accent": "<string>", "text": "<string>", "gradient": [ "<string>" ], "font": "<string>", "logo_url": "<string>", "follow_brand_kit": true }, "roles": [ { "id": "<string>", "label": "<string>", "hint": "<string>" } ], "devices": [ "<string>" ], "has_pages": true, "block_catalog": [ {} ], "diff": { "changed": true, "pages": [ {} ], "blocks": [ {} ], "settings": [ { "key": "<string>", "label": "<string>" } ], "summary": [ "<string>" ] }, "rules": [ "<string>" ], "source_page": {} }}