Sites
Tags: content, sites
Website and content management
In the product: Sites
Resources
Request and response models used by the endpoints on this page.
MenuItemResponse
| Field | Type | Required | Description |
|---|---|---|---|
children | Array<MenuItemResponse> | ||
createdAt | DateTime | ✓ | |
cssClass | String | ||
icon | String | ||
id | Integer | ✓ | |
isActive | Boolean | Default: True | |
itemType | Literal['page', 'url', 'products', 'none'] | ✓ | |
label | String | ✓ | |
pageId | Integer | ||
pageSlug | String | ||
pageTitle | String | ||
parentId | Integer | ||
position | Integer | ✓ | |
siteId | Integer | ✓ | |
target | String | ||
translations | Dict[str, str] | ||
updatedAt | DateTime | ✓ | |
url | String |
Example:
{
"id": 0,
"siteId": 0,
"label": "string",
"itemType": "page",
"position": 0,
"isActive": true,
"createdAt": "2024-01-01T00:00:00Z",
"updatedAt": "2024-01-01T00:00:00Z"
}
MenuTreeResponse
| Field | Type | Required | Description |
|---|---|---|---|
items | Array<MenuItemResponse> | ||
siteId | Integer | ✓ |
Example:
{
"siteId": 0
}
RenderedPageResponse
| Field | Type | Required | Description |
|---|---|---|---|
availableLocales | Array | ||
content | String | ✓ | |
contentBlocks | TipTapDocument | null | ||
createdAt | DateTime | ✓ | |
id | Integer | ✓ | |
locale | String | Default: en-US | |
metaDescription | String | ||
primaryLocale | String | ||
slug | String | ✓ | |
status | String | Default: draft | |
title | String | ✓ | |
updatedAt | DateTime |
Example:
{
"id": 0,
"slug": "string",
"title": "string",
"status": "draft",
"content": "string",
"createdAt": "2024-01-01T00:00:00Z",
"locale": "en-US"
}
SiteMappingResponse
| Field | Type | Required | Description |
|---|---|---|---|
primaryLocale | String | ✓ | |
sessionKind | <enum SessionKind | ✓ | |
siteUuid | String | ✓ | |
theme | String | ✓ | |
wid | String | ✓ |
Example:
{
"wid": "string",
"siteUuid": "string",
"theme": "string",
"primaryLocale": "string",
"sessionKind": null
}
SiteResponse
| Field | Type | Required | Description |
|---|---|---|---|
allowSignup | Boolean | ✓ | |
anonymousFormId | Integer | ||
anonymousFormUuid | String | ||
assetsFolderId | Integer | ||
authenticationMethods | Array<Literal[name_dob]> | Default: [] | |
authorized | Boolean | ✓ | |
availableLocales | Array | Default: ['en-US'] | |
content | String | ✓ | |
createdAt | DateTime | ✓ | |
customDomain | String | ✓ | |
defaultUrl | String | ||
defaultWorkflowId | Integer | ||
googleAdwordsId | String | ||
googleAnalyticsId | String | ||
homePageId | Integer | ||
id | Integer | ✓ | |
isMapped | Boolean | ✓ | |
isPublic | Boolean | ✓ | |
isReseller | Boolean | ✓ | |
metaDescription | String | ✓ | |
name | String | ✓ | |
operatorLineE164 | String | ||
organizationLogoUrl | String | ||
ownerId | Integer | ||
pageCount | Integer | ||
permissions | Integer | Default: 0 | |
primaryLocale | String | Default: en-US | |
redirectUrl | String | ✓ | |
resolvedThemeSettings | dict[str, Any] | Default: {} | |
signupMemberRoleId | Integer | ||
signupMemberRoleName | String | ||
slug | String | ✓ | |
sourceFolderId | Integer | ||
sourceReleaseId | Integer | ||
tagLine | String | ✓ | |
theme | Literal[default, gravityrail-home, gravityrail-home-2, gravityrail-start, leapcure-home, leapcure-home-no-chat, leapcure-home-pre-launch, admin-clinical-trial, customer-basic, rc360-demo, patient-engagement-demo, operator-product, gravity-health, gravity-developer, gravityrail-launch, gravity-rail-feb-2026, gravity-rail-2026-v2, operator-2026, cosan-enrollment, cosan-enrollment-v2, gravity-health-enrollment, source-site] | ✓ | |
themeSettings | dict[str, Any] | Default: {} | |
updatedAt | DateTime | ✓ | |
url | String | ✓ | |
uuid | String | ✓ | |
workspaceName | String | ✓ | |
workspaceUuid | String |
Example:
{
"id": 0,
"name": "string",
"uuid": "string",
"slug": "string",
"theme": null,
"themeSettings": {},
"resolvedThemeSettings": {},
"content": "string",
"authorized": false,
"tagLine": "string",
"metaDescription": "string",
"customDomain": "string",
"redirectUrl": "string",
"allowSignup": false,
"isMapped": false,
"isPublic": false,
"authenticationMethods": [],
"createdAt": "2024-01-01T00:00:00Z",
"updatedAt": "2024-01-01T00:00:00Z",
"isReseller": false,
"workspaceName": "string",
"url": "string",
"permissions": 0,
"primaryLocale": "en-US",
"availableLocales": [
"en-US"
]
}
SiteSignupResponse
| Field | Type | Required | Description |
|---|---|---|---|
memberId | Integer | ||
message | String | ✓ | |
roleName | String | ||
status | Literal['success', 'already_member'] | ✓ |
Example:
{
"status": "success",
"message": "string"
}
TipTapDocument
| Field | Type | Required | Description |
|---|---|---|---|
content | Array<TipTapNode> | null | ||
translations | Dictionary<String, TipTapDocument> | null | ||
type | Literal['doc'] | Default: doc |
Example:
{
"type": "doc"
}
TipTapMark
| Field | Type | Required | Description |
|---|---|---|---|
attrs | Dict[str, Any] | ||
type | String | ✓ |
Example:
{
"type": "string"
}
TipTapNode
| Field | Type | Required | Description |
|---|---|---|---|
attrs | Dict[str, Any] | ||
content | Array<TipTapNode> | null | ||
marks | Array<TipTapMark> | null | ||
text | String | ||
type | String | ✓ |
Example:
{
"type": "string"
}
UnauthorizedSiteResponse
| Field | Type | Required | Description |
|---|---|---|---|
allowSignup | Boolean | Default: False | |
anonymousFormId | Integer | ||
anonymousFormUuid | String | ||
assetsFolderId | Integer | ||
authenticationMethods | Array<Literal[name_dob]> | Default: [] | |
authorized | Boolean | ✓ | |
availableLocales | Array | Default: ['en-US'] | |
content | String | ✓ | |
createdAt | DateTime | ✓ | |
customDomain | String | ||
defaultUrl | String | ||
defaultWorkflowId | Integer | ||
googleAdwordsId | String | ||
googleAnalyticsId | String | ||
homePageId | Integer | ||
id | Integer | ✓ | |
isMapped | Boolean | Default: False | |
isPublic | Boolean | ✓ | |
isReseller | Boolean | ✓ | |
metaDescription | String | ✓ | |
name | String | ✓ | |
operatorLineE164 | String | ||
organizationLogoUrl | String | ||
ownerId | Integer | ||
pageCount | Integer | ||
permissions | Integer | Default: 0 | |
primaryLocale | String | Default: en-US | |
redirectUrl | String | ✓ | |
resolvedThemeSettings | dict[str, Any] | Default: {} | |
signupMemberRoleId | Integer | ||
signupMemberRoleName | String | ||
slug | String | ✓ | |
sourceFolderId | Integer | ||
sourceReleaseId | Integer | ||
tagLine | String | ✓ | |
theme | Literal[default, gravityrail-home, gravityrail-home-2, gravityrail-start, leapcure-home, leapcure-home-no-chat, leapcure-home-pre-launch, admin-clinical-trial, customer-basic, rc360-demo, patient-engagement-demo, operator-product, gravity-health, gravity-developer, gravityrail-launch, gravity-rail-feb-2026, gravity-rail-2026-v2, operator-2026, cosan-enrollment, cosan-enrollment-v2, gravity-health-enrollment, source-site] | ✓ | |
themeSettings | dict[str, Any] | Default: {} | |
updatedAt | DateTime | ✓ | |
url | String | ||
uuid | String | ✓ | |
workspaceName | String | Default: `` | |
workspaceUuid | String |
Example:
{
"id": 0,
"name": "string",
"uuid": "string",
"slug": "string",
"theme": null,
"themeSettings": {},
"resolvedThemeSettings": {},
"content": "string",
"authorized": false,
"tagLine": "string",
"metaDescription": "string",
"redirectUrl": "string",
"allowSignup": false,
"isMapped": false,
"isPublic": false,
"authenticationMethods": [],
"createdAt": "2024-01-01T00:00:00Z",
"updatedAt": "2024-01-01T00:00:00Z",
"isReseller": false,
"workspaceName": "",
"permissions": 0,
"primaryLocale": "en-US",
"availableLocales": [
"en-US"
]
}
Endpoints
GET /api/v2/s/mapping/{custom_domain}- MappingGET /api/v2/s/{workspace_uuid}/{site_uuid}- Get Workspace Uuid Site UuidGET /api/v2/s/{workspace_uuid}/{site_uuid}/files/{file_id}/contents/{filename}- ContentsGET /api/v2/s/{workspace_uuid}/{site_uuid}/menu- MenuGET /api/v2/s/{workspace_uuid}/{site_uuid}/pages/{page_slug_or_id}- PagesPOST /api/v2/s/{workspace_uuid}/{site_uuid}/signup- Signup
Mapping
GET /api/v2/s/mapping/{custom_domain}
Description:
Get workspace_uuid and site_uuid for a custom domain.
A miss is a 404 either way. A domain registered here with sites enabled
but no Site mapped carries {"code": "site_domain_unmapped"}, so the
site proxy can serve its neutral page there (#26585); any other host
keeps the plain "Site not found". Neither body names an organization or
workspace.
Authentication: Requires authenticated user
Parameters:
custom_domain(String)
Response: See SiteMappingResponse
Get Workspace Uuid Site Uuid
GET /api/v2/s/{workspace_uuid}/{site_uuid}
Description:
Get a specific site by ID.
Authentication: Public Sites can be read without signing in. Private Sites require a Workspace Member with permission to use the Site.
Parameters:
site_uuid(String)
Response: See SiteResponse
Contents
GET /api/v2/s/{workspace_uuid}/{site_uuid}/files/{file_id}/contents/{filename}
Description:
Download file contents for site media with site-based access controls. This endpoint allows downloading site file contents with proper access control enforcement.
Authentication: Requires workspace session
Parameters:
site_uuid(String)file_id(Integer)filename(String)token(String)
Menu
GET /api/v2/s/{workspace_uuid}/{site_uuid}/menu
Description:
Get the complete menu tree for a site (see read_site_menu).
Authentication: Requires workspace session
Parameters:
site_uuid(String)
Response: See MenuTreeResponse
Pages
GET /api/v2/s/{workspace_uuid}/{site_uuid}/pages/{page_slug_or_id}
Description:
Get a specific page by its ID or slug within a site.
Supports locale-specific content via the locale query parameter. If the requested locale is not available, falls back to the page's primary locale.
Authentication: Requires workspace session
Parameters:
site_uuid(String)page_slug_or_id(String)locale(String)preview(Boolean)
Response: See RenderedPageResponse
Signup
POST /api/v2/s/{workspace_uuid}/{site_uuid}/signup
Description:
Sign up a logged-in user for a public site if signup is allowed.
Authentication: Requires workspace session
Parameters:
site_uuid(String)
Response: See SiteSignupResponse