← All documentationContents ↓

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 pageSimplyId with 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

MethodPathDescription
GET/v1/websitesList websites for the selected team.
POST/v1/websitesCreate 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/setupCreate default blog pages.
POST/v1/websites/{websiteSimplyId}/translate/startStart 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:

FieldTypeDescription
namestringDisplay name.
isPublishedbooleanSite publish state. First-time publishes may require an activationToken.
activationTokenstringShort-lived token from POST .../publish-activation when publish activation is required.
metaTitle / metaDescription / socialImageUrlstringDefault SEO and share metadata.
faviconFileSimplyIdstring | nullFavicon by File simplyId; null clears it.
themeSettingsobject | nullTheme configuration (style-kit linkage, tokens).
navigationJsonobjectNavigation model, version 2: { "version": 2, "menus": [...] } with 1–20 named menus; page items must reference pageSimplyId. (navigationSettings is a deprecated alias.)
headerDesignJson / footerDesignJsonobjectDraft header/footer designs (publish them via POST .../header-footer/publish).
campaignChromeConfigobject | nullStrict { "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.
googleAnalyticsMeasurementIdstringGA4 measurement ID.
defaultLanguageTagId / availableLanguageTagIdsstring / string[]Language configuration.
redirectSettingsobject | nullRedirect rules.

Website Pages

Pages are managed through 16 standard operations on /v1/website-pages/{pageSimplyId} plus list/create/reorder under the parent website.

MethodPathDescription
GET/v1/websites/{websiteSimplyId}/pagesList the website's pages.
POST/v1/websites/{websiteSimplyId}/pagesCreate a page. Returns 201.
PUT/v1/websites/{websiteSimplyId}/pages/reorderReorder 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}/designRead the page's draft design document.
PATCH/v1/website-pages/{pageSimplyId}/designApply validated design patch operations.
GET/v1/website-pages/{pageSimplyId}/blocksList the page's blocks (bounded outline of the design).
GET/v1/website-pages/{pageSimplyId}/activityList page activity (edits, publishes, review events).
POST/v1/website-pages/{pageSimplyId}/publishPublish the page's draft design.
POST/v1/website-pages/{pageSimplyId}/submit-for-reviewSubmit the draft for review.
POST/v1/website-pages/{pageSimplyId}/request-changesRequest changes on a page under review.
GET/v1/website-pages/{pageSimplyId}/versionsList page versions.
POST/v1/website-pages/{pageSimplyId}/versionsCreate a manual version checkpoint.
POST/v1/website-pages/{pageSimplyId}/template/detachDetach the page from template sync.
POST/v1/website-pages/{pageSimplyId}/synced-layouts/{savedLayoutSimplyId}/detachDetach 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.

MethodPathDescription
GET/v1/websites/{websiteSimplyId}/publish-readinessRun publish readiness checks for the site.
POST/v1/websites/{websiteSimplyId}/publish-activationPrepare publish activation; returns the short-lived activationToken used with PUT /v1/websites/{websiteSimplyId} when required.
POST/v1/website-pages/{pageSimplyId}/publishPublish one page's draft.
POST/v1/websites/{websiteSimplyId}/header-footer/publishPublish the site's draft header and footer.
POST/v1/websites/{websiteSimplyId}/campaign-chrome/publishValidate 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-sessionsCreate 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.

MethodPathDescription
POST/v1/websites/import/discoverDiscover pages from a source URL. Body: { "sourceUrl" }. Returns site title, favicon, pages, and sitemap sections.
POST/v1/websites/import/startStart the import job. Returns the queued task's backgroundTaskSimplyId.
POST/v1/websites/import/{backgroundTaskSimplyId}/reviewSubmit 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

MethodPathDescription
POST/v1/websites/{websiteSimplyId}/backupsCreate a backup (optional body { "summary" }). Returns 201.
GET/v1/websites/{websiteSimplyId}/backupsList backups (limit/offset).
GET/v1/website-backups/{websiteBackupSimplyId}Get one backup.
POST/v1/website-backups/{websiteBackupSimplyId}/restoreRestore 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.

MethodPathDescription
GET/v1/websites/{websiteSimplyId}/studio-contextBounded 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-draftsGenerate a website page draft.
POST/v1/websites/{websiteSimplyId}/site-plan-draftsGenerate a site-plan draft.
POST/v1/websites/{websiteSimplyId}/pages/{pageSimplyId}/block-draftsDraft a page block.
POST/v1/websites/{websiteSimplyId}/pages/{pageSimplyId}/text-rewrite-draftsDraft 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.

MethodPathDescription
GET/v1/website-templatesList the team's templates.
POST/v1/website-templatesCreate 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}/releaseRelease a template version (optional releaseNotes, applyAutoSites, managedPublish). Returns 201.
POST/v1/website-templates/{teamWebsiteTemplateSimplyId}/websitesCreate a website from a released template. Returns 201.
POST/v1/websites/{websiteSimplyId}/template/applyApply the latest linked template version to a connected site.
POST/v1/websites/{websiteSimplyId}/template/disconnectDisconnect 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

MethodPathDescription
GET/v1/website-layouts/catalogGet the platform layout catalog (reusable section designs).
GET/v1/websites/{websiteSimplyId}/saved-layoutsList team-saved layouts (optional designFormat filter: GRAPESJS_WEB or GRAPESJS_EMAIL).
POST/v1/websites/{websiteSimplyId}/saved-layoutsSave 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).

MethodPathDescription
GET/v1/website-pages/{pageSimplyId}/commentsList a page's comments (optional resolved filter).
POST/v1/website-pages/{pageSimplyId}/commentsCreate a comment. Body requires xPercent, yPixels, comment; optional targetDevice, grapesComponentId. Returns 201.
GET/v1/website-commentsList comments across the team's websites (resolved, websiteSimplyId, limit, offset).
POST/v1/website-comments/{commentSimplyId}/resolveResolve a comment.
POST/v1/website-comments/{commentSimplyId}/unresolveReopen a comment.
DELETE/v1/website-comments/{commentSimplyId}Delete a comment.
POST/v1/website-comments/{commentSimplyId}/repliesReply 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.

MethodPathDescription
GET/v1/websites/{websiteSimplyId}/access-areasList the website's Access Areas.
POST/v1/websites/{websiteSimplyId}/access-areasCreate an Access Area. Returns 201.
POST/v1/websites/{websiteSimplyId}/access-areas/root-pageCreate 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-templatesList reusable Access Area templates for the website.
POST/v1/websites/{websiteSimplyId}/access-area-templates/{templateSimplyId}/installInstall an Access Area template into the website.

Experiments, Permissions, and Widget Instances

MethodPathDescription
GET / POST/v1/websites/{websiteSimplyId}/pages/{pageSimplyId}/experimentsList / create page experiments.
GET / PUT/v1/websites/{websiteSimplyId}/experiments/{experimentSimplyId}Get / update an experiment.
POST.../experiments/{experimentSimplyId}/variantsAdd a variant.
POST.../experiments/{experimentSimplyId}/start · /stop · /use-winnerRun lifecycle: start, stop, apply the winning variant.
GET / PUT/v1/websites/{websiteSimplyId}/permissionsList / replace website role permissions.
GET / PUT/v1/websites/{websiteSimplyId}/pages/{pageSimplyId}/permissionsList / replace page-level role permissions.
GET/v1/website-widget-instances/by-entityList 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-domain and GET .../custom-domain/status — set, clear, and monitor a website custom domain.
  • GET/POST /v1/external-websites, DELETE /v1/external-websites/{teamWebsiteLinkSimplyId}, and GET .../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-context and blocks for bounded reads before pulling a full page design document.
  • Take a backup (or create a page version checkpoint) before running bulk automated edits, and use publish-readiness before flipping isPublished.
  • 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.