API Reference: Websites & Pages
Manage team websites end to end: sites, pages and designs, campaign chrome, publishing and readiness checks, imports, backups, templates, layouts, review comments, and access areas.
Overview
The Websites API is the programmatic surface behind Website Studio. It covers the full lifecycle of a team website: creating and configuring sites, reading and editing pages and their block-based designs, managing popup/banner campaign chrome, running publish-readiness checks and publishing, importing an external site, taking and restoring backups, working with team website templates and reusable layouts, review comments, and gated Access Areas. It is a large surface — 89 standard-tier operations — so this reference leads with the most useful integration flows and summarizes each sub-area with an endpoint table.
The same operations power the hosted MCP server's website tools (for example list_websites, get_website_page, run_website_publish_readiness, and the draft_* editing tools), so an agent connected over MCP and a REST integration see one consistent contract.
Key Concepts
- Website — A team site identified by
websiteSimplyId, carrying settings such as name, theme, navigation, header/footer designs, campaign chrome, languages, and publish state. - Page — A page identified by
pageSimplyIdwith a draft design and a published design. Designs are block-based documents; edits target the draft, publishing promotes it. - Blocks and design patches — A page design is read as a bounded document and edited by submitting validated patch operations rather than replacing raw markup.
- Publish readiness — A server-side checklist (missing metadata, broken references, and similar) you can run before publishing.
- Templates and layouts — Team website templates release versioned snapshots that new sites can be created from and connected sites can sync to; the layout catalog and team-saved layouts provide reusable section designs.
- Access Areas — Gated sections of a website whose pages require membership; effective access is inherited down the page tree.
Authentication and Tiers
Almost the entire cluster is standard tier, scope-checked as websites:read for reads and websites:write for writes. The route handlers require user-backed first-party authentication — a Simply360 session (Cognito) or a user-consented OAuth access token (which is how the hosted MCP server calls them) — sent as a bearer token, plus a selected team via the X-Team-Id header (team simplyId) or a teamSimplyId query parameter. Requests authenticated with a team API key (Authorization: Bearer s360_live_...) are rejected with 403 COGNITO_REQUIRED on this surface today. Callers additionally need the TEAM_WEBSITES or TEAM_ADMIN_WEBSITES feature permission, and per-website role permissions apply.
A few adjacent operations are privileged tier (first-party admin only) and are covered briefly at the end of this article: custom-domain management, external-website links, and the Access Area team-user auth broker. See Authentication and Error Handling for the general envelope; all responses use the standard data/meta wrapper.
Websites
| Method | Path | Description |
|---|---|---|
GET | /v1/websites | List websites for the selected team. |
POST | /v1/websites | Create a website (body: name required, slug optional). Returns 201. |
GET | /v1/websites/{websiteSimplyId} | Get a website. |
PUT | /v1/websites/{websiteSimplyId} | Update website settings (see below). |
DELETE | /v1/websites/{websiteSimplyId} | Delete a website. |
POST | /v1/websites/{websiteSimplyId}/blog/setup | Create default blog pages. |
POST | /v1/websites/{websiteSimplyId}/translate/start | Start website translation into additional languages. |
Start any integration by listing sites and picking a websiteSimplyId:
curl -s "https://api.simply360.app/v1/websites" \
-H "Authorization: Bearer $S360_ACCESS_TOKEN" \
-H "X-Team-Id: TEAM-1234-ABCD"
PUT /v1/websites/{websiteSimplyId} accepts the site's configurable fields; all are optional and only supplied fields change:
| Field | Type | Description |
|---|---|---|
name | string | Display name. |
isPublished | boolean | Site publish state. First-time publishes may require an activationToken. |
activationToken | string | Short-lived token from POST .../publish-activation when publish activation is required. |
metaTitle / metaDescription / socialImageUrl | string | Default SEO and share metadata. |
faviconFileSimplyId | string | null | Favicon by File simplyId; null clears it. |
themeSettings | object | null | Theme configuration (style-kit linkage, tokens). |
navigationJson | object | Navigation model, version 2: { "version": 2, "menus": [...] } with 1–20 named menus; page items must reference pageSimplyId. (navigationSettings is a deprecated alias.) |
headerDesignJson / footerDesignJson | object | Draft header/footer designs (publish them via POST .../header-footer/publish). |
campaignChromeConfig | object | null | Strict { "version": 2, "popups": [...] } draft with up to ten BANNER, MODAL, SLIDE_IN, or CONVERSATION entries. The /v1 endpoint namespace is the API path version; campaign-config version 1 is not accepted. Enabled design entries require localized accessible labels and sanitized meaningful content. Connected Wizard/newsletter components are allowed only in modal and slide-in designs. |
googleAnalyticsMeasurementId | string | GA4 measurement ID. |
defaultLanguageTagId / availableLanguageTagIds | string / string[] | Language configuration. |
redirectSettings | object | null | Redirect rules. |
Website Pages
Pages are managed through 16 standard operations on /v1/website-pages/{pageSimplyId} plus list/create/reorder under the parent website.
| Method | Path | Description |
|---|---|---|
GET | /v1/websites/{websiteSimplyId}/pages | List the website's pages. |
POST | /v1/websites/{websiteSimplyId}/pages | Create a page. Returns 201. |
PUT | /v1/websites/{websiteSimplyId}/pages/reorder | Reorder the page tree. |
GET | /v1/website-pages/{pageSimplyId} | Get a page (metadata, path, publish state). |
PUT | /v1/website-pages/{pageSimplyId} | Update page metadata/settings. |
DELETE | /v1/website-pages/{pageSimplyId} | Delete a page. |
GET | /v1/website-pages/{pageSimplyId}/design | Read the page's draft design document. |
PATCH | /v1/website-pages/{pageSimplyId}/design | Apply validated design patch operations. |
GET | /v1/website-pages/{pageSimplyId}/blocks | List the page's blocks (bounded outline of the design). |
GET | /v1/website-pages/{pageSimplyId}/activity | List page activity (edits, publishes, review events). |
POST | /v1/website-pages/{pageSimplyId}/publish | Publish the page's draft design. |
POST | /v1/website-pages/{pageSimplyId}/submit-for-review | Submit the draft for review. |
POST | /v1/website-pages/{pageSimplyId}/request-changes | Request changes on a page under review. |
GET | /v1/website-pages/{pageSimplyId}/versions | List page versions. |
POST | /v1/website-pages/{pageSimplyId}/versions | Create a manual version checkpoint. |
POST | /v1/website-pages/{pageSimplyId}/template/detach | Detach the page from template sync. |
POST | /v1/website-pages/{pageSimplyId}/synced-layouts/{savedLayoutSimplyId}/detach | Detach a synced saved-layout reference on the draft. |
Reading a site's content is a two-step flow — list pages, then read each page's design or block outline:
curl -s "https://api.simply360.app/v1/websites/WEBS-1234-ABCD/pages" \
-H "Authorization: Bearer $S360_ACCESS_TOKEN" \
-H "X-Team-Id: TEAM-1234-ABCD"
curl -s "https://api.simply360.app/v1/website-pages/PAGE-5678-EFGH/design" \
-H "Authorization: Bearer $S360_ACCESS_TOKEN" \
-H "X-Team-Id: TEAM-1234-ABCD"
Design edits are submitted as an array of validated patch operations with an optional human-readable summary. The server validates every operation against the current draft and rejects the whole patch on any invalid operation:
curl -s -X PATCH "https://api.simply360.app/v1/website-pages/PAGE-5678-EFGH/design" \
-H "Authorization: Bearer $S360_ACCESS_TOKEN" \
-H "X-Team-Id: TEAM-1234-ABCD" \
-H "Content-Type: application/json" \
-d '{
"operations": [ ... ],
"summary": "Update hero headline"
}'
Page Versions
Every page keeps a version history. GET /v1/website-page-versions/{versionSimplyId} reads one version, PATCH updates its metadata (for example a label), and POST /v1/website-page-versions/{versionSimplyId}/restore restores it onto the draft. Combined with POST .../versions checkpoints, this gives you safe undo around automated edits.
Publishing and Readiness
The recommended publish flow: run readiness checks, resolve findings, then publish.
| Method | Path | Description |
|---|---|---|
GET | /v1/websites/{websiteSimplyId}/publish-readiness | Run publish readiness checks for the site. |
POST | /v1/websites/{websiteSimplyId}/publish-activation | Prepare publish activation; returns the short-lived activationToken used with PUT /v1/websites/{websiteSimplyId} when required. |
POST | /v1/website-pages/{pageSimplyId}/publish | Publish one page's draft. |
POST | /v1/websites/{websiteSimplyId}/header-footer/publish | Publish the site's draft header and footer. |
POST | /v1/websites/{websiteSimplyId}/campaign-chrome/publish | Validate and publish the V2 popup/banner draft, including current page references and allowed connected form components; capture a backup and refresh static artifacts without activating an unpublished site. |
POST | /v1/websites/{websiteSimplyId}/preview-sessions | Create a short-lived Website Studio draft preview session. |
curl -s "https://api.simply360.app/v1/websites/WEBS-1234-ABCD/publish-readiness" \
-H "Authorization: Bearer $S360_ACCESS_TOKEN" \
-H "X-Team-Id: TEAM-1234-ABCD"
Readiness results are advisory checklists; publishing endpoints enforce the hard requirements themselves. Website detail responses expose campaignChromeHasUnpublishedChanges and campaignChromePublishedAt. Invalid or deleted page references block campaign publish. Campaign dismissal and audience markers are visitor-local functional storage and do not create campaign-specific analytics events.
Website Import
Import an external site in three steps. These operations require the websites edit permission, and the import itself runs as a background task — poll it with the Background Tasks API.
| Method | Path | Description |
|---|---|---|
POST | /v1/websites/import/discover | Discover pages from a source URL. Body: { "sourceUrl" }. Returns site title, favicon, pages, and sitemap sections. |
POST | /v1/websites/import/start | Start the import job. Returns the queued task's backgroundTaskSimplyId. |
POST | /v1/websites/import/{backgroundTaskSimplyId}/review | Submit review decisions for the job's suggestions. |
start body fields: sourceUrl (required), targetMode (required: NEW_WEBSITE or EXISTING_WEBSITE), selectedPages (optional array of discovered page URLs), existingWebsiteSimplyId (for EXISTING_WEBSITE), styleSource (EXTRACTED, STYLE_KIT, or EXISTING_WEBSITE), and teamStyleKitSimplyId (for STYLE_KIT). The review body is { "responses": [ { "suggestionId", "action": "ACCEPT" | "SKIP" | "MODIFY", "modifications"? } ] }; pending suggestions surface on the import task's detail.
Backups
| Method | Path | Description |
|---|---|---|
POST | /v1/websites/{websiteSimplyId}/backups | Create a backup (optional body { "summary" }). Returns 201. |
GET | /v1/websites/{websiteSimplyId}/backups | List backups (limit/offset). |
GET | /v1/website-backups/{websiteBackupSimplyId} | Get one backup. |
POST | /v1/website-backups/{websiteBackupSimplyId}/restore | Restore the site from a backup. |
Take a backup before large automated edits; restore reverts the site's content to the snapshot.
Studio Context and AI Drafts
These endpoints support editor and agent experiences on top of the site.
| Method | Path | Description |
|---|---|---|
GET | /v1/websites/{websiteSimplyId}/studio-context | Bounded Website Studio context (site, pages, theme, and the optional activePageSimplyId focus) sized for tool consumption. |
GET | /v1/websites/{websiteSimplyId}/dataview-render/{dataViewSimplyId} | Resolve a DataView render payload for the Studio canvas. |
POST | /v1/websites/{websiteSimplyId}/page-drafts | Generate a website page draft. |
POST | /v1/websites/{websiteSimplyId}/site-plan-drafts | Generate a site-plan draft. |
POST | /v1/websites/{websiteSimplyId}/pages/{pageSimplyId}/block-drafts | Draft a page block. |
POST | /v1/websites/{websiteSimplyId}/pages/{pageSimplyId}/text-rewrite-drafts | Draft a rewrite of selected page text. |
Website Templates
Team website templates capture a source website as versioned releases. Sites created from a template can stay connected and receive template updates.
| Method | Path | Description |
|---|---|---|
GET | /v1/website-templates | List the team's templates. |
POST | /v1/website-templates | Create a template. Returns 201. |
GET | /v1/website-templates/{teamWebsiteTemplateSimplyId} | Get a template. |
PUT | /v1/website-templates/{teamWebsiteTemplateSimplyId} | Update a template. |
DELETE | /v1/website-templates/{teamWebsiteTemplateSimplyId} | Archive a template. |
POST | /v1/website-templates/{teamWebsiteTemplateSimplyId}/release | Release a template version (optional releaseNotes, applyAutoSites, managedPublish). Returns 201. |
POST | /v1/website-templates/{teamWebsiteTemplateSimplyId}/websites | Create a website from a released template. Returns 201. |
POST | /v1/websites/{websiteSimplyId}/template/apply | Apply the latest linked template version to a connected site. |
POST | /v1/websites/{websiteSimplyId}/template/disconnect | Disconnect a site from its template. |
Create body: name (required) plus optional description, sourceWebsiteSimplyId, connectSourceWebsite, defaultSyncMode (AUTO or REVIEW), managedPublishEnabled, and ownership flags ownsTheme / ownsHeaderFooter / ownsCampaignChrome / ownsNavigation controlling what the template governs on connected sites. Create-from-template body: name (required) plus optional slug, enumAppBrandId, defaultLanguageTagId, and templateSyncMode (AUTO or REVIEW).
curl -s -X POST "https://api.simply360.app/v1/website-templates/TMPL-1234-ABCD/websites" \
-H "Authorization: Bearer $S360_ACCESS_TOKEN" \
-H "X-Team-Id: TEAM-1234-ABCD" \
-H "Content-Type: application/json" \
-d '{ "name": "Spring Campaign Site", "templateSyncMode": "REVIEW" }'
Layout Catalog and Team-Saved Layouts
| Method | Path | Description |
|---|---|---|
GET | /v1/website-layouts/catalog | Get the platform layout catalog (reusable section designs). |
GET | /v1/websites/{websiteSimplyId}/saved-layouts | List team-saved layouts (optional designFormat filter: GRAPESJS_WEB or GRAPESJS_EMAIL). |
POST | /v1/websites/{websiteSimplyId}/saved-layouts | Save a layout. Body requires name, category, contentJson; optional description, designFormat, syncMode (SNAPSHOT or SYNCED). Returns 201. |
GET | /v1/websites/{websiteSimplyId}/saved-layouts/{savedLayoutSimplyId} | Get a saved layout. |
PATCH | /v1/websites/{websiteSimplyId}/saved-layouts/{savedLayoutSimplyId} | Update a synced saved layout's source. |
DELETE | /v1/websites/{websiteSimplyId}/saved-layouts/{savedLayoutSimplyId} | Archive a saved layout. |
SYNCED layouts keep pages that use them in sync with the saved source; a page can opt out with the synced-layout detach operation listed under Website Pages.
Review Comments
Comments are positioned annotations on a page used by the review workflow (submit-for-review / request-changes).
| Method | Path | Description |
|---|---|---|
GET | /v1/website-pages/{pageSimplyId}/comments | List a page's comments (optional resolved filter). |
POST | /v1/website-pages/{pageSimplyId}/comments | Create a comment. Body requires xPercent, yPixels, comment; optional targetDevice, grapesComponentId. Returns 201. |
GET | /v1/website-comments | List comments across the team's websites (resolved, websiteSimplyId, limit, offset). |
POST | /v1/website-comments/{commentSimplyId}/resolve | Resolve a comment. |
POST | /v1/website-comments/{commentSimplyId}/unresolve | Reopen a comment. |
DELETE | /v1/website-comments/{commentSimplyId} | Delete a comment. |
POST | /v1/website-comments/{commentSimplyId}/replies | Reply to a comment (body: { "comment" }). Returns 201. |
DELETE | /v1/website-comment-replies/{replySimplyId} | Delete a reply. |
Access Areas
Access Areas gate parts of a website behind membership. A page inside an Access Area inherits its gate; effective resolution walks the page tree.
| Method | Path | Description |
|---|---|---|
GET | /v1/websites/{websiteSimplyId}/access-areas | List the website's Access Areas. |
POST | /v1/websites/{websiteSimplyId}/access-areas | Create an Access Area. Returns 201. |
POST | /v1/websites/{websiteSimplyId}/access-areas/root-page | Create an Access Area together with a new root page. |
GET | /v1/websites/{websiteSimplyId}/access-areas/effective/{pageSimplyId} | Resolve the effective inherited Access Area for a page (or null if the page is public). |
PUT | /v1/website-access-areas/{accessAreaSimplyId} | Update an Access Area. |
DELETE | /v1/website-access-areas/{accessAreaSimplyId} | Delete an Access Area. |
GET | /v1/websites/{websiteSimplyId}/access-area-templates | List reusable Access Area templates for the website. |
POST | /v1/websites/{websiteSimplyId}/access-area-templates/{templateSimplyId}/install | Install an Access Area template into the website. |
Experiments, Permissions, and Widget Instances
| Method | Path | Description |
|---|---|---|
GET / POST | /v1/websites/{websiteSimplyId}/pages/{pageSimplyId}/experiments | List / create page experiments. |
GET / PUT | /v1/websites/{websiteSimplyId}/experiments/{experimentSimplyId} | Get / update an experiment. |
POST | .../experiments/{experimentSimplyId}/variants | Add a variant. |
POST | .../experiments/{experimentSimplyId}/start · /stop · /use-winner | Run lifecycle: start, stop, apply the winning variant. |
GET / PUT | /v1/websites/{websiteSimplyId}/permissions | List / replace website role permissions. |
GET / PUT | /v1/websites/{websiteSimplyId}/pages/{pageSimplyId}/permissions | List / replace page-level role permissions. |
GET | /v1/website-widget-instances/by-entity | List website widget instances referencing an entity (for example where a DataWizard is embedded). |
Privileged Operations
For completeness, the following adjacent operations are privileged tier (first-party admin surfaces; not part of the standard integration contract):
PUT /v1/websites/{websiteSimplyId}/custom-domainandGET .../custom-domain/status— set, clear, and monitor a website custom domain.GET/POST /v1/external-websites,DELETE /v1/external-websites/{teamWebsiteLinkSimplyId}, andGET .../widgets— link non-Simply360 websites to a team and inspect their embedded widget instances.POST /v1/website-team-user-auth/complete— completes the Team User Access Area broker auth flow.GET /v1/data-records/{dataRecordSimplyId}/website-pages— lists published Dynamic Website pages generated for a data record.
Usage Notes
- All identifiers are simplyIds; page paths and slugs are content, not identifiers.
- Edits always target the draft design; nothing is publicly visible until the page (or site) is published.
- Prefer
studio-contextandblocksfor bounded reads before pulling a full pagedesigndocument. - Take a backup (or create a page version checkpoint) before running bulk automated edits, and use
publish-readinessbefore flippingisPublished. - Website copy, template release, translation, and dynamic refresh jobs surface as background tasks — see Background Tasks.
- List endpoints follow the platform's standard paging conventions where offered — see Pagination, Sorting & Field Selection.
- Questions or gaps in this reference? Use the feedback page or email developers@simply360.app.